@@ -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-
32072976int 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