net: stmmac: clear reset value of snps, wr_osr_lmt/snps, rd_osr_lmt before writing
authorNiklas Cassel <niklas.cassel@axis.com>
Mon, 5 Dec 2016 17:12:54 +0000 (18:12 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Dec 2016 15:33:48 +0000 (10:33 -0500)
WR_OSR_LMT and RD_OSR_LMT have a reset value of 1.
Since the reset value wasn't cleared before writing, the value in the
register would be incorrect if specifying an uneven value for
snps,wr_osr_lmt/snps,rd_osr_lmt.

Zero is a valid value for the properties, since the databook specifies:
maximum outstanding requests = WR_OSR_LMT + 1.

We do not want to change the behavior for existing users when the
property is missing. Therefore, default to 1 if the property is missing,
since that is the same as the reset value.

Signed-off-by: Niklas Cassel <niklas.cassel@axis.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/dwmac1000_dma.c
drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c

index 9907469..f353852 100644 (file)
@@ -43,9 +43,11 @@ static void dwmac1000_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
        if (axi->axi_xit_frm)
                value |= DMA_AXI_LPI_XIT_FRM;
 
+       value &= ~DMA_AXI_WR_OSR_LMT;
        value |= (axi->axi_wr_osr_lmt & DMA_AXI_WR_OSR_LMT_MASK) <<
                 DMA_AXI_WR_OSR_LMT_SHIFT;
 
+       value &= ~DMA_AXI_RD_OSR_LMT;
        value |= (axi->axi_rd_osr_lmt & DMA_AXI_RD_OSR_LMT_MASK) <<
                 DMA_AXI_RD_OSR_LMT_SHIFT;
 
index 116151c..32bc2fc 100644 (file)
@@ -30,9 +30,11 @@ static void dwmac4_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
        if (axi->axi_xit_frm)
                value |= DMA_AXI_LPI_XIT_FRM;
 
+       value &= ~DMA_AXI_WR_OSR_LMT;
        value |= (axi->axi_wr_osr_lmt & DMA_AXI_OSR_MAX) <<
                 DMA_AXI_WR_OSR_LMT_SHIFT;
 
+       value &= ~DMA_AXI_RD_OSR_LMT;
        value |= (axi->axi_rd_osr_lmt & DMA_AXI_OSR_MAX) <<
                 DMA_AXI_RD_OSR_LMT_SHIFT;
 
index a840818..ac3d39c 100644 (file)
@@ -126,8 +126,10 @@ static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev)
        axi->axi_mb = of_property_read_bool(np, "snps,axi_mb");
        axi->axi_rb =  of_property_read_bool(np, "snps,axi_rb");
 
-       of_property_read_u32(np, "snps,wr_osr_lmt", &axi->axi_wr_osr_lmt);
-       of_property_read_u32(np, "snps,rd_osr_lmt", &axi->axi_rd_osr_lmt);
+       if (of_property_read_u32(np, "snps,wr_osr_lmt", &axi->axi_wr_osr_lmt))
+               axi->axi_wr_osr_lmt = 1;
+       if (of_property_read_u32(np, "snps,rd_osr_lmt", &axi->axi_rd_osr_lmt))
+               axi->axi_rd_osr_lmt = 1;
        of_property_read_u32_array(np, "snps,blen", axi->axi_blen, AXI_BLEN);
        of_node_put(np);