|
@@ -131,6 +131,7 @@ static void bfa_lps_reqq_resume(void *lps_arg);
|
|
static void bfa_lps_free(struct bfa_lps_s *lps);
|
|
static void bfa_lps_free(struct bfa_lps_s *lps);
|
|
static void bfa_lps_send_login(struct bfa_lps_s *lps);
|
|
static void bfa_lps_send_login(struct bfa_lps_s *lps);
|
|
static void bfa_lps_send_logout(struct bfa_lps_s *lps);
|
|
static void bfa_lps_send_logout(struct bfa_lps_s *lps);
|
|
|
|
+static void bfa_lps_send_set_n2n_pid(struct bfa_lps_s *lps);
|
|
static void bfa_lps_login_comp(struct bfa_lps_s *lps);
|
|
static void bfa_lps_login_comp(struct bfa_lps_s *lps);
|
|
static void bfa_lps_logout_comp(struct bfa_lps_s *lps);
|
|
static void bfa_lps_logout_comp(struct bfa_lps_s *lps);
|
|
static void bfa_lps_cvl_event(struct bfa_lps_s *lps);
|
|
static void bfa_lps_cvl_event(struct bfa_lps_s *lps);
|
|
@@ -143,6 +144,8 @@ static void bfa_lps_sm_login(struct bfa_lps_s *lps, enum bfa_lps_event event);
|
|
static void bfa_lps_sm_loginwait(struct bfa_lps_s *lps, enum bfa_lps_event
|
|
static void bfa_lps_sm_loginwait(struct bfa_lps_s *lps, enum bfa_lps_event
|
|
event);
|
|
event);
|
|
static void bfa_lps_sm_online(struct bfa_lps_s *lps, enum bfa_lps_event event);
|
|
static void bfa_lps_sm_online(struct bfa_lps_s *lps, enum bfa_lps_event event);
|
|
|
|
+static void bfa_lps_sm_online_n2n_pid_wait(struct bfa_lps_s *lps,
|
|
|
|
+ enum bfa_lps_event event);
|
|
static void bfa_lps_sm_logout(struct bfa_lps_s *lps, enum bfa_lps_event event);
|
|
static void bfa_lps_sm_logout(struct bfa_lps_s *lps, enum bfa_lps_event event);
|
|
static void bfa_lps_sm_logowait(struct bfa_lps_s *lps, enum bfa_lps_event
|
|
static void bfa_lps_sm_logowait(struct bfa_lps_s *lps, enum bfa_lps_event
|
|
event);
|
|
event);
|
|
@@ -1254,6 +1257,12 @@ bfa_lps_sm_login(struct bfa_lps_s *lps, enum bfa_lps_event event)
|
|
else
|
|
else
|
|
bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS,
|
|
bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS,
|
|
BFA_PL_EID_LOGIN, 0, "FLOGI Accept");
|
|
BFA_PL_EID_LOGIN, 0, "FLOGI Accept");
|
|
|
|
+ /* If N2N, send the assigned PID to FW */
|
|
|
|
+ bfa_trc(lps->bfa, lps->fport);
|
|
|
|
+ bfa_trc(lps->bfa, lps->lp_pid);
|
|
|
|
+
|
|
|
|
+ if (!lps->fport && lps->lp_pid)
|
|
|
|
+ bfa_sm_send_event(lps, BFA_LPS_SM_SET_N2N_PID);
|
|
} else {
|
|
} else {
|
|
bfa_sm_set_state(lps, bfa_lps_sm_init);
|
|
bfa_sm_set_state(lps, bfa_lps_sm_init);
|
|
if (lps->fdisc)
|
|
if (lps->fdisc)
|
|
@@ -1272,6 +1281,11 @@ bfa_lps_sm_login(struct bfa_lps_s *lps, enum bfa_lps_event event)
|
|
bfa_sm_set_state(lps, bfa_lps_sm_init);
|
|
bfa_sm_set_state(lps, bfa_lps_sm_init);
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case BFA_LPS_SM_SET_N2N_PID:
|
|
|
|
+ bfa_trc(lps->bfa, lps->fport);
|
|
|
|
+ bfa_trc(lps->bfa, lps->lp_pid);
|
|
|
|
+ break;
|
|
|
|
+
|
|
default:
|
|
default:
|
|
bfa_sm_fault(lps->bfa, event);
|
|
bfa_sm_fault(lps->bfa, event);
|
|
}
|
|
}
|
|
@@ -1340,6 +1354,14 @@ bfa_lps_sm_online(struct bfa_lps_s *lps, enum bfa_lps_event event)
|
|
BFA_PL_EID_FIP_FCF_CVL, 0, "FCF Clear Virt. Link Rx");
|
|
BFA_PL_EID_FIP_FCF_CVL, 0, "FCF Clear Virt. Link Rx");
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case BFA_LPS_SM_SET_N2N_PID:
|
|
|
|
+ if (bfa_reqq_full(lps->bfa, lps->reqq)) {
|
|
|
|
+ bfa_sm_set_state(lps, bfa_lps_sm_online_n2n_pid_wait);
|
|
|
|
+ bfa_reqq_wait(lps->bfa, lps->reqq, &lps->wqe);
|
|
|
|
+ } else
|
|
|
|
+ bfa_lps_send_set_n2n_pid(lps);
|
|
|
|
+ break;
|
|
|
|
+
|
|
case BFA_LPS_SM_OFFLINE:
|
|
case BFA_LPS_SM_OFFLINE:
|
|
case BFA_LPS_SM_DELETE:
|
|
case BFA_LPS_SM_DELETE:
|
|
bfa_sm_set_state(lps, bfa_lps_sm_init);
|
|
bfa_sm_set_state(lps, bfa_lps_sm_init);
|
|
@@ -1350,6 +1372,48 @@ bfa_lps_sm_online(struct bfa_lps_s *lps, enum bfa_lps_event event)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * login complete
|
|
|
|
+ */
|
|
|
|
+static void
|
|
|
|
+bfa_lps_sm_online_n2n_pid_wait(struct bfa_lps_s *lps, enum bfa_lps_event event)
|
|
|
|
+{
|
|
|
|
+ bfa_trc(lps->bfa, lps->lp_tag);
|
|
|
|
+ bfa_trc(lps->bfa, event);
|
|
|
|
+
|
|
|
|
+ switch (event) {
|
|
|
|
+ case BFA_LPS_SM_RESUME:
|
|
|
|
+ bfa_sm_set_state(lps, bfa_lps_sm_online);
|
|
|
|
+ bfa_lps_send_set_n2n_pid(lps);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case BFA_LPS_SM_LOGOUT:
|
|
|
|
+ bfa_sm_set_state(lps, bfa_lps_sm_logowait);
|
|
|
|
+ bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS,
|
|
|
|
+ BFA_PL_EID_LOGO, 0, "Logout");
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case BFA_LPS_SM_RX_CVL:
|
|
|
|
+ bfa_sm_set_state(lps, bfa_lps_sm_init);
|
|
|
|
+ bfa_reqq_wcancel(&lps->wqe);
|
|
|
|
+
|
|
|
|
+ /* Let the vport module know about this event */
|
|
|
|
+ bfa_lps_cvl_event(lps);
|
|
|
|
+ bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS,
|
|
|
|
+ BFA_PL_EID_FIP_FCF_CVL, 0, "FCF Clear Virt. Link Rx");
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case BFA_LPS_SM_OFFLINE:
|
|
|
|
+ case BFA_LPS_SM_DELETE:
|
|
|
|
+ bfa_sm_set_state(lps, bfa_lps_sm_init);
|
|
|
|
+ bfa_reqq_wcancel(&lps->wqe);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ bfa_sm_fault(lps->bfa, event);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* logout in progress - awaiting firmware response
|
|
* logout in progress - awaiting firmware response
|
|
*/
|
|
*/
|
|
@@ -1498,8 +1562,9 @@ bfa_lps_login_rsp(struct bfa_s *bfa, struct bfi_lps_login_rsp_s *rsp)
|
|
switch (rsp->status) {
|
|
switch (rsp->status) {
|
|
case BFA_STATUS_OK:
|
|
case BFA_STATUS_OK:
|
|
lps->fport = rsp->f_port;
|
|
lps->fport = rsp->f_port;
|
|
|
|
+ if (lps->fport)
|
|
|
|
+ lps->lp_pid = rsp->lp_pid;
|
|
lps->npiv_en = rsp->npiv_en;
|
|
lps->npiv_en = rsp->npiv_en;
|
|
- lps->lp_pid = rsp->lp_pid;
|
|
|
|
lps->pr_bbcred = be16_to_cpu(rsp->bb_credit);
|
|
lps->pr_bbcred = be16_to_cpu(rsp->bb_credit);
|
|
lps->pr_pwwn = rsp->port_name;
|
|
lps->pr_pwwn = rsp->port_name;
|
|
lps->pr_nwwn = rsp->node_name;
|
|
lps->pr_nwwn = rsp->node_name;
|
|
@@ -1626,6 +1691,25 @@ bfa_lps_send_logout(struct bfa_lps_s *lps)
|
|
bfa_reqq_produce(lps->bfa, lps->reqq);
|
|
bfa_reqq_produce(lps->bfa, lps->reqq);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * send n2n pid set request to firmware
|
|
|
|
+ */
|
|
|
|
+static void
|
|
|
|
+bfa_lps_send_set_n2n_pid(struct bfa_lps_s *lps)
|
|
|
|
+{
|
|
|
|
+ struct bfi_lps_n2n_pid_req_s *m;
|
|
|
|
+
|
|
|
|
+ m = bfa_reqq_next(lps->bfa, lps->reqq);
|
|
|
|
+ bfa_assert(m);
|
|
|
|
+
|
|
|
|
+ bfi_h2i_set(m->mh, BFI_MC_LPS, BFI_LPS_H2I_N2N_PID_REQ,
|
|
|
|
+ bfa_lpuid(lps->bfa));
|
|
|
|
+
|
|
|
|
+ m->lp_tag = lps->lp_tag;
|
|
|
|
+ m->lp_pid = lps->lp_pid;
|
|
|
|
+ bfa_reqq_produce(lps->bfa, lps->reqq);
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Indirect login completion handler for non-fcs
|
|
* Indirect login completion handler for non-fcs
|
|
*/
|
|
*/
|
|
@@ -1846,6 +1930,19 @@ bfa_lps_get_base_pid(struct bfa_s *bfa)
|
|
return BFA_LPS_FROM_TAG(mod, 0)->lp_pid;
|
|
return BFA_LPS_FROM_TAG(mod, 0)->lp_pid;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Set PID in case of n2n (which is assigned during PLOGI)
|
|
|
|
+ */
|
|
|
|
+void
|
|
|
|
+bfa_lps_set_n2n_pid(struct bfa_lps_s *lps, uint32_t n2n_pid)
|
|
|
|
+{
|
|
|
|
+ bfa_trc(lps->bfa, lps->lp_tag);
|
|
|
|
+ bfa_trc(lps->bfa, n2n_pid);
|
|
|
|
+
|
|
|
|
+ lps->lp_pid = n2n_pid;
|
|
|
|
+ bfa_sm_send_event(lps, BFA_LPS_SM_SET_N2N_PID);
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* LPS firmware message class handler.
|
|
* LPS firmware message class handler.
|
|
*/
|
|
*/
|