aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/qla2xxx/qla_attr.c5
-rw-r--r--drivers/scsi/qla2xxx/qla_dbg.c4
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h154
-rw-r--r--drivers/scsi/qla2xxx/qla_gbl.h4
-rw-r--r--drivers/scsi/qla2xxx/qla_gs.c943
-rw-r--r--drivers/scsi/qla2xxx/qla_mr.c4
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c13
7 files changed, 967 insertions, 160 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 16fe5196e6d9..868f4e5bd863 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1014,7 +1014,7 @@ qla2x00_fw_version_show(struct device *dev,
1014 char fw_str[128]; 1014 char fw_str[128];
1015 1015
1016 return scnprintf(buf, PAGE_SIZE, "%s\n", 1016 return scnprintf(buf, PAGE_SIZE, "%s\n",
1017 ha->isp_ops->fw_version_str(vha, fw_str)); 1017 ha->isp_ops->fw_version_str(vha, fw_str, sizeof(fw_str)));
1018} 1018}
1019 1019
1020static ssize_t 1020static ssize_t
@@ -1924,7 +1924,8 @@ qla2x00_get_host_symbolic_name(struct Scsi_Host *shost)
1924{ 1924{
1925 scsi_qla_host_t *vha = shost_priv(shost); 1925 scsi_qla_host_t *vha = shost_priv(shost);
1926 1926
1927 qla2x00_get_sym_node_name(vha, fc_host_symbolic_name(shost)); 1927 qla2x00_get_sym_node_name(vha, fc_host_symbolic_name(shost),
1928 sizeof(fc_host_symbolic_name(shost)));
1928} 1929}
1929 1930
1930static void 1931static void
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index d60c1c6af6c7..28442d082ba1 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -20,9 +20,9 @@
20 * | | | 0x1115-0x1116 | 20 * | | | 0x1115-0x1116 |
21 * | | | 0x111a-0x111b | 21 * | | | 0x111a-0x111b |
22 * | | | 0x1155-0x1158 | 22 * | | | 0x1155-0x1158 |
23 * | Device Discovery | 0x2095 | 0x2020-0x2022, | 23 * | Device Discovery | 0x2016 | 0x2020-0x2022, |
24 * | | | 0x2011-0x2012, | 24 * | | | 0x2011-0x2012, |
25 * | | | 0x2016 | 25 * | | | 0x2099-0x20a4 |
26 * | Queue Command and IO tracing | 0x3059 | 0x3006-0x300b | 26 * | Queue Command and IO tracing | 0x3059 | 0x3006-0x300b |
27 * | | | 0x3027-0x3028 | 27 * | | | 0x3027-0x3028 |
28 * | | | 0x303d-0x3041 | 28 * | | | 0x303d-0x3041 |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index de5a9c471cf9..e5baead2369a 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2056,10 +2056,21 @@ static const char * const port_state_str[] = {
2056 2056
2057#define CT_REJECT_RESPONSE 0x8001 2057#define CT_REJECT_RESPONSE 0x8001
2058#define CT_ACCEPT_RESPONSE 0x8002 2058#define CT_ACCEPT_RESPONSE 0x8002
2059#define CT_REASON_INVALID_COMMAND_CODE 0x01 2059#define CT_REASON_INVALID_COMMAND_CODE 0x01
2060#define CT_REASON_CANNOT_PERFORM 0x09 2060#define CT_REASON_CANNOT_PERFORM 0x09
2061#define CT_REASON_COMMAND_UNSUPPORTED 0x0b 2061#define CT_REASON_COMMAND_UNSUPPORTED 0x0b
2062#define CT_EXPL_ALREADY_REGISTERED 0x10 2062#define CT_EXPL_ALREADY_REGISTERED 0x10
2063#define CT_EXPL_HBA_ATTR_NOT_REGISTERED 0x11
2064#define CT_EXPL_MULTIPLE_HBA_ATTR 0x12
2065#define CT_EXPL_INVALID_HBA_BLOCK_LENGTH 0x13
2066#define CT_EXPL_MISSING_REQ_HBA_ATTR 0x14
2067#define CT_EXPL_PORT_NOT_REGISTERED_ 0x15
2068#define CT_EXPL_MISSING_HBA_ID_PORT_LIST 0x16
2069#define CT_EXPL_HBA_NOT_REGISTERED 0x17
2070#define CT_EXPL_PORT_ATTR_NOT_REGISTERED 0x20
2071#define CT_EXPL_PORT_NOT_REGISTERED 0x21
2072#define CT_EXPL_MULTIPLE_PORT_ATTR 0x22
2073#define CT_EXPL_INVALID_PORT_BLOCK_LENGTH 0x23
2063 2074
2064#define NS_N_PORT_TYPE 0x01 2075#define NS_N_PORT_TYPE 0x01
2065#define NS_NL_PORT_TYPE 0x02 2076#define NS_NL_PORT_TYPE 0x02
@@ -2116,33 +2127,40 @@ static const char * const port_state_str[] = {
2116 * HBA attribute types. 2127 * HBA attribute types.
2117 */ 2128 */
2118#define FDMI_HBA_ATTR_COUNT 9 2129#define FDMI_HBA_ATTR_COUNT 9
2119#define FDMI_HBA_NODE_NAME 1 2130#define FDMIV2_HBA_ATTR_COUNT 17
2120#define FDMI_HBA_MANUFACTURER 2 2131#define FDMI_HBA_NODE_NAME 0x1
2121#define FDMI_HBA_SERIAL_NUMBER 3 2132#define FDMI_HBA_MANUFACTURER 0x2
2122#define FDMI_HBA_MODEL 4 2133#define FDMI_HBA_SERIAL_NUMBER 0x3
2123#define FDMI_HBA_MODEL_DESCRIPTION 5 2134#define FDMI_HBA_MODEL 0x4
2124#define FDMI_HBA_HARDWARE_VERSION 6 2135#define FDMI_HBA_MODEL_DESCRIPTION 0x5
2125#define FDMI_HBA_DRIVER_VERSION 7 2136#define FDMI_HBA_HARDWARE_VERSION 0x6
2126#define FDMI_HBA_OPTION_ROM_VERSION 8 2137#define FDMI_HBA_DRIVER_VERSION 0x7
2127#define FDMI_HBA_FIRMWARE_VERSION 9 2138#define FDMI_HBA_OPTION_ROM_VERSION 0x8
2139#define FDMI_HBA_FIRMWARE_VERSION 0x9
2128#define FDMI_HBA_OS_NAME_AND_VERSION 0xa 2140#define FDMI_HBA_OS_NAME_AND_VERSION 0xa
2129#define FDMI_HBA_MAXIMUM_CT_PAYLOAD_LENGTH 0xb 2141#define FDMI_HBA_MAXIMUM_CT_PAYLOAD_LENGTH 0xb
2142#define FDMI_HBA_NODE_SYMBOLIC_NAME 0xc
2143#define FDMI_HBA_VENDOR_ID 0xd
2144#define FDMI_HBA_NUM_PORTS 0xe
2145#define FDMI_HBA_FABRIC_NAME 0xf
2146#define FDMI_HBA_BOOT_BIOS_NAME 0x10
2147#define FDMI_HBA_TYPE_VENDOR_IDENTIFIER 0xe0
2130 2148
2131struct ct_fdmi_hba_attr { 2149struct ct_fdmi_hba_attr {
2132 uint16_t type; 2150 uint16_t type;
2133 uint16_t len; 2151 uint16_t len;
2134 union { 2152 union {
2135 uint8_t node_name[WWN_SIZE]; 2153 uint8_t node_name[WWN_SIZE];
2136 uint8_t manufacturer[32]; 2154 uint8_t manufacturer[64];
2137 uint8_t serial_num[8]; 2155 uint8_t serial_num[32];
2138 uint8_t model[16]; 2156 uint8_t model[16];
2139 uint8_t model_desc[80]; 2157 uint8_t model_desc[80];
2140 uint8_t hw_version[16]; 2158 uint8_t hw_version[32];
2141 uint8_t driver_version[32]; 2159 uint8_t driver_version[32];
2142 uint8_t orom_version[16]; 2160 uint8_t orom_version[16];
2143 uint8_t fw_version[16]; 2161 uint8_t fw_version[32];
2144 uint8_t os_version[128]; 2162 uint8_t os_version[128];
2145 uint8_t max_ct_len[4]; 2163 uint32_t max_ct_len;
2146 } a; 2164 } a;
2147}; 2165};
2148 2166
@@ -2151,16 +2169,56 @@ struct ct_fdmi_hba_attributes {
2151 struct ct_fdmi_hba_attr entry[FDMI_HBA_ATTR_COUNT]; 2169 struct ct_fdmi_hba_attr entry[FDMI_HBA_ATTR_COUNT];
2152}; 2170};
2153 2171
2172struct ct_fdmiv2_hba_attr {
2173 uint16_t type;
2174 uint16_t len;
2175 union {
2176 uint8_t node_name[WWN_SIZE];
2177 uint8_t manufacturer[32];
2178 uint8_t serial_num[32];
2179 uint8_t model[16];
2180 uint8_t model_desc[80];
2181 uint8_t hw_version[16];
2182 uint8_t driver_version[32];
2183 uint8_t orom_version[16];
2184 uint8_t fw_version[32];
2185 uint8_t os_version[128];
2186 uint32_t max_ct_len;
2187 uint8_t sym_name[256];
2188 uint32_t vendor_id;
2189 uint32_t num_ports;
2190 uint8_t fabric_name[WWN_SIZE];
2191 uint8_t bios_name[32];
2192 uint8_t vendor_indentifer[8];
2193 } a;
2194};
2195
2196struct ct_fdmiv2_hba_attributes {
2197 uint32_t count;
2198 struct ct_fdmiv2_hba_attr entry[FDMIV2_HBA_ATTR_COUNT];
2199};
2200
2154/* 2201/*
2155 * Port attribute types. 2202 * Port attribute types.
2156 */ 2203 */
2157#define FDMI_PORT_ATTR_COUNT 6 2204#define FDMI_PORT_ATTR_COUNT 6
2158#define FDMI_PORT_FC4_TYPES 1 2205#define FDMIV2_PORT_ATTR_COUNT 16
2159#define FDMI_PORT_SUPPORT_SPEED 2 2206#define FDMI_PORT_FC4_TYPES 0x1
2160#define FDMI_PORT_CURRENT_SPEED 3 2207#define FDMI_PORT_SUPPORT_SPEED 0x2
2161#define FDMI_PORT_MAX_FRAME_SIZE 4 2208#define FDMI_PORT_CURRENT_SPEED 0x3
2162#define FDMI_PORT_OS_DEVICE_NAME 5 2209#define FDMI_PORT_MAX_FRAME_SIZE 0x4
2163#define FDMI_PORT_HOST_NAME 6 2210#define FDMI_PORT_OS_DEVICE_NAME 0x5
2211#define FDMI_PORT_HOST_NAME 0x6
2212#define FDMI_PORT_NODE_NAME 0x7
2213#define FDMI_PORT_NAME 0x8
2214#define FDMI_PORT_SYM_NAME 0x9
2215#define FDMI_PORT_TYPE 0xa
2216#define FDMI_PORT_SUPP_COS 0xb
2217#define FDMI_PORT_FABRIC_NAME 0xc
2218#define FDMI_PORT_FC4_TYPE 0xd
2219#define FDMI_PORT_STATE 0x101
2220#define FDMI_PORT_COUNT 0x102
2221#define FDMI_PORT_ID 0x103
2164 2222
2165#define FDMI_PORT_SPEED_1GB 0x1 2223#define FDMI_PORT_SPEED_1GB 0x1
2166#define FDMI_PORT_SPEED_2GB 0x2 2224#define FDMI_PORT_SPEED_2GB 0x2
@@ -2171,7 +2229,11 @@ struct ct_fdmi_hba_attributes {
2171#define FDMI_PORT_SPEED_32GB 0x40 2229#define FDMI_PORT_SPEED_32GB 0x40
2172#define FDMI_PORT_SPEED_UNKNOWN 0x8000 2230#define FDMI_PORT_SPEED_UNKNOWN 0x8000
2173 2231
2174struct ct_fdmi_port_attr { 2232#define FC_CLASS_2 0x04
2233#define FC_CLASS_3 0x08
2234#define FC_CLASS_2_3 0x0C
2235
2236struct ct_fdmiv2_port_attr {
2175 uint16_t type; 2237 uint16_t type;
2176 uint16_t len; 2238 uint16_t len;
2177 union { 2239 union {
@@ -2181,12 +2243,40 @@ struct ct_fdmi_port_attr {
2181 uint32_t max_frame_size; 2243 uint32_t max_frame_size;
2182 uint8_t os_dev_name[32]; 2244 uint8_t os_dev_name[32];
2183 uint8_t host_name[32]; 2245 uint8_t host_name[32];
2246 uint8_t node_name[WWN_SIZE];
2247 uint8_t port_name[WWN_SIZE];
2248 uint8_t port_sym_name[128];
2249 uint32_t port_type;
2250 uint32_t port_supported_cos;
2251 uint8_t fabric_name[WWN_SIZE];
2252 uint8_t port_fc4_type[32];
2253 uint32_t port_state;
2254 uint32_t num_ports;
2255 uint32_t port_id;
2184 } a; 2256 } a;
2185}; 2257};
2186 2258
2187/* 2259/*
2188 * Port Attribute Block. 2260 * Port Attribute Block.
2189 */ 2261 */
2262struct ct_fdmiv2_port_attributes {
2263 uint32_t count;
2264 struct ct_fdmiv2_port_attr entry[FDMIV2_PORT_ATTR_COUNT];
2265};
2266
2267struct ct_fdmi_port_attr {
2268 uint16_t type;
2269 uint16_t len;
2270 union {
2271 uint8_t fc4_types[32];
2272 uint32_t sup_speed;
2273 uint32_t cur_speed;
2274 uint32_t max_frame_size;
2275 uint8_t os_dev_name[32];
2276 uint8_t host_name[32];
2277 } a;
2278};
2279
2190struct ct_fdmi_port_attributes { 2280struct ct_fdmi_port_attributes {
2191 uint32_t count; 2281 uint32_t count;
2192 struct ct_fdmi_port_attr entry[FDMI_PORT_ATTR_COUNT]; 2282 struct ct_fdmi_port_attr entry[FDMI_PORT_ATTR_COUNT];
@@ -2286,6 +2376,13 @@ struct ct_sns_req {
2286 2376
2287 struct { 2377 struct {
2288 uint8_t hba_identifier[8]; 2378 uint8_t hba_identifier[8];
2379 uint32_t entry_count;
2380 uint8_t port_name[8];
2381 struct ct_fdmiv2_hba_attributes attrs;
2382 } rhba2;
2383
2384 struct {
2385 uint8_t hba_identifier[8];
2289 struct ct_fdmi_hba_attributes attrs; 2386 struct ct_fdmi_hba_attributes attrs;
2290 } rhat; 2387 } rhat;
2291 2388
@@ -2296,6 +2393,11 @@ struct ct_sns_req {
2296 2393
2297 struct { 2394 struct {
2298 uint8_t port_name[8]; 2395 uint8_t port_name[8];
2396 struct ct_fdmiv2_port_attributes attrs;
2397 } rpa2;
2398
2399 struct {
2400 uint8_t port_name[8];
2299 } dhba; 2401 } dhba;
2300 2402
2301 struct { 2403 struct {
@@ -2522,7 +2624,7 @@ struct isp_operations {
2522 int (*load_risc) (struct scsi_qla_host *, uint32_t *); 2624 int (*load_risc) (struct scsi_qla_host *, uint32_t *);
2523 2625
2524 char * (*pci_info_str) (struct scsi_qla_host *, char *); 2626 char * (*pci_info_str) (struct scsi_qla_host *, char *);
2525 char * (*fw_version_str) (struct scsi_qla_host *, char *); 2627 char * (*fw_version_str)(struct scsi_qla_host *, char *, size_t);
2526 2628
2527 irq_handler_t intr_handler; 2629 irq_handler_t intr_handler;
2528 void (*enable_intrs) (struct qla_hw_data *); 2630 void (*enable_intrs) (struct qla_hw_data *);
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 43ef0db9654e..0f851deec0e8 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -562,7 +562,7 @@ extern void *qla24xx_prep_ms_fdmi_iocb(scsi_qla_host_t *, uint32_t, uint32_t);
562extern int qla2x00_fdmi_register(scsi_qla_host_t *); 562extern int qla2x00_fdmi_register(scsi_qla_host_t *);
563extern int qla2x00_gfpn_id(scsi_qla_host_t *, sw_info_t *); 563extern int qla2x00_gfpn_id(scsi_qla_host_t *, sw_info_t *);
564extern int qla2x00_gpsc(scsi_qla_host_t *, sw_info_t *); 564extern int qla2x00_gpsc(scsi_qla_host_t *, sw_info_t *);
565extern void qla2x00_get_sym_node_name(scsi_qla_host_t *, uint8_t *); 565extern void qla2x00_get_sym_node_name(scsi_qla_host_t *, uint8_t *, size_t);
566 566
567/* 567/*
568 * Global Function Prototypes in qla_attr.c source file. 568 * Global Function Prototypes in qla_attr.c source file.
@@ -614,7 +614,7 @@ extern void qlafx00_soft_reset(scsi_qla_host_t *);
614extern int qlafx00_chip_diag(scsi_qla_host_t *); 614extern int qlafx00_chip_diag(scsi_qla_host_t *);
615extern void qlafx00_config_rings(struct scsi_qla_host *); 615extern void qlafx00_config_rings(struct scsi_qla_host *);
616extern char *qlafx00_pci_info_str(struct scsi_qla_host *, char *); 616extern char *qlafx00_pci_info_str(struct scsi_qla_host *, char *);
617extern char *qlafx00_fw_version_str(struct scsi_qla_host *, char *); 617extern char *qlafx00_fw_version_str(struct scsi_qla_host *, char *, size_t);
618extern irqreturn_t qlafx00_intr_handler(int, void *); 618extern irqreturn_t qlafx00_intr_handler(int, void *);
619extern void qlafx00_enable_intrs(struct qla_hw_data *); 619extern void qlafx00_enable_intrs(struct qla_hw_data *);
620extern void qlafx00_disable_intrs(struct qla_hw_data *); 620extern void qlafx00_disable_intrs(struct qla_hw_data *);
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index a0df3b1b3823..dccc4dcc39c8 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -6,6 +6,7 @@
6 */ 6 */
7#include "qla_def.h" 7#include "qla_def.h"
8#include "qla_target.h" 8#include "qla_target.h"
9#include <linux/utsname.h>
9 10
10static int qla2x00_sns_ga_nxt(scsi_qla_host_t *, fc_port_t *); 11static int qla2x00_sns_ga_nxt(scsi_qla_host_t *, fc_port_t *);
11static int qla2x00_sns_gid_pt(scsi_qla_host_t *, sw_info_t *); 12static int qla2x00_sns_gid_pt(scsi_qla_host_t *, sw_info_t *);
@@ -143,10 +144,10 @@ qla2x00_chk_ms_status(scsi_qla_host_t *vha, ms_iocb_entry_t *ms_pkt,
143 if (ct_rsp->header.response != 144 if (ct_rsp->header.response !=
144 __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { 145 __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
145 ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x2077, 146 ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x2077,
146 "%s failed rejected request on port_id: " 147 "%s failed rejected request on port_id: %02x%02x%02x Compeltion status 0x%x, response 0x%x\n",
147 "%02x%02x%02x.\n", routine, 148 routine, vha->d_id.b.domain,
148 vha->d_id.b.domain, vha->d_id.b.area, 149 vha->d_id.b.area, vha->d_id.b.al_pa,
149 vha->d_id.b.al_pa); 150 comp_status, ct_rsp->header.response);
150 ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 151 ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha,
151 0x2078, (uint8_t *)&ct_rsp->header, 152 0x2078, (uint8_t *)&ct_rsp->header,
152 sizeof(struct ct_rsp_hdr)); 153 sizeof(struct ct_rsp_hdr));
@@ -622,15 +623,16 @@ qla2x00_rnn_id(scsi_qla_host_t *vha)
622} 623}
623 624
624void 625void
625qla2x00_get_sym_node_name(scsi_qla_host_t *vha, uint8_t *snn) 626qla2x00_get_sym_node_name(scsi_qla_host_t *vha, uint8_t *snn, size_t size)
626{ 627{
627 struct qla_hw_data *ha = vha->hw; 628 struct qla_hw_data *ha = vha->hw;
628 629
629 if (IS_QLAFX00(ha)) 630 if (IS_QLAFX00(ha))
630 sprintf(snn, "%s FW:v%s DVR:v%s", ha->model_number, 631 snprintf(snn, size, "%s FW:v%s DVR:v%s", ha->model_number,
631 ha->mr.fw_version, qla2x00_version_str); 632 ha->mr.fw_version, qla2x00_version_str);
632 else 633 else
633 sprintf(snn, "%s FW:v%d.%02d.%02d DVR:v%s", ha->model_number, 634 snprintf(snn, size,
635 "%s FW:v%d.%02d.%02d DVR:v%s", ha->model_number,
634 ha->fw_major_version, ha->fw_minor_version, 636 ha->fw_major_version, ha->fw_minor_version,
635 ha->fw_subminor_version, qla2x00_version_str); 637 ha->fw_subminor_version, qla2x00_version_str);
636} 638}
@@ -670,7 +672,8 @@ qla2x00_rsnn_nn(scsi_qla_host_t *vha)
670 memcpy(ct_req->req.rsnn_nn.node_name, vha->node_name, WWN_SIZE); 672 memcpy(ct_req->req.rsnn_nn.node_name, vha->node_name, WWN_SIZE);
671 673
672 /* Prepare the Symbolic Node Name */ 674 /* Prepare the Symbolic Node Name */
673 qla2x00_get_sym_node_name(vha, ct_req->req.rsnn_nn.sym_node_name); 675 qla2x00_get_sym_node_name(vha, ct_req->req.rsnn_nn.sym_node_name,
676 sizeof(ct_req->req.rsnn_nn.sym_node_name));
674 677
675 /* Calculate SNN length */ 678 /* Calculate SNN length */
676 ct_req->req.rsnn_nn.name_len = 679 ct_req->req.rsnn_nn.name_len =
@@ -1263,7 +1266,7 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1263 ms_iocb_entry_t *ms_pkt; 1266 ms_iocb_entry_t *ms_pkt;
1264 struct ct_sns_req *ct_req; 1267 struct ct_sns_req *ct_req;
1265 struct ct_sns_rsp *ct_rsp; 1268 struct ct_sns_rsp *ct_rsp;
1266 uint8_t *entries; 1269 void *entries;
1267 struct ct_fdmi_hba_attr *eiter; 1270 struct ct_fdmi_hba_attr *eiter;
1268 struct qla_hw_data *ha = vha->hw; 1271 struct qla_hw_data *ha = vha->hw;
1269 1272
@@ -1288,7 +1291,7 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1288 entries = ct_req->req.rhba.hba_identifier; 1291 entries = ct_req->req.rhba.hba_identifier;
1289 1292
1290 /* Nodename. */ 1293 /* Nodename. */
1291 eiter = (struct ct_fdmi_hba_attr *) (entries + size); 1294 eiter = entries + size;
1292 eiter->type = __constant_cpu_to_be16(FDMI_HBA_NODE_NAME); 1295 eiter->type = __constant_cpu_to_be16(FDMI_HBA_NODE_NAME);
1293 eiter->len = __constant_cpu_to_be16(4 + WWN_SIZE); 1296 eiter->len = __constant_cpu_to_be16(4 + WWN_SIZE);
1294 memcpy(eiter->a.node_name, vha->node_name, WWN_SIZE); 1297 memcpy(eiter->a.node_name, vha->node_name, WWN_SIZE);
@@ -1298,11 +1301,12 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1298 "NodeName = %8phN.\n", eiter->a.node_name); 1301 "NodeName = %8phN.\n", eiter->a.node_name);
1299 1302
1300 /* Manufacturer. */ 1303 /* Manufacturer. */
1301 eiter = (struct ct_fdmi_hba_attr *) (entries + size); 1304 eiter = entries + size;
1302 eiter->type = __constant_cpu_to_be16(FDMI_HBA_MANUFACTURER); 1305 eiter->type = __constant_cpu_to_be16(FDMI_HBA_MANUFACTURER);
1303 alen = strlen(QLA2XXX_MANUFACTURER); 1306 alen = strlen(QLA2XXX_MANUFACTURER);
1304 strncpy(eiter->a.manufacturer, QLA2XXX_MANUFACTURER, alen + 1); 1307 snprintf(eiter->a.manufacturer, sizeof(eiter->a.manufacturer),
1305 alen += (alen & 3) ? (4 - (alen & 3)) : 4; 1308 "%s", "QLogic Corporation");
1309 alen += 4 - (alen & 3);
1306 eiter->len = cpu_to_be16(4 + alen); 1310 eiter->len = cpu_to_be16(4 + alen);
1307 size += 4 + alen; 1311 size += 4 + alen;
1308 1312
@@ -1310,12 +1314,19 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1310 "Manufacturer = %s.\n", eiter->a.manufacturer); 1314 "Manufacturer = %s.\n", eiter->a.manufacturer);
1311 1315
1312 /* Serial number. */ 1316 /* Serial number. */
1313 eiter = (struct ct_fdmi_hba_attr *) (entries + size); 1317 eiter = entries + size;
1314 eiter->type = __constant_cpu_to_be16(FDMI_HBA_SERIAL_NUMBER); 1318 eiter->type = __constant_cpu_to_be16(FDMI_HBA_SERIAL_NUMBER);
1315 sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ha->serial1; 1319 if (IS_FWI2_CAPABLE(ha))
1316 sprintf(eiter->a.serial_num, "%c%05d", 'A' + sn / 100000, sn % 100000); 1320 qla2xxx_get_vpd_field(vha, "SN", eiter->a.serial_num,
1321 sizeof(eiter->a.serial_num));
1322 else {
1323 sn = ((ha->serial0 & 0x1f) << 16) |
1324 (ha->serial2 << 8) | ha->serial1;
1325 snprintf(eiter->a.serial_num, sizeof(eiter->a.serial_num),
1326 "%c%05d", 'A' + sn / 100000, sn % 100000);
1327 }
1317 alen = strlen(eiter->a.serial_num); 1328 alen = strlen(eiter->a.serial_num);
1318 alen += (alen & 3) ? (4 - (alen & 3)) : 4; 1329 alen += 4 - (alen & 3);
1319 eiter->len = cpu_to_be16(4 + alen); 1330 eiter->len = cpu_to_be16(4 + alen);
1320 size += 4 + alen; 1331 size += 4 + alen;
1321 1332
@@ -1323,11 +1334,12 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1323 "Serial no. = %s.\n", eiter->a.serial_num); 1334 "Serial no. = %s.\n", eiter->a.serial_num);
1324 1335
1325 /* Model name. */ 1336 /* Model name. */
1326 eiter = (struct ct_fdmi_hba_attr *) (entries + size); 1337 eiter = entries + size;
1327 eiter->type = __constant_cpu_to_be16(FDMI_HBA_MODEL); 1338 eiter->type = __constant_cpu_to_be16(FDMI_HBA_MODEL);
1328 strcpy(eiter->a.model, ha->model_number); 1339 snprintf(eiter->a.model, sizeof(eiter->a.model),
1340 "%s", ha->model_number);
1329 alen = strlen(eiter->a.model); 1341 alen = strlen(eiter->a.model);
1330 alen += (alen & 3) ? (4 - (alen & 3)) : 4; 1342 alen += 4 - (alen & 3);
1331 eiter->len = cpu_to_be16(4 + alen); 1343 eiter->len = cpu_to_be16(4 + alen);
1332 size += 4 + alen; 1344 size += 4 + alen;
1333 1345
@@ -1335,11 +1347,12 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1335 "Model Name = %s.\n", eiter->a.model); 1347 "Model Name = %s.\n", eiter->a.model);
1336 1348
1337 /* Model description. */ 1349 /* Model description. */
1338 eiter = (struct ct_fdmi_hba_attr *) (entries + size); 1350 eiter = entries + size;
1339 eiter->type = __constant_cpu_to_be16(FDMI_HBA_MODEL_DESCRIPTION); 1351 eiter->type = __constant_cpu_to_be16(FDMI_HBA_MODEL_DESCRIPTION);
1340 strncpy(eiter->a.model_desc, ha->model_desc, 80); 1352 snprintf(eiter->a.model_desc, sizeof(eiter->a.model_desc),
1353 "%s", ha->model_desc);
1341 alen = strlen(eiter->a.model_desc); 1354 alen = strlen(eiter->a.model_desc);
1342 alen += (alen & 3) ? (4 - (alen & 3)) : 4; 1355 alen += 4 - (alen & 3);
1343 eiter->len = cpu_to_be16(4 + alen); 1356 eiter->len = cpu_to_be16(4 + alen);
1344 size += 4 + alen; 1357 size += 4 + alen;
1345 1358
@@ -1347,11 +1360,23 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1347 "Model Desc = %s.\n", eiter->a.model_desc); 1360 "Model Desc = %s.\n", eiter->a.model_desc);
1348 1361
1349 /* Hardware version. */ 1362 /* Hardware version. */
1350 eiter = (struct ct_fdmi_hba_attr *) (entries + size); 1363 eiter = entries + size;
1351 eiter->type = __constant_cpu_to_be16(FDMI_HBA_HARDWARE_VERSION); 1364 eiter->type = __constant_cpu_to_be16(FDMI_HBA_HARDWARE_VERSION);
1352 strcpy(eiter->a.hw_version, ha->adapter_id); 1365 if (!IS_FWI2_CAPABLE(ha)) {
1366 snprintf(eiter->a.hw_version, sizeof(eiter->a.hw_version),
1367 "HW:%s", ha->adapter_id);
1368 } else if (qla2xxx_get_vpd_field(vha, "MN", eiter->a.hw_version,
1369 sizeof(eiter->a.hw_version))) {
1370 ;
1371 } else if (qla2xxx_get_vpd_field(vha, "EC", eiter->a.hw_version,
1372 sizeof(eiter->a.hw_version))) {
1373 ;
1374 } else {
1375 snprintf(eiter->a.hw_version, sizeof(eiter->a.hw_version),
1376 "HW:%s", ha->adapter_id);
1377 }
1353 alen = strlen(eiter->a.hw_version); 1378 alen = strlen(eiter->a.hw_version);
1354 alen += (alen & 3) ? (4 - (alen & 3)) : 4; 1379 alen += 4 - (alen & 3);
1355 eiter->len = cpu_to_be16(4 + alen); 1380 eiter->len = cpu_to_be16(4 + alen);
1356 size += 4 + alen; 1381 size += 4 + alen;
1357 1382
@@ -1359,11 +1384,12 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1359 "Hardware ver = %s.\n", eiter->a.hw_version); 1384 "Hardware ver = %s.\n", eiter->a.hw_version);
1360 1385
1361 /* Driver version. */ 1386 /* Driver version. */
1362 eiter = (struct ct_fdmi_hba_attr *) (entries + size); 1387 eiter = entries + size;
1363 eiter->type = __constant_cpu_to_be16(FDMI_HBA_DRIVER_VERSION); 1388 eiter->type = __constant_cpu_to_be16(FDMI_HBA_DRIVER_VERSION);
1364 strcpy(eiter->a.driver_version, qla2x00_version_str); 1389 snprintf(eiter->a.driver_version, sizeof(eiter->a.driver_version),
1390 "%s", qla2x00_version_str);
1365 alen = strlen(eiter->a.driver_version); 1391 alen = strlen(eiter->a.driver_version);
1366 alen += (alen & 3) ? (4 - (alen & 3)) : 4; 1392 alen += 4 - (alen & 3);
1367 eiter->len = cpu_to_be16(4 + alen); 1393 eiter->len = cpu_to_be16(4 + alen);
1368 size += 4 + alen; 1394 size += 4 + alen;
1369 1395
@@ -1371,11 +1397,12 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1371 "Driver ver = %s.\n", eiter->a.driver_version); 1397 "Driver ver = %s.\n", eiter->a.driver_version);
1372 1398
1373 /* Option ROM version. */ 1399 /* Option ROM version. */
1374 eiter = (struct ct_fdmi_hba_attr *) (entries + size); 1400 eiter = entries + size;
1375 eiter->type = __constant_cpu_to_be16(FDMI_HBA_OPTION_ROM_VERSION); 1401 eiter->type = __constant_cpu_to_be16(FDMI_HBA_OPTION_ROM_VERSION);
1376 strcpy(eiter->a.orom_version, "0.00"); 1402 snprintf(eiter->a.orom_version, sizeof(eiter->a.orom_version),
1403 "%d.%02d", ha->bios_revision[1], ha->bios_revision[0]);
1377 alen = strlen(eiter->a.orom_version); 1404 alen = strlen(eiter->a.orom_version);
1378 alen += (alen & 3) ? (4 - (alen & 3)) : 4; 1405 alen += 4 - (alen & 3);
1379 eiter->len = cpu_to_be16(4 + alen); 1406 eiter->len = cpu_to_be16(4 + alen);
1380 size += 4 + alen; 1407 size += 4 + alen;
1381 1408
@@ -1383,11 +1410,12 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1383 "Optrom vers = %s.\n", eiter->a.orom_version); 1410 "Optrom vers = %s.\n", eiter->a.orom_version);
1384 1411
1385 /* Firmware version */ 1412 /* Firmware version */
1386 eiter = (struct ct_fdmi_hba_attr *) (entries + size); 1413 eiter = entries + size;
1387 eiter->type = __constant_cpu_to_be16(FDMI_HBA_FIRMWARE_VERSION); 1414 eiter->type = __constant_cpu_to_be16(FDMI_HBA_FIRMWARE_VERSION);
1388 ha->isp_ops->fw_version_str(vha, eiter->a.fw_version); 1415 ha->isp_ops->fw_version_str(vha, eiter->a.fw_version,
1416 sizeof(eiter->a.fw_version));
1389 alen = strlen(eiter->a.fw_version); 1417 alen = strlen(eiter->a.fw_version);
1390 alen += (alen & 3) ? (4 - (alen & 3)) : 4; 1418 alen += 4 - (alen & 3);
1391 eiter->len = cpu_to_be16(4 + alen); 1419 eiter->len = cpu_to_be16(4 + alen);
1392 size += 4 + alen; 1420 size += 4 + alen;
1393 1421
@@ -1419,6 +1447,11 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1419 ql_dbg(ql_dbg_disc, vha, 0x2034, 1447 ql_dbg(ql_dbg_disc, vha, 0x2034,
1420 "HBA already registered.\n"); 1448 "HBA already registered.\n");
1421 rval = QLA_ALREADY_REGISTERED; 1449 rval = QLA_ALREADY_REGISTERED;
1450 } else {
1451 ql_dbg(ql_dbg_disc, vha, 0x20ad,
1452 "RHBA FDMI registration failed, CT Reason code: 0x%x, CT Explanation 0x%x\n",
1453 ct_rsp->header.reason_code,
1454 ct_rsp->header.explanation_code);
1422 } 1455 }
1423 } else { 1456 } else {
1424 ql_dbg(ql_dbg_disc, vha, 0x2035, 1457 ql_dbg(ql_dbg_disc, vha, 0x2035,
@@ -1429,6 +1462,534 @@ qla2x00_fdmi_rhba(scsi_qla_host_t *vha)
1429} 1462}
1430 1463
1431/** 1464/**
1465 * qla2x00_fdmi_rpa() -
1466 * @ha: HA context
1467 *
1468 * Returns 0 on success.
1469 */
1470static int
1471qla2x00_fdmi_rpa(scsi_qla_host_t *vha)
1472{
1473 int rval, alen;
1474 uint32_t size;
1475 struct qla_hw_data *ha = vha->hw;
1476 ms_iocb_entry_t *ms_pkt;
1477 struct ct_sns_req *ct_req;
1478 struct ct_sns_rsp *ct_rsp;
1479 void *entries;
1480 struct ct_fdmi_port_attr *eiter;
1481 struct init_cb_24xx *icb24 = (struct init_cb_24xx *)ha->init_cb;
1482 struct new_utsname *p_sysid = NULL;
1483
1484 /* Issue RPA */
1485 /* Prepare common MS IOCB */
1486 /* Request size adjusted after CT preparation */
1487 ms_pkt = ha->isp_ops->prep_ms_fdmi_iocb(vha, 0, RPA_RSP_SIZE);
1488
1489 /* Prepare CT request */
1490 ct_req = qla2x00_prep_ct_fdmi_req(ha->ct_sns, RPA_CMD,
1491 RPA_RSP_SIZE);
1492 ct_rsp = &ha->ct_sns->p.rsp;
1493
1494 /* Prepare FDMI command arguments -- attribute block, attributes. */
1495 memcpy(ct_req->req.rpa.port_name, vha->port_name, WWN_SIZE);
1496 size = WWN_SIZE + 4;
1497
1498 /* Attributes */
1499 ct_req->req.rpa.attrs.count = cpu_to_be32(FDMI_PORT_ATTR_COUNT);
1500 entries = ct_req->req.rpa.port_name;
1501
1502 /* FC4 types. */
1503 eiter = entries + size;
1504 eiter->type = cpu_to_be16(FDMI_PORT_FC4_TYPES);
1505 eiter->len = cpu_to_be16(4 + 32);
1506 eiter->a.fc4_types[2] = 0x01;
1507 size += 4 + 32;
1508
1509 ql_dbg(ql_dbg_disc, vha, 0x2039,
1510 "FC4_TYPES=%02x %02x.\n",
1511 eiter->a.fc4_types[2],
1512 eiter->a.fc4_types[1]);
1513
1514 /* Supported speed. */
1515 eiter = entries + size;
1516 eiter->type = cpu_to_be16(FDMI_PORT_SUPPORT_SPEED);
1517 eiter->len = cpu_to_be16(4 + 4);
1518 if (IS_CNA_CAPABLE(ha))
1519 eiter->a.sup_speed = cpu_to_be32(
1520 FDMI_PORT_SPEED_10GB);
1521 else if (IS_QLA27XX(ha))
1522 eiter->a.sup_speed = cpu_to_be32(
1523 FDMI_PORT_SPEED_32GB|
1524 FDMI_PORT_SPEED_16GB|
1525 FDMI_PORT_SPEED_8GB);
1526 else if (IS_QLA2031(ha))
1527 eiter->a.sup_speed = cpu_to_be32(
1528 FDMI_PORT_SPEED_16GB|
1529 FDMI_PORT_SPEED_8GB|
1530 FDMI_PORT_SPEED_4GB);
1531 else if (IS_QLA25XX(ha))
1532 eiter->a.sup_speed = cpu_to_be32(
1533 FDMI_PORT_SPEED_8GB|
1534 FDMI_PORT_SPEED_4GB|
1535 FDMI_PORT_SPEED_2GB|
1536 FDMI_PORT_SPEED_1GB);
1537 else if (IS_QLA24XX_TYPE(ha))
1538 eiter->a.sup_speed = cpu_to_be32(
1539 FDMI_PORT_SPEED_4GB|
1540 FDMI_PORT_SPEED_2GB|
1541 FDMI_PORT_SPEED_1GB);
1542 else if (IS_QLA23XX(ha))
1543 eiter->a.sup_speed = cpu_to_be32(
1544 FDMI_PORT_SPEED_2GB|
1545 FDMI_PORT_SPEED_1GB);
1546 else
1547 eiter->a.sup_speed = cpu_to_be32(
1548 FDMI_PORT_SPEED_1GB);
1549 size += 4 + 4;
1550
1551 ql_dbg(ql_dbg_disc, vha, 0x203a,
1552 "Supported_Speed=%x.\n", eiter->a.sup_speed);
1553
1554 /* Current speed. */
1555 eiter = entries + size;
1556 eiter->type = cpu_to_be16(FDMI_PORT_CURRENT_SPEED);
1557 eiter->len = cpu_to_be16(4 + 4);
1558 switch (ha->link_data_rate) {
1559 case PORT_SPEED_1GB:
1560 eiter->a.cur_speed =
1561 cpu_to_be32(FDMI_PORT_SPEED_1GB);
1562 break;
1563 case PORT_SPEED_2GB:
1564 eiter->a.cur_speed =
1565 cpu_to_be32(FDMI_PORT_SPEED_2GB);
1566 break;
1567 case PORT_SPEED_4GB:
1568 eiter->a.cur_speed =
1569 cpu_to_be32(FDMI_PORT_SPEED_4GB);
1570 break;
1571 case PORT_SPEED_8GB:
1572 eiter->a.cur_speed =
1573 cpu_to_be32(FDMI_PORT_SPEED_8GB);
1574 break;
1575 case PORT_SPEED_10GB:
1576 eiter->a.cur_speed =
1577 cpu_to_be32(FDMI_PORT_SPEED_10GB);
1578 break;
1579 case PORT_SPEED_16GB:
1580 eiter->a.cur_speed =
1581 cpu_to_be32(FDMI_PORT_SPEED_16GB);
1582 break;
1583 case PORT_SPEED_32GB:
1584 eiter->a.cur_speed =
1585 cpu_to_be32(FDMI_PORT_SPEED_32GB);
1586 break;
1587 default:
1588 eiter->a.cur_speed =
1589 cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN);
1590 break;
1591 }
1592 size += 4 + 4;
1593
1594 ql_dbg(ql_dbg_disc, vha, 0x203b,
1595 "Current_Speed=%x.\n", eiter->a.cur_speed);
1596
1597 /* Max frame size. */
1598 eiter = entries + size;
1599 eiter->type = cpu_to_be16(FDMI_PORT_MAX_FRAME_SIZE);
1600 eiter->len = cpu_to_be16(4 + 4);
1601 eiter->a.max_frame_size = IS_FWI2_CAPABLE(ha) ?
1602 le16_to_cpu(icb24->frame_payload_size) :
1603 le16_to_cpu(ha->init_cb->frame_payload_size);
1604 eiter->a.max_frame_size = cpu_to_be32(eiter->a.max_frame_size);
1605 size += 4 + 4;
1606
1607 ql_dbg(ql_dbg_disc, vha, 0x203c,
1608 "Max_Frame_Size=%x.\n", eiter->a.max_frame_size);
1609
1610 /* OS device name. */
1611 eiter = entries + size;
1612 eiter->type = cpu_to_be16(FDMI_PORT_OS_DEVICE_NAME);
1613 snprintf(eiter->a.os_dev_name, sizeof(eiter->a.os_dev_name),
1614 "%s:host%lu", QLA2XXX_DRIVER_NAME, vha->host_no);
1615 alen = strlen(eiter->a.os_dev_name);
1616 alen += 4 - (alen & 3);
1617 eiter->len = cpu_to_be16(4 + alen);
1618 size += 4 + alen;
1619
1620 ql_dbg(ql_dbg_disc, vha, 0x204b,
1621 "OS_Device_Name=%s.\n", eiter->a.os_dev_name);
1622
1623 /* Hostname. */
1624 eiter = entries + size;
1625 eiter->type = cpu_to_be16(FDMI_PORT_HOST_NAME);
1626 p_sysid = utsname();
1627 if (p_sysid) {
1628 snprintf(eiter->a.host_name, sizeof(eiter->a.host_name),
1629 "%s", p_sysid->nodename);
1630 } else {
1631 snprintf(eiter->a.host_name, sizeof(eiter->a.host_name),
1632 "%s", fc_host_system_hostname(vha->host));
1633 }
1634 alen = strlen(eiter->a.host_name);
1635 alen += 4 - (alen & 3);
1636 eiter->len = cpu_to_be16(4 + alen);
1637 size += 4 + alen;
1638
1639 ql_dbg(ql_dbg_disc, vha, 0x203d, "HostName=%s.\n", eiter->a.host_name);
1640
1641 /* Update MS request size. */
1642 qla2x00_update_ms_fdmi_iocb(vha, size + 16);
1643
1644 ql_dbg(ql_dbg_disc, vha, 0x203e,
1645 "RPA portname %016llx, size = %d.\n",
1646 wwn_to_u64(ct_req->req.rpa.port_name), size);
1647 ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2079,
1648 entries, size);
1649
1650 /* Execute MS IOCB */
1651 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma,
1652 sizeof(ms_iocb_entry_t));
1653 if (rval != QLA_SUCCESS) {
1654 /*EMPTY*/
1655 ql_dbg(ql_dbg_disc, vha, 0x2040,
1656 "RPA issue IOCB failed (%d).\n", rval);
1657 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, "RPA") !=
1658 QLA_SUCCESS) {
1659 rval = QLA_FUNCTION_FAILED;
1660 if (ct_rsp->header.reason_code == CT_REASON_CANNOT_PERFORM &&
1661 ct_rsp->header.explanation_code ==
1662 CT_EXPL_ALREADY_REGISTERED) {
1663 ql_dbg(ql_dbg_disc, vha, 0x20cd,
1664 "RPA already registered.\n");
1665 rval = QLA_ALREADY_REGISTERED;
1666 }
1667
1668 } else {
1669 ql_dbg(ql_dbg_disc, vha, 0x2041,
1670 "RPA exiting normally.\n");
1671 }
1672
1673 return rval;
1674}
1675
1676/**
1677 * qla2x00_fdmiv2_rhba() -
1678 * @ha: HA context
1679 *
1680 * Returns 0 on success.
1681 */
1682static int
1683qla2x00_fdmiv2_rhba(scsi_qla_host_t *vha)
1684{
1685 int rval, alen;
1686 uint32_t size, sn;
1687 ms_iocb_entry_t *ms_pkt;
1688 struct ct_sns_req *ct_req;
1689 struct ct_sns_rsp *ct_rsp;
1690 void *entries;
1691 struct ct_fdmiv2_hba_attr *eiter;
1692 struct qla_hw_data *ha = vha->hw;
1693 struct init_cb_24xx *icb24 = (struct init_cb_24xx *)ha->init_cb;
1694 struct new_utsname *p_sysid = NULL;
1695
1696 /* Issue RHBA */
1697 /* Prepare common MS IOCB */
1698 /* Request size adjusted after CT preparation */
1699 ms_pkt = ha->isp_ops->prep_ms_fdmi_iocb(vha, 0, RHBA_RSP_SIZE);
1700
1701 /* Prepare CT request */
1702 ct_req = qla2x00_prep_ct_fdmi_req(ha->ct_sns, RHBA_CMD,
1703 RHBA_RSP_SIZE);
1704 ct_rsp = &ha->ct_sns->p.rsp;
1705
1706 /* Prepare FDMI command arguments -- attribute block, attributes. */
1707 memcpy(ct_req->req.rhba2.hba_identifier, vha->port_name, WWN_SIZE);
1708 ct_req->req.rhba2.entry_count = cpu_to_be32(1);
1709 memcpy(ct_req->req.rhba2.port_name, vha->port_name, WWN_SIZE);
1710 size = 2 * WWN_SIZE + 4 + 4;
1711
1712 /* Attributes */
1713 ct_req->req.rhba2.attrs.count = cpu_to_be32(FDMIV2_HBA_ATTR_COUNT);
1714 entries = ct_req->req.rhba2.hba_identifier;
1715
1716 /* Nodename. */
1717 eiter = entries + size;
1718 eiter->type = cpu_to_be16(FDMI_HBA_NODE_NAME);
1719 eiter->len = cpu_to_be16(4 + WWN_SIZE);
1720 memcpy(eiter->a.node_name, vha->node_name, WWN_SIZE);
1721 size += 4 + WWN_SIZE;
1722
1723 ql_dbg(ql_dbg_disc, vha, 0x207d,
1724 "NodeName = %016llx.\n", wwn_to_u64(eiter->a.node_name));
1725
1726 /* Manufacturer. */
1727 eiter = entries + size;
1728 eiter->type = cpu_to_be16(FDMI_HBA_MANUFACTURER);
1729 snprintf(eiter->a.manufacturer, sizeof(eiter->a.manufacturer),
1730 "%s", "QLogic Corporation");
1731 eiter->a.manufacturer[strlen("QLogic Corporation")] = '\0';
1732 alen = strlen(eiter->a.manufacturer);
1733 alen += 4 - (alen & 3);
1734 eiter->len = cpu_to_be16(4 + alen);
1735 size += 4 + alen;
1736
1737 ql_dbg(ql_dbg_disc, vha, 0x20a5,
1738 "Manufacturer = %s.\n", eiter->a.manufacturer);
1739
1740 /* Serial number. */
1741 eiter = entries + size;
1742 eiter->type = cpu_to_be16(FDMI_HBA_SERIAL_NUMBER);
1743 if (IS_FWI2_CAPABLE(ha))
1744 qla2xxx_get_vpd_field(vha, "SN", eiter->a.serial_num,
1745 sizeof(eiter->a.serial_num));
1746 else {
1747 sn = ((ha->serial0 & 0x1f) << 16) |
1748 (ha->serial2 << 8) | ha->serial1;
1749 snprintf(eiter->a.serial_num, sizeof(eiter->a.serial_num),
1750 "%c%05d", 'A' + sn / 100000, sn % 100000);
1751 }
1752 alen = strlen(eiter->a.serial_num);
1753 alen += 4 - (alen & 3);
1754 eiter->len = cpu_to_be16(4 + alen);
1755 size += 4 + alen;
1756
1757 ql_dbg(ql_dbg_disc, vha, 0x20a6,
1758 "Serial no. = %s.\n", eiter->a.serial_num);
1759
1760 /* Model name. */
1761 eiter = entries + size;
1762 eiter->type = cpu_to_be16(FDMI_HBA_MODEL);
1763 snprintf(eiter->a.model, sizeof(eiter->a.model),
1764 "%s", ha->model_number);
1765 alen = strlen(eiter->a.model);
1766 alen += 4 - (alen & 3);
1767 eiter->len = cpu_to_be16(4 + alen);
1768 size += 4 + alen;
1769
1770 ql_dbg(ql_dbg_disc, vha, 0x20a7,
1771 "Model Name = %s.\n", eiter->a.model);
1772
1773 /* Model description. */
1774 eiter = entries + size;
1775 eiter->type = cpu_to_be16(FDMI_HBA_MODEL_DESCRIPTION);
1776 snprintf(eiter->a.model_desc, sizeof(eiter->a.model_desc),
1777 "%s", ha->model_desc);
1778 alen = strlen(eiter->a.model_desc);
1779 alen += 4 - (alen & 3);
1780 eiter->len = cpu_to_be16(4 + alen);
1781 size += 4 + alen;
1782
1783 ql_dbg(ql_dbg_disc, vha, 0x20a8,
1784 "Model Desc = %s.\n", eiter->a.model_desc);
1785
1786 /* Hardware version. */
1787 eiter = entries + size;
1788 eiter->type = cpu_to_be16(FDMI_HBA_HARDWARE_VERSION);
1789 if (!IS_FWI2_CAPABLE(ha)) {
1790 snprintf(eiter->a.hw_version, sizeof(eiter->a.hw_version),
1791 "HW:%s", ha->adapter_id);
1792 } else if (qla2xxx_get_vpd_field(vha, "MN", eiter->a.hw_version,
1793 sizeof(eiter->a.hw_version))) {
1794 ;
1795 } else if (qla2xxx_get_vpd_field(vha, "EC", eiter->a.hw_version,
1796 sizeof(eiter->a.hw_version))) {
1797 ;
1798 } else {
1799 snprintf(eiter->a.hw_version, sizeof(eiter->a.hw_version),
1800 "HW:%s", ha->adapter_id);
1801 }
1802 alen = strlen(eiter->a.hw_version);
1803 alen += 4 - (alen & 3);
1804 eiter->len = cpu_to_be16(4 + alen);
1805 size += 4 + alen;
1806
1807 ql_dbg(ql_dbg_disc, vha, 0x20a9,
1808 "Hardware ver = %s.\n", eiter->a.hw_version);
1809
1810 /* Driver version. */
1811 eiter = entries + size;
1812 eiter->type = cpu_to_be16(FDMI_HBA_DRIVER_VERSION);
1813 snprintf(eiter->a.driver_version, sizeof(eiter->a.driver_version),
1814 "%s", qla2x00_version_str);
1815 alen = strlen(eiter->a.driver_version);
1816 alen += 4 - (alen & 3);
1817 eiter->len = cpu_to_be16(4 + alen);
1818 size += 4 + alen;
1819
1820 ql_dbg(ql_dbg_disc, vha, 0x20aa,
1821 "Driver ver = %s.\n", eiter->a.driver_version);
1822
1823 /* Option ROM version. */
1824 eiter = entries + size;
1825 eiter->type = cpu_to_be16(FDMI_HBA_OPTION_ROM_VERSION);
1826 snprintf(eiter->a.orom_version, sizeof(eiter->a.orom_version),
1827 "%d.%02d", ha->bios_revision[1], ha->bios_revision[0]);
1828 alen = strlen(eiter->a.orom_version);
1829 alen += 4 - (alen & 3);
1830 eiter->len = cpu_to_be16(4 + alen);
1831 size += 4 + alen;
1832
1833 ql_dbg(ql_dbg_disc, vha , 0x20ab,
1834 "Optrom version = %d.%02d.\n", eiter->a.orom_version[1],
1835 eiter->a.orom_version[0]);
1836
1837 /* Firmware version */
1838 eiter = entries + size;
1839 eiter->type = cpu_to_be16(FDMI_HBA_FIRMWARE_VERSION);
1840 ha->isp_ops->fw_version_str(vha, eiter->a.fw_version,
1841 sizeof(eiter->a.fw_version));
1842 alen = strlen(eiter->a.fw_version);
1843 alen += 4 - (alen & 3);
1844 eiter->len = cpu_to_be16(4 + alen);
1845 size += 4 + alen;
1846
1847 ql_dbg(ql_dbg_disc, vha, 0x20ac,
1848 "Firmware vers = %s.\n", eiter->a.fw_version);
1849
1850 /* OS Name and Version */
1851 eiter = entries + size;
1852 eiter->type = cpu_to_be16(FDMI_HBA_OS_NAME_AND_VERSION);
1853 p_sysid = utsname();
1854 if (p_sysid) {
1855 snprintf(eiter->a.os_version, sizeof(eiter->a.os_version),
1856 "%s %s %s",
1857 p_sysid->sysname, p_sysid->release, p_sysid->version);
1858 } else {
1859 snprintf(eiter->a.os_version, sizeof(eiter->a.os_version),
1860 "%s %s", "Linux", fc_host_system_hostname(vha->host));
1861 }
1862 alen = strlen(eiter->a.os_version);
1863 alen += 4 - (alen & 3);
1864 eiter->len = cpu_to_be16(4 + alen);
1865 size += 4 + alen;
1866
1867 ql_dbg(ql_dbg_disc, vha, 0x20ae,
1868 "OS Name and Version = %s.\n", eiter->a.os_version);
1869
1870 /* MAX CT Payload Length */
1871 eiter = entries + size;
1872 eiter->type = cpu_to_be16(FDMI_HBA_MAXIMUM_CT_PAYLOAD_LENGTH);
1873 eiter->a.max_ct_len = IS_FWI2_CAPABLE(ha) ?
1874 le16_to_cpu(icb24->frame_payload_size) :
1875 le16_to_cpu(ha->init_cb->frame_payload_size);
1876 eiter->a.max_ct_len = cpu_to_be32(eiter->a.max_ct_len);
1877 eiter->len = cpu_to_be16(4 + 4);
1878 size += 4 + 4;
1879
1880 ql_dbg(ql_dbg_disc, vha, 0x20af,
1881 "CT Payload Length = 0x%x.\n", eiter->a.max_ct_len);
1882
1883 /* Node Sybolic Name */
1884 eiter = entries + size;
1885 eiter->type = cpu_to_be16(FDMI_HBA_NODE_SYMBOLIC_NAME);
1886 qla2x00_get_sym_node_name(vha, eiter->a.sym_name,
1887 sizeof(eiter->a.sym_name));
1888 alen = strlen(eiter->a.sym_name);
1889 alen += 4 - (alen & 3);
1890 eiter->len = cpu_to_be16(4 + alen);
1891 size += 4 + alen;
1892
1893 ql_dbg(ql_dbg_disc, vha, 0x20b0,
1894 "Symbolic Name = %s.\n", eiter->a.sym_name);
1895
1896 /* Vendor Id */
1897 eiter = entries + size;
1898 eiter->type = cpu_to_be16(FDMI_HBA_VENDOR_ID);
1899 eiter->a.vendor_id = cpu_to_be32(0x1077);
1900 eiter->len = cpu_to_be16(4 + 4);
1901 size += 4 + 4;
1902
1903 ql_dbg(ql_dbg_disc, vha, 0x20b1,
1904 "Vendor Id = %x.\n", eiter->a.vendor_id);
1905
1906 /* Num Ports */
1907 eiter = entries + size;
1908 eiter->type = cpu_to_be16(FDMI_HBA_NUM_PORTS);
1909 eiter->a.num_ports = cpu_to_be32(1);
1910 eiter->len = cpu_to_be16(4 + 4);
1911 size += 4 + 4;
1912
1913 ql_dbg(ql_dbg_disc, vha, 0x20b2,
1914 "Port Num = %x.\n", eiter->a.num_ports);
1915
1916 /* Fabric Name */
1917 eiter = entries + size;
1918 eiter->type = cpu_to_be16(FDMI_HBA_FABRIC_NAME);
1919 memcpy(eiter->a.fabric_name, vha->fabric_node_name, WWN_SIZE);
1920 eiter->len = cpu_to_be16(4 + WWN_SIZE);
1921 size += 4 + WWN_SIZE;
1922
1923 ql_dbg(ql_dbg_disc, vha, 0x20b3,
1924 "Fabric Name = %016llx.\n", wwn_to_u64(eiter->a.fabric_name));
1925
1926 /* BIOS Version */
1927 eiter = entries + size;
1928 eiter->type = cpu_to_be16(FDMI_HBA_BOOT_BIOS_NAME);
1929 snprintf(eiter->a.bios_name, sizeof(eiter->a.bios_name),
1930 "BIOS %d.%02d", ha->bios_revision[1], ha->bios_revision[0]);
1931 alen = strlen(eiter->a.bios_name);
1932 alen += 4 - (alen & 3);
1933 eiter->len = cpu_to_be16(4 + alen);
1934 size += 4 + alen;
1935
1936 ql_dbg(ql_dbg_disc, vha, 0x20b4,
1937 "BIOS Name = %s\n", eiter->a.bios_name);
1938
1939 /* Vendor Identifier */
1940 eiter = entries + size;
1941 eiter->type = cpu_to_be16(FDMI_HBA_TYPE_VENDOR_IDENTIFIER);
1942 snprintf(eiter->a.vendor_indentifer, sizeof(eiter->a.vendor_indentifer),
1943 "%s", "QLGC");
1944 alen = strlen(eiter->a.vendor_indentifer);
1945 alen += 4 - (alen & 3);
1946 eiter->len = cpu_to_be16(4 + alen);
1947 size += 4 + alen;
1948
1949 ql_dbg(ql_dbg_disc, vha, 0x20b1,
1950 "Vendor Identifier = %s.\n", eiter->a.vendor_indentifer);
1951
1952 /* Update MS request size. */
1953 qla2x00_update_ms_fdmi_iocb(vha, size + 16);
1954
1955 ql_dbg(ql_dbg_disc, vha, 0x20b5,
1956 "RHBA identifier = %016llx.\n",
1957 wwn_to_u64(ct_req->req.rhba2.hba_identifier));
1958 ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x20b6,
1959 entries, size);
1960
1961 /* Execute MS IOCB */
1962 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma,
1963 sizeof(ms_iocb_entry_t));
1964 if (rval != QLA_SUCCESS) {
1965 /*EMPTY*/
1966 ql_dbg(ql_dbg_disc, vha, 0x20b7,
1967 "RHBA issue IOCB failed (%d).\n", rval);
1968 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, "RHBA") !=
1969 QLA_SUCCESS) {
1970 rval = QLA_FUNCTION_FAILED;
1971
1972 if (ct_rsp->header.reason_code == CT_REASON_CANNOT_PERFORM &&
1973 ct_rsp->header.explanation_code ==
1974 CT_EXPL_ALREADY_REGISTERED) {
1975 ql_dbg(ql_dbg_disc, vha, 0x20b8,
1976 "HBA already registered.\n");
1977 rval = QLA_ALREADY_REGISTERED;
1978 } else {
1979 ql_dbg(ql_dbg_disc, vha, 0x2016,
1980 "RHBA FDMI v2 failed, CT Reason code: 0x%x, CT Explanation 0x%x\n",
1981 ct_rsp->header.reason_code,
1982 ct_rsp->header.explanation_code);
1983 }
1984 } else {
1985 ql_dbg(ql_dbg_disc, vha, 0x20b9,
1986 "RHBA FDMI V2 exiting normally.\n");
1987 }
1988
1989 return rval;
1990}
1991
1992/**
1432 * qla2x00_fdmi_dhba() - 1993 * qla2x00_fdmi_dhba() -
1433 * @ha: HA context 1994 * @ha: HA context
1434 * 1995 *
@@ -1477,23 +2038,24 @@ qla2x00_fdmi_dhba(scsi_qla_host_t *vha)
1477} 2038}
1478 2039
1479/** 2040/**
1480 * qla2x00_fdmi_rpa() - 2041 * qla2x00_fdmiv2_rpa() -
1481 * @ha: HA context 2042 * @ha: HA context
1482 * 2043 *
1483 * Returns 0 on success. 2044 * Returns 0 on success.
1484 */ 2045 */
1485static int 2046static int
1486qla2x00_fdmi_rpa(scsi_qla_host_t *vha) 2047qla2x00_fdmiv2_rpa(scsi_qla_host_t *vha)
1487{ 2048{
1488 int rval, alen; 2049 int rval, alen;
1489 uint32_t size, max_frame_size; 2050 uint32_t size;
1490 struct qla_hw_data *ha = vha->hw; 2051 struct qla_hw_data *ha = vha->hw;
1491 ms_iocb_entry_t *ms_pkt; 2052 ms_iocb_entry_t *ms_pkt;
1492 struct ct_sns_req *ct_req; 2053 struct ct_sns_req *ct_req;
1493 struct ct_sns_rsp *ct_rsp; 2054 struct ct_sns_rsp *ct_rsp;
1494 uint8_t *entries; 2055 void *entries;
1495 struct ct_fdmi_port_attr *eiter; 2056 struct ct_fdmiv2_port_attr *eiter;
1496 struct init_cb_24xx *icb24 = (struct init_cb_24xx *)ha->init_cb; 2057 struct init_cb_24xx *icb24 = (struct init_cb_24xx *)ha->init_cb;
2058 struct new_utsname *p_sysid = NULL;
1497 2059
1498 /* Issue RPA */ 2060 /* Issue RPA */
1499 /* Prepare common MS IOCB */ 2061 /* Prepare common MS IOCB */
@@ -1505,147 +2067,258 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha)
1505 ct_rsp = &ha->ct_sns->p.rsp; 2067 ct_rsp = &ha->ct_sns->p.rsp;
1506 2068
1507 /* Prepare FDMI command arguments -- attribute block, attributes. */ 2069 /* Prepare FDMI command arguments -- attribute block, attributes. */
1508 memcpy(ct_req->req.rpa.port_name, vha->port_name, WWN_SIZE); 2070 memcpy(ct_req->req.rpa2.port_name, vha->port_name, WWN_SIZE);
1509 size = WWN_SIZE + 4; 2071 size = WWN_SIZE + 4;
1510 2072
1511 /* Attributes */ 2073 /* Attributes */
1512 ct_req->req.rpa.attrs.count = 2074 ct_req->req.rpa2.attrs.count = cpu_to_be32(FDMIV2_PORT_ATTR_COUNT);
1513 __constant_cpu_to_be32(FDMI_PORT_ATTR_COUNT - 1); 2075 entries = ct_req->req.rpa2.port_name;
1514 entries = ct_req->req.rpa.port_name;
1515 2076
1516 /* FC4 types. */ 2077 /* FC4 types. */
1517 eiter = (struct ct_fdmi_port_attr *) (entries + size); 2078 eiter = entries + size;
1518 eiter->type = __constant_cpu_to_be16(FDMI_PORT_FC4_TYPES); 2079 eiter->type = cpu_to_be16(FDMI_PORT_FC4_TYPES);
1519 eiter->len = __constant_cpu_to_be16(4 + 32); 2080 eiter->len = cpu_to_be16(4 + 32);
1520 eiter->a.fc4_types[2] = 0x01; 2081 eiter->a.fc4_types[2] = 0x01;
1521 size += 4 + 32; 2082 size += 4 + 32;
1522 2083
1523 ql_dbg(ql_dbg_disc, vha, 0x2039, 2084 ql_dbg(ql_dbg_disc, vha, 0x20ba,
1524 "FC4_TYPES=%02x %02x.\n", 2085 "FC4_TYPES=%02x %02x.\n",
1525 eiter->a.fc4_types[2], 2086 eiter->a.fc4_types[2],
1526 eiter->a.fc4_types[1]); 2087 eiter->a.fc4_types[1]);
1527 2088
1528 /* Supported speed. */ 2089 /* Supported speed. */
1529 eiter = (struct ct_fdmi_port_attr *) (entries + size); 2090 eiter = entries + size;
1530 eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); 2091 eiter->type = cpu_to_be16(FDMI_PORT_SUPPORT_SPEED);
1531 eiter->len = __constant_cpu_to_be16(4 + 4); 2092 eiter->len = cpu_to_be16(4 + 4);
1532 if (IS_CNA_CAPABLE(ha)) 2093 if (IS_CNA_CAPABLE(ha))
1533 eiter->a.sup_speed = __constant_cpu_to_be32( 2094 eiter->a.sup_speed = cpu_to_be32(
1534 FDMI_PORT_SPEED_10GB); 2095 FDMI_PORT_SPEED_10GB);
1535 else if (IS_QLA27XX(ha)) 2096 else if (IS_QLA27XX(ha))
1536 eiter->a.sup_speed = __constant_cpu_to_be32( 2097 eiter->a.sup_speed = cpu_to_be32(
1537 FDMI_PORT_SPEED_32GB|FDMI_PORT_SPEED_16GB| 2098 FDMI_PORT_SPEED_32GB|
2099 FDMI_PORT_SPEED_16GB|
1538 FDMI_PORT_SPEED_8GB); 2100 FDMI_PORT_SPEED_8GB);
2101 else if (IS_QLA2031(ha))
2102 eiter->a.sup_speed = cpu_to_be32(
2103 FDMI_PORT_SPEED_16GB|
2104 FDMI_PORT_SPEED_8GB|
2105 FDMI_PORT_SPEED_4GB);
1539 else if (IS_QLA25XX(ha)) 2106 else if (IS_QLA25XX(ha))
1540 eiter->a.sup_speed = __constant_cpu_to_be32( 2107 eiter->a.sup_speed = cpu_to_be32(
1541 FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| 2108 FDMI_PORT_SPEED_8GB|
1542 FDMI_PORT_SPEED_4GB|FDMI_PORT_SPEED_8GB); 2109 FDMI_PORT_SPEED_4GB|
2110 FDMI_PORT_SPEED_2GB|
2111 FDMI_PORT_SPEED_1GB);
1543 else if (IS_QLA24XX_TYPE(ha)) 2112 else if (IS_QLA24XX_TYPE(ha))
1544 eiter->a.sup_speed = __constant_cpu_to_be32( 2113 eiter->a.sup_speed = cpu_to_be32(
1545 FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| 2114 FDMI_PORT_SPEED_4GB|
1546 FDMI_PORT_SPEED_4GB); 2115 FDMI_PORT_SPEED_2GB|
2116 FDMI_PORT_SPEED_1GB);
1547 else if (IS_QLA23XX(ha)) 2117 else if (IS_QLA23XX(ha))
1548 eiter->a.sup_speed =__constant_cpu_to_be32( 2118 eiter->a.sup_speed = cpu_to_be32(
1549 FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB); 2119 FDMI_PORT_SPEED_2GB|
2120 FDMI_PORT_SPEED_1GB);
1550 else 2121 else
1551 eiter->a.sup_speed = __constant_cpu_to_be32( 2122 eiter->a.sup_speed = cpu_to_be32(
1552 FDMI_PORT_SPEED_1GB); 2123 FDMI_PORT_SPEED_1GB);
1553 size += 4 + 4; 2124 size += 4 + 4;
1554 2125
1555 ql_dbg(ql_dbg_disc, vha, 0x203a, 2126 ql_dbg(ql_dbg_disc, vha, 0x20bb,
1556 "Supported_Speed=%x.\n", eiter->a.sup_speed); 2127 "Supported Port Speed = %x.\n", eiter->a.sup_speed);
1557 2128
1558 /* Current speed. */ 2129 /* Current speed. */
1559 eiter = (struct ct_fdmi_port_attr *) (entries + size); 2130 eiter = entries + size;
1560 eiter->type = __constant_cpu_to_be16(FDMI_PORT_CURRENT_SPEED); 2131 eiter->type = cpu_to_be16(FDMI_PORT_CURRENT_SPEED);
1561 eiter->len = __constant_cpu_to_be16(4 + 4); 2132 eiter->len = cpu_to_be16(4 + 4);
1562 switch (ha->link_data_rate) { 2133 switch (ha->link_data_rate) {
1563 case PORT_SPEED_1GB: 2134 case PORT_SPEED_1GB:
1564 eiter->a.cur_speed = 2135 eiter->a.cur_speed = cpu_to_be32(FDMI_PORT_SPEED_1GB);
1565 __constant_cpu_to_be32(FDMI_PORT_SPEED_1GB);
1566 break; 2136 break;
1567 case PORT_SPEED_2GB: 2137 case PORT_SPEED_2GB:
1568 eiter->a.cur_speed = 2138 eiter->a.cur_speed = cpu_to_be32(FDMI_PORT_SPEED_2GB);
1569 __constant_cpu_to_be32(FDMI_PORT_SPEED_2GB);
1570 break; 2139 break;
1571 case PORT_SPEED_4GB: 2140 case PORT_SPEED_4GB:
1572 eiter->a.cur_speed = 2141 eiter->a.cur_speed = cpu_to_be32(FDMI_PORT_SPEED_4GB);
1573 __constant_cpu_to_be32(FDMI_PORT_SPEED_4GB);
1574 break; 2142 break;
1575 case PORT_SPEED_8GB: 2143 case PORT_SPEED_8GB:
1576 eiter->a.cur_speed = 2144 eiter->a.cur_speed = cpu_to_be32(FDMI_PORT_SPEED_8GB);
1577 __constant_cpu_to_be32(FDMI_PORT_SPEED_8GB);
1578 break; 2145 break;
1579 case PORT_SPEED_10GB: 2146 case PORT_SPEED_10GB:
1580 eiter->a.cur_speed = 2147 eiter->a.cur_speed = cpu_to_be32(FDMI_PORT_SPEED_10GB);
1581 __constant_cpu_to_be32(FDMI_PORT_SPEED_10GB);
1582 break; 2148 break;
1583 case PORT_SPEED_16GB: 2149 case PORT_SPEED_16GB:
1584 eiter->a.cur_speed = 2150 eiter->a.cur_speed = cpu_to_be32(FDMI_PORT_SPEED_16GB);
1585 __constant_cpu_to_be32(FDMI_PORT_SPEED_16GB);
1586 break; 2151 break;
1587 case PORT_SPEED_32GB: 2152 case PORT_SPEED_32GB:
1588 eiter->a.cur_speed = 2153 eiter->a.cur_speed = cpu_to_be32(FDMI_PORT_SPEED_32GB);
1589 __constant_cpu_to_be32(FDMI_PORT_SPEED_32GB);
1590 break; 2154 break;
1591 default: 2155 default:
1592 eiter->a.cur_speed = 2156 eiter->a.cur_speed = cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN);
1593 __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN);
1594 break; 2157 break;
1595 } 2158 }
1596 size += 4 + 4; 2159 size += 4 + 4;
1597 2160
1598 ql_dbg(ql_dbg_disc, vha, 0x203b, 2161 ql_dbg(ql_dbg_disc, vha, 0x20bc,
1599 "Current_Speed=%x.\n", eiter->a.cur_speed); 2162 "Current_Speed = %x.\n", eiter->a.cur_speed);
1600 2163
1601 /* Max frame size. */ 2164 /* Max frame size. */
1602 eiter = (struct ct_fdmi_port_attr *) (entries + size); 2165 eiter = entries + size;
1603 eiter->type = __constant_cpu_to_be16(FDMI_PORT_MAX_FRAME_SIZE); 2166 eiter->type = cpu_to_be16(FDMI_PORT_MAX_FRAME_SIZE);
1604 eiter->len = __constant_cpu_to_be16(4 + 4); 2167 eiter->len = cpu_to_be16(4 + 4);
1605 max_frame_size = IS_FWI2_CAPABLE(ha) ? 2168 eiter->a.max_frame_size = IS_FWI2_CAPABLE(ha) ?
1606 le16_to_cpu(icb24->frame_payload_size): 2169 le16_to_cpu(icb24->frame_payload_size):
1607 le16_to_cpu(ha->init_cb->frame_payload_size); 2170 le16_to_cpu(ha->init_cb->frame_payload_size);
1608 eiter->a.max_frame_size = cpu_to_be32(max_frame_size); 2171 eiter->a.max_frame_size = cpu_to_be32(eiter->a.max_frame_size);
1609 size += 4 + 4; 2172 size += 4 + 4;
1610 2173
1611 ql_dbg(ql_dbg_disc, vha, 0x203c, 2174 ql_dbg(ql_dbg_disc, vha, 0x20bc,
1612 "Max_Frame_Size=%x.\n", eiter->a.max_frame_size); 2175 "Max_Frame_Size = %x.\n", eiter->a.max_frame_size);
1613 2176
1614 /* OS device name. */ 2177 /* OS device name. */
1615 eiter = (struct ct_fdmi_port_attr *) (entries + size); 2178 eiter = entries + size;
1616 eiter->type = __constant_cpu_to_be16(FDMI_PORT_OS_DEVICE_NAME); 2179 eiter->type = cpu_to_be16(FDMI_PORT_OS_DEVICE_NAME);
1617 alen = strlen(QLA2XXX_DRIVER_NAME); 2180 alen = strlen(QLA2XXX_DRIVER_NAME);
1618 strncpy(eiter->a.os_dev_name, QLA2XXX_DRIVER_NAME, alen + 1); 2181 snprintf(eiter->a.os_dev_name, sizeof(eiter->a.os_dev_name),
1619 alen += (alen & 3) ? (4 - (alen & 3)) : 4; 2182 "%s:host%lu", QLA2XXX_DRIVER_NAME, vha->host_no);
2183 alen += 4 - (alen & 3);
1620 eiter->len = cpu_to_be16(4 + alen); 2184 eiter->len = cpu_to_be16(4 + alen);
1621 size += 4 + alen; 2185 size += 4 + alen;
1622 2186
1623 ql_dbg(ql_dbg_disc, vha, 0x204b, 2187 ql_dbg(ql_dbg_disc, vha, 0x20be,
1624 "OS_Device_Name=%s.\n", eiter->a.os_dev_name); 2188 "OS_Device_Name = %s.\n", eiter->a.os_dev_name);
1625 2189
1626 /* Hostname. */ 2190 /* Hostname. */
1627 if (strlen(fc_host_system_hostname(vha->host))) { 2191 eiter = entries + size;
1628 ct_req->req.rpa.attrs.count = 2192 eiter->type = cpu_to_be16(FDMI_PORT_HOST_NAME);
1629 __constant_cpu_to_be32(FDMI_PORT_ATTR_COUNT); 2193 p_sysid = utsname();
1630 eiter = (struct ct_fdmi_port_attr *) (entries + size); 2194 if (p_sysid) {
1631 eiter->type = __constant_cpu_to_be16(FDMI_PORT_HOST_NAME); 2195 snprintf(eiter->a.host_name, sizeof(eiter->a.host_name),
2196 "%s", p_sysid->nodename);
2197 } else {
1632 snprintf(eiter->a.host_name, sizeof(eiter->a.host_name), 2198 snprintf(eiter->a.host_name, sizeof(eiter->a.host_name),
1633 "%s", fc_host_system_hostname(vha->host)); 2199 "%s", fc_host_system_hostname(vha->host));
1634 alen = strlen(eiter->a.host_name);
1635 alen += (alen & 3) ? (4 - (alen & 3)) : 4;
1636 eiter->len = cpu_to_be16(4 + alen);
1637 size += 4 + alen;
1638
1639 ql_dbg(ql_dbg_disc, vha, 0x203d,
1640 "HostName=%s.\n", eiter->a.host_name);
1641 } 2200 }
2201 alen = strlen(eiter->a.host_name);
2202 alen += 4 - (alen & 3);
2203 eiter->len = cpu_to_be16(4 + alen);
2204 size += 4 + alen;
2205
2206 ql_dbg(ql_dbg_disc, vha, 0x203d,
2207 "HostName=%s.\n", eiter->a.host_name);
2208
2209 /* Node Name */
2210 eiter = entries + size;
2211 eiter->type = cpu_to_be16(FDMI_PORT_NODE_NAME);
2212 memcpy(eiter->a.node_name, vha->node_name, WWN_SIZE);
2213 eiter->len = cpu_to_be16(4 + WWN_SIZE);
2214 size += 4 + WWN_SIZE;
2215
2216 ql_dbg(ql_dbg_disc, vha, 0x20c0,
2217 "Node Name = %016llx.\n", wwn_to_u64(eiter->a.node_name));
2218
2219 /* Port Name */
2220 eiter = entries + size;
2221 eiter->type = cpu_to_be16(FDMI_PORT_NAME);
2222 memcpy(eiter->a.port_name, vha->port_name, WWN_SIZE);
2223 eiter->len = cpu_to_be16(4 + WWN_SIZE);
2224 size += 4 + WWN_SIZE;
2225
2226 ql_dbg(ql_dbg_disc, vha, 0x20c1,
2227 "Port Name = %016llx.\n", wwn_to_u64(eiter->a.port_name));
2228
2229 /* Port Symbolic Name */
2230 eiter = entries + size;
2231 eiter->type = cpu_to_be16(FDMI_PORT_SYM_NAME);
2232 qla2x00_get_sym_node_name(vha, eiter->a.port_sym_name,
2233 sizeof(eiter->a.port_sym_name));
2234 alen = strlen(eiter->a.port_sym_name);
2235 alen += 4 - (alen & 3);
2236 eiter->len = cpu_to_be16(4 + alen);
2237 size += 4 + alen;
2238
2239 ql_dbg(ql_dbg_disc, vha, 0x20c2,
2240 "port symbolic name = %s\n", eiter->a.port_sym_name);
2241
2242 /* Port Type */
2243 eiter = entries + size;
2244 eiter->type = cpu_to_be16(FDMI_PORT_TYPE);
2245 eiter->a.port_type = cpu_to_be32(NS_NX_PORT_TYPE);
2246 eiter->len = cpu_to_be16(4 + 4);
2247 size += 4 + 4;
2248
2249 ql_dbg(ql_dbg_disc, vha, 0x20c3,
2250 "Port Type = %x.\n", eiter->a.port_type);
2251
2252 /* Class of Service */
2253 eiter = entries + size;
2254 eiter->type = cpu_to_be16(FDMI_PORT_SUPP_COS);
2255 eiter->a.port_supported_cos = cpu_to_be32(FC_CLASS_3);
2256 eiter->len = cpu_to_be16(4 + 4);
2257 size += 4 + 4;
2258
2259 ql_dbg(ql_dbg_disc, vha, 0x20c4,
2260 "Supported COS = %08x\n", eiter->a.port_supported_cos);
2261
2262 /* Port Fabric Name */
2263 eiter = entries + size;
2264 eiter->type = cpu_to_be16(FDMI_PORT_FABRIC_NAME);
2265 memcpy(eiter->a.fabric_name, vha->fabric_node_name, WWN_SIZE);
2266 eiter->len = cpu_to_be16(4 + WWN_SIZE);
2267 size += 4 + WWN_SIZE;
2268
2269 ql_dbg(ql_dbg_disc, vha, 0x20c5,
2270 "Fabric Name = %016llx.\n", wwn_to_u64(eiter->a.fabric_name));
2271
2272 /* FC4_type */
2273 eiter = entries + size;
2274 eiter->type = cpu_to_be16(FDMI_PORT_FC4_TYPE);
2275 eiter->a.port_fc4_type[0] = 0;
2276 eiter->a.port_fc4_type[1] = 0;
2277 eiter->a.port_fc4_type[2] = 1;
2278 eiter->a.port_fc4_type[3] = 0;
2279 eiter->len = cpu_to_be16(4 + 32);
2280 size += 4 + 32;
2281
2282 ql_dbg(ql_dbg_disc, vha, 0x20c6,
2283 "Port Active FC4 Type = %02x %02x.\n",
2284 eiter->a.port_fc4_type[2], eiter->a.port_fc4_type[1]);
2285
2286 /* Port State */
2287 eiter = entries + size;
2288 eiter->type = cpu_to_be16(FDMI_PORT_STATE);
2289 eiter->a.port_state = cpu_to_be32(1);
2290 eiter->len = cpu_to_be16(4 + 4);
2291 size += 4 + 4;
2292
2293 ql_dbg(ql_dbg_disc, vha, 0x20c7,
2294 "Port State = %x.\n", eiter->a.port_state);
2295
2296 /* Number of Ports */
2297 eiter = entries + size;
2298 eiter->type = cpu_to_be16(FDMI_PORT_COUNT);
2299 eiter->a.num_ports = cpu_to_be32(1);
2300 eiter->len = cpu_to_be16(4 + 4);
2301 size += 4 + 4;
2302
2303 ql_dbg(ql_dbg_disc, vha, 0x20c8,
2304 "Number of ports = %x.\n", eiter->a.num_ports);
2305
2306 /* Port Id */
2307 eiter = entries + size;
2308 eiter->type = cpu_to_be16(FDMI_PORT_ID);
2309 eiter->a.port_id = cpu_to_be32(vha->d_id.b24);
2310 eiter->len = cpu_to_be16(4 + 4);
2311 size += 4 + 4;
2312
2313 ql_dbg(ql_dbg_disc, vha, 0x20c8,
2314 "Port Id = %x.\n", eiter->a.port_id);
1642 2315
1643 /* Update MS request size. */ 2316 /* Update MS request size. */
1644 qla2x00_update_ms_fdmi_iocb(vha, size + 16); 2317 qla2x00_update_ms_fdmi_iocb(vha, size + 16);
1645 2318
1646 ql_dbg(ql_dbg_disc, vha, 0x203e, 2319 ql_dbg(ql_dbg_disc, vha, 0x203e,
1647 "RPA portname= %8phN size=%d.\n", ct_req->req.rpa.port_name, size); 2320 "RPA portname= %8phN size=%d.\n", ct_req->req.rpa.port_name, size);
1648 ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2079, 2321 ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x20ca,
1649 entries, size); 2322 entries, size);
1650 2323
1651 /* Execute MS IOCB */ 2324 /* Execute MS IOCB */
@@ -1653,14 +2326,26 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha)
1653 sizeof(ms_iocb_entry_t)); 2326 sizeof(ms_iocb_entry_t));
1654 if (rval != QLA_SUCCESS) { 2327 if (rval != QLA_SUCCESS) {
1655 /*EMPTY*/ 2328 /*EMPTY*/
1656 ql_dbg(ql_dbg_disc, vha, 0x2040, 2329 ql_dbg(ql_dbg_disc, vha, 0x20cb,
1657 "RPA issue IOCB failed (%d).\n", rval); 2330 "RPA FDMI v2 issue IOCB failed (%d).\n", rval);
1658 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, "RPA") != 2331 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, "RPA") !=
1659 QLA_SUCCESS) { 2332 QLA_SUCCESS) {
1660 rval = QLA_FUNCTION_FAILED; 2333 rval = QLA_FUNCTION_FAILED;
2334 if (ct_rsp->header.reason_code == CT_REASON_CANNOT_PERFORM &&
2335 ct_rsp->header.explanation_code ==
2336 CT_EXPL_ALREADY_REGISTERED) {
2337 ql_dbg(ql_dbg_disc, vha, 0x20ce,
2338 "RPA FDMI v2 already registered\n");
2339 rval = QLA_ALREADY_REGISTERED;
2340 } else {
2341 ql_dbg(ql_dbg_disc, vha, 0x2020,
2342 "RPA FDMI v2 failed, CT Reason code: 0x%x, CT Explanation 0x%x\n",
2343 ct_rsp->header.reason_code,
2344 ct_rsp->header.explanation_code);
2345 }
1661 } else { 2346 } else {
1662 ql_dbg(ql_dbg_disc, vha, 0x2041, 2347 ql_dbg(ql_dbg_disc, vha, 0x20cc,
1663 "RPA exiting nornally.\n"); 2348 "RPA FDMI V2 exiting normally.\n");
1664 } 2349 }
1665 2350
1666 return rval; 2351 return rval;
@@ -1675,8 +2360,8 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha)
1675int 2360int
1676qla2x00_fdmi_register(scsi_qla_host_t *vha) 2361qla2x00_fdmi_register(scsi_qla_host_t *vha)
1677{ 2362{
1678 int rval; 2363 int rval = QLA_FUNCTION_FAILED;
1679 struct qla_hw_data *ha = vha->hw; 2364 struct qla_hw_data *ha = vha->hw;
1680 2365
1681 if (IS_QLA2100(ha) || IS_QLA2200(ha) || 2366 if (IS_QLA2100(ha) || IS_QLA2200(ha) ||
1682 IS_QLAFX00(ha)) 2367 IS_QLAFX00(ha))
@@ -1686,6 +2371,26 @@ qla2x00_fdmi_register(scsi_qla_host_t *vha)
1686 if (rval) 2371 if (rval)
1687 return rval; 2372 return rval;
1688 2373
2374 rval = qla2x00_fdmiv2_rhba(vha);
2375 if (rval) {
2376 if (rval != QLA_ALREADY_REGISTERED)
2377 goto try_fdmi;
2378
2379 rval = qla2x00_fdmi_dhba(vha);
2380 if (rval)
2381 goto try_fdmi;
2382
2383 rval = qla2x00_fdmiv2_rhba(vha);
2384 if (rval)
2385 goto try_fdmi;
2386 }
2387 rval = qla2x00_fdmiv2_rpa(vha);
2388 if (rval)
2389 goto try_fdmi;
2390
2391 goto out;
2392
2393try_fdmi:
1689 rval = qla2x00_fdmi_rhba(vha); 2394 rval = qla2x00_fdmi_rhba(vha);
1690 if (rval) { 2395 if (rval) {
1691 if (rval != QLA_ALREADY_REGISTERED) 2396 if (rval != QLA_ALREADY_REGISTERED)
@@ -1700,7 +2405,7 @@ qla2x00_fdmi_register(scsi_qla_host_t *vha)
1700 return rval; 2405 return rval;
1701 } 2406 }
1702 rval = qla2x00_fdmi_rpa(vha); 2407 rval = qla2x00_fdmi_rpa(vha);
1703 2408out:
1704 return rval; 2409 return rval;
1705} 2410}
1706 2411
diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c
index c54a53de351b..80867599527d 100644
--- a/drivers/scsi/qla2xxx/qla_mr.c
+++ b/drivers/scsi/qla2xxx/qla_mr.c
@@ -695,11 +695,11 @@ qlafx00_pci_info_str(struct scsi_qla_host *vha, char *str)
695} 695}
696 696
697char * 697char *
698qlafx00_fw_version_str(struct scsi_qla_host *vha, char *str) 698qlafx00_fw_version_str(struct scsi_qla_host *vha, char *str, size_t size)
699{ 699{
700 struct qla_hw_data *ha = vha->hw; 700 struct qla_hw_data *ha = vha->hw;
701 701
702 sprintf(str, "%s", ha->mr.fw_version); 702 snprintf(str, size, "%s", ha->mr.fw_version);
703 return str; 703 return str;
704} 704}
705 705
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index f93785957b72..1b9864cdd83c 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -548,14 +548,13 @@ qla24xx_pci_info_str(struct scsi_qla_host *vha, char *str)
548} 548}
549 549
550static char * 550static char *
551qla2x00_fw_version_str(struct scsi_qla_host *vha, char *str) 551qla2x00_fw_version_str(struct scsi_qla_host *vha, char *str, size_t size)
552{ 552{
553 char un_str[10]; 553 char un_str[10];
554 struct qla_hw_data *ha = vha->hw; 554 struct qla_hw_data *ha = vha->hw;
555 555
556 sprintf(str, "%d.%02d.%02d ", ha->fw_major_version, 556 snprintf(str, size, "%d.%02d.%02d ", ha->fw_major_version,
557 ha->fw_minor_version, 557 ha->fw_minor_version, ha->fw_subminor_version);
558 ha->fw_subminor_version);
559 558
560 if (ha->fw_attributes & BIT_9) { 559 if (ha->fw_attributes & BIT_9) {
561 strcat(str, "FLX"); 560 strcat(str, "FLX");
@@ -587,11 +586,11 @@ qla2x00_fw_version_str(struct scsi_qla_host *vha, char *str)
587} 586}
588 587
589static char * 588static char *
590qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str) 589qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str, size_t size)
591{ 590{
592 struct qla_hw_data *ha = vha->hw; 591 struct qla_hw_data *ha = vha->hw;
593 592
594 sprintf(str, "%d.%02d.%02d (%x)", ha->fw_major_version, 593 snprintf(str, size, "%d.%02d.%02d (%x)", ha->fw_major_version,
595 ha->fw_minor_version, ha->fw_subminor_version, ha->fw_attributes); 594 ha->fw_minor_version, ha->fw_subminor_version, ha->fw_attributes);
596 return str; 595 return str;
597} 596}
@@ -2925,7 +2924,7 @@ skip_dpc:
2925 pdev->device, ha->isp_ops->pci_info_str(base_vha, pci_info), 2924 pdev->device, ha->isp_ops->pci_info_str(base_vha, pci_info),
2926 pci_name(pdev), ha->flags.enable_64bit_addressing ? '+' : '-', 2925 pci_name(pdev), ha->flags.enable_64bit_addressing ? '+' : '-',
2927 base_vha->host_no, 2926 base_vha->host_no,
2928 ha->isp_ops->fw_version_str(base_vha, fw_str)); 2927 ha->isp_ops->fw_version_str(base_vha, fw_str, sizeof(fw_str)));
2929 2928
2930 qlt_add_target(ha, base_vha); 2929 qlt_add_target(ha, base_vha);
2931 2930