Skip to content

Commit d4f7a16

Browse files
Himanshu Madhanimartinkpetersen
authored andcommitted
scsi: qla2xxx: Remove ASYNC GIDPN switch command
Using GPNFT/GNNFT command will be able to cover switch database with less number of scans. This patch removes Get NportID with provided WWPN/GIDPN switch command. By making this change, in large fabric with lots of remote port or NPIV ports with noisy SAN, the number of GIDPN commands issued by a port when it detects large number of remote ports going away or coming back, can overwhelmn the switch and it can becomde unresponsive. In a case where the fabric has not change, GIDPN is not required. Signed-off-by: Quinn Tran <quinn.tran@cavium.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 0aca778 commit d4f7a16

5 files changed

Lines changed: 73 additions & 266 deletions

File tree

‎drivers/scsi/qla2xxx/qla_def.h‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2281,7 +2281,6 @@ struct ct_sns_desc {
22812281
enum discovery_state {
22822282
DSC_DELETED,
22832283
DSC_GNN_ID,
2284-
DSC_GID_PN,
22852284
DSC_GNL,
22862285
DSC_LOGIN_PEND,
22872286
DSC_LOGIN_FAILED,
@@ -2306,7 +2305,6 @@ enum login_state { /* FW control Target side */
23062305
enum fcport_mgt_event {
23072306
FCME_RELOGIN = 1,
23082307
FCME_RSCN,
2309-
FCME_GIDPN_DONE,
23102308
FCME_PLOGI_DONE, /* Initiator side sent LLIOCB */
23112309
FCME_PRLI_DONE,
23122310
FCME_GNL_DONE,
@@ -3219,7 +3217,6 @@ enum qla_work_type {
32193217
QLA_EVT_ASYNC_ADISC_DONE,
32203218
QLA_EVT_UEVENT,
32213219
QLA_EVT_AENFX,
3222-
QLA_EVT_GIDPN,
32233220
QLA_EVT_GPNID,
32243221
QLA_EVT_UNMAP,
32253222
QLA_EVT_NEW_SESS,

‎drivers/scsi/qla2xxx/qla_gbl.h‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ extern int qla2x00_post_async_prlo_done_work(struct scsi_qla_host *,
119119
int qla_post_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport);
120120
void qla_do_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport);
121121
int qla2x00_reserve_mgmt_server_loop_id(scsi_qla_host_t *);
122+
void qla_rscn_replay(fc_port_t *fcport);
123+
122124
/*
123125
* Global Data in qla_os.c source file.
124126
*/
@@ -645,9 +647,6 @@ extern void qla2x00_get_sym_node_name(scsi_qla_host_t *, uint8_t *, size_t);
645647
extern int qla2x00_chk_ms_status(scsi_qla_host_t *, ms_iocb_entry_t *,
646648
struct ct_sns_rsp *, const char *);
647649
extern void qla2x00_async_iocb_timeout(void *data);
648-
extern int qla24xx_async_gidpn(scsi_qla_host_t *, fc_port_t *);
649-
int qla24xx_post_gidpn_work(struct scsi_qla_host *, fc_port_t *);
650-
void qla24xx_handle_gidpn_event(scsi_qla_host_t *, struct event_arg *);
651650

652651
extern void qla2x00_free_fcport(fc_port_t *);
653652

‎drivers/scsi/qla2xxx/qla_gs.c‎

Lines changed: 1 addition & 237 deletions
Original file line numberDiff line numberDiff line change
@@ -2973,237 +2973,6 @@ qla2x00_gff_id(scsi_qla_host_t *vha, sw_info_t *list)
29732973
}
29742974
}
29752975

2976-
/* GID_PN completion processing. */
2977-
void qla24xx_handle_gidpn_event(scsi_qla_host_t *vha, struct event_arg *ea)
2978-
{
2979-
fc_port_t *fcport = ea->fcport;
2980-
2981-
ql_dbg(ql_dbg_disc, vha, 0x201d,
2982-
"%s %8phC DS %d LS %d rc %d login %d|%d rscn %d|%d lid %d\n",
2983-
__func__, fcport->port_name, fcport->disc_state,
2984-
fcport->fw_login_state, ea->rc, fcport->login_gen, ea->sp->gen2,
2985-
fcport->rscn_gen, ea->sp->gen1, fcport->loop_id);
2986-
2987-
if (fcport->disc_state == DSC_DELETE_PEND)
2988-
return;
2989-
2990-
if (ea->sp->gen2 != fcport->login_gen) {
2991-
/* PLOGI/PRLI/LOGO came in while cmd was out.*/
2992-
ql_dbg(ql_dbg_disc, vha, 0x201e,
2993-
"%s %8phC generation changed rscn %d|%d n",
2994-
__func__, fcport->port_name, fcport->last_rscn_gen,
2995-
fcport->rscn_gen);
2996-
return;
2997-
}
2998-
2999-
if (!ea->rc) {
3000-
if (ea->sp->gen1 == fcport->rscn_gen) {
3001-
fcport->scan_state = QLA_FCPORT_FOUND;
3002-
fcport->flags |= FCF_FABRIC_DEVICE;
3003-
3004-
if (fcport->d_id.b24 == ea->id.b24) {
3005-
/* cable plugged into the same place */
3006-
switch (vha->host->active_mode) {
3007-
case MODE_TARGET:
3008-
if (fcport->fw_login_state ==
3009-
DSC_LS_PRLI_COMP) {
3010-
u16 data[2];
3011-
/*
3012-
* Late RSCN was delivered.
3013-
* Remote port already login'ed.
3014-
*/
3015-
ql_dbg(ql_dbg_disc, vha, 0x201f,
3016-
"%s %d %8phC post adisc\n",
3017-
__func__, __LINE__,
3018-
fcport->port_name);
3019-
data[0] = data[1] = 0;
3020-
qla2x00_post_async_adisc_work(
3021-
vha, fcport, data);
3022-
}
3023-
break;
3024-
case MODE_INITIATOR:
3025-
case MODE_DUAL:
3026-
default:
3027-
ql_dbg(ql_dbg_disc, vha, 0x201f,
3028-
"%s %d %8phC post %s\n", __func__,
3029-
__LINE__, fcport->port_name,
3030-
(atomic_read(&fcport->state) ==
3031-
FCS_ONLINE) ? "adisc" : "gnl");
3032-
3033-
if (atomic_read(&fcport->state) ==
3034-
FCS_ONLINE) {
3035-
u16 data[2];
3036-
3037-
data[0] = data[1] = 0;
3038-
qla2x00_post_async_adisc_work(
3039-
vha, fcport, data);
3040-
} else {
3041-
qla24xx_post_gnl_work(vha,
3042-
fcport);
3043-
}
3044-
break;
3045-
}
3046-
} else { /* fcport->d_id.b24 != ea->id.b24 */
3047-
fcport->d_id.b24 = ea->id.b24;
3048-
fcport->id_changed = 1;
3049-
if (fcport->deleted != QLA_SESS_DELETED) {
3050-
ql_dbg(ql_dbg_disc, vha, 0x2021,
3051-
"%s %d %8phC post del sess\n",
3052-
__func__, __LINE__, fcport->port_name);
3053-
qlt_schedule_sess_for_deletion(fcport);
3054-
}
3055-
}
3056-
} else { /* ea->sp->gen1 != fcport->rscn_gen */
3057-
ql_dbg(ql_dbg_disc, vha, 0x2022,
3058-
"%s %d %8phC post gidpn\n",
3059-
__func__, __LINE__, fcport->port_name);
3060-
/* rscn came in while cmd was out */
3061-
qla24xx_post_gidpn_work(vha, fcport);
3062-
}
3063-
} else { /* ea->rc */
3064-
/* cable pulled */
3065-
if (ea->sp->gen1 == fcport->rscn_gen) {
3066-
if (ea->sp->gen2 == fcport->login_gen) {
3067-
ql_dbg(ql_dbg_disc, vha, 0x2042,
3068-
"%s %d %8phC post del sess\n", __func__,
3069-
__LINE__, fcport->port_name);
3070-
qlt_schedule_sess_for_deletion(fcport);
3071-
} else {
3072-
ql_dbg(ql_dbg_disc, vha, 0x2045,
3073-
"%s %d %8phC login\n", __func__, __LINE__,
3074-
fcport->port_name);
3075-
qla24xx_fcport_handle_login(vha, fcport);
3076-
}
3077-
} else {
3078-
ql_dbg(ql_dbg_disc, vha, 0x2049,
3079-
"%s %d %8phC post gidpn\n", __func__, __LINE__,
3080-
fcport->port_name);
3081-
qla24xx_post_gidpn_work(vha, fcport);
3082-
}
3083-
}
3084-
} /* gidpn_event */
3085-
3086-
static void qla2x00_async_gidpn_sp_done(void *s, int res)
3087-
{
3088-
struct srb *sp = s;
3089-
struct scsi_qla_host *vha = sp->vha;
3090-
fc_port_t *fcport = sp->fcport;
3091-
u8 *id = fcport->ct_desc.ct_sns->p.rsp.rsp.gid_pn.port_id;
3092-
struct event_arg ea;
3093-
3094-
fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
3095-
3096-
memset(&ea, 0, sizeof(ea));
3097-
ea.fcport = fcport;
3098-
ea.id.b.domain = id[0];
3099-
ea.id.b.area = id[1];
3100-
ea.id.b.al_pa = id[2];
3101-
ea.sp = sp;
3102-
ea.rc = res;
3103-
ea.event = FCME_GIDPN_DONE;
3104-
3105-
if (res == QLA_FUNCTION_TIMEOUT) {
3106-
ql_dbg(ql_dbg_disc, sp->vha, 0xffff,
3107-
"Async done-%s WWPN %8phC timed out.\n",
3108-
sp->name, fcport->port_name);
3109-
qla24xx_post_gidpn_work(sp->vha, fcport);
3110-
sp->free(sp);
3111-
return;
3112-
} else if (res) {
3113-
ql_dbg(ql_dbg_disc, sp->vha, 0xffff,
3114-
"Async done-%s fail res %x, WWPN %8phC\n",
3115-
sp->name, res, fcport->port_name);
3116-
} else {
3117-
ql_dbg(ql_dbg_disc, vha, 0x204f,
3118-
"Async done-%s good WWPN %8phC ID %3phC\n",
3119-
sp->name, fcport->port_name, id);
3120-
}
3121-
3122-
qla2x00_fcport_event_handler(vha, &ea);
3123-
3124-
sp->free(sp);
3125-
}
3126-
3127-
int qla24xx_async_gidpn(scsi_qla_host_t *vha, fc_port_t *fcport)
3128-
{
3129-
int rval = QLA_FUNCTION_FAILED;
3130-
struct ct_sns_req *ct_req;
3131-
srb_t *sp;
3132-
3133-
if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT))
3134-
return rval;
3135-
3136-
fcport->disc_state = DSC_GID_PN;
3137-
fcport->scan_state = QLA_FCPORT_SCAN;
3138-
sp = qla2x00_get_sp(vha, fcport, GFP_ATOMIC);
3139-
if (!sp)
3140-
goto done;
3141-
3142-
fcport->flags |= FCF_ASYNC_SENT;
3143-
sp->type = SRB_CT_PTHRU_CMD;
3144-
sp->name = "gidpn";
3145-
sp->gen1 = fcport->rscn_gen;
3146-
sp->gen2 = fcport->login_gen;
3147-
3148-
qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
3149-
3150-
/* CT_IU preamble */
3151-
ct_req = qla2x00_prep_ct_req(fcport->ct_desc.ct_sns, GID_PN_CMD,
3152-
GID_PN_RSP_SIZE);
3153-
3154-
/* GIDPN req */
3155-
memcpy(ct_req->req.gid_pn.port_name, fcport->port_name,
3156-
WWN_SIZE);
3157-
3158-
/* req & rsp use the same buffer */
3159-
sp->u.iocb_cmd.u.ctarg.req = fcport->ct_desc.ct_sns;
3160-
sp->u.iocb_cmd.u.ctarg.req_dma = fcport->ct_desc.ct_sns_dma;
3161-
sp->u.iocb_cmd.u.ctarg.rsp = fcport->ct_desc.ct_sns;
3162-
sp->u.iocb_cmd.u.ctarg.rsp_dma = fcport->ct_desc.ct_sns_dma;
3163-
sp->u.iocb_cmd.u.ctarg.req_size = GID_PN_REQ_SIZE;
3164-
sp->u.iocb_cmd.u.ctarg.rsp_size = GID_PN_RSP_SIZE;
3165-
sp->u.iocb_cmd.u.ctarg.nport_handle = NPH_SNS;
3166-
3167-
sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout;
3168-
sp->done = qla2x00_async_gidpn_sp_done;
3169-
3170-
rval = qla2x00_start_sp(sp);
3171-
if (rval != QLA_SUCCESS)
3172-
goto done_free_sp;
3173-
3174-
ql_dbg(ql_dbg_disc, vha, 0x20a4,
3175-
"Async-%s - %8phC hdl=%x loopid=%x portid %02x%02x%02x.\n",
3176-
sp->name, fcport->port_name,
3177-
sp->handle, fcport->loop_id, fcport->d_id.b.domain,
3178-
fcport->d_id.b.area, fcport->d_id.b.al_pa);
3179-
return rval;
3180-
3181-
done_free_sp:
3182-
sp->free(sp);
3183-
done:
3184-
fcport->flags &= ~FCF_ASYNC_ACTIVE;
3185-
return rval;
3186-
}
3187-
3188-
int qla24xx_post_gidpn_work(struct scsi_qla_host *vha, fc_port_t *fcport)
3189-
{
3190-
struct qla_work_evt *e;
3191-
int ls;
3192-
3193-
ls = atomic_read(&vha->loop_state);
3194-
if (((ls != LOOP_READY) && (ls != LOOP_UP)) ||
3195-
test_bit(UNLOADING, &vha->dpc_flags))
3196-
return 0;
3197-
3198-
e = qla2x00_alloc_work(vha, QLA_EVT_GIDPN);
3199-
if (!e)
3200-
return QLA_FUNCTION_FAILED;
3201-
3202-
e->u.fcport.fcport = fcport;
3203-
fcport->flags |= FCF_ASYNC_ACTIVE;
3204-
return qla2x00_post_work(vha, e);
3205-
}
3206-
32072976
int qla24xx_post_gpsc_work(struct scsi_qla_host *vha, fc_port_t *fcport)
32082977
{
32092978
struct qla_work_evt *e;
@@ -3237,9 +3006,6 @@ void qla24xx_handle_gpsc_event(scsi_qla_host_t *vha, struct event_arg *ea)
32373006
__func__, fcport->port_name);
32383007
return;
32393008
} else if (ea->sp->gen1 != fcport->rscn_gen) {
3240-
ql_dbg(ql_dbg_disc, vha, 0x20d4, "%s %d %8phC post gidpn\n",
3241-
__func__, __LINE__, fcport->port_name);
3242-
qla24xx_post_gidpn_work(vha, fcport);
32433009
return;
32443010
}
32453011

@@ -3466,6 +3232,7 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, struct event_arg *ea)
34663232
qlt_schedule_sess_for_deletion(conflict);
34673233
}
34683234

3235+
fcport->scan_needed = 0;
34693236
fcport->rscn_gen++;
34703237
fcport->scan_state = QLA_FCPORT_FOUND;
34713238
fcport->flags |= FCF_FABRIC_DEVICE;
@@ -4607,9 +4374,6 @@ void qla24xx_handle_gfpnid_event(scsi_qla_host_t *vha, struct event_arg *ea)
46074374
__func__, fcport->port_name);
46084375
return;
46094376
} else if (ea->sp->gen1 != fcport->rscn_gen) {
4610-
ql_dbg(ql_dbg_disc, vha, 0x20d4, "%s %d %8phC post gidpn\n",
4611-
__func__, __LINE__, fcport->port_name);
4612-
qla24xx_post_gidpn_work(vha, fcport);
46134377
return;
46144378
}
46154379

0 commit comments

Comments
 (0)