prod = NEXT_TX(prod);
        txr->tx_prod = prod;
 
-       writel(DB_KEY_TX | prod, txr->tx_doorbell);
-       writel(DB_KEY_TX | prod, txr->tx_doorbell);
+       bnxt_db_write(bp, txr->tx_doorbell, DB_KEY_TX | prod);
 
 tx_done:
 
                /* Sync BD data before updating doorbell */
                wmb();
 
-               writel(DB_KEY_TX | prod, db);
-               writel(DB_KEY_TX | prod, db);
+               bnxt_db_write(bp, db, DB_KEY_TX | prod);
        }
 
        cpr->cp_raw_cons = raw_cons;
        if (event & BNXT_RX_EVENT) {
                struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
 
-               writel(DB_KEY_RX | rxr->rx_prod, rxr->rx_doorbell);
-               writel(DB_KEY_RX | rxr->rx_prod, rxr->rx_doorbell);
-               if (event & BNXT_AGG_EVENT) {
-                       writel(DB_KEY_RX | rxr->rx_agg_prod,
-                              rxr->rx_agg_doorbell);
-                       writel(DB_KEY_RX | rxr->rx_agg_prod,
-                              rxr->rx_agg_doorbell);
-               }
+               bnxt_db_write(bp, rxr->rx_doorbell, DB_KEY_RX | rxr->rx_prod);
+               if (event & BNXT_AGG_EVENT)
+                       bnxt_db_write(bp, rxr->rx_agg_doorbell,
+                                     DB_KEY_RX | rxr->rx_agg_prod);
        }
        return rx_pkts;
 }
 
        cpr->cp_raw_cons = raw_cons;
        BNXT_CP_DB(cpr->cp_doorbell, cpr->cp_raw_cons);
-       writel(DB_KEY_RX | rxr->rx_prod, rxr->rx_doorbell);
-       writel(DB_KEY_RX | rxr->rx_prod, rxr->rx_doorbell);
+       bnxt_db_write(bp, rxr->rx_doorbell, DB_KEY_RX | rxr->rx_prod);
 
-       if (event & BNXT_AGG_EVENT) {
-               writel(DB_KEY_RX | rxr->rx_agg_prod, rxr->rx_agg_doorbell);
-               writel(DB_KEY_RX | rxr->rx_agg_prod, rxr->rx_agg_doorbell);
-       }
+       if (event & BNXT_AGG_EVENT)
+               bnxt_db_write(bp, rxr->rx_agg_doorbell,
+                             DB_KEY_RX | rxr->rx_agg_prod);
 
        if (!bnxt_has_work(bp, cpr) && rx_pkts < budget) {
                napi_complete_done(napi, rx_pkts);
        bp->gro_func = bnxt_gro_func_5730x;
        if (BNXT_CHIP_P4_PLUS(bp))
                bp->gro_func = bnxt_gro_func_5731x;
+       else
+               bp->flags |= BNXT_FLAG_DOUBLE_DB;
 
        rc = bnxt_hwrm_func_drv_rgtr(bp);
        if (rc)
 
        #define BNXT_FLAG_FW_LLDP_AGENT 0x80000
        #define BNXT_FLAG_MULTI_HOST    0x100000
        #define BNXT_FLAG_SHORT_CMD     0x200000
+       #define BNXT_FLAG_DOUBLE_DB     0x400000
        #define BNXT_FLAG_CHIP_NITRO_A0 0x1000000
 
        #define BNXT_FLAG_ALL_CONFIG_FEATS (BNXT_FLAG_TPA |             \
                ((txr->tx_prod - txr->tx_cons) & bp->tx_ring_mask);
 }
 
+/* For TX and RX ring doorbells */
+static inline void bnxt_db_write(struct bnxt *bp, void __iomem *db, u32 val)
+{
+       writel(val, db);
+       if (bp->flags & BNXT_FLAG_DOUBLE_DB)
+               writel(val, db);
+}
+
 extern const u16 bnxt_lhint_arr[];
 
 int bnxt_alloc_rx_data(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,