bnx2x: Replace doorbell barrier() with wmb()
authorSinan Kaya <okaya@codeaurora.org>
Sun, 25 Mar 2018 14:39:17 +0000 (10:39 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Mar 2018 16:47:55 +0000 (12:47 -0400)
barrier() doesn't guarantee memory writes to be observed by the hardware on
all architectures. barrier() only tells compiler not to move this code
with respect to other read/writes.

If memory write needs to be observed by the HW, wmb() is the right choice.

Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c

index d7c98e8..0f86f18 100644 (file)
@@ -4153,7 +4153,8 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
        wmb();
 
        txdata->tx_db.data.prod += nbd;
-       barrier();
+       /* make sure descriptor update is observed by HW */
+       wmb();
 
        DOORBELL(bp, txdata->cid, txdata->tx_db.raw);
 
index 1e33abd..39af4f8 100644 (file)
@@ -2591,7 +2591,8 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode)
        wmb();
 
        txdata->tx_db.data.prod += 2;
-       barrier();
+       /* make sure descriptor update is observed by the HW */
+       wmb();
        DOORBELL(bp, txdata->cid, txdata->tx_db.raw);
 
        mmiowb();