bnx2x: Eliminate duplicate barriers on weakly-ordered archs
authorSinan Kaya <okaya@codeaurora.org>
Sun, 25 Mar 2018 14:39:18 +0000 (10:39 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Mar 2018 16:47:55 +0000 (12:47 -0400)
Code includes wmb() followed by writel(). writel() already has a
barrier on some architectures like arm64.

This ends up CPU observing two barriers back to back before executing
the register write.

Since code already has an explicit barrier call, changing writel() to
writel_relaxed().

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

index 352beff796ae5b090d8e3fa831078cc7182d3a2c..d847e1b9c37b5afff33e799e919e3ff39b5cd1e8 100644 (file)
@@ -166,6 +166,12 @@ do {                                               \
 #define REG_RD8(bp, offset)            readb(REG_ADDR(bp, offset))
 #define REG_RD16(bp, offset)           readw(REG_ADDR(bp, offset))
 
+#define REG_WR_RELAXED(bp, offset, val)        \
+       writel_relaxed((u32)val, REG_ADDR(bp, offset))
+
+#define REG_WR16_RELAXED(bp, offset, val) \
+       writew_relaxed((u16)val, REG_ADDR(bp, offset))
+
 #define REG_WR(bp, offset, val)                writel((u32)val, REG_ADDR(bp, offset))
 #define REG_WR8(bp, offset, val)       writeb((u8)val, REG_ADDR(bp, offset))
 #define REG_WR16(bp, offset, val)      writew((u16)val, REG_ADDR(bp, offset))
@@ -758,10 +764,8 @@ struct bnx2x_fastpath {
 #if (BNX2X_DB_SHIFT < BNX2X_DB_MIN_SHIFT)
 #error "Min DB doorbell stride is 8"
 #endif
-#define DOORBELL(bp, cid, val) \
-       do { \
-               writel((u32)(val), bp->doorbells + (bp->db_size * (cid))); \
-       } while (0)
+#define DOORBELL_RELAXED(bp, cid, val) \
+       writel_relaxed((u32)(val), (bp)->doorbells + ((bp)->db_size * (cid)))
 
 /* TX CSUM helpers */
 #define SKB_CS_OFF(skb)                (offsetof(struct tcphdr, check) - \
index 0f86f1850de8133706d3153c0b8e661596699a3c..95871576ab9251ff0b643471cfe0e11e3c3996d0 100644 (file)
@@ -4156,7 +4156,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
        /* make sure descriptor update is observed by HW */
        wmb();
 
-       DOORBELL(bp, txdata->cid, txdata->tx_db.raw);
+       DOORBELL_RELAXED(bp, txdata->cid, txdata->tx_db.raw);
 
        mmiowb();
 
index a5265e1344f1a77f5c75cbc2b7589eea25b84c59..a8ce5c55bbb0ca29b5cca28171cd94733e7260eb 100644 (file)
@@ -522,8 +522,8 @@ static inline void bnx2x_update_rx_prod(struct bnx2x *bp,
        wmb();
 
        for (i = 0; i < sizeof(rx_prods)/4; i++)
-               REG_WR(bp, fp->ustorm_rx_prods_offset + i*4,
-                      ((u32 *)&rx_prods)[i]);
+               REG_WR_RELAXED(bp, fp->ustorm_rx_prods_offset + i * 4,
+                              ((u32 *)&rx_prods)[i]);
 
        mmiowb(); /* keep prod updates ordered */
 
index 39af4f85379d9698b6975cb1d47bdbc54d8b14cc..da18aa239acb19ab87c107063ef240ac4a3b9261 100644 (file)
@@ -2593,7 +2593,7 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode)
        txdata->tx_db.data.prod += 2;
        /* make sure descriptor update is observed by the HW */
        wmb();
-       DOORBELL(bp, txdata->cid, txdata->tx_db.raw);
+       DOORBELL_RELAXED(bp, txdata->cid, txdata->tx_db.raw);
 
        mmiowb();
        barrier();
index fd97250d637120f8552d0064c79ad06f833a3605..c766ae23bc74f3a7da353a3bbddf72aabf1664cd 100644 (file)
@@ -3817,8 +3817,8 @@ static void bnx2x_sp_prod_update(struct bnx2x *bp)
         */
        mb();
 
-       REG_WR16(bp, BAR_XSTRORM_INTMEM + XSTORM_SPQ_PROD_OFFSET(func),
-                bp->spq_prod_idx);
+       REG_WR16_RELAXED(bp, BAR_XSTRORM_INTMEM + XSTORM_SPQ_PROD_OFFSET(func),
+                        bp->spq_prod_idx);
        mmiowb();
 }
 
index 76a4668c50fe98edb3d6e955351a357a3e3f0608..8e0a317b31f7d31915a62f1a7cf993e0150227a2 100644 (file)
@@ -170,7 +170,9 @@ static int bnx2x_send_msg2pf(struct bnx2x *bp, u8 *done, dma_addr_t msg_mapping)
        wmb();
 
        /* Trigger the PF FW */
-       writeb(1, &zone_data->trigger.vf_pf_channel.addr_valid);
+       writeb_relaxed(1, &zone_data->trigger.vf_pf_channel.addr_valid);
+
+       mmiowb();
 
        /* Wait for PF to complete */
        while ((tout >= 0) && (!*done)) {