u32 len, free_size, vlan_tag_flags, cfa_action, flags;
        u16 prod, last_frag;
        struct pci_dev *pdev = bp->pdev;
-       struct bnxt_napi *bnapi;
        struct bnxt_tx_ring_info *txr;
        struct bnxt_sw_tx_bd *tx_buf;
 
                return NETDEV_TX_OK;
        }
 
-       bnapi = bp->bnapi[i];
-       txr = &bnapi->tx_ring;
+       txr = &bp->tx_ring[i];
        txq = netdev_get_tx_queue(dev, i);
        prod = txr->tx_prod;
 
 
 static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts)
 {
-       struct bnxt_tx_ring_info *txr = &bnapi->tx_ring;
+       struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
        int index = bnapi->index;
        struct netdev_queue *txq = netdev_get_tx_queue(bp->dev, index);
        u16 cons = txr->tx_cons;
 {
        struct bnxt *bp = bnapi->bp;
        struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
-       struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+       struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
        u16 prod = rxr->rx_agg_prod;
        u16 sw_prod = rxr->rx_sw_agg_prod;
        u32 i;
 {
        struct pci_dev *pdev = bp->pdev;
        struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
-       struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+       struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
        u16 prod = rxr->rx_agg_prod;
        u32 i;
 
                                           bool *agg_event)
 {
        struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
-       struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+       struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
        u8 agg_id = TPA_END_AGG_ID(tpa_end);
        u8 *data, agg_bufs;
        u16 cp_cons = RING_CMP(*raw_cons);
                       bool *agg_event)
 {
        struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
-       struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+       struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
        struct net_device *dev = bp->dev;
        struct rx_cmp *rxcmp;
        struct rx_cmp_ext *rxcmp1;
                bnxt_tx_int(bp, bnapi, tx_pkts);
 
        if (rx_event) {
-               struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+               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);
        int i, max_idx;
        struct pci_dev *pdev = bp->pdev;
 
-       if (!bp->bnapi)
+       if (!bp->tx_ring)
                return;
 
        max_idx = bp->tx_nr_pages * TX_DESC_CNT;
        for (i = 0; i < bp->tx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_tx_ring_info *txr;
+               struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
                int j;
 
-               if (!bnapi)
-                       continue;
-
-               txr = &bnapi->tx_ring;
                for (j = 0; j < max_idx;) {
                        struct bnxt_sw_tx_bd *tx_buf = &txr->tx_buf_ring[j];
                        struct sk_buff *skb = tx_buf->skb;
        int i, max_idx, max_agg_idx;
        struct pci_dev *pdev = bp->pdev;
 
-       if (!bp->bnapi)
+       if (!bp->rx_ring)
                return;
 
        max_idx = bp->rx_nr_pages * RX_DESC_CNT;
        max_agg_idx = bp->rx_agg_nr_pages * RX_DESC_CNT;
        for (i = 0; i < bp->rx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_rx_ring_info *rxr;
+               struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
                int j;
 
-               if (!bnapi)
-                       continue;
-
-               rxr = &bnapi->rx_ring;
-
                if (rxr->rx_tpa) {
                        for (j = 0; j < MAX_TPA; j++) {
                                struct bnxt_tpa_info *tpa_info =
 {
        int i;
 
-       if (!bp->bnapi)
+       if (!bp->rx_ring)
                return;
 
        for (i = 0; i < bp->rx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_rx_ring_info *rxr;
+               struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
                struct bnxt_ring_struct *ring;
 
-               if (!bnapi)
-                       continue;
-
-               rxr = &bnapi->rx_ring;
-
                kfree(rxr->rx_tpa);
                rxr->rx_tpa = NULL;
 
 {
        int i, rc, agg_rings = 0, tpa_rings = 0;
 
+       if (!bp->rx_ring)
+               return -ENOMEM;
+
        if (bp->flags & BNXT_FLAG_AGG_RINGS)
                agg_rings = 1;
 
                tpa_rings = 1;
 
        for (i = 0; i < bp->rx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_rx_ring_info *rxr;
+               struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
                struct bnxt_ring_struct *ring;
 
-               if (!bnapi)
-                       continue;
-
-               rxr = &bnapi->rx_ring;
                ring = &rxr->rx_ring_struct;
 
                rc = bnxt_alloc_ring(bp, ring);
        int i;
        struct pci_dev *pdev = bp->pdev;
 
-       if (!bp->bnapi)
+       if (!bp->tx_ring)
                return;
 
        for (i = 0; i < bp->tx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_tx_ring_info *txr;
+               struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
                struct bnxt_ring_struct *ring;
 
-               if (!bnapi)
-                       continue;
-
-               txr = &bnapi->tx_ring;
-
                if (txr->tx_push) {
                        dma_free_coherent(&pdev->dev, bp->tx_push_size,
                                          txr->tx_push, txr->tx_push_mapping);
        }
 
        for (i = 0, j = 0; i < bp->tx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_tx_ring_info *txr;
+               struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
                struct bnxt_ring_struct *ring;
 
-               if (!bnapi)
-                       continue;
-
-               txr = &bnapi->tx_ring;
                ring = &txr->tx_ring_struct;
 
                rc = bnxt_alloc_ring(bp, ring);
                ring->dma_arr = cpr->cp_desc_mapping;
                ring->vmem_size = 0;
 
-               rxr = &bnapi->rx_ring;
+               rxr = bnapi->rx_ring;
                ring = &rxr->rx_ring_struct;
                ring->nr_pages = bp->rx_nr_pages;
                ring->page_size = HW_RXBD_RING_SIZE;
                ring->vmem_size = SW_RXBD_AGG_RING_SIZE * bp->rx_agg_nr_pages;
                ring->vmem = (void **)&rxr->rx_agg_ring;
 
-               txr = &bnapi->tx_ring;
+               txr = bnapi->tx_ring;
                ring = &txr->tx_ring_struct;
                ring->nr_pages = bp->tx_nr_pages;
                ring->page_size = HW_RXBD_RING_SIZE;
 static int bnxt_init_one_rx_ring(struct bnxt *bp, int ring_nr)
 {
        struct net_device *dev = bp->dev;
-       struct bnxt_napi *bnapi = bp->bnapi[ring_nr];
        struct bnxt_rx_ring_info *rxr;
        struct bnxt_ring_struct *ring;
        u32 prod, type;
        int i;
 
-       if (!bnapi)
-               return -EINVAL;
-
        type = (bp->rx_buf_use_size << RX_BD_LEN_SHIFT) |
                RX_BD_TYPE_RX_PACKET_BD | RX_BD_FLAGS_EOP;
 
        if (NET_IP_ALIGN == 2)
                type |= RX_BD_FLAGS_SOP;
 
-       rxr = &bnapi->rx_ring;
+       rxr = &bp->rx_ring[ring_nr];
        ring = &rxr->rx_ring_struct;
        bnxt_init_rxbd_pages(ring, type);
 
                                   MAX_SKB_FRAGS + 1);
 
        for (i = 0; i < bp->tx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_tx_ring_info *txr = &bnapi->tx_ring;
+               struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
                struct bnxt_ring_struct *ring = &txr->tx_ring_struct;
 
                ring->fw_ring_id = INVALID_HW_RING_ID;
                cpr = &bnapi->cp_ring;
                cpr->cp_raw_cons = 0;
 
-               txr = &bnapi->tx_ring;
+               txr = bnapi->tx_ring;
                txr->tx_prod = 0;
                txr->tx_cons = 0;
 
-               rxr = &bnapi->rx_ring;
+               rxr = bnapi->rx_ring;
                rxr->rx_prod = 0;
                rxr->rx_agg_prod = 0;
                rxr->rx_sw_agg_prod = 0;
                bnxt_free_stats(bp);
                bnxt_free_ring_grps(bp);
                bnxt_free_vnics(bp);
+               kfree(bp->tx_ring);
+               bp->tx_ring = NULL;
+               kfree(bp->rx_ring);
+               bp->rx_ring = NULL;
                kfree(bp->bnapi);
                bp->bnapi = NULL;
        } else {
                        bp->bnapi[i]->bp = bp;
                }
 
+               bp->rx_ring = kcalloc(bp->rx_nr_rings,
+                                     sizeof(struct bnxt_rx_ring_info),
+                                     GFP_KERNEL);
+               if (!bp->rx_ring)
+                       return -ENOMEM;
+
+               for (i = 0; i < bp->rx_nr_rings; i++) {
+                       bp->rx_ring[i].bnapi = bp->bnapi[i];
+                       bp->bnapi[i]->rx_ring = &bp->rx_ring[i];
+               }
+
+               bp->tx_ring = kcalloc(bp->tx_nr_rings,
+                                     sizeof(struct bnxt_tx_ring_info),
+                                     GFP_KERNEL);
+               if (!bp->tx_ring)
+                       return -ENOMEM;
+
+               for (i = 0; i < bp->tx_nr_rings; i++) {
+                       bp->tx_ring[i].bnapi = bp->bnapi[i];
+                       bp->bnapi[i]->tx_ring = &bp->tx_ring[i];
+               }
+
                rc = bnxt_alloc_stats(bp);
                if (rc)
                        goto alloc_mem_err;
        }
 
        for (i = 0; i < bp->tx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_tx_ring_info *txr = &bnapi->tx_ring;
+               struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
                struct bnxt_ring_struct *ring = &txr->tx_ring_struct;
                u16 fw_stats_ctx = bp->grp_info[i].fw_stats_ctx;
 
        }
 
        for (i = 0; i < bp->rx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+               struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
                struct bnxt_ring_struct *ring = &rxr->rx_ring_struct;
 
                rc = hwrm_ring_alloc_send_msg(bp, ring, HWRM_RING_ALLOC_RX, i,
 
        if (bp->flags & BNXT_FLAG_AGG_RINGS) {
                for (i = 0; i < bp->rx_nr_rings; i++) {
-                       struct bnxt_napi *bnapi = bp->bnapi[i];
-                       struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+                       struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
                        struct bnxt_ring_struct *ring =
                                                &rxr->rx_agg_ring_struct;
 
                return;
 
        for (i = 0; i < bp->tx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_tx_ring_info *txr = &bnapi->tx_ring;
+               struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
                struct bnxt_ring_struct *ring = &txr->tx_ring_struct;
                u32 cmpl_ring_id = bp->grp_info[i].cp_fw_ring_id;
 
        }
 
        for (i = 0; i < bp->rx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+               struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
                struct bnxt_ring_struct *ring = &rxr->rx_ring_struct;
                u32 cmpl_ring_id = bp->grp_info[i].cp_fw_ring_id;
 
        }
 
        for (i = 0; i < bp->rx_nr_rings; i++) {
-               struct bnxt_napi *bnapi = bp->bnapi[i];
-               struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+               struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
                struct bnxt_ring_struct *ring = &rxr->rx_agg_ring_struct;
                u32 cmpl_ring_id = bp->grp_info[i].cp_fw_ring_id;
 
 static void bnxt_tx_disable(struct bnxt *bp)
 {
        int i;
-       struct bnxt_napi *bnapi;
        struct bnxt_tx_ring_info *txr;
        struct netdev_queue *txq;
 
-       if (bp->bnapi) {
+       if (bp->tx_ring) {
                for (i = 0; i < bp->tx_nr_rings; i++) {
-                       bnapi = bp->bnapi[i];
-                       txr = &bnapi->tx_ring;
+                       txr = &bp->tx_ring[i];
                        txq = netdev_get_tx_queue(bp->dev, i);
                        __netif_tx_lock(txq, smp_processor_id());
                        txr->dev_state = BNXT_DEV_STATE_CLOSING;
 static void bnxt_tx_enable(struct bnxt *bp)
 {
        int i;
-       struct bnxt_napi *bnapi;
        struct bnxt_tx_ring_info *txr;
        struct netdev_queue *txq;
 
        for (i = 0; i < bp->tx_nr_rings; i++) {
-               bnapi = bp->bnapi[i];
-               txr = &bnapi->tx_ring;
+               txr = &bp->tx_ring[i];
                txq = netdev_get_tx_queue(bp->dev, i);
                txr->dev_state = 0;
        }
 
 static void bnxt_dump_tx_sw_state(struct bnxt_napi *bnapi)
 {
-       struct bnxt_tx_ring_info *txr = &bnapi->tx_ring;
+       struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
        int i = bnapi->index;
 
        netdev_info(bnapi->bp->dev, "[%d]: tx{fw_ring: %d prod: %x cons: %x}\n",
 
 static void bnxt_dump_rx_sw_state(struct bnxt_napi *bnapi)
 {
-       struct bnxt_rx_ring_info *rxr = &bnapi->rx_ring;
+       struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
        int i = bnapi->index;
 
        netdev_info(bnapi->bp->dev, "[%d]: rx{fw_ring: %d prod: %x} rx_agg{fw_ring: %d agg_prod: %x sw_agg_prod: %x}\n",