ql4_os.c (290020B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * QLogic iSCSI HBA Driver 4 * Copyright (c) 2003-2013 QLogic Corporation 5 */ 6#include <linux/moduleparam.h> 7#include <linux/slab.h> 8#include <linux/blkdev.h> 9#include <linux/iscsi_boot_sysfs.h> 10#include <linux/inet.h> 11 12#include <scsi/scsi_tcq.h> 13#include <scsi/scsicam.h> 14 15#include "ql4_def.h" 16#include "ql4_version.h" 17#include "ql4_glbl.h" 18#include "ql4_dbg.h" 19#include "ql4_inline.h" 20#include "ql4_83xx.h" 21 22/* 23 * Driver version 24 */ 25static char qla4xxx_version_str[40]; 26 27/* 28 * SRB allocation cache 29 */ 30static struct kmem_cache *srb_cachep; 31 32/* 33 * Module parameter information and variables 34 */ 35static int ql4xdisablesysfsboot = 1; 36module_param(ql4xdisablesysfsboot, int, S_IRUGO | S_IWUSR); 37MODULE_PARM_DESC(ql4xdisablesysfsboot, 38 " Set to disable exporting boot targets to sysfs.\n" 39 "\t\t 0 - Export boot targets\n" 40 "\t\t 1 - Do not export boot targets (Default)"); 41 42int ql4xdontresethba; 43module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR); 44MODULE_PARM_DESC(ql4xdontresethba, 45 " Don't reset the HBA for driver recovery.\n" 46 "\t\t 0 - It will reset HBA (Default)\n" 47 "\t\t 1 - It will NOT reset HBA"); 48 49int ql4xextended_error_logging; 50module_param(ql4xextended_error_logging, int, S_IRUGO | S_IWUSR); 51MODULE_PARM_DESC(ql4xextended_error_logging, 52 " Option to enable extended error logging.\n" 53 "\t\t 0 - no logging (Default)\n" 54 "\t\t 2 - debug logging"); 55 56int ql4xenablemsix = 1; 57module_param(ql4xenablemsix, int, S_IRUGO|S_IWUSR); 58MODULE_PARM_DESC(ql4xenablemsix, 59 " Set to enable MSI or MSI-X interrupt mechanism.\n" 60 "\t\t 0 = enable INTx interrupt mechanism.\n" 61 "\t\t 1 = enable MSI-X interrupt mechanism (Default).\n" 62 "\t\t 2 = enable MSI interrupt mechanism."); 63 64#define QL4_DEF_QDEPTH 32 65static int ql4xmaxqdepth = QL4_DEF_QDEPTH; 66module_param(ql4xmaxqdepth, int, S_IRUGO | S_IWUSR); 67MODULE_PARM_DESC(ql4xmaxqdepth, 68 " Maximum queue depth to report for target devices.\n" 69 "\t\t Default: 32."); 70 71static int ql4xqfulltracking = 1; 72module_param(ql4xqfulltracking, int, S_IRUGO | S_IWUSR); 73MODULE_PARM_DESC(ql4xqfulltracking, 74 " Enable or disable dynamic tracking and adjustment of\n" 75 "\t\t scsi device queue depth.\n" 76 "\t\t 0 - Disable.\n" 77 "\t\t 1 - Enable. (Default)"); 78 79static int ql4xsess_recovery_tmo = QL4_SESS_RECOVERY_TMO; 80module_param(ql4xsess_recovery_tmo, int, S_IRUGO); 81MODULE_PARM_DESC(ql4xsess_recovery_tmo, 82 " Target Session Recovery Timeout.\n" 83 "\t\t Default: 120 sec."); 84 85int ql4xmdcapmask = 0; 86module_param(ql4xmdcapmask, int, S_IRUGO); 87MODULE_PARM_DESC(ql4xmdcapmask, 88 " Set the Minidump driver capture mask level.\n" 89 "\t\t Default is 0 (firmware default capture mask)\n" 90 "\t\t Can be set to 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF"); 91 92int ql4xenablemd = 1; 93module_param(ql4xenablemd, int, S_IRUGO | S_IWUSR); 94MODULE_PARM_DESC(ql4xenablemd, 95 " Set to enable minidump.\n" 96 "\t\t 0 - disable minidump\n" 97 "\t\t 1 - enable minidump (Default)"); 98 99static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha); 100/* 101 * SCSI host template entry points 102 */ 103static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha); 104 105/* 106 * iSCSI template entry points 107 */ 108static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess, 109 enum iscsi_param param, char *buf); 110static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn, 111 enum iscsi_param param, char *buf); 112static int qla4xxx_host_get_param(struct Scsi_Host *shost, 113 enum iscsi_host_param param, char *buf); 114static int qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data, 115 uint32_t len); 116static int qla4xxx_get_iface_param(struct iscsi_iface *iface, 117 enum iscsi_param_type param_type, 118 int param, char *buf); 119static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc); 120static struct iscsi_endpoint *qla4xxx_ep_connect(struct Scsi_Host *shost, 121 struct sockaddr *dst_addr, 122 int non_blocking); 123static int qla4xxx_ep_poll(struct iscsi_endpoint *ep, int timeout_ms); 124static void qla4xxx_ep_disconnect(struct iscsi_endpoint *ep); 125static int qla4xxx_get_ep_param(struct iscsi_endpoint *ep, 126 enum iscsi_param param, char *buf); 127static int qla4xxx_conn_start(struct iscsi_cls_conn *conn); 128static struct iscsi_cls_conn * 129qla4xxx_conn_create(struct iscsi_cls_session *cls_sess, uint32_t conn_idx); 130static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session, 131 struct iscsi_cls_conn *cls_conn, 132 uint64_t transport_fd, int is_leading); 133static void qla4xxx_conn_destroy(struct iscsi_cls_conn *conn); 134static struct iscsi_cls_session * 135qla4xxx_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max, 136 uint16_t qdepth, uint32_t initial_cmdsn); 137static void qla4xxx_session_destroy(struct iscsi_cls_session *sess); 138static void qla4xxx_task_work(struct work_struct *wdata); 139static int qla4xxx_alloc_pdu(struct iscsi_task *, uint8_t); 140static int qla4xxx_task_xmit(struct iscsi_task *); 141static void qla4xxx_task_cleanup(struct iscsi_task *); 142static void qla4xxx_fail_session(struct iscsi_cls_session *cls_session); 143static void qla4xxx_conn_get_stats(struct iscsi_cls_conn *cls_conn, 144 struct iscsi_stats *stats); 145static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num, 146 uint32_t iface_type, uint32_t payload_size, 147 uint32_t pid, struct sockaddr *dst_addr); 148static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx, 149 uint32_t *num_entries, char *buf); 150static int qla4xxx_delete_chap(struct Scsi_Host *shost, uint16_t chap_tbl_idx); 151static int qla4xxx_set_chap_entry(struct Scsi_Host *shost, void *data, 152 int len); 153static int qla4xxx_get_host_stats(struct Scsi_Host *shost, char *buf, int len); 154 155/* 156 * SCSI host template entry points 157 */ 158static int qla4xxx_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *cmd); 159static int qla4xxx_eh_abort(struct scsi_cmnd *cmd); 160static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd); 161static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd); 162static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd); 163static int qla4xxx_slave_alloc(struct scsi_device *device); 164static umode_t qla4_attr_is_visible(int param_type, int param); 165static int qla4xxx_host_reset(struct Scsi_Host *shost, int reset_type); 166 167/* 168 * iSCSI Flash DDB sysfs entry points 169 */ 170static int 171qla4xxx_sysfs_ddb_set_param(struct iscsi_bus_flash_session *fnode_sess, 172 struct iscsi_bus_flash_conn *fnode_conn, 173 void *data, int len); 174static int 175qla4xxx_sysfs_ddb_get_param(struct iscsi_bus_flash_session *fnode_sess, 176 int param, char *buf); 177static int qla4xxx_sysfs_ddb_add(struct Scsi_Host *shost, const char *buf, 178 int len); 179static int 180qla4xxx_sysfs_ddb_delete(struct iscsi_bus_flash_session *fnode_sess); 181static int qla4xxx_sysfs_ddb_login(struct iscsi_bus_flash_session *fnode_sess, 182 struct iscsi_bus_flash_conn *fnode_conn); 183static int qla4xxx_sysfs_ddb_logout(struct iscsi_bus_flash_session *fnode_sess, 184 struct iscsi_bus_flash_conn *fnode_conn); 185static int qla4xxx_sysfs_ddb_logout_sid(struct iscsi_cls_session *cls_sess); 186 187static struct qla4_8xxx_legacy_intr_set legacy_intr[] = 188 QLA82XX_LEGACY_INTR_CONFIG; 189 190static const uint32_t qla4_82xx_reg_tbl[] = { 191 QLA82XX_PEG_HALT_STATUS1, 192 QLA82XX_PEG_HALT_STATUS2, 193 QLA82XX_PEG_ALIVE_COUNTER, 194 QLA82XX_CRB_DRV_ACTIVE, 195 QLA82XX_CRB_DEV_STATE, 196 QLA82XX_CRB_DRV_STATE, 197 QLA82XX_CRB_DRV_SCRATCH, 198 QLA82XX_CRB_DEV_PART_INFO, 199 QLA82XX_CRB_DRV_IDC_VERSION, 200 QLA82XX_FW_VERSION_MAJOR, 201 QLA82XX_FW_VERSION_MINOR, 202 QLA82XX_FW_VERSION_SUB, 203 CRB_CMDPEG_STATE, 204 CRB_TEMP_STATE, 205}; 206 207static const uint32_t qla4_83xx_reg_tbl[] = { 208 QLA83XX_PEG_HALT_STATUS1, 209 QLA83XX_PEG_HALT_STATUS2, 210 QLA83XX_PEG_ALIVE_COUNTER, 211 QLA83XX_CRB_DRV_ACTIVE, 212 QLA83XX_CRB_DEV_STATE, 213 QLA83XX_CRB_DRV_STATE, 214 QLA83XX_CRB_DRV_SCRATCH, 215 QLA83XX_CRB_DEV_PART_INFO1, 216 QLA83XX_CRB_IDC_VER_MAJOR, 217 QLA83XX_FW_VER_MAJOR, 218 QLA83XX_FW_VER_MINOR, 219 QLA83XX_FW_VER_SUB, 220 QLA83XX_CMDPEG_STATE, 221 QLA83XX_ASIC_TEMP, 222}; 223 224static struct scsi_host_template qla4xxx_driver_template = { 225 .module = THIS_MODULE, 226 .name = DRIVER_NAME, 227 .proc_name = DRIVER_NAME, 228 .queuecommand = qla4xxx_queuecommand, 229 .cmd_size = sizeof(struct qla4xxx_cmd_priv), 230 231 .eh_abort_handler = qla4xxx_eh_abort, 232 .eh_device_reset_handler = qla4xxx_eh_device_reset, 233 .eh_target_reset_handler = qla4xxx_eh_target_reset, 234 .eh_host_reset_handler = qla4xxx_eh_host_reset, 235 .eh_timed_out = qla4xxx_eh_cmd_timed_out, 236 237 .slave_alloc = qla4xxx_slave_alloc, 238 .change_queue_depth = scsi_change_queue_depth, 239 240 .this_id = -1, 241 .cmd_per_lun = 3, 242 .sg_tablesize = SG_ALL, 243 244 .max_sectors = 0xFFFF, 245 .shost_groups = qla4xxx_host_groups, 246 .host_reset = qla4xxx_host_reset, 247 .vendor_id = SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_QLOGIC, 248}; 249 250static struct iscsi_transport qla4xxx_iscsi_transport = { 251 .owner = THIS_MODULE, 252 .name = DRIVER_NAME, 253 .caps = CAP_TEXT_NEGO | 254 CAP_DATA_PATH_OFFLOAD | CAP_HDRDGST | 255 CAP_DATADGST | CAP_LOGIN_OFFLOAD | 256 CAP_MULTI_R2T, 257 .attr_is_visible = qla4_attr_is_visible, 258 .create_session = qla4xxx_session_create, 259 .destroy_session = qla4xxx_session_destroy, 260 .start_conn = qla4xxx_conn_start, 261 .create_conn = qla4xxx_conn_create, 262 .bind_conn = qla4xxx_conn_bind, 263 .unbind_conn = iscsi_conn_unbind, 264 .stop_conn = iscsi_conn_stop, 265 .destroy_conn = qla4xxx_conn_destroy, 266 .set_param = iscsi_set_param, 267 .get_conn_param = qla4xxx_conn_get_param, 268 .get_session_param = qla4xxx_session_get_param, 269 .get_ep_param = qla4xxx_get_ep_param, 270 .ep_connect = qla4xxx_ep_connect, 271 .ep_poll = qla4xxx_ep_poll, 272 .ep_disconnect = qla4xxx_ep_disconnect, 273 .get_stats = qla4xxx_conn_get_stats, 274 .send_pdu = iscsi_conn_send_pdu, 275 .xmit_task = qla4xxx_task_xmit, 276 .cleanup_task = qla4xxx_task_cleanup, 277 .alloc_pdu = qla4xxx_alloc_pdu, 278 279 .get_host_param = qla4xxx_host_get_param, 280 .set_iface_param = qla4xxx_iface_set_param, 281 .get_iface_param = qla4xxx_get_iface_param, 282 .bsg_request = qla4xxx_bsg_request, 283 .send_ping = qla4xxx_send_ping, 284 .get_chap = qla4xxx_get_chap_list, 285 .delete_chap = qla4xxx_delete_chap, 286 .set_chap = qla4xxx_set_chap_entry, 287 .get_flashnode_param = qla4xxx_sysfs_ddb_get_param, 288 .set_flashnode_param = qla4xxx_sysfs_ddb_set_param, 289 .new_flashnode = qla4xxx_sysfs_ddb_add, 290 .del_flashnode = qla4xxx_sysfs_ddb_delete, 291 .login_flashnode = qla4xxx_sysfs_ddb_login, 292 .logout_flashnode = qla4xxx_sysfs_ddb_logout, 293 .logout_flashnode_sid = qla4xxx_sysfs_ddb_logout_sid, 294 .get_host_stats = qla4xxx_get_host_stats, 295}; 296 297static struct scsi_transport_template *qla4xxx_scsi_transport; 298 299static int qla4xxx_isp_check_reg(struct scsi_qla_host *ha) 300{ 301 u32 reg_val = 0; 302 int rval = QLA_SUCCESS; 303 304 if (is_qla8022(ha)) 305 reg_val = readl(&ha->qla4_82xx_reg->host_status); 306 else if (is_qla8032(ha) || is_qla8042(ha)) 307 reg_val = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_ALIVE_COUNTER); 308 else 309 reg_val = readw(&ha->reg->ctrl_status); 310 311 if (reg_val == QL4_ISP_REG_DISCONNECT) 312 rval = QLA_ERROR; 313 314 return rval; 315} 316 317static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num, 318 uint32_t iface_type, uint32_t payload_size, 319 uint32_t pid, struct sockaddr *dst_addr) 320{ 321 struct scsi_qla_host *ha = to_qla_host(shost); 322 struct sockaddr_in *addr; 323 struct sockaddr_in6 *addr6; 324 uint32_t options = 0; 325 uint8_t ipaddr[IPv6_ADDR_LEN]; 326 int rval; 327 328 memset(ipaddr, 0, IPv6_ADDR_LEN); 329 /* IPv4 to IPv4 */ 330 if ((iface_type == ISCSI_IFACE_TYPE_IPV4) && 331 (dst_addr->sa_family == AF_INET)) { 332 addr = (struct sockaddr_in *)dst_addr; 333 memcpy(ipaddr, &addr->sin_addr.s_addr, IP_ADDR_LEN); 334 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv4 Ping src: %pI4 " 335 "dest: %pI4\n", __func__, 336 &ha->ip_config.ip_address, ipaddr)); 337 rval = qla4xxx_ping_iocb(ha, options, payload_size, pid, 338 ipaddr); 339 if (rval) 340 rval = -EINVAL; 341 } else if ((iface_type == ISCSI_IFACE_TYPE_IPV6) && 342 (dst_addr->sa_family == AF_INET6)) { 343 /* IPv6 to IPv6 */ 344 addr6 = (struct sockaddr_in6 *)dst_addr; 345 memcpy(ipaddr, &addr6->sin6_addr.in6_u.u6_addr8, IPv6_ADDR_LEN); 346 347 options |= PING_IPV6_PROTOCOL_ENABLE; 348 349 /* Ping using LinkLocal address */ 350 if ((iface_num == 0) || (iface_num == 1)) { 351 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: LinkLocal Ping " 352 "src: %pI6 dest: %pI6\n", __func__, 353 &ha->ip_config.ipv6_link_local_addr, 354 ipaddr)); 355 options |= PING_IPV6_LINKLOCAL_ADDR; 356 rval = qla4xxx_ping_iocb(ha, options, payload_size, 357 pid, ipaddr); 358 } else { 359 ql4_printk(KERN_WARNING, ha, "%s: iface num = %d " 360 "not supported\n", __func__, iface_num); 361 rval = -ENOSYS; 362 goto exit_send_ping; 363 } 364 365 /* 366 * If ping using LinkLocal address fails, try ping using 367 * IPv6 address 368 */ 369 if (rval != QLA_SUCCESS) { 370 options &= ~PING_IPV6_LINKLOCAL_ADDR; 371 if (iface_num == 0) { 372 options |= PING_IPV6_ADDR0; 373 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " 374 "Ping src: %pI6 " 375 "dest: %pI6\n", __func__, 376 &ha->ip_config.ipv6_addr0, 377 ipaddr)); 378 } else if (iface_num == 1) { 379 options |= PING_IPV6_ADDR1; 380 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " 381 "Ping src: %pI6 " 382 "dest: %pI6\n", __func__, 383 &ha->ip_config.ipv6_addr1, 384 ipaddr)); 385 } 386 rval = qla4xxx_ping_iocb(ha, options, payload_size, 387 pid, ipaddr); 388 if (rval) 389 rval = -EINVAL; 390 } 391 } else 392 rval = -ENOSYS; 393exit_send_ping: 394 return rval; 395} 396 397static umode_t qla4_attr_is_visible(int param_type, int param) 398{ 399 switch (param_type) { 400 case ISCSI_HOST_PARAM: 401 switch (param) { 402 case ISCSI_HOST_PARAM_HWADDRESS: 403 case ISCSI_HOST_PARAM_IPADDRESS: 404 case ISCSI_HOST_PARAM_INITIATOR_NAME: 405 case ISCSI_HOST_PARAM_PORT_STATE: 406 case ISCSI_HOST_PARAM_PORT_SPEED: 407 return S_IRUGO; 408 default: 409 return 0; 410 } 411 case ISCSI_PARAM: 412 switch (param) { 413 case ISCSI_PARAM_PERSISTENT_ADDRESS: 414 case ISCSI_PARAM_PERSISTENT_PORT: 415 case ISCSI_PARAM_CONN_ADDRESS: 416 case ISCSI_PARAM_CONN_PORT: 417 case ISCSI_PARAM_TARGET_NAME: 418 case ISCSI_PARAM_TPGT: 419 case ISCSI_PARAM_TARGET_ALIAS: 420 case ISCSI_PARAM_MAX_BURST: 421 case ISCSI_PARAM_MAX_R2T: 422 case ISCSI_PARAM_FIRST_BURST: 423 case ISCSI_PARAM_MAX_RECV_DLENGTH: 424 case ISCSI_PARAM_MAX_XMIT_DLENGTH: 425 case ISCSI_PARAM_IFACE_NAME: 426 case ISCSI_PARAM_CHAP_OUT_IDX: 427 case ISCSI_PARAM_CHAP_IN_IDX: 428 case ISCSI_PARAM_USERNAME: 429 case ISCSI_PARAM_PASSWORD: 430 case ISCSI_PARAM_USERNAME_IN: 431 case ISCSI_PARAM_PASSWORD_IN: 432 case ISCSI_PARAM_AUTO_SND_TGT_DISABLE: 433 case ISCSI_PARAM_DISCOVERY_SESS: 434 case ISCSI_PARAM_PORTAL_TYPE: 435 case ISCSI_PARAM_CHAP_AUTH_EN: 436 case ISCSI_PARAM_DISCOVERY_LOGOUT_EN: 437 case ISCSI_PARAM_BIDI_CHAP_EN: 438 case ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL: 439 case ISCSI_PARAM_DEF_TIME2WAIT: 440 case ISCSI_PARAM_DEF_TIME2RETAIN: 441 case ISCSI_PARAM_HDRDGST_EN: 442 case ISCSI_PARAM_DATADGST_EN: 443 case ISCSI_PARAM_INITIAL_R2T_EN: 444 case ISCSI_PARAM_IMM_DATA_EN: 445 case ISCSI_PARAM_PDU_INORDER_EN: 446 case ISCSI_PARAM_DATASEQ_INORDER_EN: 447 case ISCSI_PARAM_MAX_SEGMENT_SIZE: 448 case ISCSI_PARAM_TCP_TIMESTAMP_STAT: 449 case ISCSI_PARAM_TCP_WSF_DISABLE: 450 case ISCSI_PARAM_TCP_NAGLE_DISABLE: 451 case ISCSI_PARAM_TCP_TIMER_SCALE: 452 case ISCSI_PARAM_TCP_TIMESTAMP_EN: 453 case ISCSI_PARAM_TCP_XMIT_WSF: 454 case ISCSI_PARAM_TCP_RECV_WSF: 455 case ISCSI_PARAM_IP_FRAGMENT_DISABLE: 456 case ISCSI_PARAM_IPV4_TOS: 457 case ISCSI_PARAM_IPV6_TC: 458 case ISCSI_PARAM_IPV6_FLOW_LABEL: 459 case ISCSI_PARAM_IS_FW_ASSIGNED_IPV6: 460 case ISCSI_PARAM_KEEPALIVE_TMO: 461 case ISCSI_PARAM_LOCAL_PORT: 462 case ISCSI_PARAM_ISID: 463 case ISCSI_PARAM_TSID: 464 case ISCSI_PARAM_DEF_TASKMGMT_TMO: 465 case ISCSI_PARAM_ERL: 466 case ISCSI_PARAM_STATSN: 467 case ISCSI_PARAM_EXP_STATSN: 468 case ISCSI_PARAM_DISCOVERY_PARENT_IDX: 469 case ISCSI_PARAM_DISCOVERY_PARENT_TYPE: 470 case ISCSI_PARAM_LOCAL_IPADDR: 471 return S_IRUGO; 472 default: 473 return 0; 474 } 475 case ISCSI_NET_PARAM: 476 switch (param) { 477 case ISCSI_NET_PARAM_IPV4_ADDR: 478 case ISCSI_NET_PARAM_IPV4_SUBNET: 479 case ISCSI_NET_PARAM_IPV4_GW: 480 case ISCSI_NET_PARAM_IPV4_BOOTPROTO: 481 case ISCSI_NET_PARAM_IFACE_ENABLE: 482 case ISCSI_NET_PARAM_IPV6_LINKLOCAL: 483 case ISCSI_NET_PARAM_IPV6_ADDR: 484 case ISCSI_NET_PARAM_IPV6_ROUTER: 485 case ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG: 486 case ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG: 487 case ISCSI_NET_PARAM_VLAN_ID: 488 case ISCSI_NET_PARAM_VLAN_PRIORITY: 489 case ISCSI_NET_PARAM_VLAN_ENABLED: 490 case ISCSI_NET_PARAM_MTU: 491 case ISCSI_NET_PARAM_PORT: 492 case ISCSI_NET_PARAM_IPADDR_STATE: 493 case ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE: 494 case ISCSI_NET_PARAM_IPV6_ROUTER_STATE: 495 case ISCSI_NET_PARAM_DELAYED_ACK_EN: 496 case ISCSI_NET_PARAM_TCP_NAGLE_DISABLE: 497 case ISCSI_NET_PARAM_TCP_WSF_DISABLE: 498 case ISCSI_NET_PARAM_TCP_WSF: 499 case ISCSI_NET_PARAM_TCP_TIMER_SCALE: 500 case ISCSI_NET_PARAM_TCP_TIMESTAMP_EN: 501 case ISCSI_NET_PARAM_CACHE_ID: 502 case ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN: 503 case ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN: 504 case ISCSI_NET_PARAM_IPV4_TOS_EN: 505 case ISCSI_NET_PARAM_IPV4_TOS: 506 case ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN: 507 case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN: 508 case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID: 509 case ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN: 510 case ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN: 511 case ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID: 512 case ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN: 513 case ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE: 514 case ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN: 515 case ISCSI_NET_PARAM_REDIRECT_EN: 516 case ISCSI_NET_PARAM_IPV4_TTL: 517 case ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN: 518 case ISCSI_NET_PARAM_IPV6_MLD_EN: 519 case ISCSI_NET_PARAM_IPV6_FLOW_LABEL: 520 case ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS: 521 case ISCSI_NET_PARAM_IPV6_HOP_LIMIT: 522 case ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO: 523 case ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME: 524 case ISCSI_NET_PARAM_IPV6_ND_STALE_TMO: 525 case ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT: 526 case ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU: 527 return S_IRUGO; 528 default: 529 return 0; 530 } 531 case ISCSI_IFACE_PARAM: 532 switch (param) { 533 case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO: 534 case ISCSI_IFACE_PARAM_HDRDGST_EN: 535 case ISCSI_IFACE_PARAM_DATADGST_EN: 536 case ISCSI_IFACE_PARAM_IMM_DATA_EN: 537 case ISCSI_IFACE_PARAM_INITIAL_R2T_EN: 538 case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN: 539 case ISCSI_IFACE_PARAM_PDU_INORDER_EN: 540 case ISCSI_IFACE_PARAM_ERL: 541 case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH: 542 case ISCSI_IFACE_PARAM_FIRST_BURST: 543 case ISCSI_IFACE_PARAM_MAX_R2T: 544 case ISCSI_IFACE_PARAM_MAX_BURST: 545 case ISCSI_IFACE_PARAM_CHAP_AUTH_EN: 546 case ISCSI_IFACE_PARAM_BIDI_CHAP_EN: 547 case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL: 548 case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN: 549 case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN: 550 case ISCSI_IFACE_PARAM_INITIATOR_NAME: 551 return S_IRUGO; 552 default: 553 return 0; 554 } 555 case ISCSI_FLASHNODE_PARAM: 556 switch (param) { 557 case ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6: 558 case ISCSI_FLASHNODE_PORTAL_TYPE: 559 case ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE: 560 case ISCSI_FLASHNODE_DISCOVERY_SESS: 561 case ISCSI_FLASHNODE_ENTRY_EN: 562 case ISCSI_FLASHNODE_HDR_DGST_EN: 563 case ISCSI_FLASHNODE_DATA_DGST_EN: 564 case ISCSI_FLASHNODE_IMM_DATA_EN: 565 case ISCSI_FLASHNODE_INITIAL_R2T_EN: 566 case ISCSI_FLASHNODE_DATASEQ_INORDER: 567 case ISCSI_FLASHNODE_PDU_INORDER: 568 case ISCSI_FLASHNODE_CHAP_AUTH_EN: 569 case ISCSI_FLASHNODE_SNACK_REQ_EN: 570 case ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN: 571 case ISCSI_FLASHNODE_BIDI_CHAP_EN: 572 case ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL: 573 case ISCSI_FLASHNODE_ERL: 574 case ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT: 575 case ISCSI_FLASHNODE_TCP_NAGLE_DISABLE: 576 case ISCSI_FLASHNODE_TCP_WSF_DISABLE: 577 case ISCSI_FLASHNODE_TCP_TIMER_SCALE: 578 case ISCSI_FLASHNODE_TCP_TIMESTAMP_EN: 579 case ISCSI_FLASHNODE_IP_FRAG_DISABLE: 580 case ISCSI_FLASHNODE_MAX_RECV_DLENGTH: 581 case ISCSI_FLASHNODE_MAX_XMIT_DLENGTH: 582 case ISCSI_FLASHNODE_FIRST_BURST: 583 case ISCSI_FLASHNODE_DEF_TIME2WAIT: 584 case ISCSI_FLASHNODE_DEF_TIME2RETAIN: 585 case ISCSI_FLASHNODE_MAX_R2T: 586 case ISCSI_FLASHNODE_KEEPALIVE_TMO: 587 case ISCSI_FLASHNODE_ISID: 588 case ISCSI_FLASHNODE_TSID: 589 case ISCSI_FLASHNODE_PORT: 590 case ISCSI_FLASHNODE_MAX_BURST: 591 case ISCSI_FLASHNODE_DEF_TASKMGMT_TMO: 592 case ISCSI_FLASHNODE_IPADDR: 593 case ISCSI_FLASHNODE_ALIAS: 594 case ISCSI_FLASHNODE_REDIRECT_IPADDR: 595 case ISCSI_FLASHNODE_MAX_SEGMENT_SIZE: 596 case ISCSI_FLASHNODE_LOCAL_PORT: 597 case ISCSI_FLASHNODE_IPV4_TOS: 598 case ISCSI_FLASHNODE_IPV6_TC: 599 case ISCSI_FLASHNODE_IPV6_FLOW_LABEL: 600 case ISCSI_FLASHNODE_NAME: 601 case ISCSI_FLASHNODE_TPGT: 602 case ISCSI_FLASHNODE_LINK_LOCAL_IPV6: 603 case ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX: 604 case ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE: 605 case ISCSI_FLASHNODE_TCP_XMIT_WSF: 606 case ISCSI_FLASHNODE_TCP_RECV_WSF: 607 case ISCSI_FLASHNODE_CHAP_OUT_IDX: 608 case ISCSI_FLASHNODE_USERNAME: 609 case ISCSI_FLASHNODE_PASSWORD: 610 case ISCSI_FLASHNODE_STATSN: 611 case ISCSI_FLASHNODE_EXP_STATSN: 612 case ISCSI_FLASHNODE_IS_BOOT_TGT: 613 return S_IRUGO; 614 default: 615 return 0; 616 } 617 } 618 619 return 0; 620} 621 622/** 623 * qla4xxx_create_chap_list - Create CHAP list from FLASH 624 * @ha: pointer to adapter structure 625 * 626 * Read flash and make a list of CHAP entries, during login when a CHAP entry 627 * is received, it will be checked in this list. If entry exist then the CHAP 628 * entry index is set in the DDB. If CHAP entry does not exist in this list 629 * then a new entry is added in FLASH in CHAP table and the index obtained is 630 * used in the DDB. 631 **/ 632static void qla4xxx_create_chap_list(struct scsi_qla_host *ha) 633{ 634 int rval = 0; 635 uint8_t *chap_flash_data = NULL; 636 uint32_t offset; 637 dma_addr_t chap_dma; 638 uint32_t chap_size = 0; 639 640 if (is_qla40XX(ha)) 641 chap_size = MAX_CHAP_ENTRIES_40XX * 642 sizeof(struct ql4_chap_table); 643 else /* Single region contains CHAP info for both 644 * ports which is divided into half for each port. 645 */ 646 chap_size = ha->hw.flt_chap_size / 2; 647 648 chap_flash_data = dma_alloc_coherent(&ha->pdev->dev, chap_size, 649 &chap_dma, GFP_KERNEL); 650 if (!chap_flash_data) { 651 ql4_printk(KERN_ERR, ha, "No memory for chap_flash_data\n"); 652 return; 653 } 654 655 if (is_qla40XX(ha)) { 656 offset = FLASH_CHAP_OFFSET; 657 } else { 658 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); 659 if (ha->port_num == 1) 660 offset += chap_size; 661 } 662 663 rval = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); 664 if (rval != QLA_SUCCESS) 665 goto exit_chap_list; 666 667 if (ha->chap_list == NULL) 668 ha->chap_list = vmalloc(chap_size); 669 if (ha->chap_list == NULL) { 670 ql4_printk(KERN_ERR, ha, "No memory for ha->chap_list\n"); 671 goto exit_chap_list; 672 } 673 674 memcpy(ha->chap_list, chap_flash_data, chap_size); 675 676exit_chap_list: 677 dma_free_coherent(&ha->pdev->dev, chap_size, chap_flash_data, chap_dma); 678} 679 680static int qla4xxx_get_chap_by_index(struct scsi_qla_host *ha, 681 int16_t chap_index, 682 struct ql4_chap_table **chap_entry) 683{ 684 int rval = QLA_ERROR; 685 int max_chap_entries; 686 687 if (!ha->chap_list) { 688 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); 689 goto exit_get_chap; 690 } 691 692 if (is_qla80XX(ha)) 693 max_chap_entries = (ha->hw.flt_chap_size / 2) / 694 sizeof(struct ql4_chap_table); 695 else 696 max_chap_entries = MAX_CHAP_ENTRIES_40XX; 697 698 if (chap_index > max_chap_entries) { 699 ql4_printk(KERN_ERR, ha, "Invalid Chap index\n"); 700 goto exit_get_chap; 701 } 702 703 *chap_entry = (struct ql4_chap_table *)ha->chap_list + chap_index; 704 if ((*chap_entry)->cookie != 705 cpu_to_le16(CHAP_VALID_COOKIE)) { 706 *chap_entry = NULL; 707 } else { 708 rval = QLA_SUCCESS; 709 } 710 711exit_get_chap: 712 return rval; 713} 714 715/** 716 * qla4xxx_find_free_chap_index - Find the first free chap index 717 * @ha: pointer to adapter structure 718 * @chap_index: CHAP index to be returned 719 * 720 * Find the first free chap index available in the chap table 721 * 722 * Note: Caller should acquire the chap lock before getting here. 723 **/ 724static int qla4xxx_find_free_chap_index(struct scsi_qla_host *ha, 725 uint16_t *chap_index) 726{ 727 int i, rval; 728 int free_index = -1; 729 int max_chap_entries = 0; 730 struct ql4_chap_table *chap_table; 731 732 if (is_qla80XX(ha)) 733 max_chap_entries = (ha->hw.flt_chap_size / 2) / 734 sizeof(struct ql4_chap_table); 735 else 736 max_chap_entries = MAX_CHAP_ENTRIES_40XX; 737 738 if (!ha->chap_list) { 739 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); 740 rval = QLA_ERROR; 741 goto exit_find_chap; 742 } 743 744 for (i = 0; i < max_chap_entries; i++) { 745 chap_table = (struct ql4_chap_table *)ha->chap_list + i; 746 747 if ((chap_table->cookie != 748 cpu_to_le16(CHAP_VALID_COOKIE)) && 749 (i > MAX_RESRV_CHAP_IDX)) { 750 free_index = i; 751 break; 752 } 753 } 754 755 if (free_index != -1) { 756 *chap_index = free_index; 757 rval = QLA_SUCCESS; 758 } else { 759 rval = QLA_ERROR; 760 } 761 762exit_find_chap: 763 return rval; 764} 765 766static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx, 767 uint32_t *num_entries, char *buf) 768{ 769 struct scsi_qla_host *ha = to_qla_host(shost); 770 struct ql4_chap_table *chap_table; 771 struct iscsi_chap_rec *chap_rec; 772 int max_chap_entries = 0; 773 int valid_chap_entries = 0; 774 int ret = 0, i; 775 776 if (is_qla80XX(ha)) 777 max_chap_entries = (ha->hw.flt_chap_size / 2) / 778 sizeof(struct ql4_chap_table); 779 else 780 max_chap_entries = MAX_CHAP_ENTRIES_40XX; 781 782 ql4_printk(KERN_INFO, ha, "%s: num_entries = %d, CHAP idx = %d\n", 783 __func__, *num_entries, chap_tbl_idx); 784 785 if (!buf) { 786 ret = -ENOMEM; 787 goto exit_get_chap_list; 788 } 789 790 qla4xxx_create_chap_list(ha); 791 792 chap_rec = (struct iscsi_chap_rec *) buf; 793 mutex_lock(&ha->chap_sem); 794 for (i = chap_tbl_idx; i < max_chap_entries; i++) { 795 chap_table = (struct ql4_chap_table *)ha->chap_list + i; 796 if (chap_table->cookie != 797 cpu_to_le16(CHAP_VALID_COOKIE)) 798 continue; 799 800 chap_rec->chap_tbl_idx = i; 801 strlcpy(chap_rec->username, chap_table->name, 802 ISCSI_CHAP_AUTH_NAME_MAX_LEN); 803 strlcpy(chap_rec->password, chap_table->secret, 804 QL4_CHAP_MAX_SECRET_LEN); 805 chap_rec->password_length = chap_table->secret_len; 806 807 if (chap_table->flags & BIT_7) /* local */ 808 chap_rec->chap_type = CHAP_TYPE_OUT; 809 810 if (chap_table->flags & BIT_6) /* peer */ 811 chap_rec->chap_type = CHAP_TYPE_IN; 812 813 chap_rec++; 814 815 valid_chap_entries++; 816 if (valid_chap_entries == *num_entries) 817 break; 818 } 819 mutex_unlock(&ha->chap_sem); 820 821exit_get_chap_list: 822 ql4_printk(KERN_INFO, ha, "%s: Valid CHAP Entries = %d\n", 823 __func__, valid_chap_entries); 824 *num_entries = valid_chap_entries; 825 return ret; 826} 827 828static int __qla4xxx_is_chap_active(struct device *dev, void *data) 829{ 830 int ret = 0; 831 uint16_t *chap_tbl_idx = (uint16_t *) data; 832 struct iscsi_cls_session *cls_session; 833 struct iscsi_session *sess; 834 struct ddb_entry *ddb_entry; 835 836 if (!iscsi_is_session_dev(dev)) 837 goto exit_is_chap_active; 838 839 cls_session = iscsi_dev_to_session(dev); 840 sess = cls_session->dd_data; 841 ddb_entry = sess->dd_data; 842 843 if (iscsi_is_session_online(cls_session)) 844 goto exit_is_chap_active; 845 846 if (ddb_entry->chap_tbl_idx == *chap_tbl_idx) 847 ret = 1; 848 849exit_is_chap_active: 850 return ret; 851} 852 853static int qla4xxx_is_chap_active(struct Scsi_Host *shost, 854 uint16_t chap_tbl_idx) 855{ 856 int ret = 0; 857 858 ret = device_for_each_child(&shost->shost_gendev, &chap_tbl_idx, 859 __qla4xxx_is_chap_active); 860 861 return ret; 862} 863 864static int qla4xxx_delete_chap(struct Scsi_Host *shost, uint16_t chap_tbl_idx) 865{ 866 struct scsi_qla_host *ha = to_qla_host(shost); 867 struct ql4_chap_table *chap_table; 868 dma_addr_t chap_dma; 869 int max_chap_entries = 0; 870 uint32_t offset = 0; 871 uint32_t chap_size; 872 int ret = 0; 873 874 chap_table = dma_pool_zalloc(ha->chap_dma_pool, GFP_KERNEL, &chap_dma); 875 if (chap_table == NULL) 876 return -ENOMEM; 877 878 if (is_qla80XX(ha)) 879 max_chap_entries = (ha->hw.flt_chap_size / 2) / 880 sizeof(struct ql4_chap_table); 881 else 882 max_chap_entries = MAX_CHAP_ENTRIES_40XX; 883 884 if (chap_tbl_idx > max_chap_entries) { 885 ret = -EINVAL; 886 goto exit_delete_chap; 887 } 888 889 /* Check if chap index is in use. 890 * If chap is in use don't delet chap entry */ 891 ret = qla4xxx_is_chap_active(shost, chap_tbl_idx); 892 if (ret) { 893 ql4_printk(KERN_INFO, ha, "CHAP entry %d is in use, cannot " 894 "delete from flash\n", chap_tbl_idx); 895 ret = -EBUSY; 896 goto exit_delete_chap; 897 } 898 899 chap_size = sizeof(struct ql4_chap_table); 900 if (is_qla40XX(ha)) 901 offset = FLASH_CHAP_OFFSET | (chap_tbl_idx * chap_size); 902 else { 903 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); 904 /* flt_chap_size is CHAP table size for both ports 905 * so divide it by 2 to calculate the offset for second port 906 */ 907 if (ha->port_num == 1) 908 offset += (ha->hw.flt_chap_size / 2); 909 offset += (chap_tbl_idx * chap_size); 910 } 911 912 ret = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); 913 if (ret != QLA_SUCCESS) { 914 ret = -EINVAL; 915 goto exit_delete_chap; 916 } 917 918 DEBUG2(ql4_printk(KERN_INFO, ha, "Chap Cookie: x%x\n", 919 __le16_to_cpu(chap_table->cookie))); 920 921 if (__le16_to_cpu(chap_table->cookie) != CHAP_VALID_COOKIE) { 922 ql4_printk(KERN_ERR, ha, "No valid chap entry found\n"); 923 goto exit_delete_chap; 924 } 925 926 chap_table->cookie = cpu_to_le16(0xFFFF); 927 928 offset = FLASH_CHAP_OFFSET | 929 (chap_tbl_idx * sizeof(struct ql4_chap_table)); 930 ret = qla4xxx_set_flash(ha, chap_dma, offset, chap_size, 931 FLASH_OPT_RMW_COMMIT); 932 if (ret == QLA_SUCCESS && ha->chap_list) { 933 mutex_lock(&ha->chap_sem); 934 /* Update ha chap_list cache */ 935 memcpy((struct ql4_chap_table *)ha->chap_list + chap_tbl_idx, 936 chap_table, sizeof(struct ql4_chap_table)); 937 mutex_unlock(&ha->chap_sem); 938 } 939 if (ret != QLA_SUCCESS) 940 ret = -EINVAL; 941 942exit_delete_chap: 943 dma_pool_free(ha->chap_dma_pool, chap_table, chap_dma); 944 return ret; 945} 946 947/** 948 * qla4xxx_set_chap_entry - Make chap entry with given information 949 * @shost: pointer to host 950 * @data: chap info - credentials, index and type to make chap entry 951 * @len: length of data 952 * 953 * Add or update chap entry with the given information 954 **/ 955static int qla4xxx_set_chap_entry(struct Scsi_Host *shost, void *data, int len) 956{ 957 struct scsi_qla_host *ha = to_qla_host(shost); 958 struct iscsi_chap_rec chap_rec; 959 struct ql4_chap_table *chap_entry = NULL; 960 struct iscsi_param_info *param_info; 961 struct nlattr *attr; 962 int max_chap_entries = 0; 963 int type; 964 int rem = len; 965 int rc = 0; 966 int size; 967 968 memset(&chap_rec, 0, sizeof(chap_rec)); 969 970 nla_for_each_attr(attr, data, len, rem) { 971 param_info = nla_data(attr); 972 973 switch (param_info->param) { 974 case ISCSI_CHAP_PARAM_INDEX: 975 chap_rec.chap_tbl_idx = *(uint16_t *)param_info->value; 976 break; 977 case ISCSI_CHAP_PARAM_CHAP_TYPE: 978 chap_rec.chap_type = param_info->value[0]; 979 break; 980 case ISCSI_CHAP_PARAM_USERNAME: 981 size = min_t(size_t, sizeof(chap_rec.username), 982 param_info->len); 983 memcpy(chap_rec.username, param_info->value, size); 984 break; 985 case ISCSI_CHAP_PARAM_PASSWORD: 986 size = min_t(size_t, sizeof(chap_rec.password), 987 param_info->len); 988 memcpy(chap_rec.password, param_info->value, size); 989 break; 990 case ISCSI_CHAP_PARAM_PASSWORD_LEN: 991 chap_rec.password_length = param_info->value[0]; 992 break; 993 default: 994 ql4_printk(KERN_ERR, ha, 995 "%s: No such sysfs attribute\n", __func__); 996 rc = -ENOSYS; 997 goto exit_set_chap; 998 } 999 } 1000 1001 if (chap_rec.chap_type == CHAP_TYPE_IN) 1002 type = BIDI_CHAP; 1003 else 1004 type = LOCAL_CHAP; 1005 1006 if (is_qla80XX(ha)) 1007 max_chap_entries = (ha->hw.flt_chap_size / 2) / 1008 sizeof(struct ql4_chap_table); 1009 else 1010 max_chap_entries = MAX_CHAP_ENTRIES_40XX; 1011 1012 mutex_lock(&ha->chap_sem); 1013 if (chap_rec.chap_tbl_idx < max_chap_entries) { 1014 rc = qla4xxx_get_chap_by_index(ha, chap_rec.chap_tbl_idx, 1015 &chap_entry); 1016 if (!rc) { 1017 if (!(type == qla4xxx_get_chap_type(chap_entry))) { 1018 ql4_printk(KERN_INFO, ha, 1019 "Type mismatch for CHAP entry %d\n", 1020 chap_rec.chap_tbl_idx); 1021 rc = -EINVAL; 1022 goto exit_unlock_chap; 1023 } 1024 1025 /* If chap index is in use then don't modify it */ 1026 rc = qla4xxx_is_chap_active(shost, 1027 chap_rec.chap_tbl_idx); 1028 if (rc) { 1029 ql4_printk(KERN_INFO, ha, 1030 "CHAP entry %d is in use\n", 1031 chap_rec.chap_tbl_idx); 1032 rc = -EBUSY; 1033 goto exit_unlock_chap; 1034 } 1035 } 1036 } else { 1037 rc = qla4xxx_find_free_chap_index(ha, &chap_rec.chap_tbl_idx); 1038 if (rc) { 1039 ql4_printk(KERN_INFO, ha, "CHAP entry not available\n"); 1040 rc = -EBUSY; 1041 goto exit_unlock_chap; 1042 } 1043 } 1044 1045 rc = qla4xxx_set_chap(ha, chap_rec.username, chap_rec.password, 1046 chap_rec.chap_tbl_idx, type); 1047 1048exit_unlock_chap: 1049 mutex_unlock(&ha->chap_sem); 1050 1051exit_set_chap: 1052 return rc; 1053} 1054 1055 1056static int qla4xxx_get_host_stats(struct Scsi_Host *shost, char *buf, int len) 1057{ 1058 struct scsi_qla_host *ha = to_qla_host(shost); 1059 struct iscsi_offload_host_stats *host_stats = NULL; 1060 int host_stats_size; 1061 int ret = 0; 1062 int ddb_idx = 0; 1063 struct ql_iscsi_stats *ql_iscsi_stats = NULL; 1064 int stats_size; 1065 dma_addr_t iscsi_stats_dma; 1066 1067 DEBUG2(ql4_printk(KERN_INFO, ha, "Func: %s\n", __func__)); 1068 1069 host_stats_size = sizeof(struct iscsi_offload_host_stats); 1070 1071 if (host_stats_size != len) { 1072 ql4_printk(KERN_INFO, ha, "%s: host_stats size mismatch expected = %d, is = %d\n", 1073 __func__, len, host_stats_size); 1074 ret = -EINVAL; 1075 goto exit_host_stats; 1076 } 1077 host_stats = (struct iscsi_offload_host_stats *)buf; 1078 1079 if (!buf) { 1080 ret = -ENOMEM; 1081 goto exit_host_stats; 1082 } 1083 1084 stats_size = PAGE_ALIGN(sizeof(struct ql_iscsi_stats)); 1085 1086 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, 1087 &iscsi_stats_dma, GFP_KERNEL); 1088 if (!ql_iscsi_stats) { 1089 ql4_printk(KERN_ERR, ha, 1090 "Unable to allocate memory for iscsi stats\n"); 1091 ret = -ENOMEM; 1092 goto exit_host_stats; 1093 } 1094 1095 ret = qla4xxx_get_mgmt_data(ha, ddb_idx, stats_size, 1096 iscsi_stats_dma); 1097 if (ret != QLA_SUCCESS) { 1098 ql4_printk(KERN_ERR, ha, 1099 "Unable to retrieve iscsi stats\n"); 1100 ret = -EIO; 1101 goto exit_host_stats; 1102 } 1103 host_stats->mactx_frames = le64_to_cpu(ql_iscsi_stats->mac_tx_frames); 1104 host_stats->mactx_bytes = le64_to_cpu(ql_iscsi_stats->mac_tx_bytes); 1105 host_stats->mactx_multicast_frames = 1106 le64_to_cpu(ql_iscsi_stats->mac_tx_multicast_frames); 1107 host_stats->mactx_broadcast_frames = 1108 le64_to_cpu(ql_iscsi_stats->mac_tx_broadcast_frames); 1109 host_stats->mactx_pause_frames = 1110 le64_to_cpu(ql_iscsi_stats->mac_tx_pause_frames); 1111 host_stats->mactx_control_frames = 1112 le64_to_cpu(ql_iscsi_stats->mac_tx_control_frames); 1113 host_stats->mactx_deferral = 1114 le64_to_cpu(ql_iscsi_stats->mac_tx_deferral); 1115 host_stats->mactx_excess_deferral = 1116 le64_to_cpu(ql_iscsi_stats->mac_tx_excess_deferral); 1117 host_stats->mactx_late_collision = 1118 le64_to_cpu(ql_iscsi_stats->mac_tx_late_collision); 1119 host_stats->mactx_abort = le64_to_cpu(ql_iscsi_stats->mac_tx_abort); 1120 host_stats->mactx_single_collision = 1121 le64_to_cpu(ql_iscsi_stats->mac_tx_single_collision); 1122 host_stats->mactx_multiple_collision = 1123 le64_to_cpu(ql_iscsi_stats->mac_tx_multiple_collision); 1124 host_stats->mactx_collision = 1125 le64_to_cpu(ql_iscsi_stats->mac_tx_collision); 1126 host_stats->mactx_frames_dropped = 1127 le64_to_cpu(ql_iscsi_stats->mac_tx_frames_dropped); 1128 host_stats->mactx_jumbo_frames = 1129 le64_to_cpu(ql_iscsi_stats->mac_tx_jumbo_frames); 1130 host_stats->macrx_frames = le64_to_cpu(ql_iscsi_stats->mac_rx_frames); 1131 host_stats->macrx_bytes = le64_to_cpu(ql_iscsi_stats->mac_rx_bytes); 1132 host_stats->macrx_unknown_control_frames = 1133 le64_to_cpu(ql_iscsi_stats->mac_rx_unknown_control_frames); 1134 host_stats->macrx_pause_frames = 1135 le64_to_cpu(ql_iscsi_stats->mac_rx_pause_frames); 1136 host_stats->macrx_control_frames = 1137 le64_to_cpu(ql_iscsi_stats->mac_rx_control_frames); 1138 host_stats->macrx_dribble = 1139 le64_to_cpu(ql_iscsi_stats->mac_rx_dribble); 1140 host_stats->macrx_frame_length_error = 1141 le64_to_cpu(ql_iscsi_stats->mac_rx_frame_length_error); 1142 host_stats->macrx_jabber = le64_to_cpu(ql_iscsi_stats->mac_rx_jabber); 1143 host_stats->macrx_carrier_sense_error = 1144 le64_to_cpu(ql_iscsi_stats->mac_rx_carrier_sense_error); 1145 host_stats->macrx_frame_discarded = 1146 le64_to_cpu(ql_iscsi_stats->mac_rx_frame_discarded); 1147 host_stats->macrx_frames_dropped = 1148 le64_to_cpu(ql_iscsi_stats->mac_rx_frames_dropped); 1149 host_stats->mac_crc_error = le64_to_cpu(ql_iscsi_stats->mac_crc_error); 1150 host_stats->mac_encoding_error = 1151 le64_to_cpu(ql_iscsi_stats->mac_encoding_error); 1152 host_stats->macrx_length_error_large = 1153 le64_to_cpu(ql_iscsi_stats->mac_rx_length_error_large); 1154 host_stats->macrx_length_error_small = 1155 le64_to_cpu(ql_iscsi_stats->mac_rx_length_error_small); 1156 host_stats->macrx_multicast_frames = 1157 le64_to_cpu(ql_iscsi_stats->mac_rx_multicast_frames); 1158 host_stats->macrx_broadcast_frames = 1159 le64_to_cpu(ql_iscsi_stats->mac_rx_broadcast_frames); 1160 host_stats->iptx_packets = le64_to_cpu(ql_iscsi_stats->ip_tx_packets); 1161 host_stats->iptx_bytes = le64_to_cpu(ql_iscsi_stats->ip_tx_bytes); 1162 host_stats->iptx_fragments = 1163 le64_to_cpu(ql_iscsi_stats->ip_tx_fragments); 1164 host_stats->iprx_packets = le64_to_cpu(ql_iscsi_stats->ip_rx_packets); 1165 host_stats->iprx_bytes = le64_to_cpu(ql_iscsi_stats->ip_rx_bytes); 1166 host_stats->iprx_fragments = 1167 le64_to_cpu(ql_iscsi_stats->ip_rx_fragments); 1168 host_stats->ip_datagram_reassembly = 1169 le64_to_cpu(ql_iscsi_stats->ip_datagram_reassembly); 1170 host_stats->ip_invalid_address_error = 1171 le64_to_cpu(ql_iscsi_stats->ip_invalid_address_error); 1172 host_stats->ip_error_packets = 1173 le64_to_cpu(ql_iscsi_stats->ip_error_packets); 1174 host_stats->ip_fragrx_overlap = 1175 le64_to_cpu(ql_iscsi_stats->ip_fragrx_overlap); 1176 host_stats->ip_fragrx_outoforder = 1177 le64_to_cpu(ql_iscsi_stats->ip_fragrx_outoforder); 1178 host_stats->ip_datagram_reassembly_timeout = 1179 le64_to_cpu(ql_iscsi_stats->ip_datagram_reassembly_timeout); 1180 host_stats->ipv6tx_packets = 1181 le64_to_cpu(ql_iscsi_stats->ipv6_tx_packets); 1182 host_stats->ipv6tx_bytes = le64_to_cpu(ql_iscsi_stats->ipv6_tx_bytes); 1183 host_stats->ipv6tx_fragments = 1184 le64_to_cpu(ql_iscsi_stats->ipv6_tx_fragments); 1185 host_stats->ipv6rx_packets = 1186 le64_to_cpu(ql_iscsi_stats->ipv6_rx_packets); 1187 host_stats->ipv6rx_bytes = le64_to_cpu(ql_iscsi_stats->ipv6_rx_bytes); 1188 host_stats->ipv6rx_fragments = 1189 le64_to_cpu(ql_iscsi_stats->ipv6_rx_fragments); 1190 host_stats->ipv6_datagram_reassembly = 1191 le64_to_cpu(ql_iscsi_stats->ipv6_datagram_reassembly); 1192 host_stats->ipv6_invalid_address_error = 1193 le64_to_cpu(ql_iscsi_stats->ipv6_invalid_address_error); 1194 host_stats->ipv6_error_packets = 1195 le64_to_cpu(ql_iscsi_stats->ipv6_error_packets); 1196 host_stats->ipv6_fragrx_overlap = 1197 le64_to_cpu(ql_iscsi_stats->ipv6_fragrx_overlap); 1198 host_stats->ipv6_fragrx_outoforder = 1199 le64_to_cpu(ql_iscsi_stats->ipv6_fragrx_outoforder); 1200 host_stats->ipv6_datagram_reassembly_timeout = 1201 le64_to_cpu(ql_iscsi_stats->ipv6_datagram_reassembly_timeout); 1202 host_stats->tcptx_segments = 1203 le64_to_cpu(ql_iscsi_stats->tcp_tx_segments); 1204 host_stats->tcptx_bytes = le64_to_cpu(ql_iscsi_stats->tcp_tx_bytes); 1205 host_stats->tcprx_segments = 1206 le64_to_cpu(ql_iscsi_stats->tcp_rx_segments); 1207 host_stats->tcprx_byte = le64_to_cpu(ql_iscsi_stats->tcp_rx_byte); 1208 host_stats->tcp_duplicate_ack_retx = 1209 le64_to_cpu(ql_iscsi_stats->tcp_duplicate_ack_retx); 1210 host_stats->tcp_retx_timer_expired = 1211 le64_to_cpu(ql_iscsi_stats->tcp_retx_timer_expired); 1212 host_stats->tcprx_duplicate_ack = 1213 le64_to_cpu(ql_iscsi_stats->tcp_rx_duplicate_ack); 1214 host_stats->tcprx_pure_ackr = 1215 le64_to_cpu(ql_iscsi_stats->tcp_rx_pure_ackr); 1216 host_stats->tcptx_delayed_ack = 1217 le64_to_cpu(ql_iscsi_stats->tcp_tx_delayed_ack); 1218 host_stats->tcptx_pure_ack = 1219 le64_to_cpu(ql_iscsi_stats->tcp_tx_pure_ack); 1220 host_stats->tcprx_segment_error = 1221 le64_to_cpu(ql_iscsi_stats->tcp_rx_segment_error); 1222 host_stats->tcprx_segment_outoforder = 1223 le64_to_cpu(ql_iscsi_stats->tcp_rx_segment_outoforder); 1224 host_stats->tcprx_window_probe = 1225 le64_to_cpu(ql_iscsi_stats->tcp_rx_window_probe); 1226 host_stats->tcprx_window_update = 1227 le64_to_cpu(ql_iscsi_stats->tcp_rx_window_update); 1228 host_stats->tcptx_window_probe_persist = 1229 le64_to_cpu(ql_iscsi_stats->tcp_tx_window_probe_persist); 1230 host_stats->ecc_error_correction = 1231 le64_to_cpu(ql_iscsi_stats->ecc_error_correction); 1232 host_stats->iscsi_pdu_tx = le64_to_cpu(ql_iscsi_stats->iscsi_pdu_tx); 1233 host_stats->iscsi_data_bytes_tx = 1234 le64_to_cpu(ql_iscsi_stats->iscsi_data_bytes_tx); 1235 host_stats->iscsi_pdu_rx = le64_to_cpu(ql_iscsi_stats->iscsi_pdu_rx); 1236 host_stats->iscsi_data_bytes_rx = 1237 le64_to_cpu(ql_iscsi_stats->iscsi_data_bytes_rx); 1238 host_stats->iscsi_io_completed = 1239 le64_to_cpu(ql_iscsi_stats->iscsi_io_completed); 1240 host_stats->iscsi_unexpected_io_rx = 1241 le64_to_cpu(ql_iscsi_stats->iscsi_unexpected_io_rx); 1242 host_stats->iscsi_format_error = 1243 le64_to_cpu(ql_iscsi_stats->iscsi_format_error); 1244 host_stats->iscsi_hdr_digest_error = 1245 le64_to_cpu(ql_iscsi_stats->iscsi_hdr_digest_error); 1246 host_stats->iscsi_data_digest_error = 1247 le64_to_cpu(ql_iscsi_stats->iscsi_data_digest_error); 1248 host_stats->iscsi_sequence_error = 1249 le64_to_cpu(ql_iscsi_stats->iscsi_sequence_error); 1250exit_host_stats: 1251 if (ql_iscsi_stats) 1252 dma_free_coherent(&ha->pdev->dev, stats_size, 1253 ql_iscsi_stats, iscsi_stats_dma); 1254 1255 ql4_printk(KERN_INFO, ha, "%s: Get host stats done\n", 1256 __func__); 1257 return ret; 1258} 1259 1260static int qla4xxx_get_iface_param(struct iscsi_iface *iface, 1261 enum iscsi_param_type param_type, 1262 int param, char *buf) 1263{ 1264 struct Scsi_Host *shost = iscsi_iface_to_shost(iface); 1265 struct scsi_qla_host *ha = to_qla_host(shost); 1266 int ival; 1267 char *pval = NULL; 1268 int len = -ENOSYS; 1269 1270 if (param_type == ISCSI_NET_PARAM) { 1271 switch (param) { 1272 case ISCSI_NET_PARAM_IPV4_ADDR: 1273 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); 1274 break; 1275 case ISCSI_NET_PARAM_IPV4_SUBNET: 1276 len = sprintf(buf, "%pI4\n", 1277 &ha->ip_config.subnet_mask); 1278 break; 1279 case ISCSI_NET_PARAM_IPV4_GW: 1280 len = sprintf(buf, "%pI4\n", &ha->ip_config.gateway); 1281 break; 1282 case ISCSI_NET_PARAM_IFACE_ENABLE: 1283 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) { 1284 OP_STATE(ha->ip_config.ipv4_options, 1285 IPOPT_IPV4_PROTOCOL_ENABLE, pval); 1286 } else { 1287 OP_STATE(ha->ip_config.ipv6_options, 1288 IPV6_OPT_IPV6_PROTOCOL_ENABLE, pval); 1289 } 1290 1291 len = sprintf(buf, "%s\n", pval); 1292 break; 1293 case ISCSI_NET_PARAM_IPV4_BOOTPROTO: 1294 len = sprintf(buf, "%s\n", 1295 (ha->ip_config.tcp_options & 1296 TCPOPT_DHCP_ENABLE) ? 1297 "dhcp" : "static"); 1298 break; 1299 case ISCSI_NET_PARAM_IPV6_ADDR: 1300 if (iface->iface_num == 0) 1301 len = sprintf(buf, "%pI6\n", 1302 &ha->ip_config.ipv6_addr0); 1303 if (iface->iface_num == 1) 1304 len = sprintf(buf, "%pI6\n", 1305 &ha->ip_config.ipv6_addr1); 1306 break; 1307 case ISCSI_NET_PARAM_IPV6_LINKLOCAL: 1308 len = sprintf(buf, "%pI6\n", 1309 &ha->ip_config.ipv6_link_local_addr); 1310 break; 1311 case ISCSI_NET_PARAM_IPV6_ROUTER: 1312 len = sprintf(buf, "%pI6\n", 1313 &ha->ip_config.ipv6_default_router_addr); 1314 break; 1315 case ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG: 1316 pval = (ha->ip_config.ipv6_addl_options & 1317 IPV6_ADDOPT_NEIGHBOR_DISCOVERY_ADDR_ENABLE) ? 1318 "nd" : "static"; 1319 1320 len = sprintf(buf, "%s\n", pval); 1321 break; 1322 case ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG: 1323 pval = (ha->ip_config.ipv6_addl_options & 1324 IPV6_ADDOPT_AUTOCONFIG_LINK_LOCAL_ADDR) ? 1325 "auto" : "static"; 1326 1327 len = sprintf(buf, "%s\n", pval); 1328 break; 1329 case ISCSI_NET_PARAM_VLAN_ID: 1330 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) 1331 ival = ha->ip_config.ipv4_vlan_tag & 1332 ISCSI_MAX_VLAN_ID; 1333 else 1334 ival = ha->ip_config.ipv6_vlan_tag & 1335 ISCSI_MAX_VLAN_ID; 1336 1337 len = sprintf(buf, "%d\n", ival); 1338 break; 1339 case ISCSI_NET_PARAM_VLAN_PRIORITY: 1340 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) 1341 ival = (ha->ip_config.ipv4_vlan_tag >> 13) & 1342 ISCSI_MAX_VLAN_PRIORITY; 1343 else 1344 ival = (ha->ip_config.ipv6_vlan_tag >> 13) & 1345 ISCSI_MAX_VLAN_PRIORITY; 1346 1347 len = sprintf(buf, "%d\n", ival); 1348 break; 1349 case ISCSI_NET_PARAM_VLAN_ENABLED: 1350 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) { 1351 OP_STATE(ha->ip_config.ipv4_options, 1352 IPOPT_VLAN_TAGGING_ENABLE, pval); 1353 } else { 1354 OP_STATE(ha->ip_config.ipv6_options, 1355 IPV6_OPT_VLAN_TAGGING_ENABLE, pval); 1356 } 1357 len = sprintf(buf, "%s\n", pval); 1358 break; 1359 case ISCSI_NET_PARAM_MTU: 1360 len = sprintf(buf, "%d\n", ha->ip_config.eth_mtu_size); 1361 break; 1362 case ISCSI_NET_PARAM_PORT: 1363 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) 1364 len = sprintf(buf, "%d\n", 1365 ha->ip_config.ipv4_port); 1366 else 1367 len = sprintf(buf, "%d\n", 1368 ha->ip_config.ipv6_port); 1369 break; 1370 case ISCSI_NET_PARAM_IPADDR_STATE: 1371 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) { 1372 pval = iscsi_get_ipaddress_state_name( 1373 ha->ip_config.ipv4_addr_state); 1374 } else { 1375 if (iface->iface_num == 0) 1376 pval = iscsi_get_ipaddress_state_name( 1377 ha->ip_config.ipv6_addr0_state); 1378 else if (iface->iface_num == 1) 1379 pval = iscsi_get_ipaddress_state_name( 1380 ha->ip_config.ipv6_addr1_state); 1381 } 1382 1383 len = sprintf(buf, "%s\n", pval); 1384 break; 1385 case ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE: 1386 pval = iscsi_get_ipaddress_state_name( 1387 ha->ip_config.ipv6_link_local_state); 1388 len = sprintf(buf, "%s\n", pval); 1389 break; 1390 case ISCSI_NET_PARAM_IPV6_ROUTER_STATE: 1391 pval = iscsi_get_router_state_name( 1392 ha->ip_config.ipv6_default_router_state); 1393 len = sprintf(buf, "%s\n", pval); 1394 break; 1395 case ISCSI_NET_PARAM_DELAYED_ACK_EN: 1396 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) { 1397 OP_STATE(~ha->ip_config.tcp_options, 1398 TCPOPT_DELAYED_ACK_DISABLE, pval); 1399 } else { 1400 OP_STATE(~ha->ip_config.ipv6_tcp_options, 1401 IPV6_TCPOPT_DELAYED_ACK_DISABLE, pval); 1402 } 1403 len = sprintf(buf, "%s\n", pval); 1404 break; 1405 case ISCSI_NET_PARAM_TCP_NAGLE_DISABLE: 1406 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) { 1407 OP_STATE(~ha->ip_config.tcp_options, 1408 TCPOPT_NAGLE_ALGO_DISABLE, pval); 1409 } else { 1410 OP_STATE(~ha->ip_config.ipv6_tcp_options, 1411 IPV6_TCPOPT_NAGLE_ALGO_DISABLE, pval); 1412 } 1413 len = sprintf(buf, "%s\n", pval); 1414 break; 1415 case ISCSI_NET_PARAM_TCP_WSF_DISABLE: 1416 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) { 1417 OP_STATE(~ha->ip_config.tcp_options, 1418 TCPOPT_WINDOW_SCALE_DISABLE, pval); 1419 } else { 1420 OP_STATE(~ha->ip_config.ipv6_tcp_options, 1421 IPV6_TCPOPT_WINDOW_SCALE_DISABLE, 1422 pval); 1423 } 1424 len = sprintf(buf, "%s\n", pval); 1425 break; 1426 case ISCSI_NET_PARAM_TCP_WSF: 1427 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) 1428 len = sprintf(buf, "%d\n", 1429 ha->ip_config.tcp_wsf); 1430 else 1431 len = sprintf(buf, "%d\n", 1432 ha->ip_config.ipv6_tcp_wsf); 1433 break; 1434 case ISCSI_NET_PARAM_TCP_TIMER_SCALE: 1435 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) 1436 ival = (ha->ip_config.tcp_options & 1437 TCPOPT_TIMER_SCALE) >> 1; 1438 else 1439 ival = (ha->ip_config.ipv6_tcp_options & 1440 IPV6_TCPOPT_TIMER_SCALE) >> 1; 1441 1442 len = sprintf(buf, "%d\n", ival); 1443 break; 1444 case ISCSI_NET_PARAM_TCP_TIMESTAMP_EN: 1445 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) { 1446 OP_STATE(ha->ip_config.tcp_options, 1447 TCPOPT_TIMESTAMP_ENABLE, pval); 1448 } else { 1449 OP_STATE(ha->ip_config.ipv6_tcp_options, 1450 IPV6_TCPOPT_TIMESTAMP_EN, pval); 1451 } 1452 len = sprintf(buf, "%s\n", pval); 1453 break; 1454 case ISCSI_NET_PARAM_CACHE_ID: 1455 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) 1456 len = sprintf(buf, "%d\n", 1457 ha->ip_config.ipv4_cache_id); 1458 else 1459 len = sprintf(buf, "%d\n", 1460 ha->ip_config.ipv6_cache_id); 1461 break; 1462 case ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN: 1463 OP_STATE(ha->ip_config.tcp_options, 1464 TCPOPT_DNS_SERVER_IP_EN, pval); 1465 1466 len = sprintf(buf, "%s\n", pval); 1467 break; 1468 case ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN: 1469 OP_STATE(ha->ip_config.tcp_options, 1470 TCPOPT_SLP_DA_INFO_EN, pval); 1471 1472 len = sprintf(buf, "%s\n", pval); 1473 break; 1474 case ISCSI_NET_PARAM_IPV4_TOS_EN: 1475 OP_STATE(ha->ip_config.ipv4_options, 1476 IPOPT_IPV4_TOS_EN, pval); 1477 1478 len = sprintf(buf, "%s\n", pval); 1479 break; 1480 case ISCSI_NET_PARAM_IPV4_TOS: 1481 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_tos); 1482 break; 1483 case ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN: 1484 OP_STATE(ha->ip_config.ipv4_options, 1485 IPOPT_GRAT_ARP_EN, pval); 1486 1487 len = sprintf(buf, "%s\n", pval); 1488 break; 1489 case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN: 1490 OP_STATE(ha->ip_config.ipv4_options, IPOPT_ALT_CID_EN, 1491 pval); 1492 1493 len = sprintf(buf, "%s\n", pval); 1494 break; 1495 case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID: 1496 pval = (ha->ip_config.ipv4_alt_cid_len) ? 1497 (char *)ha->ip_config.ipv4_alt_cid : ""; 1498 1499 len = sprintf(buf, "%s\n", pval); 1500 break; 1501 case ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN: 1502 OP_STATE(ha->ip_config.ipv4_options, 1503 IPOPT_REQ_VID_EN, pval); 1504 1505 len = sprintf(buf, "%s\n", pval); 1506 break; 1507 case ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN: 1508 OP_STATE(ha->ip_config.ipv4_options, 1509 IPOPT_USE_VID_EN, pval); 1510 1511 len = sprintf(buf, "%s\n", pval); 1512 break; 1513 case ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID: 1514 pval = (ha->ip_config.ipv4_vid_len) ? 1515 (char *)ha->ip_config.ipv4_vid : ""; 1516 1517 len = sprintf(buf, "%s\n", pval); 1518 break; 1519 case ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN: 1520 OP_STATE(ha->ip_config.ipv4_options, 1521 IPOPT_LEARN_IQN_EN, pval); 1522 1523 len = sprintf(buf, "%s\n", pval); 1524 break; 1525 case ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE: 1526 OP_STATE(~ha->ip_config.ipv4_options, 1527 IPOPT_FRAGMENTATION_DISABLE, pval); 1528 1529 len = sprintf(buf, "%s\n", pval); 1530 break; 1531 case ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN: 1532 OP_STATE(ha->ip_config.ipv4_options, 1533 IPOPT_IN_FORWARD_EN, pval); 1534 1535 len = sprintf(buf, "%s\n", pval); 1536 break; 1537 case ISCSI_NET_PARAM_REDIRECT_EN: 1538 if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) { 1539 OP_STATE(ha->ip_config.ipv4_options, 1540 IPOPT_ARP_REDIRECT_EN, pval); 1541 } else { 1542 OP_STATE(ha->ip_config.ipv6_options, 1543 IPV6_OPT_REDIRECT_EN, pval); 1544 } 1545 len = sprintf(buf, "%s\n", pval); 1546 break; 1547 case ISCSI_NET_PARAM_IPV4_TTL: 1548 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_ttl); 1549 break; 1550 case ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN: 1551 OP_STATE(ha->ip_config.ipv6_options, 1552 IPV6_OPT_GRAT_NEIGHBOR_ADV_EN, pval); 1553 1554 len = sprintf(buf, "%s\n", pval); 1555 break; 1556 case ISCSI_NET_PARAM_IPV6_MLD_EN: 1557 OP_STATE(ha->ip_config.ipv6_addl_options, 1558 IPV6_ADDOPT_MLD_EN, pval); 1559 1560 len = sprintf(buf, "%s\n", pval); 1561 break; 1562 case ISCSI_NET_PARAM_IPV6_FLOW_LABEL: 1563 len = sprintf(buf, "%u\n", ha->ip_config.ipv6_flow_lbl); 1564 break; 1565 case ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS: 1566 len = sprintf(buf, "%d\n", 1567 ha->ip_config.ipv6_traffic_class); 1568 break; 1569 case ISCSI_NET_PARAM_IPV6_HOP_LIMIT: 1570 len = sprintf(buf, "%d\n", 1571 ha->ip_config.ipv6_hop_limit); 1572 break; 1573 case ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO: 1574 len = sprintf(buf, "%d\n", 1575 ha->ip_config.ipv6_nd_reach_time); 1576 break; 1577 case ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME: 1578 len = sprintf(buf, "%d\n", 1579 ha->ip_config.ipv6_nd_rexmit_timer); 1580 break; 1581 case ISCSI_NET_PARAM_IPV6_ND_STALE_TMO: 1582 len = sprintf(buf, "%d\n", 1583 ha->ip_config.ipv6_nd_stale_timeout); 1584 break; 1585 case ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT: 1586 len = sprintf(buf, "%d\n", 1587 ha->ip_config.ipv6_dup_addr_detect_count); 1588 break; 1589 case ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU: 1590 len = sprintf(buf, "%d\n", 1591 ha->ip_config.ipv6_gw_advrt_mtu); 1592 break; 1593 default: 1594 len = -ENOSYS; 1595 } 1596 } else if (param_type == ISCSI_IFACE_PARAM) { 1597 switch (param) { 1598 case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO: 1599 len = sprintf(buf, "%d\n", ha->ip_config.def_timeout); 1600 break; 1601 case ISCSI_IFACE_PARAM_HDRDGST_EN: 1602 OP_STATE(ha->ip_config.iscsi_options, 1603 ISCSIOPTS_HEADER_DIGEST_EN, pval); 1604 1605 len = sprintf(buf, "%s\n", pval); 1606 break; 1607 case ISCSI_IFACE_PARAM_DATADGST_EN: 1608 OP_STATE(ha->ip_config.iscsi_options, 1609 ISCSIOPTS_DATA_DIGEST_EN, pval); 1610 1611 len = sprintf(buf, "%s\n", pval); 1612 break; 1613 case ISCSI_IFACE_PARAM_IMM_DATA_EN: 1614 OP_STATE(ha->ip_config.iscsi_options, 1615 ISCSIOPTS_IMMEDIATE_DATA_EN, pval); 1616 1617 len = sprintf(buf, "%s\n", pval); 1618 break; 1619 case ISCSI_IFACE_PARAM_INITIAL_R2T_EN: 1620 OP_STATE(ha->ip_config.iscsi_options, 1621 ISCSIOPTS_INITIAL_R2T_EN, pval); 1622 1623 len = sprintf(buf, "%s\n", pval); 1624 break; 1625 case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN: 1626 OP_STATE(ha->ip_config.iscsi_options, 1627 ISCSIOPTS_DATA_SEQ_INORDER_EN, pval); 1628 1629 len = sprintf(buf, "%s\n", pval); 1630 break; 1631 case ISCSI_IFACE_PARAM_PDU_INORDER_EN: 1632 OP_STATE(ha->ip_config.iscsi_options, 1633 ISCSIOPTS_DATA_PDU_INORDER_EN, pval); 1634 1635 len = sprintf(buf, "%s\n", pval); 1636 break; 1637 case ISCSI_IFACE_PARAM_ERL: 1638 len = sprintf(buf, "%d\n", 1639 (ha->ip_config.iscsi_options & 1640 ISCSIOPTS_ERL)); 1641 break; 1642 case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH: 1643 len = sprintf(buf, "%u\n", 1644 ha->ip_config.iscsi_max_pdu_size * 1645 BYTE_UNITS); 1646 break; 1647 case ISCSI_IFACE_PARAM_FIRST_BURST: 1648 len = sprintf(buf, "%u\n", 1649 ha->ip_config.iscsi_first_burst_len * 1650 BYTE_UNITS); 1651 break; 1652 case ISCSI_IFACE_PARAM_MAX_R2T: 1653 len = sprintf(buf, "%d\n", 1654 ha->ip_config.iscsi_max_outstnd_r2t); 1655 break; 1656 case ISCSI_IFACE_PARAM_MAX_BURST: 1657 len = sprintf(buf, "%u\n", 1658 ha->ip_config.iscsi_max_burst_len * 1659 BYTE_UNITS); 1660 break; 1661 case ISCSI_IFACE_PARAM_CHAP_AUTH_EN: 1662 OP_STATE(ha->ip_config.iscsi_options, 1663 ISCSIOPTS_CHAP_AUTH_EN, pval); 1664 1665 len = sprintf(buf, "%s\n", pval); 1666 break; 1667 case ISCSI_IFACE_PARAM_BIDI_CHAP_EN: 1668 OP_STATE(ha->ip_config.iscsi_options, 1669 ISCSIOPTS_BIDI_CHAP_EN, pval); 1670 1671 len = sprintf(buf, "%s\n", pval); 1672 break; 1673 case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL: 1674 OP_STATE(ha->ip_config.iscsi_options, 1675 ISCSIOPTS_DISCOVERY_AUTH_EN, pval); 1676 1677 len = sprintf(buf, "%s\n", pval); 1678 break; 1679 case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN: 1680 OP_STATE(ha->ip_config.iscsi_options, 1681 ISCSIOPTS_DISCOVERY_LOGOUT_EN, pval); 1682 1683 len = sprintf(buf, "%s\n", pval); 1684 break; 1685 case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN: 1686 OP_STATE(ha->ip_config.iscsi_options, 1687 ISCSIOPTS_STRICT_LOGIN_COMP_EN, pval); 1688 1689 len = sprintf(buf, "%s\n", pval); 1690 break; 1691 case ISCSI_IFACE_PARAM_INITIATOR_NAME: 1692 len = sprintf(buf, "%s\n", ha->ip_config.iscsi_name); 1693 break; 1694 default: 1695 len = -ENOSYS; 1696 } 1697 } 1698 1699 return len; 1700} 1701 1702static struct iscsi_endpoint * 1703qla4xxx_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr, 1704 int non_blocking) 1705{ 1706 int ret; 1707 struct iscsi_endpoint *ep; 1708 struct qla_endpoint *qla_ep; 1709 struct scsi_qla_host *ha; 1710 struct sockaddr_in *addr; 1711 struct sockaddr_in6 *addr6; 1712 1713 if (!shost) { 1714 ret = -ENXIO; 1715 pr_err("%s: shost is NULL\n", __func__); 1716 return ERR_PTR(ret); 1717 } 1718 1719 ha = iscsi_host_priv(shost); 1720 ep = iscsi_create_endpoint(sizeof(struct qla_endpoint)); 1721 if (!ep) { 1722 ret = -ENOMEM; 1723 return ERR_PTR(ret); 1724 } 1725 1726 qla_ep = ep->dd_data; 1727 memset(qla_ep, 0, sizeof(struct qla_endpoint)); 1728 if (dst_addr->sa_family == AF_INET) { 1729 memcpy(&qla_ep->dst_addr, dst_addr, sizeof(struct sockaddr_in)); 1730 addr = (struct sockaddr_in *)&qla_ep->dst_addr; 1731 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI4\n", __func__, 1732 (char *)&addr->sin_addr)); 1733 } else if (dst_addr->sa_family == AF_INET6) { 1734 memcpy(&qla_ep->dst_addr, dst_addr, 1735 sizeof(struct sockaddr_in6)); 1736 addr6 = (struct sockaddr_in6 *)&qla_ep->dst_addr; 1737 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI6\n", __func__, 1738 (char *)&addr6->sin6_addr)); 1739 } else { 1740 ql4_printk(KERN_WARNING, ha, "%s: Invalid endpoint\n", 1741 __func__); 1742 } 1743 1744 qla_ep->host = shost; 1745 1746 return ep; 1747} 1748 1749static int qla4xxx_ep_poll(struct iscsi_endpoint *ep, int timeout_ms) 1750{ 1751 struct qla_endpoint *qla_ep; 1752 struct scsi_qla_host *ha; 1753 int ret = 0; 1754 1755 qla_ep = ep->dd_data; 1756 ha = to_qla_host(qla_ep->host); 1757 DEBUG2(pr_info_ratelimited("%s: host: %ld\n", __func__, ha->host_no)); 1758 1759 if (adapter_up(ha) && !test_bit(AF_BUILD_DDB_LIST, &ha->flags)) 1760 ret = 1; 1761 1762 return ret; 1763} 1764 1765static void qla4xxx_ep_disconnect(struct iscsi_endpoint *ep) 1766{ 1767 struct qla_endpoint *qla_ep; 1768 struct scsi_qla_host *ha; 1769 1770 qla_ep = ep->dd_data; 1771 ha = to_qla_host(qla_ep->host); 1772 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, 1773 ha->host_no)); 1774 iscsi_destroy_endpoint(ep); 1775} 1776 1777static int qla4xxx_get_ep_param(struct iscsi_endpoint *ep, 1778 enum iscsi_param param, 1779 char *buf) 1780{ 1781 struct qla_endpoint *qla_ep = ep->dd_data; 1782 struct sockaddr *dst_addr; 1783 struct scsi_qla_host *ha; 1784 1785 if (!qla_ep) 1786 return -ENOTCONN; 1787 1788 ha = to_qla_host(qla_ep->host); 1789 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, 1790 ha->host_no)); 1791 1792 switch (param) { 1793 case ISCSI_PARAM_CONN_PORT: 1794 case ISCSI_PARAM_CONN_ADDRESS: 1795 dst_addr = (struct sockaddr *)&qla_ep->dst_addr; 1796 if (!dst_addr) 1797 return -ENOTCONN; 1798 1799 return iscsi_conn_get_addr_param((struct sockaddr_storage *) 1800 &qla_ep->dst_addr, param, buf); 1801 default: 1802 return -ENOSYS; 1803 } 1804} 1805 1806static void qla4xxx_conn_get_stats(struct iscsi_cls_conn *cls_conn, 1807 struct iscsi_stats *stats) 1808{ 1809 struct iscsi_session *sess; 1810 struct iscsi_cls_session *cls_sess; 1811 struct ddb_entry *ddb_entry; 1812 struct scsi_qla_host *ha; 1813 struct ql_iscsi_stats *ql_iscsi_stats; 1814 int stats_size; 1815 int ret; 1816 dma_addr_t iscsi_stats_dma; 1817 1818 cls_sess = iscsi_conn_to_session(cls_conn); 1819 sess = cls_sess->dd_data; 1820 ddb_entry = sess->dd_data; 1821 ha = ddb_entry->ha; 1822 1823 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, 1824 ha->host_no)); 1825 stats_size = PAGE_ALIGN(sizeof(struct ql_iscsi_stats)); 1826 /* Allocate memory */ 1827 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, 1828 &iscsi_stats_dma, GFP_KERNEL); 1829 if (!ql_iscsi_stats) { 1830 ql4_printk(KERN_ERR, ha, 1831 "Unable to allocate memory for iscsi stats\n"); 1832 goto exit_get_stats; 1833 } 1834 1835 ret = qla4xxx_get_mgmt_data(ha, ddb_entry->fw_ddb_index, stats_size, 1836 iscsi_stats_dma); 1837 if (ret != QLA_SUCCESS) { 1838 ql4_printk(KERN_ERR, ha, 1839 "Unable to retrieve iscsi stats\n"); 1840 goto free_stats; 1841 } 1842 1843 /* octets */ 1844 stats->txdata_octets = le64_to_cpu(ql_iscsi_stats->tx_data_octets); 1845 stats->rxdata_octets = le64_to_cpu(ql_iscsi_stats->rx_data_octets); 1846 /* xmit pdus */ 1847 stats->noptx_pdus = le32_to_cpu(ql_iscsi_stats->tx_nopout_pdus); 1848 stats->scsicmd_pdus = le32_to_cpu(ql_iscsi_stats->tx_scsi_cmd_pdus); 1849 stats->tmfcmd_pdus = le32_to_cpu(ql_iscsi_stats->tx_tmf_cmd_pdus); 1850 stats->login_pdus = le32_to_cpu(ql_iscsi_stats->tx_login_cmd_pdus); 1851 stats->text_pdus = le32_to_cpu(ql_iscsi_stats->tx_text_cmd_pdus); 1852 stats->dataout_pdus = le32_to_cpu(ql_iscsi_stats->tx_scsi_write_pdus); 1853 stats->logout_pdus = le32_to_cpu(ql_iscsi_stats->tx_logout_cmd_pdus); 1854 stats->snack_pdus = le32_to_cpu(ql_iscsi_stats->tx_snack_req_pdus); 1855 /* recv pdus */ 1856 stats->noprx_pdus = le32_to_cpu(ql_iscsi_stats->rx_nopin_pdus); 1857 stats->scsirsp_pdus = le32_to_cpu(ql_iscsi_stats->rx_scsi_resp_pdus); 1858 stats->tmfrsp_pdus = le32_to_cpu(ql_iscsi_stats->rx_tmf_resp_pdus); 1859 stats->textrsp_pdus = le32_to_cpu(ql_iscsi_stats->rx_text_resp_pdus); 1860 stats->datain_pdus = le32_to_cpu(ql_iscsi_stats->rx_scsi_read_pdus); 1861 stats->logoutrsp_pdus = 1862 le32_to_cpu(ql_iscsi_stats->rx_logout_resp_pdus); 1863 stats->r2t_pdus = le32_to_cpu(ql_iscsi_stats->rx_r2t_pdus); 1864 stats->async_pdus = le32_to_cpu(ql_iscsi_stats->rx_async_pdus); 1865 stats->rjt_pdus = le32_to_cpu(ql_iscsi_stats->rx_reject_pdus); 1866 1867free_stats: 1868 dma_free_coherent(&ha->pdev->dev, stats_size, ql_iscsi_stats, 1869 iscsi_stats_dma); 1870exit_get_stats: 1871 return; 1872} 1873 1874static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc) 1875{ 1876 struct iscsi_cls_session *session; 1877 unsigned long flags; 1878 enum blk_eh_timer_return ret = BLK_EH_DONE; 1879 1880 session = starget_to_session(scsi_target(sc->device)); 1881 1882 spin_lock_irqsave(&session->lock, flags); 1883 if (session->state == ISCSI_SESSION_FAILED) 1884 ret = BLK_EH_RESET_TIMER; 1885 spin_unlock_irqrestore(&session->lock, flags); 1886 1887 return ret; 1888} 1889 1890static void qla4xxx_set_port_speed(struct Scsi_Host *shost) 1891{ 1892 struct scsi_qla_host *ha = to_qla_host(shost); 1893 struct iscsi_cls_host *ihost = shost->shost_data; 1894 uint32_t speed = ISCSI_PORT_SPEED_UNKNOWN; 1895 1896 qla4xxx_get_firmware_state(ha); 1897 1898 switch (ha->addl_fw_state & 0x0F00) { 1899 case FW_ADDSTATE_LINK_SPEED_10MBPS: 1900 speed = ISCSI_PORT_SPEED_10MBPS; 1901 break; 1902 case FW_ADDSTATE_LINK_SPEED_100MBPS: 1903 speed = ISCSI_PORT_SPEED_100MBPS; 1904 break; 1905 case FW_ADDSTATE_LINK_SPEED_1GBPS: 1906 speed = ISCSI_PORT_SPEED_1GBPS; 1907 break; 1908 case FW_ADDSTATE_LINK_SPEED_10GBPS: 1909 speed = ISCSI_PORT_SPEED_10GBPS; 1910 break; 1911 } 1912 ihost->port_speed = speed; 1913} 1914 1915static void qla4xxx_set_port_state(struct Scsi_Host *shost) 1916{ 1917 struct scsi_qla_host *ha = to_qla_host(shost); 1918 struct iscsi_cls_host *ihost = shost->shost_data; 1919 uint32_t state = ISCSI_PORT_STATE_DOWN; 1920 1921 if (test_bit(AF_LINK_UP, &ha->flags)) 1922 state = ISCSI_PORT_STATE_UP; 1923 1924 ihost->port_state = state; 1925} 1926 1927static int qla4xxx_host_get_param(struct Scsi_Host *shost, 1928 enum iscsi_host_param param, char *buf) 1929{ 1930 struct scsi_qla_host *ha = to_qla_host(shost); 1931 int len; 1932 1933 switch (param) { 1934 case ISCSI_HOST_PARAM_HWADDRESS: 1935 len = sysfs_format_mac(buf, ha->my_mac, MAC_ADDR_LEN); 1936 break; 1937 case ISCSI_HOST_PARAM_IPADDRESS: 1938 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); 1939 break; 1940 case ISCSI_HOST_PARAM_INITIATOR_NAME: 1941 len = sprintf(buf, "%s\n", ha->name_string); 1942 break; 1943 case ISCSI_HOST_PARAM_PORT_STATE: 1944 qla4xxx_set_port_state(shost); 1945 len = sprintf(buf, "%s\n", iscsi_get_port_state_name(shost)); 1946 break; 1947 case ISCSI_HOST_PARAM_PORT_SPEED: 1948 qla4xxx_set_port_speed(shost); 1949 len = sprintf(buf, "%s\n", iscsi_get_port_speed_name(shost)); 1950 break; 1951 default: 1952 return -ENOSYS; 1953 } 1954 1955 return len; 1956} 1957 1958static void qla4xxx_create_ipv4_iface(struct scsi_qla_host *ha) 1959{ 1960 if (ha->iface_ipv4) 1961 return; 1962 1963 /* IPv4 */ 1964 ha->iface_ipv4 = iscsi_create_iface(ha->host, 1965 &qla4xxx_iscsi_transport, 1966 ISCSI_IFACE_TYPE_IPV4, 0, 0); 1967 if (!ha->iface_ipv4) 1968 ql4_printk(KERN_ERR, ha, "Could not create IPv4 iSCSI " 1969 "iface0.\n"); 1970} 1971 1972static void qla4xxx_create_ipv6_iface(struct scsi_qla_host *ha) 1973{ 1974 if (!ha->iface_ipv6_0) 1975 /* IPv6 iface-0 */ 1976 ha->iface_ipv6_0 = iscsi_create_iface(ha->host, 1977 &qla4xxx_iscsi_transport, 1978 ISCSI_IFACE_TYPE_IPV6, 0, 1979 0); 1980 if (!ha->iface_ipv6_0) 1981 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " 1982 "iface0.\n"); 1983 1984 if (!ha->iface_ipv6_1) 1985 /* IPv6 iface-1 */ 1986 ha->iface_ipv6_1 = iscsi_create_iface(ha->host, 1987 &qla4xxx_iscsi_transport, 1988 ISCSI_IFACE_TYPE_IPV6, 1, 1989 0); 1990 if (!ha->iface_ipv6_1) 1991 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " 1992 "iface1.\n"); 1993} 1994 1995static void qla4xxx_create_ifaces(struct scsi_qla_host *ha) 1996{ 1997 if (ha->ip_config.ipv4_options & IPOPT_IPV4_PROTOCOL_ENABLE) 1998 qla4xxx_create_ipv4_iface(ha); 1999 2000 if (ha->ip_config.ipv6_options & IPV6_OPT_IPV6_PROTOCOL_ENABLE) 2001 qla4xxx_create_ipv6_iface(ha); 2002} 2003 2004static void qla4xxx_destroy_ipv4_iface(struct scsi_qla_host *ha) 2005{ 2006 if (ha->iface_ipv4) { 2007 iscsi_destroy_iface(ha->iface_ipv4); 2008 ha->iface_ipv4 = NULL; 2009 } 2010} 2011 2012static void qla4xxx_destroy_ipv6_iface(struct scsi_qla_host *ha) 2013{ 2014 if (ha->iface_ipv6_0) { 2015 iscsi_destroy_iface(ha->iface_ipv6_0); 2016 ha->iface_ipv6_0 = NULL; 2017 } 2018 if (ha->iface_ipv6_1) { 2019 iscsi_destroy_iface(ha->iface_ipv6_1); 2020 ha->iface_ipv6_1 = NULL; 2021 } 2022} 2023 2024static void qla4xxx_destroy_ifaces(struct scsi_qla_host *ha) 2025{ 2026 qla4xxx_destroy_ipv4_iface(ha); 2027 qla4xxx_destroy_ipv6_iface(ha); 2028} 2029 2030static void qla4xxx_set_ipv6(struct scsi_qla_host *ha, 2031 struct iscsi_iface_param_info *iface_param, 2032 struct addr_ctrl_blk *init_fw_cb) 2033{ 2034 /* 2035 * iface_num 0 is valid for IPv6 Addr, linklocal, router, autocfg. 2036 * iface_num 1 is valid only for IPv6 Addr. 2037 */ 2038 switch (iface_param->param) { 2039 case ISCSI_NET_PARAM_IPV6_ADDR: 2040 if (iface_param->iface_num & 0x1) 2041 /* IPv6 Addr 1 */ 2042 memcpy(init_fw_cb->ipv6_addr1, iface_param->value, 2043 sizeof(init_fw_cb->ipv6_addr1)); 2044 else 2045 /* IPv6 Addr 0 */ 2046 memcpy(init_fw_cb->ipv6_addr0, iface_param->value, 2047 sizeof(init_fw_cb->ipv6_addr0)); 2048 break; 2049 case ISCSI_NET_PARAM_IPV6_LINKLOCAL: 2050 if (iface_param->iface_num & 0x1) 2051 break; 2052 memcpy(init_fw_cb->ipv6_if_id, &iface_param->value[8], 2053 sizeof(init_fw_cb->ipv6_if_id)); 2054 break; 2055 case ISCSI_NET_PARAM_IPV6_ROUTER: 2056 if (iface_param->iface_num & 0x1) 2057 break; 2058 memcpy(init_fw_cb->ipv6_dflt_rtr_addr, iface_param->value, 2059 sizeof(init_fw_cb->ipv6_dflt_rtr_addr)); 2060 break; 2061 case ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG: 2062 /* Autocfg applies to even interface */ 2063 if (iface_param->iface_num & 0x1) 2064 break; 2065 2066 if (iface_param->value[0] == ISCSI_IPV6_AUTOCFG_DISABLE) 2067 init_fw_cb->ipv6_addtl_opts &= 2068 cpu_to_le16( 2069 ~IPV6_ADDOPT_NEIGHBOR_DISCOVERY_ADDR_ENABLE); 2070 else if (iface_param->value[0] == ISCSI_IPV6_AUTOCFG_ND_ENABLE) 2071 init_fw_cb->ipv6_addtl_opts |= 2072 cpu_to_le16( 2073 IPV6_ADDOPT_NEIGHBOR_DISCOVERY_ADDR_ENABLE); 2074 else 2075 ql4_printk(KERN_ERR, ha, 2076 "Invalid autocfg setting for IPv6 addr\n"); 2077 break; 2078 case ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG: 2079 /* Autocfg applies to even interface */ 2080 if (iface_param->iface_num & 0x1) 2081 break; 2082 2083 if (iface_param->value[0] == 2084 ISCSI_IPV6_LINKLOCAL_AUTOCFG_ENABLE) 2085 init_fw_cb->ipv6_addtl_opts |= cpu_to_le16( 2086 IPV6_ADDOPT_AUTOCONFIG_LINK_LOCAL_ADDR); 2087 else if (iface_param->value[0] == 2088 ISCSI_IPV6_LINKLOCAL_AUTOCFG_DISABLE) 2089 init_fw_cb->ipv6_addtl_opts &= cpu_to_le16( 2090 ~IPV6_ADDOPT_AUTOCONFIG_LINK_LOCAL_ADDR); 2091 else 2092 ql4_printk(KERN_ERR, ha, 2093 "Invalid autocfg setting for IPv6 linklocal addr\n"); 2094 break; 2095 case ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG: 2096 /* Autocfg applies to even interface */ 2097 if (iface_param->iface_num & 0x1) 2098 break; 2099 2100 if (iface_param->value[0] == ISCSI_IPV6_ROUTER_AUTOCFG_ENABLE) 2101 memset(init_fw_cb->ipv6_dflt_rtr_addr, 0, 2102 sizeof(init_fw_cb->ipv6_dflt_rtr_addr)); 2103 break; 2104 case ISCSI_NET_PARAM_IFACE_ENABLE: 2105 if (iface_param->value[0] == ISCSI_IFACE_ENABLE) { 2106 init_fw_cb->ipv6_opts |= 2107 cpu_to_le16(IPV6_OPT_IPV6_PROTOCOL_ENABLE); 2108 qla4xxx_create_ipv6_iface(ha); 2109 } else { 2110 init_fw_cb->ipv6_opts &= 2111 cpu_to_le16(~IPV6_OPT_IPV6_PROTOCOL_ENABLE & 2112 0xFFFF); 2113 qla4xxx_destroy_ipv6_iface(ha); 2114 } 2115 break; 2116 case ISCSI_NET_PARAM_VLAN_TAG: 2117 if (iface_param->len != sizeof(init_fw_cb->ipv6_vlan_tag)) 2118 break; 2119 init_fw_cb->ipv6_vlan_tag = 2120 cpu_to_be16(*(uint16_t *)iface_param->value); 2121 break; 2122 case ISCSI_NET_PARAM_VLAN_ENABLED: 2123 if (iface_param->value[0] == ISCSI_VLAN_ENABLE) 2124 init_fw_cb->ipv6_opts |= 2125 cpu_to_le16(IPV6_OPT_VLAN_TAGGING_ENABLE); 2126 else 2127 init_fw_cb->ipv6_opts &= 2128 cpu_to_le16(~IPV6_OPT_VLAN_TAGGING_ENABLE); 2129 break; 2130 case ISCSI_NET_PARAM_MTU: 2131 init_fw_cb->eth_mtu_size = 2132 cpu_to_le16(*(uint16_t *)iface_param->value); 2133 break; 2134 case ISCSI_NET_PARAM_PORT: 2135 /* Autocfg applies to even interface */ 2136 if (iface_param->iface_num & 0x1) 2137 break; 2138 2139 init_fw_cb->ipv6_port = 2140 cpu_to_le16(*(uint16_t *)iface_param->value); 2141 break; 2142 case ISCSI_NET_PARAM_DELAYED_ACK_EN: 2143 if (iface_param->iface_num & 0x1) 2144 break; 2145 if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE) 2146 init_fw_cb->ipv6_tcp_opts |= 2147 cpu_to_le16(IPV6_TCPOPT_DELAYED_ACK_DISABLE); 2148 else 2149 init_fw_cb->ipv6_tcp_opts &= 2150 cpu_to_le16(~IPV6_TCPOPT_DELAYED_ACK_DISABLE & 2151 0xFFFF); 2152 break; 2153 case ISCSI_NET_PARAM_TCP_NAGLE_DISABLE: 2154 if (iface_param->iface_num & 0x1) 2155 break; 2156 if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE) 2157 init_fw_cb->ipv6_tcp_opts |= 2158 cpu_to_le16(IPV6_TCPOPT_NAGLE_ALGO_DISABLE); 2159 else 2160 init_fw_cb->ipv6_tcp_opts &= 2161 cpu_to_le16(~IPV6_TCPOPT_NAGLE_ALGO_DISABLE); 2162 break; 2163 case ISCSI_NET_PARAM_TCP_WSF_DISABLE: 2164 if (iface_param->iface_num & 0x1) 2165 break; 2166 if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE) 2167 init_fw_cb->ipv6_tcp_opts |= 2168 cpu_to_le16(IPV6_TCPOPT_WINDOW_SCALE_DISABLE); 2169 else 2170 init_fw_cb->ipv6_tcp_opts &= 2171 cpu_to_le16(~IPV6_TCPOPT_WINDOW_SCALE_DISABLE); 2172 break; 2173 case ISCSI_NET_PARAM_TCP_WSF: 2174 if (iface_param->iface_num & 0x1) 2175 break; 2176 init_fw_cb->ipv6_tcp_wsf = iface_param->value[0]; 2177 break; 2178 case ISCSI_NET_PARAM_TCP_TIMER_SCALE: 2179 if (iface_param->iface_num & 0x1) 2180 break; 2181 init_fw_cb->ipv6_tcp_opts &= 2182 cpu_to_le16(~IPV6_TCPOPT_TIMER_SCALE); 2183 init_fw_cb->ipv6_tcp_opts |= 2184 cpu_to_le16((iface_param->value[0] << 1) & 2185 IPV6_TCPOPT_TIMER_SCALE); 2186 break; 2187 case ISCSI_NET_PARAM_TCP_TIMESTAMP_EN: 2188 if (iface_param->iface_num & 0x1) 2189 break; 2190 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2191 init_fw_cb->ipv6_tcp_opts |= 2192 cpu_to_le16(IPV6_TCPOPT_TIMESTAMP_EN); 2193 else 2194 init_fw_cb->ipv6_tcp_opts &= 2195 cpu_to_le16(~IPV6_TCPOPT_TIMESTAMP_EN); 2196 break; 2197 case ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN: 2198 if (iface_param->iface_num & 0x1) 2199 break; 2200 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2201 init_fw_cb->ipv6_opts |= 2202 cpu_to_le16(IPV6_OPT_GRAT_NEIGHBOR_ADV_EN); 2203 else 2204 init_fw_cb->ipv6_opts &= 2205 cpu_to_le16(~IPV6_OPT_GRAT_NEIGHBOR_ADV_EN); 2206 break; 2207 case ISCSI_NET_PARAM_REDIRECT_EN: 2208 if (iface_param->iface_num & 0x1) 2209 break; 2210 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2211 init_fw_cb->ipv6_opts |= 2212 cpu_to_le16(IPV6_OPT_REDIRECT_EN); 2213 else 2214 init_fw_cb->ipv6_opts &= 2215 cpu_to_le16(~IPV6_OPT_REDIRECT_EN); 2216 break; 2217 case ISCSI_NET_PARAM_IPV6_MLD_EN: 2218 if (iface_param->iface_num & 0x1) 2219 break; 2220 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2221 init_fw_cb->ipv6_addtl_opts |= 2222 cpu_to_le16(IPV6_ADDOPT_MLD_EN); 2223 else 2224 init_fw_cb->ipv6_addtl_opts &= 2225 cpu_to_le16(~IPV6_ADDOPT_MLD_EN); 2226 break; 2227 case ISCSI_NET_PARAM_IPV6_FLOW_LABEL: 2228 if (iface_param->iface_num & 0x1) 2229 break; 2230 init_fw_cb->ipv6_flow_lbl = 2231 cpu_to_le16(*(uint16_t *)iface_param->value); 2232 break; 2233 case ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS: 2234 if (iface_param->iface_num & 0x1) 2235 break; 2236 init_fw_cb->ipv6_traffic_class = iface_param->value[0]; 2237 break; 2238 case ISCSI_NET_PARAM_IPV6_HOP_LIMIT: 2239 if (iface_param->iface_num & 0x1) 2240 break; 2241 init_fw_cb->ipv6_hop_limit = iface_param->value[0]; 2242 break; 2243 case ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO: 2244 if (iface_param->iface_num & 0x1) 2245 break; 2246 init_fw_cb->ipv6_nd_reach_time = 2247 cpu_to_le32(*(uint32_t *)iface_param->value); 2248 break; 2249 case ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME: 2250 if (iface_param->iface_num & 0x1) 2251 break; 2252 init_fw_cb->ipv6_nd_rexmit_timer = 2253 cpu_to_le32(*(uint32_t *)iface_param->value); 2254 break; 2255 case ISCSI_NET_PARAM_IPV6_ND_STALE_TMO: 2256 if (iface_param->iface_num & 0x1) 2257 break; 2258 init_fw_cb->ipv6_nd_stale_timeout = 2259 cpu_to_le32(*(uint32_t *)iface_param->value); 2260 break; 2261 case ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT: 2262 if (iface_param->iface_num & 0x1) 2263 break; 2264 init_fw_cb->ipv6_dup_addr_detect_count = iface_param->value[0]; 2265 break; 2266 case ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU: 2267 if (iface_param->iface_num & 0x1) 2268 break; 2269 init_fw_cb->ipv6_gw_advrt_mtu = 2270 cpu_to_le32(*(uint32_t *)iface_param->value); 2271 break; 2272 default: 2273 ql4_printk(KERN_ERR, ha, "Unknown IPv6 param = %d\n", 2274 iface_param->param); 2275 break; 2276 } 2277} 2278 2279static void qla4xxx_set_ipv4(struct scsi_qla_host *ha, 2280 struct iscsi_iface_param_info *iface_param, 2281 struct addr_ctrl_blk *init_fw_cb) 2282{ 2283 switch (iface_param->param) { 2284 case ISCSI_NET_PARAM_IPV4_ADDR: 2285 memcpy(init_fw_cb->ipv4_addr, iface_param->value, 2286 sizeof(init_fw_cb->ipv4_addr)); 2287 break; 2288 case ISCSI_NET_PARAM_IPV4_SUBNET: 2289 memcpy(init_fw_cb->ipv4_subnet, iface_param->value, 2290 sizeof(init_fw_cb->ipv4_subnet)); 2291 break; 2292 case ISCSI_NET_PARAM_IPV4_GW: 2293 memcpy(init_fw_cb->ipv4_gw_addr, iface_param->value, 2294 sizeof(init_fw_cb->ipv4_gw_addr)); 2295 break; 2296 case ISCSI_NET_PARAM_IPV4_BOOTPROTO: 2297 if (iface_param->value[0] == ISCSI_BOOTPROTO_DHCP) 2298 init_fw_cb->ipv4_tcp_opts |= 2299 cpu_to_le16(TCPOPT_DHCP_ENABLE); 2300 else if (iface_param->value[0] == ISCSI_BOOTPROTO_STATIC) 2301 init_fw_cb->ipv4_tcp_opts &= 2302 cpu_to_le16(~TCPOPT_DHCP_ENABLE); 2303 else 2304 ql4_printk(KERN_ERR, ha, "Invalid IPv4 bootproto\n"); 2305 break; 2306 case ISCSI_NET_PARAM_IFACE_ENABLE: 2307 if (iface_param->value[0] == ISCSI_IFACE_ENABLE) { 2308 init_fw_cb->ipv4_ip_opts |= 2309 cpu_to_le16(IPOPT_IPV4_PROTOCOL_ENABLE); 2310 qla4xxx_create_ipv4_iface(ha); 2311 } else { 2312 init_fw_cb->ipv4_ip_opts &= 2313 cpu_to_le16(~IPOPT_IPV4_PROTOCOL_ENABLE & 2314 0xFFFF); 2315 qla4xxx_destroy_ipv4_iface(ha); 2316 } 2317 break; 2318 case ISCSI_NET_PARAM_VLAN_TAG: 2319 if (iface_param->len != sizeof(init_fw_cb->ipv4_vlan_tag)) 2320 break; 2321 init_fw_cb->ipv4_vlan_tag = 2322 cpu_to_be16(*(uint16_t *)iface_param->value); 2323 break; 2324 case ISCSI_NET_PARAM_VLAN_ENABLED: 2325 if (iface_param->value[0] == ISCSI_VLAN_ENABLE) 2326 init_fw_cb->ipv4_ip_opts |= 2327 cpu_to_le16(IPOPT_VLAN_TAGGING_ENABLE); 2328 else 2329 init_fw_cb->ipv4_ip_opts &= 2330 cpu_to_le16(~IPOPT_VLAN_TAGGING_ENABLE); 2331 break; 2332 case ISCSI_NET_PARAM_MTU: 2333 init_fw_cb->eth_mtu_size = 2334 cpu_to_le16(*(uint16_t *)iface_param->value); 2335 break; 2336 case ISCSI_NET_PARAM_PORT: 2337 init_fw_cb->ipv4_port = 2338 cpu_to_le16(*(uint16_t *)iface_param->value); 2339 break; 2340 case ISCSI_NET_PARAM_DELAYED_ACK_EN: 2341 if (iface_param->iface_num & 0x1) 2342 break; 2343 if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE) 2344 init_fw_cb->ipv4_tcp_opts |= 2345 cpu_to_le16(TCPOPT_DELAYED_ACK_DISABLE); 2346 else 2347 init_fw_cb->ipv4_tcp_opts &= 2348 cpu_to_le16(~TCPOPT_DELAYED_ACK_DISABLE & 2349 0xFFFF); 2350 break; 2351 case ISCSI_NET_PARAM_TCP_NAGLE_DISABLE: 2352 if (iface_param->iface_num & 0x1) 2353 break; 2354 if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE) 2355 init_fw_cb->ipv4_tcp_opts |= 2356 cpu_to_le16(TCPOPT_NAGLE_ALGO_DISABLE); 2357 else 2358 init_fw_cb->ipv4_tcp_opts &= 2359 cpu_to_le16(~TCPOPT_NAGLE_ALGO_DISABLE); 2360 break; 2361 case ISCSI_NET_PARAM_TCP_WSF_DISABLE: 2362 if (iface_param->iface_num & 0x1) 2363 break; 2364 if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE) 2365 init_fw_cb->ipv4_tcp_opts |= 2366 cpu_to_le16(TCPOPT_WINDOW_SCALE_DISABLE); 2367 else 2368 init_fw_cb->ipv4_tcp_opts &= 2369 cpu_to_le16(~TCPOPT_WINDOW_SCALE_DISABLE); 2370 break; 2371 case ISCSI_NET_PARAM_TCP_WSF: 2372 if (iface_param->iface_num & 0x1) 2373 break; 2374 init_fw_cb->ipv4_tcp_wsf = iface_param->value[0]; 2375 break; 2376 case ISCSI_NET_PARAM_TCP_TIMER_SCALE: 2377 if (iface_param->iface_num & 0x1) 2378 break; 2379 init_fw_cb->ipv4_tcp_opts &= cpu_to_le16(~TCPOPT_TIMER_SCALE); 2380 init_fw_cb->ipv4_tcp_opts |= 2381 cpu_to_le16((iface_param->value[0] << 1) & 2382 TCPOPT_TIMER_SCALE); 2383 break; 2384 case ISCSI_NET_PARAM_TCP_TIMESTAMP_EN: 2385 if (iface_param->iface_num & 0x1) 2386 break; 2387 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2388 init_fw_cb->ipv4_tcp_opts |= 2389 cpu_to_le16(TCPOPT_TIMESTAMP_ENABLE); 2390 else 2391 init_fw_cb->ipv4_tcp_opts &= 2392 cpu_to_le16(~TCPOPT_TIMESTAMP_ENABLE); 2393 break; 2394 case ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN: 2395 if (iface_param->iface_num & 0x1) 2396 break; 2397 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2398 init_fw_cb->ipv4_tcp_opts |= 2399 cpu_to_le16(TCPOPT_DNS_SERVER_IP_EN); 2400 else 2401 init_fw_cb->ipv4_tcp_opts &= 2402 cpu_to_le16(~TCPOPT_DNS_SERVER_IP_EN); 2403 break; 2404 case ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN: 2405 if (iface_param->iface_num & 0x1) 2406 break; 2407 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2408 init_fw_cb->ipv4_tcp_opts |= 2409 cpu_to_le16(TCPOPT_SLP_DA_INFO_EN); 2410 else 2411 init_fw_cb->ipv4_tcp_opts &= 2412 cpu_to_le16(~TCPOPT_SLP_DA_INFO_EN); 2413 break; 2414 case ISCSI_NET_PARAM_IPV4_TOS_EN: 2415 if (iface_param->iface_num & 0x1) 2416 break; 2417 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2418 init_fw_cb->ipv4_ip_opts |= 2419 cpu_to_le16(IPOPT_IPV4_TOS_EN); 2420 else 2421 init_fw_cb->ipv4_ip_opts &= 2422 cpu_to_le16(~IPOPT_IPV4_TOS_EN); 2423 break; 2424 case ISCSI_NET_PARAM_IPV4_TOS: 2425 if (iface_param->iface_num & 0x1) 2426 break; 2427 init_fw_cb->ipv4_tos = iface_param->value[0]; 2428 break; 2429 case ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN: 2430 if (iface_param->iface_num & 0x1) 2431 break; 2432 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2433 init_fw_cb->ipv4_ip_opts |= 2434 cpu_to_le16(IPOPT_GRAT_ARP_EN); 2435 else 2436 init_fw_cb->ipv4_ip_opts &= 2437 cpu_to_le16(~IPOPT_GRAT_ARP_EN); 2438 break; 2439 case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN: 2440 if (iface_param->iface_num & 0x1) 2441 break; 2442 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2443 init_fw_cb->ipv4_ip_opts |= 2444 cpu_to_le16(IPOPT_ALT_CID_EN); 2445 else 2446 init_fw_cb->ipv4_ip_opts &= 2447 cpu_to_le16(~IPOPT_ALT_CID_EN); 2448 break; 2449 case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID: 2450 if (iface_param->iface_num & 0x1) 2451 break; 2452 memcpy(init_fw_cb->ipv4_dhcp_alt_cid, iface_param->value, 2453 (sizeof(init_fw_cb->ipv4_dhcp_alt_cid) - 1)); 2454 init_fw_cb->ipv4_dhcp_alt_cid_len = 2455 strlen(init_fw_cb->ipv4_dhcp_alt_cid); 2456 break; 2457 case ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN: 2458 if (iface_param->iface_num & 0x1) 2459 break; 2460 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2461 init_fw_cb->ipv4_ip_opts |= 2462 cpu_to_le16(IPOPT_REQ_VID_EN); 2463 else 2464 init_fw_cb->ipv4_ip_opts &= 2465 cpu_to_le16(~IPOPT_REQ_VID_EN); 2466 break; 2467 case ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN: 2468 if (iface_param->iface_num & 0x1) 2469 break; 2470 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2471 init_fw_cb->ipv4_ip_opts |= 2472 cpu_to_le16(IPOPT_USE_VID_EN); 2473 else 2474 init_fw_cb->ipv4_ip_opts &= 2475 cpu_to_le16(~IPOPT_USE_VID_EN); 2476 break; 2477 case ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID: 2478 if (iface_param->iface_num & 0x1) 2479 break; 2480 memcpy(init_fw_cb->ipv4_dhcp_vid, iface_param->value, 2481 (sizeof(init_fw_cb->ipv4_dhcp_vid) - 1)); 2482 init_fw_cb->ipv4_dhcp_vid_len = 2483 strlen(init_fw_cb->ipv4_dhcp_vid); 2484 break; 2485 case ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN: 2486 if (iface_param->iface_num & 0x1) 2487 break; 2488 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2489 init_fw_cb->ipv4_ip_opts |= 2490 cpu_to_le16(IPOPT_LEARN_IQN_EN); 2491 else 2492 init_fw_cb->ipv4_ip_opts &= 2493 cpu_to_le16(~IPOPT_LEARN_IQN_EN); 2494 break; 2495 case ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE: 2496 if (iface_param->iface_num & 0x1) 2497 break; 2498 if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE) 2499 init_fw_cb->ipv4_ip_opts |= 2500 cpu_to_le16(IPOPT_FRAGMENTATION_DISABLE); 2501 else 2502 init_fw_cb->ipv4_ip_opts &= 2503 cpu_to_le16(~IPOPT_FRAGMENTATION_DISABLE); 2504 break; 2505 case ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN: 2506 if (iface_param->iface_num & 0x1) 2507 break; 2508 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2509 init_fw_cb->ipv4_ip_opts |= 2510 cpu_to_le16(IPOPT_IN_FORWARD_EN); 2511 else 2512 init_fw_cb->ipv4_ip_opts &= 2513 cpu_to_le16(~IPOPT_IN_FORWARD_EN); 2514 break; 2515 case ISCSI_NET_PARAM_REDIRECT_EN: 2516 if (iface_param->iface_num & 0x1) 2517 break; 2518 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2519 init_fw_cb->ipv4_ip_opts |= 2520 cpu_to_le16(IPOPT_ARP_REDIRECT_EN); 2521 else 2522 init_fw_cb->ipv4_ip_opts &= 2523 cpu_to_le16(~IPOPT_ARP_REDIRECT_EN); 2524 break; 2525 case ISCSI_NET_PARAM_IPV4_TTL: 2526 if (iface_param->iface_num & 0x1) 2527 break; 2528 init_fw_cb->ipv4_ttl = iface_param->value[0]; 2529 break; 2530 default: 2531 ql4_printk(KERN_ERR, ha, "Unknown IPv4 param = %d\n", 2532 iface_param->param); 2533 break; 2534 } 2535} 2536 2537static void qla4xxx_set_iscsi_param(struct scsi_qla_host *ha, 2538 struct iscsi_iface_param_info *iface_param, 2539 struct addr_ctrl_blk *init_fw_cb) 2540{ 2541 switch (iface_param->param) { 2542 case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO: 2543 if (iface_param->iface_num & 0x1) 2544 break; 2545 init_fw_cb->def_timeout = 2546 cpu_to_le16(*(uint16_t *)iface_param->value); 2547 break; 2548 case ISCSI_IFACE_PARAM_HDRDGST_EN: 2549 if (iface_param->iface_num & 0x1) 2550 break; 2551 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2552 init_fw_cb->iscsi_opts |= 2553 cpu_to_le16(ISCSIOPTS_HEADER_DIGEST_EN); 2554 else 2555 init_fw_cb->iscsi_opts &= 2556 cpu_to_le16(~ISCSIOPTS_HEADER_DIGEST_EN); 2557 break; 2558 case ISCSI_IFACE_PARAM_DATADGST_EN: 2559 if (iface_param->iface_num & 0x1) 2560 break; 2561 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2562 init_fw_cb->iscsi_opts |= 2563 cpu_to_le16(ISCSIOPTS_DATA_DIGEST_EN); 2564 else 2565 init_fw_cb->iscsi_opts &= 2566 cpu_to_le16(~ISCSIOPTS_DATA_DIGEST_EN); 2567 break; 2568 case ISCSI_IFACE_PARAM_IMM_DATA_EN: 2569 if (iface_param->iface_num & 0x1) 2570 break; 2571 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2572 init_fw_cb->iscsi_opts |= 2573 cpu_to_le16(ISCSIOPTS_IMMEDIATE_DATA_EN); 2574 else 2575 init_fw_cb->iscsi_opts &= 2576 cpu_to_le16(~ISCSIOPTS_IMMEDIATE_DATA_EN); 2577 break; 2578 case ISCSI_IFACE_PARAM_INITIAL_R2T_EN: 2579 if (iface_param->iface_num & 0x1) 2580 break; 2581 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2582 init_fw_cb->iscsi_opts |= 2583 cpu_to_le16(ISCSIOPTS_INITIAL_R2T_EN); 2584 else 2585 init_fw_cb->iscsi_opts &= 2586 cpu_to_le16(~ISCSIOPTS_INITIAL_R2T_EN); 2587 break; 2588 case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN: 2589 if (iface_param->iface_num & 0x1) 2590 break; 2591 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2592 init_fw_cb->iscsi_opts |= 2593 cpu_to_le16(ISCSIOPTS_DATA_SEQ_INORDER_EN); 2594 else 2595 init_fw_cb->iscsi_opts &= 2596 cpu_to_le16(~ISCSIOPTS_DATA_SEQ_INORDER_EN); 2597 break; 2598 case ISCSI_IFACE_PARAM_PDU_INORDER_EN: 2599 if (iface_param->iface_num & 0x1) 2600 break; 2601 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2602 init_fw_cb->iscsi_opts |= 2603 cpu_to_le16(ISCSIOPTS_DATA_PDU_INORDER_EN); 2604 else 2605 init_fw_cb->iscsi_opts &= 2606 cpu_to_le16(~ISCSIOPTS_DATA_PDU_INORDER_EN); 2607 break; 2608 case ISCSI_IFACE_PARAM_ERL: 2609 if (iface_param->iface_num & 0x1) 2610 break; 2611 init_fw_cb->iscsi_opts &= cpu_to_le16(~ISCSIOPTS_ERL); 2612 init_fw_cb->iscsi_opts |= cpu_to_le16(iface_param->value[0] & 2613 ISCSIOPTS_ERL); 2614 break; 2615 case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH: 2616 if (iface_param->iface_num & 0x1) 2617 break; 2618 init_fw_cb->iscsi_max_pdu_size = 2619 cpu_to_le32(*(uint32_t *)iface_param->value) / 2620 BYTE_UNITS; 2621 break; 2622 case ISCSI_IFACE_PARAM_FIRST_BURST: 2623 if (iface_param->iface_num & 0x1) 2624 break; 2625 init_fw_cb->iscsi_fburst_len = 2626 cpu_to_le32(*(uint32_t *)iface_param->value) / 2627 BYTE_UNITS; 2628 break; 2629 case ISCSI_IFACE_PARAM_MAX_R2T: 2630 if (iface_param->iface_num & 0x1) 2631 break; 2632 init_fw_cb->iscsi_max_outstnd_r2t = 2633 cpu_to_le16(*(uint16_t *)iface_param->value); 2634 break; 2635 case ISCSI_IFACE_PARAM_MAX_BURST: 2636 if (iface_param->iface_num & 0x1) 2637 break; 2638 init_fw_cb->iscsi_max_burst_len = 2639 cpu_to_le32(*(uint32_t *)iface_param->value) / 2640 BYTE_UNITS; 2641 break; 2642 case ISCSI_IFACE_PARAM_CHAP_AUTH_EN: 2643 if (iface_param->iface_num & 0x1) 2644 break; 2645 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2646 init_fw_cb->iscsi_opts |= 2647 cpu_to_le16(ISCSIOPTS_CHAP_AUTH_EN); 2648 else 2649 init_fw_cb->iscsi_opts &= 2650 cpu_to_le16(~ISCSIOPTS_CHAP_AUTH_EN); 2651 break; 2652 case ISCSI_IFACE_PARAM_BIDI_CHAP_EN: 2653 if (iface_param->iface_num & 0x1) 2654 break; 2655 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2656 init_fw_cb->iscsi_opts |= 2657 cpu_to_le16(ISCSIOPTS_BIDI_CHAP_EN); 2658 else 2659 init_fw_cb->iscsi_opts &= 2660 cpu_to_le16(~ISCSIOPTS_BIDI_CHAP_EN); 2661 break; 2662 case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL: 2663 if (iface_param->iface_num & 0x1) 2664 break; 2665 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2666 init_fw_cb->iscsi_opts |= 2667 cpu_to_le16(ISCSIOPTS_DISCOVERY_AUTH_EN); 2668 else 2669 init_fw_cb->iscsi_opts &= 2670 cpu_to_le16(~ISCSIOPTS_DISCOVERY_AUTH_EN); 2671 break; 2672 case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN: 2673 if (iface_param->iface_num & 0x1) 2674 break; 2675 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2676 init_fw_cb->iscsi_opts |= 2677 cpu_to_le16(ISCSIOPTS_DISCOVERY_LOGOUT_EN); 2678 else 2679 init_fw_cb->iscsi_opts &= 2680 cpu_to_le16(~ISCSIOPTS_DISCOVERY_LOGOUT_EN); 2681 break; 2682 case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN: 2683 if (iface_param->iface_num & 0x1) 2684 break; 2685 if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE) 2686 init_fw_cb->iscsi_opts |= 2687 cpu_to_le16(ISCSIOPTS_STRICT_LOGIN_COMP_EN); 2688 else 2689 init_fw_cb->iscsi_opts &= 2690 cpu_to_le16(~ISCSIOPTS_STRICT_LOGIN_COMP_EN); 2691 break; 2692 default: 2693 ql4_printk(KERN_ERR, ha, "Unknown iscsi param = %d\n", 2694 iface_param->param); 2695 break; 2696 } 2697} 2698 2699static void 2700qla4xxx_initcb_to_acb(struct addr_ctrl_blk *init_fw_cb) 2701{ 2702 struct addr_ctrl_blk_def *acb; 2703 acb = (struct addr_ctrl_blk_def *)init_fw_cb; 2704 memset(acb->reserved1, 0, sizeof(acb->reserved1)); 2705 memset(acb->reserved2, 0, sizeof(acb->reserved2)); 2706 memset(acb->reserved3, 0, sizeof(acb->reserved3)); 2707 memset(acb->reserved4, 0, sizeof(acb->reserved4)); 2708 memset(acb->reserved5, 0, sizeof(acb->reserved5)); 2709 memset(acb->reserved6, 0, sizeof(acb->reserved6)); 2710 memset(acb->reserved7, 0, sizeof(acb->reserved7)); 2711 memset(acb->reserved8, 0, sizeof(acb->reserved8)); 2712 memset(acb->reserved9, 0, sizeof(acb->reserved9)); 2713 memset(acb->reserved10, 0, sizeof(acb->reserved10)); 2714 memset(acb->reserved11, 0, sizeof(acb->reserved11)); 2715 memset(acb->reserved12, 0, sizeof(acb->reserved12)); 2716 memset(acb->reserved13, 0, sizeof(acb->reserved13)); 2717 memset(acb->reserved14, 0, sizeof(acb->reserved14)); 2718 memset(acb->reserved15, 0, sizeof(acb->reserved15)); 2719} 2720 2721static int 2722qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data, uint32_t len) 2723{ 2724 struct scsi_qla_host *ha = to_qla_host(shost); 2725 int rval = 0; 2726 struct iscsi_iface_param_info *iface_param = NULL; 2727 struct addr_ctrl_blk *init_fw_cb = NULL; 2728 dma_addr_t init_fw_cb_dma; 2729 uint32_t mbox_cmd[MBOX_REG_COUNT]; 2730 uint32_t mbox_sts[MBOX_REG_COUNT]; 2731 uint32_t rem = len; 2732 struct nlattr *attr; 2733 2734 init_fw_cb = dma_alloc_coherent(&ha->pdev->dev, 2735 sizeof(struct addr_ctrl_blk), 2736 &init_fw_cb_dma, GFP_KERNEL); 2737 if (!init_fw_cb) { 2738 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc init_cb\n", 2739 __func__); 2740 return -ENOMEM; 2741 } 2742 2743 memset(&mbox_cmd, 0, sizeof(mbox_cmd)); 2744 memset(&mbox_sts, 0, sizeof(mbox_sts)); 2745 2746 if (qla4xxx_get_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma)) { 2747 ql4_printk(KERN_ERR, ha, "%s: get ifcb failed\n", __func__); 2748 rval = -EIO; 2749 goto exit_init_fw_cb; 2750 } 2751 2752 nla_for_each_attr(attr, data, len, rem) { 2753 iface_param = nla_data(attr); 2754 2755 if (iface_param->param_type == ISCSI_NET_PARAM) { 2756 switch (iface_param->iface_type) { 2757 case ISCSI_IFACE_TYPE_IPV4: 2758 switch (iface_param->iface_num) { 2759 case 0: 2760 qla4xxx_set_ipv4(ha, iface_param, 2761 init_fw_cb); 2762 break; 2763 default: 2764 /* Cannot have more than one IPv4 interface */ 2765 ql4_printk(KERN_ERR, ha, 2766 "Invalid IPv4 iface number = %d\n", 2767 iface_param->iface_num); 2768 break; 2769 } 2770 break; 2771 case ISCSI_IFACE_TYPE_IPV6: 2772 switch (iface_param->iface_num) { 2773 case 0: 2774 case 1: 2775 qla4xxx_set_ipv6(ha, iface_param, 2776 init_fw_cb); 2777 break; 2778 default: 2779 /* Cannot have more than two IPv6 interface */ 2780 ql4_printk(KERN_ERR, ha, 2781 "Invalid IPv6 iface number = %d\n", 2782 iface_param->iface_num); 2783 break; 2784 } 2785 break; 2786 default: 2787 ql4_printk(KERN_ERR, ha, 2788 "Invalid iface type\n"); 2789 break; 2790 } 2791 } else if (iface_param->param_type == ISCSI_IFACE_PARAM) { 2792 qla4xxx_set_iscsi_param(ha, iface_param, 2793 init_fw_cb); 2794 } else { 2795 continue; 2796 } 2797 } 2798 2799 init_fw_cb->cookie = cpu_to_le32(0x11BEAD5A); 2800 2801 rval = qla4xxx_set_flash(ha, init_fw_cb_dma, FLASH_SEGMENT_IFCB, 2802 sizeof(struct addr_ctrl_blk), 2803 FLASH_OPT_RMW_COMMIT); 2804 if (rval != QLA_SUCCESS) { 2805 ql4_printk(KERN_ERR, ha, "%s: set flash mbx failed\n", 2806 __func__); 2807 rval = -EIO; 2808 goto exit_init_fw_cb; 2809 } 2810 2811 rval = qla4xxx_disable_acb(ha); 2812 if (rval != QLA_SUCCESS) { 2813 ql4_printk(KERN_ERR, ha, "%s: disable acb mbx failed\n", 2814 __func__); 2815 rval = -EIO; 2816 goto exit_init_fw_cb; 2817 } 2818 2819 wait_for_completion_timeout(&ha->disable_acb_comp, 2820 DISABLE_ACB_TOV * HZ); 2821 2822 qla4xxx_initcb_to_acb(init_fw_cb); 2823 2824 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma); 2825 if (rval != QLA_SUCCESS) { 2826 ql4_printk(KERN_ERR, ha, "%s: set acb mbx failed\n", 2827 __func__); 2828 rval = -EIO; 2829 goto exit_init_fw_cb; 2830 } 2831 2832 memset(init_fw_cb, 0, sizeof(struct addr_ctrl_blk)); 2833 qla4xxx_update_local_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb, 2834 init_fw_cb_dma); 2835 2836exit_init_fw_cb: 2837 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk), 2838 init_fw_cb, init_fw_cb_dma); 2839 2840 return rval; 2841} 2842 2843static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess, 2844 enum iscsi_param param, char *buf) 2845{ 2846 struct iscsi_session *sess = cls_sess->dd_data; 2847 struct ddb_entry *ddb_entry = sess->dd_data; 2848 struct scsi_qla_host *ha = ddb_entry->ha; 2849 struct iscsi_cls_conn *cls_conn = ddb_entry->conn; 2850 struct ql4_chap_table chap_tbl; 2851 int rval, len; 2852 uint16_t idx; 2853 2854 memset(&chap_tbl, 0, sizeof(chap_tbl)); 2855 switch (param) { 2856 case ISCSI_PARAM_CHAP_IN_IDX: 2857 rval = qla4xxx_get_chap_index(ha, sess->username_in, 2858 sess->password_in, BIDI_CHAP, 2859 &idx); 2860 if (rval) 2861 len = sprintf(buf, "\n"); 2862 else 2863 len = sprintf(buf, "%hu\n", idx); 2864 break; 2865 case ISCSI_PARAM_CHAP_OUT_IDX: 2866 if (ddb_entry->ddb_type == FLASH_DDB) { 2867 if (ddb_entry->chap_tbl_idx != INVALID_ENTRY) { 2868 idx = ddb_entry->chap_tbl_idx; 2869 rval = QLA_SUCCESS; 2870 } else { 2871 rval = QLA_ERROR; 2872 } 2873 } else { 2874 rval = qla4xxx_get_chap_index(ha, sess->username, 2875 sess->password, 2876 LOCAL_CHAP, &idx); 2877 } 2878 if (rval) 2879 len = sprintf(buf, "\n"); 2880 else 2881 len = sprintf(buf, "%hu\n", idx); 2882 break; 2883 case ISCSI_PARAM_USERNAME: 2884 case ISCSI_PARAM_PASSWORD: 2885 /* First, populate session username and password for FLASH DDB, 2886 * if not already done. This happens when session login fails 2887 * for a FLASH DDB. 2888 */ 2889 if (ddb_entry->ddb_type == FLASH_DDB && 2890 ddb_entry->chap_tbl_idx != INVALID_ENTRY && 2891 !sess->username && !sess->password) { 2892 idx = ddb_entry->chap_tbl_idx; 2893 rval = qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, 2894 chap_tbl.secret, 2895 idx); 2896 if (!rval) { 2897 iscsi_set_param(cls_conn, ISCSI_PARAM_USERNAME, 2898 (char *)chap_tbl.name, 2899 strlen((char *)chap_tbl.name)); 2900 iscsi_set_param(cls_conn, ISCSI_PARAM_PASSWORD, 2901 (char *)chap_tbl.secret, 2902 chap_tbl.secret_len); 2903 } 2904 } 2905 fallthrough; 2906 default: 2907 return iscsi_session_get_param(cls_sess, param, buf); 2908 } 2909 2910 return len; 2911} 2912 2913static int qla4xxx_conn_get_param(struct iscsi_cls_conn *cls_conn, 2914 enum iscsi_param param, char *buf) 2915{ 2916 struct iscsi_conn *conn; 2917 struct qla_conn *qla_conn; 2918 struct sockaddr *dst_addr; 2919 2920 conn = cls_conn->dd_data; 2921 qla_conn = conn->dd_data; 2922 dst_addr = (struct sockaddr *)&qla_conn->qla_ep->dst_addr; 2923 2924 switch (param) { 2925 case ISCSI_PARAM_CONN_PORT: 2926 case ISCSI_PARAM_CONN_ADDRESS: 2927 return iscsi_conn_get_addr_param((struct sockaddr_storage *) 2928 dst_addr, param, buf); 2929 default: 2930 return iscsi_conn_get_param(cls_conn, param, buf); 2931 } 2932} 2933 2934int qla4xxx_get_ddb_index(struct scsi_qla_host *ha, uint16_t *ddb_index) 2935{ 2936 uint32_t mbx_sts = 0; 2937 uint16_t tmp_ddb_index; 2938 int ret; 2939 2940get_ddb_index: 2941 tmp_ddb_index = find_first_zero_bit(ha->ddb_idx_map, MAX_DDB_ENTRIES); 2942 2943 if (tmp_ddb_index >= MAX_DDB_ENTRIES) { 2944 DEBUG2(ql4_printk(KERN_INFO, ha, 2945 "Free DDB index not available\n")); 2946 ret = QLA_ERROR; 2947 goto exit_get_ddb_index; 2948 } 2949 2950 if (test_and_set_bit(tmp_ddb_index, ha->ddb_idx_map)) 2951 goto get_ddb_index; 2952 2953 DEBUG2(ql4_printk(KERN_INFO, ha, 2954 "Found a free DDB index at %d\n", tmp_ddb_index)); 2955 ret = qla4xxx_req_ddb_entry(ha, tmp_ddb_index, &mbx_sts); 2956 if (ret == QLA_ERROR) { 2957 if (mbx_sts == MBOX_STS_COMMAND_ERROR) { 2958 ql4_printk(KERN_INFO, ha, 2959 "DDB index = %d not available trying next\n", 2960 tmp_ddb_index); 2961 goto get_ddb_index; 2962 } 2963 DEBUG2(ql4_printk(KERN_INFO, ha, 2964 "Free FW DDB not available\n")); 2965 } 2966 2967 *ddb_index = tmp_ddb_index; 2968 2969exit_get_ddb_index: 2970 return ret; 2971} 2972 2973static int qla4xxx_match_ipaddress(struct scsi_qla_host *ha, 2974 struct ddb_entry *ddb_entry, 2975 char *existing_ipaddr, 2976 char *user_ipaddr) 2977{ 2978 uint8_t dst_ipaddr[IPv6_ADDR_LEN]; 2979 char formatted_ipaddr[DDB_IPADDR_LEN]; 2980 int status = QLA_SUCCESS, ret = 0; 2981 2982 if (ddb_entry->fw_ddb_entry.options & DDB_OPT_IPV6_DEVICE) { 2983 ret = in6_pton(user_ipaddr, strlen(user_ipaddr), dst_ipaddr, 2984 '\0', NULL); 2985 if (ret == 0) { 2986 status = QLA_ERROR; 2987 goto out_match; 2988 } 2989 ret = sprintf(formatted_ipaddr, "%pI6", dst_ipaddr); 2990 } else { 2991 ret = in4_pton(user_ipaddr, strlen(user_ipaddr), dst_ipaddr, 2992 '\0', NULL); 2993 if (ret == 0) { 2994 status = QLA_ERROR; 2995 goto out_match; 2996 } 2997 ret = sprintf(formatted_ipaddr, "%pI4", dst_ipaddr); 2998 } 2999 3000 if (strcmp(existing_ipaddr, formatted_ipaddr)) 3001 status = QLA_ERROR; 3002 3003out_match: 3004 return status; 3005} 3006 3007static int qla4xxx_match_fwdb_session(struct scsi_qla_host *ha, 3008 struct iscsi_cls_conn *cls_conn) 3009{ 3010 int idx = 0, max_ddbs, rval; 3011 struct iscsi_cls_session *cls_sess = iscsi_conn_to_session(cls_conn); 3012 struct iscsi_session *sess, *existing_sess; 3013 struct iscsi_conn *conn, *existing_conn; 3014 struct ddb_entry *ddb_entry; 3015 3016 sess = cls_sess->dd_data; 3017 conn = cls_conn->dd_data; 3018 3019 if (sess->targetname == NULL || 3020 conn->persistent_address == NULL || 3021 conn->persistent_port == 0) 3022 return QLA_ERROR; 3023 3024 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : 3025 MAX_DEV_DB_ENTRIES; 3026 3027 for (idx = 0; idx < max_ddbs; idx++) { 3028 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); 3029 if (ddb_entry == NULL) 3030 continue; 3031 3032 if (ddb_entry->ddb_type != FLASH_DDB) 3033 continue; 3034 3035 existing_sess = ddb_entry->sess->dd_data; 3036 existing_conn = ddb_entry->conn->dd_data; 3037 3038 if (existing_sess->targetname == NULL || 3039 existing_conn->persistent_address == NULL || 3040 existing_conn->persistent_port == 0) 3041 continue; 3042 3043 DEBUG2(ql4_printk(KERN_INFO, ha, 3044 "IQN = %s User IQN = %s\n", 3045 existing_sess->targetname, 3046 sess->targetname)); 3047 3048 DEBUG2(ql4_printk(KERN_INFO, ha, 3049 "IP = %s User IP = %s\n", 3050 existing_conn->persistent_address, 3051 conn->persistent_address)); 3052 3053 DEBUG2(ql4_printk(KERN_INFO, ha, 3054 "Port = %d User Port = %d\n", 3055 existing_conn->persistent_port, 3056 conn->persistent_port)); 3057 3058 if (strcmp(existing_sess->targetname, sess->targetname)) 3059 continue; 3060 rval = qla4xxx_match_ipaddress(ha, ddb_entry, 3061 existing_conn->persistent_address, 3062 conn->persistent_address); 3063 if (rval == QLA_ERROR) 3064 continue; 3065 if (existing_conn->persistent_port != conn->persistent_port) 3066 continue; 3067 break; 3068 } 3069 3070 if (idx == max_ddbs) 3071 return QLA_ERROR; 3072 3073 DEBUG2(ql4_printk(KERN_INFO, ha, 3074 "Match found in fwdb sessions\n")); 3075 return QLA_SUCCESS; 3076} 3077 3078static struct iscsi_cls_session * 3079qla4xxx_session_create(struct iscsi_endpoint *ep, 3080 uint16_t cmds_max, uint16_t qdepth, 3081 uint32_t initial_cmdsn) 3082{ 3083 struct iscsi_cls_session *cls_sess; 3084 struct scsi_qla_host *ha; 3085 struct qla_endpoint *qla_ep; 3086 struct ddb_entry *ddb_entry; 3087 uint16_t ddb_index; 3088 struct iscsi_session *sess; 3089 int ret; 3090 3091 if (!ep) { 3092 printk(KERN_ERR "qla4xxx: missing ep.\n"); 3093 return NULL; 3094 } 3095 3096 qla_ep = ep->dd_data; 3097 ha = to_qla_host(qla_ep->host); 3098 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, 3099 ha->host_no)); 3100 3101 ret = qla4xxx_get_ddb_index(ha, &ddb_index); 3102 if (ret == QLA_ERROR) 3103 return NULL; 3104 3105 cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, qla_ep->host, 3106 cmds_max, sizeof(struct ddb_entry), 3107 sizeof(struct ql4_task_data), 3108 initial_cmdsn, ddb_index); 3109 if (!cls_sess) 3110 return NULL; 3111 3112 sess = cls_sess->dd_data; 3113 ddb_entry = sess->dd_data; 3114 ddb_entry->fw_ddb_index = ddb_index; 3115 ddb_entry->fw_ddb_device_state = DDB_DS_NO_CONNECTION_ACTIVE; 3116 ddb_entry->ha = ha; 3117 ddb_entry->sess = cls_sess; 3118 ddb_entry->unblock_sess = qla4xxx_unblock_ddb; 3119 ddb_entry->ddb_change = qla4xxx_ddb_change; 3120 clear_bit(DDB_CONN_CLOSE_FAILURE, &ddb_entry->flags); 3121 cls_sess->recovery_tmo = ql4xsess_recovery_tmo; 3122 ha->fw_ddb_index_map[ddb_entry->fw_ddb_index] = ddb_entry; 3123 ha->tot_ddbs++; 3124 3125 return cls_sess; 3126} 3127 3128static void qla4xxx_session_destroy(struct iscsi_cls_session *cls_sess) 3129{ 3130 struct iscsi_session *sess; 3131 struct ddb_entry *ddb_entry; 3132 struct scsi_qla_host *ha; 3133 unsigned long flags, wtime; 3134 struct dev_db_entry *fw_ddb_entry = NULL; 3135 dma_addr_t fw_ddb_entry_dma; 3136 uint32_t ddb_state; 3137 int ret; 3138 3139 sess = cls_sess->dd_data; 3140 ddb_entry = sess->dd_data; 3141 ha = ddb_entry->ha; 3142 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, 3143 ha->host_no)); 3144 3145 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 3146 &fw_ddb_entry_dma, GFP_KERNEL); 3147 if (!fw_ddb_entry) { 3148 ql4_printk(KERN_ERR, ha, 3149 "%s: Unable to allocate dma buffer\n", __func__); 3150 goto destroy_session; 3151 } 3152 3153 wtime = jiffies + (HZ * LOGOUT_TOV); 3154 do { 3155 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, 3156 fw_ddb_entry, fw_ddb_entry_dma, 3157 NULL, NULL, &ddb_state, NULL, 3158 NULL, NULL); 3159 if (ret == QLA_ERROR) 3160 goto destroy_session; 3161 3162 if ((ddb_state == DDB_DS_NO_CONNECTION_ACTIVE) || 3163 (ddb_state == DDB_DS_SESSION_FAILED)) 3164 goto destroy_session; 3165 3166 schedule_timeout_uninterruptible(HZ); 3167 } while ((time_after(wtime, jiffies))); 3168 3169destroy_session: 3170 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); 3171 if (test_and_clear_bit(DDB_CONN_CLOSE_FAILURE, &ddb_entry->flags)) 3172 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); 3173 spin_lock_irqsave(&ha->hardware_lock, flags); 3174 qla4xxx_free_ddb(ha, ddb_entry); 3175 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3176 3177 iscsi_session_teardown(cls_sess); 3178 3179 if (fw_ddb_entry) 3180 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 3181 fw_ddb_entry, fw_ddb_entry_dma); 3182} 3183 3184static struct iscsi_cls_conn * 3185qla4xxx_conn_create(struct iscsi_cls_session *cls_sess, uint32_t conn_idx) 3186{ 3187 struct iscsi_cls_conn *cls_conn; 3188 struct iscsi_session *sess; 3189 struct ddb_entry *ddb_entry; 3190 struct scsi_qla_host *ha; 3191 3192 cls_conn = iscsi_conn_setup(cls_sess, sizeof(struct qla_conn), 3193 conn_idx); 3194 if (!cls_conn) { 3195 pr_info("%s: Can not create connection for conn_idx = %u\n", 3196 __func__, conn_idx); 3197 return NULL; 3198 } 3199 3200 sess = cls_sess->dd_data; 3201 ddb_entry = sess->dd_data; 3202 ddb_entry->conn = cls_conn; 3203 3204 ha = ddb_entry->ha; 3205 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: conn_idx = %u\n", __func__, 3206 conn_idx)); 3207 return cls_conn; 3208} 3209 3210static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session, 3211 struct iscsi_cls_conn *cls_conn, 3212 uint64_t transport_fd, int is_leading) 3213{ 3214 struct iscsi_conn *conn; 3215 struct qla_conn *qla_conn; 3216 struct iscsi_endpoint *ep; 3217 struct ddb_entry *ddb_entry; 3218 struct scsi_qla_host *ha; 3219 struct iscsi_session *sess; 3220 3221 sess = cls_session->dd_data; 3222 ddb_entry = sess->dd_data; 3223 ha = ddb_entry->ha; 3224 3225 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, 3226 cls_session->sid, cls_conn->cid)); 3227 3228 if (iscsi_conn_bind(cls_session, cls_conn, is_leading)) 3229 return -EINVAL; 3230 ep = iscsi_lookup_endpoint(transport_fd); 3231 if (!ep) 3232 return -EINVAL; 3233 conn = cls_conn->dd_data; 3234 qla_conn = conn->dd_data; 3235 qla_conn->qla_ep = ep->dd_data; 3236 iscsi_put_endpoint(ep); 3237 return 0; 3238} 3239 3240static int qla4xxx_conn_start(struct iscsi_cls_conn *cls_conn) 3241{ 3242 struct iscsi_cls_session *cls_sess = iscsi_conn_to_session(cls_conn); 3243 struct iscsi_session *sess; 3244 struct ddb_entry *ddb_entry; 3245 struct scsi_qla_host *ha; 3246 struct dev_db_entry *fw_ddb_entry = NULL; 3247 dma_addr_t fw_ddb_entry_dma; 3248 uint32_t mbx_sts = 0; 3249 int ret = 0; 3250 int status = QLA_SUCCESS; 3251 3252 sess = cls_sess->dd_data; 3253 ddb_entry = sess->dd_data; 3254 ha = ddb_entry->ha; 3255 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, 3256 cls_sess->sid, cls_conn->cid)); 3257 3258 /* Check if we have matching FW DDB, if yes then do not 3259 * login to this target. This could cause target to logout previous 3260 * connection 3261 */ 3262 ret = qla4xxx_match_fwdb_session(ha, cls_conn); 3263 if (ret == QLA_SUCCESS) { 3264 ql4_printk(KERN_INFO, ha, 3265 "Session already exist in FW.\n"); 3266 ret = -EEXIST; 3267 goto exit_conn_start; 3268 } 3269 3270 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 3271 &fw_ddb_entry_dma, GFP_KERNEL); 3272 if (!fw_ddb_entry) { 3273 ql4_printk(KERN_ERR, ha, 3274 "%s: Unable to allocate dma buffer\n", __func__); 3275 ret = -ENOMEM; 3276 goto exit_conn_start; 3277 } 3278 3279 ret = qla4xxx_set_param_ddbentry(ha, ddb_entry, cls_conn, &mbx_sts); 3280 if (ret) { 3281 /* If iscsid is stopped and started then no need to do 3282 * set param again since ddb state will be already 3283 * active and FW does not allow set ddb to an 3284 * active session. 3285 */ 3286 if (mbx_sts) 3287 if (ddb_entry->fw_ddb_device_state == 3288 DDB_DS_SESSION_ACTIVE) { 3289 ddb_entry->unblock_sess(ddb_entry->sess); 3290 goto exit_set_param; 3291 } 3292 3293 ql4_printk(KERN_ERR, ha, "%s: Failed set param for index[%d]\n", 3294 __func__, ddb_entry->fw_ddb_index); 3295 goto exit_conn_start; 3296 } 3297 3298 status = qla4xxx_conn_open(ha, ddb_entry->fw_ddb_index); 3299 if (status == QLA_ERROR) { 3300 ql4_printk(KERN_ERR, ha, "%s: Login failed: %s\n", __func__, 3301 sess->targetname); 3302 ret = -EINVAL; 3303 goto exit_conn_start; 3304 } 3305 3306 if (ddb_entry->fw_ddb_device_state == DDB_DS_NO_CONNECTION_ACTIVE) 3307 ddb_entry->fw_ddb_device_state = DDB_DS_LOGIN_IN_PROCESS; 3308 3309 DEBUG2(printk(KERN_INFO "%s: DDB state [%d]\n", __func__, 3310 ddb_entry->fw_ddb_device_state)); 3311 3312exit_set_param: 3313 ret = 0; 3314 3315exit_conn_start: 3316 if (fw_ddb_entry) 3317 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 3318 fw_ddb_entry, fw_ddb_entry_dma); 3319 return ret; 3320} 3321 3322static void qla4xxx_conn_destroy(struct iscsi_cls_conn *cls_conn) 3323{ 3324 struct iscsi_cls_session *cls_sess = iscsi_conn_to_session(cls_conn); 3325 struct iscsi_session *sess; 3326 struct scsi_qla_host *ha; 3327 struct ddb_entry *ddb_entry; 3328 int options; 3329 3330 sess = cls_sess->dd_data; 3331 ddb_entry = sess->dd_data; 3332 ha = ddb_entry->ha; 3333 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: cid = %d\n", __func__, 3334 cls_conn->cid)); 3335 3336 options = LOGOUT_OPTION_CLOSE_SESSION; 3337 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) 3338 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); 3339} 3340 3341static void qla4xxx_task_work(struct work_struct *wdata) 3342{ 3343 struct ql4_task_data *task_data; 3344 struct scsi_qla_host *ha; 3345 struct passthru_status *sts; 3346 struct iscsi_task *task; 3347 struct iscsi_hdr *hdr; 3348 uint8_t *data; 3349 uint32_t data_len; 3350 struct iscsi_conn *conn; 3351 int hdr_len; 3352 itt_t itt; 3353 3354 task_data = container_of(wdata, struct ql4_task_data, task_work); 3355 ha = task_data->ha; 3356 task = task_data->task; 3357 sts = &task_data->sts; 3358 hdr_len = sizeof(struct iscsi_hdr); 3359 3360 DEBUG3(printk(KERN_INFO "Status returned\n")); 3361 DEBUG3(qla4xxx_dump_buffer(sts, 64)); 3362 DEBUG3(printk(KERN_INFO "Response buffer")); 3363 DEBUG3(qla4xxx_dump_buffer(task_data->resp_buffer, 64)); 3364 3365 conn = task->conn; 3366 3367 switch (sts->completionStatus) { 3368 case PASSTHRU_STATUS_COMPLETE: 3369 hdr = (struct iscsi_hdr *)task_data->resp_buffer; 3370 /* Assign back the itt in hdr, until we use the PREASSIGN_TAG */ 3371 itt = sts->handle; 3372 hdr->itt = itt; 3373 data = task_data->resp_buffer + hdr_len; 3374 data_len = task_data->resp_len - hdr_len; 3375 iscsi_complete_pdu(conn, hdr, data, data_len); 3376 break; 3377 default: 3378 ql4_printk(KERN_ERR, ha, "Passthru failed status = 0x%x\n", 3379 sts->completionStatus); 3380 break; 3381 } 3382 return; 3383} 3384 3385static int qla4xxx_alloc_pdu(struct iscsi_task *task, uint8_t opcode) 3386{ 3387 struct ql4_task_data *task_data; 3388 struct iscsi_session *sess; 3389 struct ddb_entry *ddb_entry; 3390 struct scsi_qla_host *ha; 3391 int hdr_len; 3392 3393 sess = task->conn->session; 3394 ddb_entry = sess->dd_data; 3395 ha = ddb_entry->ha; 3396 task_data = task->dd_data; 3397 memset(task_data, 0, sizeof(struct ql4_task_data)); 3398 3399 if (task->sc) { 3400 ql4_printk(KERN_INFO, ha, 3401 "%s: SCSI Commands not implemented\n", __func__); 3402 return -EINVAL; 3403 } 3404 3405 hdr_len = sizeof(struct iscsi_hdr); 3406 task_data->ha = ha; 3407 task_data->task = task; 3408 3409 if (task->data_count) { 3410 task_data->data_dma = dma_map_single(&ha->pdev->dev, task->data, 3411 task->data_count, 3412 DMA_TO_DEVICE); 3413 } 3414 3415 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", 3416 __func__, task->conn->max_recv_dlength, hdr_len)); 3417 3418 task_data->resp_len = task->conn->max_recv_dlength + hdr_len; 3419 task_data->resp_buffer = dma_alloc_coherent(&ha->pdev->dev, 3420 task_data->resp_len, 3421 &task_data->resp_dma, 3422 GFP_ATOMIC); 3423 if (!task_data->resp_buffer) 3424 goto exit_alloc_pdu; 3425 3426 task_data->req_len = task->data_count + hdr_len; 3427 task_data->req_buffer = dma_alloc_coherent(&ha->pdev->dev, 3428 task_data->req_len, 3429 &task_data->req_dma, 3430 GFP_ATOMIC); 3431 if (!task_data->req_buffer) 3432 goto exit_alloc_pdu; 3433 3434 task->hdr = task_data->req_buffer; 3435 3436 INIT_WORK(&task_data->task_work, qla4xxx_task_work); 3437 3438 return 0; 3439 3440exit_alloc_pdu: 3441 if (task_data->resp_buffer) 3442 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, 3443 task_data->resp_buffer, task_data->resp_dma); 3444 3445 if (task_data->req_buffer) 3446 dma_free_coherent(&ha->pdev->dev, task_data->req_len, 3447 task_data->req_buffer, task_data->req_dma); 3448 return -ENOMEM; 3449} 3450 3451static void qla4xxx_task_cleanup(struct iscsi_task *task) 3452{ 3453 struct ql4_task_data *task_data; 3454 struct iscsi_session *sess; 3455 struct ddb_entry *ddb_entry; 3456 struct scsi_qla_host *ha; 3457 int hdr_len; 3458 3459 hdr_len = sizeof(struct iscsi_hdr); 3460 sess = task->conn->session; 3461 ddb_entry = sess->dd_data; 3462 ha = ddb_entry->ha; 3463 task_data = task->dd_data; 3464 3465 if (task->data_count) { 3466 dma_unmap_single(&ha->pdev->dev, task_data->data_dma, 3467 task->data_count, DMA_TO_DEVICE); 3468 } 3469 3470 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", 3471 __func__, task->conn->max_recv_dlength, hdr_len)); 3472 3473 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, 3474 task_data->resp_buffer, task_data->resp_dma); 3475 dma_free_coherent(&ha->pdev->dev, task_data->req_len, 3476 task_data->req_buffer, task_data->req_dma); 3477 return; 3478} 3479 3480static int qla4xxx_task_xmit(struct iscsi_task *task) 3481{ 3482 struct scsi_cmnd *sc = task->sc; 3483 struct iscsi_session *sess = task->conn->session; 3484 struct ddb_entry *ddb_entry = sess->dd_data; 3485 struct scsi_qla_host *ha = ddb_entry->ha; 3486 3487 if (!sc) 3488 return qla4xxx_send_passthru0(task); 3489 3490 ql4_printk(KERN_INFO, ha, "%s: scsi cmd xmit not implemented\n", 3491 __func__); 3492 return -ENOSYS; 3493} 3494 3495static int qla4xxx_copy_from_fwddb_param(struct iscsi_bus_flash_session *sess, 3496 struct iscsi_bus_flash_conn *conn, 3497 struct dev_db_entry *fw_ddb_entry) 3498{ 3499 unsigned long options = 0; 3500 int rc = 0; 3501 3502 options = le16_to_cpu(fw_ddb_entry->options); 3503 conn->is_fw_assigned_ipv6 = test_bit(OPT_IS_FW_ASSIGNED_IPV6, &options); 3504 if (test_bit(OPT_IPV6_DEVICE, &options)) { 3505 rc = iscsi_switch_str_param(&sess->portal_type, 3506 PORTAL_TYPE_IPV6); 3507 if (rc) 3508 goto exit_copy; 3509 } else { 3510 rc = iscsi_switch_str_param(&sess->portal_type, 3511 PORTAL_TYPE_IPV4); 3512 if (rc) 3513 goto exit_copy; 3514 } 3515 3516 sess->auto_snd_tgt_disable = test_bit(OPT_AUTO_SENDTGTS_DISABLE, 3517 &options); 3518 sess->discovery_sess = test_bit(OPT_DISC_SESSION, &options); 3519 sess->entry_state = test_bit(OPT_ENTRY_STATE, &options); 3520 3521 options = le16_to_cpu(fw_ddb_entry->iscsi_options); 3522 conn->hdrdgst_en = test_bit(ISCSIOPT_HEADER_DIGEST_EN, &options); 3523 conn->datadgst_en = test_bit(ISCSIOPT_DATA_DIGEST_EN, &options); 3524 sess->imm_data_en = test_bit(ISCSIOPT_IMMEDIATE_DATA_EN, &options); 3525 sess->initial_r2t_en = test_bit(ISCSIOPT_INITIAL_R2T_EN, &options); 3526 sess->dataseq_inorder_en = test_bit(ISCSIOPT_DATA_SEQ_IN_ORDER, 3527 &options); 3528 sess->pdu_inorder_en = test_bit(ISCSIOPT_DATA_PDU_IN_ORDER, &options); 3529 sess->chap_auth_en = test_bit(ISCSIOPT_CHAP_AUTH_EN, &options); 3530 conn->snack_req_en = test_bit(ISCSIOPT_SNACK_REQ_EN, &options); 3531 sess->discovery_logout_en = test_bit(ISCSIOPT_DISCOVERY_LOGOUT_EN, 3532 &options); 3533 sess->bidi_chap_en = test_bit(ISCSIOPT_BIDI_CHAP_EN, &options); 3534 sess->discovery_auth_optional = 3535 test_bit(ISCSIOPT_DISCOVERY_AUTH_OPTIONAL, &options); 3536 if (test_bit(ISCSIOPT_ERL1, &options)) 3537 sess->erl |= BIT_1; 3538 if (test_bit(ISCSIOPT_ERL0, &options)) 3539 sess->erl |= BIT_0; 3540 3541 options = le16_to_cpu(fw_ddb_entry->tcp_options); 3542 conn->tcp_timestamp_stat = test_bit(TCPOPT_TIMESTAMP_STAT, &options); 3543 conn->tcp_nagle_disable = test_bit(TCPOPT_NAGLE_DISABLE, &options); 3544 conn->tcp_wsf_disable = test_bit(TCPOPT_WSF_DISABLE, &options); 3545 if (test_bit(TCPOPT_TIMER_SCALE3, &options)) 3546 conn->tcp_timer_scale |= BIT_3; 3547 if (test_bit(TCPOPT_TIMER_SCALE2, &options)) 3548 conn->tcp_timer_scale |= BIT_2; 3549 if (test_bit(TCPOPT_TIMER_SCALE1, &options)) 3550 conn->tcp_timer_scale |= BIT_1; 3551 3552 conn->tcp_timer_scale >>= 1; 3553 conn->tcp_timestamp_en = test_bit(TCPOPT_TIMESTAMP_EN, &options); 3554 3555 options = le16_to_cpu(fw_ddb_entry->ip_options); 3556 conn->fragment_disable = test_bit(IPOPT_FRAGMENT_DISABLE, &options); 3557 3558 conn->max_recv_dlength = BYTE_UNITS * 3559 le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len); 3560 conn->max_xmit_dlength = BYTE_UNITS * 3561 le16_to_cpu(fw_ddb_entry->iscsi_max_snd_data_seg_len); 3562 sess->first_burst = BYTE_UNITS * 3563 le16_to_cpu(fw_ddb_entry->iscsi_first_burst_len); 3564 sess->max_burst = BYTE_UNITS * 3565 le16_to_cpu(fw_ddb_entry->iscsi_max_burst_len); 3566 sess->max_r2t = le16_to_cpu(fw_ddb_entry->iscsi_max_outsnd_r2t); 3567 sess->time2wait = le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait); 3568 sess->time2retain = le16_to_cpu(fw_ddb_entry->iscsi_def_time2retain); 3569 sess->tpgt = le32_to_cpu(fw_ddb_entry->tgt_portal_grp); 3570 conn->max_segment_size = le16_to_cpu(fw_ddb_entry->mss); 3571 conn->tcp_xmit_wsf = fw_ddb_entry->tcp_xmt_wsf; 3572 conn->tcp_recv_wsf = fw_ddb_entry->tcp_rcv_wsf; 3573 conn->ipv6_flow_label = le16_to_cpu(fw_ddb_entry->ipv6_flow_lbl); 3574 conn->keepalive_timeout = le16_to_cpu(fw_ddb_entry->ka_timeout); 3575 conn->local_port = le16_to_cpu(fw_ddb_entry->lcl_port); 3576 conn->statsn = le32_to_cpu(fw_ddb_entry->stat_sn); 3577 conn->exp_statsn = le32_to_cpu(fw_ddb_entry->exp_stat_sn); 3578 sess->discovery_parent_idx = le16_to_cpu(fw_ddb_entry->ddb_link); 3579 sess->discovery_parent_type = le16_to_cpu(fw_ddb_entry->ddb_link); 3580 sess->chap_out_idx = le16_to_cpu(fw_ddb_entry->chap_tbl_idx); 3581 sess->tsid = le16_to_cpu(fw_ddb_entry->tsid); 3582 3583 sess->default_taskmgmt_timeout = 3584 le16_to_cpu(fw_ddb_entry->def_timeout); 3585 conn->port = le16_to_cpu(fw_ddb_entry->port); 3586 3587 options = le16_to_cpu(fw_ddb_entry->options); 3588 conn->ipaddress = kzalloc(IPv6_ADDR_LEN, GFP_KERNEL); 3589 if (!conn->ipaddress) { 3590 rc = -ENOMEM; 3591 goto exit_copy; 3592 } 3593 3594 conn->redirect_ipaddr = kzalloc(IPv6_ADDR_LEN, GFP_KERNEL); 3595 if (!conn->redirect_ipaddr) { 3596 rc = -ENOMEM; 3597 goto exit_copy; 3598 } 3599 3600 memcpy(conn->ipaddress, fw_ddb_entry->ip_addr, IPv6_ADDR_LEN); 3601 memcpy(conn->redirect_ipaddr, fw_ddb_entry->tgt_addr, IPv6_ADDR_LEN); 3602 3603 if (test_bit(OPT_IPV6_DEVICE, &options)) { 3604 conn->ipv6_traffic_class = fw_ddb_entry->ipv4_tos; 3605 3606 conn->link_local_ipv6_addr = kmemdup( 3607 fw_ddb_entry->link_local_ipv6_addr, 3608 IPv6_ADDR_LEN, GFP_KERNEL); 3609 if (!conn->link_local_ipv6_addr) { 3610 rc = -ENOMEM; 3611 goto exit_copy; 3612 } 3613 } else { 3614 conn->ipv4_tos = fw_ddb_entry->ipv4_tos; 3615 } 3616 3617 if (fw_ddb_entry->iscsi_name[0]) { 3618 rc = iscsi_switch_str_param(&sess->targetname, 3619 (char *)fw_ddb_entry->iscsi_name); 3620 if (rc) 3621 goto exit_copy; 3622 } 3623 3624 if (fw_ddb_entry->iscsi_alias[0]) { 3625 rc = iscsi_switch_str_param(&sess->targetalias, 3626 (char *)fw_ddb_entry->iscsi_alias); 3627 if (rc) 3628 goto exit_copy; 3629 } 3630 3631 COPY_ISID(sess->isid, fw_ddb_entry->isid); 3632 3633exit_copy: 3634 return rc; 3635} 3636 3637static int qla4xxx_copy_to_fwddb_param(struct iscsi_bus_flash_session *sess, 3638 struct iscsi_bus_flash_conn *conn, 3639 struct dev_db_entry *fw_ddb_entry) 3640{ 3641 uint16_t options; 3642 3643 options = le16_to_cpu(fw_ddb_entry->options); 3644 SET_BITVAL(conn->is_fw_assigned_ipv6, options, BIT_11); 3645 if (!strncmp(sess->portal_type, PORTAL_TYPE_IPV6, 4)) 3646 options |= BIT_8; 3647 else 3648 options &= ~BIT_8; 3649 3650 SET_BITVAL(sess->auto_snd_tgt_disable, options, BIT_6); 3651 SET_BITVAL(sess->discovery_sess, options, BIT_4); 3652 SET_BITVAL(sess->entry_state, options, BIT_3); 3653 fw_ddb_entry->options = cpu_to_le16(options); 3654 3655 options = le16_to_cpu(fw_ddb_entry->iscsi_options); 3656 SET_BITVAL(conn->hdrdgst_en, options, BIT_13); 3657 SET_BITVAL(conn->datadgst_en, options, BIT_12); 3658 SET_BITVAL(sess->imm_data_en, options, BIT_11); 3659 SET_BITVAL(sess->initial_r2t_en, options, BIT_10); 3660 SET_BITVAL(sess->dataseq_inorder_en, options, BIT_9); 3661 SET_BITVAL(sess->pdu_inorder_en, options, BIT_8); 3662 SET_BITVAL(sess->chap_auth_en, options, BIT_7); 3663 SET_BITVAL(conn->snack_req_en, options, BIT_6); 3664 SET_BITVAL(sess->discovery_logout_en, options, BIT_5); 3665 SET_BITVAL(sess->bidi_chap_en, options, BIT_4); 3666 SET_BITVAL(sess->discovery_auth_optional, options, BIT_3); 3667 SET_BITVAL(sess->erl & BIT_1, options, BIT_1); 3668 SET_BITVAL(sess->erl & BIT_0, options, BIT_0); 3669 fw_ddb_entry->iscsi_options = cpu_to_le16(options); 3670 3671 options = le16_to_cpu(fw_ddb_entry->tcp_options); 3672 SET_BITVAL(conn->tcp_timestamp_stat, options, BIT_6); 3673 SET_BITVAL(conn->tcp_nagle_disable, options, BIT_5); 3674 SET_BITVAL(conn->tcp_wsf_disable, options, BIT_4); 3675 SET_BITVAL(conn->tcp_timer_scale & BIT_2, options, BIT_3); 3676 SET_BITVAL(conn->tcp_timer_scale & BIT_1, options, BIT_2); 3677 SET_BITVAL(conn->tcp_timer_scale & BIT_0, options, BIT_1); 3678 SET_BITVAL(conn->tcp_timestamp_en, options, BIT_0); 3679 fw_ddb_entry->tcp_options = cpu_to_le16(options); 3680 3681 options = le16_to_cpu(fw_ddb_entry->ip_options); 3682 SET_BITVAL(conn->fragment_disable, options, BIT_4); 3683 fw_ddb_entry->ip_options = cpu_to_le16(options); 3684 3685 fw_ddb_entry->iscsi_max_outsnd_r2t = cpu_to_le16(sess->max_r2t); 3686 fw_ddb_entry->iscsi_max_rcv_data_seg_len = 3687 cpu_to_le16(conn->max_recv_dlength / BYTE_UNITS); 3688 fw_ddb_entry->iscsi_max_snd_data_seg_len = 3689 cpu_to_le16(conn->max_xmit_dlength / BYTE_UNITS); 3690 fw_ddb_entry->iscsi_first_burst_len = 3691 cpu_to_le16(sess->first_burst / BYTE_UNITS); 3692 fw_ddb_entry->iscsi_max_burst_len = cpu_to_le16(sess->max_burst / 3693 BYTE_UNITS); 3694 fw_ddb_entry->iscsi_def_time2wait = cpu_to_le16(sess->time2wait); 3695 fw_ddb_entry->iscsi_def_time2retain = cpu_to_le16(sess->time2retain); 3696 fw_ddb_entry->tgt_portal_grp = cpu_to_le16(sess->tpgt); 3697 fw_ddb_entry->mss = cpu_to_le16(conn->max_segment_size); 3698 fw_ddb_entry->tcp_xmt_wsf = (uint8_t) cpu_to_le32(conn->tcp_xmit_wsf); 3699 fw_ddb_entry->tcp_rcv_wsf = (uint8_t) cpu_to_le32(conn->tcp_recv_wsf); 3700 fw_ddb_entry->ipv6_flow_lbl = cpu_to_le16(conn->ipv6_flow_label); 3701 fw_ddb_entry->ka_timeout = cpu_to_le16(conn->keepalive_timeout); 3702 fw_ddb_entry->lcl_port = cpu_to_le16(conn->local_port); 3703 fw_ddb_entry->stat_sn = cpu_to_le32(conn->statsn); 3704 fw_ddb_entry->exp_stat_sn = cpu_to_le32(conn->exp_statsn); 3705 fw_ddb_entry->ddb_link = cpu_to_le16(sess->discovery_parent_idx); 3706 fw_ddb_entry->chap_tbl_idx = cpu_to_le16(sess->chap_out_idx); 3707 fw_ddb_entry->tsid = cpu_to_le16(sess->tsid); 3708 fw_ddb_entry->port = cpu_to_le16(conn->port); 3709 fw_ddb_entry->def_timeout = 3710 cpu_to_le16(sess->default_taskmgmt_timeout); 3711 3712 if (!strncmp(sess->portal_type, PORTAL_TYPE_IPV6, 4)) 3713 fw_ddb_entry->ipv4_tos = conn->ipv6_traffic_class; 3714 else 3715 fw_ddb_entry->ipv4_tos = conn->ipv4_tos; 3716 3717 if (conn->ipaddress) 3718 memcpy(fw_ddb_entry->ip_addr, conn->ipaddress, 3719 sizeof(fw_ddb_entry->ip_addr)); 3720 3721 if (conn->redirect_ipaddr) 3722 memcpy(fw_ddb_entry->tgt_addr, conn->redirect_ipaddr, 3723 sizeof(fw_ddb_entry->tgt_addr)); 3724 3725 if (conn->link_local_ipv6_addr) 3726 memcpy(fw_ddb_entry->link_local_ipv6_addr, 3727 conn->link_local_ipv6_addr, 3728 sizeof(fw_ddb_entry->link_local_ipv6_addr)); 3729 3730 if (sess->targetname) 3731 memcpy(fw_ddb_entry->iscsi_name, sess->targetname, 3732 sizeof(fw_ddb_entry->iscsi_name)); 3733 3734 if (sess->targetalias) 3735 memcpy(fw_ddb_entry->iscsi_alias, sess->targetalias, 3736 sizeof(fw_ddb_entry->iscsi_alias)); 3737 3738 COPY_ISID(fw_ddb_entry->isid, sess->isid); 3739 3740 return 0; 3741} 3742 3743static void qla4xxx_copy_to_sess_conn_params(struct iscsi_conn *conn, 3744 struct iscsi_session *sess, 3745 struct dev_db_entry *fw_ddb_entry) 3746{ 3747 unsigned long options = 0; 3748 uint16_t ddb_link; 3749 uint16_t disc_parent; 3750 char ip_addr[DDB_IPADDR_LEN]; 3751 3752 options = le16_to_cpu(fw_ddb_entry->options); 3753 conn->is_fw_assigned_ipv6 = test_bit(OPT_IS_FW_ASSIGNED_IPV6, &options); 3754 sess->auto_snd_tgt_disable = test_bit(OPT_AUTO_SENDTGTS_DISABLE, 3755 &options); 3756 sess->discovery_sess = test_bit(OPT_DISC_SESSION, &options); 3757 3758 options = le16_to_cpu(fw_ddb_entry->iscsi_options); 3759 conn->hdrdgst_en = test_bit(ISCSIOPT_HEADER_DIGEST_EN, &options); 3760 conn->datadgst_en = test_bit(ISCSIOPT_DATA_DIGEST_EN, &options); 3761 sess->imm_data_en = test_bit(ISCSIOPT_IMMEDIATE_DATA_EN, &options); 3762 sess->initial_r2t_en = test_bit(ISCSIOPT_INITIAL_R2T_EN, &options); 3763 sess->dataseq_inorder_en = test_bit(ISCSIOPT_DATA_SEQ_IN_ORDER, 3764 &options); 3765 sess->pdu_inorder_en = test_bit(ISCSIOPT_DATA_PDU_IN_ORDER, &options); 3766 sess->chap_auth_en = test_bit(ISCSIOPT_CHAP_AUTH_EN, &options); 3767 sess->discovery_logout_en = test_bit(ISCSIOPT_DISCOVERY_LOGOUT_EN, 3768 &options); 3769 sess->bidi_chap_en = test_bit(ISCSIOPT_BIDI_CHAP_EN, &options); 3770 sess->discovery_auth_optional = 3771 test_bit(ISCSIOPT_DISCOVERY_AUTH_OPTIONAL, &options); 3772 if (test_bit(ISCSIOPT_ERL1, &options)) 3773 sess->erl |= BIT_1; 3774 if (test_bit(ISCSIOPT_ERL0, &options)) 3775 sess->erl |= BIT_0; 3776 3777 options = le16_to_cpu(fw_ddb_entry->tcp_options); 3778 conn->tcp_timestamp_stat = test_bit(TCPOPT_TIMESTAMP_STAT, &options); 3779 conn->tcp_nagle_disable = test_bit(TCPOPT_NAGLE_DISABLE, &options); 3780 conn->tcp_wsf_disable = test_bit(TCPOPT_WSF_DISABLE, &options); 3781 if (test_bit(TCPOPT_TIMER_SCALE3, &options)) 3782 conn->tcp_timer_scale |= BIT_3; 3783 if (test_bit(TCPOPT_TIMER_SCALE2, &options)) 3784 conn->tcp_timer_scale |= BIT_2; 3785 if (test_bit(TCPOPT_TIMER_SCALE1, &options)) 3786 conn->tcp_timer_scale |= BIT_1; 3787 3788 conn->tcp_timer_scale >>= 1; 3789 conn->tcp_timestamp_en = test_bit(TCPOPT_TIMESTAMP_EN, &options); 3790 3791 options = le16_to_cpu(fw_ddb_entry->ip_options); 3792 conn->fragment_disable = test_bit(IPOPT_FRAGMENT_DISABLE, &options); 3793 3794 conn->max_recv_dlength = BYTE_UNITS * 3795 le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len); 3796 conn->max_xmit_dlength = BYTE_UNITS * 3797 le16_to_cpu(fw_ddb_entry->iscsi_max_snd_data_seg_len); 3798 sess->max_r2t = le16_to_cpu(fw_ddb_entry->iscsi_max_outsnd_r2t); 3799 sess->first_burst = BYTE_UNITS * 3800 le16_to_cpu(fw_ddb_entry->iscsi_first_burst_len); 3801 sess->max_burst = BYTE_UNITS * 3802 le16_to_cpu(fw_ddb_entry->iscsi_max_burst_len); 3803 sess->time2wait = le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait); 3804 sess->time2retain = le16_to_cpu(fw_ddb_entry->iscsi_def_time2retain); 3805 sess->tpgt = le32_to_cpu(fw_ddb_entry->tgt_portal_grp); 3806 conn->max_segment_size = le16_to_cpu(fw_ddb_entry->mss); 3807 conn->tcp_xmit_wsf = fw_ddb_entry->tcp_xmt_wsf; 3808 conn->tcp_recv_wsf = fw_ddb_entry->tcp_rcv_wsf; 3809 conn->ipv4_tos = fw_ddb_entry->ipv4_tos; 3810 conn->keepalive_tmo = le16_to_cpu(fw_ddb_entry->ka_timeout); 3811 conn->local_port = le16_to_cpu(fw_ddb_entry->lcl_port); 3812 conn->statsn = le32_to_cpu(fw_ddb_entry->stat_sn); 3813 conn->exp_statsn = le32_to_cpu(fw_ddb_entry->exp_stat_sn); 3814 sess->tsid = le16_to_cpu(fw_ddb_entry->tsid); 3815 COPY_ISID(sess->isid, fw_ddb_entry->isid); 3816 3817 ddb_link = le16_to_cpu(fw_ddb_entry->ddb_link); 3818 if (ddb_link == DDB_ISNS) 3819 disc_parent = ISCSI_DISC_PARENT_ISNS; 3820 else if (ddb_link == DDB_NO_LINK) 3821 disc_parent = ISCSI_DISC_PARENT_UNKNOWN; 3822 else if (ddb_link < MAX_DDB_ENTRIES) 3823 disc_parent = ISCSI_DISC_PARENT_SENDTGT; 3824 else 3825 disc_parent = ISCSI_DISC_PARENT_UNKNOWN; 3826 3827 iscsi_set_param(conn->cls_conn, ISCSI_PARAM_DISCOVERY_PARENT_TYPE, 3828 iscsi_get_discovery_parent_name(disc_parent), 0); 3829 3830 iscsi_set_param(conn->cls_conn, ISCSI_PARAM_TARGET_ALIAS, 3831 (char *)fw_ddb_entry->iscsi_alias, 0); 3832 3833 options = le16_to_cpu(fw_ddb_entry->options); 3834 if (options & DDB_OPT_IPV6_DEVICE) { 3835 memset(ip_addr, 0, sizeof(ip_addr)); 3836 sprintf(ip_addr, "%pI6", fw_ddb_entry->link_local_ipv6_addr); 3837 iscsi_set_param(conn->cls_conn, ISCSI_PARAM_LOCAL_IPADDR, 3838 (char *)ip_addr, 0); 3839 } 3840} 3841 3842static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha, 3843 struct dev_db_entry *fw_ddb_entry, 3844 struct iscsi_cls_session *cls_sess, 3845 struct iscsi_cls_conn *cls_conn) 3846{ 3847 int buflen = 0; 3848 struct iscsi_session *sess; 3849 struct ddb_entry *ddb_entry; 3850 struct ql4_chap_table chap_tbl; 3851 struct iscsi_conn *conn; 3852 char ip_addr[DDB_IPADDR_LEN]; 3853 uint16_t options = 0; 3854 3855 sess = cls_sess->dd_data; 3856 ddb_entry = sess->dd_data; 3857 conn = cls_conn->dd_data; 3858 memset(&chap_tbl, 0, sizeof(chap_tbl)); 3859 3860 ddb_entry->chap_tbl_idx = le16_to_cpu(fw_ddb_entry->chap_tbl_idx); 3861 3862 qla4xxx_copy_to_sess_conn_params(conn, sess, fw_ddb_entry); 3863 3864 sess->def_taskmgmt_tmo = le16_to_cpu(fw_ddb_entry->def_timeout); 3865 conn->persistent_port = le16_to_cpu(fw_ddb_entry->port); 3866 3867 memset(ip_addr, 0, sizeof(ip_addr)); 3868 options = le16_to_cpu(fw_ddb_entry->options); 3869 if (options & DDB_OPT_IPV6_DEVICE) { 3870 iscsi_set_param(cls_conn, ISCSI_PARAM_PORTAL_TYPE, "ipv6", 4); 3871 3872 memset(ip_addr, 0, sizeof(ip_addr)); 3873 sprintf(ip_addr, "%pI6", fw_ddb_entry->ip_addr); 3874 } else { 3875 iscsi_set_param(cls_conn, ISCSI_PARAM_PORTAL_TYPE, "ipv4", 4); 3876 sprintf(ip_addr, "%pI4", fw_ddb_entry->ip_addr); 3877 } 3878 3879 iscsi_set_param(cls_conn, ISCSI_PARAM_PERSISTENT_ADDRESS, 3880 (char *)ip_addr, buflen); 3881 iscsi_set_param(cls_conn, ISCSI_PARAM_TARGET_NAME, 3882 (char *)fw_ddb_entry->iscsi_name, buflen); 3883 iscsi_set_param(cls_conn, ISCSI_PARAM_INITIATOR_NAME, 3884 (char *)ha->name_string, buflen); 3885 3886 if (ddb_entry->chap_tbl_idx != INVALID_ENTRY) { 3887 if (!qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, 3888 chap_tbl.secret, 3889 ddb_entry->chap_tbl_idx)) { 3890 iscsi_set_param(cls_conn, ISCSI_PARAM_USERNAME, 3891 (char *)chap_tbl.name, 3892 strlen((char *)chap_tbl.name)); 3893 iscsi_set_param(cls_conn, ISCSI_PARAM_PASSWORD, 3894 (char *)chap_tbl.secret, 3895 chap_tbl.secret_len); 3896 } 3897 } 3898} 3899 3900void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha, 3901 struct ddb_entry *ddb_entry) 3902{ 3903 struct iscsi_cls_session *cls_sess; 3904 struct iscsi_cls_conn *cls_conn; 3905 uint32_t ddb_state; 3906 dma_addr_t fw_ddb_entry_dma; 3907 struct dev_db_entry *fw_ddb_entry; 3908 3909 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 3910 &fw_ddb_entry_dma, GFP_KERNEL); 3911 if (!fw_ddb_entry) { 3912 ql4_printk(KERN_ERR, ha, 3913 "%s: Unable to allocate dma buffer\n", __func__); 3914 goto exit_session_conn_fwddb_param; 3915 } 3916 3917 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, 3918 fw_ddb_entry_dma, NULL, NULL, &ddb_state, 3919 NULL, NULL, NULL) == QLA_ERROR) { 3920 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " 3921 "get_ddb_entry for fw_ddb_index %d\n", 3922 ha->host_no, __func__, 3923 ddb_entry->fw_ddb_index)); 3924 goto exit_session_conn_fwddb_param; 3925 } 3926 3927 cls_sess = ddb_entry->sess; 3928 3929 cls_conn = ddb_entry->conn; 3930 3931 /* Update params */ 3932 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); 3933 3934exit_session_conn_fwddb_param: 3935 if (fw_ddb_entry) 3936 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 3937 fw_ddb_entry, fw_ddb_entry_dma); 3938} 3939 3940void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, 3941 struct ddb_entry *ddb_entry) 3942{ 3943 struct iscsi_cls_session *cls_sess; 3944 struct iscsi_cls_conn *cls_conn; 3945 struct iscsi_session *sess; 3946 struct iscsi_conn *conn; 3947 uint32_t ddb_state; 3948 dma_addr_t fw_ddb_entry_dma; 3949 struct dev_db_entry *fw_ddb_entry; 3950 3951 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 3952 &fw_ddb_entry_dma, GFP_KERNEL); 3953 if (!fw_ddb_entry) { 3954 ql4_printk(KERN_ERR, ha, 3955 "%s: Unable to allocate dma buffer\n", __func__); 3956 goto exit_session_conn_param; 3957 } 3958 3959 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, 3960 fw_ddb_entry_dma, NULL, NULL, &ddb_state, 3961 NULL, NULL, NULL) == QLA_ERROR) { 3962 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " 3963 "get_ddb_entry for fw_ddb_index %d\n", 3964 ha->host_no, __func__, 3965 ddb_entry->fw_ddb_index)); 3966 goto exit_session_conn_param; 3967 } 3968 3969 cls_sess = ddb_entry->sess; 3970 sess = cls_sess->dd_data; 3971 3972 cls_conn = ddb_entry->conn; 3973 conn = cls_conn->dd_data; 3974 3975 /* Update timers after login */ 3976 ddb_entry->default_relogin_timeout = 3977 (le16_to_cpu(fw_ddb_entry->def_timeout) > LOGIN_TOV) && 3978 (le16_to_cpu(fw_ddb_entry->def_timeout) < LOGIN_TOV * 10) ? 3979 le16_to_cpu(fw_ddb_entry->def_timeout) : LOGIN_TOV; 3980 ddb_entry->default_time2wait = 3981 le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait); 3982 3983 /* Update params */ 3984 ddb_entry->chap_tbl_idx = le16_to_cpu(fw_ddb_entry->chap_tbl_idx); 3985 qla4xxx_copy_to_sess_conn_params(conn, sess, fw_ddb_entry); 3986 3987 memcpy(sess->initiatorname, ha->name_string, 3988 min(sizeof(ha->name_string), sizeof(sess->initiatorname))); 3989 3990exit_session_conn_param: 3991 if (fw_ddb_entry) 3992 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 3993 fw_ddb_entry, fw_ddb_entry_dma); 3994} 3995 3996/* 3997 * Timer routines 3998 */ 3999static void qla4xxx_timer(struct timer_list *t); 4000 4001static void qla4xxx_start_timer(struct scsi_qla_host *ha, 4002 unsigned long interval) 4003{ 4004 DEBUG(printk("scsi: %s: Starting timer thread for adapter %d\n", 4005 __func__, ha->host->host_no)); 4006 timer_setup(&ha->timer, qla4xxx_timer, 0); 4007 ha->timer.expires = jiffies + interval * HZ; 4008 add_timer(&ha->timer); 4009 ha->timer_active = 1; 4010} 4011 4012static void qla4xxx_stop_timer(struct scsi_qla_host *ha) 4013{ 4014 del_timer_sync(&ha->timer); 4015 ha->timer_active = 0; 4016} 4017 4018/*** 4019 * qla4xxx_mark_device_missing - blocks the session 4020 * @cls_session: Pointer to the session to be blocked 4021 * @ddb_entry: Pointer to device database entry 4022 * 4023 * This routine marks a device missing and close connection. 4024 **/ 4025void qla4xxx_mark_device_missing(struct iscsi_cls_session *cls_session) 4026{ 4027 iscsi_block_session(cls_session); 4028} 4029 4030/** 4031 * qla4xxx_mark_all_devices_missing - mark all devices as missing. 4032 * @ha: Pointer to host adapter structure. 4033 * 4034 * This routine marks a device missing and resets the relogin retry count. 4035 **/ 4036void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha) 4037{ 4038 iscsi_host_for_each_session(ha->host, qla4xxx_mark_device_missing); 4039} 4040 4041static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha, 4042 struct ddb_entry *ddb_entry, 4043 struct scsi_cmnd *cmd) 4044{ 4045 struct srb *srb; 4046 4047 srb = mempool_alloc(ha->srb_mempool, GFP_ATOMIC); 4048 if (!srb) 4049 return srb; 4050 4051 kref_init(&srb->srb_ref); 4052 srb->ha = ha; 4053 srb->ddb = ddb_entry; 4054 srb->cmd = cmd; 4055 srb->flags = 0; 4056 qla4xxx_cmd_priv(cmd)->srb = srb; 4057 4058 return srb; 4059} 4060 4061static void qla4xxx_srb_free_dma(struct scsi_qla_host *ha, struct srb *srb) 4062{ 4063 struct scsi_cmnd *cmd = srb->cmd; 4064 4065 if (srb->flags & SRB_DMA_VALID) { 4066 scsi_dma_unmap(cmd); 4067 srb->flags &= ~SRB_DMA_VALID; 4068 } 4069 qla4xxx_cmd_priv(cmd)->srb = NULL; 4070} 4071 4072void qla4xxx_srb_compl(struct kref *ref) 4073{ 4074 struct srb *srb = container_of(ref, struct srb, srb_ref); 4075 struct scsi_cmnd *cmd = srb->cmd; 4076 struct scsi_qla_host *ha = srb->ha; 4077 4078 qla4xxx_srb_free_dma(ha, srb); 4079 4080 mempool_free(srb, ha->srb_mempool); 4081 4082 scsi_done(cmd); 4083} 4084 4085/** 4086 * qla4xxx_queuecommand - scsi layer issues scsi command to driver. 4087 * @host: scsi host 4088 * @cmd: Pointer to Linux's SCSI command structure 4089 * 4090 * Remarks: 4091 * This routine is invoked by Linux to send a SCSI command to the driver. 4092 * The mid-level driver tries to ensure that queuecommand never gets 4093 * invoked concurrently with itself or the interrupt handler (although 4094 * the interrupt handler may call this routine as part of request- 4095 * completion handling). Unfortunely, it sometimes calls the scheduler 4096 * in interrupt context which is a big NO! NO!. 4097 **/ 4098static int qla4xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) 4099{ 4100 struct scsi_qla_host *ha = to_qla_host(host); 4101 struct ddb_entry *ddb_entry = cmd->device->hostdata; 4102 struct iscsi_cls_session *sess = ddb_entry->sess; 4103 struct srb *srb; 4104 int rval; 4105 4106 if (test_bit(AF_EEH_BUSY, &ha->flags)) { 4107 if (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags)) 4108 cmd->result = DID_NO_CONNECT << 16; 4109 else 4110 cmd->result = DID_REQUEUE << 16; 4111 goto qc_fail_command; 4112 } 4113 4114 if (!sess) { 4115 cmd->result = DID_IMM_RETRY << 16; 4116 goto qc_fail_command; 4117 } 4118 4119 rval = iscsi_session_chkready(sess); 4120 if (rval) { 4121 cmd->result = rval; 4122 goto qc_fail_command; 4123 } 4124 4125 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || 4126 test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || 4127 test_bit(DPC_RESET_HA, &ha->dpc_flags) || 4128 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || 4129 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || 4130 !test_bit(AF_ONLINE, &ha->flags) || 4131 !test_bit(AF_LINK_UP, &ha->flags) || 4132 test_bit(AF_LOOPBACK, &ha->flags) || 4133 test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags) || 4134 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags) || 4135 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) 4136 goto qc_host_busy; 4137 4138 srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd); 4139 if (!srb) 4140 goto qc_host_busy; 4141 4142 rval = qla4xxx_send_command_to_isp(ha, srb); 4143 if (rval != QLA_SUCCESS) 4144 goto qc_host_busy_free_sp; 4145 4146 return 0; 4147 4148qc_host_busy_free_sp: 4149 qla4xxx_srb_free_dma(ha, srb); 4150 mempool_free(srb, ha->srb_mempool); 4151 4152qc_host_busy: 4153 return SCSI_MLQUEUE_HOST_BUSY; 4154 4155qc_fail_command: 4156 scsi_done(cmd); 4157 4158 return 0; 4159} 4160 4161/** 4162 * qla4xxx_mem_free - frees memory allocated to adapter 4163 * @ha: Pointer to host adapter structure. 4164 * 4165 * Frees memory previously allocated by qla4xxx_mem_alloc 4166 **/ 4167static void qla4xxx_mem_free(struct scsi_qla_host *ha) 4168{ 4169 if (ha->queues) 4170 dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues, 4171 ha->queues_dma); 4172 4173 vfree(ha->fw_dump); 4174 4175 ha->queues_len = 0; 4176 ha->queues = NULL; 4177 ha->queues_dma = 0; 4178 ha->request_ring = NULL; 4179 ha->request_dma = 0; 4180 ha->response_ring = NULL; 4181 ha->response_dma = 0; 4182 ha->shadow_regs = NULL; 4183 ha->shadow_regs_dma = 0; 4184 ha->fw_dump = NULL; 4185 ha->fw_dump_size = 0; 4186 4187 /* Free srb pool. */ 4188 mempool_destroy(ha->srb_mempool); 4189 ha->srb_mempool = NULL; 4190 4191 dma_pool_destroy(ha->chap_dma_pool); 4192 4193 vfree(ha->chap_list); 4194 ha->chap_list = NULL; 4195 4196 dma_pool_destroy(ha->fw_ddb_dma_pool); 4197 4198 /* release io space registers */ 4199 if (is_qla8022(ha)) { 4200 if (ha->nx_pcibase) 4201 iounmap( 4202 (struct device_reg_82xx __iomem *)ha->nx_pcibase); 4203 } else if (is_qla8032(ha) || is_qla8042(ha)) { 4204 if (ha->nx_pcibase) 4205 iounmap( 4206 (struct device_reg_83xx __iomem *)ha->nx_pcibase); 4207 } else if (ha->reg) { 4208 iounmap(ha->reg); 4209 } 4210 4211 vfree(ha->reset_tmplt.buff); 4212 4213 pci_release_regions(ha->pdev); 4214} 4215 4216/** 4217 * qla4xxx_mem_alloc - allocates memory for use by adapter. 4218 * @ha: Pointer to host adapter structure 4219 * 4220 * Allocates DMA memory for request and response queues. Also allocates memory 4221 * for srbs. 4222 **/ 4223static int qla4xxx_mem_alloc(struct scsi_qla_host *ha) 4224{ 4225 unsigned long align; 4226 4227 /* Allocate contiguous block of DMA memory for queues. */ 4228 ha->queues_len = ((REQUEST_QUEUE_DEPTH * QUEUE_SIZE) + 4229 (RESPONSE_QUEUE_DEPTH * QUEUE_SIZE) + 4230 sizeof(struct shadow_regs) + 4231 MEM_ALIGN_VALUE + 4232 (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); 4233 ha->queues = dma_alloc_coherent(&ha->pdev->dev, ha->queues_len, 4234 &ha->queues_dma, GFP_KERNEL); 4235 if (ha->queues == NULL) { 4236 ql4_printk(KERN_WARNING, ha, 4237 "Memory Allocation failed - queues.\n"); 4238 4239 goto mem_alloc_error_exit; 4240 } 4241 4242 /* 4243 * As per RISC alignment requirements -- the bus-address must be a 4244 * multiple of the request-ring size (in bytes). 4245 */ 4246 align = 0; 4247 if ((unsigned long)ha->queues_dma & (MEM_ALIGN_VALUE - 1)) 4248 align = MEM_ALIGN_VALUE - ((unsigned long)ha->queues_dma & 4249 (MEM_ALIGN_VALUE - 1)); 4250 4251 /* Update request and response queue pointers. */ 4252 ha->request_dma = ha->queues_dma + align; 4253 ha->request_ring = (struct queue_entry *) (ha->queues + align); 4254 ha->response_dma = ha->queues_dma + align + 4255 (REQUEST_QUEUE_DEPTH * QUEUE_SIZE); 4256 ha->response_ring = (struct queue_entry *) (ha->queues + align + 4257 (REQUEST_QUEUE_DEPTH * 4258 QUEUE_SIZE)); 4259 ha->shadow_regs_dma = ha->queues_dma + align + 4260 (REQUEST_QUEUE_DEPTH * QUEUE_SIZE) + 4261 (RESPONSE_QUEUE_DEPTH * QUEUE_SIZE); 4262 ha->shadow_regs = (struct shadow_regs *) (ha->queues + align + 4263 (REQUEST_QUEUE_DEPTH * 4264 QUEUE_SIZE) + 4265 (RESPONSE_QUEUE_DEPTH * 4266 QUEUE_SIZE)); 4267 4268 /* Allocate memory for srb pool. */ 4269 ha->srb_mempool = mempool_create(SRB_MIN_REQ, mempool_alloc_slab, 4270 mempool_free_slab, srb_cachep); 4271 if (ha->srb_mempool == NULL) { 4272 ql4_printk(KERN_WARNING, ha, 4273 "Memory Allocation failed - SRB Pool.\n"); 4274 4275 goto mem_alloc_error_exit; 4276 } 4277 4278 ha->chap_dma_pool = dma_pool_create("ql4_chap", &ha->pdev->dev, 4279 CHAP_DMA_BLOCK_SIZE, 8, 0); 4280 4281 if (ha->chap_dma_pool == NULL) { 4282 ql4_printk(KERN_WARNING, ha, 4283 "%s: chap_dma_pool allocation failed..\n", __func__); 4284 goto mem_alloc_error_exit; 4285 } 4286 4287 ha->fw_ddb_dma_pool = dma_pool_create("ql4_fw_ddb", &ha->pdev->dev, 4288 DDB_DMA_BLOCK_SIZE, 8, 0); 4289 4290 if (ha->fw_ddb_dma_pool == NULL) { 4291 ql4_printk(KERN_WARNING, ha, 4292 "%s: fw_ddb_dma_pool allocation failed..\n", 4293 __func__); 4294 goto mem_alloc_error_exit; 4295 } 4296 4297 return QLA_SUCCESS; 4298 4299mem_alloc_error_exit: 4300 return QLA_ERROR; 4301} 4302 4303/** 4304 * qla4_8xxx_check_temp - Check the ISP82XX temperature. 4305 * @ha: adapter block pointer. 4306 * 4307 * Note: The caller should not hold the idc lock. 4308 **/ 4309static int qla4_8xxx_check_temp(struct scsi_qla_host *ha) 4310{ 4311 uint32_t temp, temp_state, temp_val; 4312 int status = QLA_SUCCESS; 4313 4314 temp = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_TEMP_STATE); 4315 4316 temp_state = qla82xx_get_temp_state(temp); 4317 temp_val = qla82xx_get_temp_val(temp); 4318 4319 if (temp_state == QLA82XX_TEMP_PANIC) { 4320 ql4_printk(KERN_WARNING, ha, "Device temperature %d degrees C" 4321 " exceeds maximum allowed. Hardware has been shut" 4322 " down.\n", temp_val); 4323 status = QLA_ERROR; 4324 } else if (temp_state == QLA82XX_TEMP_WARN) { 4325 if (ha->temperature == QLA82XX_TEMP_NORMAL) 4326 ql4_printk(KERN_WARNING, ha, "Device temperature %d" 4327 " degrees C exceeds operating range." 4328 " Immediate action needed.\n", temp_val); 4329 } else { 4330 if (ha->temperature == QLA82XX_TEMP_WARN) 4331 ql4_printk(KERN_INFO, ha, "Device temperature is" 4332 " now %d degrees C in normal range.\n", 4333 temp_val); 4334 } 4335 ha->temperature = temp_state; 4336 return status; 4337} 4338 4339/** 4340 * qla4_8xxx_check_fw_alive - Check firmware health 4341 * @ha: Pointer to host adapter structure. 4342 * 4343 * Context: Interrupt 4344 **/ 4345static int qla4_8xxx_check_fw_alive(struct scsi_qla_host *ha) 4346{ 4347 uint32_t fw_heartbeat_counter; 4348 int status = QLA_SUCCESS; 4349 4350 fw_heartbeat_counter = qla4_8xxx_rd_direct(ha, 4351 QLA8XXX_PEG_ALIVE_COUNTER); 4352 /* If PEG_ALIVE_COUNTER is 0xffffffff, AER/EEH is in progress, ignore */ 4353 if (fw_heartbeat_counter == 0xffffffff) { 4354 DEBUG2(printk(KERN_WARNING "scsi%ld: %s: Device in frozen " 4355 "state, QLA82XX_PEG_ALIVE_COUNTER is 0xffffffff\n", 4356 ha->host_no, __func__)); 4357 return status; 4358 } 4359 4360 if (ha->fw_heartbeat_counter == fw_heartbeat_counter) { 4361 ha->seconds_since_last_heartbeat++; 4362 /* FW not alive after 2 seconds */ 4363 if (ha->seconds_since_last_heartbeat == 2) { 4364 ha->seconds_since_last_heartbeat = 0; 4365 qla4_8xxx_dump_peg_reg(ha); 4366 status = QLA_ERROR; 4367 } 4368 } else 4369 ha->seconds_since_last_heartbeat = 0; 4370 4371 ha->fw_heartbeat_counter = fw_heartbeat_counter; 4372 return status; 4373} 4374 4375static void qla4_8xxx_process_fw_error(struct scsi_qla_host *ha) 4376{ 4377 uint32_t halt_status; 4378 int halt_status_unrecoverable = 0; 4379 4380 halt_status = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_HALT_STATUS1); 4381 4382 if (is_qla8022(ha)) { 4383 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", 4384 __func__); 4385 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, 4386 CRB_NIU_XG_PAUSE_CTL_P0 | 4387 CRB_NIU_XG_PAUSE_CTL_P1); 4388 4389 if (QLA82XX_FWERROR_CODE(halt_status) == 0x67) 4390 ql4_printk(KERN_ERR, ha, "%s: Firmware aborted with error code 0x00006700. Device is being reset\n", 4391 __func__); 4392 if (halt_status & HALT_STATUS_UNRECOVERABLE) 4393 halt_status_unrecoverable = 1; 4394 } else if (is_qla8032(ha) || is_qla8042(ha)) { 4395 if (halt_status & QLA83XX_HALT_STATUS_FW_RESET) 4396 ql4_printk(KERN_ERR, ha, "%s: Firmware error detected device is being reset\n", 4397 __func__); 4398 else if (halt_status & QLA83XX_HALT_STATUS_UNRECOVERABLE) 4399 halt_status_unrecoverable = 1; 4400 } 4401 4402 /* 4403 * Since we cannot change dev_state in interrupt context, 4404 * set appropriate DPC flag then wakeup DPC 4405 */ 4406 if (halt_status_unrecoverable) { 4407 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); 4408 } else { 4409 ql4_printk(KERN_INFO, ha, "%s: detect abort needed!\n", 4410 __func__); 4411 set_bit(DPC_RESET_HA, &ha->dpc_flags); 4412 } 4413 qla4xxx_mailbox_premature_completion(ha); 4414 qla4xxx_wake_dpc(ha); 4415} 4416 4417/** 4418 * qla4_8xxx_watchdog - Poll dev state 4419 * @ha: Pointer to host adapter structure. 4420 * 4421 * Context: Interrupt 4422 **/ 4423void qla4_8xxx_watchdog(struct scsi_qla_host *ha) 4424{ 4425 uint32_t dev_state; 4426 uint32_t idc_ctrl; 4427 4428 if (is_qla8032(ha) && 4429 (qla4_83xx_is_detached(ha) == QLA_SUCCESS)) 4430 WARN_ONCE(1, "%s: iSCSI function %d marked invisible\n", 4431 __func__, ha->func_num); 4432 4433 /* don't poll if reset is going on */ 4434 if (!(test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || 4435 test_bit(DPC_RESET_HA, &ha->dpc_flags) || 4436 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags))) { 4437 dev_state = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE); 4438 4439 if (qla4_8xxx_check_temp(ha)) { 4440 if (is_qla8022(ha)) { 4441 ql4_printk(KERN_INFO, ha, "disabling pause transmit on port 0 & 1.\n"); 4442 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, 4443 CRB_NIU_XG_PAUSE_CTL_P0 | 4444 CRB_NIU_XG_PAUSE_CTL_P1); 4445 } 4446 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); 4447 qla4xxx_wake_dpc(ha); 4448 } else if (dev_state == QLA8XXX_DEV_NEED_RESET && 4449 !test_bit(DPC_RESET_HA, &ha->dpc_flags)) { 4450 4451 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED RESET!\n", 4452 __func__); 4453 4454 if (is_qla8032(ha) || is_qla8042(ha)) { 4455 idc_ctrl = qla4_83xx_rd_reg(ha, 4456 QLA83XX_IDC_DRV_CTRL); 4457 if (!(idc_ctrl & GRACEFUL_RESET_BIT1)) { 4458 ql4_printk(KERN_INFO, ha, "%s: Graceful reset bit is not set\n", 4459 __func__); 4460 qla4xxx_mailbox_premature_completion( 4461 ha); 4462 } 4463 } 4464 4465 if ((is_qla8032(ha) || is_qla8042(ha)) || 4466 (is_qla8022(ha) && !ql4xdontresethba)) { 4467 set_bit(DPC_RESET_HA, &ha->dpc_flags); 4468 qla4xxx_wake_dpc(ha); 4469 } 4470 } else if (dev_state == QLA8XXX_DEV_NEED_QUIESCENT && 4471 !test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { 4472 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED QUIES!\n", 4473 __func__); 4474 set_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags); 4475 qla4xxx_wake_dpc(ha); 4476 } else { 4477 /* Check firmware health */ 4478 if (qla4_8xxx_check_fw_alive(ha)) 4479 qla4_8xxx_process_fw_error(ha); 4480 } 4481 } 4482} 4483 4484static void qla4xxx_check_relogin_flash_ddb(struct iscsi_cls_session *cls_sess) 4485{ 4486 struct iscsi_session *sess; 4487 struct ddb_entry *ddb_entry; 4488 struct scsi_qla_host *ha; 4489 4490 sess = cls_sess->dd_data; 4491 ddb_entry = sess->dd_data; 4492 ha = ddb_entry->ha; 4493 4494 if (!(ddb_entry->ddb_type == FLASH_DDB)) 4495 return; 4496 4497 if (adapter_up(ha) && !test_bit(DF_RELOGIN, &ddb_entry->flags) && 4498 !iscsi_is_session_online(cls_sess)) { 4499 if (atomic_read(&ddb_entry->retry_relogin_timer) != 4500 INVALID_ENTRY) { 4501 if (atomic_read(&ddb_entry->retry_relogin_timer) == 4502 0) { 4503 atomic_set(&ddb_entry->retry_relogin_timer, 4504 INVALID_ENTRY); 4505 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); 4506 set_bit(DF_RELOGIN, &ddb_entry->flags); 4507 DEBUG2(ql4_printk(KERN_INFO, ha, 4508 "%s: index [%d] login device\n", 4509 __func__, ddb_entry->fw_ddb_index)); 4510 } else 4511 atomic_dec(&ddb_entry->retry_relogin_timer); 4512 } 4513 } 4514 4515 /* Wait for relogin to timeout */ 4516 if (atomic_read(&ddb_entry->relogin_timer) && 4517 (atomic_dec_and_test(&ddb_entry->relogin_timer) != 0)) { 4518 /* 4519 * If the relogin times out and the device is 4520 * still NOT ONLINE then try and relogin again. 4521 */ 4522 if (!iscsi_is_session_online(cls_sess)) { 4523 /* Reset retry relogin timer */ 4524 atomic_inc(&ddb_entry->relogin_retry_count); 4525 DEBUG2(ql4_printk(KERN_INFO, ha, 4526 "%s: index[%d] relogin timed out-retrying" 4527 " relogin (%d), retry (%d)\n", __func__, 4528 ddb_entry->fw_ddb_index, 4529 atomic_read(&ddb_entry->relogin_retry_count), 4530 ddb_entry->default_time2wait + 4)); 4531 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); 4532 atomic_set(&ddb_entry->retry_relogin_timer, 4533 ddb_entry->default_time2wait + 4); 4534 } 4535 } 4536} 4537 4538/** 4539 * qla4xxx_timer - checks every second for work to do. 4540 * @t: Context to obtain pointer to host adapter structure. 4541 **/ 4542static void qla4xxx_timer(struct timer_list *t) 4543{ 4544 struct scsi_qla_host *ha = from_timer(ha, t, timer); 4545 int start_dpc = 0; 4546 uint16_t w; 4547 4548 iscsi_host_for_each_session(ha->host, qla4xxx_check_relogin_flash_ddb); 4549 4550 /* If we are in the middle of AER/EEH processing 4551 * skip any processing and reschedule the timer 4552 */ 4553 if (test_bit(AF_EEH_BUSY, &ha->flags)) { 4554 mod_timer(&ha->timer, jiffies + HZ); 4555 return; 4556 } 4557 4558 /* Hardware read to trigger an EEH error during mailbox waits. */ 4559 if (!pci_channel_offline(ha->pdev)) 4560 pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w); 4561 4562 if (is_qla80XX(ha)) 4563 qla4_8xxx_watchdog(ha); 4564 4565 if (is_qla40XX(ha)) { 4566 /* Check for heartbeat interval. */ 4567 if (ha->firmware_options & FWOPT_HEARTBEAT_ENABLE && 4568 ha->heartbeat_interval != 0) { 4569 ha->seconds_since_last_heartbeat++; 4570 if (ha->seconds_since_last_heartbeat > 4571 ha->heartbeat_interval + 2) 4572 set_bit(DPC_RESET_HA, &ha->dpc_flags); 4573 } 4574 } 4575 4576 /* Process any deferred work. */ 4577 if (!list_empty(&ha->work_list)) 4578 start_dpc++; 4579 4580 /* Wakeup the dpc routine for this adapter, if needed. */ 4581 if (start_dpc || 4582 test_bit(DPC_RESET_HA, &ha->dpc_flags) || 4583 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags) || 4584 test_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags) || 4585 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || 4586 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || 4587 test_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags) || 4588 test_bit(DPC_LINK_CHANGED, &ha->dpc_flags) || 4589 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || 4590 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || 4591 test_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags) || 4592 test_bit(DPC_AEN, &ha->dpc_flags)) { 4593 DEBUG2(printk("scsi%ld: %s: scheduling dpc routine" 4594 " - dpc flags = 0x%lx\n", 4595 ha->host_no, __func__, ha->dpc_flags)); 4596 qla4xxx_wake_dpc(ha); 4597 } 4598 4599 /* Reschedule timer thread to call us back in one second */ 4600 mod_timer(&ha->timer, jiffies + HZ); 4601 4602 DEBUG2(ha->seconds_since_last_intr++); 4603} 4604 4605/** 4606 * qla4xxx_cmd_wait - waits for all outstanding commands to complete 4607 * @ha: Pointer to host adapter structure. 4608 * 4609 * This routine stalls the driver until all outstanding commands are returned. 4610 * Caller must release the Hardware Lock prior to calling this routine. 4611 **/ 4612static int qla4xxx_cmd_wait(struct scsi_qla_host *ha) 4613{ 4614 uint32_t index = 0; 4615 unsigned long flags; 4616 struct scsi_cmnd *cmd; 4617 unsigned long wtime; 4618 uint32_t wtmo; 4619 4620 if (is_qla40XX(ha)) 4621 wtmo = WAIT_CMD_TOV; 4622 else 4623 wtmo = ha->nx_reset_timeout / 2; 4624 4625 wtime = jiffies + (wtmo * HZ); 4626 4627 DEBUG2(ql4_printk(KERN_INFO, ha, 4628 "Wait up to %u seconds for cmds to complete\n", 4629 wtmo)); 4630 4631 while (!time_after_eq(jiffies, wtime)) { 4632 spin_lock_irqsave(&ha->hardware_lock, flags); 4633 /* Find a command that hasn't completed. */ 4634 for (index = 0; index < ha->host->can_queue; index++) { 4635 cmd = scsi_host_find_tag(ha->host, index); 4636 /* 4637 * We cannot just check if the index is valid, 4638 * becase if we are run from the scsi eh, then 4639 * the scsi/block layer is going to prevent 4640 * the tag from being released. 4641 */ 4642 if (cmd != NULL && qla4xxx_cmd_priv(cmd)->srb) 4643 break; 4644 } 4645 spin_unlock_irqrestore(&ha->hardware_lock, flags); 4646 4647 /* If No Commands are pending, wait is complete */ 4648 if (index == ha->host->can_queue) 4649 return QLA_SUCCESS; 4650 4651 msleep(1000); 4652 } 4653 /* If we timed out on waiting for commands to come back 4654 * return ERROR. */ 4655 return QLA_ERROR; 4656} 4657 4658int qla4xxx_hw_reset(struct scsi_qla_host *ha) 4659{ 4660 uint32_t ctrl_status; 4661 unsigned long flags = 0; 4662 4663 DEBUG2(printk(KERN_ERR "scsi%ld: %s\n", ha->host_no, __func__)); 4664 4665 if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS) 4666 return QLA_ERROR; 4667 4668 spin_lock_irqsave(&ha->hardware_lock, flags); 4669 4670 /* 4671 * If the SCSI Reset Interrupt bit is set, clear it. 4672 * Otherwise, the Soft Reset won't work. 4673 */ 4674 ctrl_status = readw(&ha->reg->ctrl_status); 4675 if ((ctrl_status & CSR_SCSI_RESET_INTR) != 0) 4676 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); 4677 4678 /* Issue Soft Reset */ 4679 writel(set_rmask(CSR_SOFT_RESET), &ha->reg->ctrl_status); 4680 readl(&ha->reg->ctrl_status); 4681 4682 spin_unlock_irqrestore(&ha->hardware_lock, flags); 4683 return QLA_SUCCESS; 4684} 4685 4686/** 4687 * qla4xxx_soft_reset - performs soft reset. 4688 * @ha: Pointer to host adapter structure. 4689 **/ 4690int qla4xxx_soft_reset(struct scsi_qla_host *ha) 4691{ 4692 uint32_t max_wait_time; 4693 unsigned long flags = 0; 4694 int status; 4695 uint32_t ctrl_status; 4696 4697 status = qla4xxx_hw_reset(ha); 4698 if (status != QLA_SUCCESS) 4699 return status; 4700 4701 status = QLA_ERROR; 4702 /* Wait until the Network Reset Intr bit is cleared */ 4703 max_wait_time = RESET_INTR_TOV; 4704 do { 4705 spin_lock_irqsave(&ha->hardware_lock, flags); 4706 ctrl_status = readw(&ha->reg->ctrl_status); 4707 spin_unlock_irqrestore(&ha->hardware_lock, flags); 4708 4709 if ((ctrl_status & CSR_NET_RESET_INTR) == 0) 4710 break; 4711 4712 msleep(1000); 4713 } while ((--max_wait_time)); 4714 4715 if ((ctrl_status & CSR_NET_RESET_INTR) != 0) { 4716 DEBUG2(printk(KERN_WARNING 4717 "scsi%ld: Network Reset Intr not cleared by " 4718 "Network function, clearing it now!\n", 4719 ha->host_no)); 4720 spin_lock_irqsave(&ha->hardware_lock, flags); 4721 writel(set_rmask(CSR_NET_RESET_INTR), &ha->reg->ctrl_status); 4722 readl(&ha->reg->ctrl_status); 4723 spin_unlock_irqrestore(&ha->hardware_lock, flags); 4724 } 4725 4726 /* Wait until the firmware tells us the Soft Reset is done */ 4727 max_wait_time = SOFT_RESET_TOV; 4728 do { 4729 spin_lock_irqsave(&ha->hardware_lock, flags); 4730 ctrl_status = readw(&ha->reg->ctrl_status); 4731 spin_unlock_irqrestore(&ha->hardware_lock, flags); 4732 4733 if ((ctrl_status & CSR_SOFT_RESET) == 0) { 4734 status = QLA_SUCCESS; 4735 break; 4736 } 4737 4738 msleep(1000); 4739 } while ((--max_wait_time)); 4740 4741 /* 4742 * Also, make sure that the SCSI Reset Interrupt bit has been cleared 4743 * after the soft reset has taken place. 4744 */ 4745 spin_lock_irqsave(&ha->hardware_lock, flags); 4746 ctrl_status = readw(&ha->reg->ctrl_status); 4747 if ((ctrl_status & CSR_SCSI_RESET_INTR) != 0) { 4748 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); 4749 readl(&ha->reg->ctrl_status); 4750 } 4751 spin_unlock_irqrestore(&ha->hardware_lock, flags); 4752 4753 /* If soft reset fails then most probably the bios on other 4754 * function is also enabled. 4755 * Since the initialization is sequential the other fn 4756 * wont be able to acknowledge the soft reset. 4757 * Issue a force soft reset to workaround this scenario. 4758 */ 4759 if (max_wait_time == 0) { 4760 /* Issue Force Soft Reset */ 4761 spin_lock_irqsave(&ha->hardware_lock, flags); 4762 writel(set_rmask(CSR_FORCE_SOFT_RESET), &ha->reg->ctrl_status); 4763 readl(&ha->reg->ctrl_status); 4764 spin_unlock_irqrestore(&ha->hardware_lock, flags); 4765 /* Wait until the firmware tells us the Soft Reset is done */ 4766 max_wait_time = SOFT_RESET_TOV; 4767 do { 4768 spin_lock_irqsave(&ha->hardware_lock, flags); 4769 ctrl_status = readw(&ha->reg->ctrl_status); 4770 spin_unlock_irqrestore(&ha->hardware_lock, flags); 4771 4772 if ((ctrl_status & CSR_FORCE_SOFT_RESET) == 0) { 4773 status = QLA_SUCCESS; 4774 break; 4775 } 4776 4777 msleep(1000); 4778 } while ((--max_wait_time)); 4779 } 4780 4781 return status; 4782} 4783 4784/** 4785 * qla4xxx_abort_active_cmds - returns all outstanding i/o requests to O.S. 4786 * @ha: Pointer to host adapter structure. 4787 * @res: returned scsi status 4788 * 4789 * This routine is called just prior to a HARD RESET to return all 4790 * outstanding commands back to the Operating System. 4791 * Caller should make sure that the following locks are released 4792 * before this calling routine: Hardware lock, and io_request_lock. 4793 **/ 4794static void qla4xxx_abort_active_cmds(struct scsi_qla_host *ha, int res) 4795{ 4796 struct srb *srb; 4797 int i; 4798 unsigned long flags; 4799 4800 spin_lock_irqsave(&ha->hardware_lock, flags); 4801 for (i = 0; i < ha->host->can_queue; i++) { 4802 srb = qla4xxx_del_from_active_array(ha, i); 4803 if (srb != NULL) { 4804 srb->cmd->result = res; 4805 kref_put(&srb->srb_ref, qla4xxx_srb_compl); 4806 } 4807 } 4808 spin_unlock_irqrestore(&ha->hardware_lock, flags); 4809} 4810 4811void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha) 4812{ 4813 clear_bit(AF_ONLINE, &ha->flags); 4814 4815 /* Disable the board */ 4816 ql4_printk(KERN_INFO, ha, "Disabling the board\n"); 4817 4818 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); 4819 qla4xxx_mark_all_devices_missing(ha); 4820 clear_bit(AF_INIT_DONE, &ha->flags); 4821} 4822 4823static void qla4xxx_fail_session(struct iscsi_cls_session *cls_session) 4824{ 4825 struct iscsi_session *sess; 4826 struct ddb_entry *ddb_entry; 4827 4828 sess = cls_session->dd_data; 4829 ddb_entry = sess->dd_data; 4830 ddb_entry->fw_ddb_device_state = DDB_DS_SESSION_FAILED; 4831 4832 if (ddb_entry->ddb_type == FLASH_DDB) 4833 iscsi_block_session(ddb_entry->sess); 4834 else 4835 iscsi_session_failure(cls_session->dd_data, 4836 ISCSI_ERR_CONN_FAILED); 4837} 4838 4839/** 4840 * qla4xxx_recover_adapter - recovers adapter after a fatal error 4841 * @ha: Pointer to host adapter structure. 4842 **/ 4843static int qla4xxx_recover_adapter(struct scsi_qla_host *ha) 4844{ 4845 int status = QLA_ERROR; 4846 uint8_t reset_chip = 0; 4847 uint32_t dev_state; 4848 unsigned long wait; 4849 4850 /* Stall incoming I/O until we are done */ 4851 scsi_block_requests(ha->host); 4852 clear_bit(AF_ONLINE, &ha->flags); 4853 clear_bit(AF_LINK_UP, &ha->flags); 4854 4855 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: adapter OFFLINE\n", __func__)); 4856 4857 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); 4858 4859 if ((is_qla8032(ha) || is_qla8042(ha)) && 4860 !test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { 4861 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", 4862 __func__); 4863 /* disable pause frame for ISP83xx */ 4864 qla4_83xx_disable_pause(ha); 4865 } 4866 4867 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); 4868 4869 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) 4870 reset_chip = 1; 4871 4872 /* For the DPC_RESET_HA_INTR case (ISP-4xxx specific) 4873 * do not reset adapter, jump to initialize_adapter */ 4874 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { 4875 status = QLA_SUCCESS; 4876 goto recover_ha_init_adapter; 4877 } 4878 4879 /* For the ISP-8xxx adapter, issue a stop_firmware if invoked 4880 * from eh_host_reset or ioctl module */ 4881 if (is_qla80XX(ha) && !reset_chip && 4882 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { 4883 4884 DEBUG2(ql4_printk(KERN_INFO, ha, 4885 "scsi%ld: %s - Performing stop_firmware...\n", 4886 ha->host_no, __func__)); 4887 status = ha->isp_ops->reset_firmware(ha); 4888 if (status == QLA_SUCCESS) { 4889 ha->isp_ops->disable_intrs(ha); 4890 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); 4891 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); 4892 } else { 4893 /* If the stop_firmware fails then 4894 * reset the entire chip */ 4895 reset_chip = 1; 4896 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); 4897 set_bit(DPC_RESET_HA, &ha->dpc_flags); 4898 } 4899 } 4900 4901 /* Issue full chip reset if recovering from a catastrophic error, 4902 * or if stop_firmware fails for ISP-8xxx. 4903 * This is the default case for ISP-4xxx */ 4904 if (is_qla40XX(ha) || reset_chip) { 4905 if (is_qla40XX(ha)) 4906 goto chip_reset; 4907 4908 /* Check if 8XXX firmware is alive or not 4909 * We may have arrived here from NEED_RESET 4910 * detection only */ 4911 if (test_bit(AF_FW_RECOVERY, &ha->flags)) 4912 goto chip_reset; 4913 4914 wait = jiffies + (FW_ALIVE_WAIT_TOV * HZ); 4915 while (time_before(jiffies, wait)) { 4916 if (qla4_8xxx_check_fw_alive(ha)) { 4917 qla4xxx_mailbox_premature_completion(ha); 4918 break; 4919 } 4920 4921 set_current_state(TASK_UNINTERRUPTIBLE); 4922 schedule_timeout(HZ); 4923 } 4924chip_reset: 4925 if (!test_bit(AF_FW_RECOVERY, &ha->flags)) 4926 qla4xxx_cmd_wait(ha); 4927 4928 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); 4929 DEBUG2(ql4_printk(KERN_INFO, ha, 4930 "scsi%ld: %s - Performing chip reset..\n", 4931 ha->host_no, __func__)); 4932 status = ha->isp_ops->reset_chip(ha); 4933 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); 4934 } 4935 4936 /* Flush any pending ddb changed AENs */ 4937 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); 4938 4939recover_ha_init_adapter: 4940 /* Upon successful firmware/chip reset, re-initialize the adapter */ 4941 if (status == QLA_SUCCESS) { 4942 /* For ISP-4xxx, force function 1 to always initialize 4943 * before function 3 to prevent both funcions from 4944 * stepping on top of the other */ 4945 if (is_qla40XX(ha) && (ha->mac_index == 3)) 4946 ssleep(6); 4947 4948 /* NOTE: AF_ONLINE flag set upon successful completion of 4949 * qla4xxx_initialize_adapter */ 4950 status = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); 4951 if (is_qla80XX(ha) && (status == QLA_ERROR)) { 4952 status = qla4_8xxx_check_init_adapter_retry(ha); 4953 if (status == QLA_ERROR) { 4954 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Don't retry recover adapter\n", 4955 ha->host_no, __func__); 4956 qla4xxx_dead_adapter_cleanup(ha); 4957 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); 4958 clear_bit(DPC_RESET_HA, &ha->dpc_flags); 4959 clear_bit(DPC_RESET_HA_FW_CONTEXT, 4960 &ha->dpc_flags); 4961 goto exit_recover; 4962 } 4963 } 4964 } 4965 4966 /* Retry failed adapter initialization, if necessary 4967 * Do not retry initialize_adapter for RESET_HA_INTR (ISP-4xxx specific) 4968 * case to prevent ping-pong resets between functions */ 4969 if (!test_bit(AF_ONLINE, &ha->flags) && 4970 !test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { 4971 /* Adapter initialization failed, see if we can retry 4972 * resetting the ha. 4973 * Since we don't want to block the DPC for too long 4974 * with multiple resets in the same thread, 4975 * utilize DPC to retry */ 4976 if (is_qla80XX(ha)) { 4977 ha->isp_ops->idc_lock(ha); 4978 dev_state = qla4_8xxx_rd_direct(ha, 4979 QLA8XXX_CRB_DEV_STATE); 4980 ha->isp_ops->idc_unlock(ha); 4981 if (dev_state == QLA8XXX_DEV_FAILED) { 4982 ql4_printk(KERN_INFO, ha, "%s: don't retry " 4983 "recover adapter. H/W is in Failed " 4984 "state\n", __func__); 4985 qla4xxx_dead_adapter_cleanup(ha); 4986 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); 4987 clear_bit(DPC_RESET_HA, &ha->dpc_flags); 4988 clear_bit(DPC_RESET_HA_FW_CONTEXT, 4989 &ha->dpc_flags); 4990 status = QLA_ERROR; 4991 4992 goto exit_recover; 4993 } 4994 } 4995 4996 if (!test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags)) { 4997 ha->retry_reset_ha_cnt = MAX_RESET_HA_RETRIES; 4998 DEBUG2(printk("scsi%ld: recover adapter - retrying " 4999 "(%d) more times\n", ha->host_no, 5000 ha->retry_reset_ha_cnt)); 5001 set_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); 5002 status = QLA_ERROR; 5003 } else { 5004 if (ha->retry_reset_ha_cnt > 0) { 5005 /* Schedule another Reset HA--DPC will retry */ 5006 ha->retry_reset_ha_cnt--; 5007 DEBUG2(printk("scsi%ld: recover adapter - " 5008 "retry remaining %d\n", 5009 ha->host_no, 5010 ha->retry_reset_ha_cnt)); 5011 status = QLA_ERROR; 5012 } 5013 5014 if (ha->retry_reset_ha_cnt == 0) { 5015 /* Recover adapter retries have been exhausted. 5016 * Adapter DEAD */ 5017 DEBUG2(printk("scsi%ld: recover adapter " 5018 "failed - board disabled\n", 5019 ha->host_no)); 5020 qla4xxx_dead_adapter_cleanup(ha); 5021 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); 5022 clear_bit(DPC_RESET_HA, &ha->dpc_flags); 5023 clear_bit(DPC_RESET_HA_FW_CONTEXT, 5024 &ha->dpc_flags); 5025 status = QLA_ERROR; 5026 } 5027 } 5028 } else { 5029 clear_bit(DPC_RESET_HA, &ha->dpc_flags); 5030 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); 5031 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); 5032 } 5033 5034exit_recover: 5035 ha->adapter_error_count++; 5036 5037 if (test_bit(AF_ONLINE, &ha->flags)) 5038 ha->isp_ops->enable_intrs(ha); 5039 5040 scsi_unblock_requests(ha->host); 5041 5042 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); 5043 DEBUG2(printk("scsi%ld: recover adapter: %s\n", ha->host_no, 5044 status == QLA_ERROR ? "FAILED" : "SUCCEEDED")); 5045 5046 return status; 5047} 5048 5049static void qla4xxx_relogin_devices(struct iscsi_cls_session *cls_session) 5050{ 5051 struct iscsi_session *sess; 5052 struct ddb_entry *ddb_entry; 5053 struct scsi_qla_host *ha; 5054 5055 sess = cls_session->dd_data; 5056 ddb_entry = sess->dd_data; 5057 ha = ddb_entry->ha; 5058 if (!iscsi_is_session_online(cls_session)) { 5059 if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) { 5060 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" 5061 " unblock session\n", ha->host_no, __func__, 5062 ddb_entry->fw_ddb_index); 5063 iscsi_unblock_session(ddb_entry->sess); 5064 } else { 5065 /* Trigger relogin */ 5066 if (ddb_entry->ddb_type == FLASH_DDB) { 5067 if (!(test_bit(DF_RELOGIN, &ddb_entry->flags) || 5068 test_bit(DF_DISABLE_RELOGIN, 5069 &ddb_entry->flags))) 5070 qla4xxx_arm_relogin_timer(ddb_entry); 5071 } else 5072 iscsi_session_failure(cls_session->dd_data, 5073 ISCSI_ERR_CONN_FAILED); 5074 } 5075 } 5076} 5077 5078int qla4xxx_unblock_flash_ddb(struct iscsi_cls_session *cls_session) 5079{ 5080 struct iscsi_session *sess; 5081 struct ddb_entry *ddb_entry; 5082 struct scsi_qla_host *ha; 5083 5084 sess = cls_session->dd_data; 5085 ddb_entry = sess->dd_data; 5086 ha = ddb_entry->ha; 5087 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" 5088 " unblock session\n", ha->host_no, __func__, 5089 ddb_entry->fw_ddb_index); 5090 5091 iscsi_unblock_session(ddb_entry->sess); 5092 5093 /* Start scan target */ 5094 if (test_bit(AF_ONLINE, &ha->flags)) { 5095 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" 5096 " start scan\n", ha->host_no, __func__, 5097 ddb_entry->fw_ddb_index); 5098 queue_work(ddb_entry->sess->workq, &ddb_entry->sess->scan_work); 5099 } 5100 return QLA_SUCCESS; 5101} 5102 5103int qla4xxx_unblock_ddb(struct iscsi_cls_session *cls_session) 5104{ 5105 struct iscsi_session *sess; 5106 struct ddb_entry *ddb_entry; 5107 struct scsi_qla_host *ha; 5108 int status = QLA_SUCCESS; 5109 5110 sess = cls_session->dd_data; 5111 ddb_entry = sess->dd_data; 5112 ha = ddb_entry->ha; 5113 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" 5114 " unblock user space session\n", ha->host_no, __func__, 5115 ddb_entry->fw_ddb_index); 5116 5117 if (!iscsi_is_session_online(cls_session)) { 5118 iscsi_conn_start(ddb_entry->conn); 5119 iscsi_conn_login_event(ddb_entry->conn, 5120 ISCSI_CONN_STATE_LOGGED_IN); 5121 } else { 5122 ql4_printk(KERN_INFO, ha, 5123 "scsi%ld: %s: ddb[%d] session [%d] already logged in\n", 5124 ha->host_no, __func__, ddb_entry->fw_ddb_index, 5125 cls_session->sid); 5126 status = QLA_ERROR; 5127 } 5128 5129 return status; 5130} 5131 5132static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha) 5133{ 5134 iscsi_host_for_each_session(ha->host, qla4xxx_relogin_devices); 5135} 5136 5137static void qla4xxx_relogin_flash_ddb(struct iscsi_cls_session *cls_sess) 5138{ 5139 uint16_t relogin_timer; 5140 struct iscsi_session *sess; 5141 struct ddb_entry *ddb_entry; 5142 struct scsi_qla_host *ha; 5143 5144 sess = cls_sess->dd_data; 5145 ddb_entry = sess->dd_data; 5146 ha = ddb_entry->ha; 5147 5148 relogin_timer = max(ddb_entry->default_relogin_timeout, 5149 (uint16_t)RELOGIN_TOV); 5150 atomic_set(&ddb_entry->relogin_timer, relogin_timer); 5151 5152 DEBUG2(ql4_printk(KERN_INFO, ha, 5153 "scsi%ld: Relogin index [%d]. TOV=%d\n", ha->host_no, 5154 ddb_entry->fw_ddb_index, relogin_timer)); 5155 5156 qla4xxx_login_flash_ddb(cls_sess); 5157} 5158 5159static void qla4xxx_dpc_relogin(struct iscsi_cls_session *cls_sess) 5160{ 5161 struct iscsi_session *sess; 5162 struct ddb_entry *ddb_entry; 5163 struct scsi_qla_host *ha; 5164 5165 sess = cls_sess->dd_data; 5166 ddb_entry = sess->dd_data; 5167 ha = ddb_entry->ha; 5168 5169 if (!(ddb_entry->ddb_type == FLASH_DDB)) 5170 return; 5171 5172 if (test_bit(DF_DISABLE_RELOGIN, &ddb_entry->flags)) 5173 return; 5174 5175 if (test_and_clear_bit(DF_RELOGIN, &ddb_entry->flags) && 5176 !iscsi_is_session_online(cls_sess)) { 5177 DEBUG2(ql4_printk(KERN_INFO, ha, 5178 "relogin issued\n")); 5179 qla4xxx_relogin_flash_ddb(cls_sess); 5180 } 5181} 5182 5183void qla4xxx_wake_dpc(struct scsi_qla_host *ha) 5184{ 5185 if (ha->dpc_thread) 5186 queue_work(ha->dpc_thread, &ha->dpc_work); 5187} 5188 5189static struct qla4_work_evt * 5190qla4xxx_alloc_work(struct scsi_qla_host *ha, uint32_t data_size, 5191 enum qla4_work_type type) 5192{ 5193 struct qla4_work_evt *e; 5194 uint32_t size = sizeof(struct qla4_work_evt) + data_size; 5195 5196 e = kzalloc(size, GFP_ATOMIC); 5197 if (!e) 5198 return NULL; 5199 5200 INIT_LIST_HEAD(&e->list); 5201 e->type = type; 5202 return e; 5203} 5204 5205static void qla4xxx_post_work(struct scsi_qla_host *ha, 5206 struct qla4_work_evt *e) 5207{ 5208 unsigned long flags; 5209 5210 spin_lock_irqsave(&ha->work_lock, flags); 5211 list_add_tail(&e->list, &ha->work_list); 5212 spin_unlock_irqrestore(&ha->work_lock, flags); 5213 qla4xxx_wake_dpc(ha); 5214} 5215 5216int qla4xxx_post_aen_work(struct scsi_qla_host *ha, 5217 enum iscsi_host_event_code aen_code, 5218 uint32_t data_size, uint8_t *data) 5219{ 5220 struct qla4_work_evt *e; 5221 5222 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_AEN); 5223 if (!e) 5224 return QLA_ERROR; 5225 5226 e->u.aen.code = aen_code; 5227 e->u.aen.data_size = data_size; 5228 memcpy(e->u.aen.data, data, data_size); 5229 5230 qla4xxx_post_work(ha, e); 5231 5232 return QLA_SUCCESS; 5233} 5234 5235int qla4xxx_post_ping_evt_work(struct scsi_qla_host *ha, 5236 uint32_t status, uint32_t pid, 5237 uint32_t data_size, uint8_t *data) 5238{ 5239 struct qla4_work_evt *e; 5240 5241 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_PING_STATUS); 5242 if (!e) 5243 return QLA_ERROR; 5244 5245 e->u.ping.status = status; 5246 e->u.ping.pid = pid; 5247 e->u.ping.data_size = data_size; 5248 memcpy(e->u.ping.data, data, data_size); 5249 5250 qla4xxx_post_work(ha, e); 5251 5252 return QLA_SUCCESS; 5253} 5254 5255static void qla4xxx_do_work(struct scsi_qla_host *ha) 5256{ 5257 struct qla4_work_evt *e, *tmp; 5258 unsigned long flags; 5259 LIST_HEAD(work); 5260 5261 spin_lock_irqsave(&ha->work_lock, flags); 5262 list_splice_init(&ha->work_list, &work); 5263 spin_unlock_irqrestore(&ha->work_lock, flags); 5264 5265 list_for_each_entry_safe(e, tmp, &work, list) { 5266 list_del_init(&e->list); 5267 5268 switch (e->type) { 5269 case QLA4_EVENT_AEN: 5270 iscsi_post_host_event(ha->host_no, 5271 &qla4xxx_iscsi_transport, 5272 e->u.aen.code, 5273 e->u.aen.data_size, 5274 e->u.aen.data); 5275 break; 5276 case QLA4_EVENT_PING_STATUS: 5277 iscsi_ping_comp_event(ha->host_no, 5278 &qla4xxx_iscsi_transport, 5279 e->u.ping.status, 5280 e->u.ping.pid, 5281 e->u.ping.data_size, 5282 e->u.ping.data); 5283 break; 5284 default: 5285 ql4_printk(KERN_WARNING, ha, "event type: 0x%x not " 5286 "supported", e->type); 5287 } 5288 kfree(e); 5289 } 5290} 5291 5292/** 5293 * qla4xxx_do_dpc - dpc routine 5294 * @work: Context to obtain pointer to host adapter structure. 5295 * 5296 * This routine is a task that is schedule by the interrupt handler 5297 * to perform the background processing for interrupts. We put it 5298 * on a task queue that is consumed whenever the scheduler runs; that's 5299 * so you can do anything (i.e. put the process to sleep etc). In fact, 5300 * the mid-level tries to sleep when it reaches the driver threshold 5301 * "host->can_queue". This can cause a panic if we were in our interrupt code. 5302 **/ 5303static void qla4xxx_do_dpc(struct work_struct *work) 5304{ 5305 struct scsi_qla_host *ha = 5306 container_of(work, struct scsi_qla_host, dpc_work); 5307 int status = QLA_ERROR; 5308 5309 DEBUG2(ql4_printk(KERN_INFO, ha, 5310 "scsi%ld: %s: DPC handler waking up. flags = 0x%08lx, dpc_flags = 0x%08lx\n", 5311 ha->host_no, __func__, ha->flags, ha->dpc_flags)); 5312 5313 /* Initialization not yet finished. Don't do anything yet. */ 5314 if (!test_bit(AF_INIT_DONE, &ha->flags)) 5315 return; 5316 5317 if (test_bit(AF_EEH_BUSY, &ha->flags)) { 5318 DEBUG2(printk(KERN_INFO "scsi%ld: %s: flags = %lx\n", 5319 ha->host_no, __func__, ha->flags)); 5320 return; 5321 } 5322 5323 /* post events to application */ 5324 qla4xxx_do_work(ha); 5325 5326 if (is_qla80XX(ha)) { 5327 if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) { 5328 if (is_qla8032(ha) || is_qla8042(ha)) { 5329 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", 5330 __func__); 5331 /* disable pause frame for ISP83xx */ 5332 qla4_83xx_disable_pause(ha); 5333 } 5334 5335 ha->isp_ops->idc_lock(ha); 5336 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, 5337 QLA8XXX_DEV_FAILED); 5338 ha->isp_ops->idc_unlock(ha); 5339 ql4_printk(KERN_INFO, ha, "HW State: FAILED\n"); 5340 qla4_8xxx_device_state_handler(ha); 5341 } 5342 5343 if (test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags)) { 5344 if (is_qla8042(ha)) { 5345 if (ha->idc_info.info2 & 5346 ENABLE_INTERNAL_LOOPBACK) { 5347 ql4_printk(KERN_INFO, ha, "%s: Disabling ACB\n", 5348 __func__); 5349 status = qla4_84xx_config_acb(ha, 5350 ACB_CONFIG_DISABLE); 5351 if (status != QLA_SUCCESS) { 5352 ql4_printk(KERN_INFO, ha, "%s: ACB config failed\n", 5353 __func__); 5354 } 5355 } 5356 } 5357 qla4_83xx_post_idc_ack(ha); 5358 clear_bit(DPC_POST_IDC_ACK, &ha->dpc_flags); 5359 } 5360 5361 if (is_qla8042(ha) && 5362 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags)) { 5363 ql4_printk(KERN_INFO, ha, "%s: Restoring ACB\n", 5364 __func__); 5365 if (qla4_84xx_config_acb(ha, ACB_CONFIG_SET) != 5366 QLA_SUCCESS) { 5367 ql4_printk(KERN_INFO, ha, "%s: ACB config failed ", 5368 __func__); 5369 } 5370 clear_bit(DPC_RESTORE_ACB, &ha->dpc_flags); 5371 } 5372 5373 if (test_and_clear_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { 5374 qla4_8xxx_need_qsnt_handler(ha); 5375 } 5376 } 5377 5378 if (!test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) && 5379 (test_bit(DPC_RESET_HA, &ha->dpc_flags) || 5380 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || 5381 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))) { 5382 if ((is_qla8022(ha) && ql4xdontresethba) || 5383 ((is_qla8032(ha) || is_qla8042(ha)) && 5384 qla4_83xx_idc_dontreset(ha))) { 5385 DEBUG2(printk("scsi%ld: %s: Don't Reset HBA\n", 5386 ha->host_no, __func__)); 5387 clear_bit(DPC_RESET_HA, &ha->dpc_flags); 5388 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); 5389 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); 5390 goto dpc_post_reset_ha; 5391 } 5392 if (test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || 5393 test_bit(DPC_RESET_HA, &ha->dpc_flags)) 5394 qla4xxx_recover_adapter(ha); 5395 5396 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { 5397 uint8_t wait_time = RESET_INTR_TOV; 5398 5399 while ((readw(&ha->reg->ctrl_status) & 5400 (CSR_SOFT_RESET | CSR_FORCE_SOFT_RESET)) != 0) { 5401 if (--wait_time == 0) 5402 break; 5403 msleep(1000); 5404 } 5405 if (wait_time == 0) 5406 DEBUG2(printk("scsi%ld: %s: SR|FSR " 5407 "bit not cleared-- resetting\n", 5408 ha->host_no, __func__)); 5409 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); 5410 if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) { 5411 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); 5412 status = qla4xxx_recover_adapter(ha); 5413 } 5414 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); 5415 if (status == QLA_SUCCESS) 5416 ha->isp_ops->enable_intrs(ha); 5417 } 5418 } 5419 5420dpc_post_reset_ha: 5421 /* ---- process AEN? --- */ 5422 if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags)) 5423 qla4xxx_process_aen(ha, PROCESS_ALL_AENS); 5424 5425 /* ---- Get DHCP IP Address? --- */ 5426 if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags)) 5427 qla4xxx_get_dhcp_ip_address(ha); 5428 5429 /* ---- relogin device? --- */ 5430 if (adapter_up(ha) && 5431 test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) { 5432 iscsi_host_for_each_session(ha->host, qla4xxx_dpc_relogin); 5433 } 5434 5435 /* ---- link change? --- */ 5436 if (!test_bit(AF_LOOPBACK, &ha->flags) && 5437 test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) { 5438 if (!test_bit(AF_LINK_UP, &ha->flags)) { 5439 /* ---- link down? --- */ 5440 qla4xxx_mark_all_devices_missing(ha); 5441 } else { 5442 /* ---- link up? --- * 5443 * F/W will auto login to all devices ONLY ONCE after 5444 * link up during driver initialization and runtime 5445 * fatal error recovery. Therefore, the driver must 5446 * manually relogin to devices when recovering from 5447 * connection failures, logouts, expired KATO, etc. */ 5448 if (test_and_clear_bit(AF_BUILD_DDB_LIST, &ha->flags)) { 5449 qla4xxx_build_ddb_list(ha, ha->is_reset); 5450 iscsi_host_for_each_session(ha->host, 5451 qla4xxx_login_flash_ddb); 5452 } else 5453 qla4xxx_relogin_all_devices(ha); 5454 } 5455 } 5456 if (test_and_clear_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags)) { 5457 if (qla4xxx_sysfs_ddb_export(ha)) 5458 ql4_printk(KERN_ERR, ha, "%s: Error exporting ddb to sysfs\n", 5459 __func__); 5460 } 5461} 5462 5463/** 5464 * qla4xxx_free_adapter - release the adapter 5465 * @ha: pointer to adapter structure 5466 **/ 5467static void qla4xxx_free_adapter(struct scsi_qla_host *ha) 5468{ 5469 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); 5470 5471 /* Turn-off interrupts on the card. */ 5472 ha->isp_ops->disable_intrs(ha); 5473 5474 if (is_qla40XX(ha)) { 5475 writel(set_rmask(CSR_SCSI_PROCESSOR_INTR), 5476 &ha->reg->ctrl_status); 5477 readl(&ha->reg->ctrl_status); 5478 } else if (is_qla8022(ha)) { 5479 writel(0, &ha->qla4_82xx_reg->host_int); 5480 readl(&ha->qla4_82xx_reg->host_int); 5481 } else if (is_qla8032(ha) || is_qla8042(ha)) { 5482 writel(0, &ha->qla4_83xx_reg->risc_intr); 5483 readl(&ha->qla4_83xx_reg->risc_intr); 5484 } 5485 5486 /* Remove timer thread, if present */ 5487 if (ha->timer_active) 5488 qla4xxx_stop_timer(ha); 5489 5490 /* Kill the kernel thread for this host */ 5491 if (ha->dpc_thread) 5492 destroy_workqueue(ha->dpc_thread); 5493 5494 /* Kill the kernel thread for this host */ 5495 if (ha->task_wq) 5496 destroy_workqueue(ha->task_wq); 5497 5498 /* Put firmware in known state */ 5499 ha->isp_ops->reset_firmware(ha); 5500 5501 if (is_qla80XX(ha)) { 5502 ha->isp_ops->idc_lock(ha); 5503 qla4_8xxx_clear_drv_active(ha); 5504 ha->isp_ops->idc_unlock(ha); 5505 } 5506 5507 /* Detach interrupts */ 5508 qla4xxx_free_irqs(ha); 5509 5510 /* free extra memory */ 5511 qla4xxx_mem_free(ha); 5512} 5513 5514int qla4_8xxx_iospace_config(struct scsi_qla_host *ha) 5515{ 5516 int status = 0; 5517 unsigned long mem_base, mem_len; 5518 struct pci_dev *pdev = ha->pdev; 5519 5520 status = pci_request_regions(pdev, DRIVER_NAME); 5521 if (status) { 5522 printk(KERN_WARNING 5523 "scsi(%ld) Failed to reserve PIO regions (%s) " 5524 "status=%d\n", ha->host_no, pci_name(pdev), status); 5525 goto iospace_error_exit; 5526 } 5527 5528 DEBUG2(printk(KERN_INFO "%s: revision-id=%d\n", 5529 __func__, pdev->revision)); 5530 ha->revision_id = pdev->revision; 5531 5532 /* remap phys address */ 5533 mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */ 5534 mem_len = pci_resource_len(pdev, 0); 5535 DEBUG2(printk(KERN_INFO "%s: ioremap from %lx a size of %lx\n", 5536 __func__, mem_base, mem_len)); 5537 5538 /* mapping of pcibase pointer */ 5539 ha->nx_pcibase = (unsigned long)ioremap(mem_base, mem_len); 5540 if (!ha->nx_pcibase) { 5541 printk(KERN_ERR 5542 "cannot remap MMIO (%s), aborting\n", pci_name(pdev)); 5543 pci_release_regions(ha->pdev); 5544 goto iospace_error_exit; 5545 } 5546 5547 /* Mapping of IO base pointer, door bell read and write pointer */ 5548 5549 /* mapping of IO base pointer */ 5550 if (is_qla8022(ha)) { 5551 ha->qla4_82xx_reg = (struct device_reg_82xx __iomem *) 5552 ((uint8_t *)ha->nx_pcibase + 0xbc000 + 5553 (ha->pdev->devfn << 11)); 5554 ha->nx_db_wr_ptr = (ha->pdev->devfn == 4 ? QLA82XX_CAM_RAM_DB1 : 5555 QLA82XX_CAM_RAM_DB2); 5556 } else if (is_qla8032(ha) || is_qla8042(ha)) { 5557 ha->qla4_83xx_reg = (struct device_reg_83xx __iomem *) 5558 ((uint8_t *)ha->nx_pcibase); 5559 } 5560 5561 return 0; 5562iospace_error_exit: 5563 return -ENOMEM; 5564} 5565 5566/*** 5567 * qla4xxx_iospace_config - maps registers 5568 * @ha: pointer to adapter structure 5569 * 5570 * This routines maps HBA's registers from the pci address space 5571 * into the kernel virtual address space for memory mapped i/o. 5572 **/ 5573int qla4xxx_iospace_config(struct scsi_qla_host *ha) 5574{ 5575 unsigned long pio, pio_len, pio_flags; 5576 unsigned long mmio, mmio_len, mmio_flags; 5577 5578 pio = pci_resource_start(ha->pdev, 0); 5579 pio_len = pci_resource_len(ha->pdev, 0); 5580 pio_flags = pci_resource_flags(ha->pdev, 0); 5581 if (pio_flags & IORESOURCE_IO) { 5582 if (pio_len < MIN_IOBASE_LEN) { 5583 ql4_printk(KERN_WARNING, ha, 5584 "Invalid PCI I/O region size\n"); 5585 pio = 0; 5586 } 5587 } else { 5588 ql4_printk(KERN_WARNING, ha, "region #0 not a PIO resource\n"); 5589 pio = 0; 5590 } 5591 5592 /* Use MMIO operations for all accesses. */ 5593 mmio = pci_resource_start(ha->pdev, 1); 5594 mmio_len = pci_resource_len(ha->pdev, 1); 5595 mmio_flags = pci_resource_flags(ha->pdev, 1); 5596 5597 if (!(mmio_flags & IORESOURCE_MEM)) { 5598 ql4_printk(KERN_ERR, ha, 5599 "region #0 not an MMIO resource, aborting\n"); 5600 5601 goto iospace_error_exit; 5602 } 5603 5604 if (mmio_len < MIN_IOBASE_LEN) { 5605 ql4_printk(KERN_ERR, ha, 5606 "Invalid PCI mem region size, aborting\n"); 5607 goto iospace_error_exit; 5608 } 5609 5610 if (pci_request_regions(ha->pdev, DRIVER_NAME)) { 5611 ql4_printk(KERN_WARNING, ha, 5612 "Failed to reserve PIO/MMIO regions\n"); 5613 5614 goto iospace_error_exit; 5615 } 5616 5617 ha->pio_address = pio; 5618 ha->pio_length = pio_len; 5619 ha->reg = ioremap(mmio, MIN_IOBASE_LEN); 5620 if (!ha->reg) { 5621 ql4_printk(KERN_ERR, ha, 5622 "cannot remap MMIO, aborting\n"); 5623 5624 goto iospace_error_exit; 5625 } 5626 5627 return 0; 5628 5629iospace_error_exit: 5630 return -ENOMEM; 5631} 5632 5633static struct isp_operations qla4xxx_isp_ops = { 5634 .iospace_config = qla4xxx_iospace_config, 5635 .pci_config = qla4xxx_pci_config, 5636 .disable_intrs = qla4xxx_disable_intrs, 5637 .enable_intrs = qla4xxx_enable_intrs, 5638 .start_firmware = qla4xxx_start_firmware, 5639 .intr_handler = qla4xxx_intr_handler, 5640 .interrupt_service_routine = qla4xxx_interrupt_service_routine, 5641 .reset_chip = qla4xxx_soft_reset, 5642 .reset_firmware = qla4xxx_hw_reset, 5643 .queue_iocb = qla4xxx_queue_iocb, 5644 .complete_iocb = qla4xxx_complete_iocb, 5645 .rd_shdw_req_q_out = qla4xxx_rd_shdw_req_q_out, 5646 .rd_shdw_rsp_q_in = qla4xxx_rd_shdw_rsp_q_in, 5647 .get_sys_info = qla4xxx_get_sys_info, 5648 .queue_mailbox_command = qla4xxx_queue_mbox_cmd, 5649 .process_mailbox_interrupt = qla4xxx_process_mbox_intr, 5650}; 5651 5652static struct isp_operations qla4_82xx_isp_ops = { 5653 .iospace_config = qla4_8xxx_iospace_config, 5654 .pci_config = qla4_8xxx_pci_config, 5655 .disable_intrs = qla4_82xx_disable_intrs, 5656 .enable_intrs = qla4_82xx_enable_intrs, 5657 .start_firmware = qla4_8xxx_load_risc, 5658 .restart_firmware = qla4_82xx_try_start_fw, 5659 .intr_handler = qla4_82xx_intr_handler, 5660 .interrupt_service_routine = qla4_82xx_interrupt_service_routine, 5661 .need_reset = qla4_8xxx_need_reset, 5662 .reset_chip = qla4_82xx_isp_reset, 5663 .reset_firmware = qla4_8xxx_stop_firmware, 5664 .queue_iocb = qla4_82xx_queue_iocb, 5665 .complete_iocb = qla4_82xx_complete_iocb, 5666 .rd_shdw_req_q_out = qla4_82xx_rd_shdw_req_q_out, 5667 .rd_shdw_rsp_q_in = qla4_82xx_rd_shdw_rsp_q_in, 5668 .get_sys_info = qla4_8xxx_get_sys_info, 5669 .rd_reg_direct = qla4_82xx_rd_32, 5670 .wr_reg_direct = qla4_82xx_wr_32, 5671 .rd_reg_indirect = qla4_82xx_md_rd_32, 5672 .wr_reg_indirect = qla4_82xx_md_wr_32, 5673 .idc_lock = qla4_82xx_idc_lock, 5674 .idc_unlock = qla4_82xx_idc_unlock, 5675 .rom_lock_recovery = qla4_82xx_rom_lock_recovery, 5676 .queue_mailbox_command = qla4_82xx_queue_mbox_cmd, 5677 .process_mailbox_interrupt = qla4_82xx_process_mbox_intr, 5678}; 5679 5680static struct isp_operations qla4_83xx_isp_ops = { 5681 .iospace_config = qla4_8xxx_iospace_config, 5682 .pci_config = qla4_8xxx_pci_config, 5683 .disable_intrs = qla4_83xx_disable_intrs, 5684 .enable_intrs = qla4_83xx_enable_intrs, 5685 .start_firmware = qla4_8xxx_load_risc, 5686 .restart_firmware = qla4_83xx_start_firmware, 5687 .intr_handler = qla4_83xx_intr_handler, 5688 .interrupt_service_routine = qla4_83xx_interrupt_service_routine, 5689 .need_reset = qla4_8xxx_need_reset, 5690 .reset_chip = qla4_83xx_isp_reset, 5691 .reset_firmware = qla4_8xxx_stop_firmware, 5692 .queue_iocb = qla4_83xx_queue_iocb, 5693 .complete_iocb = qla4_83xx_complete_iocb, 5694 .rd_shdw_req_q_out = qla4xxx_rd_shdw_req_q_out, 5695 .rd_shdw_rsp_q_in = qla4xxx_rd_shdw_rsp_q_in, 5696 .get_sys_info = qla4_8xxx_get_sys_info, 5697 .rd_reg_direct = qla4_83xx_rd_reg, 5698 .wr_reg_direct = qla4_83xx_wr_reg, 5699 .rd_reg_indirect = qla4_83xx_rd_reg_indirect, 5700 .wr_reg_indirect = qla4_83xx_wr_reg_indirect, 5701 .idc_lock = qla4_83xx_drv_lock, 5702 .idc_unlock = qla4_83xx_drv_unlock, 5703 .rom_lock_recovery = qla4_83xx_rom_lock_recovery, 5704 .queue_mailbox_command = qla4_83xx_queue_mbox_cmd, 5705 .process_mailbox_interrupt = qla4_83xx_process_mbox_intr, 5706}; 5707 5708uint16_t qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha) 5709{ 5710 return (uint16_t)le32_to_cpu(ha->shadow_regs->req_q_out); 5711} 5712 5713uint16_t qla4_82xx_rd_shdw_req_q_out(struct scsi_qla_host *ha) 5714{ 5715 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->req_q_out)); 5716} 5717 5718uint16_t qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) 5719{ 5720 return (uint16_t)le32_to_cpu(ha->shadow_regs->rsp_q_in); 5721} 5722 5723uint16_t qla4_82xx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) 5724{ 5725 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->rsp_q_in)); 5726} 5727 5728static ssize_t qla4xxx_show_boot_eth_info(void *data, int type, char *buf) 5729{ 5730 struct scsi_qla_host *ha = data; 5731 char *str = buf; 5732 int rc; 5733 5734 switch (type) { 5735 case ISCSI_BOOT_ETH_FLAGS: 5736 rc = sprintf(str, "%d\n", (char)SYSFS_FLAG_FW_SEL_BOOT); 5737 break; 5738 case ISCSI_BOOT_ETH_INDEX: 5739 rc = sprintf(str, "0\n"); 5740 break; 5741 case ISCSI_BOOT_ETH_MAC: 5742 rc = sysfs_format_mac(str, ha->my_mac, 5743 MAC_ADDR_LEN); 5744 break; 5745 default: 5746 rc = -ENOSYS; 5747 break; 5748 } 5749 return rc; 5750} 5751 5752static umode_t qla4xxx_eth_get_attr_visibility(void *data, int type) 5753{ 5754 int rc; 5755 5756 switch (type) { 5757 case ISCSI_BOOT_ETH_FLAGS: 5758 case ISCSI_BOOT_ETH_MAC: 5759 case ISCSI_BOOT_ETH_INDEX: 5760 rc = S_IRUGO; 5761 break; 5762 default: 5763 rc = 0; 5764 break; 5765 } 5766 return rc; 5767} 5768 5769static ssize_t qla4xxx_show_boot_ini_info(void *data, int type, char *buf) 5770{ 5771 struct scsi_qla_host *ha = data; 5772 char *str = buf; 5773 int rc; 5774 5775 switch (type) { 5776 case ISCSI_BOOT_INI_INITIATOR_NAME: 5777 rc = sprintf(str, "%s\n", ha->name_string); 5778 break; 5779 default: 5780 rc = -ENOSYS; 5781 break; 5782 } 5783 return rc; 5784} 5785 5786static umode_t qla4xxx_ini_get_attr_visibility(void *data, int type) 5787{ 5788 int rc; 5789 5790 switch (type) { 5791 case ISCSI_BOOT_INI_INITIATOR_NAME: 5792 rc = S_IRUGO; 5793 break; 5794 default: 5795 rc = 0; 5796 break; 5797 } 5798 return rc; 5799} 5800 5801static ssize_t 5802qla4xxx_show_boot_tgt_info(struct ql4_boot_session_info *boot_sess, int type, 5803 char *buf) 5804{ 5805 struct ql4_conn_info *boot_conn = &boot_sess->conn_list[0]; 5806 char *str = buf; 5807 int rc; 5808 5809 switch (type) { 5810 case ISCSI_BOOT_TGT_NAME: 5811 rc = sprintf(buf, "%s\n", (char *)&boot_sess->target_name); 5812 break; 5813 case ISCSI_BOOT_TGT_IP_ADDR: 5814 if (boot_sess->conn_list[0].dest_ipaddr.ip_type == 0x1) 5815 rc = sprintf(buf, "%pI4\n", 5816 &boot_conn->dest_ipaddr.ip_address); 5817 else 5818 rc = sprintf(str, "%pI6\n", 5819 &boot_conn->dest_ipaddr.ip_address); 5820 break; 5821 case ISCSI_BOOT_TGT_PORT: 5822 rc = sprintf(str, "%d\n", boot_conn->dest_port); 5823 break; 5824 case ISCSI_BOOT_TGT_CHAP_NAME: 5825 rc = sprintf(str, "%.*s\n", 5826 boot_conn->chap.target_chap_name_length, 5827 (char *)&boot_conn->chap.target_chap_name); 5828 break; 5829 case ISCSI_BOOT_TGT_CHAP_SECRET: 5830 rc = sprintf(str, "%.*s\n", 5831 boot_conn->chap.target_secret_length, 5832 (char *)&boot_conn->chap.target_secret); 5833 break; 5834 case ISCSI_BOOT_TGT_REV_CHAP_NAME: 5835 rc = sprintf(str, "%.*s\n", 5836 boot_conn->chap.intr_chap_name_length, 5837 (char *)&boot_conn->chap.intr_chap_name); 5838 break; 5839 case ISCSI_BOOT_TGT_REV_CHAP_SECRET: 5840 rc = sprintf(str, "%.*s\n", 5841 boot_conn->chap.intr_secret_length, 5842 (char *)&boot_conn->chap.intr_secret); 5843 break; 5844 case ISCSI_BOOT_TGT_FLAGS: 5845 rc = sprintf(str, "%d\n", (char)SYSFS_FLAG_FW_SEL_BOOT); 5846 break; 5847 case ISCSI_BOOT_TGT_NIC_ASSOC: 5848 rc = sprintf(str, "0\n"); 5849 break; 5850 default: 5851 rc = -ENOSYS; 5852 break; 5853 } 5854 return rc; 5855} 5856 5857static ssize_t qla4xxx_show_boot_tgt_pri_info(void *data, int type, char *buf) 5858{ 5859 struct scsi_qla_host *ha = data; 5860 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_pri_sess); 5861 5862 return qla4xxx_show_boot_tgt_info(boot_sess, type, buf); 5863} 5864 5865static ssize_t qla4xxx_show_boot_tgt_sec_info(void *data, int type, char *buf) 5866{ 5867 struct scsi_qla_host *ha = data; 5868 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_sec_sess); 5869 5870 return qla4xxx_show_boot_tgt_info(boot_sess, type, buf); 5871} 5872 5873static umode_t qla4xxx_tgt_get_attr_visibility(void *data, int type) 5874{ 5875 int rc; 5876 5877 switch (type) { 5878 case ISCSI_BOOT_TGT_NAME: 5879 case ISCSI_BOOT_TGT_IP_ADDR: 5880 case ISCSI_BOOT_TGT_PORT: 5881 case ISCSI_BOOT_TGT_CHAP_NAME: 5882 case ISCSI_BOOT_TGT_CHAP_SECRET: 5883 case ISCSI_BOOT_TGT_REV_CHAP_NAME: 5884 case ISCSI_BOOT_TGT_REV_CHAP_SECRET: 5885 case ISCSI_BOOT_TGT_NIC_ASSOC: 5886 case ISCSI_BOOT_TGT_FLAGS: 5887 rc = S_IRUGO; 5888 break; 5889 default: 5890 rc = 0; 5891 break; 5892 } 5893 return rc; 5894} 5895 5896static void qla4xxx_boot_release(void *data) 5897{ 5898 struct scsi_qla_host *ha = data; 5899 5900 scsi_host_put(ha->host); 5901} 5902 5903static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[]) 5904{ 5905 dma_addr_t buf_dma; 5906 uint32_t addr, pri_addr, sec_addr; 5907 uint32_t offset; 5908 uint16_t func_num; 5909 uint8_t val; 5910 uint8_t *buf = NULL; 5911 size_t size = 13 * sizeof(uint8_t); 5912 int ret = QLA_SUCCESS; 5913 5914 func_num = PCI_FUNC(ha->pdev->devfn); 5915 5916 ql4_printk(KERN_INFO, ha, "%s: Get FW boot info for 0x%x func %d\n", 5917 __func__, ha->pdev->device, func_num); 5918 5919 if (is_qla40XX(ha)) { 5920 if (func_num == 1) { 5921 addr = NVRAM_PORT0_BOOT_MODE; 5922 pri_addr = NVRAM_PORT0_BOOT_PRI_TGT; 5923 sec_addr = NVRAM_PORT0_BOOT_SEC_TGT; 5924 } else if (func_num == 3) { 5925 addr = NVRAM_PORT1_BOOT_MODE; 5926 pri_addr = NVRAM_PORT1_BOOT_PRI_TGT; 5927 sec_addr = NVRAM_PORT1_BOOT_SEC_TGT; 5928 } else { 5929 ret = QLA_ERROR; 5930 goto exit_boot_info; 5931 } 5932 5933 /* Check Boot Mode */ 5934 val = rd_nvram_byte(ha, addr); 5935 if (!(val & 0x07)) { 5936 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Adapter boot " 5937 "options : 0x%x\n", __func__, val)); 5938 ret = QLA_ERROR; 5939 goto exit_boot_info; 5940 } 5941 5942 /* get primary valid target index */ 5943 val = rd_nvram_byte(ha, pri_addr); 5944 if (val & BIT_7) 5945 ddb_index[0] = (val & 0x7f); 5946 5947 /* get secondary valid target index */ 5948 val = rd_nvram_byte(ha, sec_addr); 5949 if (val & BIT_7) 5950 ddb_index[1] = (val & 0x7f); 5951 goto exit_boot_info; 5952 } else if (is_qla80XX(ha)) { 5953 buf = dma_alloc_coherent(&ha->pdev->dev, size, 5954 &buf_dma, GFP_KERNEL); 5955 if (!buf) { 5956 DEBUG2(ql4_printk(KERN_ERR, ha, 5957 "%s: Unable to allocate dma buffer\n", 5958 __func__)); 5959 ret = QLA_ERROR; 5960 goto exit_boot_info; 5961 } 5962 5963 if (ha->port_num == 0) 5964 offset = BOOT_PARAM_OFFSET_PORT0; 5965 else if (ha->port_num == 1) 5966 offset = BOOT_PARAM_OFFSET_PORT1; 5967 else { 5968 ret = QLA_ERROR; 5969 goto exit_boot_info_free; 5970 } 5971 addr = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_iscsi_param * 4) + 5972 offset; 5973 if (qla4xxx_get_flash(ha, buf_dma, addr, 5974 13 * sizeof(uint8_t)) != QLA_SUCCESS) { 5975 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: Get Flash" 5976 " failed\n", ha->host_no, __func__)); 5977 ret = QLA_ERROR; 5978 goto exit_boot_info_free; 5979 } 5980 /* Check Boot Mode */ 5981 if (!(buf[1] & 0x07)) { 5982 DEBUG2(ql4_printk(KERN_INFO, ha, "Firmware boot options" 5983 " : 0x%x\n", buf[1])); 5984 ret = QLA_ERROR; 5985 goto exit_boot_info_free; 5986 } 5987 5988 /* get primary valid target index */ 5989 if (buf[2] & BIT_7) 5990 ddb_index[0] = buf[2] & 0x7f; 5991 5992 /* get secondary valid target index */ 5993 if (buf[11] & BIT_7) 5994 ddb_index[1] = buf[11] & 0x7f; 5995 } else { 5996 ret = QLA_ERROR; 5997 goto exit_boot_info; 5998 } 5999 6000 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary target ID %d, Secondary" 6001 " target ID %d\n", __func__, ddb_index[0], 6002 ddb_index[1])); 6003 6004exit_boot_info_free: 6005 dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma); 6006exit_boot_info: 6007 ha->pri_ddb_idx = ddb_index[0]; 6008 ha->sec_ddb_idx = ddb_index[1]; 6009 return ret; 6010} 6011 6012/** 6013 * qla4xxx_get_bidi_chap - Get a BIDI CHAP user and password 6014 * @ha: pointer to adapter structure 6015 * @username: CHAP username to be returned 6016 * @password: CHAP password to be returned 6017 * 6018 * If a boot entry has BIDI CHAP enabled then we need to set the BIDI CHAP 6019 * user and password in the sysfs entry in /sys/firmware/iscsi_boot#/. 6020 * So from the CHAP cache find the first BIDI CHAP entry and set it 6021 * to the boot record in sysfs. 6022 **/ 6023static int qla4xxx_get_bidi_chap(struct scsi_qla_host *ha, char *username, 6024 char *password) 6025{ 6026 int i, ret = -EINVAL; 6027 int max_chap_entries = 0; 6028 struct ql4_chap_table *chap_table; 6029 6030 if (is_qla80XX(ha)) 6031 max_chap_entries = (ha->hw.flt_chap_size / 2) / 6032 sizeof(struct ql4_chap_table); 6033 else 6034 max_chap_entries = MAX_CHAP_ENTRIES_40XX; 6035 6036 if (!ha->chap_list) { 6037 ql4_printk(KERN_ERR, ha, "Do not have CHAP table cache\n"); 6038 return ret; 6039 } 6040 6041 mutex_lock(&ha->chap_sem); 6042 for (i = 0; i < max_chap_entries; i++) { 6043 chap_table = (struct ql4_chap_table *)ha->chap_list + i; 6044 if (chap_table->cookie != 6045 cpu_to_le16(CHAP_VALID_COOKIE)) { 6046 continue; 6047 } 6048 6049 if (chap_table->flags & BIT_7) /* local */ 6050 continue; 6051 6052 if (!(chap_table->flags & BIT_6)) /* Not BIDI */ 6053 continue; 6054 6055 strlcpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN); 6056 strlcpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN); 6057 ret = 0; 6058 break; 6059 } 6060 mutex_unlock(&ha->chap_sem); 6061 6062 return ret; 6063} 6064 6065 6066static int qla4xxx_get_boot_target(struct scsi_qla_host *ha, 6067 struct ql4_boot_session_info *boot_sess, 6068 uint16_t ddb_index) 6069{ 6070 struct ql4_conn_info *boot_conn = &boot_sess->conn_list[0]; 6071 struct dev_db_entry *fw_ddb_entry; 6072 dma_addr_t fw_ddb_entry_dma; 6073 uint16_t idx; 6074 uint16_t options; 6075 int ret = QLA_SUCCESS; 6076 6077 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 6078 &fw_ddb_entry_dma, GFP_KERNEL); 6079 if (!fw_ddb_entry) { 6080 DEBUG2(ql4_printk(KERN_ERR, ha, 6081 "%s: Unable to allocate dma buffer.\n", 6082 __func__)); 6083 ret = QLA_ERROR; 6084 return ret; 6085 } 6086 6087 if (qla4xxx_bootdb_by_index(ha, fw_ddb_entry, 6088 fw_ddb_entry_dma, ddb_index)) { 6089 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: No Flash DDB found at " 6090 "index [%d]\n", __func__, ddb_index)); 6091 ret = QLA_ERROR; 6092 goto exit_boot_target; 6093 } 6094 6095 /* Update target name and IP from DDB */ 6096 memcpy(boot_sess->target_name, fw_ddb_entry->iscsi_name, 6097 min(sizeof(boot_sess->target_name), 6098 sizeof(fw_ddb_entry->iscsi_name))); 6099 6100 options = le16_to_cpu(fw_ddb_entry->options); 6101 if (options & DDB_OPT_IPV6_DEVICE) { 6102 memcpy(&boot_conn->dest_ipaddr.ip_address, 6103 &fw_ddb_entry->ip_addr[0], IPv6_ADDR_LEN); 6104 } else { 6105 boot_conn->dest_ipaddr.ip_type = 0x1; 6106 memcpy(&boot_conn->dest_ipaddr.ip_address, 6107 &fw_ddb_entry->ip_addr[0], IP_ADDR_LEN); 6108 } 6109 6110 boot_conn->dest_port = le16_to_cpu(fw_ddb_entry->port); 6111 6112 /* update chap information */ 6113 idx = __le16_to_cpu(fw_ddb_entry->chap_tbl_idx); 6114 6115 if (BIT_7 & le16_to_cpu(fw_ddb_entry->iscsi_options)) { 6116 6117 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting chap\n")); 6118 6119 ret = qla4xxx_get_chap(ha, (char *)&boot_conn->chap. 6120 target_chap_name, 6121 (char *)&boot_conn->chap.target_secret, 6122 idx); 6123 if (ret) { 6124 ql4_printk(KERN_ERR, ha, "Failed to set chap\n"); 6125 ret = QLA_ERROR; 6126 goto exit_boot_target; 6127 } 6128 6129 boot_conn->chap.target_chap_name_length = QL4_CHAP_MAX_NAME_LEN; 6130 boot_conn->chap.target_secret_length = QL4_CHAP_MAX_SECRET_LEN; 6131 } 6132 6133 if (BIT_4 & le16_to_cpu(fw_ddb_entry->iscsi_options)) { 6134 6135 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting BIDI chap\n")); 6136 6137 ret = qla4xxx_get_bidi_chap(ha, 6138 (char *)&boot_conn->chap.intr_chap_name, 6139 (char *)&boot_conn->chap.intr_secret); 6140 6141 if (ret) { 6142 ql4_printk(KERN_ERR, ha, "Failed to set BIDI chap\n"); 6143 ret = QLA_ERROR; 6144 goto exit_boot_target; 6145 } 6146 6147 boot_conn->chap.intr_chap_name_length = QL4_CHAP_MAX_NAME_LEN; 6148 boot_conn->chap.intr_secret_length = QL4_CHAP_MAX_SECRET_LEN; 6149 } 6150 6151exit_boot_target: 6152 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 6153 fw_ddb_entry, fw_ddb_entry_dma); 6154 return ret; 6155} 6156 6157static int qla4xxx_get_boot_info(struct scsi_qla_host *ha) 6158{ 6159 uint16_t ddb_index[2]; 6160 int ret = QLA_ERROR; 6161 int rval; 6162 6163 memset(ddb_index, 0, sizeof(ddb_index)); 6164 ddb_index[0] = 0xffff; 6165 ddb_index[1] = 0xffff; 6166 ret = get_fw_boot_info(ha, ddb_index); 6167 if (ret != QLA_SUCCESS) { 6168 DEBUG2(ql4_printk(KERN_INFO, ha, 6169 "%s: No boot target configured.\n", __func__)); 6170 return ret; 6171 } 6172 6173 if (ql4xdisablesysfsboot) 6174 return QLA_SUCCESS; 6175 6176 if (ddb_index[0] == 0xffff) 6177 goto sec_target; 6178 6179 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess), 6180 ddb_index[0]); 6181 if (rval != QLA_SUCCESS) { 6182 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary boot target not " 6183 "configured\n", __func__)); 6184 } else 6185 ret = QLA_SUCCESS; 6186 6187sec_target: 6188 if (ddb_index[1] == 0xffff) 6189 goto exit_get_boot_info; 6190 6191 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess), 6192 ddb_index[1]); 6193 if (rval != QLA_SUCCESS) { 6194 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Secondary boot target not" 6195 " configured\n", __func__)); 6196 } else 6197 ret = QLA_SUCCESS; 6198 6199exit_get_boot_info: 6200 return ret; 6201} 6202 6203static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha) 6204{ 6205 struct iscsi_boot_kobj *boot_kobj; 6206 6207 if (qla4xxx_get_boot_info(ha) != QLA_SUCCESS) 6208 return QLA_ERROR; 6209 6210 if (ql4xdisablesysfsboot) { 6211 ql4_printk(KERN_INFO, ha, 6212 "%s: syfsboot disabled - driver will trigger login " 6213 "and publish session for discovery .\n", __func__); 6214 return QLA_SUCCESS; 6215 } 6216 6217 6218 ha->boot_kset = iscsi_boot_create_host_kset(ha->host->host_no); 6219 if (!ha->boot_kset) 6220 goto kset_free; 6221 6222 if (!scsi_host_get(ha->host)) 6223 goto kset_free; 6224 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 0, ha, 6225 qla4xxx_show_boot_tgt_pri_info, 6226 qla4xxx_tgt_get_attr_visibility, 6227 qla4xxx_boot_release); 6228 if (!boot_kobj) 6229 goto put_host; 6230 6231 if (!scsi_host_get(ha->host)) 6232 goto kset_free; 6233 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 1, ha, 6234 qla4xxx_show_boot_tgt_sec_info, 6235 qla4xxx_tgt_get_attr_visibility, 6236 qla4xxx_boot_release); 6237 if (!boot_kobj) 6238 goto put_host; 6239 6240 if (!scsi_host_get(ha->host)) 6241 goto kset_free; 6242 boot_kobj = iscsi_boot_create_initiator(ha->boot_kset, 0, ha, 6243 qla4xxx_show_boot_ini_info, 6244 qla4xxx_ini_get_attr_visibility, 6245 qla4xxx_boot_release); 6246 if (!boot_kobj) 6247 goto put_host; 6248 6249 if (!scsi_host_get(ha->host)) 6250 goto kset_free; 6251 boot_kobj = iscsi_boot_create_ethernet(ha->boot_kset, 0, ha, 6252 qla4xxx_show_boot_eth_info, 6253 qla4xxx_eth_get_attr_visibility, 6254 qla4xxx_boot_release); 6255 if (!boot_kobj) 6256 goto put_host; 6257 6258 return QLA_SUCCESS; 6259 6260put_host: 6261 scsi_host_put(ha->host); 6262kset_free: 6263 iscsi_boot_destroy_kset(ha->boot_kset); 6264 return -ENOMEM; 6265} 6266 6267 6268static void qla4xxx_get_param_ddb(struct ddb_entry *ddb_entry, 6269 struct ql4_tuple_ddb *tddb) 6270{ 6271 struct iscsi_cls_session *cls_sess; 6272 struct iscsi_cls_conn *cls_conn; 6273 struct iscsi_session *sess; 6274 struct iscsi_conn *conn; 6275 6276 DEBUG2(printk(KERN_INFO "Func: %s\n", __func__)); 6277 cls_sess = ddb_entry->sess; 6278 sess = cls_sess->dd_data; 6279 cls_conn = ddb_entry->conn; 6280 conn = cls_conn->dd_data; 6281 6282 tddb->tpgt = sess->tpgt; 6283 tddb->port = conn->persistent_port; 6284 strlcpy(tddb->iscsi_name, sess->targetname, ISCSI_NAME_SIZE); 6285 strlcpy(tddb->ip_addr, conn->persistent_address, DDB_IPADDR_LEN); 6286} 6287 6288static void qla4xxx_convert_param_ddb(struct dev_db_entry *fw_ddb_entry, 6289 struct ql4_tuple_ddb *tddb, 6290 uint8_t *flash_isid) 6291{ 6292 uint16_t options = 0; 6293 6294 tddb->tpgt = le32_to_cpu(fw_ddb_entry->tgt_portal_grp); 6295 memcpy(&tddb->iscsi_name[0], &fw_ddb_entry->iscsi_name[0], 6296 min(sizeof(tddb->iscsi_name), sizeof(fw_ddb_entry->iscsi_name))); 6297 6298 options = le16_to_cpu(fw_ddb_entry->options); 6299 if (options & DDB_OPT_IPV6_DEVICE) 6300 sprintf(tddb->ip_addr, "%pI6", fw_ddb_entry->ip_addr); 6301 else 6302 sprintf(tddb->ip_addr, "%pI4", fw_ddb_entry->ip_addr); 6303 6304 tddb->port = le16_to_cpu(fw_ddb_entry->port); 6305 6306 if (flash_isid == NULL) 6307 memcpy(&tddb->isid[0], &fw_ddb_entry->isid[0], 6308 sizeof(tddb->isid)); 6309 else 6310 memcpy(&tddb->isid[0], &flash_isid[0], sizeof(tddb->isid)); 6311} 6312 6313static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha, 6314 struct ql4_tuple_ddb *old_tddb, 6315 struct ql4_tuple_ddb *new_tddb, 6316 uint8_t is_isid_compare) 6317{ 6318 if (strcmp(old_tddb->iscsi_name, new_tddb->iscsi_name)) 6319 return QLA_ERROR; 6320 6321 if (strcmp(old_tddb->ip_addr, new_tddb->ip_addr)) 6322 return QLA_ERROR; 6323 6324 if (old_tddb->port != new_tddb->port) 6325 return QLA_ERROR; 6326 6327 /* For multi sessions, driver generates the ISID, so do not compare 6328 * ISID in reset path since it would be a comparison between the 6329 * driver generated ISID and firmware generated ISID. This could 6330 * lead to adding duplicated DDBs in the list as driver generated 6331 * ISID would not match firmware generated ISID. 6332 */ 6333 if (is_isid_compare) { 6334 DEBUG2(ql4_printk(KERN_INFO, ha, 6335 "%s: old ISID [%pmR] New ISID [%pmR]\n", 6336 __func__, old_tddb->isid, new_tddb->isid)); 6337 6338 if (memcmp(&old_tddb->isid[0], &new_tddb->isid[0], 6339 sizeof(old_tddb->isid))) 6340 return QLA_ERROR; 6341 } 6342 6343 DEBUG2(ql4_printk(KERN_INFO, ha, 6344 "Match Found, fw[%d,%d,%s,%s], [%d,%d,%s,%s]", 6345 old_tddb->port, old_tddb->tpgt, old_tddb->ip_addr, 6346 old_tddb->iscsi_name, new_tddb->port, new_tddb->tpgt, 6347 new_tddb->ip_addr, new_tddb->iscsi_name)); 6348 6349 return QLA_SUCCESS; 6350} 6351 6352static int qla4xxx_is_session_exists(struct scsi_qla_host *ha, 6353 struct dev_db_entry *fw_ddb_entry, 6354 uint32_t *index) 6355{ 6356 struct ddb_entry *ddb_entry; 6357 struct ql4_tuple_ddb *fw_tddb = NULL; 6358 struct ql4_tuple_ddb *tmp_tddb = NULL; 6359 int idx; 6360 int ret = QLA_ERROR; 6361 6362 fw_tddb = vzalloc(sizeof(*fw_tddb)); 6363 if (!fw_tddb) { 6364 DEBUG2(ql4_printk(KERN_WARNING, ha, 6365 "Memory Allocation failed.\n")); 6366 ret = QLA_SUCCESS; 6367 goto exit_check; 6368 } 6369 6370 tmp_tddb = vzalloc(sizeof(*tmp_tddb)); 6371 if (!tmp_tddb) { 6372 DEBUG2(ql4_printk(KERN_WARNING, ha, 6373 "Memory Allocation failed.\n")); 6374 ret = QLA_SUCCESS; 6375 goto exit_check; 6376 } 6377 6378 qla4xxx_convert_param_ddb(fw_ddb_entry, fw_tddb, NULL); 6379 6380 for (idx = 0; idx < MAX_DDB_ENTRIES; idx++) { 6381 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); 6382 if (ddb_entry == NULL) 6383 continue; 6384 6385 qla4xxx_get_param_ddb(ddb_entry, tmp_tddb); 6386 if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, false)) { 6387 ret = QLA_SUCCESS; /* found */ 6388 if (index != NULL) 6389 *index = idx; 6390 goto exit_check; 6391 } 6392 } 6393 6394exit_check: 6395 vfree(fw_tddb); 6396 vfree(tmp_tddb); 6397 return ret; 6398} 6399 6400/** 6401 * qla4xxx_check_existing_isid - check if target with same isid exist 6402 * in target list 6403 * @list_nt: list of target 6404 * @isid: isid to check 6405 * 6406 * This routine return QLA_SUCCESS if target with same isid exist 6407 **/ 6408static int qla4xxx_check_existing_isid(struct list_head *list_nt, uint8_t *isid) 6409{ 6410 struct qla_ddb_index *nt_ddb_idx, *nt_ddb_idx_tmp; 6411 struct dev_db_entry *fw_ddb_entry; 6412 6413 list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) { 6414 fw_ddb_entry = &nt_ddb_idx->fw_ddb; 6415 6416 if (memcmp(&fw_ddb_entry->isid[0], &isid[0], 6417 sizeof(nt_ddb_idx->fw_ddb.isid)) == 0) { 6418 return QLA_SUCCESS; 6419 } 6420 } 6421 return QLA_ERROR; 6422} 6423 6424/** 6425 * qla4xxx_update_isid - compare ddbs and updated isid 6426 * @ha: Pointer to host adapter structure. 6427 * @list_nt: list of nt target 6428 * @fw_ddb_entry: firmware ddb entry 6429 * 6430 * This routine update isid if ddbs have same iqn, same isid and 6431 * different IP addr. 6432 * Return QLA_SUCCESS if isid is updated. 6433 **/ 6434static int qla4xxx_update_isid(struct scsi_qla_host *ha, 6435 struct list_head *list_nt, 6436 struct dev_db_entry *fw_ddb_entry) 6437{ 6438 uint8_t base_value, i; 6439 6440 base_value = fw_ddb_entry->isid[1] & 0x1f; 6441 for (i = 0; i < 8; i++) { 6442 fw_ddb_entry->isid[1] = (base_value | (i << 5)); 6443 if (qla4xxx_check_existing_isid(list_nt, fw_ddb_entry->isid)) 6444 break; 6445 } 6446 6447 if (!qla4xxx_check_existing_isid(list_nt, fw_ddb_entry->isid)) 6448 return QLA_ERROR; 6449 6450 return QLA_SUCCESS; 6451} 6452 6453/** 6454 * qla4xxx_should_update_isid - check if isid need to update 6455 * @ha: Pointer to host adapter structure. 6456 * @old_tddb: ddb tuple 6457 * @new_tddb: ddb tuple 6458 * 6459 * Return QLA_SUCCESS if different IP, different PORT, same iqn, 6460 * same isid 6461 **/ 6462static int qla4xxx_should_update_isid(struct scsi_qla_host *ha, 6463 struct ql4_tuple_ddb *old_tddb, 6464 struct ql4_tuple_ddb *new_tddb) 6465{ 6466 if (strcmp(old_tddb->ip_addr, new_tddb->ip_addr) == 0) { 6467 /* Same ip */ 6468 if (old_tddb->port == new_tddb->port) 6469 return QLA_ERROR; 6470 } 6471 6472 if (strcmp(old_tddb->iscsi_name, new_tddb->iscsi_name)) 6473 /* different iqn */ 6474 return QLA_ERROR; 6475 6476 if (memcmp(&old_tddb->isid[0], &new_tddb->isid[0], 6477 sizeof(old_tddb->isid))) 6478 /* different isid */ 6479 return QLA_ERROR; 6480 6481 return QLA_SUCCESS; 6482} 6483 6484/** 6485 * qla4xxx_is_flash_ddb_exists - check if fw_ddb_entry already exists in list_nt 6486 * @ha: Pointer to host adapter structure. 6487 * @list_nt: list of nt target. 6488 * @fw_ddb_entry: firmware ddb entry. 6489 * 6490 * This routine check if fw_ddb_entry already exists in list_nt to avoid 6491 * duplicate ddb in list_nt. 6492 * Return QLA_SUCCESS if duplicate ddb exit in list_nl. 6493 * Note: This function also update isid of DDB if required. 6494 **/ 6495 6496static int qla4xxx_is_flash_ddb_exists(struct scsi_qla_host *ha, 6497 struct list_head *list_nt, 6498 struct dev_db_entry *fw_ddb_entry) 6499{ 6500 struct qla_ddb_index *nt_ddb_idx, *nt_ddb_idx_tmp; 6501 struct ql4_tuple_ddb *fw_tddb = NULL; 6502 struct ql4_tuple_ddb *tmp_tddb = NULL; 6503 int rval, ret = QLA_ERROR; 6504 6505 fw_tddb = vzalloc(sizeof(*fw_tddb)); 6506 if (!fw_tddb) { 6507 DEBUG2(ql4_printk(KERN_WARNING, ha, 6508 "Memory Allocation failed.\n")); 6509 ret = QLA_SUCCESS; 6510 goto exit_check; 6511 } 6512 6513 tmp_tddb = vzalloc(sizeof(*tmp_tddb)); 6514 if (!tmp_tddb) { 6515 DEBUG2(ql4_printk(KERN_WARNING, ha, 6516 "Memory Allocation failed.\n")); 6517 ret = QLA_SUCCESS; 6518 goto exit_check; 6519 } 6520 6521 qla4xxx_convert_param_ddb(fw_ddb_entry, fw_tddb, NULL); 6522 6523 list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) { 6524 qla4xxx_convert_param_ddb(&nt_ddb_idx->fw_ddb, tmp_tddb, 6525 nt_ddb_idx->flash_isid); 6526 ret = qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, true); 6527 /* found duplicate ddb */ 6528 if (ret == QLA_SUCCESS) 6529 goto exit_check; 6530 } 6531 6532 list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) { 6533 qla4xxx_convert_param_ddb(&nt_ddb_idx->fw_ddb, tmp_tddb, NULL); 6534 6535 ret = qla4xxx_should_update_isid(ha, tmp_tddb, fw_tddb); 6536 if (ret == QLA_SUCCESS) { 6537 rval = qla4xxx_update_isid(ha, list_nt, fw_ddb_entry); 6538 if (rval == QLA_SUCCESS) 6539 ret = QLA_ERROR; 6540 else 6541 ret = QLA_SUCCESS; 6542 6543 goto exit_check; 6544 } 6545 } 6546 6547exit_check: 6548 vfree(fw_tddb); 6549 vfree(tmp_tddb); 6550 return ret; 6551} 6552 6553static void qla4xxx_free_ddb_list(struct list_head *list_ddb) 6554{ 6555 struct qla_ddb_index *ddb_idx, *ddb_idx_tmp; 6556 6557 list_for_each_entry_safe(ddb_idx, ddb_idx_tmp, list_ddb, list) { 6558 list_del_init(&ddb_idx->list); 6559 vfree(ddb_idx); 6560 } 6561} 6562 6563static struct iscsi_endpoint *qla4xxx_get_ep_fwdb(struct scsi_qla_host *ha, 6564 struct dev_db_entry *fw_ddb_entry) 6565{ 6566 struct iscsi_endpoint *ep; 6567 struct sockaddr_in *addr; 6568 struct sockaddr_in6 *addr6; 6569 struct sockaddr *t_addr; 6570 struct sockaddr_storage *dst_addr; 6571 char *ip; 6572 6573 /* TODO: need to destroy on unload iscsi_endpoint*/ 6574 dst_addr = vmalloc(sizeof(*dst_addr)); 6575 if (!dst_addr) 6576 return NULL; 6577 6578 if (fw_ddb_entry->options & DDB_OPT_IPV6_DEVICE) { 6579 t_addr = (struct sockaddr *)dst_addr; 6580 t_addr->sa_family = AF_INET6; 6581 addr6 = (struct sockaddr_in6 *)dst_addr; 6582 ip = (char *)&addr6->sin6_addr; 6583 memcpy(ip, fw_ddb_entry->ip_addr, IPv6_ADDR_LEN); 6584 addr6->sin6_port = htons(le16_to_cpu(fw_ddb_entry->port)); 6585 6586 } else { 6587 t_addr = (struct sockaddr *)dst_addr; 6588 t_addr->sa_family = AF_INET; 6589 addr = (struct sockaddr_in *)dst_addr; 6590 ip = (char *)&addr->sin_addr; 6591 memcpy(ip, fw_ddb_entry->ip_addr, IP_ADDR_LEN); 6592 addr->sin_port = htons(le16_to_cpu(fw_ddb_entry->port)); 6593 } 6594 6595 ep = qla4xxx_ep_connect(ha->host, (struct sockaddr *)dst_addr, 0); 6596 vfree(dst_addr); 6597 return ep; 6598} 6599 6600static int qla4xxx_verify_boot_idx(struct scsi_qla_host *ha, uint16_t idx) 6601{ 6602 if (ql4xdisablesysfsboot) 6603 return QLA_SUCCESS; 6604 if (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx) 6605 return QLA_ERROR; 6606 return QLA_SUCCESS; 6607} 6608 6609static void qla4xxx_setup_flash_ddb_entry(struct scsi_qla_host *ha, 6610 struct ddb_entry *ddb_entry, 6611 uint16_t idx) 6612{ 6613 uint16_t def_timeout; 6614 6615 ddb_entry->ddb_type = FLASH_DDB; 6616 ddb_entry->fw_ddb_index = INVALID_ENTRY; 6617 ddb_entry->fw_ddb_device_state = DDB_DS_NO_CONNECTION_ACTIVE; 6618 ddb_entry->ha = ha; 6619 ddb_entry->unblock_sess = qla4xxx_unblock_flash_ddb; 6620 ddb_entry->ddb_change = qla4xxx_flash_ddb_change; 6621 ddb_entry->chap_tbl_idx = INVALID_ENTRY; 6622 6623 atomic_set(&ddb_entry->retry_relogin_timer, INVALID_ENTRY); 6624 atomic_set(&ddb_entry->relogin_timer, 0); 6625 atomic_set(&ddb_entry->relogin_retry_count, 0); 6626 def_timeout = le16_to_cpu(ddb_entry->fw_ddb_entry.def_timeout); 6627 ddb_entry->default_relogin_timeout = 6628 (def_timeout > LOGIN_TOV) && (def_timeout < LOGIN_TOV * 10) ? 6629 def_timeout : LOGIN_TOV; 6630 ddb_entry->default_time2wait = 6631 le16_to_cpu(ddb_entry->fw_ddb_entry.iscsi_def_time2wait); 6632 6633 if (ql4xdisablesysfsboot && 6634 (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx)) 6635 set_bit(DF_BOOT_TGT, &ddb_entry->flags); 6636} 6637 6638static void qla4xxx_wait_for_ip_configuration(struct scsi_qla_host *ha) 6639{ 6640 uint32_t idx = 0; 6641 uint32_t ip_idx[IP_ADDR_COUNT] = {0, 1, 2, 3}; /* 4 IP interfaces */ 6642 uint32_t sts[MBOX_REG_COUNT]; 6643 uint32_t ip_state; 6644 unsigned long wtime; 6645 int ret; 6646 6647 wtime = jiffies + (HZ * IP_CONFIG_TOV); 6648 do { 6649 for (idx = 0; idx < IP_ADDR_COUNT; idx++) { 6650 if (ip_idx[idx] == -1) 6651 continue; 6652 6653 ret = qla4xxx_get_ip_state(ha, 0, ip_idx[idx], sts); 6654 6655 if (ret == QLA_ERROR) { 6656 ip_idx[idx] = -1; 6657 continue; 6658 } 6659 6660 ip_state = (sts[1] & IP_STATE_MASK) >> IP_STATE_SHIFT; 6661 6662 DEBUG2(ql4_printk(KERN_INFO, ha, 6663 "Waiting for IP state for idx = %d, state = 0x%x\n", 6664 ip_idx[idx], ip_state)); 6665 if (ip_state == IP_ADDRSTATE_UNCONFIGURED || 6666 ip_state == IP_ADDRSTATE_INVALID || 6667 ip_state == IP_ADDRSTATE_PREFERRED || 6668 ip_state == IP_ADDRSTATE_DEPRICATED || 6669 ip_state == IP_ADDRSTATE_DISABLING) 6670 ip_idx[idx] = -1; 6671 } 6672 6673 /* Break if all IP states checked */ 6674 if ((ip_idx[0] == -1) && 6675 (ip_idx[1] == -1) && 6676 (ip_idx[2] == -1) && 6677 (ip_idx[3] == -1)) 6678 break; 6679 schedule_timeout_uninterruptible(HZ); 6680 } while (time_after(wtime, jiffies)); 6681} 6682 6683static int qla4xxx_cmp_fw_stentry(struct dev_db_entry *fw_ddb_entry, 6684 struct dev_db_entry *flash_ddb_entry) 6685{ 6686 uint16_t options = 0; 6687 size_t ip_len = IP_ADDR_LEN; 6688 6689 options = le16_to_cpu(fw_ddb_entry->options); 6690 if (options & DDB_OPT_IPV6_DEVICE) 6691 ip_len = IPv6_ADDR_LEN; 6692 6693 if (memcmp(fw_ddb_entry->ip_addr, flash_ddb_entry->ip_addr, ip_len)) 6694 return QLA_ERROR; 6695 6696 if (memcmp(&fw_ddb_entry->isid[0], &flash_ddb_entry->isid[0], 6697 sizeof(fw_ddb_entry->isid))) 6698 return QLA_ERROR; 6699 6700 if (memcmp(&fw_ddb_entry->port, &flash_ddb_entry->port, 6701 sizeof(fw_ddb_entry->port))) 6702 return QLA_ERROR; 6703 6704 return QLA_SUCCESS; 6705} 6706 6707static int qla4xxx_find_flash_st_idx(struct scsi_qla_host *ha, 6708 struct dev_db_entry *fw_ddb_entry, 6709 uint32_t fw_idx, uint32_t *flash_index) 6710{ 6711 struct dev_db_entry *flash_ddb_entry; 6712 dma_addr_t flash_ddb_entry_dma; 6713 uint32_t idx = 0; 6714 int max_ddbs; 6715 int ret = QLA_ERROR, status; 6716 6717 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : 6718 MAX_DEV_DB_ENTRIES; 6719 6720 flash_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, 6721 &flash_ddb_entry_dma); 6722 if (flash_ddb_entry == NULL || fw_ddb_entry == NULL) { 6723 ql4_printk(KERN_ERR, ha, "Out of memory\n"); 6724 goto exit_find_st_idx; 6725 } 6726 6727 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, 6728 flash_ddb_entry_dma, fw_idx); 6729 if (status == QLA_SUCCESS) { 6730 status = qla4xxx_cmp_fw_stentry(fw_ddb_entry, flash_ddb_entry); 6731 if (status == QLA_SUCCESS) { 6732 *flash_index = fw_idx; 6733 ret = QLA_SUCCESS; 6734 goto exit_find_st_idx; 6735 } 6736 } 6737 6738 for (idx = 0; idx < max_ddbs; idx++) { 6739 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, 6740 flash_ddb_entry_dma, idx); 6741 if (status == QLA_ERROR) 6742 continue; 6743 6744 status = qla4xxx_cmp_fw_stentry(fw_ddb_entry, flash_ddb_entry); 6745 if (status == QLA_SUCCESS) { 6746 *flash_index = idx; 6747 ret = QLA_SUCCESS; 6748 goto exit_find_st_idx; 6749 } 6750 } 6751 6752 if (idx == max_ddbs) 6753 ql4_printk(KERN_ERR, ha, "Failed to find ST [%d] in flash\n", 6754 fw_idx); 6755 6756exit_find_st_idx: 6757 if (flash_ddb_entry) 6758 dma_pool_free(ha->fw_ddb_dma_pool, flash_ddb_entry, 6759 flash_ddb_entry_dma); 6760 6761 return ret; 6762} 6763 6764static void qla4xxx_build_st_list(struct scsi_qla_host *ha, 6765 struct list_head *list_st) 6766{ 6767 struct qla_ddb_index *st_ddb_idx; 6768 int max_ddbs; 6769 int fw_idx_size; 6770 struct dev_db_entry *fw_ddb_entry; 6771 dma_addr_t fw_ddb_dma; 6772 int ret; 6773 uint32_t idx = 0, next_idx = 0; 6774 uint32_t state = 0, conn_err = 0; 6775 uint32_t flash_index = -1; 6776 uint16_t conn_id = 0; 6777 6778 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, 6779 &fw_ddb_dma); 6780 if (fw_ddb_entry == NULL) { 6781 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); 6782 goto exit_st_list; 6783 } 6784 6785 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : 6786 MAX_DEV_DB_ENTRIES; 6787 fw_idx_size = sizeof(struct qla_ddb_index); 6788 6789 for (idx = 0; idx < max_ddbs; idx = next_idx) { 6790 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, 6791 NULL, &next_idx, &state, 6792 &conn_err, NULL, &conn_id); 6793 if (ret == QLA_ERROR) 6794 break; 6795 6796 /* Ignore DDB if invalid state (unassigned) */ 6797 if (state == DDB_DS_UNASSIGNED) 6798 goto continue_next_st; 6799 6800 /* Check if ST, add to the list_st */ 6801 if (strlen((char *) fw_ddb_entry->iscsi_name) != 0) 6802 goto continue_next_st; 6803 6804 st_ddb_idx = vzalloc(fw_idx_size); 6805 if (!st_ddb_idx) 6806 break; 6807 6808 ret = qla4xxx_find_flash_st_idx(ha, fw_ddb_entry, idx, 6809 &flash_index); 6810 if (ret == QLA_ERROR) { 6811 ql4_printk(KERN_ERR, ha, 6812 "No flash entry for ST at idx [%d]\n", idx); 6813 st_ddb_idx->flash_ddb_idx = idx; 6814 } else { 6815 ql4_printk(KERN_INFO, ha, 6816 "ST at idx [%d] is stored at flash [%d]\n", 6817 idx, flash_index); 6818 st_ddb_idx->flash_ddb_idx = flash_index; 6819 } 6820 6821 st_ddb_idx->fw_ddb_idx = idx; 6822 6823 list_add_tail(&st_ddb_idx->list, list_st); 6824continue_next_st: 6825 if (next_idx == 0) 6826 break; 6827 } 6828 6829exit_st_list: 6830 if (fw_ddb_entry) 6831 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); 6832} 6833 6834/** 6835 * qla4xxx_remove_failed_ddb - Remove inactive or failed ddb from list 6836 * @ha: pointer to adapter structure 6837 * @list_ddb: List from which failed ddb to be removed 6838 * 6839 * Iterate over the list of DDBs and find and remove DDBs that are either in 6840 * no connection active state or failed state 6841 **/ 6842static void qla4xxx_remove_failed_ddb(struct scsi_qla_host *ha, 6843 struct list_head *list_ddb) 6844{ 6845 struct qla_ddb_index *ddb_idx, *ddb_idx_tmp; 6846 uint32_t next_idx = 0; 6847 uint32_t state = 0, conn_err = 0; 6848 int ret; 6849 6850 list_for_each_entry_safe(ddb_idx, ddb_idx_tmp, list_ddb, list) { 6851 ret = qla4xxx_get_fwddb_entry(ha, ddb_idx->fw_ddb_idx, 6852 NULL, 0, NULL, &next_idx, &state, 6853 &conn_err, NULL, NULL); 6854 if (ret == QLA_ERROR) 6855 continue; 6856 6857 if (state == DDB_DS_NO_CONNECTION_ACTIVE || 6858 state == DDB_DS_SESSION_FAILED) { 6859 list_del_init(&ddb_idx->list); 6860 vfree(ddb_idx); 6861 } 6862 } 6863} 6864 6865static void qla4xxx_update_sess_disc_idx(struct scsi_qla_host *ha, 6866 struct ddb_entry *ddb_entry, 6867 struct dev_db_entry *fw_ddb_entry) 6868{ 6869 struct iscsi_cls_session *cls_sess; 6870 struct iscsi_session *sess; 6871 uint32_t max_ddbs = 0; 6872 uint16_t ddb_link = -1; 6873 6874 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : 6875 MAX_DEV_DB_ENTRIES; 6876 6877 cls_sess = ddb_entry->sess; 6878 sess = cls_sess->dd_data; 6879 6880 ddb_link = le16_to_cpu(fw_ddb_entry->ddb_link); 6881 if (ddb_link < max_ddbs) 6882 sess->discovery_parent_idx = ddb_link; 6883 else 6884 sess->discovery_parent_idx = DDB_NO_LINK; 6885} 6886 6887static int qla4xxx_sess_conn_setup(struct scsi_qla_host *ha, 6888 struct dev_db_entry *fw_ddb_entry, 6889 int is_reset, uint16_t idx) 6890{ 6891 struct iscsi_cls_session *cls_sess; 6892 struct iscsi_session *sess; 6893 struct iscsi_cls_conn *cls_conn; 6894 struct iscsi_endpoint *ep; 6895 uint16_t cmds_max = 32; 6896 uint16_t conn_id = 0; 6897 uint32_t initial_cmdsn = 0; 6898 int ret = QLA_SUCCESS; 6899 6900 struct ddb_entry *ddb_entry = NULL; 6901 6902 /* Create session object, with INVALID_ENTRY, 6903 * the targer_id would get set when we issue the login 6904 */ 6905 cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, ha->host, 6906 cmds_max, sizeof(struct ddb_entry), 6907 sizeof(struct ql4_task_data), 6908 initial_cmdsn, INVALID_ENTRY); 6909 if (!cls_sess) { 6910 ret = QLA_ERROR; 6911 goto exit_setup; 6912 } 6913 6914 /* 6915 * so calling module_put function to decrement the 6916 * reference count. 6917 **/ 6918 module_put(qla4xxx_iscsi_transport.owner); 6919 sess = cls_sess->dd_data; 6920 ddb_entry = sess->dd_data; 6921 ddb_entry->sess = cls_sess; 6922 6923 cls_sess->recovery_tmo = ql4xsess_recovery_tmo; 6924 memcpy(&ddb_entry->fw_ddb_entry, fw_ddb_entry, 6925 sizeof(struct dev_db_entry)); 6926 6927 qla4xxx_setup_flash_ddb_entry(ha, ddb_entry, idx); 6928 6929 cls_conn = iscsi_conn_setup(cls_sess, sizeof(struct qla_conn), conn_id); 6930 6931 if (!cls_conn) { 6932 ret = QLA_ERROR; 6933 goto exit_setup; 6934 } 6935 6936 ddb_entry->conn = cls_conn; 6937 6938 /* Setup ep, for displaying attributes in sysfs */ 6939 ep = qla4xxx_get_ep_fwdb(ha, fw_ddb_entry); 6940 if (ep) { 6941 ep->conn = cls_conn; 6942 cls_conn->ep = ep; 6943 } else { 6944 DEBUG2(ql4_printk(KERN_ERR, ha, "Unable to get ep\n")); 6945 ret = QLA_ERROR; 6946 goto exit_setup; 6947 } 6948 6949 /* Update sess/conn params */ 6950 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); 6951 qla4xxx_update_sess_disc_idx(ha, ddb_entry, fw_ddb_entry); 6952 6953 if (is_reset == RESET_ADAPTER) { 6954 iscsi_block_session(cls_sess); 6955 /* Use the relogin path to discover new devices 6956 * by short-circuiting the logic of setting 6957 * timer to relogin - instead set the flags 6958 * to initiate login right away. 6959 */ 6960 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); 6961 set_bit(DF_RELOGIN, &ddb_entry->flags); 6962 } 6963 6964exit_setup: 6965 return ret; 6966} 6967 6968static void qla4xxx_update_fw_ddb_link(struct scsi_qla_host *ha, 6969 struct list_head *list_ddb, 6970 struct dev_db_entry *fw_ddb_entry) 6971{ 6972 struct qla_ddb_index *ddb_idx, *ddb_idx_tmp; 6973 uint16_t ddb_link; 6974 6975 ddb_link = le16_to_cpu(fw_ddb_entry->ddb_link); 6976 6977 list_for_each_entry_safe(ddb_idx, ddb_idx_tmp, list_ddb, list) { 6978 if (ddb_idx->fw_ddb_idx == ddb_link) { 6979 DEBUG2(ql4_printk(KERN_INFO, ha, 6980 "Updating NT parent idx from [%d] to [%d]\n", 6981 ddb_link, ddb_idx->flash_ddb_idx)); 6982 fw_ddb_entry->ddb_link = 6983 cpu_to_le16(ddb_idx->flash_ddb_idx); 6984 return; 6985 } 6986 } 6987} 6988 6989static void qla4xxx_build_nt_list(struct scsi_qla_host *ha, 6990 struct list_head *list_nt, 6991 struct list_head *list_st, 6992 int is_reset) 6993{ 6994 struct dev_db_entry *fw_ddb_entry; 6995 struct ddb_entry *ddb_entry = NULL; 6996 dma_addr_t fw_ddb_dma; 6997 int max_ddbs; 6998 int fw_idx_size; 6999 int ret; 7000 uint32_t idx = 0, next_idx = 0; 7001 uint32_t state = 0, conn_err = 0; 7002 uint32_t ddb_idx = -1; 7003 uint16_t conn_id = 0; 7004 uint16_t ddb_link = -1; 7005 struct qla_ddb_index *nt_ddb_idx; 7006 7007 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, 7008 &fw_ddb_dma); 7009 if (fw_ddb_entry == NULL) { 7010 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); 7011 goto exit_nt_list; 7012 } 7013 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : 7014 MAX_DEV_DB_ENTRIES; 7015 fw_idx_size = sizeof(struct qla_ddb_index); 7016 7017 for (idx = 0; idx < max_ddbs; idx = next_idx) { 7018 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, 7019 NULL, &next_idx, &state, 7020 &conn_err, NULL, &conn_id); 7021 if (ret == QLA_ERROR) 7022 break; 7023 7024 if (qla4xxx_verify_boot_idx(ha, idx) != QLA_SUCCESS) 7025 goto continue_next_nt; 7026 7027 /* Check if NT, then add to list it */ 7028 if (strlen((char *) fw_ddb_entry->iscsi_name) == 0) 7029 goto continue_next_nt; 7030 7031 ddb_link = le16_to_cpu(fw_ddb_entry->ddb_link); 7032 if (ddb_link < max_ddbs) 7033 qla4xxx_update_fw_ddb_link(ha, list_st, fw_ddb_entry); 7034 7035 if (!(state == DDB_DS_NO_CONNECTION_ACTIVE || 7036 state == DDB_DS_SESSION_FAILED) && 7037 (is_reset == INIT_ADAPTER)) 7038 goto continue_next_nt; 7039 7040 DEBUG2(ql4_printk(KERN_INFO, ha, 7041 "Adding DDB to session = 0x%x\n", idx)); 7042 7043 if (is_reset == INIT_ADAPTER) { 7044 nt_ddb_idx = vmalloc(fw_idx_size); 7045 if (!nt_ddb_idx) 7046 break; 7047 7048 nt_ddb_idx->fw_ddb_idx = idx; 7049 7050 /* Copy original isid as it may get updated in function 7051 * qla4xxx_update_isid(). We need original isid in 7052 * function qla4xxx_compare_tuple_ddb to find duplicate 7053 * target */ 7054 memcpy(&nt_ddb_idx->flash_isid[0], 7055 &fw_ddb_entry->isid[0], 7056 sizeof(nt_ddb_idx->flash_isid)); 7057 7058 ret = qla4xxx_is_flash_ddb_exists(ha, list_nt, 7059 fw_ddb_entry); 7060 if (ret == QLA_SUCCESS) { 7061 /* free nt_ddb_idx and do not add to list_nt */ 7062 vfree(nt_ddb_idx); 7063 goto continue_next_nt; 7064 } 7065 7066 /* Copy updated isid */ 7067 memcpy(&nt_ddb_idx->fw_ddb, fw_ddb_entry, 7068 sizeof(struct dev_db_entry)); 7069 7070 list_add_tail(&nt_ddb_idx->list, list_nt); 7071 } else if (is_reset == RESET_ADAPTER) { 7072 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, 7073 &ddb_idx); 7074 if (ret == QLA_SUCCESS) { 7075 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, 7076 ddb_idx); 7077 if (ddb_entry != NULL) 7078 qla4xxx_update_sess_disc_idx(ha, 7079 ddb_entry, 7080 fw_ddb_entry); 7081 goto continue_next_nt; 7082 } 7083 } 7084 7085 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, is_reset, idx); 7086 if (ret == QLA_ERROR) 7087 goto exit_nt_list; 7088 7089continue_next_nt: 7090 if (next_idx == 0) 7091 break; 7092 } 7093 7094exit_nt_list: 7095 if (fw_ddb_entry) 7096 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); 7097} 7098 7099static void qla4xxx_build_new_nt_list(struct scsi_qla_host *ha, 7100 struct list_head *list_nt, 7101 uint16_t target_id) 7102{ 7103 struct dev_db_entry *fw_ddb_entry; 7104 dma_addr_t fw_ddb_dma; 7105 int max_ddbs; 7106 int fw_idx_size; 7107 int ret; 7108 uint32_t idx = 0, next_idx = 0; 7109 uint32_t state = 0, conn_err = 0; 7110 uint16_t conn_id = 0; 7111 struct qla_ddb_index *nt_ddb_idx; 7112 7113 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, 7114 &fw_ddb_dma); 7115 if (fw_ddb_entry == NULL) { 7116 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); 7117 goto exit_new_nt_list; 7118 } 7119 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : 7120 MAX_DEV_DB_ENTRIES; 7121 fw_idx_size = sizeof(struct qla_ddb_index); 7122 7123 for (idx = 0; idx < max_ddbs; idx = next_idx) { 7124 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, 7125 NULL, &next_idx, &state, 7126 &conn_err, NULL, &conn_id); 7127 if (ret == QLA_ERROR) 7128 break; 7129 7130 /* Check if NT, then add it to list */ 7131 if (strlen((char *)fw_ddb_entry->iscsi_name) == 0) 7132 goto continue_next_new_nt; 7133 7134 if (!(state == DDB_DS_NO_CONNECTION_ACTIVE)) 7135 goto continue_next_new_nt; 7136 7137 DEBUG2(ql4_printk(KERN_INFO, ha, 7138 "Adding DDB to session = 0x%x\n", idx)); 7139 7140 nt_ddb_idx = vmalloc(fw_idx_size); 7141 if (!nt_ddb_idx) 7142 break; 7143 7144 nt_ddb_idx->fw_ddb_idx = idx; 7145 7146 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); 7147 if (ret == QLA_SUCCESS) { 7148 /* free nt_ddb_idx and do not add to list_nt */ 7149 vfree(nt_ddb_idx); 7150 goto continue_next_new_nt; 7151 } 7152 7153 if (target_id < max_ddbs) 7154 fw_ddb_entry->ddb_link = cpu_to_le16(target_id); 7155 7156 list_add_tail(&nt_ddb_idx->list, list_nt); 7157 7158 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, 7159 idx); 7160 if (ret == QLA_ERROR) 7161 goto exit_new_nt_list; 7162 7163continue_next_new_nt: 7164 if (next_idx == 0) 7165 break; 7166 } 7167 7168exit_new_nt_list: 7169 if (fw_ddb_entry) 7170 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); 7171} 7172 7173/** 7174 * qla4xxx_sysfs_ddb_is_non_persistent - check for non-persistence of ddb entry 7175 * @dev: dev associated with the sysfs entry 7176 * @data: pointer to flashnode session object 7177 * 7178 * Returns: 7179 * 1: if flashnode entry is non-persistent 7180 * 0: if flashnode entry is persistent 7181 **/ 7182static int qla4xxx_sysfs_ddb_is_non_persistent(struct device *dev, void *data) 7183{ 7184 struct iscsi_bus_flash_session *fnode_sess; 7185 7186 if (!iscsi_flashnode_bus_match(dev, NULL)) 7187 return 0; 7188 7189 fnode_sess = iscsi_dev_to_flash_session(dev); 7190 7191 return (fnode_sess->flash_state == DEV_DB_NON_PERSISTENT); 7192} 7193 7194/** 7195 * qla4xxx_sysfs_ddb_tgt_create - Create sysfs entry for target 7196 * @ha: pointer to host 7197 * @fw_ddb_entry: flash ddb data 7198 * @idx: target index 7199 * @user: if set then this call is made from userland else from kernel 7200 * 7201 * Returns: 7202 * On sucess: QLA_SUCCESS 7203 * On failure: QLA_ERROR 7204 * 7205 * This create separate sysfs entries for session and connection attributes of 7206 * the given fw ddb entry. 7207 * If this is invoked as a result of a userspace call then the entry is marked 7208 * as nonpersistent using flash_state field. 7209 **/ 7210static int qla4xxx_sysfs_ddb_tgt_create(struct scsi_qla_host *ha, 7211 struct dev_db_entry *fw_ddb_entry, 7212 uint16_t *idx, int user) 7213{ 7214 struct iscsi_bus_flash_session *fnode_sess = NULL; 7215 struct iscsi_bus_flash_conn *fnode_conn = NULL; 7216 int rc = QLA_ERROR; 7217 7218 fnode_sess = iscsi_create_flashnode_sess(ha->host, *idx, 7219 &qla4xxx_iscsi_transport, 0); 7220 if (!fnode_sess) { 7221 ql4_printk(KERN_ERR, ha, 7222 "%s: Unable to create session sysfs entry for flashnode %d of host%lu\n", 7223 __func__, *idx, ha->host_no); 7224 goto exit_tgt_create; 7225 } 7226 7227 fnode_conn = iscsi_create_flashnode_conn(ha->host, fnode_sess, 7228 &qla4xxx_iscsi_transport, 0); 7229 if (!fnode_conn) { 7230 ql4_printk(KERN_ERR, ha, 7231 "%s: Unable to create conn sysfs entry for flashnode %d of host%lu\n", 7232 __func__, *idx, ha->host_no); 7233 goto free_sess; 7234 } 7235 7236 if (user) { 7237 fnode_sess->flash_state = DEV_DB_NON_PERSISTENT; 7238 } else { 7239 fnode_sess->flash_state = DEV_DB_PERSISTENT; 7240 7241 if (*idx == ha->pri_ddb_idx || *idx == ha->sec_ddb_idx) 7242 fnode_sess->is_boot_target = 1; 7243 else 7244 fnode_sess->is_boot_target = 0; 7245 } 7246 7247 rc = qla4xxx_copy_from_fwddb_param(fnode_sess, fnode_conn, 7248 fw_ddb_entry); 7249 if (rc) 7250 goto free_sess; 7251 7252 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", 7253 __func__, fnode_sess->dev.kobj.name); 7254 7255 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", 7256 __func__, fnode_conn->dev.kobj.name); 7257 7258 return QLA_SUCCESS; 7259 7260free_sess: 7261 iscsi_destroy_flashnode_sess(fnode_sess); 7262 7263exit_tgt_create: 7264 return QLA_ERROR; 7265} 7266 7267/** 7268 * qla4xxx_sysfs_ddb_add - Add new ddb entry in flash 7269 * @shost: pointer to host 7270 * @buf: type of ddb entry (ipv4/ipv6) 7271 * @len: length of buf 7272 * 7273 * This creates new ddb entry in the flash by finding first free index and 7274 * storing default ddb there. And then create sysfs entry for the new ddb entry. 7275 **/ 7276static int qla4xxx_sysfs_ddb_add(struct Scsi_Host *shost, const char *buf, 7277 int len) 7278{ 7279 struct scsi_qla_host *ha = to_qla_host(shost); 7280 struct dev_db_entry *fw_ddb_entry = NULL; 7281 dma_addr_t fw_ddb_entry_dma; 7282 struct device *dev; 7283 uint16_t idx = 0; 7284 uint16_t max_ddbs = 0; 7285 uint32_t options = 0; 7286 uint32_t rval = QLA_ERROR; 7287 7288 if (strncasecmp(PORTAL_TYPE_IPV4, buf, 4) && 7289 strncasecmp(PORTAL_TYPE_IPV6, buf, 4)) { 7290 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Invalid portal type\n", 7291 __func__)); 7292 goto exit_ddb_add; 7293 } 7294 7295 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : 7296 MAX_DEV_DB_ENTRIES; 7297 7298 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 7299 &fw_ddb_entry_dma, GFP_KERNEL); 7300 if (!fw_ddb_entry) { 7301 DEBUG2(ql4_printk(KERN_ERR, ha, 7302 "%s: Unable to allocate dma buffer\n", 7303 __func__)); 7304 goto exit_ddb_add; 7305 } 7306 7307 dev = iscsi_find_flashnode_sess(ha->host, NULL, 7308 qla4xxx_sysfs_ddb_is_non_persistent); 7309 if (dev) { 7310 ql4_printk(KERN_ERR, ha, 7311 "%s: A non-persistent entry %s found\n", 7312 __func__, dev->kobj.name); 7313 put_device(dev); 7314 goto exit_ddb_add; 7315 } 7316 7317 /* Index 0 and 1 are reserved for boot target entries */ 7318 for (idx = 2; idx < max_ddbs; idx++) { 7319 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, 7320 fw_ddb_entry_dma, idx)) 7321 break; 7322 } 7323 7324 if (idx == max_ddbs) 7325 goto exit_ddb_add; 7326 7327 if (!strncasecmp("ipv6", buf, 4)) 7328 options |= IPV6_DEFAULT_DDB_ENTRY; 7329 7330 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); 7331 if (rval == QLA_ERROR) 7332 goto exit_ddb_add; 7333 7334 rval = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 1); 7335 7336exit_ddb_add: 7337 if (fw_ddb_entry) 7338 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 7339 fw_ddb_entry, fw_ddb_entry_dma); 7340 if (rval == QLA_SUCCESS) 7341 return idx; 7342 else 7343 return -EIO; 7344} 7345 7346/** 7347 * qla4xxx_sysfs_ddb_apply - write the target ddb contents to Flash 7348 * @fnode_sess: pointer to session attrs of flash ddb entry 7349 * @fnode_conn: pointer to connection attrs of flash ddb entry 7350 * 7351 * This writes the contents of target ddb buffer to Flash with a valid cookie 7352 * value in order to make the ddb entry persistent. 7353 **/ 7354static int qla4xxx_sysfs_ddb_apply(struct iscsi_bus_flash_session *fnode_sess, 7355 struct iscsi_bus_flash_conn *fnode_conn) 7356{ 7357 struct Scsi_Host *shost = iscsi_flash_session_to_shost(fnode_sess); 7358 struct scsi_qla_host *ha = to_qla_host(shost); 7359 uint32_t dev_db_start_offset = FLASH_OFFSET_DB_INFO; 7360 struct dev_db_entry *fw_ddb_entry = NULL; 7361 dma_addr_t fw_ddb_entry_dma; 7362 uint32_t options = 0; 7363 int rval = 0; 7364 7365 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 7366 &fw_ddb_entry_dma, GFP_KERNEL); 7367 if (!fw_ddb_entry) { 7368 DEBUG2(ql4_printk(KERN_ERR, ha, 7369 "%s: Unable to allocate dma buffer\n", 7370 __func__)); 7371 rval = -ENOMEM; 7372 goto exit_ddb_apply; 7373 } 7374 7375 if (!strncasecmp(fnode_sess->portal_type, PORTAL_TYPE_IPV6, 4)) 7376 options |= IPV6_DEFAULT_DDB_ENTRY; 7377 7378 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); 7379 if (rval == QLA_ERROR) 7380 goto exit_ddb_apply; 7381 7382 dev_db_start_offset += (fnode_sess->target_id * 7383 sizeof(*fw_ddb_entry)); 7384 7385 qla4xxx_copy_to_fwddb_param(fnode_sess, fnode_conn, fw_ddb_entry); 7386 fw_ddb_entry->cookie = DDB_VALID_COOKIE; 7387 7388 rval = qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, 7389 sizeof(*fw_ddb_entry), FLASH_OPT_RMW_COMMIT); 7390 7391 if (rval == QLA_SUCCESS) { 7392 fnode_sess->flash_state = DEV_DB_PERSISTENT; 7393 ql4_printk(KERN_INFO, ha, 7394 "%s: flash node %u of host %lu written to flash\n", 7395 __func__, fnode_sess->target_id, ha->host_no); 7396 } else { 7397 rval = -EIO; 7398 ql4_printk(KERN_ERR, ha, 7399 "%s: Error while writing flash node %u of host %lu to flash\n", 7400 __func__, fnode_sess->target_id, ha->host_no); 7401 } 7402 7403exit_ddb_apply: 7404 if (fw_ddb_entry) 7405 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 7406 fw_ddb_entry, fw_ddb_entry_dma); 7407 return rval; 7408} 7409 7410static ssize_t qla4xxx_sysfs_ddb_conn_open(struct scsi_qla_host *ha, 7411 struct dev_db_entry *fw_ddb_entry, 7412 uint16_t idx) 7413{ 7414 struct dev_db_entry *ddb_entry = NULL; 7415 dma_addr_t ddb_entry_dma; 7416 unsigned long wtime; 7417 uint32_t mbx_sts = 0; 7418 uint32_t state = 0, conn_err = 0; 7419 uint16_t tmo = 0; 7420 int ret = 0; 7421 7422 ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*ddb_entry), 7423 &ddb_entry_dma, GFP_KERNEL); 7424 if (!ddb_entry) { 7425 DEBUG2(ql4_printk(KERN_ERR, ha, 7426 "%s: Unable to allocate dma buffer\n", 7427 __func__)); 7428 return QLA_ERROR; 7429 } 7430 7431 memcpy(ddb_entry, fw_ddb_entry, sizeof(*ddb_entry)); 7432 7433 ret = qla4xxx_set_ddb_entry(ha, idx, ddb_entry_dma, &mbx_sts); 7434 if (ret != QLA_SUCCESS) { 7435 DEBUG2(ql4_printk(KERN_ERR, ha, 7436 "%s: Unable to set ddb entry for index %d\n", 7437 __func__, idx)); 7438 goto exit_ddb_conn_open; 7439 } 7440 7441 qla4xxx_conn_open(ha, idx); 7442 7443 /* To ensure that sendtargets is done, wait for at least 12 secs */ 7444 tmo = ((ha->def_timeout > LOGIN_TOV) && 7445 (ha->def_timeout < LOGIN_TOV * 10) ? 7446 ha->def_timeout : LOGIN_TOV); 7447 7448 DEBUG2(ql4_printk(KERN_INFO, ha, 7449 "Default time to wait for login to ddb %d\n", tmo)); 7450 7451 wtime = jiffies + (HZ * tmo); 7452 do { 7453 ret = qla4xxx_get_fwddb_entry(ha, idx, NULL, 0, NULL, 7454 NULL, &state, &conn_err, NULL, 7455 NULL); 7456 if (ret == QLA_ERROR) 7457 continue; 7458 7459 if (state == DDB_DS_NO_CONNECTION_ACTIVE || 7460 state == DDB_DS_SESSION_FAILED) 7461 break; 7462 7463 schedule_timeout_uninterruptible(HZ / 10); 7464 } while (time_after(wtime, jiffies)); 7465 7466exit_ddb_conn_open: 7467 if (ddb_entry) 7468 dma_free_coherent(&ha->pdev->dev, sizeof(*ddb_entry), 7469 ddb_entry, ddb_entry_dma); 7470 return ret; 7471} 7472 7473static int qla4xxx_ddb_login_st(struct scsi_qla_host *ha, 7474 struct dev_db_entry *fw_ddb_entry, 7475 uint16_t target_id) 7476{ 7477 struct qla_ddb_index *ddb_idx, *ddb_idx_tmp; 7478 struct list_head list_nt; 7479 uint16_t ddb_index; 7480 int ret = 0; 7481 7482 if (test_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags)) { 7483 ql4_printk(KERN_WARNING, ha, 7484 "%s: A discovery already in progress!\n", __func__); 7485 return QLA_ERROR; 7486 } 7487 7488 INIT_LIST_HEAD(&list_nt); 7489 7490 set_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); 7491 7492 ret = qla4xxx_get_ddb_index(ha, &ddb_index); 7493 if (ret == QLA_ERROR) 7494 goto exit_login_st_clr_bit; 7495 7496 ret = qla4xxx_sysfs_ddb_conn_open(ha, fw_ddb_entry, ddb_index); 7497 if (ret == QLA_ERROR) 7498 goto exit_login_st; 7499 7500 qla4xxx_build_new_nt_list(ha, &list_nt, target_id); 7501 7502 list_for_each_entry_safe(ddb_idx, ddb_idx_tmp, &list_nt, list) { 7503 list_del_init(&ddb_idx->list); 7504 qla4xxx_clear_ddb_entry(ha, ddb_idx->fw_ddb_idx); 7505 vfree(ddb_idx); 7506 } 7507 7508exit_login_st: 7509 if (qla4xxx_clear_ddb_entry(ha, ddb_index) == QLA_ERROR) { 7510 ql4_printk(KERN_ERR, ha, 7511 "Unable to clear DDB index = 0x%x\n", ddb_index); 7512 } 7513 7514 clear_bit(ddb_index, ha->ddb_idx_map); 7515 7516exit_login_st_clr_bit: 7517 clear_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); 7518 return ret; 7519} 7520 7521static int qla4xxx_ddb_login_nt(struct scsi_qla_host *ha, 7522 struct dev_db_entry *fw_ddb_entry, 7523 uint16_t idx) 7524{ 7525 int ret = QLA_ERROR; 7526 7527 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); 7528 if (ret != QLA_SUCCESS) 7529 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, 7530 idx); 7531 else 7532 ret = -EPERM; 7533 7534 return ret; 7535} 7536 7537/** 7538 * qla4xxx_sysfs_ddb_login - Login to the specified target 7539 * @fnode_sess: pointer to session attrs of flash ddb entry 7540 * @fnode_conn: pointer to connection attrs of flash ddb entry 7541 * 7542 * This logs in to the specified target 7543 **/ 7544static int qla4xxx_sysfs_ddb_login(struct iscsi_bus_flash_session *fnode_sess, 7545 struct iscsi_bus_flash_conn *fnode_conn) 7546{ 7547 struct Scsi_Host *shost = iscsi_flash_session_to_shost(fnode_sess); 7548 struct scsi_qla_host *ha = to_qla_host(shost); 7549 struct dev_db_entry *fw_ddb_entry = NULL; 7550 dma_addr_t fw_ddb_entry_dma; 7551 uint32_t options = 0; 7552 int ret = 0; 7553 7554 if (fnode_sess->flash_state == DEV_DB_NON_PERSISTENT) { 7555 ql4_printk(KERN_ERR, ha, 7556 "%s: Target info is not persistent\n", __func__); 7557 ret = -EIO; 7558 goto exit_ddb_login; 7559 } 7560 7561 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 7562 &fw_ddb_entry_dma, GFP_KERNEL); 7563 if (!fw_ddb_entry) { 7564 DEBUG2(ql4_printk(KERN_ERR, ha, 7565 "%s: Unable to allocate dma buffer\n", 7566 __func__)); 7567 ret = -ENOMEM; 7568 goto exit_ddb_login; 7569 } 7570 7571 if (!strncasecmp(fnode_sess->portal_type, PORTAL_TYPE_IPV6, 4)) 7572 options |= IPV6_DEFAULT_DDB_ENTRY; 7573 7574 ret = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); 7575 if (ret == QLA_ERROR) 7576 goto exit_ddb_login; 7577 7578 qla4xxx_copy_to_fwddb_param(fnode_sess, fnode_conn, fw_ddb_entry); 7579 fw_ddb_entry->cookie = DDB_VALID_COOKIE; 7580 7581 if (strlen((char *)fw_ddb_entry->iscsi_name) == 0) 7582 ret = qla4xxx_ddb_login_st(ha, fw_ddb_entry, 7583 fnode_sess->target_id); 7584 else 7585 ret = qla4xxx_ddb_login_nt(ha, fw_ddb_entry, 7586 fnode_sess->target_id); 7587 7588 if (ret > 0) 7589 ret = -EIO; 7590 7591exit_ddb_login: 7592 if (fw_ddb_entry) 7593 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 7594 fw_ddb_entry, fw_ddb_entry_dma); 7595 return ret; 7596} 7597 7598/** 7599 * qla4xxx_sysfs_ddb_logout_sid - Logout session for the specified target 7600 * @cls_sess: pointer to session to be logged out 7601 * 7602 * This performs session log out from the specified target 7603 **/ 7604static int qla4xxx_sysfs_ddb_logout_sid(struct iscsi_cls_session *cls_sess) 7605{ 7606 struct iscsi_session *sess; 7607 struct ddb_entry *ddb_entry = NULL; 7608 struct scsi_qla_host *ha; 7609 struct dev_db_entry *fw_ddb_entry = NULL; 7610 dma_addr_t fw_ddb_entry_dma; 7611 unsigned long flags; 7612 unsigned long wtime; 7613 uint32_t ddb_state; 7614 int options; 7615 int ret = 0; 7616 7617 sess = cls_sess->dd_data; 7618 ddb_entry = sess->dd_data; 7619 ha = ddb_entry->ha; 7620 7621 if (ddb_entry->ddb_type != FLASH_DDB) { 7622 ql4_printk(KERN_ERR, ha, "%s: Not a flash node session\n", 7623 __func__); 7624 ret = -ENXIO; 7625 goto exit_ddb_logout; 7626 } 7627 7628 if (test_bit(DF_BOOT_TGT, &ddb_entry->flags)) { 7629 ql4_printk(KERN_ERR, ha, 7630 "%s: Logout from boot target entry is not permitted.\n", 7631 __func__); 7632 ret = -EPERM; 7633 goto exit_ddb_logout; 7634 } 7635 7636 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 7637 &fw_ddb_entry_dma, GFP_KERNEL); 7638 if (!fw_ddb_entry) { 7639 ql4_printk(KERN_ERR, ha, 7640 "%s: Unable to allocate dma buffer\n", __func__); 7641 ret = -ENOMEM; 7642 goto exit_ddb_logout; 7643 } 7644 7645 if (test_and_set_bit(DF_DISABLE_RELOGIN, &ddb_entry->flags)) 7646 goto ddb_logout_init; 7647 7648 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, 7649 fw_ddb_entry, fw_ddb_entry_dma, 7650 NULL, NULL, &ddb_state, NULL, 7651 NULL, NULL); 7652 if (ret == QLA_ERROR) 7653 goto ddb_logout_init; 7654 7655 if (ddb_state == DDB_DS_SESSION_ACTIVE) 7656 goto ddb_logout_init; 7657 7658 /* wait until next relogin is triggered using DF_RELOGIN and 7659 * clear DF_RELOGIN to avoid invocation of further relogin 7660 */ 7661 wtime = jiffies + (HZ * RELOGIN_TOV); 7662 do { 7663 if (test_and_clear_bit(DF_RELOGIN, &ddb_entry->flags)) 7664 goto ddb_logout_init; 7665 7666 schedule_timeout_uninterruptible(HZ); 7667 } while ((time_after(wtime, jiffies))); 7668 7669ddb_logout_init: 7670 atomic_set(&ddb_entry->retry_relogin_timer, INVALID_ENTRY); 7671 atomic_set(&ddb_entry->relogin_timer, 0); 7672 7673 options = LOGOUT_OPTION_CLOSE_SESSION; 7674 qla4xxx_session_logout_ddb(ha, ddb_entry, options); 7675 7676 memset(fw_ddb_entry, 0, sizeof(*fw_ddb_entry)); 7677 wtime = jiffies + (HZ * LOGOUT_TOV); 7678 do { 7679 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, 7680 fw_ddb_entry, fw_ddb_entry_dma, 7681 NULL, NULL, &ddb_state, NULL, 7682 NULL, NULL); 7683 if (ret == QLA_ERROR) 7684 goto ddb_logout_clr_sess; 7685 7686 if ((ddb_state == DDB_DS_NO_CONNECTION_ACTIVE) || 7687 (ddb_state == DDB_DS_SESSION_FAILED)) 7688 goto ddb_logout_clr_sess; 7689 7690 schedule_timeout_uninterruptible(HZ); 7691 } while ((time_after(wtime, jiffies))); 7692 7693ddb_logout_clr_sess: 7694 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); 7695 /* 7696 * we have decremented the reference count of the driver 7697 * when we setup the session to have the driver unload 7698 * to be seamless without actually destroying the 7699 * session 7700 **/ 7701 try_module_get(qla4xxx_iscsi_transport.owner); 7702 iscsi_destroy_endpoint(ddb_entry->conn->ep); 7703 7704 spin_lock_irqsave(&ha->hardware_lock, flags); 7705 qla4xxx_free_ddb(ha, ddb_entry); 7706 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); 7707 spin_unlock_irqrestore(&ha->hardware_lock, flags); 7708 7709 iscsi_session_teardown(ddb_entry->sess); 7710 7711 clear_bit(DF_DISABLE_RELOGIN, &ddb_entry->flags); 7712 ret = QLA_SUCCESS; 7713 7714exit_ddb_logout: 7715 if (fw_ddb_entry) 7716 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 7717 fw_ddb_entry, fw_ddb_entry_dma); 7718 return ret; 7719} 7720 7721/** 7722 * qla4xxx_sysfs_ddb_logout - Logout from the specified target 7723 * @fnode_sess: pointer to session attrs of flash ddb entry 7724 * @fnode_conn: pointer to connection attrs of flash ddb entry 7725 * 7726 * This performs log out from the specified target 7727 **/ 7728static int qla4xxx_sysfs_ddb_logout(struct iscsi_bus_flash_session *fnode_sess, 7729 struct iscsi_bus_flash_conn *fnode_conn) 7730{ 7731 struct Scsi_Host *shost = iscsi_flash_session_to_shost(fnode_sess); 7732 struct scsi_qla_host *ha = to_qla_host(shost); 7733 struct ql4_tuple_ddb *flash_tddb = NULL; 7734 struct ql4_tuple_ddb *tmp_tddb = NULL; 7735 struct dev_db_entry *fw_ddb_entry = NULL; 7736 struct ddb_entry *ddb_entry = NULL; 7737 dma_addr_t fw_ddb_dma; 7738 uint32_t next_idx = 0; 7739 uint32_t state = 0, conn_err = 0; 7740 uint16_t conn_id = 0; 7741 int idx, index; 7742 int status, ret = 0; 7743 7744 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, 7745 &fw_ddb_dma); 7746 if (fw_ddb_entry == NULL) { 7747 ql4_printk(KERN_ERR, ha, "%s:Out of memory\n", __func__); 7748 ret = -ENOMEM; 7749 goto exit_ddb_logout; 7750 } 7751 7752 flash_tddb = vzalloc(sizeof(*flash_tddb)); 7753 if (!flash_tddb) { 7754 ql4_printk(KERN_WARNING, ha, 7755 "%s:Memory Allocation failed.\n", __func__); 7756 ret = -ENOMEM; 7757 goto exit_ddb_logout; 7758 } 7759 7760 tmp_tddb = vzalloc(sizeof(*tmp_tddb)); 7761 if (!tmp_tddb) { 7762 ql4_printk(KERN_WARNING, ha, 7763 "%s:Memory Allocation failed.\n", __func__); 7764 ret = -ENOMEM; 7765 goto exit_ddb_logout; 7766 } 7767 7768 if (!fnode_sess->targetname) { 7769 ql4_printk(KERN_ERR, ha, 7770 "%s:Cannot logout from SendTarget entry\n", 7771 __func__); 7772 ret = -EPERM; 7773 goto exit_ddb_logout; 7774 } 7775 7776 if (fnode_sess->is_boot_target) { 7777 ql4_printk(KERN_ERR, ha, 7778 "%s: Logout from boot target entry is not permitted.\n", 7779 __func__); 7780 ret = -EPERM; 7781 goto exit_ddb_logout; 7782 } 7783 7784 strlcpy(flash_tddb->iscsi_name, fnode_sess->targetname, 7785 ISCSI_NAME_SIZE); 7786 7787 if (!strncmp(fnode_sess->portal_type, PORTAL_TYPE_IPV6, 4)) 7788 sprintf(flash_tddb->ip_addr, "%pI6", fnode_conn->ipaddress); 7789 else 7790 sprintf(flash_tddb->ip_addr, "%pI4", fnode_conn->ipaddress); 7791 7792 flash_tddb->tpgt = fnode_sess->tpgt; 7793 flash_tddb->port = fnode_conn->port; 7794 7795 COPY_ISID(flash_tddb->isid, fnode_sess->isid); 7796 7797 for (idx = 0; idx < MAX_DDB_ENTRIES; idx++) { 7798 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); 7799 if (ddb_entry == NULL) 7800 continue; 7801 7802 if (ddb_entry->ddb_type != FLASH_DDB) 7803 continue; 7804 7805 index = ddb_entry->sess->target_id; 7806 status = qla4xxx_get_fwddb_entry(ha, index, fw_ddb_entry, 7807 fw_ddb_dma, NULL, &next_idx, 7808 &state, &conn_err, NULL, 7809 &conn_id); 7810 if (status == QLA_ERROR) { 7811 ret = -ENOMEM; 7812 break; 7813 } 7814 7815 qla4xxx_convert_param_ddb(fw_ddb_entry, tmp_tddb, NULL); 7816 7817 status = qla4xxx_compare_tuple_ddb(ha, flash_tddb, tmp_tddb, 7818 true); 7819 if (status == QLA_SUCCESS) { 7820 ret = qla4xxx_sysfs_ddb_logout_sid(ddb_entry->sess); 7821 break; 7822 } 7823 } 7824 7825 if (idx == MAX_DDB_ENTRIES) 7826 ret = -ESRCH; 7827 7828exit_ddb_logout: 7829 vfree(flash_tddb); 7830 vfree(tmp_tddb); 7831 if (fw_ddb_entry) 7832 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); 7833 7834 return ret; 7835} 7836 7837static int 7838qla4xxx_sysfs_ddb_get_param(struct iscsi_bus_flash_session *fnode_sess, 7839 int param, char *buf) 7840{ 7841 struct Scsi_Host *shost = iscsi_flash_session_to_shost(fnode_sess); 7842 struct scsi_qla_host *ha = to_qla_host(shost); 7843 struct iscsi_bus_flash_conn *fnode_conn; 7844 struct ql4_chap_table chap_tbl; 7845 struct device *dev; 7846 int parent_type; 7847 int rc = 0; 7848 7849 dev = iscsi_find_flashnode_conn(fnode_sess); 7850 if (!dev) 7851 return -EIO; 7852 7853 fnode_conn = iscsi_dev_to_flash_conn(dev); 7854 7855 switch (param) { 7856 case ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6: 7857 rc = sprintf(buf, "%u\n", fnode_conn->is_fw_assigned_ipv6); 7858 break; 7859 case ISCSI_FLASHNODE_PORTAL_TYPE: 7860 rc = sprintf(buf, "%s\n", fnode_sess->portal_type); 7861 break; 7862 case ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE: 7863 rc = sprintf(buf, "%u\n", fnode_sess->auto_snd_tgt_disable); 7864 break; 7865 case ISCSI_FLASHNODE_DISCOVERY_SESS: 7866 rc = sprintf(buf, "%u\n", fnode_sess->discovery_sess); 7867 break; 7868 case ISCSI_FLASHNODE_ENTRY_EN: 7869 rc = sprintf(buf, "%u\n", fnode_sess->entry_state); 7870 break; 7871 case ISCSI_FLASHNODE_HDR_DGST_EN: 7872 rc = sprintf(buf, "%u\n", fnode_conn->hdrdgst_en); 7873 break; 7874 case ISCSI_FLASHNODE_DATA_DGST_EN: 7875 rc = sprintf(buf, "%u\n", fnode_conn->datadgst_en); 7876 break; 7877 case ISCSI_FLASHNODE_IMM_DATA_EN: 7878 rc = sprintf(buf, "%u\n", fnode_sess->imm_data_en); 7879 break; 7880 case ISCSI_FLASHNODE_INITIAL_R2T_EN: 7881 rc = sprintf(buf, "%u\n", fnode_sess->initial_r2t_en); 7882 break; 7883 case ISCSI_FLASHNODE_DATASEQ_INORDER: 7884 rc = sprintf(buf, "%u\n", fnode_sess->dataseq_inorder_en); 7885 break; 7886 case ISCSI_FLASHNODE_PDU_INORDER: 7887 rc = sprintf(buf, "%u\n", fnode_sess->pdu_inorder_en); 7888 break; 7889 case ISCSI_FLASHNODE_CHAP_AUTH_EN: 7890 rc = sprintf(buf, "%u\n", fnode_sess->chap_auth_en); 7891 break; 7892 case ISCSI_FLASHNODE_SNACK_REQ_EN: 7893 rc = sprintf(buf, "%u\n", fnode_conn->snack_req_en); 7894 break; 7895 case ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN: 7896 rc = sprintf(buf, "%u\n", fnode_sess->discovery_logout_en); 7897 break; 7898 case ISCSI_FLASHNODE_BIDI_CHAP_EN: 7899 rc = sprintf(buf, "%u\n", fnode_sess->bidi_chap_en); 7900 break; 7901 case ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL: 7902 rc = sprintf(buf, "%u\n", fnode_sess->discovery_auth_optional); 7903 break; 7904 case ISCSI_FLASHNODE_ERL: 7905 rc = sprintf(buf, "%u\n", fnode_sess->erl); 7906 break; 7907 case ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT: 7908 rc = sprintf(buf, "%u\n", fnode_conn->tcp_timestamp_stat); 7909 break; 7910 case ISCSI_FLASHNODE_TCP_NAGLE_DISABLE: 7911 rc = sprintf(buf, "%u\n", fnode_conn->tcp_nagle_disable); 7912 break; 7913 case ISCSI_FLASHNODE_TCP_WSF_DISABLE: 7914 rc = sprintf(buf, "%u\n", fnode_conn->tcp_wsf_disable); 7915 break; 7916 case ISCSI_FLASHNODE_TCP_TIMER_SCALE: 7917 rc = sprintf(buf, "%u\n", fnode_conn->tcp_timer_scale); 7918 break; 7919 case ISCSI_FLASHNODE_TCP_TIMESTAMP_EN: 7920 rc = sprintf(buf, "%u\n", fnode_conn->tcp_timestamp_en); 7921 break; 7922 case ISCSI_FLASHNODE_IP_FRAG_DISABLE: 7923 rc = sprintf(buf, "%u\n", fnode_conn->fragment_disable); 7924 break; 7925 case ISCSI_FLASHNODE_MAX_RECV_DLENGTH: 7926 rc = sprintf(buf, "%u\n", fnode_conn->max_recv_dlength); 7927 break; 7928 case ISCSI_FLASHNODE_MAX_XMIT_DLENGTH: 7929 rc = sprintf(buf, "%u\n", fnode_conn->max_xmit_dlength); 7930 break; 7931 case ISCSI_FLASHNODE_FIRST_BURST: 7932 rc = sprintf(buf, "%u\n", fnode_sess->first_burst); 7933 break; 7934 case ISCSI_FLASHNODE_DEF_TIME2WAIT: 7935 rc = sprintf(buf, "%u\n", fnode_sess->time2wait); 7936 break; 7937 case ISCSI_FLASHNODE_DEF_TIME2RETAIN: 7938 rc = sprintf(buf, "%u\n", fnode_sess->time2retain); 7939 break; 7940 case ISCSI_FLASHNODE_MAX_R2T: 7941 rc = sprintf(buf, "%u\n", fnode_sess->max_r2t); 7942 break; 7943 case ISCSI_FLASHNODE_KEEPALIVE_TMO: 7944 rc = sprintf(buf, "%u\n", fnode_conn->keepalive_timeout); 7945 break; 7946 case ISCSI_FLASHNODE_ISID: 7947 rc = sprintf(buf, "%pm\n", fnode_sess->isid); 7948 break; 7949 case ISCSI_FLASHNODE_TSID: 7950 rc = sprintf(buf, "%u\n", fnode_sess->tsid); 7951 break; 7952 case ISCSI_FLASHNODE_PORT: 7953 rc = sprintf(buf, "%d\n", fnode_conn->port); 7954 break; 7955 case ISCSI_FLASHNODE_MAX_BURST: 7956 rc = sprintf(buf, "%u\n", fnode_sess->max_burst); 7957 break; 7958 case ISCSI_FLASHNODE_DEF_TASKMGMT_TMO: 7959 rc = sprintf(buf, "%u\n", 7960 fnode_sess->default_taskmgmt_timeout); 7961 break; 7962 case ISCSI_FLASHNODE_IPADDR: 7963 if (!strncmp(fnode_sess->portal_type, PORTAL_TYPE_IPV6, 4)) 7964 rc = sprintf(buf, "%pI6\n", fnode_conn->ipaddress); 7965 else 7966 rc = sprintf(buf, "%pI4\n", fnode_conn->ipaddress); 7967 break; 7968 case ISCSI_FLASHNODE_ALIAS: 7969 if (fnode_sess->targetalias) 7970 rc = sprintf(buf, "%s\n", fnode_sess->targetalias); 7971 else 7972 rc = sprintf(buf, "\n"); 7973 break; 7974 case ISCSI_FLASHNODE_REDIRECT_IPADDR: 7975 if (!strncmp(fnode_sess->portal_type, PORTAL_TYPE_IPV6, 4)) 7976 rc = sprintf(buf, "%pI6\n", 7977 fnode_conn->redirect_ipaddr); 7978 else 7979 rc = sprintf(buf, "%pI4\n", 7980 fnode_conn->redirect_ipaddr); 7981 break; 7982 case ISCSI_FLASHNODE_MAX_SEGMENT_SIZE: 7983 rc = sprintf(buf, "%u\n", fnode_conn->max_segment_size); 7984 break; 7985 case ISCSI_FLASHNODE_LOCAL_PORT: 7986 rc = sprintf(buf, "%u\n", fnode_conn->local_port); 7987 break; 7988 case ISCSI_FLASHNODE_IPV4_TOS: 7989 rc = sprintf(buf, "%u\n", fnode_conn->ipv4_tos); 7990 break; 7991 case ISCSI_FLASHNODE_IPV6_TC: 7992 if (!strncmp(fnode_sess->portal_type, PORTAL_TYPE_IPV6, 4)) 7993 rc = sprintf(buf, "%u\n", 7994 fnode_conn->ipv6_traffic_class); 7995 else 7996 rc = sprintf(buf, "\n"); 7997 break; 7998 case ISCSI_FLASHNODE_IPV6_FLOW_LABEL: 7999 rc = sprintf(buf, "%u\n", fnode_conn->ipv6_flow_label); 8000 break; 8001 case ISCSI_FLASHNODE_LINK_LOCAL_IPV6: 8002 if (!strncmp(fnode_sess->portal_type, PORTAL_TYPE_IPV6, 4)) 8003 rc = sprintf(buf, "%pI6\n", 8004 fnode_conn->link_local_ipv6_addr); 8005 else 8006 rc = sprintf(buf, "\n"); 8007 break; 8008 case ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX: 8009 rc = sprintf(buf, "%u\n", fnode_sess->discovery_parent_idx); 8010 break; 8011 case ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE: 8012 if (fnode_sess->discovery_parent_type == DDB_ISNS) 8013 parent_type = ISCSI_DISC_PARENT_ISNS; 8014 else if (fnode_sess->discovery_parent_type == DDB_NO_LINK) 8015 parent_type = ISCSI_DISC_PARENT_UNKNOWN; 8016 else if (fnode_sess->discovery_parent_type < MAX_DDB_ENTRIES) 8017 parent_type = ISCSI_DISC_PARENT_SENDTGT; 8018 else 8019 parent_type = ISCSI_DISC_PARENT_UNKNOWN; 8020 8021 rc = sprintf(buf, "%s\n", 8022 iscsi_get_discovery_parent_name(parent_type)); 8023 break; 8024 case ISCSI_FLASHNODE_NAME: 8025 if (fnode_sess->targetname) 8026 rc = sprintf(buf, "%s\n", fnode_sess->targetname); 8027 else 8028 rc = sprintf(buf, "\n"); 8029 break; 8030 case ISCSI_FLASHNODE_TPGT: 8031 rc = sprintf(buf, "%u\n", fnode_sess->tpgt); 8032 break; 8033 case ISCSI_FLASHNODE_TCP_XMIT_WSF: 8034 rc = sprintf(buf, "%u\n", fnode_conn->tcp_xmit_wsf); 8035 break; 8036 case ISCSI_FLASHNODE_TCP_RECV_WSF: 8037 rc = sprintf(buf, "%u\n", fnode_conn->tcp_recv_wsf); 8038 break; 8039 case ISCSI_FLASHNODE_CHAP_OUT_IDX: 8040 rc = sprintf(buf, "%u\n", fnode_sess->chap_out_idx); 8041 break; 8042 case ISCSI_FLASHNODE_USERNAME: 8043 if (fnode_sess->chap_auth_en) { 8044 qla4xxx_get_uni_chap_at_index(ha, 8045 chap_tbl.name, 8046 chap_tbl.secret, 8047 fnode_sess->chap_out_idx); 8048 rc = sprintf(buf, "%s\n", chap_tbl.name); 8049 } else { 8050 rc = sprintf(buf, "\n"); 8051 } 8052 break; 8053 case ISCSI_FLASHNODE_PASSWORD: 8054 if (fnode_sess->chap_auth_en) { 8055 qla4xxx_get_uni_chap_at_index(ha, 8056 chap_tbl.name, 8057 chap_tbl.secret, 8058 fnode_sess->chap_out_idx); 8059 rc = sprintf(buf, "%s\n", chap_tbl.secret); 8060 } else { 8061 rc = sprintf(buf, "\n"); 8062 } 8063 break; 8064 case ISCSI_FLASHNODE_STATSN: 8065 rc = sprintf(buf, "%u\n", fnode_conn->statsn); 8066 break; 8067 case ISCSI_FLASHNODE_EXP_STATSN: 8068 rc = sprintf(buf, "%u\n", fnode_conn->exp_statsn); 8069 break; 8070 case ISCSI_FLASHNODE_IS_BOOT_TGT: 8071 rc = sprintf(buf, "%u\n", fnode_sess->is_boot_target); 8072 break; 8073 default: 8074 rc = -ENOSYS; 8075 break; 8076 } 8077 8078 put_device(dev); 8079 return rc; 8080} 8081 8082/** 8083 * qla4xxx_sysfs_ddb_set_param - Set parameter for firmware DDB entry 8084 * @fnode_sess: pointer to session attrs of flash ddb entry 8085 * @fnode_conn: pointer to connection attrs of flash ddb entry 8086 * @data: Parameters and their values to update 8087 * @len: len of data 8088 * 8089 * This sets the parameter of flash ddb entry and writes them to flash 8090 **/ 8091static int 8092qla4xxx_sysfs_ddb_set_param(struct iscsi_bus_flash_session *fnode_sess, 8093 struct iscsi_bus_flash_conn *fnode_conn, 8094 void *data, int len) 8095{ 8096 struct Scsi_Host *shost = iscsi_flash_session_to_shost(fnode_sess); 8097 struct scsi_qla_host *ha = to_qla_host(shost); 8098 struct iscsi_flashnode_param_info *fnode_param; 8099 struct ql4_chap_table chap_tbl; 8100 struct nlattr *attr; 8101 uint16_t chap_out_idx = INVALID_ENTRY; 8102 int rc = QLA_ERROR; 8103 uint32_t rem = len; 8104 8105 memset((void *)&chap_tbl, 0, sizeof(chap_tbl)); 8106 nla_for_each_attr(attr, data, len, rem) { 8107 fnode_param = nla_data(attr); 8108 8109 switch (fnode_param->param) { 8110 case ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6: 8111 fnode_conn->is_fw_assigned_ipv6 = fnode_param->value[0]; 8112 break; 8113 case ISCSI_FLASHNODE_PORTAL_TYPE: 8114 memcpy(fnode_sess->portal_type, fnode_param->value, 8115 strlen(fnode_sess->portal_type)); 8116 break; 8117 case ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE: 8118 fnode_sess->auto_snd_tgt_disable = 8119 fnode_param->value[0]; 8120 break; 8121 case ISCSI_FLASHNODE_DISCOVERY_SESS: 8122 fnode_sess->discovery_sess = fnode_param->value[0]; 8123 break; 8124 case ISCSI_FLASHNODE_ENTRY_EN: 8125 fnode_sess->entry_state = fnode_param->value[0]; 8126 break; 8127 case ISCSI_FLASHNODE_HDR_DGST_EN: 8128 fnode_conn->hdrdgst_en = fnode_param->value[0]; 8129 break; 8130 case ISCSI_FLASHNODE_DATA_DGST_EN: 8131 fnode_conn->datadgst_en = fnode_param->value[0]; 8132 break; 8133 case ISCSI_FLASHNODE_IMM_DATA_EN: 8134 fnode_sess->imm_data_en = fnode_param->value[0]; 8135 break; 8136 case ISCSI_FLASHNODE_INITIAL_R2T_EN: 8137 fnode_sess->initial_r2t_en = fnode_param->value[0]; 8138 break; 8139 case ISCSI_FLASHNODE_DATASEQ_INORDER: 8140 fnode_sess->dataseq_inorder_en = fnode_param->value[0]; 8141 break; 8142 case ISCSI_FLASHNODE_PDU_INORDER: 8143 fnode_sess->pdu_inorder_en = fnode_param->value[0]; 8144 break; 8145 case ISCSI_FLASHNODE_CHAP_AUTH_EN: 8146 fnode_sess->chap_auth_en = fnode_param->value[0]; 8147 /* Invalidate chap index if chap auth is disabled */ 8148 if (!fnode_sess->chap_auth_en) 8149 fnode_sess->chap_out_idx = INVALID_ENTRY; 8150 8151 break; 8152 case ISCSI_FLASHNODE_SNACK_REQ_EN: 8153 fnode_conn->snack_req_en = fnode_param->value[0]; 8154 break; 8155 case ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN: 8156 fnode_sess->discovery_logout_en = fnode_param->value[0]; 8157 break; 8158 case ISCSI_FLASHNODE_BIDI_CHAP_EN: 8159 fnode_sess->bidi_chap_en = fnode_param->value[0]; 8160 break; 8161 case ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL: 8162 fnode_sess->discovery_auth_optional = 8163 fnode_param->value[0]; 8164 break; 8165 case ISCSI_FLASHNODE_ERL: 8166 fnode_sess->erl = fnode_param->value[0]; 8167 break; 8168 case ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT: 8169 fnode_conn->tcp_timestamp_stat = fnode_param->value[0]; 8170 break; 8171 case ISCSI_FLASHNODE_TCP_NAGLE_DISABLE: 8172 fnode_conn->tcp_nagle_disable = fnode_param->value[0]; 8173 break; 8174 case ISCSI_FLASHNODE_TCP_WSF_DISABLE: 8175 fnode_conn->tcp_wsf_disable = fnode_param->value[0]; 8176 break; 8177 case ISCSI_FLASHNODE_TCP_TIMER_SCALE: 8178 fnode_conn->tcp_timer_scale = fnode_param->value[0]; 8179 break; 8180 case ISCSI_FLASHNODE_TCP_TIMESTAMP_EN: 8181 fnode_conn->tcp_timestamp_en = fnode_param->value[0]; 8182 break; 8183 case ISCSI_FLASHNODE_IP_FRAG_DISABLE: 8184 fnode_conn->fragment_disable = fnode_param->value[0]; 8185 break; 8186 case ISCSI_FLASHNODE_MAX_RECV_DLENGTH: 8187 fnode_conn->max_recv_dlength = 8188 *(unsigned *)fnode_param->value; 8189 break; 8190 case ISCSI_FLASHNODE_MAX_XMIT_DLENGTH: 8191 fnode_conn->max_xmit_dlength = 8192 *(unsigned *)fnode_param->value; 8193 break; 8194 case ISCSI_FLASHNODE_FIRST_BURST: 8195 fnode_sess->first_burst = 8196 *(unsigned *)fnode_param->value; 8197 break; 8198 case ISCSI_FLASHNODE_DEF_TIME2WAIT: 8199 fnode_sess->time2wait = *(uint16_t *)fnode_param->value; 8200 break; 8201 case ISCSI_FLASHNODE_DEF_TIME2RETAIN: 8202 fnode_sess->time2retain = 8203 *(uint16_t *)fnode_param->value; 8204 break; 8205 case ISCSI_FLASHNODE_MAX_R2T: 8206 fnode_sess->max_r2t = 8207 *(uint16_t *)fnode_param->value; 8208 break; 8209 case ISCSI_FLASHNODE_KEEPALIVE_TMO: 8210 fnode_conn->keepalive_timeout = 8211 *(uint16_t *)fnode_param->value; 8212 break; 8213 case ISCSI_FLASHNODE_ISID: 8214 memcpy(fnode_sess->isid, fnode_param->value, 8215 sizeof(fnode_sess->isid)); 8216 break; 8217 case ISCSI_FLASHNODE_TSID: 8218 fnode_sess->tsid = *(uint16_t *)fnode_param->value; 8219 break; 8220 case ISCSI_FLASHNODE_PORT: 8221 fnode_conn->port = *(uint16_t *)fnode_param->value; 8222 break; 8223 case ISCSI_FLASHNODE_MAX_BURST: 8224 fnode_sess->max_burst = *(unsigned *)fnode_param->value; 8225 break; 8226 case ISCSI_FLASHNODE_DEF_TASKMGMT_TMO: 8227 fnode_sess->default_taskmgmt_timeout = 8228 *(uint16_t *)fnode_param->value; 8229 break; 8230 case ISCSI_FLASHNODE_IPADDR: 8231 memcpy(fnode_conn->ipaddress, fnode_param->value, 8232 IPv6_ADDR_LEN); 8233 break; 8234 case ISCSI_FLASHNODE_ALIAS: 8235 rc = iscsi_switch_str_param(&fnode_sess->targetalias, 8236 (char *)fnode_param->value); 8237 break; 8238 case ISCSI_FLASHNODE_REDIRECT_IPADDR: 8239 memcpy(fnode_conn->redirect_ipaddr, fnode_param->value, 8240 IPv6_ADDR_LEN); 8241 break; 8242 case ISCSI_FLASHNODE_MAX_SEGMENT_SIZE: 8243 fnode_conn->max_segment_size = 8244 *(unsigned *)fnode_param->value; 8245 break; 8246 case ISCSI_FLASHNODE_LOCAL_PORT: 8247 fnode_conn->local_port = 8248 *(uint16_t *)fnode_param->value; 8249 break; 8250 case ISCSI_FLASHNODE_IPV4_TOS: 8251 fnode_conn->ipv4_tos = fnode_param->value[0]; 8252 break; 8253 case ISCSI_FLASHNODE_IPV6_TC: 8254 fnode_conn->ipv6_traffic_class = fnode_param->value[0]; 8255 break; 8256 case ISCSI_FLASHNODE_IPV6_FLOW_LABEL: 8257 fnode_conn->ipv6_flow_label = fnode_param->value[0]; 8258 break; 8259 case ISCSI_FLASHNODE_NAME: 8260 rc = iscsi_switch_str_param(&fnode_sess->targetname, 8261 (char *)fnode_param->value); 8262 break; 8263 case ISCSI_FLASHNODE_TPGT: 8264 fnode_sess->tpgt = *(uint16_t *)fnode_param->value; 8265 break; 8266 case ISCSI_FLASHNODE_LINK_LOCAL_IPV6: 8267 memcpy(fnode_conn->link_local_ipv6_addr, 8268 fnode_param->value, IPv6_ADDR_LEN); 8269 break; 8270 case ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX: 8271 fnode_sess->discovery_parent_idx = 8272 *(uint16_t *)fnode_param->value; 8273 break; 8274 case ISCSI_FLASHNODE_TCP_XMIT_WSF: 8275 fnode_conn->tcp_xmit_wsf = 8276 *(uint8_t *)fnode_param->value; 8277 break; 8278 case ISCSI_FLASHNODE_TCP_RECV_WSF: 8279 fnode_conn->tcp_recv_wsf = 8280 *(uint8_t *)fnode_param->value; 8281 break; 8282 case ISCSI_FLASHNODE_STATSN: 8283 fnode_conn->statsn = *(uint32_t *)fnode_param->value; 8284 break; 8285 case ISCSI_FLASHNODE_EXP_STATSN: 8286 fnode_conn->exp_statsn = 8287 *(uint32_t *)fnode_param->value; 8288 break; 8289 case ISCSI_FLASHNODE_CHAP_OUT_IDX: 8290 chap_out_idx = *(uint16_t *)fnode_param->value; 8291 if (!qla4xxx_get_uni_chap_at_index(ha, 8292 chap_tbl.name, 8293 chap_tbl.secret, 8294 chap_out_idx)) { 8295 fnode_sess->chap_out_idx = chap_out_idx; 8296 /* Enable chap auth if chap index is valid */ 8297 fnode_sess->chap_auth_en = QL4_PARAM_ENABLE; 8298 } 8299 break; 8300 default: 8301 ql4_printk(KERN_ERR, ha, 8302 "%s: No such sysfs attribute\n", __func__); 8303 rc = -ENOSYS; 8304 goto exit_set_param; 8305 } 8306 } 8307 8308 rc = qla4xxx_sysfs_ddb_apply(fnode_sess, fnode_conn); 8309 8310exit_set_param: 8311 return rc; 8312} 8313 8314/** 8315 * qla4xxx_sysfs_ddb_delete - Delete firmware DDB entry 8316 * @fnode_sess: pointer to session attrs of flash ddb entry 8317 * 8318 * This invalidates the flash ddb entry at the given index 8319 **/ 8320static int qla4xxx_sysfs_ddb_delete(struct iscsi_bus_flash_session *fnode_sess) 8321{ 8322 struct Scsi_Host *shost = iscsi_flash_session_to_shost(fnode_sess); 8323 struct scsi_qla_host *ha = to_qla_host(shost); 8324 uint32_t dev_db_start_offset; 8325 uint32_t dev_db_end_offset; 8326 struct dev_db_entry *fw_ddb_entry = NULL; 8327 dma_addr_t fw_ddb_entry_dma; 8328 uint16_t *ddb_cookie = NULL; 8329 size_t ddb_size = 0; 8330 void *pddb = NULL; 8331 int target_id; 8332 int rc = 0; 8333 8334 if (fnode_sess->is_boot_target) { 8335 rc = -EPERM; 8336 DEBUG2(ql4_printk(KERN_ERR, ha, 8337 "%s: Deletion of boot target entry is not permitted.\n", 8338 __func__)); 8339 goto exit_ddb_del; 8340 } 8341 8342 if (fnode_sess->flash_state == DEV_DB_NON_PERSISTENT) 8343 goto sysfs_ddb_del; 8344 8345 if (is_qla40XX(ha)) { 8346 dev_db_start_offset = FLASH_OFFSET_DB_INFO; 8347 dev_db_end_offset = FLASH_OFFSET_DB_END; 8348 dev_db_start_offset += (fnode_sess->target_id * 8349 sizeof(*fw_ddb_entry)); 8350 ddb_size = sizeof(*fw_ddb_entry); 8351 } else { 8352 dev_db_start_offset = FLASH_RAW_ACCESS_ADDR + 8353 (ha->hw.flt_region_ddb << 2); 8354 /* flt_ddb_size is DDB table size for both ports 8355 * so divide it by 2 to calculate the offset for second port 8356 */ 8357 if (ha->port_num == 1) 8358 dev_db_start_offset += (ha->hw.flt_ddb_size / 2); 8359 8360 dev_db_end_offset = dev_db_start_offset + 8361 (ha->hw.flt_ddb_size / 2); 8362 8363 dev_db_start_offset += (fnode_sess->target_id * 8364 sizeof(*fw_ddb_entry)); 8365 dev_db_start_offset += offsetof(struct dev_db_entry, cookie); 8366 8367 ddb_size = sizeof(*ddb_cookie); 8368 } 8369 8370 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: start offset=%u, end offset=%u\n", 8371 __func__, dev_db_start_offset, dev_db_end_offset)); 8372 8373 if (dev_db_start_offset > dev_db_end_offset) { 8374 rc = -EIO; 8375 DEBUG2(ql4_printk(KERN_ERR, ha, "%s:Invalid DDB index %u\n", 8376 __func__, fnode_sess->target_id)); 8377 goto exit_ddb_del; 8378 } 8379 8380 pddb = dma_alloc_coherent(&ha->pdev->dev, ddb_size, 8381 &fw_ddb_entry_dma, GFP_KERNEL); 8382 if (!pddb) { 8383 rc = -ENOMEM; 8384 DEBUG2(ql4_printk(KERN_ERR, ha, 8385 "%s: Unable to allocate dma buffer\n", 8386 __func__)); 8387 goto exit_ddb_del; 8388 } 8389 8390 if (is_qla40XX(ha)) { 8391 fw_ddb_entry = pddb; 8392 memset(fw_ddb_entry, 0, ddb_size); 8393 ddb_cookie = &fw_ddb_entry->cookie; 8394 } else { 8395 ddb_cookie = pddb; 8396 } 8397 8398 /* invalidate the cookie */ 8399 *ddb_cookie = 0xFFEE; 8400 qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, 8401 ddb_size, FLASH_OPT_RMW_COMMIT); 8402 8403sysfs_ddb_del: 8404 target_id = fnode_sess->target_id; 8405 iscsi_destroy_flashnode_sess(fnode_sess); 8406 ql4_printk(KERN_INFO, ha, 8407 "%s: session and conn entries for flashnode %u of host %lu deleted\n", 8408 __func__, target_id, ha->host_no); 8409exit_ddb_del: 8410 if (pddb) 8411 dma_free_coherent(&ha->pdev->dev, ddb_size, pddb, 8412 fw_ddb_entry_dma); 8413 return rc; 8414} 8415 8416/** 8417 * qla4xxx_sysfs_ddb_export - Create sysfs entries for firmware DDBs 8418 * @ha: pointer to adapter structure 8419 * 8420 * Export the firmware DDB for all send targets and normal targets to sysfs. 8421 **/ 8422int qla4xxx_sysfs_ddb_export(struct scsi_qla_host *ha) 8423{ 8424 struct dev_db_entry *fw_ddb_entry = NULL; 8425 dma_addr_t fw_ddb_entry_dma; 8426 uint16_t max_ddbs; 8427 uint16_t idx = 0; 8428 int ret = QLA_SUCCESS; 8429 8430 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, 8431 sizeof(*fw_ddb_entry), 8432 &fw_ddb_entry_dma, GFP_KERNEL); 8433 if (!fw_ddb_entry) { 8434 DEBUG2(ql4_printk(KERN_ERR, ha, 8435 "%s: Unable to allocate dma buffer\n", 8436 __func__)); 8437 return -ENOMEM; 8438 } 8439 8440 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : 8441 MAX_DEV_DB_ENTRIES; 8442 8443 for (idx = 0; idx < max_ddbs; idx++) { 8444 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, fw_ddb_entry_dma, 8445 idx)) 8446 continue; 8447 8448 ret = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 0); 8449 if (ret) { 8450 ret = -EIO; 8451 break; 8452 } 8453 } 8454 8455 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), fw_ddb_entry, 8456 fw_ddb_entry_dma); 8457 8458 return ret; 8459} 8460 8461static void qla4xxx_sysfs_ddb_remove(struct scsi_qla_host *ha) 8462{ 8463 iscsi_destroy_all_flashnode(ha->host); 8464} 8465 8466/** 8467 * qla4xxx_build_ddb_list - Build ddb list and setup sessions 8468 * @ha: pointer to adapter structure 8469 * @is_reset: Is this init path or reset path 8470 * 8471 * Create a list of sendtargets (st) from firmware DDBs, issue send targets 8472 * using connection open, then create the list of normal targets (nt) 8473 * from firmware DDBs. Based on the list of nt setup session and connection 8474 * objects. 8475 **/ 8476void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset) 8477{ 8478 uint16_t tmo = 0; 8479 struct list_head list_st, list_nt; 8480 struct qla_ddb_index *st_ddb_idx, *st_ddb_idx_tmp; 8481 unsigned long wtime; 8482 8483 if (!test_bit(AF_LINK_UP, &ha->flags)) { 8484 set_bit(AF_BUILD_DDB_LIST, &ha->flags); 8485 ha->is_reset = is_reset; 8486 return; 8487 } 8488 8489 INIT_LIST_HEAD(&list_st); 8490 INIT_LIST_HEAD(&list_nt); 8491 8492 qla4xxx_build_st_list(ha, &list_st); 8493 8494 /* Before issuing conn open mbox, ensure all IPs states are configured 8495 * Note, conn open fails if IPs are not configured 8496 */ 8497 qla4xxx_wait_for_ip_configuration(ha); 8498 8499 /* Go thru the STs and fire the sendtargets by issuing conn open mbx */ 8500 list_for_each_entry_safe(st_ddb_idx, st_ddb_idx_tmp, &list_st, list) { 8501 qla4xxx_conn_open(ha, st_ddb_idx->fw_ddb_idx); 8502 } 8503 8504 /* Wait to ensure all sendtargets are done for min 12 sec wait */ 8505 tmo = ((ha->def_timeout > LOGIN_TOV) && 8506 (ha->def_timeout < LOGIN_TOV * 10) ? 8507 ha->def_timeout : LOGIN_TOV); 8508 8509 DEBUG2(ql4_printk(KERN_INFO, ha, 8510 "Default time to wait for build ddb %d\n", tmo)); 8511 8512 wtime = jiffies + (HZ * tmo); 8513 do { 8514 if (list_empty(&list_st)) 8515 break; 8516 8517 qla4xxx_remove_failed_ddb(ha, &list_st); 8518 schedule_timeout_uninterruptible(HZ / 10); 8519 } while (time_after(wtime, jiffies)); 8520 8521 8522 qla4xxx_build_nt_list(ha, &list_nt, &list_st, is_reset); 8523 8524 qla4xxx_free_ddb_list(&list_st); 8525 qla4xxx_free_ddb_list(&list_nt); 8526 8527 qla4xxx_free_ddb_index(ha); 8528} 8529 8530/** 8531 * qla4xxx_wait_login_resp_boot_tgt - Wait for iSCSI boot target login 8532 * response. 8533 * @ha: pointer to adapter structure 8534 * 8535 * When the boot entry is normal iSCSI target then DF_BOOT_TGT flag will be 8536 * set in DDB and we will wait for login response of boot targets during 8537 * probe. 8538 **/ 8539static void qla4xxx_wait_login_resp_boot_tgt(struct scsi_qla_host *ha) 8540{ 8541 struct ddb_entry *ddb_entry; 8542 struct dev_db_entry *fw_ddb_entry = NULL; 8543 dma_addr_t fw_ddb_entry_dma; 8544 unsigned long wtime; 8545 uint32_t ddb_state; 8546 int max_ddbs, idx, ret; 8547 8548 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : 8549 MAX_DEV_DB_ENTRIES; 8550 8551 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 8552 &fw_ddb_entry_dma, GFP_KERNEL); 8553 if (!fw_ddb_entry) { 8554 ql4_printk(KERN_ERR, ha, 8555 "%s: Unable to allocate dma buffer\n", __func__); 8556 goto exit_login_resp; 8557 } 8558 8559 wtime = jiffies + (HZ * BOOT_LOGIN_RESP_TOV); 8560 8561 for (idx = 0; idx < max_ddbs; idx++) { 8562 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); 8563 if (ddb_entry == NULL) 8564 continue; 8565 8566 if (test_bit(DF_BOOT_TGT, &ddb_entry->flags)) { 8567 DEBUG2(ql4_printk(KERN_INFO, ha, 8568 "%s: DDB index [%d]\n", __func__, 8569 ddb_entry->fw_ddb_index)); 8570 do { 8571 ret = qla4xxx_get_fwddb_entry(ha, 8572 ddb_entry->fw_ddb_index, 8573 fw_ddb_entry, fw_ddb_entry_dma, 8574 NULL, NULL, &ddb_state, NULL, 8575 NULL, NULL); 8576 if (ret == QLA_ERROR) 8577 goto exit_login_resp; 8578 8579 if ((ddb_state == DDB_DS_SESSION_ACTIVE) || 8580 (ddb_state == DDB_DS_SESSION_FAILED)) 8581 break; 8582 8583 schedule_timeout_uninterruptible(HZ); 8584 8585 } while ((time_after(wtime, jiffies))); 8586 8587 if (!time_after(wtime, jiffies)) { 8588 DEBUG2(ql4_printk(KERN_INFO, ha, 8589 "%s: Login response wait timer expired\n", 8590 __func__)); 8591 goto exit_login_resp; 8592 } 8593 } 8594 } 8595 8596exit_login_resp: 8597 if (fw_ddb_entry) 8598 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 8599 fw_ddb_entry, fw_ddb_entry_dma); 8600} 8601 8602/** 8603 * qla4xxx_probe_adapter - callback function to probe HBA 8604 * @pdev: pointer to pci_dev structure 8605 * @ent: pointer to pci_device entry 8606 * 8607 * This routine will probe for Qlogic 4xxx iSCSI host adapters. 8608 * It returns zero if successful. It also initializes all data necessary for 8609 * the driver. 8610 **/ 8611static int qla4xxx_probe_adapter(struct pci_dev *pdev, 8612 const struct pci_device_id *ent) 8613{ 8614 int ret = -ENODEV, status; 8615 struct Scsi_Host *host; 8616 struct scsi_qla_host *ha; 8617 uint8_t init_retry_count = 0; 8618 char buf[34]; 8619 struct qla4_8xxx_legacy_intr_set *nx_legacy_intr; 8620 uint32_t dev_state; 8621 8622 if (pci_enable_device(pdev)) 8623 return -1; 8624 8625 host = iscsi_host_alloc(&qla4xxx_driver_template, sizeof(*ha), 0); 8626 if (host == NULL) { 8627 printk(KERN_WARNING 8628 "qla4xxx: Couldn't allocate host from scsi layer!\n"); 8629 goto probe_disable_device; 8630 } 8631 8632 /* Clear our data area */ 8633 ha = to_qla_host(host); 8634 memset(ha, 0, sizeof(*ha)); 8635 8636 /* Save the information from PCI BIOS. */ 8637 ha->pdev = pdev; 8638 ha->host = host; 8639 ha->host_no = host->host_no; 8640 ha->func_num = PCI_FUNC(ha->pdev->devfn); 8641 8642 pci_enable_pcie_error_reporting(pdev); 8643 8644 /* Setup Runtime configurable options */ 8645 if (is_qla8022(ha)) { 8646 ha->isp_ops = &qla4_82xx_isp_ops; 8647 ha->reg_tbl = (uint32_t *) qla4_82xx_reg_tbl; 8648 ha->qdr_sn_window = -1; 8649 ha->ddr_mn_window = -1; 8650 ha->curr_window = 255; 8651 nx_legacy_intr = &legacy_intr[ha->func_num]; 8652 ha->nx_legacy_intr.int_vec_bit = nx_legacy_intr->int_vec_bit; 8653 ha->nx_legacy_intr.tgt_status_reg = 8654 nx_legacy_intr->tgt_status_reg; 8655 ha->nx_legacy_intr.tgt_mask_reg = nx_legacy_intr->tgt_mask_reg; 8656 ha->nx_legacy_intr.pci_int_reg = nx_legacy_intr->pci_int_reg; 8657 } else if (is_qla8032(ha) || is_qla8042(ha)) { 8658 ha->isp_ops = &qla4_83xx_isp_ops; 8659 ha->reg_tbl = (uint32_t *)qla4_83xx_reg_tbl; 8660 } else { 8661 ha->isp_ops = &qla4xxx_isp_ops; 8662 } 8663 8664 if (is_qla80XX(ha)) { 8665 rwlock_init(&ha->hw_lock); 8666 ha->pf_bit = ha->func_num << 16; 8667 /* Set EEH reset type to fundamental if required by hba */ 8668 pdev->needs_freset = 1; 8669 } 8670 8671 /* Configure PCI I/O space. */ 8672 ret = ha->isp_ops->iospace_config(ha); 8673 if (ret) 8674 goto probe_failed_ioconfig; 8675 8676 ql4_printk(KERN_INFO, ha, "Found an ISP%04x, irq %d, iobase 0x%p\n", 8677 pdev->device, pdev->irq, ha->reg); 8678 8679 qla4xxx_config_dma_addressing(ha); 8680 8681 /* Initialize lists and spinlocks. */ 8682 INIT_LIST_HEAD(&ha->free_srb_q); 8683 8684 mutex_init(&ha->mbox_sem); 8685 mutex_init(&ha->chap_sem); 8686 init_completion(&ha->mbx_intr_comp); 8687 init_completion(&ha->disable_acb_comp); 8688 init_completion(&ha->idc_comp); 8689 init_completion(&ha->link_up_comp); 8690 8691 spin_lock_init(&ha->hardware_lock); 8692 spin_lock_init(&ha->work_lock); 8693 8694 /* Initialize work list */ 8695 INIT_LIST_HEAD(&ha->work_list); 8696 8697 /* Allocate dma buffers */ 8698 if (qla4xxx_mem_alloc(ha)) { 8699 ql4_printk(KERN_WARNING, ha, 8700 "[ERROR] Failed to allocate memory for adapter\n"); 8701 8702 ret = -ENOMEM; 8703 goto probe_failed; 8704 } 8705 8706 host->cmd_per_lun = 3; 8707 host->max_channel = 0; 8708 host->max_lun = MAX_LUNS - 1; 8709 host->max_id = MAX_TARGETS; 8710 host->max_cmd_len = IOCB_MAX_CDB_LEN; 8711 host->can_queue = MAX_SRBS ; 8712 host->transportt = qla4xxx_scsi_transport; 8713 8714 pci_set_drvdata(pdev, ha); 8715 8716 ret = scsi_add_host(host, &pdev->dev); 8717 if (ret) 8718 goto probe_failed; 8719 8720 if (is_qla80XX(ha)) 8721 qla4_8xxx_get_flash_info(ha); 8722 8723 if (is_qla8032(ha) || is_qla8042(ha)) { 8724 qla4_83xx_read_reset_template(ha); 8725 /* 8726 * NOTE: If ql4dontresethba==1, set IDC_CTRL DONTRESET_BIT0. 8727 * If DONRESET_BIT0 is set, drivers should not set dev_state 8728 * to NEED_RESET. But if NEED_RESET is set, drivers should 8729 * should honor the reset. 8730 */ 8731 if (ql4xdontresethba == 1) 8732 qla4_83xx_set_idc_dontreset(ha); 8733 } 8734 8735 /* 8736 * Initialize the Host adapter request/response queues and 8737 * firmware 8738 * NOTE: interrupts enabled upon successful completion 8739 */ 8740 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); 8741 8742 /* Dont retry adapter initialization if IRQ allocation failed */ 8743 if (is_qla80XX(ha) && (status == QLA_ERROR)) 8744 goto skip_retry_init; 8745 8746 while ((!test_bit(AF_ONLINE, &ha->flags)) && 8747 init_retry_count++ < MAX_INIT_RETRIES) { 8748 8749 if (is_qla80XX(ha)) { 8750 ha->isp_ops->idc_lock(ha); 8751 dev_state = qla4_8xxx_rd_direct(ha, 8752 QLA8XXX_CRB_DEV_STATE); 8753 ha->isp_ops->idc_unlock(ha); 8754 if (dev_state == QLA8XXX_DEV_FAILED) { 8755 ql4_printk(KERN_WARNING, ha, "%s: don't retry " 8756 "initialize adapter. H/W is in failed state\n", 8757 __func__); 8758 break; 8759 } 8760 } 8761 DEBUG2(printk("scsi: %s: retrying adapter initialization " 8762 "(%d)\n", __func__, init_retry_count)); 8763 8764 if (ha->isp_ops->reset_chip(ha) == QLA_ERROR) 8765 continue; 8766 8767 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); 8768 if (is_qla80XX(ha) && (status == QLA_ERROR)) { 8769 if (qla4_8xxx_check_init_adapter_retry(ha) == QLA_ERROR) 8770 goto skip_retry_init; 8771 } 8772 } 8773 8774skip_retry_init: 8775 if (!test_bit(AF_ONLINE, &ha->flags)) { 8776 ql4_printk(KERN_WARNING, ha, "Failed to initialize adapter\n"); 8777 8778 if ((is_qla8022(ha) && ql4xdontresethba) || 8779 ((is_qla8032(ha) || is_qla8042(ha)) && 8780 qla4_83xx_idc_dontreset(ha))) { 8781 /* Put the device in failed state. */ 8782 DEBUG2(printk(KERN_ERR "HW STATE: FAILED\n")); 8783 ha->isp_ops->idc_lock(ha); 8784 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, 8785 QLA8XXX_DEV_FAILED); 8786 ha->isp_ops->idc_unlock(ha); 8787 } 8788 ret = -ENODEV; 8789 goto remove_host; 8790 } 8791 8792 /* Startup the kernel thread for this host adapter. */ 8793 DEBUG2(printk("scsi: %s: Starting kernel thread for " 8794 "qla4xxx_dpc\n", __func__)); 8795 sprintf(buf, "qla4xxx_%lu_dpc", ha->host_no); 8796 ha->dpc_thread = create_singlethread_workqueue(buf); 8797 if (!ha->dpc_thread) { 8798 ql4_printk(KERN_WARNING, ha, "Unable to start DPC thread!\n"); 8799 ret = -ENODEV; 8800 goto remove_host; 8801 } 8802 INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc); 8803 8804 ha->task_wq = alloc_workqueue("qla4xxx_%lu_task", WQ_MEM_RECLAIM, 1, 8805 ha->host_no); 8806 if (!ha->task_wq) { 8807 ql4_printk(KERN_WARNING, ha, "Unable to start task thread!\n"); 8808 ret = -ENODEV; 8809 goto remove_host; 8810 } 8811 8812 /* 8813 * For ISP-8XXX, request_irqs is called in qla4_8xxx_load_risc 8814 * (which is called indirectly by qla4xxx_initialize_adapter), 8815 * so that irqs will be registered after crbinit but before 8816 * mbx_intr_enable. 8817 */ 8818 if (is_qla40XX(ha)) { 8819 ret = qla4xxx_request_irqs(ha); 8820 if (ret) { 8821 ql4_printk(KERN_WARNING, ha, "Failed to reserve " 8822 "interrupt %d already in use.\n", pdev->irq); 8823 goto remove_host; 8824 } 8825 } 8826 8827 pci_save_state(ha->pdev); 8828 ha->isp_ops->enable_intrs(ha); 8829 8830 /* Start timer thread. */ 8831 qla4xxx_start_timer(ha, 1); 8832 8833 set_bit(AF_INIT_DONE, &ha->flags); 8834 8835 qla4_8xxx_alloc_sysfs_attr(ha); 8836 8837 printk(KERN_INFO 8838 " QLogic iSCSI HBA Driver version: %s\n" 8839 " QLogic ISP%04x @ %s, host#=%ld, fw=%02d.%02d.%02d.%02d\n", 8840 qla4xxx_version_str, ha->pdev->device, pci_name(ha->pdev), 8841 ha->host_no, ha->fw_info.fw_major, ha->fw_info.fw_minor, 8842 ha->fw_info.fw_patch, ha->fw_info.fw_build); 8843 8844 /* Set the driver version */ 8845 if (is_qla80XX(ha)) 8846 qla4_8xxx_set_param(ha, SET_DRVR_VERSION); 8847 8848 if (qla4xxx_setup_boot_info(ha)) 8849 ql4_printk(KERN_ERR, ha, 8850 "%s: No iSCSI boot target configured\n", __func__); 8851 8852 set_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags); 8853 /* Perform the build ddb list and login to each */ 8854 qla4xxx_build_ddb_list(ha, INIT_ADAPTER); 8855 iscsi_host_for_each_session(ha->host, qla4xxx_login_flash_ddb); 8856 qla4xxx_wait_login_resp_boot_tgt(ha); 8857 8858 qla4xxx_create_chap_list(ha); 8859 8860 qla4xxx_create_ifaces(ha); 8861 return 0; 8862 8863remove_host: 8864 scsi_remove_host(ha->host); 8865 8866probe_failed: 8867 qla4xxx_free_adapter(ha); 8868 8869probe_failed_ioconfig: 8870 pci_disable_pcie_error_reporting(pdev); 8871 scsi_host_put(ha->host); 8872 8873probe_disable_device: 8874 pci_disable_device(pdev); 8875 8876 return ret; 8877} 8878 8879/** 8880 * qla4xxx_prevent_other_port_reinit - prevent other port from re-initialize 8881 * @ha: pointer to adapter structure 8882 * 8883 * Mark the other ISP-4xxx port to indicate that the driver is being removed, 8884 * so that the other port will not re-initialize while in the process of 8885 * removing the ha due to driver unload or hba hotplug. 8886 **/ 8887static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha) 8888{ 8889 struct scsi_qla_host *other_ha = NULL; 8890 struct pci_dev *other_pdev = NULL; 8891 int fn = ISP4XXX_PCI_FN_2; 8892 8893 /*iscsi function numbers for ISP4xxx is 1 and 3*/ 8894 if (PCI_FUNC(ha->pdev->devfn) & BIT_1) 8895 fn = ISP4XXX_PCI_FN_1; 8896 8897 other_pdev = 8898 pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus), 8899 ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), 8900 fn)); 8901 8902 /* Get other_ha if other_pdev is valid and state is enable*/ 8903 if (other_pdev) { 8904 if (atomic_read(&other_pdev->enable_cnt)) { 8905 other_ha = pci_get_drvdata(other_pdev); 8906 if (other_ha) { 8907 set_bit(AF_HA_REMOVAL, &other_ha->flags); 8908 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: " 8909 "Prevent %s reinit\n", __func__, 8910 dev_name(&other_ha->pdev->dev))); 8911 } 8912 } 8913 pci_dev_put(other_pdev); 8914 } 8915} 8916 8917static void qla4xxx_destroy_ddb(struct scsi_qla_host *ha, 8918 struct ddb_entry *ddb_entry) 8919{ 8920 struct dev_db_entry *fw_ddb_entry = NULL; 8921 dma_addr_t fw_ddb_entry_dma; 8922 unsigned long wtime; 8923 uint32_t ddb_state; 8924 int options; 8925 int status; 8926 8927 options = LOGOUT_OPTION_CLOSE_SESSION; 8928 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) { 8929 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); 8930 goto clear_ddb; 8931 } 8932 8933 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 8934 &fw_ddb_entry_dma, GFP_KERNEL); 8935 if (!fw_ddb_entry) { 8936 ql4_printk(KERN_ERR, ha, 8937 "%s: Unable to allocate dma buffer\n", __func__); 8938 goto clear_ddb; 8939 } 8940 8941 wtime = jiffies + (HZ * LOGOUT_TOV); 8942 do { 8943 status = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, 8944 fw_ddb_entry, fw_ddb_entry_dma, 8945 NULL, NULL, &ddb_state, NULL, 8946 NULL, NULL); 8947 if (status == QLA_ERROR) 8948 goto free_ddb; 8949 8950 if ((ddb_state == DDB_DS_NO_CONNECTION_ACTIVE) || 8951 (ddb_state == DDB_DS_SESSION_FAILED)) 8952 goto free_ddb; 8953 8954 schedule_timeout_uninterruptible(HZ); 8955 } while ((time_after(wtime, jiffies))); 8956 8957free_ddb: 8958 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 8959 fw_ddb_entry, fw_ddb_entry_dma); 8960clear_ddb: 8961 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); 8962} 8963 8964static void qla4xxx_destroy_fw_ddb_session(struct scsi_qla_host *ha) 8965{ 8966 struct ddb_entry *ddb_entry; 8967 int idx; 8968 8969 for (idx = 0; idx < MAX_DDB_ENTRIES; idx++) { 8970 8971 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); 8972 if ((ddb_entry != NULL) && 8973 (ddb_entry->ddb_type == FLASH_DDB)) { 8974 8975 qla4xxx_destroy_ddb(ha, ddb_entry); 8976 /* 8977 * we have decremented the reference count of the driver 8978 * when we setup the session to have the driver unload 8979 * to be seamless without actually destroying the 8980 * session 8981 **/ 8982 try_module_get(qla4xxx_iscsi_transport.owner); 8983 iscsi_destroy_endpoint(ddb_entry->conn->ep); 8984 qla4xxx_free_ddb(ha, ddb_entry); 8985 iscsi_session_teardown(ddb_entry->sess); 8986 } 8987 } 8988} 8989/** 8990 * qla4xxx_remove_adapter - callback function to remove adapter. 8991 * @pdev: PCI device pointer 8992 **/ 8993static void qla4xxx_remove_adapter(struct pci_dev *pdev) 8994{ 8995 struct scsi_qla_host *ha; 8996 8997 /* 8998 * If the PCI device is disabled then it means probe_adapter had 8999 * failed and resources already cleaned up on probe_adapter exit. 9000 */ 9001 if (!pci_is_enabled(pdev)) 9002 return; 9003 9004 ha = pci_get_drvdata(pdev); 9005 9006 if (is_qla40XX(ha)) 9007 qla4xxx_prevent_other_port_reinit(ha); 9008 9009 /* destroy iface from sysfs */ 9010 qla4xxx_destroy_ifaces(ha); 9011 9012 if ((!ql4xdisablesysfsboot) && ha->boot_kset) 9013 iscsi_boot_destroy_kset(ha->boot_kset); 9014 9015 qla4xxx_destroy_fw_ddb_session(ha); 9016 qla4_8xxx_free_sysfs_attr(ha); 9017 9018 qla4xxx_sysfs_ddb_remove(ha); 9019 scsi_remove_host(ha->host); 9020 9021 qla4xxx_free_adapter(ha); 9022 9023 scsi_host_put(ha->host); 9024 9025 pci_disable_pcie_error_reporting(pdev); 9026 pci_disable_device(pdev); 9027} 9028 9029/** 9030 * qla4xxx_config_dma_addressing() - Configure OS DMA addressing method. 9031 * @ha: HA context 9032 */ 9033static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha) 9034{ 9035 /* Update our PCI device dma_mask for full 64 bit mask */ 9036 if (dma_set_mask_and_coherent(&ha->pdev->dev, DMA_BIT_MASK(64))) { 9037 dev_dbg(&ha->pdev->dev, 9038 "Failed to set 64 bit PCI consistent mask; " 9039 "using 32 bit.\n"); 9040 dma_set_mask_and_coherent(&ha->pdev->dev, DMA_BIT_MASK(32)); 9041 } 9042} 9043 9044static int qla4xxx_slave_alloc(struct scsi_device *sdev) 9045{ 9046 struct iscsi_cls_session *cls_sess; 9047 struct iscsi_session *sess; 9048 struct ddb_entry *ddb; 9049 int queue_depth = QL4_DEF_QDEPTH; 9050 9051 cls_sess = starget_to_session(sdev->sdev_target); 9052 sess = cls_sess->dd_data; 9053 ddb = sess->dd_data; 9054 9055 sdev->hostdata = ddb; 9056 9057 if (ql4xmaxqdepth != 0 && ql4xmaxqdepth <= 0xffffU) 9058 queue_depth = ql4xmaxqdepth; 9059 9060 scsi_change_queue_depth(sdev, queue_depth); 9061 return 0; 9062} 9063 9064/** 9065 * qla4xxx_del_from_active_array - returns an active srb 9066 * @ha: Pointer to host adapter structure. 9067 * @index: index into the active_array 9068 * 9069 * This routine removes and returns the srb at the specified index 9070 **/ 9071struct srb *qla4xxx_del_from_active_array(struct scsi_qla_host *ha, 9072 uint32_t index) 9073{ 9074 struct srb *srb = NULL; 9075 struct scsi_cmnd *cmd = NULL; 9076 9077 cmd = scsi_host_find_tag(ha->host, index); 9078 if (!cmd) 9079 return srb; 9080 9081 srb = qla4xxx_cmd_priv(cmd)->srb; 9082 if (!srb) 9083 return srb; 9084 9085 /* update counters */ 9086 if (srb->flags & SRB_DMA_VALID) { 9087 ha->iocb_cnt -= srb->iocb_cnt; 9088 if (srb->cmd) 9089 srb->cmd->host_scribble = 9090 (unsigned char *)(unsigned long) MAX_SRBS; 9091 } 9092 return srb; 9093} 9094 9095/** 9096 * qla4xxx_eh_wait_on_command - waits for command to be returned by firmware 9097 * @ha: Pointer to host adapter structure. 9098 * @cmd: Scsi Command to wait on. 9099 * 9100 * This routine waits for the command to be returned by the Firmware 9101 * for some max time. 9102 **/ 9103static int qla4xxx_eh_wait_on_command(struct scsi_qla_host *ha, 9104 struct scsi_cmnd *cmd) 9105{ 9106 int done = 0; 9107 struct srb *rp; 9108 uint32_t max_wait_time = EH_WAIT_CMD_TOV; 9109 int ret = SUCCESS; 9110 9111 /* Dont wait on command if PCI error is being handled 9112 * by PCI AER driver 9113 */ 9114 if (unlikely(pci_channel_offline(ha->pdev)) || 9115 (test_bit(AF_EEH_BUSY, &ha->flags))) { 9116 ql4_printk(KERN_WARNING, ha, "scsi%ld: Return from %s\n", 9117 ha->host_no, __func__); 9118 return ret; 9119 } 9120 9121 do { 9122 /* Checking to see if its returned to OS */ 9123 rp = qla4xxx_cmd_priv(cmd)->srb; 9124 if (rp == NULL) { 9125 done++; 9126 break; 9127 } 9128 9129 msleep(2000); 9130 } while (max_wait_time--); 9131 9132 return done; 9133} 9134 9135/** 9136 * qla4xxx_wait_for_hba_online - waits for HBA to come online 9137 * @ha: Pointer to host adapter structure 9138 **/ 9139static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha) 9140{ 9141 unsigned long wait_online; 9142 9143 wait_online = jiffies + (HBA_ONLINE_TOV * HZ); 9144 while (time_before(jiffies, wait_online)) { 9145 9146 if (adapter_up(ha)) 9147 return QLA_SUCCESS; 9148 9149 msleep(2000); 9150 } 9151 9152 return QLA_ERROR; 9153} 9154 9155/** 9156 * qla4xxx_eh_wait_for_commands - wait for active cmds to finish. 9157 * @ha: pointer to HBA 9158 * @stgt: pointer to SCSI target 9159 * @sdev: pointer to SCSI device 9160 * 9161 * This function waits for all outstanding commands to a lun to complete. It 9162 * returns 0 if all pending commands are returned and 1 otherwise. 9163 **/ 9164static int qla4xxx_eh_wait_for_commands(struct scsi_qla_host *ha, 9165 struct scsi_target *stgt, 9166 struct scsi_device *sdev) 9167{ 9168 int cnt; 9169 int status = 0; 9170 struct scsi_cmnd *cmd; 9171 9172 /* 9173 * Waiting for all commands for the designated target or dev 9174 * in the active array 9175 */ 9176 for (cnt = 0; cnt < ha->host->can_queue; cnt++) { 9177 cmd = scsi_host_find_tag(ha->host, cnt); 9178 if (cmd && stgt == scsi_target(cmd->device) && 9179 (!sdev || sdev == cmd->device)) { 9180 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { 9181 status++; 9182 break; 9183 } 9184 } 9185 } 9186 return status; 9187} 9188 9189/** 9190 * qla4xxx_eh_abort - callback for abort task. 9191 * @cmd: Pointer to Linux's SCSI command structure 9192 * 9193 * This routine is called by the Linux OS to abort the specified 9194 * command. 9195 **/ 9196static int qla4xxx_eh_abort(struct scsi_cmnd *cmd) 9197{ 9198 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); 9199 unsigned int id = cmd->device->id; 9200 uint64_t lun = cmd->device->lun; 9201 unsigned long flags; 9202 struct srb *srb = NULL; 9203 int ret = SUCCESS; 9204 int wait = 0; 9205 int rval; 9206 9207 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Abort command issued cmd=%p, cdb=0x%x\n", 9208 ha->host_no, id, lun, cmd, cmd->cmnd[0]); 9209 9210 rval = qla4xxx_isp_check_reg(ha); 9211 if (rval != QLA_SUCCESS) { 9212 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); 9213 return FAILED; 9214 } 9215 9216 spin_lock_irqsave(&ha->hardware_lock, flags); 9217 srb = qla4xxx_cmd_priv(cmd)->srb; 9218 if (!srb) { 9219 spin_unlock_irqrestore(&ha->hardware_lock, flags); 9220 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Specified command has already completed.\n", 9221 ha->host_no, id, lun); 9222 return SUCCESS; 9223 } 9224 kref_get(&srb->srb_ref); 9225 spin_unlock_irqrestore(&ha->hardware_lock, flags); 9226 9227 if (qla4xxx_abort_task(ha, srb) != QLA_SUCCESS) { 9228 DEBUG3(printk("scsi%ld:%d:%llu: Abort_task mbx failed.\n", 9229 ha->host_no, id, lun)); 9230 ret = FAILED; 9231 } else { 9232 DEBUG3(printk("scsi%ld:%d:%llu: Abort_task mbx success.\n", 9233 ha->host_no, id, lun)); 9234 wait = 1; 9235 } 9236 9237 kref_put(&srb->srb_ref, qla4xxx_srb_compl); 9238 9239 /* Wait for command to complete */ 9240 if (wait) { 9241 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { 9242 DEBUG2(printk("scsi%ld:%d:%llu: Abort handler timed out\n", 9243 ha->host_no, id, lun)); 9244 ret = FAILED; 9245 } 9246 } 9247 9248 ql4_printk(KERN_INFO, ha, 9249 "scsi%ld:%d:%llu: Abort command - %s\n", 9250 ha->host_no, id, lun, (ret == SUCCESS) ? "succeeded" : "failed"); 9251 9252 return ret; 9253} 9254 9255/** 9256 * qla4xxx_eh_device_reset - callback for target reset. 9257 * @cmd: Pointer to Linux's SCSI command structure 9258 * 9259 * This routine is called by the Linux OS to reset all luns on the 9260 * specified target. 9261 **/ 9262static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd) 9263{ 9264 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); 9265 struct ddb_entry *ddb_entry = cmd->device->hostdata; 9266 int ret = FAILED, stat; 9267 int rval; 9268 9269 if (!ddb_entry) 9270 return ret; 9271 9272 ret = iscsi_block_scsi_eh(cmd); 9273 if (ret) 9274 return ret; 9275 ret = FAILED; 9276 9277 ql4_printk(KERN_INFO, ha, 9278 "scsi%ld:%d:%d:%llu: DEVICE RESET ISSUED.\n", ha->host_no, 9279 cmd->device->channel, cmd->device->id, cmd->device->lun); 9280 9281 DEBUG2(printk(KERN_INFO 9282 "scsi%ld: DEVICE_RESET cmd=%p jiffies = 0x%lx, to=%x," 9283 "dpc_flags=%lx, status=%x allowed=%d\n", ha->host_no, 9284 cmd, jiffies, scsi_cmd_to_rq(cmd)->timeout / HZ, 9285 ha->dpc_flags, cmd->result, cmd->allowed)); 9286 9287 rval = qla4xxx_isp_check_reg(ha); 9288 if (rval != QLA_SUCCESS) { 9289 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); 9290 return FAILED; 9291 } 9292 9293 /* FIXME: wait for hba to go online */ 9294 stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun); 9295 if (stat != QLA_SUCCESS) { 9296 ql4_printk(KERN_INFO, ha, "DEVICE RESET FAILED. %d\n", stat); 9297 goto eh_dev_reset_done; 9298 } 9299 9300 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), 9301 cmd->device)) { 9302 ql4_printk(KERN_INFO, ha, 9303 "DEVICE RESET FAILED - waiting for " 9304 "commands.\n"); 9305 goto eh_dev_reset_done; 9306 } 9307 9308 /* Send marker. */ 9309 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, 9310 MM_LUN_RESET) != QLA_SUCCESS) 9311 goto eh_dev_reset_done; 9312 9313 ql4_printk(KERN_INFO, ha, 9314 "scsi(%ld:%d:%d:%llu): DEVICE RESET SUCCEEDED.\n", 9315 ha->host_no, cmd->device->channel, cmd->device->id, 9316 cmd->device->lun); 9317 9318 ret = SUCCESS; 9319 9320eh_dev_reset_done: 9321 9322 return ret; 9323} 9324 9325/** 9326 * qla4xxx_eh_target_reset - callback for target reset. 9327 * @cmd: Pointer to Linux's SCSI command structure 9328 * 9329 * This routine is called by the Linux OS to reset the target. 9330 **/ 9331static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd) 9332{ 9333 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); 9334 struct ddb_entry *ddb_entry = cmd->device->hostdata; 9335 int stat, ret; 9336 int rval; 9337 9338 if (!ddb_entry) 9339 return FAILED; 9340 9341 ret = iscsi_block_scsi_eh(cmd); 9342 if (ret) 9343 return ret; 9344 9345 starget_printk(KERN_INFO, scsi_target(cmd->device), 9346 "WARM TARGET RESET ISSUED.\n"); 9347 9348 DEBUG2(printk(KERN_INFO 9349 "scsi%ld: TARGET_DEVICE_RESET cmd=%p jiffies = 0x%lx, " 9350 "to=%x,dpc_flags=%lx, status=%x allowed=%d\n", 9351 ha->host_no, cmd, jiffies, scsi_cmd_to_rq(cmd)->timeout / HZ, 9352 ha->dpc_flags, cmd->result, cmd->allowed)); 9353 9354 rval = qla4xxx_isp_check_reg(ha); 9355 if (rval != QLA_SUCCESS) { 9356 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); 9357 return FAILED; 9358 } 9359 9360 stat = qla4xxx_reset_target(ha, ddb_entry); 9361 if (stat != QLA_SUCCESS) { 9362 starget_printk(KERN_INFO, scsi_target(cmd->device), 9363 "WARM TARGET RESET FAILED.\n"); 9364 return FAILED; 9365 } 9366 9367 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), 9368 NULL)) { 9369 starget_printk(KERN_INFO, scsi_target(cmd->device), 9370 "WARM TARGET DEVICE RESET FAILED - " 9371 "waiting for commands.\n"); 9372 return FAILED; 9373 } 9374 9375 /* Send marker. */ 9376 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, 9377 MM_TGT_WARM_RESET) != QLA_SUCCESS) { 9378 starget_printk(KERN_INFO, scsi_target(cmd->device), 9379 "WARM TARGET DEVICE RESET FAILED - " 9380 "marker iocb failed.\n"); 9381 return FAILED; 9382 } 9383 9384 starget_printk(KERN_INFO, scsi_target(cmd->device), 9385 "WARM TARGET RESET SUCCEEDED.\n"); 9386 return SUCCESS; 9387} 9388 9389/** 9390 * qla4xxx_is_eh_active - check if error handler is running 9391 * @shost: Pointer to SCSI Host struct 9392 * 9393 * This routine finds that if reset host is called in EH 9394 * scenario or from some application like sg_reset 9395 **/ 9396static int qla4xxx_is_eh_active(struct Scsi_Host *shost) 9397{ 9398 if (shost->shost_state == SHOST_RECOVERY) 9399 return 1; 9400 return 0; 9401} 9402 9403/** 9404 * qla4xxx_eh_host_reset - kernel callback 9405 * @cmd: Pointer to Linux's SCSI command structure 9406 * 9407 * This routine is invoked by the Linux kernel to perform fatal error 9408 * recovery on the specified adapter. 9409 **/ 9410static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd) 9411{ 9412 int return_status = FAILED; 9413 struct scsi_qla_host *ha; 9414 int rval; 9415 9416 ha = to_qla_host(cmd->device->host); 9417 9418 rval = qla4xxx_isp_check_reg(ha); 9419 if (rval != QLA_SUCCESS) { 9420 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); 9421 return FAILED; 9422 } 9423 9424 if ((is_qla8032(ha) || is_qla8042(ha)) && ql4xdontresethba) 9425 qla4_83xx_set_idc_dontreset(ha); 9426 9427 /* 9428 * For ISP8324 and ISP8042, if IDC_CTRL DONTRESET_BIT0 is set by other 9429 * protocol drivers, we should not set device_state to NEED_RESET 9430 */ 9431 if (ql4xdontresethba || 9432 ((is_qla8032(ha) || is_qla8042(ha)) && 9433 qla4_83xx_idc_dontreset(ha))) { 9434 DEBUG2(printk("scsi%ld: %s: Don't Reset HBA\n", 9435 ha->host_no, __func__)); 9436 9437 /* Clear outstanding srb in queues */ 9438 if (qla4xxx_is_eh_active(cmd->device->host)) 9439 qla4xxx_abort_active_cmds(ha, DID_ABORT << 16); 9440 9441 return FAILED; 9442 } 9443 9444 ql4_printk(KERN_INFO, ha, 9445 "scsi(%ld:%d:%d:%llu): HOST RESET ISSUED.\n", ha->host_no, 9446 cmd->device->channel, cmd->device->id, cmd->device->lun); 9447 9448 if (qla4xxx_wait_for_hba_online(ha) != QLA_SUCCESS) { 9449 DEBUG2(printk("scsi%ld:%d: %s: Unable to reset host. Adapter " 9450 "DEAD.\n", ha->host_no, cmd->device->channel, 9451 __func__)); 9452 9453 return FAILED; 9454 } 9455 9456 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { 9457 if (is_qla80XX(ha)) 9458 set_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); 9459 else 9460 set_bit(DPC_RESET_HA, &ha->dpc_flags); 9461 } 9462 9463 if (qla4xxx_recover_adapter(ha) == QLA_SUCCESS) 9464 return_status = SUCCESS; 9465 9466 ql4_printk(KERN_INFO, ha, "HOST RESET %s.\n", 9467 return_status == FAILED ? "FAILED" : "SUCCEEDED"); 9468 9469 return return_status; 9470} 9471 9472static int qla4xxx_context_reset(struct scsi_qla_host *ha) 9473{ 9474 uint32_t mbox_cmd[MBOX_REG_COUNT]; 9475 uint32_t mbox_sts[MBOX_REG_COUNT]; 9476 struct addr_ctrl_blk_def *acb = NULL; 9477 uint32_t acb_len = sizeof(struct addr_ctrl_blk_def); 9478 int rval = QLA_SUCCESS; 9479 dma_addr_t acb_dma; 9480 9481 acb = dma_alloc_coherent(&ha->pdev->dev, 9482 sizeof(struct addr_ctrl_blk_def), 9483 &acb_dma, GFP_KERNEL); 9484 if (!acb) { 9485 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc acb\n", 9486 __func__); 9487 rval = -ENOMEM; 9488 goto exit_port_reset; 9489 } 9490 9491 memset(acb, 0, acb_len); 9492 9493 rval = qla4xxx_get_acb(ha, acb_dma, PRIMARI_ACB, acb_len); 9494 if (rval != QLA_SUCCESS) { 9495 rval = -EIO; 9496 goto exit_free_acb; 9497 } 9498 9499 rval = qla4xxx_disable_acb(ha); 9500 if (rval != QLA_SUCCESS) { 9501 rval = -EIO; 9502 goto exit_free_acb; 9503 } 9504 9505 wait_for_completion_timeout(&ha->disable_acb_comp, 9506 DISABLE_ACB_TOV * HZ); 9507 9508 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], acb_dma); 9509 if (rval != QLA_SUCCESS) { 9510 rval = -EIO; 9511 goto exit_free_acb; 9512 } 9513 9514exit_free_acb: 9515 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk_def), 9516 acb, acb_dma); 9517exit_port_reset: 9518 DEBUG2(ql4_printk(KERN_INFO, ha, "%s %s\n", __func__, 9519 rval == QLA_SUCCESS ? "SUCCEEDED" : "FAILED")); 9520 return rval; 9521} 9522 9523static int qla4xxx_host_reset(struct Scsi_Host *shost, int reset_type) 9524{ 9525 struct scsi_qla_host *ha = to_qla_host(shost); 9526 int rval = QLA_SUCCESS; 9527 uint32_t idc_ctrl; 9528 9529 if (ql4xdontresethba) { 9530 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Don't Reset HBA\n", 9531 __func__)); 9532 rval = -EPERM; 9533 goto exit_host_reset; 9534 } 9535 9536 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) 9537 goto recover_adapter; 9538 9539 switch (reset_type) { 9540 case SCSI_ADAPTER_RESET: 9541 set_bit(DPC_RESET_HA, &ha->dpc_flags); 9542 break; 9543 case SCSI_FIRMWARE_RESET: 9544 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { 9545 if (is_qla80XX(ha)) 9546 /* set firmware context reset */ 9547 set_bit(DPC_RESET_HA_FW_CONTEXT, 9548 &ha->dpc_flags); 9549 else { 9550 rval = qla4xxx_context_reset(ha); 9551 goto exit_host_reset; 9552 } 9553 } 9554 break; 9555 } 9556 9557recover_adapter: 9558 /* For ISP8324 and ISP8042 set graceful reset bit in IDC_DRV_CTRL if 9559 * reset is issued by application */ 9560 if ((is_qla8032(ha) || is_qla8042(ha)) && 9561 test_bit(DPC_RESET_HA, &ha->dpc_flags)) { 9562 idc_ctrl = qla4_83xx_rd_reg(ha, QLA83XX_IDC_DRV_CTRL); 9563 qla4_83xx_wr_reg(ha, QLA83XX_IDC_DRV_CTRL, 9564 (idc_ctrl | GRACEFUL_RESET_BIT1)); 9565 } 9566 9567 rval = qla4xxx_recover_adapter(ha); 9568 if (rval != QLA_SUCCESS) { 9569 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: recover adapter fail\n", 9570 __func__)); 9571 rval = -EIO; 9572 } 9573 9574exit_host_reset: 9575 return rval; 9576} 9577 9578/* PCI AER driver recovers from all correctable errors w/o 9579 * driver intervention. For uncorrectable errors PCI AER 9580 * driver calls the following device driver's callbacks 9581 * 9582 * - Fatal Errors - link_reset 9583 * - Non-Fatal Errors - driver's error_detected() which 9584 * returns CAN_RECOVER, NEED_RESET or DISCONNECT. 9585 * 9586 * PCI AER driver calls 9587 * CAN_RECOVER - driver's mmio_enabled(), mmio_enabled() 9588 * returns RECOVERED or NEED_RESET if fw_hung 9589 * NEED_RESET - driver's slot_reset() 9590 * DISCONNECT - device is dead & cannot recover 9591 * RECOVERED - driver's resume() 9592 */ 9593static pci_ers_result_t 9594qla4xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state) 9595{ 9596 struct scsi_qla_host *ha = pci_get_drvdata(pdev); 9597 9598 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: error detected:state %x\n", 9599 ha->host_no, __func__, state); 9600 9601 if (!is_aer_supported(ha)) 9602 return PCI_ERS_RESULT_NONE; 9603 9604 switch (state) { 9605 case pci_channel_io_normal: 9606 clear_bit(AF_EEH_BUSY, &ha->flags); 9607 return PCI_ERS_RESULT_CAN_RECOVER; 9608 case pci_channel_io_frozen: 9609 set_bit(AF_EEH_BUSY, &ha->flags); 9610 qla4xxx_mailbox_premature_completion(ha); 9611 qla4xxx_free_irqs(ha); 9612 pci_disable_device(pdev); 9613 /* Return back all IOs */ 9614 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); 9615 return PCI_ERS_RESULT_NEED_RESET; 9616 case pci_channel_io_perm_failure: 9617 set_bit(AF_EEH_BUSY, &ha->flags); 9618 set_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags); 9619 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); 9620 return PCI_ERS_RESULT_DISCONNECT; 9621 } 9622 return PCI_ERS_RESULT_NEED_RESET; 9623} 9624 9625/** 9626 * qla4xxx_pci_mmio_enabled() - gets called if 9627 * qla4xxx_pci_error_detected() returns PCI_ERS_RESULT_CAN_RECOVER 9628 * and read/write to the device still works. 9629 * @pdev: PCI device pointer 9630 **/ 9631static pci_ers_result_t 9632qla4xxx_pci_mmio_enabled(struct pci_dev *pdev) 9633{ 9634 struct scsi_qla_host *ha = pci_get_drvdata(pdev); 9635 9636 if (!is_aer_supported(ha)) 9637 return PCI_ERS_RESULT_NONE; 9638 9639 return PCI_ERS_RESULT_RECOVERED; 9640} 9641 9642static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha) 9643{ 9644 uint32_t rval = QLA_ERROR; 9645 int fn; 9646 struct pci_dev *other_pdev = NULL; 9647 9648 ql4_printk(KERN_WARNING, ha, "scsi%ld: In %s\n", ha->host_no, __func__); 9649 9650 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); 9651 9652 if (test_bit(AF_ONLINE, &ha->flags)) { 9653 clear_bit(AF_ONLINE, &ha->flags); 9654 clear_bit(AF_LINK_UP, &ha->flags); 9655 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); 9656 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); 9657 } 9658 9659 fn = PCI_FUNC(ha->pdev->devfn); 9660 if (is_qla8022(ha)) { 9661 while (fn > 0) { 9662 fn--; 9663 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Finding PCI device at func %x\n", 9664 ha->host_no, __func__, fn); 9665 /* Get the pci device given the domain, bus, 9666 * slot/function number */ 9667 other_pdev = pci_get_domain_bus_and_slot( 9668 pci_domain_nr(ha->pdev->bus), 9669 ha->pdev->bus->number, 9670 PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), 9671 fn)); 9672 9673 if (!other_pdev) 9674 continue; 9675 9676 if (atomic_read(&other_pdev->enable_cnt)) { 9677 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Found PCI func in enabled state%x\n", 9678 ha->host_no, __func__, fn); 9679 pci_dev_put(other_pdev); 9680 break; 9681 } 9682 pci_dev_put(other_pdev); 9683 } 9684 } else { 9685 /* this case is meant for ISP83xx/ISP84xx only */ 9686 if (qla4_83xx_can_perform_reset(ha)) { 9687 /* reset fn as iSCSI is going to perform the reset */ 9688 fn = 0; 9689 } 9690 } 9691 9692 /* The first function on the card, the reset owner will 9693 * start & initialize the firmware. The other functions 9694 * on the card will reset the firmware context 9695 */ 9696 if (!fn) { 9697 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn being reset " 9698 "0x%x is the owner\n", ha->host_no, __func__, 9699 ha->pdev->devfn); 9700 9701 ha->isp_ops->idc_lock(ha); 9702 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, 9703 QLA8XXX_DEV_COLD); 9704 ha->isp_ops->idc_unlock(ha); 9705 9706 rval = qla4_8xxx_update_idc_reg(ha); 9707 if (rval == QLA_ERROR) { 9708 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: FAILED\n", 9709 ha->host_no, __func__); 9710 ha->isp_ops->idc_lock(ha); 9711 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, 9712 QLA8XXX_DEV_FAILED); 9713 ha->isp_ops->idc_unlock(ha); 9714 goto exit_error_recovery; 9715 } 9716 9717 clear_bit(AF_FW_RECOVERY, &ha->flags); 9718 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); 9719 9720 if (rval != QLA_SUCCESS) { 9721 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " 9722 "FAILED\n", ha->host_no, __func__); 9723 qla4xxx_free_irqs(ha); 9724 ha->isp_ops->idc_lock(ha); 9725 qla4_8xxx_clear_drv_active(ha); 9726 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, 9727 QLA8XXX_DEV_FAILED); 9728 ha->isp_ops->idc_unlock(ha); 9729 } else { 9730 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " 9731 "READY\n", ha->host_no, __func__); 9732 ha->isp_ops->idc_lock(ha); 9733 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, 9734 QLA8XXX_DEV_READY); 9735 /* Clear driver state register */ 9736 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DRV_STATE, 0); 9737 qla4_8xxx_set_drv_active(ha); 9738 ha->isp_ops->idc_unlock(ha); 9739 ha->isp_ops->enable_intrs(ha); 9740 } 9741 } else { 9742 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn 0x%x is not " 9743 "the reset owner\n", ha->host_no, __func__, 9744 ha->pdev->devfn); 9745 if ((qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE) == 9746 QLA8XXX_DEV_READY)) { 9747 clear_bit(AF_FW_RECOVERY, &ha->flags); 9748 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); 9749 if (rval == QLA_SUCCESS) 9750 ha->isp_ops->enable_intrs(ha); 9751 else 9752 qla4xxx_free_irqs(ha); 9753 9754 ha->isp_ops->idc_lock(ha); 9755 qla4_8xxx_set_drv_active(ha); 9756 ha->isp_ops->idc_unlock(ha); 9757 } 9758 } 9759exit_error_recovery: 9760 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); 9761 return rval; 9762} 9763 9764static pci_ers_result_t 9765qla4xxx_pci_slot_reset(struct pci_dev *pdev) 9766{ 9767 pci_ers_result_t ret = PCI_ERS_RESULT_DISCONNECT; 9768 struct scsi_qla_host *ha = pci_get_drvdata(pdev); 9769 int rc; 9770 9771 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: slot_reset\n", 9772 ha->host_no, __func__); 9773 9774 if (!is_aer_supported(ha)) 9775 return PCI_ERS_RESULT_NONE; 9776 9777 /* Restore the saved state of PCIe device - 9778 * BAR registers, PCI Config space, PCIX, MSI, 9779 * IOV states 9780 */ 9781 pci_restore_state(pdev); 9782 9783 /* pci_restore_state() clears the saved_state flag of the device 9784 * save restored state which resets saved_state flag 9785 */ 9786 pci_save_state(pdev); 9787 9788 /* Initialize device or resume if in suspended state */ 9789 rc = pci_enable_device(pdev); 9790 if (rc) { 9791 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Can't re-enable " 9792 "device after reset\n", ha->host_no, __func__); 9793 goto exit_slot_reset; 9794 } 9795 9796 ha->isp_ops->disable_intrs(ha); 9797 9798 if (is_qla80XX(ha)) { 9799 if (qla4_8xxx_error_recovery(ha) == QLA_SUCCESS) { 9800 ret = PCI_ERS_RESULT_RECOVERED; 9801 goto exit_slot_reset; 9802 } else 9803 goto exit_slot_reset; 9804 } 9805 9806exit_slot_reset: 9807 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Return=%x\n" 9808 "device after reset\n", ha->host_no, __func__, ret); 9809 return ret; 9810} 9811 9812static void 9813qla4xxx_pci_resume(struct pci_dev *pdev) 9814{ 9815 struct scsi_qla_host *ha = pci_get_drvdata(pdev); 9816 int ret; 9817 9818 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: pci_resume\n", 9819 ha->host_no, __func__); 9820 9821 ret = qla4xxx_wait_for_hba_online(ha); 9822 if (ret != QLA_SUCCESS) { 9823 ql4_printk(KERN_ERR, ha, "scsi%ld: %s: the device failed to " 9824 "resume I/O from slot/link_reset\n", ha->host_no, 9825 __func__); 9826 } 9827 9828 clear_bit(AF_EEH_BUSY, &ha->flags); 9829} 9830 9831static const struct pci_error_handlers qla4xxx_err_handler = { 9832 .error_detected = qla4xxx_pci_error_detected, 9833 .mmio_enabled = qla4xxx_pci_mmio_enabled, 9834 .slot_reset = qla4xxx_pci_slot_reset, 9835 .resume = qla4xxx_pci_resume, 9836}; 9837 9838static struct pci_device_id qla4xxx_pci_tbl[] = { 9839 { 9840 .vendor = PCI_VENDOR_ID_QLOGIC, 9841 .device = PCI_DEVICE_ID_QLOGIC_ISP4010, 9842 .subvendor = PCI_ANY_ID, 9843 .subdevice = PCI_ANY_ID, 9844 }, 9845 { 9846 .vendor = PCI_VENDOR_ID_QLOGIC, 9847 .device = PCI_DEVICE_ID_QLOGIC_ISP4022, 9848 .subvendor = PCI_ANY_ID, 9849 .subdevice = PCI_ANY_ID, 9850 }, 9851 { 9852 .vendor = PCI_VENDOR_ID_QLOGIC, 9853 .device = PCI_DEVICE_ID_QLOGIC_ISP4032, 9854 .subvendor = PCI_ANY_ID, 9855 .subdevice = PCI_ANY_ID, 9856 }, 9857 { 9858 .vendor = PCI_VENDOR_ID_QLOGIC, 9859 .device = PCI_DEVICE_ID_QLOGIC_ISP8022, 9860 .subvendor = PCI_ANY_ID, 9861 .subdevice = PCI_ANY_ID, 9862 }, 9863 { 9864 .vendor = PCI_VENDOR_ID_QLOGIC, 9865 .device = PCI_DEVICE_ID_QLOGIC_ISP8324, 9866 .subvendor = PCI_ANY_ID, 9867 .subdevice = PCI_ANY_ID, 9868 }, 9869 { 9870 .vendor = PCI_VENDOR_ID_QLOGIC, 9871 .device = PCI_DEVICE_ID_QLOGIC_ISP8042, 9872 .subvendor = PCI_ANY_ID, 9873 .subdevice = PCI_ANY_ID, 9874 }, 9875 {0, 0}, 9876}; 9877MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl); 9878 9879static struct pci_driver qla4xxx_pci_driver = { 9880 .name = DRIVER_NAME, 9881 .id_table = qla4xxx_pci_tbl, 9882 .probe = qla4xxx_probe_adapter, 9883 .remove = qla4xxx_remove_adapter, 9884 .err_handler = &qla4xxx_err_handler, 9885}; 9886 9887static int __init qla4xxx_module_init(void) 9888{ 9889 int ret; 9890 9891 if (ql4xqfulltracking) 9892 qla4xxx_driver_template.track_queue_depth = 1; 9893 9894 /* Allocate cache for SRBs. */ 9895 srb_cachep = kmem_cache_create("qla4xxx_srbs", sizeof(struct srb), 0, 9896 SLAB_HWCACHE_ALIGN, NULL); 9897 if (srb_cachep == NULL) { 9898 printk(KERN_ERR 9899 "%s: Unable to allocate SRB cache..." 9900 "Failing load!\n", DRIVER_NAME); 9901 ret = -ENOMEM; 9902 goto no_srp_cache; 9903 } 9904 9905 /* Derive version string. */ 9906 strcpy(qla4xxx_version_str, QLA4XXX_DRIVER_VERSION); 9907 if (ql4xextended_error_logging) 9908 strcat(qla4xxx_version_str, "-debug"); 9909 9910 qla4xxx_scsi_transport = 9911 iscsi_register_transport(&qla4xxx_iscsi_transport); 9912 if (!qla4xxx_scsi_transport){ 9913 ret = -ENODEV; 9914 goto release_srb_cache; 9915 } 9916 9917 ret = pci_register_driver(&qla4xxx_pci_driver); 9918 if (ret) 9919 goto unregister_transport; 9920 9921 printk(KERN_INFO "QLogic iSCSI HBA Driver\n"); 9922 return 0; 9923 9924unregister_transport: 9925 iscsi_unregister_transport(&qla4xxx_iscsi_transport); 9926release_srb_cache: 9927 kmem_cache_destroy(srb_cachep); 9928no_srp_cache: 9929 return ret; 9930} 9931 9932static void __exit qla4xxx_module_exit(void) 9933{ 9934 pci_unregister_driver(&qla4xxx_pci_driver); 9935 iscsi_unregister_transport(&qla4xxx_iscsi_transport); 9936 kmem_cache_destroy(srb_cachep); 9937} 9938 9939module_init(qla4xxx_module_init); 9940module_exit(qla4xxx_module_exit); 9941 9942MODULE_AUTHOR("QLogic Corporation"); 9943MODULE_DESCRIPTION("QLogic iSCSI HBA Driver"); 9944MODULE_LICENSE("GPL"); 9945MODULE_VERSION(QLA4XXX_DRIVER_VERSION);