diff options
author | Krishna Gudipati <kgudipat@brocade.com> | 2012-08-22 22:52:43 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2012-09-24 04:10:57 -0400 |
commit | ce7242b80278426a798c13ce96657690db9332d9 (patch) | |
tree | 13f5bd2249c0ac6c544325cda5692bc804386a17 | |
parent | 9aec02497590cac5abdb5c044e3ec57010b1d808 (diff) |
[SCSI] bfa: Add support to register node symbolic name with name server
- Changes to register node symbolic name with name server on the fabric
by sending CT commands RNN_ID and RSNN_NN.
Signed-off-by: Vijaya Mohan Guvva <vmohan@brocade.com>
Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r-- | drivers/scsi/bfa/bfa_defs_fcs.h | 13 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fc.h | 10 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcbuild.c | 21 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcbuild.h | 2 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs.c | 39 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs.h | 5 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs_lport.c | 366 |
7 files changed, 454 insertions, 2 deletions
diff --git a/drivers/scsi/bfa/bfa_defs_fcs.h b/drivers/scsi/bfa/bfa_defs_fcs.h index 5871a1b6e2b..06f0a163ca3 100644 --- a/drivers/scsi/bfa/bfa_defs_fcs.h +++ b/drivers/scsi/bfa/bfa_defs_fcs.h | |||
@@ -93,6 +93,7 @@ struct bfa_lport_cfg_s { | |||
93 | wwn_t pwwn; /* port wwn */ | 93 | wwn_t pwwn; /* port wwn */ |
94 | wwn_t nwwn; /* node wwn */ | 94 | wwn_t nwwn; /* node wwn */ |
95 | struct bfa_lport_symname_s sym_name; /* vm port symbolic name */ | 95 | struct bfa_lport_symname_s sym_name; /* vm port symbolic name */ |
96 | struct bfa_lport_symname_s node_sym_name; /* Node symbolic name */ | ||
96 | enum bfa_lport_role roles; /* FCS port roles */ | 97 | enum bfa_lport_role roles; /* FCS port roles */ |
97 | u32 rsvd; | 98 | u32 rsvd; |
98 | bfa_boolean_t preboot_vp; /* vport created from PBC */ | 99 | bfa_boolean_t preboot_vp; /* vport created from PBC */ |
@@ -192,6 +193,18 @@ struct bfa_lport_stats_s { | |||
192 | u32 ns_gidft_unknown_rsp; | 193 | u32 ns_gidft_unknown_rsp; |
193 | u32 ns_gidft_alloc_wait; | 194 | u32 ns_gidft_alloc_wait; |
194 | 195 | ||
196 | u32 ns_rnnid_sent; | ||
197 | u32 ns_rnnid_accepts; | ||
198 | u32 ns_rnnid_rsp_err; | ||
199 | u32 ns_rnnid_rejects; | ||
200 | u32 ns_rnnid_alloc_wait; | ||
201 | |||
202 | u32 ns_rsnn_nn_sent; | ||
203 | u32 ns_rsnn_nn_accepts; | ||
204 | u32 ns_rsnn_nn_rsp_err; | ||
205 | u32 ns_rsnn_nn_rejects; | ||
206 | u32 ns_rsnn_nn_alloc_wait; | ||
207 | |||
195 | /* | 208 | /* |
196 | * Mgmt Server stats | 209 | * Mgmt Server stats |
197 | */ | 210 | */ |
diff --git a/drivers/scsi/bfa/bfa_fc.h b/drivers/scsi/bfa/bfa_fc.h index 8d0b88f67a3..e0beb4d7e26 100644 --- a/drivers/scsi/bfa/bfa_fc.h +++ b/drivers/scsi/bfa/bfa_fc.h | |||
@@ -1279,6 +1279,7 @@ enum { | |||
1279 | GS_GSPN_ID = 0x0118, /* Get symbolic PN on ID */ | 1279 | GS_GSPN_ID = 0x0118, /* Get symbolic PN on ID */ |
1280 | GS_RFT_ID = 0x0217, /* Register fc4type on ID */ | 1280 | GS_RFT_ID = 0x0217, /* Register fc4type on ID */ |
1281 | GS_RSPN_ID = 0x0218, /* Register symbolic PN on ID */ | 1281 | GS_RSPN_ID = 0x0218, /* Register symbolic PN on ID */ |
1282 | GS_RSNN_NN = 0x0239, /* Register symbolic NN on NN */ | ||
1282 | GS_RPN_ID = 0x0212, /* Register port name */ | 1283 | GS_RPN_ID = 0x0212, /* Register port name */ |
1283 | GS_RNN_ID = 0x0213, /* Register node name */ | 1284 | GS_RNN_ID = 0x0213, /* Register node name */ |
1284 | GS_RCS_ID = 0x0214, /* Register class of service */ | 1285 | GS_RCS_ID = 0x0214, /* Register class of service */ |
@@ -1357,6 +1358,15 @@ struct fcgs_rspnid_req_s { | |||
1357 | }; | 1358 | }; |
1358 | 1359 | ||
1359 | /* | 1360 | /* |
1361 | * RSNN_NN | ||
1362 | */ | ||
1363 | struct fcgs_rsnn_nn_req_s { | ||
1364 | wwn_t node_name; /* Node name */ | ||
1365 | u8 snn_len; /* symbolic node name length */ | ||
1366 | u8 snn[256]; /* symbolic node name */ | ||
1367 | }; | ||
1368 | |||
1369 | /* | ||
1360 | * RPN_ID | 1370 | * RPN_ID |
1361 | */ | 1371 | */ |
1362 | struct fcgs_rpnid_req_s { | 1372 | struct fcgs_rpnid_req_s { |
diff --git a/drivers/scsi/bfa/bfa_fcbuild.c b/drivers/scsi/bfa/bfa_fcbuild.c index 17b59b8b564..273cee90b3b 100644 --- a/drivers/scsi/bfa/bfa_fcbuild.c +++ b/drivers/scsi/bfa/bfa_fcbuild.c | |||
@@ -1252,6 +1252,27 @@ fc_rspnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, | |||
1252 | } | 1252 | } |
1253 | 1253 | ||
1254 | u16 | 1254 | u16 |
1255 | fc_rsnn_nn_build(struct fchs_s *fchs, void *pyld, u32 s_id, | ||
1256 | wwn_t node_name, u8 *name) | ||
1257 | { | ||
1258 | struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; | ||
1259 | struct fcgs_rsnn_nn_req_s *rsnn_nn = | ||
1260 | (struct fcgs_rsnn_nn_req_s *) (cthdr + 1); | ||
1261 | u32 d_id = bfa_hton3b(FC_NAME_SERVER); | ||
1262 | |||
1263 | fc_gs_fchdr_build(fchs, d_id, s_id, 0); | ||
1264 | fc_gs_cthdr_build(cthdr, s_id, GS_RSNN_NN); | ||
1265 | |||
1266 | memset(rsnn_nn, 0, sizeof(struct fcgs_rsnn_nn_req_s)); | ||
1267 | |||
1268 | rsnn_nn->node_name = node_name; | ||
1269 | rsnn_nn->snn_len = (u8) strlen((char *)name); | ||
1270 | strncpy((char *)rsnn_nn->snn, (char *)name, rsnn_nn->snn_len); | ||
1271 | |||
1272 | return sizeof(struct fcgs_rsnn_nn_req_s) + sizeof(struct ct_hdr_s); | ||
1273 | } | ||
1274 | |||
1275 | u16 | ||
1255 | fc_gid_ft_build(struct fchs_s *fchs, void *pyld, u32 s_id, u8 fc4_type) | 1276 | fc_gid_ft_build(struct fchs_s *fchs, void *pyld, u32 s_id, u8 fc4_type) |
1256 | { | 1277 | { |
1257 | 1278 | ||
diff --git a/drivers/scsi/bfa/bfa_fcbuild.h b/drivers/scsi/bfa/bfa_fcbuild.h index 42cd9d4da69..03c753d1e54 100644 --- a/drivers/scsi/bfa/bfa_fcbuild.h +++ b/drivers/scsi/bfa/bfa_fcbuild.h | |||
@@ -166,6 +166,8 @@ enum fc_parse_status fc_rrq_rsp_parse(struct fchs_s *buf, int len); | |||
166 | 166 | ||
167 | u16 fc_rspnid_build(struct fchs_s *fchs, void *pld, u32 s_id, | 167 | u16 fc_rspnid_build(struct fchs_s *fchs, void *pld, u32 s_id, |
168 | u16 ox_id, u8 *name); | 168 | u16 ox_id, u8 *name); |
169 | u16 fc_rsnn_nn_build(struct fchs_s *fchs, void *pld, u32 s_id, | ||
170 | wwn_t node_name, u8 *name); | ||
169 | 171 | ||
170 | u16 fc_rftid_build(struct fchs_s *fchs, void *pld, u32 s_id, | 172 | u16 fc_rftid_build(struct fchs_s *fchs, void *pld, u32 s_id, |
171 | u16 ox_id, enum bfa_lport_role role); | 173 | u16 ox_id, enum bfa_lport_role role); |
diff --git a/drivers/scsi/bfa/bfa_fcs.c b/drivers/scsi/bfa/bfa_fcs.c index 671a1a227f9..2139592aca5 100644 --- a/drivers/scsi/bfa/bfa_fcs.c +++ b/drivers/scsi/bfa/bfa_fcs.c | |||
@@ -165,6 +165,7 @@ bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs, | |||
165 | fcs->driver_info = *driver_info; | 165 | fcs->driver_info = *driver_info; |
166 | 166 | ||
167 | bfa_fcs_fabric_psymb_init(&fcs->fabric); | 167 | bfa_fcs_fabric_psymb_init(&fcs->fabric); |
168 | bfa_fcs_fabric_nsymb_init(&fcs->fabric); | ||
168 | } | 169 | } |
169 | 170 | ||
170 | /* | 171 | /* |
@@ -843,6 +844,44 @@ bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric) | |||
843 | } | 844 | } |
844 | 845 | ||
845 | /* | 846 | /* |
847 | * Node Symbolic Name Creation for base port and all vports | ||
848 | */ | ||
849 | void | ||
850 | bfa_fcs_fabric_nsymb_init(struct bfa_fcs_fabric_s *fabric) | ||
851 | { | ||
852 | struct bfa_lport_cfg_s *port_cfg = &fabric->bport.port_cfg; | ||
853 | char model[BFA_ADAPTER_MODEL_NAME_LEN] = {0}; | ||
854 | struct bfa_fcs_driver_info_s *driver_info = &fabric->fcs->driver_info; | ||
855 | |||
856 | bfa_ioc_get_adapter_model(&fabric->fcs->bfa->ioc, model); | ||
857 | |||
858 | /* Model name/number */ | ||
859 | strncpy((char *)&port_cfg->node_sym_name, model, | ||
860 | BFA_FCS_PORT_SYMBNAME_MODEL_SZ); | ||
861 | strncat((char *)&port_cfg->node_sym_name, | ||
862 | BFA_FCS_PORT_SYMBNAME_SEPARATOR, | ||
863 | sizeof(BFA_FCS_PORT_SYMBNAME_SEPARATOR)); | ||
864 | |||
865 | /* Driver Version */ | ||
866 | strncat((char *)&port_cfg->node_sym_name, (char *)driver_info->version, | ||
867 | BFA_FCS_PORT_SYMBNAME_VERSION_SZ); | ||
868 | strncat((char *)&port_cfg->node_sym_name, | ||
869 | BFA_FCS_PORT_SYMBNAME_SEPARATOR, | ||
870 | sizeof(BFA_FCS_PORT_SYMBNAME_SEPARATOR)); | ||
871 | |||
872 | /* Host machine name */ | ||
873 | strncat((char *)&port_cfg->node_sym_name, | ||
874 | (char *)driver_info->host_machine_name, | ||
875 | BFA_FCS_PORT_SYMBNAME_MACHINENAME_SZ); | ||
876 | strncat((char *)&port_cfg->node_sym_name, | ||
877 | BFA_FCS_PORT_SYMBNAME_SEPARATOR, | ||
878 | sizeof(BFA_FCS_PORT_SYMBNAME_SEPARATOR)); | ||
879 | |||
880 | /* null terminate */ | ||
881 | port_cfg->node_sym_name.symname[BFA_SYMNAME_MAXLEN - 1] = 0; | ||
882 | } | ||
883 | |||
884 | /* | ||
846 | * bfa lps login completion callback | 885 | * bfa lps login completion callback |
847 | */ | 886 | */ |
848 | void | 887 | void |
diff --git a/drivers/scsi/bfa/bfa_fcs.h b/drivers/scsi/bfa/bfa_fcs.h index b64ca35bf6f..2b35f1b6e4f 100644 --- a/drivers/scsi/bfa/bfa_fcs.h +++ b/drivers/scsi/bfa/bfa_fcs.h | |||
@@ -62,6 +62,7 @@ struct bfa_fcs_s; | |||
62 | #define N2N_LOCAL_PID 0x010000 | 62 | #define N2N_LOCAL_PID 0x010000 |
63 | #define N2N_REMOTE_PID 0x020000 | 63 | #define N2N_REMOTE_PID 0x020000 |
64 | #define BFA_FCS_RETRY_TIMEOUT 2000 | 64 | #define BFA_FCS_RETRY_TIMEOUT 2000 |
65 | #define BFA_FCS_MAX_NS_RETRIES 5 | ||
65 | #define BFA_FCS_PID_IS_WKA(pid) ((bfa_ntoh3b(pid) > 0xFFF000) ? 1 : 0) | 66 | #define BFA_FCS_PID_IS_WKA(pid) ((bfa_ntoh3b(pid) > 0xFFF000) ? 1 : 0) |
66 | 67 | ||
67 | 68 | ||
@@ -72,6 +73,8 @@ struct bfa_fcs_lport_ns_s { | |||
72 | struct bfa_fcs_lport_s *port; /* parent port */ | 73 | struct bfa_fcs_lport_s *port; /* parent port */ |
73 | struct bfa_fcxp_s *fcxp; | 74 | struct bfa_fcxp_s *fcxp; |
74 | struct bfa_fcxp_wqe_s fcxp_wqe; | 75 | struct bfa_fcxp_wqe_s fcxp_wqe; |
76 | u8 num_rnnid_retries; | ||
77 | u8 num_rsnn_nn_retries; | ||
75 | }; | 78 | }; |
76 | 79 | ||
77 | 80 | ||
@@ -265,6 +268,7 @@ struct bfa_fcs_fabric_s; | |||
265 | #define bfa_fcs_lport_get_pwwn(_lport) ((_lport)->port_cfg.pwwn) | 268 | #define bfa_fcs_lport_get_pwwn(_lport) ((_lport)->port_cfg.pwwn) |
266 | #define bfa_fcs_lport_get_nwwn(_lport) ((_lport)->port_cfg.nwwn) | 269 | #define bfa_fcs_lport_get_nwwn(_lport) ((_lport)->port_cfg.nwwn) |
267 | #define bfa_fcs_lport_get_psym_name(_lport) ((_lport)->port_cfg.sym_name) | 270 | #define bfa_fcs_lport_get_psym_name(_lport) ((_lport)->port_cfg.sym_name) |
271 | #define bfa_fcs_lport_get_nsym_name(_lport) ((_lport)->port_cfg.node_sym_name) | ||
268 | #define bfa_fcs_lport_is_initiator(_lport) \ | 272 | #define bfa_fcs_lport_is_initiator(_lport) \ |
269 | ((_lport)->port_cfg.roles & BFA_LPORT_ROLE_FCP_IM) | 273 | ((_lport)->port_cfg.roles & BFA_LPORT_ROLE_FCP_IM) |
270 | #define bfa_fcs_lport_get_nrports(_lport) \ | 274 | #define bfa_fcs_lport_get_nrports(_lport) \ |
@@ -780,6 +784,7 @@ void bfa_fcs_fabric_modstart(struct bfa_fcs_s *fcs); | |||
780 | void bfa_fcs_fabric_uf_recv(struct bfa_fcs_fabric_s *fabric, | 784 | void bfa_fcs_fabric_uf_recv(struct bfa_fcs_fabric_s *fabric, |
781 | struct fchs_s *fchs, u16 len); | 785 | struct fchs_s *fchs, u16 len); |
782 | void bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric); | 786 | void bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric); |
787 | void bfa_fcs_fabric_nsymb_init(struct bfa_fcs_fabric_s *fabric); | ||
783 | void bfa_fcs_fabric_set_fabric_name(struct bfa_fcs_fabric_s *fabric, | 788 | void bfa_fcs_fabric_set_fabric_name(struct bfa_fcs_fabric_s *fabric, |
784 | wwn_t fabric_name); | 789 | wwn_t fabric_name); |
785 | u16 bfa_fcs_fabric_get_switch_oui(struct bfa_fcs_fabric_s *fabric); | 790 | u16 bfa_fcs_fabric_get_switch_oui(struct bfa_fcs_fabric_s *fabric); |
diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c index 3c9bde9a808..d4a4d534843 100644 --- a/drivers/scsi/bfa/bfa_fcs_lport.c +++ b/drivers/scsi/bfa/bfa_fcs_lport.c | |||
@@ -3229,6 +3229,10 @@ static void bfa_fcs_lport_ns_send_rff_id(void *ns_cbarg, | |||
3229 | struct bfa_fcxp_s *fcxp_alloced); | 3229 | struct bfa_fcxp_s *fcxp_alloced); |
3230 | static void bfa_fcs_lport_ns_send_gid_ft(void *ns_cbarg, | 3230 | static void bfa_fcs_lport_ns_send_gid_ft(void *ns_cbarg, |
3231 | struct bfa_fcxp_s *fcxp_alloced); | 3231 | struct bfa_fcxp_s *fcxp_alloced); |
3232 | static void bfa_fcs_lport_ns_send_rnn_id(void *ns_cbarg, | ||
3233 | struct bfa_fcxp_s *fcxp_alloced); | ||
3234 | static void bfa_fcs_lport_ns_send_rsnn_nn(void *ns_cbarg, | ||
3235 | struct bfa_fcxp_s *fcxp_alloced); | ||
3232 | static void bfa_fcs_lport_ns_timeout(void *arg); | 3236 | static void bfa_fcs_lport_ns_timeout(void *arg); |
3233 | static void bfa_fcs_lport_ns_plogi_response(void *fcsarg, | 3237 | static void bfa_fcs_lport_ns_plogi_response(void *fcsarg, |
3234 | struct bfa_fcxp_s *fcxp, | 3238 | struct bfa_fcxp_s *fcxp, |
@@ -3265,6 +3269,20 @@ static void bfa_fcs_lport_ns_gid_ft_response(void *fcsarg, | |||
3265 | u32 rsp_len, | 3269 | u32 rsp_len, |
3266 | u32 resid_len, | 3270 | u32 resid_len, |
3267 | struct fchs_s *rsp_fchs); | 3271 | struct fchs_s *rsp_fchs); |
3272 | static void bfa_fcs_lport_ns_rnn_id_response(void *fcsarg, | ||
3273 | struct bfa_fcxp_s *fcxp, | ||
3274 | void *cbarg, | ||
3275 | bfa_status_t req_status, | ||
3276 | u32 rsp_len, | ||
3277 | u32 resid_len, | ||
3278 | struct fchs_s *rsp_fchs); | ||
3279 | static void bfa_fcs_lport_ns_rsnn_nn_response(void *fcsarg, | ||
3280 | struct bfa_fcxp_s *fcxp, | ||
3281 | void *cbarg, | ||
3282 | bfa_status_t req_status, | ||
3283 | u32 rsp_len, | ||
3284 | u32 resid_len, | ||
3285 | struct fchs_s *rsp_fchs); | ||
3268 | static void bfa_fcs_lport_ns_process_gidft_pids( | 3286 | static void bfa_fcs_lport_ns_process_gidft_pids( |
3269 | struct bfa_fcs_lport_s *port, | 3287 | struct bfa_fcs_lport_s *port, |
3270 | u32 *pid_buf, u32 n_pids); | 3288 | u32 *pid_buf, u32 n_pids); |
@@ -3289,6 +3307,8 @@ enum vport_ns_event { | |||
3289 | NSSM_EVENT_RFTID_SENT = 9, | 3307 | NSSM_EVENT_RFTID_SENT = 9, |
3290 | NSSM_EVENT_RFFID_SENT = 10, | 3308 | NSSM_EVENT_RFFID_SENT = 10, |
3291 | NSSM_EVENT_GIDFT_SENT = 11, | 3309 | NSSM_EVENT_GIDFT_SENT = 11, |
3310 | NSSM_EVENT_RNNID_SENT = 12, | ||
3311 | NSSM_EVENT_RSNN_NN_SENT = 13, | ||
3292 | }; | 3312 | }; |
3293 | 3313 | ||
3294 | static void bfa_fcs_lport_ns_sm_offline(struct bfa_fcs_lport_ns_s *ns, | 3314 | static void bfa_fcs_lport_ns_sm_offline(struct bfa_fcs_lport_ns_s *ns, |
@@ -3329,6 +3349,21 @@ static void bfa_fcs_lport_ns_sm_gid_ft_retry(struct bfa_fcs_lport_ns_s *ns, | |||
3329 | enum vport_ns_event event); | 3349 | enum vport_ns_event event); |
3330 | static void bfa_fcs_lport_ns_sm_online(struct bfa_fcs_lport_ns_s *ns, | 3350 | static void bfa_fcs_lport_ns_sm_online(struct bfa_fcs_lport_ns_s *ns, |
3331 | enum vport_ns_event event); | 3351 | enum vport_ns_event event); |
3352 | static void bfa_fcs_lport_ns_sm_sending_rnn_id( | ||
3353 | struct bfa_fcs_lport_ns_s *ns, | ||
3354 | enum vport_ns_event event); | ||
3355 | static void bfa_fcs_lport_ns_sm_rnn_id(struct bfa_fcs_lport_ns_s *ns, | ||
3356 | enum vport_ns_event event); | ||
3357 | static void bfa_fcs_lport_ns_sm_rnn_id_retry(struct bfa_fcs_lport_ns_s *ns, | ||
3358 | enum vport_ns_event event); | ||
3359 | static void bfa_fcs_lport_ns_sm_sending_rsnn_nn( | ||
3360 | struct bfa_fcs_lport_ns_s *ns, | ||
3361 | enum vport_ns_event event); | ||
3362 | static void bfa_fcs_lport_ns_sm_rsnn_nn(struct bfa_fcs_lport_ns_s *ns, | ||
3363 | enum vport_ns_event event); | ||
3364 | static void bfa_fcs_lport_ns_sm_rsnn_nn_retry( | ||
3365 | struct bfa_fcs_lport_ns_s *ns, | ||
3366 | enum vport_ns_event event); | ||
3332 | /* | 3367 | /* |
3333 | * Start in offline state - awaiting linkup | 3368 | * Start in offline state - awaiting linkup |
3334 | */ | 3369 | */ |
@@ -3396,8 +3431,9 @@ bfa_fcs_lport_ns_sm_plogi(struct bfa_fcs_lport_ns_s *ns, | |||
3396 | break; | 3431 | break; |
3397 | 3432 | ||
3398 | case NSSM_EVENT_RSP_OK: | 3433 | case NSSM_EVENT_RSP_OK: |
3399 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_sending_rspn_id); | 3434 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_sending_rnn_id); |
3400 | bfa_fcs_lport_ns_send_rspn_id(ns, NULL); | 3435 | ns->num_rnnid_retries = 0; |
3436 | bfa_fcs_lport_ns_send_rnn_id(ns, NULL); | ||
3401 | break; | 3437 | break; |
3402 | 3438 | ||
3403 | case NSSM_EVENT_PORT_OFFLINE: | 3439 | case NSSM_EVENT_PORT_OFFLINE: |
@@ -3437,6 +3473,176 @@ bfa_fcs_lport_ns_sm_plogi_retry(struct bfa_fcs_lport_ns_s *ns, | |||
3437 | } | 3473 | } |
3438 | 3474 | ||
3439 | static void | 3475 | static void |
3476 | bfa_fcs_lport_ns_sm_sending_rnn_id(struct bfa_fcs_lport_ns_s *ns, | ||
3477 | enum vport_ns_event event) | ||
3478 | { | ||
3479 | bfa_trc(ns->port->fcs, ns->port->port_cfg.pwwn); | ||
3480 | bfa_trc(ns->port->fcs, event); | ||
3481 | |||
3482 | switch (event) { | ||
3483 | case NSSM_EVENT_RNNID_SENT: | ||
3484 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_rnn_id); | ||
3485 | break; | ||
3486 | |||
3487 | case NSSM_EVENT_PORT_OFFLINE: | ||
3488 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_offline); | ||
3489 | bfa_fcxp_walloc_cancel(BFA_FCS_GET_HAL_FROM_PORT(ns->port), | ||
3490 | &ns->fcxp_wqe); | ||
3491 | break; | ||
3492 | default: | ||
3493 | bfa_sm_fault(ns->port->fcs, event); | ||
3494 | } | ||
3495 | } | ||
3496 | |||
3497 | static void | ||
3498 | bfa_fcs_lport_ns_sm_rnn_id(struct bfa_fcs_lport_ns_s *ns, | ||
3499 | enum vport_ns_event event) | ||
3500 | { | ||
3501 | bfa_trc(ns->port->fcs, ns->port->port_cfg.pwwn); | ||
3502 | bfa_trc(ns->port->fcs, event); | ||
3503 | |||
3504 | switch (event) { | ||
3505 | case NSSM_EVENT_RSP_OK: | ||
3506 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_sending_rsnn_nn); | ||
3507 | ns->num_rnnid_retries = 0; | ||
3508 | ns->num_rsnn_nn_retries = 0; | ||
3509 | bfa_fcs_lport_ns_send_rsnn_nn(ns, NULL); | ||
3510 | break; | ||
3511 | |||
3512 | case NSSM_EVENT_RSP_ERROR: | ||
3513 | if (ns->num_rnnid_retries < BFA_FCS_MAX_NS_RETRIES) { | ||
3514 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_rnn_id_retry); | ||
3515 | ns->port->stats.ns_retries++; | ||
3516 | ns->num_rnnid_retries++; | ||
3517 | bfa_timer_start(BFA_FCS_GET_HAL_FROM_PORT(ns->port), | ||
3518 | &ns->timer, bfa_fcs_lport_ns_timeout, ns, | ||
3519 | BFA_FCS_RETRY_TIMEOUT); | ||
3520 | } else { | ||
3521 | bfa_sm_set_state(ns, | ||
3522 | bfa_fcs_lport_ns_sm_sending_rspn_id); | ||
3523 | bfa_fcs_lport_ns_send_rspn_id(ns, NULL); | ||
3524 | } | ||
3525 | break; | ||
3526 | |||
3527 | case NSSM_EVENT_PORT_OFFLINE: | ||
3528 | bfa_fcxp_discard(ns->fcxp); | ||
3529 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_offline); | ||
3530 | break; | ||
3531 | |||
3532 | default: | ||
3533 | bfa_sm_fault(ns->port->fcs, event); | ||
3534 | } | ||
3535 | } | ||
3536 | |||
3537 | static void | ||
3538 | bfa_fcs_lport_ns_sm_rnn_id_retry(struct bfa_fcs_lport_ns_s *ns, | ||
3539 | enum vport_ns_event event) | ||
3540 | { | ||
3541 | bfa_trc(ns->port->fcs, ns->port->port_cfg.pwwn); | ||
3542 | bfa_trc(ns->port->fcs, event); | ||
3543 | |||
3544 | switch (event) { | ||
3545 | case NSSM_EVENT_TIMEOUT: | ||
3546 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_sending_rnn_id); | ||
3547 | bfa_fcs_lport_ns_send_rnn_id(ns, NULL); | ||
3548 | break; | ||
3549 | |||
3550 | case NSSM_EVENT_PORT_OFFLINE: | ||
3551 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_offline); | ||
3552 | bfa_timer_stop(&ns->timer); | ||
3553 | break; | ||
3554 | |||
3555 | default: | ||
3556 | bfa_sm_fault(ns->port->fcs, event); | ||
3557 | } | ||
3558 | } | ||
3559 | |||
3560 | static void | ||
3561 | bfa_fcs_lport_ns_sm_sending_rsnn_nn(struct bfa_fcs_lport_ns_s *ns, | ||
3562 | enum vport_ns_event event) | ||
3563 | { | ||
3564 | bfa_trc(ns->port->fcs, ns->port->port_cfg.pwwn); | ||
3565 | bfa_trc(ns->port->fcs, event); | ||
3566 | |||
3567 | switch (event) { | ||
3568 | case NSSM_EVENT_RSNN_NN_SENT: | ||
3569 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_rsnn_nn); | ||
3570 | break; | ||
3571 | |||
3572 | case NSSM_EVENT_PORT_OFFLINE: | ||
3573 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_offline); | ||
3574 | bfa_fcxp_walloc_cancel(BFA_FCS_GET_HAL_FROM_PORT(ns->port), | ||
3575 | &ns->fcxp_wqe); | ||
3576 | break; | ||
3577 | |||
3578 | default: | ||
3579 | bfa_sm_fault(ns->port->fcs, event); | ||
3580 | } | ||
3581 | } | ||
3582 | |||
3583 | static void | ||
3584 | bfa_fcs_lport_ns_sm_rsnn_nn(struct bfa_fcs_lport_ns_s *ns, | ||
3585 | enum vport_ns_event event) | ||
3586 | { | ||
3587 | bfa_trc(ns->port->fcs, ns->port->port_cfg.pwwn); | ||
3588 | bfa_trc(ns->port->fcs, event); | ||
3589 | |||
3590 | switch (event) { | ||
3591 | case NSSM_EVENT_RSP_OK: | ||
3592 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_sending_rspn_id); | ||
3593 | ns->num_rsnn_nn_retries = 0; | ||
3594 | bfa_fcs_lport_ns_send_rspn_id(ns, NULL); | ||
3595 | break; | ||
3596 | |||
3597 | case NSSM_EVENT_RSP_ERROR: | ||
3598 | if (ns->num_rsnn_nn_retries < BFA_FCS_MAX_NS_RETRIES) { | ||
3599 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_rsnn_nn_retry); | ||
3600 | ns->port->stats.ns_retries++; | ||
3601 | ns->num_rsnn_nn_retries++; | ||
3602 | bfa_timer_start(BFA_FCS_GET_HAL_FROM_PORT(ns->port), | ||
3603 | &ns->timer, bfa_fcs_lport_ns_timeout, | ||
3604 | ns, BFA_FCS_RETRY_TIMEOUT); | ||
3605 | } else { | ||
3606 | bfa_sm_set_state(ns, | ||
3607 | bfa_fcs_lport_ns_sm_sending_rspn_id); | ||
3608 | bfa_fcs_lport_ns_send_rspn_id(ns, NULL); | ||
3609 | } | ||
3610 | break; | ||
3611 | |||
3612 | case NSSM_EVENT_PORT_OFFLINE: | ||
3613 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_offline); | ||
3614 | bfa_fcxp_discard(ns->fcxp); | ||
3615 | break; | ||
3616 | |||
3617 | default: | ||
3618 | bfa_sm_fault(ns->port->fcs, event); | ||
3619 | } | ||
3620 | } | ||
3621 | |||
3622 | static void | ||
3623 | bfa_fcs_lport_ns_sm_rsnn_nn_retry(struct bfa_fcs_lport_ns_s *ns, | ||
3624 | enum vport_ns_event event) | ||
3625 | { | ||
3626 | bfa_trc(ns->port->fcs, ns->port->port_cfg.pwwn); | ||
3627 | bfa_trc(ns->port->fcs, event); | ||
3628 | |||
3629 | switch (event) { | ||
3630 | case NSSM_EVENT_TIMEOUT: | ||
3631 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_sending_rsnn_nn); | ||
3632 | bfa_fcs_lport_ns_send_rsnn_nn(ns, NULL); | ||
3633 | break; | ||
3634 | |||
3635 | case NSSM_EVENT_PORT_OFFLINE: | ||
3636 | bfa_sm_set_state(ns, bfa_fcs_lport_ns_sm_offline); | ||
3637 | bfa_timer_stop(&ns->timer); | ||
3638 | break; | ||
3639 | |||
3640 | default: | ||
3641 | bfa_sm_fault(ns->port->fcs, event); | ||
3642 | } | ||
3643 | } | ||
3644 | |||
3645 | static void | ||
3440 | bfa_fcs_lport_ns_sm_sending_rspn_id(struct bfa_fcs_lport_ns_s *ns, | 3646 | bfa_fcs_lport_ns_sm_sending_rspn_id(struct bfa_fcs_lport_ns_s *ns, |
3441 | enum vport_ns_event event) | 3647 | enum vport_ns_event event) |
3442 | { | 3648 | { |
@@ -3917,6 +4123,162 @@ bfa_fcs_lport_ns_plogi_response(void *fcsarg, struct bfa_fcxp_s *fcxp, | |||
3917 | } | 4123 | } |
3918 | 4124 | ||
3919 | /* | 4125 | /* |
4126 | * Register node name for port_id | ||
4127 | */ | ||
4128 | static void | ||
4129 | bfa_fcs_lport_ns_send_rnn_id(void *ns_cbarg, struct bfa_fcxp_s *fcxp_alloced) | ||
4130 | { | ||
4131 | struct bfa_fcs_lport_ns_s *ns = ns_cbarg; | ||
4132 | struct bfa_fcs_lport_s *port = ns->port; | ||
4133 | struct fchs_s fchs; | ||
4134 | int len; | ||
4135 | struct bfa_fcxp_s *fcxp; | ||
4136 | |||
4137 | bfa_trc(port->fcs, port->port_cfg.pwwn); | ||
4138 | |||
4139 | fcxp = fcxp_alloced ? fcxp_alloced : | ||
4140 | bfa_fcs_fcxp_alloc(port->fcs, BFA_TRUE); | ||
4141 | if (!fcxp) { | ||
4142 | port->stats.ns_rnnid_alloc_wait++; | ||
4143 | bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &ns->fcxp_wqe, | ||
4144 | bfa_fcs_lport_ns_send_rnn_id, ns, BFA_TRUE); | ||
4145 | return; | ||
4146 | } | ||
4147 | |||
4148 | ns->fcxp = fcxp; | ||
4149 | |||
4150 | len = fc_rnnid_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), | ||
4151 | bfa_fcs_lport_get_fcid(port), | ||
4152 | bfa_fcs_lport_get_fcid(port), | ||
4153 | bfa_fcs_lport_get_nwwn(port)); | ||
4154 | |||
4155 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, | ||
4156 | FC_CLASS_3, len, &fchs, | ||
4157 | bfa_fcs_lport_ns_rnn_id_response, (void *)ns, | ||
4158 | FC_MAX_PDUSZ, FC_FCCT_TOV); | ||
4159 | |||
4160 | port->stats.ns_rnnid_sent++; | ||
4161 | bfa_sm_send_event(ns, NSSM_EVENT_RNNID_SENT); | ||
4162 | } | ||
4163 | |||
4164 | static void | ||
4165 | bfa_fcs_lport_ns_rnn_id_response(void *fcsarg, struct bfa_fcxp_s *fcxp, | ||
4166 | void *cbarg, bfa_status_t req_status, | ||
4167 | u32 rsp_len, u32 resid_len, | ||
4168 | struct fchs_s *rsp_fchs) | ||
4169 | |||
4170 | { | ||
4171 | struct bfa_fcs_lport_ns_s *ns = (struct bfa_fcs_lport_ns_s *) cbarg; | ||
4172 | struct bfa_fcs_lport_s *port = ns->port; | ||
4173 | struct ct_hdr_s *cthdr = NULL; | ||
4174 | |||
4175 | bfa_trc(port->fcs, port->port_cfg.pwwn); | ||
4176 | |||
4177 | /* | ||
4178 | * Sanity Checks | ||
4179 | */ | ||
4180 | if (req_status != BFA_STATUS_OK) { | ||
4181 | bfa_trc(port->fcs, req_status); | ||
4182 | port->stats.ns_rnnid_rsp_err++; | ||
4183 | bfa_sm_send_event(ns, NSSM_EVENT_RSP_ERROR); | ||
4184 | return; | ||
4185 | } | ||
4186 | |||
4187 | cthdr = (struct ct_hdr_s *) BFA_FCXP_RSP_PLD(fcxp); | ||
4188 | cthdr->cmd_rsp_code = be16_to_cpu(cthdr->cmd_rsp_code); | ||
4189 | |||
4190 | if (cthdr->cmd_rsp_code == CT_RSP_ACCEPT) { | ||
4191 | port->stats.ns_rnnid_accepts++; | ||
4192 | bfa_sm_send_event(ns, NSSM_EVENT_RSP_OK); | ||
4193 | return; | ||
4194 | } | ||
4195 | |||
4196 | port->stats.ns_rnnid_rejects++; | ||
4197 | bfa_trc(port->fcs, cthdr->reason_code); | ||
4198 | bfa_trc(port->fcs, cthdr->exp_code); | ||
4199 | bfa_sm_send_event(ns, NSSM_EVENT_RSP_ERROR); | ||
4200 | } | ||
4201 | |||
4202 | /* | ||
4203 | * Register the symbolic node name for a given node name. | ||
4204 | */ | ||
4205 | static void | ||
4206 | bfa_fcs_lport_ns_send_rsnn_nn(void *ns_cbarg, struct bfa_fcxp_s *fcxp_alloced) | ||
4207 | { | ||
4208 | struct bfa_fcs_lport_ns_s *ns = ns_cbarg; | ||
4209 | struct bfa_fcs_lport_s *port = ns->port; | ||
4210 | struct fchs_s fchs; | ||
4211 | int len; | ||
4212 | struct bfa_fcxp_s *fcxp; | ||
4213 | u8 *nsymbl; | ||
4214 | |||
4215 | bfa_trc(port->fcs, port->port_cfg.pwwn); | ||
4216 | |||
4217 | fcxp = fcxp_alloced ? fcxp_alloced : | ||
4218 | bfa_fcs_fcxp_alloc(port->fcs, BFA_TRUE); | ||
4219 | if (!fcxp) { | ||
4220 | port->stats.ns_rsnn_nn_alloc_wait++; | ||
4221 | bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &ns->fcxp_wqe, | ||
4222 | bfa_fcs_lport_ns_send_rsnn_nn, ns, BFA_TRUE); | ||
4223 | return; | ||
4224 | } | ||
4225 | ns->fcxp = fcxp; | ||
4226 | |||
4227 | nsymbl = (u8 *) &(bfa_fcs_lport_get_nsym_name( | ||
4228 | bfa_fcs_get_base_port(port->fcs))); | ||
4229 | |||
4230 | len = fc_rsnn_nn_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), | ||
4231 | bfa_fcs_lport_get_fcid(port), | ||
4232 | bfa_fcs_lport_get_nwwn(port), nsymbl); | ||
4233 | |||
4234 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, | ||
4235 | FC_CLASS_3, len, &fchs, | ||
4236 | bfa_fcs_lport_ns_rsnn_nn_response, (void *)ns, | ||
4237 | FC_MAX_PDUSZ, FC_FCCT_TOV); | ||
4238 | |||
4239 | port->stats.ns_rsnn_nn_sent++; | ||
4240 | |||
4241 | bfa_sm_send_event(ns, NSSM_EVENT_RSNN_NN_SENT); | ||
4242 | } | ||
4243 | |||
4244 | static void | ||
4245 | bfa_fcs_lport_ns_rsnn_nn_response(void *fcsarg, struct bfa_fcxp_s *fcxp, | ||
4246 | void *cbarg, bfa_status_t req_status, | ||
4247 | u32 rsp_len, u32 resid_len, | ||
4248 | struct fchs_s *rsp_fchs) | ||
4249 | { | ||
4250 | struct bfa_fcs_lport_ns_s *ns = (struct bfa_fcs_lport_ns_s *) cbarg; | ||
4251 | struct bfa_fcs_lport_s *port = ns->port; | ||
4252 | struct ct_hdr_s *cthdr = NULL; | ||
4253 | |||
4254 | bfa_trc(port->fcs, port->port_cfg.pwwn); | ||
4255 | |||
4256 | /* | ||
4257 | * Sanity Checks | ||
4258 | */ | ||
4259 | if (req_status != BFA_STATUS_OK) { | ||
4260 | bfa_trc(port->fcs, req_status); | ||
4261 | port->stats.ns_rsnn_nn_rsp_err++; | ||
4262 | bfa_sm_send_event(ns, NSSM_EVENT_RSP_ERROR); | ||
4263 | return; | ||
4264 | } | ||
4265 | |||
4266 | cthdr = (struct ct_hdr_s *) BFA_FCXP_RSP_PLD(fcxp); | ||
4267 | cthdr->cmd_rsp_code = be16_to_cpu(cthdr->cmd_rsp_code); | ||
4268 | |||
4269 | if (cthdr->cmd_rsp_code == CT_RSP_ACCEPT) { | ||
4270 | port->stats.ns_rsnn_nn_accepts++; | ||
4271 | bfa_sm_send_event(ns, NSSM_EVENT_RSP_OK); | ||
4272 | return; | ||
4273 | } | ||
4274 | |||
4275 | port->stats.ns_rsnn_nn_rejects++; | ||
4276 | bfa_trc(port->fcs, cthdr->reason_code); | ||
4277 | bfa_trc(port->fcs, cthdr->exp_code); | ||
4278 | bfa_sm_send_event(ns, NSSM_EVENT_RSP_ERROR); | ||
4279 | } | ||
4280 | |||
4281 | /* | ||
3920 | * Register the symbolic port name. | 4282 | * Register the symbolic port name. |
3921 | */ | 4283 | */ |
3922 | static void | 4284 | static void |