Commit 7d742f65 authored by Bhanu Prakash Gollapudi's avatar Bhanu Prakash Gollapudi Committed by James Bottomley

[SCSI] bnx2fc: NPIV ports go offline when interface is brought down & up

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: default avatarBhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 44c570b5
...@@ -123,8 +123,10 @@ ...@@ -123,8 +123,10 @@
#define BNX2FC_MIN_XID 0 #define BNX2FC_MIN_XID 0
#define BNX2FC_MAX_XID \ #define BNX2FC_MAX_XID \
(BNX2FC_MAX_OUTSTANDING_CMNDS + BNX2FC_ELSTM_XIDS - 1) (BNX2FC_MAX_OUTSTANDING_CMNDS + BNX2FC_ELSTM_XIDS - 1)
#define FCOE_MAX_NUM_XIDS 0x2000
#define FCOE_MIN_XID (BNX2FC_MAX_XID + 1) #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_LUN 0xFFFF
#define BNX2FC_MAX_FCP_TGT 256 #define BNX2FC_MAX_FCP_TGT 256
#define BNX2FC_MAX_CMD_LEN 16 #define BNX2FC_MAX_CMD_LEN 16
......
...@@ -940,8 +940,14 @@ static int bnx2fc_libfc_config(struct fc_lport *lport) ...@@ -940,8 +940,14 @@ static int bnx2fc_libfc_config(struct fc_lport *lport)
static int bnx2fc_em_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, 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"); printk(KERN_ERR PFX "em_config:fc_exch_mgr_alloc failed\n");
return -ENOMEM; return -ENOMEM;
} }
...@@ -2056,6 +2062,7 @@ static int bnx2fc_create(struct net_device *netdev, enum fip_state fip_mode) ...@@ -2056,6 +2062,7 @@ static int bnx2fc_create(struct net_device *netdev, enum fip_state fip_mode)
ifput_err: ifput_err:
bnx2fc_net_cleanup(interface); bnx2fc_net_cleanup(interface);
bnx2fc_interface_put(interface); bnx2fc_interface_put(interface);
goto mod_err;
netdev_err: netdev_err:
module_put(THIS_MODULE); module_put(THIS_MODULE);
mod_err: mod_err:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment