]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bnx2fc: NPIV ports go offline when interface is brought down & up
authorBhanu Prakash Gollapudi <bprakash@broadcom.com>
Tue, 24 Jan 2012 02:00:48 +0000 (18:00 -0800)
committerJoe Jin <joe.jin@oracle.com>
Thu, 17 May 2012 01:36:53 +0000 (09:36 +0800)
When there are 255 NPIV ports, and the interface is brought down & up, both
physical and NPIV ports are logged off and never logged back in. Since
discovery happens on single CPU, XID resources on that CPU will be limited,
which when exhausted the discovery fails. Increase the XID resource range to
ensure that the discovery completes successfully. Also ensure that
fc_exch_mgr_alloc() doesn't fail on the system that has lower number of CPUs.

Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
(cherry picked from commit 7d742f659e00f08016a4446a9134036e47f9a0cf)

Signed-off-by: Joe Jin <joe.jin@oracle.com>
drivers/scsi/bnx2fc/bnx2fc.h
drivers/scsi/bnx2fc/bnx2fc_fcoe.c

index 3dfd1f9cbdf5f0895a1b819ef4a5c5d7eb1380c6..97c21e88bf19b82e709116b5630ba0d8d7fc9526 100644 (file)
 #define BNX2FC_MIN_XID                 0
 #define BNX2FC_MAX_XID                 \
                        (BNX2FC_MAX_OUTSTANDING_CMNDS + BNX2FC_ELSTM_XIDS - 1)
+#define FCOE_MAX_NUM_XIDS              0x2000
 #define FCOE_MIN_XID                   (BNX2FC_MAX_XID + 1)
-#define FCOE_MAX_XID                   (FCOE_MIN_XID + 4095)
+#define FCOE_MAX_XID                   (FCOE_MIN_XID + FCOE_MAX_NUM_XIDS - 1)
+#define FCOE_XIDS_PER_CPU              (FCOE_MIN_XID + (512 * nr_cpu_ids) - 1)
 #define BNX2FC_MAX_LUN                 0xFFFF
 #define BNX2FC_MAX_FCP_TGT             256
 #define BNX2FC_MAX_CMD_LEN             16
index 1b4f230f6ec2f39f423d4898d47535aa820eab02..b7ce75f2f7020a235fdda56aeb0fe919f95fe814 100644 (file)
@@ -941,8 +941,14 @@ static int bnx2fc_libfc_config(struct fc_lport *lport)
 
 static int bnx2fc_em_config(struct fc_lport *lport)
 {
+       int max_xid;
+
+       if (nr_cpu_ids <= 2)
+               max_xid = FCOE_XIDS_PER_CPU;
+       else
+               max_xid = FCOE_MAX_XID;
        if (!fc_exch_mgr_alloc(lport, FC_CLASS_3, FCOE_MIN_XID,
-                               FCOE_MAX_XID, NULL)) {
+                               max_xid, NULL)) {
                printk(KERN_ERR PFX "em_config:fc_exch_mgr_alloc failed\n");
                return -ENOMEM;
        }
@@ -2055,6 +2061,7 @@ if_create_err:
 ifput_err:
        bnx2fc_net_cleanup(interface);
        bnx2fc_interface_put(interface);
+       goto mod_err;
 netdev_err:
        module_put(THIS_MODULE);
 mod_err: