diff options
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 5 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 4 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 154 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 4 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gs.c | 943 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mr.c | 4 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 13 |
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 | ||
1020 | static ssize_t | 1020 | static 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 | ||
1930 | static void | 1931 | static 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 | ||
2131 | struct ct_fdmi_hba_attr { | 2149 | struct 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 | ||
2172 | struct 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 | |||
2196 | struct 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 | ||
2174 | struct ct_fdmi_port_attr { | 2232 | #define FC_CLASS_2 0x04 |
2233 | #define FC_CLASS_3 0x08 | ||
2234 | #define FC_CLASS_2_3 0x0C | ||
2235 | |||
2236 | struct 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 | */ |
2262 | struct ct_fdmiv2_port_attributes { | ||
2263 | uint32_t count; | ||
2264 | struct ct_fdmiv2_port_attr entry[FDMIV2_PORT_ATTR_COUNT]; | ||
2265 | }; | ||
2266 | |||
2267 | struct 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 | |||
2190 | struct ct_fdmi_port_attributes { | 2280 | struct 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); | |||
562 | extern int qla2x00_fdmi_register(scsi_qla_host_t *); | 562 | extern int qla2x00_fdmi_register(scsi_qla_host_t *); |
563 | extern int qla2x00_gfpn_id(scsi_qla_host_t *, sw_info_t *); | 563 | extern int qla2x00_gfpn_id(scsi_qla_host_t *, sw_info_t *); |
564 | extern int qla2x00_gpsc(scsi_qla_host_t *, sw_info_t *); | 564 | extern int qla2x00_gpsc(scsi_qla_host_t *, sw_info_t *); |
565 | extern void qla2x00_get_sym_node_name(scsi_qla_host_t *, uint8_t *); | 565 | extern 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 *); | |||
614 | extern int qlafx00_chip_diag(scsi_qla_host_t *); | 614 | extern int qlafx00_chip_diag(scsi_qla_host_t *); |
615 | extern void qlafx00_config_rings(struct scsi_qla_host *); | 615 | extern void qlafx00_config_rings(struct scsi_qla_host *); |
616 | extern char *qlafx00_pci_info_str(struct scsi_qla_host *, char *); | 616 | extern char *qlafx00_pci_info_str(struct scsi_qla_host *, char *); |
617 | extern char *qlafx00_fw_version_str(struct scsi_qla_host *, char *); | 617 | extern char *qlafx00_fw_version_str(struct scsi_qla_host *, char *, size_t); |
618 | extern irqreturn_t qlafx00_intr_handler(int, void *); | 618 | extern irqreturn_t qlafx00_intr_handler(int, void *); |
619 | extern void qlafx00_enable_intrs(struct qla_hw_data *); | 619 | extern void qlafx00_enable_intrs(struct qla_hw_data *); |
620 | extern void qlafx00_disable_intrs(struct qla_hw_data *); | 620 | extern 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 | ||
10 | static int qla2x00_sns_ga_nxt(scsi_qla_host_t *, fc_port_t *); | 11 | static int qla2x00_sns_ga_nxt(scsi_qla_host_t *, fc_port_t *); |
11 | static int qla2x00_sns_gid_pt(scsi_qla_host_t *, sw_info_t *); | 12 | static 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 | ||
624 | void | 625 | void |
625 | qla2x00_get_sym_node_name(scsi_qla_host_t *vha, uint8_t *snn) | 626 | qla2x00_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 | */ | ||
1470 | static int | ||
1471 | qla2x00_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 | */ | ||
1682 | static int | ||
1683 | qla2x00_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 | */ |
1485 | static int | 2046 | static int |
1486 | qla2x00_fdmi_rpa(scsi_qla_host_t *vha) | 2047 | qla2x00_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) | |||
1675 | int | 2360 | int |
1676 | qla2x00_fdmi_register(scsi_qla_host_t *vha) | 2361 | qla2x00_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 | |||
2393 | try_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 | 2408 | out: | |
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 | ||
697 | char * | 697 | char * |
698 | qlafx00_fw_version_str(struct scsi_qla_host *vha, char *str) | 698 | qlafx00_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 | ||
550 | static char * | 550 | static char * |
551 | qla2x00_fw_version_str(struct scsi_qla_host *vha, char *str) | 551 | qla2x00_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 | ||
589 | static char * | 588 | static char * |
590 | qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str) | 589 | qla24xx_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 | ||