be2iscsi : Logout of FW Boot Session
Once be2iscsi driver is loaded and operational close Boot session established by FW. Signed-off-by: John Soni Jose <sony.john-n@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> Reviewed-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <JBottomley@Odin.com>
This commit is contained in:
parent
eb1c46924d
commit
3f4134c12a
4 changed files with 87 additions and 0 deletions
|
@ -304,6 +304,17 @@ struct mgmt_auth_method_format {
|
||||||
struct mgmt_chap_format chap;
|
struct mgmt_chap_format chap;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
struct be_cmd_req_logout_fw_sess {
|
||||||
|
struct be_cmd_req_hdr hdr; /* dw[4] */
|
||||||
|
uint32_t session_handle;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct be_cmd_resp_logout_fw_sess {
|
||||||
|
struct be_cmd_resp_hdr hdr; /* dw[4] */
|
||||||
|
#define BEISCSI_MGMT_SESSION_CLOSE 0x20
|
||||||
|
uint32_t session_status;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
struct mgmt_conn_login_options {
|
struct mgmt_conn_login_options {
|
||||||
u8 flags;
|
u8 flags;
|
||||||
u8 header_digest;
|
u8 header_digest;
|
||||||
|
@ -1136,6 +1147,7 @@ struct be_cmd_get_all_if_id_req {
|
||||||
#define OPCODE_ISCSI_INI_CFG_GET_HBA_NAME 6
|
#define OPCODE_ISCSI_INI_CFG_GET_HBA_NAME 6
|
||||||
#define OPCODE_ISCSI_INI_CFG_SET_HBA_NAME 7
|
#define OPCODE_ISCSI_INI_CFG_SET_HBA_NAME 7
|
||||||
#define OPCODE_ISCSI_INI_SESSION_GET_A_SESSION 14
|
#define OPCODE_ISCSI_INI_SESSION_GET_A_SESSION 14
|
||||||
|
#define OPCODE_ISCSI_INI_SESSION_LOGOUT_TARGET 24
|
||||||
#define OPCODE_ISCSI_INI_DRIVER_REOPEN_ALL_SESSIONS 36
|
#define OPCODE_ISCSI_INI_DRIVER_REOPEN_ALL_SESSIONS 36
|
||||||
#define OPCODE_ISCSI_INI_DRIVER_OFFLOAD_SESSION 41
|
#define OPCODE_ISCSI_INI_DRIVER_OFFLOAD_SESSION 41
|
||||||
#define OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION 42
|
#define OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION 42
|
||||||
|
|
|
@ -4400,6 +4400,9 @@ static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
|
||||||
|
|
||||||
memcpy(&phba->boot_sess, &session_resp->session_info,
|
memcpy(&phba->boot_sess, &session_resp->session_info,
|
||||||
sizeof(struct mgmt_session_info));
|
sizeof(struct mgmt_session_info));
|
||||||
|
|
||||||
|
beiscsi_logout_fw_sess(phba,
|
||||||
|
phba->boot_sess.session_handle);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
boot_freemem:
|
boot_freemem:
|
||||||
|
|
|
@ -1707,3 +1707,72 @@ void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params,
|
||||||
(params->dw[offsetof(struct amap_beiscsi_offload_params,
|
(params->dw[offsetof(struct amap_beiscsi_offload_params,
|
||||||
exp_statsn) / 32] + 1));
|
exp_statsn) / 32] + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* beiscsi_logout_fw_sess()- Firmware Session Logout
|
||||||
|
* @phba: Device priv structure instance
|
||||||
|
* @fw_sess_handle: FW session handle
|
||||||
|
*
|
||||||
|
* Logout from the FW established sessions.
|
||||||
|
* returns
|
||||||
|
* Success: 0
|
||||||
|
* Failure: Non-Zero Value
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int beiscsi_logout_fw_sess(struct beiscsi_hba *phba,
|
||||||
|
uint32_t fw_sess_handle)
|
||||||
|
{
|
||||||
|
struct be_ctrl_info *ctrl = &phba->ctrl;
|
||||||
|
struct be_mcc_wrb *wrb;
|
||||||
|
struct be_cmd_req_logout_fw_sess *req;
|
||||||
|
struct be_cmd_resp_logout_fw_sess *resp;
|
||||||
|
unsigned int tag;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
beiscsi_log(phba, KERN_INFO,
|
||||||
|
BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
|
||||||
|
"BG_%d : In bescsi_logout_fwboot_sess\n");
|
||||||
|
|
||||||
|
spin_lock(&ctrl->mbox_lock);
|
||||||
|
tag = alloc_mcc_tag(phba);
|
||||||
|
if (!tag) {
|
||||||
|
spin_unlock(&ctrl->mbox_lock);
|
||||||
|
beiscsi_log(phba, KERN_INFO,
|
||||||
|
BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
|
||||||
|
"BG_%d : MBX Tag Failure\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wrb = wrb_from_mccq(phba);
|
||||||
|
req = embedded_payload(wrb);
|
||||||
|
wrb->tag0 |= tag;
|
||||||
|
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
||||||
|
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
|
||||||
|
OPCODE_ISCSI_INI_SESSION_LOGOUT_TARGET,
|
||||||
|
sizeof(struct be_cmd_req_logout_fw_sess));
|
||||||
|
|
||||||
|
/* Set the session handle */
|
||||||
|
req->session_handle = fw_sess_handle;
|
||||||
|
be_mcc_notify(phba);
|
||||||
|
spin_unlock(&ctrl->mbox_lock);
|
||||||
|
|
||||||
|
rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
|
||||||
|
if (rc) {
|
||||||
|
beiscsi_log(phba, KERN_ERR,
|
||||||
|
BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
|
||||||
|
"BG_%d : MBX CMD FW_SESSION_LOGOUT_TARGET Failed\n");
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = embedded_payload(wrb);
|
||||||
|
if (resp->session_status !=
|
||||||
|
BEISCSI_MGMT_SESSION_CLOSE) {
|
||||||
|
beiscsi_log(phba, KERN_ERR,
|
||||||
|
BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
|
||||||
|
"BG_%d : FW_SESSION_LOGOUT_TARGET resp : 0x%x\n",
|
||||||
|
resp->session_status);
|
||||||
|
rc = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
|
@ -338,4 +338,7 @@ void beiscsi_ue_detect(struct beiscsi_hba *phba);
|
||||||
int be_cmd_modify_eq_delay(struct beiscsi_hba *phba,
|
int be_cmd_modify_eq_delay(struct beiscsi_hba *phba,
|
||||||
struct be_set_eqd *, int num);
|
struct be_set_eqd *, int num);
|
||||||
|
|
||||||
|
int beiscsi_logout_fw_sess(struct beiscsi_hba *phba,
|
||||||
|
uint32_t fw_sess_handle);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue