Commit c5bf8889 authored by Jitendra Bhivare's avatar Jitendra Bhivare Committed by Martin K. Petersen

scsi: be2iscsi: Update iface handle before any set param

Move mgmt_get_all_if_id before any set param operation.
Rename mgmt_get_all_if_id to beiscsi_if_get_handle.
Signed-off-by: default avatarJitendra Bhivare <jitendra.bhivare@broadcom.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent db02aea9
...@@ -319,17 +319,8 @@ beiscsi_iface_config_vlan(struct Scsi_Host *shost, ...@@ -319,17 +319,8 @@ beiscsi_iface_config_vlan(struct Scsi_Host *shost,
struct iscsi_iface_param_info *iface_param) struct iscsi_iface_param_info *iface_param)
{ {
struct beiscsi_hba *phba = iscsi_host_priv(shost); struct beiscsi_hba *phba = iscsi_host_priv(shost);
int ret; int ret = -EPERM;
/* Get the Interface Handle */
ret = mgmt_get_all_if_id(phba);
if (ret) {
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
"BS_%d : Getting Interface Handle Failed\n");
return ret;
}
ret = -EPERM;
switch (iface_param->param) { switch (iface_param->param) {
case ISCSI_NET_PARAM_VLAN_ENABLED: case ISCSI_NET_PARAM_VLAN_ENABLED:
ret = 0; ret = 0;
...@@ -440,7 +431,7 @@ int be2iscsi_iface_set_param(struct Scsi_Host *shost, ...@@ -440,7 +431,7 @@ int be2iscsi_iface_set_param(struct Scsi_Host *shost,
struct beiscsi_hba *phba = iscsi_host_priv(shost); struct beiscsi_hba *phba = iscsi_host_priv(shost);
struct nlattr *attrib; struct nlattr *attrib;
uint32_t rm_len = dt_len; uint32_t rm_len = dt_len;
int ret = 0 ; int ret;
if (phba->state & BE_ADAPTER_PCI_ERR) { if (phba->state & BE_ADAPTER_PCI_ERR) {
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
...@@ -448,6 +439,14 @@ int be2iscsi_iface_set_param(struct Scsi_Host *shost, ...@@ -448,6 +439,14 @@ int be2iscsi_iface_set_param(struct Scsi_Host *shost,
return -EBUSY; return -EBUSY;
} }
/* update interface_handle */
ret = beiscsi_if_get_handle(phba);
if (ret) {
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
"BS_%d : Getting Interface Handle Failed\n");
return ret;
}
nla_for_each_attr(attrib, data, dt_len, rm_len) { nla_for_each_attr(attrib, data, dt_len, rm_len) {
iface_param = nla_data(attrib); iface_param = nla_data(attrib);
...@@ -573,7 +572,7 @@ int be2iscsi_iface_get_param(struct iscsi_iface *iface, ...@@ -573,7 +572,7 @@ int be2iscsi_iface_get_param(struct iscsi_iface *iface,
struct Scsi_Host *shost = iscsi_iface_to_shost(iface); struct Scsi_Host *shost = iscsi_iface_to_shost(iface);
struct beiscsi_hba *phba = iscsi_host_priv(shost); struct beiscsi_hba *phba = iscsi_host_priv(shost);
struct be_cmd_get_def_gateway_resp gateway; struct be_cmd_get_def_gateway_resp gateway;
int len = -ENOSYS; int len = -EPERM;
if (phba->state & BE_ADAPTER_PCI_ERR) { if (phba->state & BE_ADAPTER_PCI_ERR) {
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
...@@ -605,8 +604,6 @@ int be2iscsi_iface_get_param(struct iscsi_iface *iface, ...@@ -605,8 +604,6 @@ int be2iscsi_iface_get_param(struct iscsi_iface *iface,
if (!len) if (!len)
len = sprintf(buf, "%pI4\n", &gateway.ip_addr.addr); len = sprintf(buf, "%pI4\n", &gateway.ip_addr.addr);
break; break;
default:
len = -ENOSYS;
} }
return len; return len;
...@@ -624,7 +621,7 @@ int beiscsi_ep_get_param(struct iscsi_endpoint *ep, ...@@ -624,7 +621,7 @@ int beiscsi_ep_get_param(struct iscsi_endpoint *ep,
enum iscsi_param param, char *buf) enum iscsi_param param, char *buf)
{ {
struct beiscsi_endpoint *beiscsi_ep = ep->dd_data; struct beiscsi_endpoint *beiscsi_ep = ep->dd_data;
int len = 0; int len;
beiscsi_log(beiscsi_ep->phba, KERN_INFO, beiscsi_log(beiscsi_ep->phba, KERN_INFO,
BEISCSI_LOG_CONFIG, BEISCSI_LOG_CONFIG,
...@@ -642,7 +639,7 @@ int beiscsi_ep_get_param(struct iscsi_endpoint *ep, ...@@ -642,7 +639,7 @@ int beiscsi_ep_get_param(struct iscsi_endpoint *ep,
len = sprintf(buf, "%pI6\n", &beiscsi_ep->dst6_addr); len = sprintf(buf, "%pI6\n", &beiscsi_ep->dst6_addr);
break; break;
default: default:
return -ENOSYS; len = -EPERM;
} }
return len; return len;
} }
......
...@@ -380,7 +380,7 @@ static ssize_t beiscsi_show_boot_tgt_info(void *data, int type, char *buf) ...@@ -380,7 +380,7 @@ static ssize_t beiscsi_show_boot_tgt_info(void *data, int type, char *buf)
struct mgmt_session_info *boot_sess = &phba->boot_sess; struct mgmt_session_info *boot_sess = &phba->boot_sess;
struct mgmt_conn_info *boot_conn = &boot_sess->conn_list[0]; struct mgmt_conn_info *boot_conn = &boot_sess->conn_list[0];
char *str = buf; char *str = buf;
int rc; int rc = -EPERM;
switch (type) { switch (type) {
case ISCSI_BOOT_TGT_NAME: case ISCSI_BOOT_TGT_NAME:
...@@ -434,9 +434,6 @@ static ssize_t beiscsi_show_boot_tgt_info(void *data, int type, char *buf) ...@@ -434,9 +434,6 @@ static ssize_t beiscsi_show_boot_tgt_info(void *data, int type, char *buf)
case ISCSI_BOOT_TGT_NIC_ASSOC: case ISCSI_BOOT_TGT_NIC_ASSOC:
rc = sprintf(str, "0\n"); rc = sprintf(str, "0\n");
break; break;
default:
rc = -ENOSYS;
break;
} }
return rc; return rc;
} }
...@@ -445,15 +442,12 @@ static ssize_t beiscsi_show_boot_ini_info(void *data, int type, char *buf) ...@@ -445,15 +442,12 @@ static ssize_t beiscsi_show_boot_ini_info(void *data, int type, char *buf)
{ {
struct beiscsi_hba *phba = data; struct beiscsi_hba *phba = data;
char *str = buf; char *str = buf;
int rc; int rc = -EPERM;
switch (type) { switch (type) {
case ISCSI_BOOT_INI_INITIATOR_NAME: case ISCSI_BOOT_INI_INITIATOR_NAME:
rc = sprintf(str, "%s\n", phba->boot_sess.initiator_iscsiname); rc = sprintf(str, "%s\n", phba->boot_sess.initiator_iscsiname);
break; break;
default:
rc = -ENOSYS;
break;
} }
return rc; return rc;
} }
...@@ -462,7 +456,7 @@ static ssize_t beiscsi_show_boot_eth_info(void *data, int type, char *buf) ...@@ -462,7 +456,7 @@ static ssize_t beiscsi_show_boot_eth_info(void *data, int type, char *buf)
{ {
struct beiscsi_hba *phba = data; struct beiscsi_hba *phba = data;
char *str = buf; char *str = buf;
int rc; int rc = -EPERM;
switch (type) { switch (type) {
case ISCSI_BOOT_ETH_FLAGS: case ISCSI_BOOT_ETH_FLAGS:
...@@ -474,9 +468,6 @@ static ssize_t beiscsi_show_boot_eth_info(void *data, int type, char *buf) ...@@ -474,9 +468,6 @@ static ssize_t beiscsi_show_boot_eth_info(void *data, int type, char *buf)
case ISCSI_BOOT_ETH_MAC: case ISCSI_BOOT_ETH_MAC:
rc = beiscsi_get_macaddr(str, phba); rc = beiscsi_get_macaddr(str, phba);
break; break;
default:
rc = -ENOSYS;
break;
} }
return rc; return rc;
} }
...@@ -484,7 +475,7 @@ static ssize_t beiscsi_show_boot_eth_info(void *data, int type, char *buf) ...@@ -484,7 +475,7 @@ static ssize_t beiscsi_show_boot_eth_info(void *data, int type, char *buf)
static umode_t beiscsi_tgt_get_attr_visibility(void *data, int type) static umode_t beiscsi_tgt_get_attr_visibility(void *data, int type)
{ {
umode_t rc; umode_t rc = 0;
switch (type) { switch (type) {
case ISCSI_BOOT_TGT_NAME: case ISCSI_BOOT_TGT_NAME:
...@@ -498,24 +489,18 @@ static umode_t beiscsi_tgt_get_attr_visibility(void *data, int type) ...@@ -498,24 +489,18 @@ static umode_t beiscsi_tgt_get_attr_visibility(void *data, int type)
case ISCSI_BOOT_TGT_FLAGS: case ISCSI_BOOT_TGT_FLAGS:
rc = S_IRUGO; rc = S_IRUGO;
break; break;
default:
rc = 0;
break;
} }
return rc; return rc;
} }
static umode_t beiscsi_ini_get_attr_visibility(void *data, int type) static umode_t beiscsi_ini_get_attr_visibility(void *data, int type)
{ {
umode_t rc; umode_t rc = 0;
switch (type) { switch (type) {
case ISCSI_BOOT_INI_INITIATOR_NAME: case ISCSI_BOOT_INI_INITIATOR_NAME:
rc = S_IRUGO; rc = S_IRUGO;
break; break;
default:
rc = 0;
break;
} }
return rc; return rc;
} }
...@@ -523,7 +508,7 @@ static umode_t beiscsi_ini_get_attr_visibility(void *data, int type) ...@@ -523,7 +508,7 @@ static umode_t beiscsi_ini_get_attr_visibility(void *data, int type)
static umode_t beiscsi_eth_get_attr_visibility(void *data, int type) static umode_t beiscsi_eth_get_attr_visibility(void *data, int type)
{ {
umode_t rc; umode_t rc = 0;
switch (type) { switch (type) {
case ISCSI_BOOT_ETH_FLAGS: case ISCSI_BOOT_ETH_FLAGS:
...@@ -531,9 +516,6 @@ static umode_t beiscsi_eth_get_attr_visibility(void *data, int type) ...@@ -531,9 +516,6 @@ static umode_t beiscsi_eth_get_attr_visibility(void *data, int type)
case ISCSI_BOOT_ETH_INDEX: case ISCSI_BOOT_ETH_INDEX:
rc = S_IRUGO; rc = S_IRUGO;
break; break;
default:
rc = 0;
break;
} }
return rc; return rc;
} }
......
...@@ -609,7 +609,7 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl, ...@@ -609,7 +609,7 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
bsg_req->rqst_data.h_vendor.vendor_cmd[0]); bsg_req->rqst_data.h_vendor.vendor_cmd[0]);
mutex_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return -ENOSYS; return -EPERM;
} }
wrb = alloc_mcc_wrb(phba, &tag); wrb = alloc_mcc_wrb(phba, &tag);
...@@ -892,44 +892,6 @@ int mgmt_open_connection(struct beiscsi_hba *phba, ...@@ -892,44 +892,6 @@ int mgmt_open_connection(struct beiscsi_hba *phba,
return tag; return tag;
} }
unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba)
{
struct be_ctrl_info *ctrl = &phba->ctrl;
struct be_mcc_wrb *wrb;
struct be_cmd_get_all_if_id_req *req;
struct be_cmd_get_all_if_id_req *pbe_allid;
unsigned int tag;
int status = 0;
if (mutex_lock_interruptible(&ctrl->mbox_lock))
return -EINTR;
wrb = alloc_mcc_wrb(phba, &tag);
if (!wrb) {
mutex_unlock(&ctrl->mbox_lock);
return -ENOMEM;
}
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID,
sizeof(*req));
be_mcc_notify(phba, tag);
mutex_unlock(&ctrl->mbox_lock);
status = beiscsi_mccq_compl_wait(phba, tag, &wrb, NULL);
if (status) {
beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
"BG_%d : Failed in mgmt_get_all_if_id\n");
return -EBUSY;
}
pbe_allid = embedded_payload(wrb);
phba->interface_handle = pbe_allid->if_hndl_list[0];
return status;
}
/* /*
* mgmt_exec_nonemb_cmd()- Execute Non Embedded MBX Cmd * mgmt_exec_nonemb_cmd()- Execute Non Embedded MBX Cmd
* @phba: Driver priv structure * @phba: Driver priv structure
...@@ -1007,6 +969,45 @@ static int mgmt_alloc_cmd_data(struct beiscsi_hba *phba, struct be_dma_mem *cmd, ...@@ -1007,6 +969,45 @@ static int mgmt_alloc_cmd_data(struct beiscsi_hba *phba, struct be_dma_mem *cmd,
return 0; return 0;
} }
unsigned int beiscsi_if_get_handle(struct beiscsi_hba *phba)
{
struct be_ctrl_info *ctrl = &phba->ctrl;
struct be_mcc_wrb *wrb;
struct be_cmd_get_all_if_id_req *req;
struct be_cmd_get_all_if_id_req *pbe_allid;
unsigned int tag;
int status = 0;
if (mutex_lock_interruptible(&ctrl->mbox_lock))
return -EINTR;
wrb = alloc_mcc_wrb(phba, &tag);
if (!wrb) {
mutex_unlock(&ctrl->mbox_lock);
return -ENOMEM;
}
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID,
sizeof(*req));
be_mcc_notify(phba, tag);
mutex_unlock(&ctrl->mbox_lock);
status = beiscsi_mccq_compl_wait(phba, tag, &wrb, NULL);
if (status) {
beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
"BG_%d : %s failed: %d\n", __func__, status);
return -EBUSY;
}
pbe_allid = embedded_payload(wrb);
/* we now support only one interface per function */
phba->interface_handle = pbe_allid->if_hndl_list[0];
return status;
}
static int beiscsi_if_mod_gw(struct beiscsi_hba *phba, static int beiscsi_if_mod_gw(struct beiscsi_hba *phba,
u32 action, u32 ip_type, u8 *gw) u32 action, u32 ip_type, u8 *gw)
{ {
...@@ -1306,7 +1307,7 @@ int mgmt_get_if_info(struct beiscsi_hba *phba, int ip_type, ...@@ -1306,7 +1307,7 @@ int mgmt_get_if_info(struct beiscsi_hba *phba, int ip_type,
uint32_t ioctl_size = sizeof(struct be_cmd_get_if_info_resp); uint32_t ioctl_size = sizeof(struct be_cmd_get_if_info_resp);
int rc; int rc;
rc = mgmt_get_all_if_id(phba); rc = beiscsi_if_get_handle(phba);
if (rc) if (rc)
return rc; return rc;
......
...@@ -306,7 +306,7 @@ int beiscsi_if_set_gw(struct beiscsi_hba *phba, u32 ip_type, u8 *gw); ...@@ -306,7 +306,7 @@ int beiscsi_if_set_gw(struct beiscsi_hba *phba, u32 ip_type, u8 *gw);
int be_mgmt_get_boot_shandle(struct beiscsi_hba *phba, int be_mgmt_get_boot_shandle(struct beiscsi_hba *phba,
unsigned int *s_handle); unsigned int *s_handle);
unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba); unsigned int beiscsi_if_get_handle(struct beiscsi_hba *phba);
int beiscsi_if_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag); int beiscsi_if_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment