From: Vikas Chaudhary <vikas.chaudhary@xxxxxxxxxx> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@xxxxxxxxxx> Reviewed-by: Lalit Chandivade <lalit.chandivade@xxxxxxxxxx> Reviewed-by: Harish Zunjarrao <harish.zunjarrao@xxxxxxxxxx> --- drivers/scsi/qla4xxx/ql4_def.h | 3 + drivers/scsi/qla4xxx/ql4_os.c | 112 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 0 deletions(-) diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h index 74faf54..aa3ba03 100644 --- a/drivers/scsi/qla4xxx/ql4_def.h +++ b/drivers/scsi/qla4xxx/ql4_def.h @@ -588,6 +588,9 @@ struct scsi_qla_host { struct completion mbx_intr_comp; struct ipaddress_config ip_config; + struct iscsi_iface *iface_ipv4; + struct iscsi_iface *iface_ipv6_1; + struct iscsi_iface *iface_ipv6_2; }; static inline int is_ipv4_enabled(struct scsi_qla_host *ha) diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index 3ea19ac..211fef7 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c @@ -82,6 +82,8 @@ static int qla4xxx_host_get_param(struct Scsi_Host *shost, enum iscsi_host_param param, char *buf); static int qla4xxx_set_net_config(struct Scsi_Host *shost, char *data, int count); +static int qla4xxx_get_iface_param(struct iscsi_iface *iface, + enum iscsi_net_param_type param, char *buf); static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session); static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc); @@ -139,16 +141,96 @@ static struct iscsi_transport qla4xxx_iscsi_transport = { .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS | ISCSI_HOST_INITIATOR_NAME, + .ipv4_iface_param_mask = ISCSI_NET_IPV4_ADDR | + ISCSI_NET_IPV4_SUBNET | + ISCSI_NET_IPV4_GW | + ISCSI_NET_IPV4_BOOTPROTO | + ISCSI_NET_IFACE_STATE, + .ipv6_iface_param_mask = ISCSI_NET_IPV6_LINKLOCAL | + ISCSI_NET_IPV6_ADDR | + ISCSI_NET_IPV6_ROUTER | + ISCSI_NET_IPV6_ADDR_AUTOCFG | + ISCSI_NET_IPV6_LINKLOCAL_AUTOCFG | + ISCSI_NET_IFACE_STATE, .tgt_dscvr = qla4xxx_tgt_dscvr, .get_conn_param = qla4xxx_conn_get_param, .get_session_param = qla4xxx_sess_get_param, .get_host_param = qla4xxx_host_get_param, .set_net_config = qla4xxx_set_net_config, .session_recovery_timedout = qla4xxx_recovery_timedout, + .get_iface_param = qla4xxx_get_iface_param, }; static struct scsi_transport_template *qla4xxx_scsi_transport; +static int qla4xxx_get_iface_param(struct iscsi_iface *iface, + enum iscsi_net_param_type param, char *buf) +{ + struct Scsi_Host *shost = iscsi_iface_to_shost(iface); + struct scsi_qla_host *ha = to_qla_host(shost); + int len = -ENOSYS; + + switch (param) { + case ISCSI_NET_PARAM_IPV4_ADDR: + len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); + break; + case ISCSI_NET_PARAM_IPV4_SUBNET: + len = sprintf(buf, "%pI4\n", &ha->ip_config.subnet_mask); + break; + case ISCSI_NET_PARAM_IPV4_GW: + len = sprintf(buf, "%pI4\n", &ha->ip_config.gateway); + break; + case ISCSI_NET_PARAM_IFACE_STATE: + if (iface->iface_type == IFACE_TYPE_IPV4) + len = sprintf(buf, "%s\n", + (ha->ip_config.ipv4_options & + IPOPT_IPv4_PROTOCOL_ENABLE) ? + "enable" : "disable"); + else if (iface->iface_type == IFACE_TYPE_IPV6) + len = sprintf(buf, "%s\n", + (ha->ip_config.ipv6_options & + IPV6_OPT_IPV6_PROTOCOL_ENABLE) ? + "enable" : "disable"); + break; + case ISCSI_NET_PARAM_IPV4_BOOTPROTO: + len = sprintf(buf, "%s\n", + (ha->ip_config.tcp_options & TCPOPT_DHCP_ENABLE) ? + "dhcp" : "static"); + break; + case ISCSI_NET_PARAM_IPV6_ADDR: + if (iface->iface_num == 1) + len = sprintf(buf, "%pI6\n", &ha->ip_config.ipv6_addr0); + if (iface->iface_num == 2) + len = sprintf(buf, "%pI6\n", &ha->ip_config.ipv6_addr1); + break; + case ISCSI_NET_PARAM_IPV6_LINKLOCAL: + len = sprintf(buf, "%pI6\n", + &ha->ip_config.ipv6_link_local_addr); + break; + case ISCSI_NET_PARAM_IPV6_ROUTER: + len = sprintf(buf, "%pI6\n", + &ha->ip_config.ipv6_default_router_addr); + break; + case ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG: + len = sprintf(buf, "%s\n", + (ha->ip_config.ipv6_addl_options & + IPV6_ADDOPT_NEIGHBOR_DISCOVERY_ADDR_ENABLE) ? + "nd" : "static"); + break; + case ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG: + len = sprintf(buf, "%s\n", + (ha->ip_config.ipv6_addl_options & + IPV6_ADDOPT_AUTOCONFIG_LINK_LOCAL_ADDR) ? + "auto" : "static"); + break; + default: + len = -ENOSYS; + } + + return len; +} + + static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc) { struct iscsi_cls_session *session; @@ -1933,6 +2015,31 @@ uint16_t qla4_8xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) return (uint16_t)le32_to_cpu(readl(&ha->qla4_8xxx_reg->rsp_q_in)); } +static void qla4xxx_create_iface(struct scsi_qla_host *ha) +{ + /* IPv4 */ + ha->iface_ipv4 = iscsi_create_iface(ha->host, + &qla4xxx_iscsi_transport, IFACE_TYPE_IPV4, 1, 0); + + /* IPv6 iface-1 */ + ha->iface_ipv6_1 = iscsi_create_iface(ha->host, + &qla4xxx_iscsi_transport, IFACE_TYPE_IPV6, 1, 0); + + /* IPv6 iface-2 */ + ha->iface_ipv6_2 = iscsi_create_iface(ha->host, + &qla4xxx_iscsi_transport, IFACE_TYPE_IPV6, 2, 0); +} + +static void qla4xxx_destroy_iface(struct scsi_qla_host *ha) +{ + if (ha->iface_ipv4) + iscsi_destroy_iface(ha->iface_ipv4); + if (ha->iface_ipv6_1) + iscsi_destroy_iface(ha->iface_ipv6_1); + if (ha->iface_ipv6_2) + iscsi_destroy_iface(ha->iface_ipv6_2); +} + /** * qla4xxx_probe_adapter - callback function to probe HBA * @pdev: pointer to pci_dev structure @@ -2133,6 +2240,8 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, ha->host_no, ha->firmware_version[0], ha->firmware_version[1], ha->patch_number, ha->build_number); scsi_scan_host(host); + + qla4xxx_create_iface(ha); return 0; probe_failed: @@ -2202,6 +2311,9 @@ static void __devexit qla4xxx_remove_adapter(struct pci_dev *pdev) /* remove devs from iscsi_sessions to scsi_devices */ qla4xxx_free_ddb_list(ha); + /* destroy iface from sysfs */ + qla4xxx_destroy_iface(ha); + scsi_remove_host(ha->host); qla4xxx_free_adapter(ha); -- 1.7.3.2 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html