Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+13 −16
Original line number Original line Diff line number Diff line
@@ -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,
	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,
		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,
	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,
		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,
			   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,
			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;
}
}
+6 −24
Original line number Original line Diff line number Diff line
@@ -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)
	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)
{
{
	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)
{
{
	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)
	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)


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)
	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)


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)
	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;
}
}
+41 −40
Original line number Original line Diff line number Diff line
@@ -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,
	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,
	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,
	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;


+1 −1
Original line number Original line Diff line number Diff line
@@ -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);