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

Commit 0e43895e authored by Mike Christie's avatar Mike Christie Committed by James Bottomley
Browse files

[SCSI] be2iscsi: adding functionality to change network settings using iscsiadm



This patch allows iscsiadm to set/ delete static IP and enable /disable
DHCP.

Signed-off-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarJayamohan Kallickal <jayamohan.kallickal@emulex.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent ffce3e2e
Loading
Loading
Loading
Loading
+91 −23
Original line number Diff line number Diff line
@@ -163,7 +163,8 @@ struct be_mcc_mailbox {
#define OPCODE_COMMON_ISCSI_CFG_REMOVE_SGL_PAGES        3
#define OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG		7
#define OPCODE_COMMON_ISCSI_NTWK_SET_VLAN		14
#define OPCODE_COMMON_ISCSI_NTWK_CONFIGURE_STATELESS_IP_ADDR	17
#define OPCODE_COMMON_ISCSI_NTWK_CONFIG_STATELESS_IP_ADDR	17
#define OPCODE_COMMON_ISCSI_NTWK_REL_STATELESS_IP_ADDR	18
#define OPCODE_COMMON_ISCSI_NTWK_MODIFY_IP_ADDR		21
#define OPCODE_COMMON_ISCSI_NTWK_GET_DEFAULT_GATEWAY	22
#define OPCODE_COMMON_ISCSI_NTWK_MODIFY_DEFAULT_GATEWAY 23
@@ -274,11 +275,11 @@ struct mgmt_conn_login_options {
	struct	mgmt_auth_method_format auth_data;
} __packed;

struct ip_address_format {
struct ip_addr_format {
	u16 size_of_structure;
	u8 reserved;
	u8 ip_type;
	u8 ip_address[16];
	u8 addr[16];
	u32 rsvd0;
} __packed;

@@ -290,9 +291,9 @@ struct mgmt_conn_info {
	u16	dest_port_redirected;
	u16	cid;
	u32	estimated_throughput;
	struct	ip_address_format	src_ipaddr;
	struct	ip_address_format	dest_ipaddr;
	struct	ip_address_format	dest_ipaddr_redirected;
	struct	ip_addr_format	src_ipaddr;
	struct	ip_addr_format	dest_ipaddr;
	struct	ip_addr_format	dest_ipaddr_redirected;
	struct	mgmt_conn_login_options	negotiated_login_options;
} __packed;

@@ -322,43 +323,115 @@ struct mgmt_session_info {
	struct	mgmt_conn_info	conn_list[1];
} __packed;

struct  be_cmd_req_get_session {
struct be_cmd_get_session_req {
	struct be_cmd_req_hdr hdr;
	u32 session_handle;
} __packed;

struct  be_cmd_resp_get_session {
struct be_cmd_get_session_resp {
	struct be_cmd_resp_hdr hdr;
	struct mgmt_session_info session_info;
} __packed;

struct mac_addr {
	u16 size_of_struct;
	u16 size_of_structure;
	u8 addr[ETH_ALEN];
} __packed;

struct be_cmd_req_get_boot_target {
struct be_cmd_get_boot_target_req {
	struct be_cmd_req_hdr hdr;
} __packed;

struct be_cmd_resp_get_boot_target {
struct be_cmd_get_boot_target_resp {
	struct be_cmd_resp_hdr hdr;
	u32  boot_session_count;
	int  boot_session_handle;
};

struct be_cmd_req_mac_query {
struct be_cmd_mac_query_req {
	struct be_cmd_req_hdr hdr;
	u8 type;
	u8 permanent;
	u16 if_id;
} __packed;

struct be_cmd_resp_mac_query {
struct be_cmd_get_mac_resp {
	struct be_cmd_resp_hdr hdr;
	struct mac_addr mac;
};

struct be_ip_addr_subnet_format {
	u16 size_of_structure;
	u8 ip_type;
	u8 ipv6_prefix_length;
	u8 addr[16];
	u8 subnet_mask[16];
	u32 rsvd0;
} __packed;

struct be_cmd_get_if_info_req {
	struct be_cmd_req_hdr hdr;
	u32 interface_hndl;
	u32 ip_type;
} __packed;

struct be_cmd_get_if_info_resp {
	struct be_cmd_req_hdr hdr;
	u32 interface_hndl;
	u32 vlan_priority;
	u32 ip_addr_count;
	u32 dhcp_state;
	struct be_ip_addr_subnet_format ip_addr;
} __packed;

struct be_ip_addr_record {
	u32 action;
	u32 interface_hndl;
	struct be_ip_addr_subnet_format ip_addr;
	u32 status;
} __packed;

struct be_ip_addr_record_params {
	u32 record_entry_count;
	struct be_ip_addr_record ip_record;
} __packed;

struct be_cmd_set_ip_addr_req {
	struct be_cmd_req_hdr hdr;
	struct be_ip_addr_record_params ip_params;
} __packed;


struct be_cmd_set_dhcp_req {
	struct be_cmd_req_hdr hdr;
	u32 interface_hndl;
	u32 ip_type;
	u32 flags;
	u32 retry_count;
} __packed;

struct be_cmd_rel_dhcp_req {
	struct be_cmd_req_hdr hdr;
	u32 interface_hndl;
	u32 ip_type;
} __packed;

struct be_cmd_set_def_gateway_req {
	struct be_cmd_req_hdr hdr;
	u32 action;
	struct ip_addr_format ip_addr;
} __packed;

struct be_cmd_get_def_gateway_req {
	struct be_cmd_req_hdr hdr;
	u32 ip_type;
} __packed;

struct be_cmd_get_def_gateway_resp {
	struct be_cmd_req_hdr hdr;
	struct ip_addr_format ip_addr;
} __packed;

/******************** Create CQ ***************************/
/**
 * Pseudo amap definition in which each bit of the actual structure is defined
@@ -489,7 +562,7 @@ struct be_cmd_req_modify_eq_delay {

#define ETH_ALEN	6

struct be_cmd_req_get_mac_addr {
struct be_cmd_get_nic_conf_req {
	struct be_cmd_req_hdr hdr;
	u32 nic_port_count;
	u32 speed;
@@ -501,7 +574,7 @@ struct be_cmd_req_get_mac_addr {
	u32 rsvd[23];
};

struct be_cmd_resp_get_mac_addr {
struct be_cmd_get_nic_conf_resp {
	struct be_cmd_resp_hdr hdr;
	u32 nic_port_count;
	u32 speed;
@@ -541,12 +614,7 @@ int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba,
int be_poll_mcc(struct be_ctrl_info *ctrl);
int mgmt_check_supported_fw(struct be_ctrl_info *ctrl,
				      struct beiscsi_hba *phba);
unsigned int be_cmd_get_mac_addr(struct beiscsi_hba *phba);
unsigned int be_cmd_get_initname(struct beiscsi_hba *phba);
unsigned int beiscsi_get_boot_target(struct beiscsi_hba *phba);
unsigned int beiscsi_get_session_info(struct beiscsi_hba *phba,
				  u32 boot_session_handle,
				  struct be_dma_mem *nonemb_cmd);

void free_mcc_tag(struct be_ctrl_info *ctrl, unsigned int tag);
/*ISCSI Functuions */
@@ -727,7 +795,7 @@ struct be_eq_delay_params_in {

struct tcp_connect_and_offload_in {
	struct be_cmd_req_hdr hdr;
	struct ip_address_format ip_address;
	struct ip_addr_format ip_address;
	u16 tcp_port;
	u16 cid;
	u16 cq_id;
@@ -804,7 +872,7 @@ struct be_fw_cfg {
	u32 function_caps;
} __packed;

struct be_all_if_id {
struct be_cmd_get_all_if_id_req {
	struct be_cmd_req_hdr hdr;
	u32 if_count;
	u32 if_hndl_list[1];
+318 −36
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
#include <scsi/scsi_netlink.h>
#include <net/netlink.h>
#include <scsi/scsi.h>

#include "be_iscsi.h"
@@ -207,6 +209,301 @@ int beiscsi_conn_bind(struct iscsi_cls_session *cls_session,
	return beiscsi_bindconn_cid(phba, beiscsi_conn, beiscsi_ep->ep_cid);
}

static int beiscsi_create_ipv4_iface(struct beiscsi_hba *phba)
{
	if (phba->ipv4_iface)
		return 0;

	phba->ipv4_iface = iscsi_create_iface(phba->shost,
					      &beiscsi_iscsi_transport,
					      ISCSI_IFACE_TYPE_IPV4,
					      0, 0);
	if (!phba->ipv4_iface) {
		shost_printk(KERN_ERR, phba->shost, "Could not "
			     "create default IPv4 address.\n");
		return -ENODEV;
	}

	return 0;
}

static int beiscsi_create_ipv6_iface(struct beiscsi_hba *phba)
{
	if (phba->ipv6_iface)
		return 0;

	phba->ipv6_iface = iscsi_create_iface(phba->shost,
					      &beiscsi_iscsi_transport,
					      ISCSI_IFACE_TYPE_IPV6,
					      0, 0);
	if (!phba->ipv6_iface) {
		shost_printk(KERN_ERR, phba->shost, "Could not "
			     "create default IPv6 address.\n");
		return -ENODEV;
	}

	return 0;
}

void beiscsi_create_def_ifaces(struct beiscsi_hba *phba)
{
	struct be_cmd_get_if_info_resp if_info;

	if (!mgmt_get_if_info(phba, BE2_IPV4, &if_info))
		beiscsi_create_ipv4_iface(phba);

	if (!mgmt_get_if_info(phba, BE2_IPV6, &if_info))
		beiscsi_create_ipv6_iface(phba);
}

void beiscsi_destroy_def_ifaces(struct beiscsi_hba *phba)
{
	if (phba->ipv6_iface)
		iscsi_destroy_iface(phba->ipv6_iface);
	if (phba->ipv4_iface)
		iscsi_destroy_iface(phba->ipv4_iface);
}

static int
beiscsi_set_static_ip(struct Scsi_Host *shost,
		struct iscsi_iface_param_info *iface_param,
		void *data, uint32_t dt_len)
{
	struct beiscsi_hba *phba = iscsi_host_priv(shost);
	struct iscsi_iface_param_info *iface_ip = NULL;
	struct iscsi_iface_param_info *iface_subnet = NULL;
	struct nlattr *nla;
	int ret;


	switch (iface_param->param) {
	case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
		nla = nla_find(data, dt_len, ISCSI_NET_PARAM_IPV4_ADDR);
		if (nla)
			iface_ip = nla_data(nla);

		nla = nla_find(data, dt_len, ISCSI_NET_PARAM_IPV4_SUBNET);
		if (nla)
			iface_subnet = nla_data(nla);
		break;
	case ISCSI_NET_PARAM_IPV4_ADDR:
		iface_ip = iface_param;
		nla = nla_find(data, dt_len, ISCSI_NET_PARAM_IPV4_SUBNET);
		if (nla)
			iface_subnet = nla_data(nla);
		break;
	case ISCSI_NET_PARAM_IPV4_SUBNET:
		iface_subnet = iface_param;
		nla = nla_find(data, dt_len, ISCSI_NET_PARAM_IPV4_ADDR);
		if (nla)
			iface_ip = nla_data(nla);
		break;
	default:
		shost_printk(KERN_ERR, shost, "Unsupported param %d\n",
			     iface_param->param);
	}

	if (!iface_ip || !iface_subnet) {
		shost_printk(KERN_ERR, shost, "IP and Subnet Mask required\n");
		return -EINVAL;
	}

	ret = mgmt_set_ip(phba, iface_ip, iface_subnet,
			ISCSI_BOOTPROTO_STATIC);

	return ret;
}

static int
beiscsi_set_ipv4(struct Scsi_Host *shost,
		struct iscsi_iface_param_info *iface_param,
		void *data, uint32_t dt_len)
{
	struct beiscsi_hba *phba = iscsi_host_priv(shost);
	int ret = 0;

	/* Check the param */
	switch (iface_param->param) {
	case ISCSI_NET_PARAM_IPV4_GW:
		ret = mgmt_set_gateway(phba, iface_param);
		break;
	case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
		if (iface_param->value[0] == ISCSI_BOOTPROTO_DHCP)
			ret = mgmt_set_ip(phba, iface_param,
					NULL, ISCSI_BOOTPROTO_DHCP);
		else if (iface_param->value[0] == ISCSI_BOOTPROTO_STATIC)
			ret = beiscsi_set_static_ip(shost, iface_param,
						    data, dt_len);
		else
			shost_printk(KERN_ERR, shost, "Invalid BOOTPROTO: %d\n",
					iface_param->value[0]);
		break;
	case ISCSI_NET_PARAM_IFACE_ENABLE:
		if (iface_param->value[0] == ISCSI_IFACE_ENABLE)
			ret = beiscsi_create_ipv4_iface(phba);
		else
			iscsi_destroy_iface(phba->ipv4_iface);
		break;
	case ISCSI_NET_PARAM_IPV4_SUBNET:
	case ISCSI_NET_PARAM_IPV4_ADDR:
		ret = beiscsi_set_static_ip(shost, iface_param,
					    data, dt_len);
		break;
	default:
		shost_printk(KERN_ERR, shost, "Param %d not supported\n",
			     iface_param->param);
	}

	return ret;
}

static int
beiscsi_set_ipv6(struct Scsi_Host *shost,
		struct iscsi_iface_param_info *iface_param,
		void *data, uint32_t dt_len)
{
	struct beiscsi_hba *phba = iscsi_host_priv(shost);
	int ret = 0;

	switch (iface_param->param) {
	case ISCSI_NET_PARAM_IFACE_ENABLE:
		if (iface_param->value[0] == ISCSI_IFACE_ENABLE)
			ret = beiscsi_create_ipv6_iface(phba);
		else {
			iscsi_destroy_iface(phba->ipv6_iface);
			ret = 0;
		}
		break;
	case ISCSI_NET_PARAM_IPV6_ADDR:
		ret = mgmt_set_ip(phba, iface_param, NULL,
				  ISCSI_BOOTPROTO_STATIC);
		break;
	default:
		shost_printk(KERN_ERR, shost, "Param %d not supported\n",
			     iface_param->param);
	}

	return ret;
}

int be2iscsi_iface_set_param(struct Scsi_Host *shost,
		void *data, uint32_t dt_len)
{
	struct iscsi_iface_param_info *iface_param = NULL;
	struct nlattr *attrib;
	uint32_t rm_len = dt_len;
	int ret = 0 ;

	nla_for_each_attr(attrib, data, dt_len, rm_len) {
		iface_param = nla_data(attrib);

		if (iface_param->param_type != ISCSI_NET_PARAM)
			continue;

		/*
		 * BE2ISCSI only supports 1 interface
		 */
		if (iface_param->iface_num) {
			shost_printk(KERN_ERR, shost, "Invalid iface_num %d."
				     "Only iface_num 0 is supported.\n",
				     iface_param->iface_num);
			return -EINVAL;
		}

		switch (iface_param->iface_type) {
		case ISCSI_IFACE_TYPE_IPV4:
			ret = beiscsi_set_ipv4(shost, iface_param,
					       data, dt_len);
			break;
		case ISCSI_IFACE_TYPE_IPV6:
			ret = beiscsi_set_ipv6(shost, iface_param,
					       data, dt_len);
			break;
		default:
			shost_printk(KERN_ERR, shost,
				     "Invalid iface type :%d passed\n",
				     iface_param->iface_type);
			break;
		}

		if (ret)
			return ret;
	}

	return ret;
}

static int be2iscsi_get_if_param(struct beiscsi_hba *phba,
		struct iscsi_iface *iface, int param,
		char *buf)
{
	struct be_cmd_get_if_info_resp if_info;
	int len, ip_type = BE2_IPV4;

	memset(&if_info, 0, sizeof(if_info));

	if (iface->iface_type == ISCSI_IFACE_TYPE_IPV6)
		ip_type = BE2_IPV6;

	len = mgmt_get_if_info(phba, ip_type, &if_info);
	if (len)
		return len;

	switch (param) {
	case ISCSI_NET_PARAM_IPV4_ADDR:
		len = sprintf(buf, "%pI4\n", &if_info.ip_addr.addr);
		break;
	case ISCSI_NET_PARAM_IPV6_ADDR:
		len = sprintf(buf, "%pI6\n", &if_info.ip_addr.addr);
		break;
	case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
		if (!if_info.dhcp_state)
			len = sprintf(buf, "static");
		else
			len = sprintf(buf, "dhcp");
		break;
	case ISCSI_NET_PARAM_IPV4_SUBNET:
		len = sprintf(buf, "%pI4\n", &if_info.ip_addr.subnet_mask);
		break;
	default:
		WARN_ON(1);
	}

	return len;
}

int be2iscsi_iface_get_param(struct iscsi_iface *iface,
		enum iscsi_param_type param_type,
		int param, char *buf)
{
	struct Scsi_Host *shost = iscsi_iface_to_shost(iface);
	struct beiscsi_hba *phba = iscsi_host_priv(shost);
	struct be_cmd_get_def_gateway_resp gateway;
	int len = -ENOSYS;

	switch (param) {
	case ISCSI_NET_PARAM_IPV4_ADDR:
	case ISCSI_NET_PARAM_IPV4_SUBNET:
	case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
	case ISCSI_NET_PARAM_IPV6_ADDR:
		len = be2iscsi_get_if_param(phba, iface, param, buf);
		break;
	case ISCSI_NET_PARAM_IFACE_ENABLE:
		len = sprintf(buf, "enabled");
		break;
	case ISCSI_NET_PARAM_IPV4_GW:
		memset(&gateway, 0, sizeof(gateway));
		len = mgmt_get_gateway(phba, BE2_IPV4, &gateway);
		if (!len)
			len = sprintf(buf, "%pI4\n", &gateway.ip_addr.addr);
		break;
	default:
		len = -ENOSYS;
	}

	return len;
}

/**
 * beiscsi_ep_get_param - get the iscsi parameter
 * @ep: pointer to iscsi ep
@@ -359,45 +656,20 @@ int beiscsi_get_host_param(struct Scsi_Host *shost,

int beiscsi_get_macaddr(char *buf, struct beiscsi_hba *phba)
{
	struct be_cmd_resp_get_mac_addr *resp;
	struct be_mcc_wrb *wrb;
	unsigned int tag, wrb_num;
	unsigned short status, extd_status;
	struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
	struct be_cmd_get_nic_conf_resp resp;
	int rc;

	if (phba->read_mac_address)
		return sysfs_format_mac(buf, phba->mac_address,
					ETH_ALEN);

	tag = be_cmd_get_mac_addr(phba);
	if (!tag) {
		SE_DEBUG(DBG_LVL_1, "be_cmd_get_mac_addr Failed\n");
		return -EBUSY;
	} else
		wait_event_interruptible(phba->ctrl.mcc_wait[tag],
					 phba->ctrl.mcc_numtag[tag]);
	if (strlen(phba->mac_address))
		return strlcpy(buf, phba->mac_address, PAGE_SIZE);

	wrb_num = (phba->ctrl.mcc_numtag[tag] & 0x00FF0000) >> 16;
	extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8;
	status = phba->ctrl.mcc_numtag[tag] & 0x000000FF;
	if (status || extd_status) {
		SE_DEBUG(DBG_LVL_1, "Failed to get be_cmd_get_mac_addr"
				    " status = %d extd_status = %d\n",
				    status, extd_status);
		free_mcc_tag(&phba->ctrl, tag);
		return -EAGAIN;
	}
	wrb = queue_get_wrb(mccq, wrb_num);
	free_mcc_tag(&phba->ctrl, tag);
	resp = embedded_payload(wrb);
	memcpy(phba->mac_address, resp->mac_address, ETH_ALEN);
	rc = sysfs_format_mac(buf, phba->mac_address,
			       ETH_ALEN);
	phba->read_mac_address = 1;
	memset(&resp, 0, sizeof(resp));
	rc = mgmt_get_nic_conf(phba, &resp);
	if (rc)
		return rc;
}

	memcpy(phba->mac_address, resp.mac_address, ETH_ALEN);
	return sysfs_format_mac(buf, phba->mac_address, ETH_ALEN);
}

/**
 * beiscsi_conn_get_stats - get the iscsi stats
@@ -786,11 +1058,21 @@ void beiscsi_ep_disconnect(struct iscsi_endpoint *ep)
umode_t be2iscsi_attr_is_visible(int param_type, int param)
{
	switch (param_type) {
	case ISCSI_NET_PARAM:
		switch (param) {
		case ISCSI_NET_PARAM_IFACE_ENABLE:
		case ISCSI_NET_PARAM_IPV4_ADDR:
		case ISCSI_NET_PARAM_IPV4_SUBNET:
		case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
		case ISCSI_NET_PARAM_IPV4_GW:
		case ISCSI_NET_PARAM_IPV6_ADDR:
			return S_IRUGO;
		default:
			return 0;
		}
	case ISCSI_HOST_PARAM:
		switch (param) {
		case ISCSI_HOST_PARAM_HWADDRESS:
		case ISCSI_HOST_PARAM_IPADDRESS:
		case ISCSI_HOST_PARAM_INITIATOR_NAME:
			return S_IRUGO;
		default:
			return 0;
+15 −0
Original line number Diff line number Diff line
@@ -25,6 +25,21 @@

#define BE2_IPV4  0x1
#define BE2_IPV6  0x10
#define BE2_DHCP_V4 0x05

#define NON_BLOCKING 0x0
#define BLOCKING 0x1

void beiscsi_create_def_ifaces(struct beiscsi_hba *phba);

void beiscsi_destroy_def_ifaces(struct beiscsi_hba *phba);

int be2iscsi_iface_get_param(struct iscsi_iface *iface,
			     enum iscsi_param_type param_type,
			     int param, char *buf);

int be2iscsi_iface_set_param(struct Scsi_Host *shost,
			     void *data, uint32_t count);

umode_t be2iscsi_attr_is_visible(int param_type, int param);

+17 −16
Original line number Diff line number Diff line
@@ -231,10 +231,10 @@ static ssize_t beiscsi_show_boot_tgt_info(void *data, int type, char *buf)
	case ISCSI_BOOT_TGT_IP_ADDR:
		if (boot_conn->dest_ipaddr.ip_type == 0x1)
			rc = sprintf(buf, "%pI4\n",
				(char *)&boot_conn->dest_ipaddr.ip_address);
				(char *)&boot_conn->dest_ipaddr.addr);
		else
			rc = sprintf(str, "%pI6\n",
				(char *)&boot_conn->dest_ipaddr.ip_address);
				(char *)&boot_conn->dest_ipaddr.addr);
		break;
	case ISCSI_BOOT_TGT_PORT:
		rc = sprintf(str, "%d\n", boot_conn->dest_port);
@@ -312,11 +312,7 @@ static ssize_t beiscsi_show_boot_eth_info(void *data, int type, char *buf)
		rc = sprintf(str, "0\n");
		break;
	case ISCSI_BOOT_ETH_MAC:
		rc  = beiscsi_get_macaddr(buf, phba);
		if (rc < 0) {
			SE_DEBUG(DBG_LVL_1, "beiscsi_get_macaddr Failed\n");
			return rc;
		}
		rc  = beiscsi_get_macaddr(str, phba);
		break;
	default:
		rc = -ENOSYS;
@@ -438,6 +434,7 @@ static struct beiscsi_hba *beiscsi_hba_alloc(struct pci_dev *pcidev)
	phba->shost = shost;
	phba->pcidev = pci_dev_get(pcidev);
	pci_set_drvdata(pcidev, phba);
	phba->interface_handle = 0xFFFFFFFF;

	if (iscsi_host_add(shost, &phba->pcidev->dev))
		goto free_devices;
@@ -3471,8 +3468,8 @@ static void hwi_disable_intr(struct beiscsi_hba *phba)

static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
{
	struct be_cmd_resp_get_boot_target *boot_resp;
	struct be_cmd_resp_get_session *session_resp;
	struct be_cmd_get_boot_target_resp *boot_resp;
	struct be_cmd_get_session_resp *session_resp;
	struct be_mcc_wrb *wrb;
	struct be_dma_mem nonemb_cmd;
	unsigned int tag, wrb_num;
@@ -3480,9 +3477,9 @@ static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
	struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
	int ret = -ENOMEM;

	tag = beiscsi_get_boot_target(phba);
	tag = mgmt_get_boot_target(phba);
	if (!tag) {
		SE_DEBUG(DBG_LVL_1, "be_cmd_get_mac_addr Failed\n");
		SE_DEBUG(DBG_LVL_1, "beiscsi_get_boot_info Failed\n");
		return -EAGAIN;
	} else
		wait_event_interruptible(phba->ctrl.mcc_wait[tag],
@@ -3492,7 +3489,7 @@ static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
	extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8;
	status = phba->ctrl.mcc_numtag[tag] & 0x000000FF;
	if (status || extd_status) {
		SE_DEBUG(DBG_LVL_1, "be_cmd_get_mac_addr Failed"
		SE_DEBUG(DBG_LVL_1, "beiscsi_get_boot_info Failed"
				    " status = %d extd_status = %d\n",
				    status, extd_status);
		free_mcc_tag(&phba->ctrl, tag);
@@ -3518,8 +3515,8 @@ static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
	}

	memset(nonemb_cmd.va, 0, sizeof(*session_resp));
	tag = beiscsi_get_session_info(phba,
		boot_resp->boot_session_handle, &nonemb_cmd);
	tag = mgmt_get_session_info(phba, boot_resp->boot_session_handle,
				    &nonemb_cmd);
	if (!tag) {
		SE_DEBUG(DBG_LVL_1, "beiscsi_get_session_info"
			" Failed\n");
@@ -4267,6 +4264,7 @@ static void beiscsi_remove(struct pci_dev *pcidev)
		return;
	}

	beiscsi_destroy_def_ifaces(phba);
	beiscsi_quiesce(phba);
	iscsi_boot_destroy_kset(phba->boot_kset);
	iscsi_host_remove(phba->shost);
@@ -4453,8 +4451,9 @@ static int __devinit beiscsi_dev_probe(struct pci_dev *pcidev,
		 * iscsi boot.
		 */
		shost_printk(KERN_ERR, phba->shost, "Could not set up "
			     "iSCSI boot info.");
			     "iSCSI boot info.\n");

	beiscsi_create_def_ifaces(phba);
	SE_DEBUG(DBG_LVL_8, "\n\n\n SUCCESS - DRIVER LOADED\n\n\n");
	return 0;

@@ -4505,6 +4504,8 @@ struct iscsi_transport beiscsi_iscsi_transport = {
	.bind_conn = beiscsi_conn_bind,
	.destroy_conn = iscsi_conn_teardown,
	.attr_is_visible = be2iscsi_attr_is_visible,
	.set_iface_param = be2iscsi_iface_set_param,
	.get_iface_param = be2iscsi_iface_get_param,
	.set_param = beiscsi_set_param,
	.get_conn_param = iscsi_conn_get_param,
	.get_session_param = iscsi_session_get_param,
+3 −1
Original line number Diff line number Diff line
@@ -316,6 +316,8 @@ struct beiscsi_hba {
	struct iscsi_endpoint **ep_array;
	struct iscsi_boot_kset *boot_kset;
	struct Scsi_Host *shost;
	struct iscsi_iface *ipv4_iface;
	struct iscsi_iface *ipv6_iface;
	struct {
		/**
		 * group together since they are used most frequently
@@ -345,7 +347,7 @@ struct beiscsi_hba {
	struct work_struct work_cqs;	/* The work being queued */
	struct be_ctrl_info ctrl;
	unsigned int generation;
	unsigned int read_mac_address;
	unsigned int interface_handle;
	struct mgmt_session_info boot_sess;
	struct invalidate_command_table inv_tbl[128];

Loading