There exists an `allocation race' between the CNIC and bnx2x drivers,
in which both drivers allocate the same t2 memory while disregarding a possible
previous allocation.
Additionally, due to the current order of memory releases, some of the
ILT memory in the driver is not released correctly when unloading the driver.
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Ariel Elior <ariele@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
                bnx2x_free_fp_mem_cnic(bp);
 
        if (IS_PF(bp)) {
-               bnx2x_free_mem(bp);
                if (CNIC_LOADED(bp))
                        bnx2x_free_mem_cnic(bp);
+               bnx2x_free_mem(bp);
        }
        bp->state = BNX2X_STATE_CLOSED;
        bp->cnic_loaded = false;
 
                                sizeof(struct
                                       host_hc_status_block_e1x));
 
-       if (CONFIGURE_NIC_MODE(bp))
+       if (CONFIGURE_NIC_MODE(bp) && !bp->t2)
                /* allocate searcher T2 table, as it wan't allocated before */
                BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ);
 
 {
        int i, allocated, context_size;
 
-       if (!CONFIGURE_NIC_MODE(bp))
+       if (!CONFIGURE_NIC_MODE(bp) && !bp->t2)
                /* allocate searcher T2 table */
                BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ);