Lines Matching refs:ha

100 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha);
104 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha);
270 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_send_ping() local
283 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv4 Ping src: %pI4 " in qla4xxx_send_ping()
285 &ha->ip_config.ip_address, ipaddr)); in qla4xxx_send_ping()
286 rval = qla4xxx_ping_iocb(ha, options, payload_size, pid, in qla4xxx_send_ping()
300 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: LinkLocal Ping " in qla4xxx_send_ping()
302 &ha->ip_config.ipv6_link_local_addr, in qla4xxx_send_ping()
305 rval = qla4xxx_ping_iocb(ha, options, payload_size, in qla4xxx_send_ping()
308 ql4_printk(KERN_WARNING, ha, "%s: iface num = %d " in qla4xxx_send_ping()
322 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " in qla4xxx_send_ping()
325 &ha->ip_config.ipv6_addr0, in qla4xxx_send_ping()
329 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " in qla4xxx_send_ping()
332 &ha->ip_config.ipv6_addr1, in qla4xxx_send_ping()
335 rval = qla4xxx_ping_iocb(ha, options, payload_size, in qla4xxx_send_ping()
581 static void qla4xxx_create_chap_list(struct scsi_qla_host *ha) in qla4xxx_create_chap_list() argument
589 if (is_qla40XX(ha)) in qla4xxx_create_chap_list()
595 chap_size = ha->hw.flt_chap_size / 2; in qla4xxx_create_chap_list()
597 chap_flash_data = dma_alloc_coherent(&ha->pdev->dev, chap_size, in qla4xxx_create_chap_list()
600 ql4_printk(KERN_ERR, ha, "No memory for chap_flash_data\n"); in qla4xxx_create_chap_list()
604 if (is_qla40XX(ha)) { in qla4xxx_create_chap_list()
607 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); in qla4xxx_create_chap_list()
608 if (ha->port_num == 1) in qla4xxx_create_chap_list()
612 rval = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); in qla4xxx_create_chap_list()
616 if (ha->chap_list == NULL) in qla4xxx_create_chap_list()
617 ha->chap_list = vmalloc(chap_size); in qla4xxx_create_chap_list()
618 if (ha->chap_list == NULL) { in qla4xxx_create_chap_list()
619 ql4_printk(KERN_ERR, ha, "No memory for ha->chap_list\n"); in qla4xxx_create_chap_list()
623 memset(ha->chap_list, 0, chap_size); in qla4xxx_create_chap_list()
624 memcpy(ha->chap_list, chap_flash_data, chap_size); in qla4xxx_create_chap_list()
627 dma_free_coherent(&ha->pdev->dev, chap_size, chap_flash_data, chap_dma); in qla4xxx_create_chap_list()
630 static int qla4xxx_get_chap_by_index(struct scsi_qla_host *ha, in qla4xxx_get_chap_by_index() argument
637 if (!ha->chap_list) { in qla4xxx_get_chap_by_index()
638 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); in qla4xxx_get_chap_by_index()
643 if (is_qla80XX(ha)) in qla4xxx_get_chap_by_index()
644 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_chap_by_index()
650 ql4_printk(KERN_ERR, ha, "Invalid Chap index\n"); in qla4xxx_get_chap_by_index()
655 *chap_entry = (struct ql4_chap_table *)ha->chap_list + chap_index; in qla4xxx_get_chap_by_index()
677 static int qla4xxx_find_free_chap_index(struct scsi_qla_host *ha, in qla4xxx_find_free_chap_index() argument
685 if (is_qla80XX(ha)) in qla4xxx_find_free_chap_index()
686 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_find_free_chap_index()
691 if (!ha->chap_list) { in qla4xxx_find_free_chap_index()
692 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); in qla4xxx_find_free_chap_index()
698 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_find_free_chap_index()
722 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_chap_list() local
729 if (is_qla80XX(ha)) in qla4xxx_get_chap_list()
730 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_chap_list()
735 ql4_printk(KERN_INFO, ha, "%s: num_entries = %d, CHAP idx = %d\n", in qla4xxx_get_chap_list()
743 qla4xxx_create_chap_list(ha); in qla4xxx_get_chap_list()
746 mutex_lock(&ha->chap_sem); in qla4xxx_get_chap_list()
748 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_get_chap_list()
774 mutex_unlock(&ha->chap_sem); in qla4xxx_get_chap_list()
777 ql4_printk(KERN_INFO, ha, "%s: Valid CHAP Entries = %d\n", in qla4xxx_get_chap_list()
821 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_delete_chap() local
829 chap_table = dma_pool_alloc(ha->chap_dma_pool, GFP_KERNEL, &chap_dma); in qla4xxx_delete_chap()
835 if (is_qla80XX(ha)) in qla4xxx_delete_chap()
836 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_delete_chap()
850 ql4_printk(KERN_INFO, ha, "CHAP entry %d is in use, cannot " in qla4xxx_delete_chap()
857 if (is_qla40XX(ha)) in qla4xxx_delete_chap()
860 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); in qla4xxx_delete_chap()
864 if (ha->port_num == 1) in qla4xxx_delete_chap()
865 offset += (ha->hw.flt_chap_size / 2); in qla4xxx_delete_chap()
869 ret = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); in qla4xxx_delete_chap()
875 DEBUG2(ql4_printk(KERN_INFO, ha, "Chap Cookie: x%x\n", in qla4xxx_delete_chap()
879 ql4_printk(KERN_ERR, ha, "No valid chap entry found\n"); in qla4xxx_delete_chap()
887 ret = qla4xxx_set_flash(ha, chap_dma, offset, chap_size, in qla4xxx_delete_chap()
889 if (ret == QLA_SUCCESS && ha->chap_list) { in qla4xxx_delete_chap()
890 mutex_lock(&ha->chap_sem); in qla4xxx_delete_chap()
892 memcpy((struct ql4_chap_table *)ha->chap_list + chap_tbl_idx, in qla4xxx_delete_chap()
894 mutex_unlock(&ha->chap_sem); in qla4xxx_delete_chap()
900 dma_pool_free(ha->chap_dma_pool, chap_table, chap_dma); in qla4xxx_delete_chap()
914 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_chap_entry() local
951 ql4_printk(KERN_ERR, ha, in qla4xxx_set_chap_entry()
963 if (is_qla80XX(ha)) in qla4xxx_set_chap_entry()
964 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_set_chap_entry()
969 mutex_lock(&ha->chap_sem); in qla4xxx_set_chap_entry()
971 rc = qla4xxx_get_chap_by_index(ha, chap_rec.chap_tbl_idx, in qla4xxx_set_chap_entry()
975 ql4_printk(KERN_INFO, ha, in qla4xxx_set_chap_entry()
986 ql4_printk(KERN_INFO, ha, in qla4xxx_set_chap_entry()
994 rc = qla4xxx_find_free_chap_index(ha, &chap_rec.chap_tbl_idx); in qla4xxx_set_chap_entry()
996 ql4_printk(KERN_INFO, ha, "CHAP entry not available\n"); in qla4xxx_set_chap_entry()
1002 rc = qla4xxx_set_chap(ha, chap_rec.username, chap_rec.password, in qla4xxx_set_chap_entry()
1006 mutex_unlock(&ha->chap_sem); in qla4xxx_set_chap_entry()
1015 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_host_stats() local
1024 DEBUG2(ql4_printk(KERN_INFO, ha, "Func: %s\n", __func__)); in qla4xxx_get_host_stats()
1029 ql4_printk(KERN_INFO, ha, "%s: host_stats size mismatch expected = %d, is = %d\n", in qla4xxx_get_host_stats()
1043 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, in qla4xxx_get_host_stats()
1046 ql4_printk(KERN_ERR, ha, in qla4xxx_get_host_stats()
1052 ret = qla4xxx_get_mgmt_data(ha, ddb_idx, stats_size, in qla4xxx_get_host_stats()
1055 ql4_printk(KERN_ERR, ha, in qla4xxx_get_host_stats()
1209 dma_free_coherent(&ha->pdev->dev, host_stats_size, in qla4xxx_get_host_stats()
1212 ql4_printk(KERN_INFO, ha, "%s: Get host stats done\n", in qla4xxx_get_host_stats()
1222 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_iface_param() local
1230 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); in qla4xxx_get_iface_param()
1234 &ha->ip_config.subnet_mask); in qla4xxx_get_iface_param()
1237 len = sprintf(buf, "%pI4\n", &ha->ip_config.gateway); in qla4xxx_get_iface_param()
1241 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1244 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1252 (ha->ip_config.tcp_options & in qla4xxx_get_iface_param()
1259 &ha->ip_config.ipv6_addr0); in qla4xxx_get_iface_param()
1262 &ha->ip_config.ipv6_addr1); in qla4xxx_get_iface_param()
1266 &ha->ip_config.ipv6_link_local_addr); in qla4xxx_get_iface_param()
1270 &ha->ip_config.ipv6_default_router_addr); in qla4xxx_get_iface_param()
1273 pval = (ha->ip_config.ipv6_addl_options & in qla4xxx_get_iface_param()
1280 pval = (ha->ip_config.ipv6_addl_options & in qla4xxx_get_iface_param()
1288 ival = ha->ip_config.ipv4_vlan_tag & in qla4xxx_get_iface_param()
1291 ival = ha->ip_config.ipv6_vlan_tag & in qla4xxx_get_iface_param()
1298 ival = (ha->ip_config.ipv4_vlan_tag >> 13) & in qla4xxx_get_iface_param()
1301 ival = (ha->ip_config.ipv6_vlan_tag >> 13) & in qla4xxx_get_iface_param()
1308 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1311 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1317 len = sprintf(buf, "%d\n", ha->ip_config.eth_mtu_size); in qla4xxx_get_iface_param()
1322 ha->ip_config.ipv4_port); in qla4xxx_get_iface_param()
1325 ha->ip_config.ipv6_port); in qla4xxx_get_iface_param()
1330 ha->ip_config.ipv4_addr_state); in qla4xxx_get_iface_param()
1334 ha->ip_config.ipv6_addr0_state); in qla4xxx_get_iface_param()
1337 ha->ip_config.ipv6_addr1_state); in qla4xxx_get_iface_param()
1344 ha->ip_config.ipv6_link_local_state); in qla4xxx_get_iface_param()
1349 ha->ip_config.ipv6_default_router_state); in qla4xxx_get_iface_param()
1354 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1357 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1364 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1367 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1374 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1377 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1386 ha->ip_config.tcp_wsf); in qla4xxx_get_iface_param()
1389 ha->ip_config.ipv6_tcp_wsf); in qla4xxx_get_iface_param()
1393 ival = (ha->ip_config.tcp_options & in qla4xxx_get_iface_param()
1396 ival = (ha->ip_config.ipv6_tcp_options & in qla4xxx_get_iface_param()
1403 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1406 OP_STATE(ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1414 ha->ip_config.ipv4_cache_id); in qla4xxx_get_iface_param()
1417 ha->ip_config.ipv6_cache_id); in qla4xxx_get_iface_param()
1420 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1426 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1432 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1438 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_tos); in qla4xxx_get_iface_param()
1441 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1447 OP_STATE(ha->ip_config.ipv4_options, IPOPT_ALT_CID_EN, in qla4xxx_get_iface_param()
1453 pval = (ha->ip_config.ipv4_alt_cid_len) ? in qla4xxx_get_iface_param()
1454 (char *)ha->ip_config.ipv4_alt_cid : ""; in qla4xxx_get_iface_param()
1459 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1465 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1471 pval = (ha->ip_config.ipv4_vid_len) ? in qla4xxx_get_iface_param()
1472 (char *)ha->ip_config.ipv4_vid : ""; in qla4xxx_get_iface_param()
1477 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1483 OP_STATE(~ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1489 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1496 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1499 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1505 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_ttl); in qla4xxx_get_iface_param()
1508 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1514 OP_STATE(ha->ip_config.ipv6_addl_options, in qla4xxx_get_iface_param()
1520 len = sprintf(buf, "%u\n", ha->ip_config.ipv6_flow_lbl); in qla4xxx_get_iface_param()
1524 ha->ip_config.ipv6_traffic_class); in qla4xxx_get_iface_param()
1528 ha->ip_config.ipv6_hop_limit); in qla4xxx_get_iface_param()
1532 ha->ip_config.ipv6_nd_reach_time); in qla4xxx_get_iface_param()
1536 ha->ip_config.ipv6_nd_rexmit_timer); in qla4xxx_get_iface_param()
1540 ha->ip_config.ipv6_nd_stale_timeout); in qla4xxx_get_iface_param()
1544 ha->ip_config.ipv6_dup_addr_detect_count); in qla4xxx_get_iface_param()
1548 ha->ip_config.ipv6_gw_advrt_mtu); in qla4xxx_get_iface_param()
1556 len = sprintf(buf, "%d\n", ha->ip_config.def_timeout); in qla4xxx_get_iface_param()
1559 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1565 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1571 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1577 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1583 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1589 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1596 (ha->ip_config.iscsi_options & in qla4xxx_get_iface_param()
1601 ha->ip_config.iscsi_max_pdu_size * in qla4xxx_get_iface_param()
1606 ha->ip_config.iscsi_first_burst_len * in qla4xxx_get_iface_param()
1611 ha->ip_config.iscsi_max_outstnd_r2t); in qla4xxx_get_iface_param()
1615 ha->ip_config.iscsi_max_burst_len * in qla4xxx_get_iface_param()
1619 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1625 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1631 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1637 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1643 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1649 len = sprintf(buf, "%s\n", ha->ip_config.iscsi_name); in qla4xxx_get_iface_param()
1666 struct scsi_qla_host *ha; in qla4xxx_ep_connect() local
1676 ha = iscsi_host_priv(shost); in qla4xxx_ep_connect()
1688 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI4\n", __func__, in qla4xxx_ep_connect()
1694 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI6\n", __func__, in qla4xxx_ep_connect()
1697 ql4_printk(KERN_WARNING, ha, "%s: Invalid endpoint\n", in qla4xxx_ep_connect()
1709 struct scsi_qla_host *ha; in qla4xxx_ep_poll() local
1713 ha = to_qla_host(qla_ep->host); in qla4xxx_ep_poll()
1714 DEBUG2(pr_info_ratelimited("%s: host: %ld\n", __func__, ha->host_no)); in qla4xxx_ep_poll()
1716 if (adapter_up(ha) && !test_bit(AF_BUILD_DDB_LIST, &ha->flags)) in qla4xxx_ep_poll()
1725 struct scsi_qla_host *ha; in qla4xxx_ep_disconnect() local
1728 ha = to_qla_host(qla_ep->host); in qla4xxx_ep_disconnect()
1729 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_ep_disconnect()
1730 ha->host_no)); in qla4xxx_ep_disconnect()
1740 struct scsi_qla_host *ha; in qla4xxx_get_ep_param() local
1745 ha = to_qla_host(qla_ep->host); in qla4xxx_get_ep_param()
1746 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_get_ep_param()
1747 ha->host_no)); in qla4xxx_get_ep_param()
1769 struct scsi_qla_host *ha; in qla4xxx_conn_get_stats() local
1778 ha = ddb_entry->ha; in qla4xxx_conn_get_stats()
1780 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_conn_get_stats()
1781 ha->host_no)); in qla4xxx_conn_get_stats()
1784 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, in qla4xxx_conn_get_stats()
1787 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_get_stats()
1792 ret = qla4xxx_get_mgmt_data(ha, ddb_entry->fw_ddb_index, stats_size, in qla4xxx_conn_get_stats()
1795 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_get_stats()
1825 dma_free_coherent(&ha->pdev->dev, stats_size, ql_iscsi_stats, in qla4xxx_conn_get_stats()
1851 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_port_speed() local
1855 qla4xxx_get_firmware_state(ha); in qla4xxx_set_port_speed()
1857 switch (ha->addl_fw_state & 0x0F00) { in qla4xxx_set_port_speed()
1876 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_port_state() local
1880 if (test_bit(AF_LINK_UP, &ha->flags)) in qla4xxx_set_port_state()
1889 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_host_get_param() local
1894 len = sysfs_format_mac(buf, ha->my_mac, MAC_ADDR_LEN); in qla4xxx_host_get_param()
1897 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); in qla4xxx_host_get_param()
1900 len = sprintf(buf, "%s\n", ha->name_string); in qla4xxx_host_get_param()
1917 static void qla4xxx_create_ipv4_iface(struct scsi_qla_host *ha) in qla4xxx_create_ipv4_iface() argument
1919 if (ha->iface_ipv4) in qla4xxx_create_ipv4_iface()
1923 ha->iface_ipv4 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv4_iface()
1926 if (!ha->iface_ipv4) in qla4xxx_create_ipv4_iface()
1927 ql4_printk(KERN_ERR, ha, "Could not create IPv4 iSCSI " in qla4xxx_create_ipv4_iface()
1931 static void qla4xxx_create_ipv6_iface(struct scsi_qla_host *ha) in qla4xxx_create_ipv6_iface() argument
1933 if (!ha->iface_ipv6_0) in qla4xxx_create_ipv6_iface()
1935 ha->iface_ipv6_0 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv6_iface()
1939 if (!ha->iface_ipv6_0) in qla4xxx_create_ipv6_iface()
1940 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " in qla4xxx_create_ipv6_iface()
1943 if (!ha->iface_ipv6_1) in qla4xxx_create_ipv6_iface()
1945 ha->iface_ipv6_1 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv6_iface()
1949 if (!ha->iface_ipv6_1) in qla4xxx_create_ipv6_iface()
1950 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " in qla4xxx_create_ipv6_iface()
1954 static void qla4xxx_create_ifaces(struct scsi_qla_host *ha) in qla4xxx_create_ifaces() argument
1956 if (ha->ip_config.ipv4_options & IPOPT_IPV4_PROTOCOL_ENABLE) in qla4xxx_create_ifaces()
1957 qla4xxx_create_ipv4_iface(ha); in qla4xxx_create_ifaces()
1959 if (ha->ip_config.ipv6_options & IPV6_OPT_IPV6_PROTOCOL_ENABLE) in qla4xxx_create_ifaces()
1960 qla4xxx_create_ipv6_iface(ha); in qla4xxx_create_ifaces()
1963 static void qla4xxx_destroy_ipv4_iface(struct scsi_qla_host *ha) in qla4xxx_destroy_ipv4_iface() argument
1965 if (ha->iface_ipv4) { in qla4xxx_destroy_ipv4_iface()
1966 iscsi_destroy_iface(ha->iface_ipv4); in qla4xxx_destroy_ipv4_iface()
1967 ha->iface_ipv4 = NULL; in qla4xxx_destroy_ipv4_iface()
1971 static void qla4xxx_destroy_ipv6_iface(struct scsi_qla_host *ha) in qla4xxx_destroy_ipv6_iface() argument
1973 if (ha->iface_ipv6_0) { in qla4xxx_destroy_ipv6_iface()
1974 iscsi_destroy_iface(ha->iface_ipv6_0); in qla4xxx_destroy_ipv6_iface()
1975 ha->iface_ipv6_0 = NULL; in qla4xxx_destroy_ipv6_iface()
1977 if (ha->iface_ipv6_1) { in qla4xxx_destroy_ipv6_iface()
1978 iscsi_destroy_iface(ha->iface_ipv6_1); in qla4xxx_destroy_ipv6_iface()
1979 ha->iface_ipv6_1 = NULL; in qla4xxx_destroy_ipv6_iface()
1983 static void qla4xxx_destroy_ifaces(struct scsi_qla_host *ha) in qla4xxx_destroy_ifaces() argument
1985 qla4xxx_destroy_ipv4_iface(ha); in qla4xxx_destroy_ifaces()
1986 qla4xxx_destroy_ipv6_iface(ha); in qla4xxx_destroy_ifaces()
1989 static void qla4xxx_set_ipv6(struct scsi_qla_host *ha, in qla4xxx_set_ipv6() argument
2034 ql4_printk(KERN_ERR, ha, in qla4xxx_set_ipv6()
2051 ql4_printk(KERN_ERR, ha, in qla4xxx_set_ipv6()
2067 qla4xxx_create_ipv6_iface(ha); in qla4xxx_set_ipv6()
2072 qla4xxx_destroy_ipv6_iface(ha); in qla4xxx_set_ipv6()
2232 ql4_printk(KERN_ERR, ha, "Unknown IPv6 param = %d\n", in qla4xxx_set_ipv6()
2238 static void qla4xxx_set_ipv4(struct scsi_qla_host *ha, in qla4xxx_set_ipv4() argument
2263 ql4_printk(KERN_ERR, ha, "Invalid IPv4 bootproto\n"); in qla4xxx_set_ipv4()
2269 qla4xxx_create_ipv4_iface(ha); in qla4xxx_set_ipv4()
2274 qla4xxx_destroy_ipv4_iface(ha); in qla4xxx_set_ipv4()
2490 ql4_printk(KERN_ERR, ha, "Unknown IPv4 param = %d\n", in qla4xxx_set_ipv4()
2496 static void qla4xxx_set_iscsi_param(struct scsi_qla_host *ha, in qla4xxx_set_iscsi_param() argument
2652 ql4_printk(KERN_ERR, ha, "Unknown iscsi param = %d\n", in qla4xxx_set_iscsi_param()
2683 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_iface_set_param() local
2693 init_fw_cb = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_iface_set_param()
2697 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc init_cb\n", in qla4xxx_iface_set_param()
2706 if (qla4xxx_get_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma)) { in qla4xxx_iface_set_param()
2707 ql4_printk(KERN_ERR, ha, "%s: get ifcb failed\n", __func__); in qla4xxx_iface_set_param()
2720 qla4xxx_set_ipv4(ha, iface_param, in qla4xxx_iface_set_param()
2725 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2735 qla4xxx_set_ipv6(ha, iface_param, in qla4xxx_iface_set_param()
2740 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2747 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2752 qla4xxx_set_iscsi_param(ha, iface_param, in qla4xxx_iface_set_param()
2761 rval = qla4xxx_set_flash(ha, init_fw_cb_dma, FLASH_SEGMENT_IFCB, in qla4xxx_iface_set_param()
2765 ql4_printk(KERN_ERR, ha, "%s: set flash mbx failed\n", in qla4xxx_iface_set_param()
2771 rval = qla4xxx_disable_acb(ha); in qla4xxx_iface_set_param()
2773 ql4_printk(KERN_ERR, ha, "%s: disable acb mbx failed\n", in qla4xxx_iface_set_param()
2779 wait_for_completion_timeout(&ha->disable_acb_comp, in qla4xxx_iface_set_param()
2784 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma); in qla4xxx_iface_set_param()
2786 ql4_printk(KERN_ERR, ha, "%s: set acb mbx failed\n", in qla4xxx_iface_set_param()
2793 qla4xxx_update_local_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb, in qla4xxx_iface_set_param()
2797 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk), in qla4xxx_iface_set_param()
2808 struct scsi_qla_host *ha = ddb_entry->ha; in qla4xxx_session_get_param() local
2817 rval = qla4xxx_get_chap_index(ha, sess->username_in, in qla4xxx_session_get_param()
2834 rval = qla4xxx_get_chap_index(ha, sess->username, in qla4xxx_session_get_param()
2853 rval = qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, in qla4xxx_session_get_param()
2894 int qla4xxx_get_ddb_index(struct scsi_qla_host *ha, uint16_t *ddb_index) in qla4xxx_get_ddb_index() argument
2901 tmp_ddb_index = find_first_zero_bit(ha->ddb_idx_map, MAX_DDB_ENTRIES); in qla4xxx_get_ddb_index()
2904 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2910 if (test_and_set_bit(tmp_ddb_index, ha->ddb_idx_map)) in qla4xxx_get_ddb_index()
2913 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2915 ret = qla4xxx_req_ddb_entry(ha, tmp_ddb_index, &mbx_sts); in qla4xxx_get_ddb_index()
2918 ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2923 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2933 static int qla4xxx_match_ipaddress(struct scsi_qla_host *ha, in qla4xxx_match_ipaddress() argument
2967 static int qla4xxx_match_fwdb_session(struct scsi_qla_host *ha, in qla4xxx_match_fwdb_session() argument
2984 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_match_fwdb_session()
2988 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_match_fwdb_session()
3003 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3008 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3013 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3020 rval = qla4xxx_match_ipaddress(ha, ddb_entry, in qla4xxx_match_fwdb_session()
3033 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3044 struct scsi_qla_host *ha; in qla4xxx_session_create() local
3059 ha = to_qla_host(qla_ep->host); in qla4xxx_session_create()
3060 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_session_create()
3061 ha->host_no)); in qla4xxx_session_create()
3063 ret = qla4xxx_get_ddb_index(ha, &ddb_index); in qla4xxx_session_create()
3078 ddb_entry->ha = ha; in qla4xxx_session_create()
3084 ha->fw_ddb_index_map[ddb_entry->fw_ddb_index] = ddb_entry; in qla4xxx_session_create()
3085 ha->tot_ddbs++; in qla4xxx_session_create()
3094 struct scsi_qla_host *ha; in qla4xxx_session_destroy() local
3103 ha = ddb_entry->ha; in qla4xxx_session_destroy()
3104 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_session_destroy()
3105 ha->host_no)); in qla4xxx_session_destroy()
3107 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_session_destroy()
3110 ql4_printk(KERN_ERR, ha, in qla4xxx_session_destroy()
3117 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_session_destroy()
3132 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_session_destroy()
3134 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); in qla4xxx_session_destroy()
3135 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_session_destroy()
3136 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_session_destroy()
3137 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_session_destroy()
3142 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_session_destroy()
3152 struct scsi_qla_host *ha; in qla4xxx_conn_create() local
3166 ha = ddb_entry->ha; in qla4xxx_conn_create()
3167 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: conn_idx = %u\n", __func__, in qla4xxx_conn_create()
3180 struct scsi_qla_host *ha; in qla4xxx_conn_bind() local
3185 ha = ddb_entry->ha; in qla4xxx_conn_bind()
3187 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, in qla4xxx_conn_bind()
3204 struct scsi_qla_host *ha; in qla4xxx_conn_start() local
3213 ha = ddb_entry->ha; in qla4xxx_conn_start()
3214 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, in qla4xxx_conn_start()
3221 ret = qla4xxx_match_fwdb_session(ha, cls_conn); in qla4xxx_conn_start()
3223 ql4_printk(KERN_INFO, ha, in qla4xxx_conn_start()
3229 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_conn_start()
3232 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_start()
3238 ret = qla4xxx_set_param_ddbentry(ha, ddb_entry, cls_conn, &mbx_sts); in qla4xxx_conn_start()
3252 ql4_printk(KERN_ERR, ha, "%s: Failed set param for index[%d]\n", in qla4xxx_conn_start()
3257 status = qla4xxx_conn_open(ha, ddb_entry->fw_ddb_index); in qla4xxx_conn_start()
3259 ql4_printk(KERN_ERR, ha, "%s: Login failed: %s\n", __func__, in qla4xxx_conn_start()
3276 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_conn_start()
3285 struct scsi_qla_host *ha; in qla4xxx_conn_destroy() local
3291 ha = ddb_entry->ha; in qla4xxx_conn_destroy()
3292 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: cid = %d\n", __func__, in qla4xxx_conn_destroy()
3296 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) in qla4xxx_conn_destroy()
3297 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); in qla4xxx_conn_destroy()
3303 struct scsi_qla_host *ha; in qla4xxx_task_work() local
3314 ha = task_data->ha; in qla4xxx_task_work()
3337 ql4_printk(KERN_ERR, ha, "Passthru failed status = 0x%x\n", in qla4xxx_task_work()
3349 struct scsi_qla_host *ha; in qla4xxx_alloc_pdu() local
3354 ha = ddb_entry->ha; in qla4xxx_alloc_pdu()
3359 ql4_printk(KERN_INFO, ha, in qla4xxx_alloc_pdu()
3365 task_data->ha = ha; in qla4xxx_alloc_pdu()
3369 task_data->data_dma = dma_map_single(&ha->pdev->dev, task->data, in qla4xxx_alloc_pdu()
3374 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", in qla4xxx_alloc_pdu()
3378 task_data->resp_buffer = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_alloc_pdu()
3386 task_data->req_buffer = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_alloc_pdu()
3401 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, in qla4xxx_alloc_pdu()
3405 dma_free_coherent(&ha->pdev->dev, task_data->req_len, in qla4xxx_alloc_pdu()
3415 struct scsi_qla_host *ha; in qla4xxx_task_cleanup() local
3421 ha = ddb_entry->ha; in qla4xxx_task_cleanup()
3425 dma_unmap_single(&ha->pdev->dev, task_data->data_dma, in qla4xxx_task_cleanup()
3429 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", in qla4xxx_task_cleanup()
3432 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, in qla4xxx_task_cleanup()
3434 dma_free_coherent(&ha->pdev->dev, task_data->req_len, in qla4xxx_task_cleanup()
3444 struct scsi_qla_host *ha = ddb_entry->ha; in qla4xxx_task_xmit() local
3449 ql4_printk(KERN_INFO, ha, "%s: scsi cmd xmit not implemented\n", in qla4xxx_task_xmit()
3802 static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha, in qla4xxx_copy_fwddb_param() argument
3844 (char *)ha->name_string, buflen); in qla4xxx_copy_fwddb_param()
3847 if (!qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, in qla4xxx_copy_fwddb_param()
3860 void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha, in qla4xxx_update_session_conn_fwddb_param() argument
3869 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_fwddb_param()
3872 ql4_printk(KERN_ERR, ha, in qla4xxx_update_session_conn_fwddb_param()
3877 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, in qla4xxx_update_session_conn_fwddb_param()
3880 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " in qla4xxx_update_session_conn_fwddb_param()
3882 ha->host_no, __func__, in qla4xxx_update_session_conn_fwddb_param()
3892 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); in qla4xxx_update_session_conn_fwddb_param()
3896 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_fwddb_param()
3900 void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, in qla4xxx_update_session_conn_param() argument
3911 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_param()
3914 ql4_printk(KERN_ERR, ha, in qla4xxx_update_session_conn_param()
3919 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, in qla4xxx_update_session_conn_param()
3922 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " in qla4xxx_update_session_conn_param()
3924 ha->host_no, __func__, in qla4xxx_update_session_conn_param()
3947 memcpy(sess->initiatorname, ha->name_string, in qla4xxx_update_session_conn_param()
3948 min(sizeof(ha->name_string), sizeof(sess->initiatorname))); in qla4xxx_update_session_conn_param()
3952 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_param()
3960 static void qla4xxx_start_timer(struct scsi_qla_host *ha, void *func, in qla4xxx_start_timer() argument
3964 __func__, ha->host->host_no)); in qla4xxx_start_timer()
3965 init_timer(&ha->timer); in qla4xxx_start_timer()
3966 ha->timer.expires = jiffies + interval * HZ; in qla4xxx_start_timer()
3967 ha->timer.data = (unsigned long)ha; in qla4xxx_start_timer()
3968 ha->timer.function = (void (*)(unsigned long))func; in qla4xxx_start_timer()
3969 add_timer(&ha->timer); in qla4xxx_start_timer()
3970 ha->timer_active = 1; in qla4xxx_start_timer()
3973 static void qla4xxx_stop_timer(struct scsi_qla_host *ha) in qla4xxx_stop_timer() argument
3975 del_timer_sync(&ha->timer); in qla4xxx_stop_timer()
3976 ha->timer_active = 0; in qla4xxx_stop_timer()
3997 void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha) in qla4xxx_mark_all_devices_missing() argument
3999 iscsi_host_for_each_session(ha->host, qla4xxx_mark_device_missing); in qla4xxx_mark_all_devices_missing()
4002 static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha, in qla4xxx_get_new_srb() argument
4008 srb = mempool_alloc(ha->srb_mempool, GFP_ATOMIC); in qla4xxx_get_new_srb()
4013 srb->ha = ha; in qla4xxx_get_new_srb()
4022 static void qla4xxx_srb_free_dma(struct scsi_qla_host *ha, struct srb *srb) in qla4xxx_srb_free_dma() argument
4037 struct scsi_qla_host *ha = srb->ha; in qla4xxx_srb_compl() local
4039 qla4xxx_srb_free_dma(ha, srb); in qla4xxx_srb_compl()
4041 mempool_free(srb, ha->srb_mempool); in qla4xxx_srb_compl()
4061 struct scsi_qla_host *ha = to_qla_host(host); in qla4xxx_queuecommand() local
4067 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_queuecommand()
4068 if (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags)) in qla4xxx_queuecommand()
4086 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_queuecommand()
4087 test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || in qla4xxx_queuecommand()
4088 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_queuecommand()
4089 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || in qla4xxx_queuecommand()
4090 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || in qla4xxx_queuecommand()
4091 !test_bit(AF_ONLINE, &ha->flags) || in qla4xxx_queuecommand()
4092 !test_bit(AF_LINK_UP, &ha->flags) || in qla4xxx_queuecommand()
4093 test_bit(AF_LOOPBACK, &ha->flags) || in qla4xxx_queuecommand()
4094 test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags) || in qla4xxx_queuecommand()
4095 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags) || in qla4xxx_queuecommand()
4096 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) in qla4xxx_queuecommand()
4099 srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd); in qla4xxx_queuecommand()
4103 rval = qla4xxx_send_command_to_isp(ha, srb); in qla4xxx_queuecommand()
4110 qla4xxx_srb_free_dma(ha, srb); in qla4xxx_queuecommand()
4111 mempool_free(srb, ha->srb_mempool); in qla4xxx_queuecommand()
4128 static void qla4xxx_mem_free(struct scsi_qla_host *ha) in qla4xxx_mem_free() argument
4130 if (ha->queues) in qla4xxx_mem_free()
4131 dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues, in qla4xxx_mem_free()
4132 ha->queues_dma); in qla4xxx_mem_free()
4134 if (ha->fw_dump) in qla4xxx_mem_free()
4135 vfree(ha->fw_dump); in qla4xxx_mem_free()
4137 ha->queues_len = 0; in qla4xxx_mem_free()
4138 ha->queues = NULL; in qla4xxx_mem_free()
4139 ha->queues_dma = 0; in qla4xxx_mem_free()
4140 ha->request_ring = NULL; in qla4xxx_mem_free()
4141 ha->request_dma = 0; in qla4xxx_mem_free()
4142 ha->response_ring = NULL; in qla4xxx_mem_free()
4143 ha->response_dma = 0; in qla4xxx_mem_free()
4144 ha->shadow_regs = NULL; in qla4xxx_mem_free()
4145 ha->shadow_regs_dma = 0; in qla4xxx_mem_free()
4146 ha->fw_dump = NULL; in qla4xxx_mem_free()
4147 ha->fw_dump_size = 0; in qla4xxx_mem_free()
4150 if (ha->srb_mempool) in qla4xxx_mem_free()
4151 mempool_destroy(ha->srb_mempool); in qla4xxx_mem_free()
4153 ha->srb_mempool = NULL; in qla4xxx_mem_free()
4155 if (ha->chap_dma_pool) in qla4xxx_mem_free()
4156 dma_pool_destroy(ha->chap_dma_pool); in qla4xxx_mem_free()
4158 if (ha->chap_list) in qla4xxx_mem_free()
4159 vfree(ha->chap_list); in qla4xxx_mem_free()
4160 ha->chap_list = NULL; in qla4xxx_mem_free()
4162 if (ha->fw_ddb_dma_pool) in qla4xxx_mem_free()
4163 dma_pool_destroy(ha->fw_ddb_dma_pool); in qla4xxx_mem_free()
4166 if (is_qla8022(ha)) { in qla4xxx_mem_free()
4167 if (ha->nx_pcibase) in qla4xxx_mem_free()
4169 (struct device_reg_82xx __iomem *)ha->nx_pcibase); in qla4xxx_mem_free()
4170 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_mem_free()
4171 if (ha->nx_pcibase) in qla4xxx_mem_free()
4173 (struct device_reg_83xx __iomem *)ha->nx_pcibase); in qla4xxx_mem_free()
4174 } else if (ha->reg) { in qla4xxx_mem_free()
4175 iounmap(ha->reg); in qla4xxx_mem_free()
4178 if (ha->reset_tmplt.buff) in qla4xxx_mem_free()
4179 vfree(ha->reset_tmplt.buff); in qla4xxx_mem_free()
4181 pci_release_regions(ha->pdev); in qla4xxx_mem_free()
4191 static int qla4xxx_mem_alloc(struct scsi_qla_host *ha) in qla4xxx_mem_alloc() argument
4196 ha->queues_len = ((REQUEST_QUEUE_DEPTH * QUEUE_SIZE) + in qla4xxx_mem_alloc()
4201 ha->queues = dma_alloc_coherent(&ha->pdev->dev, ha->queues_len, in qla4xxx_mem_alloc()
4202 &ha->queues_dma, GFP_KERNEL); in qla4xxx_mem_alloc()
4203 if (ha->queues == NULL) { in qla4xxx_mem_alloc()
4204 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4209 memset(ha->queues, 0, ha->queues_len); in qla4xxx_mem_alloc()
4216 if ((unsigned long)ha->queues_dma & (MEM_ALIGN_VALUE - 1)) in qla4xxx_mem_alloc()
4217 align = MEM_ALIGN_VALUE - ((unsigned long)ha->queues_dma & in qla4xxx_mem_alloc()
4221 ha->request_dma = ha->queues_dma + align; in qla4xxx_mem_alloc()
4222 ha->request_ring = (struct queue_entry *) (ha->queues + align); in qla4xxx_mem_alloc()
4223 ha->response_dma = ha->queues_dma + align + in qla4xxx_mem_alloc()
4225 ha->response_ring = (struct queue_entry *) (ha->queues + align + in qla4xxx_mem_alloc()
4228 ha->shadow_regs_dma = ha->queues_dma + align + in qla4xxx_mem_alloc()
4231 ha->shadow_regs = (struct shadow_regs *) (ha->queues + align + in qla4xxx_mem_alloc()
4238 ha->srb_mempool = mempool_create(SRB_MIN_REQ, mempool_alloc_slab, in qla4xxx_mem_alloc()
4240 if (ha->srb_mempool == NULL) { in qla4xxx_mem_alloc()
4241 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4247 ha->chap_dma_pool = dma_pool_create("ql4_chap", &ha->pdev->dev, in qla4xxx_mem_alloc()
4250 if (ha->chap_dma_pool == NULL) { in qla4xxx_mem_alloc()
4251 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4256 ha->fw_ddb_dma_pool = dma_pool_create("ql4_fw_ddb", &ha->pdev->dev, in qla4xxx_mem_alloc()
4259 if (ha->fw_ddb_dma_pool == NULL) { in qla4xxx_mem_alloc()
4260 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4269 qla4xxx_mem_free(ha); in qla4xxx_mem_alloc()
4279 static int qla4_8xxx_check_temp(struct scsi_qla_host *ha) in qla4_8xxx_check_temp() argument
4284 temp = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_TEMP_STATE); in qla4_8xxx_check_temp()
4290 ql4_printk(KERN_WARNING, ha, "Device temperature %d degrees C" in qla4_8xxx_check_temp()
4295 if (ha->temperature == QLA82XX_TEMP_NORMAL) in qla4_8xxx_check_temp()
4296 ql4_printk(KERN_WARNING, ha, "Device temperature %d" in qla4_8xxx_check_temp()
4300 if (ha->temperature == QLA82XX_TEMP_WARN) in qla4_8xxx_check_temp()
4301 ql4_printk(KERN_INFO, ha, "Device temperature is" in qla4_8xxx_check_temp()
4305 ha->temperature = temp_state; in qla4_8xxx_check_temp()
4315 static int qla4_8xxx_check_fw_alive(struct scsi_qla_host *ha) in qla4_8xxx_check_fw_alive() argument
4320 fw_heartbeat_counter = qla4_8xxx_rd_direct(ha, in qla4_8xxx_check_fw_alive()
4326 ha->host_no, __func__)); in qla4_8xxx_check_fw_alive()
4330 if (ha->fw_heartbeat_counter == fw_heartbeat_counter) { in qla4_8xxx_check_fw_alive()
4331 ha->seconds_since_last_heartbeat++; in qla4_8xxx_check_fw_alive()
4333 if (ha->seconds_since_last_heartbeat == 2) { in qla4_8xxx_check_fw_alive()
4334 ha->seconds_since_last_heartbeat = 0; in qla4_8xxx_check_fw_alive()
4335 qla4_8xxx_dump_peg_reg(ha); in qla4_8xxx_check_fw_alive()
4339 ha->seconds_since_last_heartbeat = 0; in qla4_8xxx_check_fw_alive()
4341 ha->fw_heartbeat_counter = fw_heartbeat_counter; in qla4_8xxx_check_fw_alive()
4345 static void qla4_8xxx_process_fw_error(struct scsi_qla_host *ha) in qla4_8xxx_process_fw_error() argument
4350 halt_status = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_HALT_STATUS1); in qla4_8xxx_process_fw_error()
4352 if (is_qla8022(ha)) { in qla4_8xxx_process_fw_error()
4353 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4_8xxx_process_fw_error()
4355 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, in qla4_8xxx_process_fw_error()
4360 …ql4_printk(KERN_ERR, ha, "%s: Firmware aborted with error code 0x00006700. Device is being reset\n… in qla4_8xxx_process_fw_error()
4364 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_process_fw_error()
4366 ql4_printk(KERN_ERR, ha, "%s: Firmware error detected device is being reset\n", in qla4_8xxx_process_fw_error()
4377 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); in qla4_8xxx_process_fw_error()
4379 ql4_printk(KERN_INFO, ha, "%s: detect abort needed!\n", in qla4_8xxx_process_fw_error()
4381 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4_8xxx_process_fw_error()
4383 qla4xxx_mailbox_premature_completion(ha); in qla4_8xxx_process_fw_error()
4384 qla4xxx_wake_dpc(ha); in qla4_8xxx_process_fw_error()
4393 void qla4_8xxx_watchdog(struct scsi_qla_host *ha) in qla4_8xxx_watchdog() argument
4398 if (is_qla8032(ha) && in qla4_8xxx_watchdog()
4399 (qla4_83xx_is_detached(ha) == QLA_SUCCESS)) in qla4_8xxx_watchdog()
4401 __func__, ha->func_num); in qla4_8xxx_watchdog()
4404 if (!(test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || in qla4_8xxx_watchdog()
4405 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4_8xxx_watchdog()
4406 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags))) { in qla4_8xxx_watchdog()
4407 dev_state = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE); in qla4_8xxx_watchdog()
4409 if (qla4_8xxx_check_temp(ha)) { in qla4_8xxx_watchdog()
4410 if (is_qla8022(ha)) { in qla4_8xxx_watchdog()
4411 ql4_printk(KERN_INFO, ha, "disabling pause transmit on port 0 & 1.\n"); in qla4_8xxx_watchdog()
4412 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, in qla4_8xxx_watchdog()
4416 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); in qla4_8xxx_watchdog()
4417 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4419 !test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4_8xxx_watchdog()
4421 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED RESET!\n", in qla4_8xxx_watchdog()
4424 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_watchdog()
4425 idc_ctrl = qla4_83xx_rd_reg(ha, in qla4_8xxx_watchdog()
4428 ql4_printk(KERN_INFO, ha, "%s: Graceful reset bit is not set\n", in qla4_8xxx_watchdog()
4431 ha); in qla4_8xxx_watchdog()
4435 if ((is_qla8032(ha) || is_qla8042(ha)) || in qla4_8xxx_watchdog()
4436 (is_qla8022(ha) && !ql4xdontresethba)) { in qla4_8xxx_watchdog()
4437 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4_8xxx_watchdog()
4438 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4441 !test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { in qla4_8xxx_watchdog()
4442 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED QUIES!\n", in qla4_8xxx_watchdog()
4444 set_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags); in qla4_8xxx_watchdog()
4445 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4448 if (qla4_8xxx_check_fw_alive(ha)) in qla4_8xxx_watchdog()
4449 qla4_8xxx_process_fw_error(ha); in qla4_8xxx_watchdog()
4458 struct scsi_qla_host *ha; in qla4xxx_check_relogin_flash_ddb() local
4462 ha = ddb_entry->ha; in qla4xxx_check_relogin_flash_ddb()
4467 if (adapter_up(ha) && !test_bit(DF_RELOGIN, &ddb_entry->flags) && in qla4xxx_check_relogin_flash_ddb()
4475 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_check_relogin_flash_ddb()
4477 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_check_relogin_flash_ddb()
4495 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_check_relogin_flash_ddb()
4501 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_check_relogin_flash_ddb()
4512 static void qla4xxx_timer(struct scsi_qla_host *ha) in qla4xxx_timer() argument
4517 iscsi_host_for_each_session(ha->host, qla4xxx_check_relogin_flash_ddb); in qla4xxx_timer()
4522 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_timer()
4523 mod_timer(&ha->timer, jiffies + HZ); in qla4xxx_timer()
4528 if (!pci_channel_offline(ha->pdev)) in qla4xxx_timer()
4529 pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w); in qla4xxx_timer()
4531 if (is_qla80XX(ha)) in qla4xxx_timer()
4532 qla4_8xxx_watchdog(ha); in qla4xxx_timer()
4534 if (is_qla40XX(ha)) { in qla4xxx_timer()
4536 if (ha->firmware_options & FWOPT_HEARTBEAT_ENABLE && in qla4xxx_timer()
4537 ha->heartbeat_interval != 0) { in qla4xxx_timer()
4538 ha->seconds_since_last_heartbeat++; in qla4xxx_timer()
4539 if (ha->seconds_since_last_heartbeat > in qla4xxx_timer()
4540 ha->heartbeat_interval + 2) in qla4xxx_timer()
4541 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_timer()
4546 if (!list_empty(&ha->work_list)) in qla4xxx_timer()
4551 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_timer()
4552 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags) || in qla4xxx_timer()
4553 test_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags) || in qla4xxx_timer()
4554 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || in qla4xxx_timer()
4555 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_timer()
4556 test_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags) || in qla4xxx_timer()
4557 test_bit(DPC_LINK_CHANGED, &ha->dpc_flags) || in qla4xxx_timer()
4558 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || in qla4xxx_timer()
4559 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || in qla4xxx_timer()
4560 test_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags) || in qla4xxx_timer()
4561 test_bit(DPC_AEN, &ha->dpc_flags)) { in qla4xxx_timer()
4564 ha->host_no, __func__, ha->dpc_flags)); in qla4xxx_timer()
4565 qla4xxx_wake_dpc(ha); in qla4xxx_timer()
4569 mod_timer(&ha->timer, jiffies + HZ); in qla4xxx_timer()
4571 DEBUG2(ha->seconds_since_last_intr++); in qla4xxx_timer()
4581 static int qla4xxx_cmd_wait(struct scsi_qla_host *ha) in qla4xxx_cmd_wait() argument
4589 if (is_qla40XX(ha)) in qla4xxx_cmd_wait()
4592 wtmo = ha->nx_reset_timeout / 2; in qla4xxx_cmd_wait()
4596 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_cmd_wait()
4601 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_cmd_wait()
4603 for (index = 0; index < ha->host->can_queue; index++) { in qla4xxx_cmd_wait()
4604 cmd = scsi_host_find_tag(ha->host, index); in qla4xxx_cmd_wait()
4614 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_cmd_wait()
4617 if (index == ha->host->can_queue) in qla4xxx_cmd_wait()
4627 int qla4xxx_hw_reset(struct scsi_qla_host *ha) in qla4xxx_hw_reset() argument
4632 DEBUG2(printk(KERN_ERR "scsi%ld: %s\n", ha->host_no, __func__)); in qla4xxx_hw_reset()
4634 if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS) in qla4xxx_hw_reset()
4637 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_hw_reset()
4643 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_hw_reset()
4645 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_hw_reset()
4648 writel(set_rmask(CSR_SOFT_RESET), &ha->reg->ctrl_status); in qla4xxx_hw_reset()
4649 readl(&ha->reg->ctrl_status); in qla4xxx_hw_reset()
4651 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_hw_reset()
4659 int qla4xxx_soft_reset(struct scsi_qla_host *ha) in qla4xxx_soft_reset() argument
4666 status = qla4xxx_hw_reset(ha); in qla4xxx_soft_reset()
4674 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4675 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4676 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4688 ha->host_no)); in qla4xxx_soft_reset()
4689 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4690 writel(set_rmask(CSR_NET_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4691 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4692 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4698 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4699 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4700 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4714 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4715 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4717 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4718 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4720 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4730 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4731 writel(set_rmask(CSR_FORCE_SOFT_RESET), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4732 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4733 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4737 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4738 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4739 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4763 static void qla4xxx_abort_active_cmds(struct scsi_qla_host *ha, int res) in qla4xxx_abort_active_cmds() argument
4769 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_abort_active_cmds()
4770 for (i = 0; i < ha->host->can_queue; i++) { in qla4xxx_abort_active_cmds()
4771 srb = qla4xxx_del_from_active_array(ha, i); in qla4xxx_abort_active_cmds()
4777 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_abort_active_cmds()
4780 void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha) in qla4xxx_dead_adapter_cleanup() argument
4782 clear_bit(AF_ONLINE, &ha->flags); in qla4xxx_dead_adapter_cleanup()
4785 ql4_printk(KERN_INFO, ha, "Disabling the board\n"); in qla4xxx_dead_adapter_cleanup()
4787 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_dead_adapter_cleanup()
4788 qla4xxx_mark_all_devices_missing(ha); in qla4xxx_dead_adapter_cleanup()
4789 clear_bit(AF_INIT_DONE, &ha->flags); in qla4xxx_dead_adapter_cleanup()
4812 static int qla4xxx_recover_adapter(struct scsi_qla_host *ha) in qla4xxx_recover_adapter() argument
4820 scsi_block_requests(ha->host); in qla4xxx_recover_adapter()
4821 clear_bit(AF_ONLINE, &ha->flags); in qla4xxx_recover_adapter()
4822 clear_bit(AF_LINK_UP, &ha->flags); in qla4xxx_recover_adapter()
4824 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: adapter OFFLINE\n", __func__)); in qla4xxx_recover_adapter()
4826 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4xxx_recover_adapter()
4828 if ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_recover_adapter()
4829 !test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4830 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4xxx_recover_adapter()
4833 qla4_83xx_disable_pause(ha); in qla4xxx_recover_adapter()
4836 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); in qla4xxx_recover_adapter()
4838 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_recover_adapter()
4843 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4850 if (is_qla80XX(ha) && !reset_chip && in qla4xxx_recover_adapter()
4851 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4853 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_recover_adapter()
4855 ha->host_no, __func__)); in qla4xxx_recover_adapter()
4856 status = ha->isp_ops->reset_firmware(ha); in qla4xxx_recover_adapter()
4858 ha->isp_ops->disable_intrs(ha); in qla4xxx_recover_adapter()
4859 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4860 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_recover_adapter()
4865 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_recover_adapter()
4866 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4873 if (is_qla40XX(ha) || reset_chip) { in qla4xxx_recover_adapter()
4874 if (is_qla40XX(ha)) in qla4xxx_recover_adapter()
4880 if (test_bit(AF_FW_RECOVERY, &ha->flags)) in qla4xxx_recover_adapter()
4885 if (qla4_8xxx_check_fw_alive(ha)) { in qla4xxx_recover_adapter()
4886 qla4xxx_mailbox_premature_completion(ha); in qla4xxx_recover_adapter()
4894 if (!test_bit(AF_FW_RECOVERY, &ha->flags)) in qla4xxx_recover_adapter()
4895 qla4xxx_cmd_wait(ha); in qla4xxx_recover_adapter()
4897 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4898 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_recover_adapter()
4900 ha->host_no, __func__)); in qla4xxx_recover_adapter()
4901 status = ha->isp_ops->reset_chip(ha); in qla4xxx_recover_adapter()
4902 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_recover_adapter()
4906 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4914 if (is_qla40XX(ha) && (ha->mac_index == 3)) in qla4xxx_recover_adapter()
4919 status = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4xxx_recover_adapter()
4920 if (is_qla80XX(ha) && (status == QLA_ERROR)) { in qla4xxx_recover_adapter()
4921 status = qla4_8xxx_check_init_adapter_retry(ha); in qla4xxx_recover_adapter()
4923 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Don't retry recover adapter\n", in qla4xxx_recover_adapter()
4924 ha->host_no, __func__); in qla4xxx_recover_adapter()
4925 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4926 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4927 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4929 &ha->dpc_flags); in qla4xxx_recover_adapter()
4938 if (!test_bit(AF_ONLINE, &ha->flags) && in qla4xxx_recover_adapter()
4939 !test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4945 if (is_qla80XX(ha)) { in qla4xxx_recover_adapter()
4946 ha->isp_ops->idc_lock(ha); in qla4xxx_recover_adapter()
4947 dev_state = qla4_8xxx_rd_direct(ha, in qla4xxx_recover_adapter()
4949 ha->isp_ops->idc_unlock(ha); in qla4xxx_recover_adapter()
4951 ql4_printk(KERN_INFO, ha, "%s: don't retry " in qla4xxx_recover_adapter()
4954 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4955 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4956 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4958 &ha->dpc_flags); in qla4xxx_recover_adapter()
4965 if (!test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4966 ha->retry_reset_ha_cnt = MAX_RESET_HA_RETRIES; in qla4xxx_recover_adapter()
4968 "(%d) more times\n", ha->host_no, in qla4xxx_recover_adapter()
4969 ha->retry_reset_ha_cnt)); in qla4xxx_recover_adapter()
4970 set_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4973 if (ha->retry_reset_ha_cnt > 0) { in qla4xxx_recover_adapter()
4975 ha->retry_reset_ha_cnt--; in qla4xxx_recover_adapter()
4978 ha->host_no, in qla4xxx_recover_adapter()
4979 ha->retry_reset_ha_cnt)); in qla4xxx_recover_adapter()
4983 if (ha->retry_reset_ha_cnt == 0) { in qla4xxx_recover_adapter()
4988 ha->host_no)); in qla4xxx_recover_adapter()
4989 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4990 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4991 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4993 &ha->dpc_flags); in qla4xxx_recover_adapter()
4998 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4999 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_recover_adapter()
5000 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5004 ha->adapter_error_count++; in qla4xxx_recover_adapter()
5006 if (test_bit(AF_ONLINE, &ha->flags)) in qla4xxx_recover_adapter()
5007 ha->isp_ops->enable_intrs(ha); in qla4xxx_recover_adapter()
5009 scsi_unblock_requests(ha->host); in qla4xxx_recover_adapter()
5011 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4xxx_recover_adapter()
5012 DEBUG2(printk("scsi%ld: recover adapter: %s\n", ha->host_no, in qla4xxx_recover_adapter()
5022 struct scsi_qla_host *ha; in qla4xxx_relogin_devices() local
5026 ha = ddb_entry->ha; in qla4xxx_relogin_devices()
5029 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_relogin_devices()
5030 " unblock session\n", ha->host_no, __func__, in qla4xxx_relogin_devices()
5051 struct scsi_qla_host *ha; in qla4xxx_unblock_flash_ddb() local
5055 ha = ddb_entry->ha; in qla4xxx_unblock_flash_ddb()
5056 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_flash_ddb()
5057 " unblock session\n", ha->host_no, __func__, in qla4xxx_unblock_flash_ddb()
5063 if (test_bit(AF_ONLINE, &ha->flags)) { in qla4xxx_unblock_flash_ddb()
5064 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_flash_ddb()
5065 " start scan\n", ha->host_no, __func__, in qla4xxx_unblock_flash_ddb()
5067 scsi_queue_work(ha->host, &ddb_entry->sess->scan_work); in qla4xxx_unblock_flash_ddb()
5076 struct scsi_qla_host *ha; in qla4xxx_unblock_ddb() local
5081 ha = ddb_entry->ha; in qla4xxx_unblock_ddb()
5082 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_ddb()
5083 " unblock user space session\n", ha->host_no, __func__, in qla4xxx_unblock_ddb()
5091 ql4_printk(KERN_INFO, ha, in qla4xxx_unblock_ddb()
5093 ha->host_no, __func__, ddb_entry->fw_ddb_index, in qla4xxx_unblock_ddb()
5101 static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha) in qla4xxx_relogin_all_devices() argument
5103 iscsi_host_for_each_session(ha->host, qla4xxx_relogin_devices); in qla4xxx_relogin_all_devices()
5111 struct scsi_qla_host *ha; in qla4xxx_relogin_flash_ddb() local
5115 ha = ddb_entry->ha; in qla4xxx_relogin_flash_ddb()
5121 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_relogin_flash_ddb()
5122 "scsi%ld: Relogin index [%d]. TOV=%d\n", ha->host_no, in qla4xxx_relogin_flash_ddb()
5132 struct scsi_qla_host *ha; in qla4xxx_dpc_relogin() local
5136 ha = ddb_entry->ha; in qla4xxx_dpc_relogin()
5146 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_dpc_relogin()
5152 void qla4xxx_wake_dpc(struct scsi_qla_host *ha) in qla4xxx_wake_dpc() argument
5154 if (ha->dpc_thread) in qla4xxx_wake_dpc()
5155 queue_work(ha->dpc_thread, &ha->dpc_work); in qla4xxx_wake_dpc()
5159 qla4xxx_alloc_work(struct scsi_qla_host *ha, uint32_t data_size, in qla4xxx_alloc_work() argument
5174 static void qla4xxx_post_work(struct scsi_qla_host *ha, in qla4xxx_post_work() argument
5179 spin_lock_irqsave(&ha->work_lock, flags); in qla4xxx_post_work()
5180 list_add_tail(&e->list, &ha->work_list); in qla4xxx_post_work()
5181 spin_unlock_irqrestore(&ha->work_lock, flags); in qla4xxx_post_work()
5182 qla4xxx_wake_dpc(ha); in qla4xxx_post_work()
5185 int qla4xxx_post_aen_work(struct scsi_qla_host *ha, in qla4xxx_post_aen_work() argument
5191 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_AEN); in qla4xxx_post_aen_work()
5199 qla4xxx_post_work(ha, e); in qla4xxx_post_aen_work()
5204 int qla4xxx_post_ping_evt_work(struct scsi_qla_host *ha, in qla4xxx_post_ping_evt_work() argument
5210 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_PING_STATUS); in qla4xxx_post_ping_evt_work()
5219 qla4xxx_post_work(ha, e); in qla4xxx_post_ping_evt_work()
5224 static void qla4xxx_do_work(struct scsi_qla_host *ha) in qla4xxx_do_work() argument
5230 spin_lock_irqsave(&ha->work_lock, flags); in qla4xxx_do_work()
5231 list_splice_init(&ha->work_list, &work); in qla4xxx_do_work()
5232 spin_unlock_irqrestore(&ha->work_lock, flags); in qla4xxx_do_work()
5239 iscsi_post_host_event(ha->host_no, in qla4xxx_do_work()
5246 iscsi_ping_comp_event(ha->host_no, in qla4xxx_do_work()
5254 ql4_printk(KERN_WARNING, ha, "event type: 0x%x not " in qla4xxx_do_work()
5274 struct scsi_qla_host *ha = in qla4xxx_do_dpc() local
5278 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_do_dpc()
5280 ha->host_no, __func__, ha->flags, ha->dpc_flags)); in qla4xxx_do_dpc()
5283 if (!test_bit(AF_INIT_DONE, &ha->flags)) in qla4xxx_do_dpc()
5286 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_do_dpc()
5288 ha->host_no, __func__, ha->flags)); in qla4xxx_do_dpc()
5293 qla4xxx_do_work(ha); in qla4xxx_do_dpc()
5295 if (is_qla80XX(ha)) { in qla4xxx_do_dpc()
5296 if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5297 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_do_dpc()
5298 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4xxx_do_dpc()
5301 qla4_83xx_disable_pause(ha); in qla4xxx_do_dpc()
5304 ha->isp_ops->idc_lock(ha); in qla4xxx_do_dpc()
5305 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4xxx_do_dpc()
5307 ha->isp_ops->idc_unlock(ha); in qla4xxx_do_dpc()
5308 ql4_printk(KERN_INFO, ha, "HW State: FAILED\n"); in qla4xxx_do_dpc()
5309 qla4_8xxx_device_state_handler(ha); in qla4xxx_do_dpc()
5312 if (test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5313 if (is_qla8042(ha)) { in qla4xxx_do_dpc()
5314 if (ha->idc_info.info2 & in qla4xxx_do_dpc()
5316 ql4_printk(KERN_INFO, ha, "%s: Disabling ACB\n", in qla4xxx_do_dpc()
5318 status = qla4_84xx_config_acb(ha, in qla4xxx_do_dpc()
5321 ql4_printk(KERN_INFO, ha, "%s: ACB config failed\n", in qla4xxx_do_dpc()
5326 qla4_83xx_post_idc_ack(ha); in qla4xxx_do_dpc()
5327 clear_bit(DPC_POST_IDC_ACK, &ha->dpc_flags); in qla4xxx_do_dpc()
5330 if (is_qla8042(ha) && in qla4xxx_do_dpc()
5331 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5332 ql4_printk(KERN_INFO, ha, "%s: Restoring ACB\n", in qla4xxx_do_dpc()
5334 if (qla4_84xx_config_acb(ha, ACB_CONFIG_SET) != in qla4xxx_do_dpc()
5336 ql4_printk(KERN_INFO, ha, "%s: ACB config failed ", in qla4xxx_do_dpc()
5339 clear_bit(DPC_RESTORE_ACB, &ha->dpc_flags); in qla4xxx_do_dpc()
5342 if (test_and_clear_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5343 qla4_8xxx_need_qsnt_handler(ha); in qla4xxx_do_dpc()
5347 if (!test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) && in qla4xxx_do_dpc()
5348 (test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_do_dpc()
5349 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_do_dpc()
5350 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))) { in qla4xxx_do_dpc()
5351 if ((is_qla8022(ha) && ql4xdontresethba) || in qla4xxx_do_dpc()
5352 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_do_dpc()
5353 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_do_dpc()
5355 ha->host_no, __func__)); in qla4xxx_do_dpc()
5356 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_do_dpc()
5357 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); in qla4xxx_do_dpc()
5358 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_do_dpc()
5361 if (test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || in qla4xxx_do_dpc()
5362 test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_do_dpc()
5363 qla4xxx_recover_adapter(ha); in qla4xxx_do_dpc()
5365 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5368 while ((readw(&ha->reg->ctrl_status) & in qla4xxx_do_dpc()
5377 ha->host_no, __func__)); in qla4xxx_do_dpc()
5378 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_do_dpc()
5379 if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) { in qla4xxx_do_dpc()
5380 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_do_dpc()
5381 status = qla4xxx_recover_adapter(ha); in qla4xxx_do_dpc()
5383 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); in qla4xxx_do_dpc()
5385 ha->isp_ops->enable_intrs(ha); in qla4xxx_do_dpc()
5391 if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags)) in qla4xxx_do_dpc()
5392 qla4xxx_process_aen(ha, PROCESS_ALL_AENS); in qla4xxx_do_dpc()
5395 if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags)) in qla4xxx_do_dpc()
5396 qla4xxx_get_dhcp_ip_address(ha); in qla4xxx_do_dpc()
5399 if (adapter_up(ha) && in qla4xxx_do_dpc()
5400 test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5401 iscsi_host_for_each_session(ha->host, qla4xxx_dpc_relogin); in qla4xxx_do_dpc()
5405 if (!test_bit(AF_LOOPBACK, &ha->flags) && in qla4xxx_do_dpc()
5406 test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5407 if (!test_bit(AF_LINK_UP, &ha->flags)) { in qla4xxx_do_dpc()
5409 qla4xxx_mark_all_devices_missing(ha); in qla4xxx_do_dpc()
5417 if (test_and_clear_bit(AF_BUILD_DDB_LIST, &ha->flags)) { in qla4xxx_do_dpc()
5418 qla4xxx_build_ddb_list(ha, ha->is_reset); in qla4xxx_do_dpc()
5419 iscsi_host_for_each_session(ha->host, in qla4xxx_do_dpc()
5422 qla4xxx_relogin_all_devices(ha); in qla4xxx_do_dpc()
5425 if (test_and_clear_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5426 if (qla4xxx_sysfs_ddb_export(ha)) in qla4xxx_do_dpc()
5427 ql4_printk(KERN_ERR, ha, "%s: Error exporting ddb to sysfs\n", in qla4xxx_do_dpc()
5436 static void qla4xxx_free_adapter(struct scsi_qla_host *ha) in qla4xxx_free_adapter() argument
5438 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_free_adapter()
5441 ha->isp_ops->disable_intrs(ha); in qla4xxx_free_adapter()
5443 if (is_qla40XX(ha)) { in qla4xxx_free_adapter()
5445 &ha->reg->ctrl_status); in qla4xxx_free_adapter()
5446 readl(&ha->reg->ctrl_status); in qla4xxx_free_adapter()
5447 } else if (is_qla8022(ha)) { in qla4xxx_free_adapter()
5448 writel(0, &ha->qla4_82xx_reg->host_int); in qla4xxx_free_adapter()
5449 readl(&ha->qla4_82xx_reg->host_int); in qla4xxx_free_adapter()
5450 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_free_adapter()
5451 writel(0, &ha->qla4_83xx_reg->risc_intr); in qla4xxx_free_adapter()
5452 readl(&ha->qla4_83xx_reg->risc_intr); in qla4xxx_free_adapter()
5456 if (ha->timer_active) in qla4xxx_free_adapter()
5457 qla4xxx_stop_timer(ha); in qla4xxx_free_adapter()
5460 if (ha->dpc_thread) in qla4xxx_free_adapter()
5461 destroy_workqueue(ha->dpc_thread); in qla4xxx_free_adapter()
5464 if (ha->task_wq) in qla4xxx_free_adapter()
5465 destroy_workqueue(ha->task_wq); in qla4xxx_free_adapter()
5468 ha->isp_ops->reset_firmware(ha); in qla4xxx_free_adapter()
5470 if (is_qla80XX(ha)) { in qla4xxx_free_adapter()
5471 ha->isp_ops->idc_lock(ha); in qla4xxx_free_adapter()
5472 qla4_8xxx_clear_drv_active(ha); in qla4xxx_free_adapter()
5473 ha->isp_ops->idc_unlock(ha); in qla4xxx_free_adapter()
5477 qla4xxx_free_irqs(ha); in qla4xxx_free_adapter()
5480 qla4xxx_mem_free(ha); in qla4xxx_free_adapter()
5483 int qla4_8xxx_iospace_config(struct scsi_qla_host *ha) in qla4_8xxx_iospace_config() argument
5487 struct pci_dev *pdev = ha->pdev; in qla4_8xxx_iospace_config()
5493 "status=%d\n", ha->host_no, pci_name(pdev), status); in qla4_8xxx_iospace_config()
5499 ha->revision_id = pdev->revision; in qla4_8xxx_iospace_config()
5508 ha->nx_pcibase = (unsigned long)ioremap(mem_base, mem_len); in qla4_8xxx_iospace_config()
5509 if (!ha->nx_pcibase) { in qla4_8xxx_iospace_config()
5512 pci_release_regions(ha->pdev); in qla4_8xxx_iospace_config()
5519 if (is_qla8022(ha)) { in qla4_8xxx_iospace_config()
5520 ha->qla4_82xx_reg = (struct device_reg_82xx __iomem *) in qla4_8xxx_iospace_config()
5521 ((uint8_t *)ha->nx_pcibase + 0xbc000 + in qla4_8xxx_iospace_config()
5522 (ha->pdev->devfn << 11)); in qla4_8xxx_iospace_config()
5523 ha->nx_db_wr_ptr = (ha->pdev->devfn == 4 ? QLA82XX_CAM_RAM_DB1 : in qla4_8xxx_iospace_config()
5525 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_iospace_config()
5526 ha->qla4_83xx_reg = (struct device_reg_83xx __iomem *) in qla4_8xxx_iospace_config()
5527 ((uint8_t *)ha->nx_pcibase); in qla4_8xxx_iospace_config()
5545 int qla4xxx_iospace_config(struct scsi_qla_host *ha) in qla4xxx_iospace_config() argument
5550 pio = pci_resource_start(ha->pdev, 0); in qla4xxx_iospace_config()
5551 pio_len = pci_resource_len(ha->pdev, 0); in qla4xxx_iospace_config()
5552 pio_flags = pci_resource_flags(ha->pdev, 0); in qla4xxx_iospace_config()
5555 ql4_printk(KERN_WARNING, ha, in qla4xxx_iospace_config()
5560 ql4_printk(KERN_WARNING, ha, "region #0 not a PIO resource\n"); in qla4xxx_iospace_config()
5565 mmio = pci_resource_start(ha->pdev, 1); in qla4xxx_iospace_config()
5566 mmio_len = pci_resource_len(ha->pdev, 1); in qla4xxx_iospace_config()
5567 mmio_flags = pci_resource_flags(ha->pdev, 1); in qla4xxx_iospace_config()
5570 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5577 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5582 if (pci_request_regions(ha->pdev, DRIVER_NAME)) { in qla4xxx_iospace_config()
5583 ql4_printk(KERN_WARNING, ha, in qla4xxx_iospace_config()
5589 ha->pio_address = pio; in qla4xxx_iospace_config()
5590 ha->pio_length = pio_len; in qla4xxx_iospace_config()
5591 ha->reg = ioremap(mmio, MIN_IOBASE_LEN); in qla4xxx_iospace_config()
5592 if (!ha->reg) { in qla4xxx_iospace_config()
5593 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5680 uint16_t qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha) in qla4xxx_rd_shdw_req_q_out() argument
5682 return (uint16_t)le32_to_cpu(ha->shadow_regs->req_q_out); in qla4xxx_rd_shdw_req_q_out()
5685 uint16_t qla4_82xx_rd_shdw_req_q_out(struct scsi_qla_host *ha) in qla4_82xx_rd_shdw_req_q_out() argument
5687 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->req_q_out)); in qla4_82xx_rd_shdw_req_q_out()
5690 uint16_t qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) in qla4xxx_rd_shdw_rsp_q_in() argument
5692 return (uint16_t)le32_to_cpu(ha->shadow_regs->rsp_q_in); in qla4xxx_rd_shdw_rsp_q_in()
5695 uint16_t qla4_82xx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) in qla4_82xx_rd_shdw_rsp_q_in() argument
5697 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->rsp_q_in)); in qla4_82xx_rd_shdw_rsp_q_in()
5702 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_eth_info() local
5714 rc = sysfs_format_mac(str, ha->my_mac, in qla4xxx_show_boot_eth_info()
5743 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_ini_info() local
5749 rc = sprintf(str, "%s\n", ha->name_string); in qla4xxx_show_boot_ini_info()
5831 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_tgt_pri_info() local
5832 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_pri_sess); in qla4xxx_show_boot_tgt_pri_info()
5839 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_tgt_sec_info() local
5840 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_sec_sess); in qla4xxx_show_boot_tgt_sec_info()
5870 struct scsi_qla_host *ha = data; in qla4xxx_boot_release() local
5872 scsi_host_put(ha->host); in qla4xxx_boot_release()
5875 static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[]) in get_fw_boot_info() argument
5886 func_num = PCI_FUNC(ha->pdev->devfn); in get_fw_boot_info()
5888 ql4_printk(KERN_INFO, ha, "%s: Get FW boot info for 0x%x func %d\n", in get_fw_boot_info()
5889 __func__, ha->pdev->device, func_num); in get_fw_boot_info()
5891 if (is_qla40XX(ha)) { in get_fw_boot_info()
5906 val = rd_nvram_byte(ha, addr); in get_fw_boot_info()
5908 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Adapter boot " in get_fw_boot_info()
5915 val = rd_nvram_byte(ha, pri_addr); in get_fw_boot_info()
5920 val = rd_nvram_byte(ha, sec_addr); in get_fw_boot_info()
5924 } else if (is_qla80XX(ha)) { in get_fw_boot_info()
5925 buf = dma_alloc_coherent(&ha->pdev->dev, size, in get_fw_boot_info()
5928 DEBUG2(ql4_printk(KERN_ERR, ha, in get_fw_boot_info()
5935 if (ha->port_num == 0) in get_fw_boot_info()
5937 else if (ha->port_num == 1) in get_fw_boot_info()
5943 addr = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_iscsi_param * 4) + in get_fw_boot_info()
5945 if (qla4xxx_get_flash(ha, buf_dma, addr, in get_fw_boot_info()
5947 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: Get Flash" in get_fw_boot_info()
5948 " failed\n", ha->host_no, __func__)); in get_fw_boot_info()
5954 DEBUG2(ql4_printk(KERN_INFO, ha, "Firmware boot options" in get_fw_boot_info()
5972 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary target ID %d, Secondary" in get_fw_boot_info()
5977 dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma); in get_fw_boot_info()
5979 ha->pri_ddb_idx = ddb_index[0]; in get_fw_boot_info()
5980 ha->sec_ddb_idx = ddb_index[1]; in get_fw_boot_info()
5995 static int qla4xxx_get_bidi_chap(struct scsi_qla_host *ha, char *username, in qla4xxx_get_bidi_chap() argument
6002 if (is_qla80XX(ha)) in qla4xxx_get_bidi_chap()
6003 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_bidi_chap()
6008 if (!ha->chap_list) { in qla4xxx_get_bidi_chap()
6009 ql4_printk(KERN_ERR, ha, "Do not have CHAP table cache\n"); in qla4xxx_get_bidi_chap()
6013 mutex_lock(&ha->chap_sem); in qla4xxx_get_bidi_chap()
6015 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_get_bidi_chap()
6032 mutex_unlock(&ha->chap_sem); in qla4xxx_get_bidi_chap()
6038 static int qla4xxx_get_boot_target(struct scsi_qla_host *ha, in qla4xxx_get_boot_target() argument
6049 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_get_boot_target()
6052 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_get_boot_target()
6059 if (qla4xxx_bootdb_by_index(ha, fw_ddb_entry, in qla4xxx_get_boot_target()
6061 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: No Flash DDB found at " in qla4xxx_get_boot_target()
6089 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting chap\n")); in qla4xxx_get_boot_target()
6091 ret = qla4xxx_get_chap(ha, (char *)&boot_conn->chap. in qla4xxx_get_boot_target()
6096 ql4_printk(KERN_ERR, ha, "Failed to set chap\n"); in qla4xxx_get_boot_target()
6107 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting BIDI chap\n")); in qla4xxx_get_boot_target()
6109 ret = qla4xxx_get_bidi_chap(ha, in qla4xxx_get_boot_target()
6114 ql4_printk(KERN_ERR, ha, "Failed to set BIDI chap\n"); in qla4xxx_get_boot_target()
6124 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_get_boot_target()
6129 static int qla4xxx_get_boot_info(struct scsi_qla_host *ha) in qla4xxx_get_boot_info() argument
6138 ret = get_fw_boot_info(ha, ddb_index); in qla4xxx_get_boot_info()
6140 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_boot_info()
6151 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess), in qla4xxx_get_boot_info()
6154 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary boot target not " in qla4xxx_get_boot_info()
6163 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess), in qla4xxx_get_boot_info()
6166 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Secondary boot target not" in qla4xxx_get_boot_info()
6175 static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha) in qla4xxx_setup_boot_info() argument
6179 if (qla4xxx_get_boot_info(ha) != QLA_SUCCESS) in qla4xxx_setup_boot_info()
6183 ql4_printk(KERN_INFO, ha, in qla4xxx_setup_boot_info()
6190 ha->boot_kset = iscsi_boot_create_host_kset(ha->host->host_no); in qla4xxx_setup_boot_info()
6191 if (!ha->boot_kset) in qla4xxx_setup_boot_info()
6194 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6196 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6203 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6205 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 1, ha, in qla4xxx_setup_boot_info()
6212 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6214 boot_kobj = iscsi_boot_create_initiator(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6221 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6223 boot_kobj = iscsi_boot_create_ethernet(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6233 scsi_host_put(ha->host); in qla4xxx_setup_boot_info()
6235 iscsi_boot_destroy_kset(ha->boot_kset); in qla4xxx_setup_boot_info()
6243 struct scsi_qla_host *ha; in qla4xxx_get_param_ddb() local
6250 ha = ddb_entry->ha; in qla4xxx_get_param_ddb()
6287 static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha, in qla4xxx_compare_tuple_ddb() argument
6308 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: old ISID [%02x%02x%02x" in qla4xxx_compare_tuple_ddb()
6321 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_compare_tuple_ddb()
6330 static int qla4xxx_is_session_exists(struct scsi_qla_host *ha, in qla4xxx_is_session_exists() argument
6342 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_session_exists()
6350 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_session_exists()
6359 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_is_session_exists()
6364 if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, false)) { in qla4xxx_is_session_exists()
6414 static int qla4xxx_update_isid(struct scsi_qla_host *ha, in qla4xxx_update_isid() argument
6442 static int qla4xxx_should_update_isid(struct scsi_qla_host *ha, in qla4xxx_should_update_isid() argument
6476 static int qla4xxx_is_flash_ddb_exists(struct scsi_qla_host *ha, in qla4xxx_is_flash_ddb_exists() argument
6487 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_flash_ddb_exists()
6495 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_flash_ddb_exists()
6506 ret = qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, true); in qla4xxx_is_flash_ddb_exists()
6515 ret = qla4xxx_should_update_isid(ha, tmp_tddb, fw_tddb); in qla4xxx_is_flash_ddb_exists()
6517 rval = qla4xxx_update_isid(ha, list_nt, fw_ddb_entry); in qla4xxx_is_flash_ddb_exists()
6545 static struct iscsi_endpoint *qla4xxx_get_ep_fwdb(struct scsi_qla_host *ha, in qla4xxx_get_ep_fwdb() argument
6577 ep = qla4xxx_ep_connect(ha->host, (struct sockaddr *)dst_addr, 0); in qla4xxx_get_ep_fwdb()
6582 static int qla4xxx_verify_boot_idx(struct scsi_qla_host *ha, uint16_t idx) in qla4xxx_verify_boot_idx() argument
6586 if (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx) in qla4xxx_verify_boot_idx()
6591 static void qla4xxx_setup_flash_ddb_entry(struct scsi_qla_host *ha, in qla4xxx_setup_flash_ddb_entry() argument
6600 ddb_entry->ha = ha; in qla4xxx_setup_flash_ddb_entry()
6616 (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx)) in qla4xxx_setup_flash_ddb_entry()
6620 static void qla4xxx_wait_for_ip_configuration(struct scsi_qla_host *ha) in qla4xxx_wait_for_ip_configuration() argument
6635 ret = qla4xxx_get_ip_state(ha, 0, ip_idx[idx], sts); in qla4xxx_wait_for_ip_configuration()
6644 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_for_ip_configuration()
6689 static int qla4xxx_find_flash_st_idx(struct scsi_qla_host *ha, in qla4xxx_find_flash_st_idx() argument
6699 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_find_flash_st_idx()
6702 flash_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_find_flash_st_idx()
6705 ql4_printk(KERN_ERR, ha, "Out of memory\n"); in qla4xxx_find_flash_st_idx()
6709 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6721 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6735 ql4_printk(KERN_ERR, ha, "Failed to find ST [%d] in flash\n", in qla4xxx_find_flash_st_idx()
6740 dma_pool_free(ha->fw_ddb_dma_pool, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6746 static void qla4xxx_build_st_list(struct scsi_qla_host *ha, in qla4xxx_build_st_list() argument
6760 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_st_list()
6763 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_st_list()
6767 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_st_list()
6772 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_st_list()
6790 ret = qla4xxx_find_flash_st_idx(ha, fw_ddb_entry, idx, in qla4xxx_build_st_list()
6793 ql4_printk(KERN_ERR, ha, in qla4xxx_build_st_list()
6797 ql4_printk(KERN_INFO, ha, in qla4xxx_build_st_list()
6813 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_st_list()
6824 static void qla4xxx_remove_failed_ddb(struct scsi_qla_host *ha, in qla4xxx_remove_failed_ddb() argument
6833 ret = qla4xxx_get_fwddb_entry(ha, ddb_idx->fw_ddb_idx, in qla4xxx_remove_failed_ddb()
6847 static void qla4xxx_update_sess_disc_idx(struct scsi_qla_host *ha, in qla4xxx_update_sess_disc_idx() argument
6856 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_update_sess_disc_idx()
6869 static int qla4xxx_sess_conn_setup(struct scsi_qla_host *ha, in qla4xxx_sess_conn_setup() argument
6887 cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, ha->host, in qla4xxx_sess_conn_setup()
6909 qla4xxx_setup_flash_ddb_entry(ha, ddb_entry, idx); in qla4xxx_sess_conn_setup()
6921 ep = qla4xxx_get_ep_fwdb(ha, fw_ddb_entry); in qla4xxx_sess_conn_setup()
6926 DEBUG2(ql4_printk(KERN_ERR, ha, "Unable to get ep\n")); in qla4xxx_sess_conn_setup()
6932 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); in qla4xxx_sess_conn_setup()
6933 qla4xxx_update_sess_disc_idx(ha, ddb_entry, fw_ddb_entry); in qla4xxx_sess_conn_setup()
6942 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_sess_conn_setup()
6950 static void qla4xxx_update_fw_ddb_link(struct scsi_qla_host *ha, in qla4xxx_update_fw_ddb_link() argument
6961 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_update_fw_ddb_link()
6971 static void qla4xxx_build_nt_list(struct scsi_qla_host *ha, in qla4xxx_build_nt_list() argument
6989 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_nt_list()
6992 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_nt_list()
6995 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_nt_list()
7000 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_nt_list()
7006 if (qla4xxx_verify_boot_idx(ha, idx) != QLA_SUCCESS) in qla4xxx_build_nt_list()
7015 qla4xxx_update_fw_ddb_link(ha, list_st, fw_ddb_entry); in qla4xxx_build_nt_list()
7022 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_nt_list()
7040 ret = qla4xxx_is_flash_ddb_exists(ha, list_nt, in qla4xxx_build_nt_list()
7054 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, in qla4xxx_build_nt_list()
7057 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, in qla4xxx_build_nt_list()
7060 qla4xxx_update_sess_disc_idx(ha, in qla4xxx_build_nt_list()
7067 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, is_reset, idx); in qla4xxx_build_nt_list()
7078 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_nt_list()
7081 static void qla4xxx_build_new_nt_list(struct scsi_qla_host *ha, in qla4xxx_build_new_nt_list() argument
7095 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_new_nt_list()
7098 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_new_nt_list()
7101 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_new_nt_list()
7106 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_new_nt_list()
7119 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_new_nt_list()
7128 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); in qla4xxx_build_new_nt_list()
7140 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, in qla4xxx_build_new_nt_list()
7152 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_new_nt_list()
7192 static int qla4xxx_sysfs_ddb_tgt_create(struct scsi_qla_host *ha, in qla4xxx_sysfs_ddb_tgt_create() argument
7200 fnode_sess = iscsi_create_flashnode_sess(ha->host, *idx, in qla4xxx_sysfs_ddb_tgt_create()
7203 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_tgt_create()
7205 __func__, *idx, ha->host_no); in qla4xxx_sysfs_ddb_tgt_create()
7209 fnode_conn = iscsi_create_flashnode_conn(ha->host, fnode_sess, in qla4xxx_sysfs_ddb_tgt_create()
7212 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_tgt_create()
7214 __func__, *idx, ha->host_no); in qla4xxx_sysfs_ddb_tgt_create()
7223 if (*idx == ha->pri_ddb_idx || *idx == ha->sec_ddb_idx) in qla4xxx_sysfs_ddb_tgt_create()
7232 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", in qla4xxx_sysfs_ddb_tgt_create()
7235 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", in qla4xxx_sysfs_ddb_tgt_create()
7259 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_add() local
7270 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Invalid portal type\n", in qla4xxx_sysfs_ddb_add()
7275 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : in qla4xxx_sysfs_ddb_add()
7278 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_add()
7281 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_add()
7287 dev = iscsi_find_flashnode_sess(ha->host, NULL, in qla4xxx_sysfs_ddb_add()
7290 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_add()
7299 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_add()
7310 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_add()
7314 rval = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 1); in qla4xxx_sysfs_ddb_add()
7318 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_add()
7338 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_apply() local
7345 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_apply()
7348 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_apply()
7358 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_apply()
7368 rval = qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, in qla4xxx_sysfs_ddb_apply()
7373 ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_apply()
7375 __func__, fnode_sess->target_id, ha->host_no); in qla4xxx_sysfs_ddb_apply()
7378 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_apply()
7380 __func__, fnode_sess->target_id, ha->host_no); in qla4xxx_sysfs_ddb_apply()
7385 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_apply()
7390 static ssize_t qla4xxx_sysfs_ddb_conn_open(struct scsi_qla_host *ha, in qla4xxx_sysfs_ddb_conn_open() argument
7402 ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*ddb_entry), in qla4xxx_sysfs_ddb_conn_open()
7405 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_conn_open()
7413 ret = qla4xxx_set_ddb_entry(ha, idx, ddb_entry_dma, &mbx_sts); in qla4xxx_sysfs_ddb_conn_open()
7415 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_conn_open()
7421 qla4xxx_conn_open(ha, idx); in qla4xxx_sysfs_ddb_conn_open()
7424 tmo = ((ha->def_timeout > LOGIN_TOV) && in qla4xxx_sysfs_ddb_conn_open()
7425 (ha->def_timeout < LOGIN_TOV * 10) ? in qla4xxx_sysfs_ddb_conn_open()
7426 ha->def_timeout : LOGIN_TOV); in qla4xxx_sysfs_ddb_conn_open()
7428 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_conn_open()
7433 ret = qla4xxx_get_fwddb_entry(ha, idx, NULL, 0, NULL, in qla4xxx_sysfs_ddb_conn_open()
7448 dma_free_coherent(&ha->pdev->dev, sizeof(*ddb_entry), in qla4xxx_sysfs_ddb_conn_open()
7453 static int qla4xxx_ddb_login_st(struct scsi_qla_host *ha, in qla4xxx_ddb_login_st() argument
7462 if (test_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags)) { in qla4xxx_ddb_login_st()
7463 ql4_printk(KERN_WARNING, ha, in qla4xxx_ddb_login_st()
7470 set_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); in qla4xxx_ddb_login_st()
7472 ret = qla4xxx_get_ddb_index(ha, &ddb_index); in qla4xxx_ddb_login_st()
7476 ret = qla4xxx_sysfs_ddb_conn_open(ha, fw_ddb_entry, ddb_index); in qla4xxx_ddb_login_st()
7480 qla4xxx_build_new_nt_list(ha, &list_nt, target_id); in qla4xxx_ddb_login_st()
7484 qla4xxx_clear_ddb_entry(ha, ddb_idx->fw_ddb_idx); in qla4xxx_ddb_login_st()
7489 if (qla4xxx_clear_ddb_entry(ha, ddb_index) == QLA_ERROR) { in qla4xxx_ddb_login_st()
7490 ql4_printk(KERN_ERR, ha, in qla4xxx_ddb_login_st()
7494 clear_bit(ddb_index, ha->ddb_idx_map); in qla4xxx_ddb_login_st()
7497 clear_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); in qla4xxx_ddb_login_st()
7501 static int qla4xxx_ddb_login_nt(struct scsi_qla_host *ha, in qla4xxx_ddb_login_nt() argument
7507 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); in qla4xxx_ddb_login_nt()
7509 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, in qla4xxx_ddb_login_nt()
7528 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_login() local
7535 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_login()
7541 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_login()
7544 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_login()
7554 ret = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_login()
7562 ret = qla4xxx_ddb_login_st(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_login()
7565 ret = qla4xxx_ddb_login_nt(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_login()
7573 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_login()
7588 struct scsi_qla_host *ha; in qla4xxx_sysfs_ddb_logout_sid() local
7599 ha = ddb_entry->ha; in qla4xxx_sysfs_ddb_logout_sid()
7602 ql4_printk(KERN_ERR, ha, "%s: Not a flash node session\n", in qla4xxx_sysfs_ddb_logout_sid()
7609 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout_sid()
7616 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_logout_sid()
7619 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout_sid()
7628 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_sysfs_ddb_logout_sid()
7654 qla4xxx_session_logout_ddb(ha, ddb_entry, options); in qla4xxx_sysfs_ddb_logout_sid()
7659 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_sysfs_ddb_logout_sid()
7674 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_sysfs_ddb_logout_sid()
7684 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_sysfs_ddb_logout_sid()
7685 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_sysfs_ddb_logout_sid()
7686 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); in qla4xxx_sysfs_ddb_logout_sid()
7687 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_sysfs_ddb_logout_sid()
7696 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_logout_sid()
7712 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_logout() local
7724 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_sysfs_ddb_logout()
7727 ql4_printk(KERN_ERR, ha, "%s:Out of memory\n", __func__); in qla4xxx_sysfs_ddb_logout()
7734 ql4_printk(KERN_WARNING, ha, in qla4xxx_sysfs_ddb_logout()
7742 ql4_printk(KERN_WARNING, ha, in qla4xxx_sysfs_ddb_logout()
7749 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout()
7757 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout()
7778 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_sysfs_ddb_logout()
7786 status = qla4xxx_get_fwddb_entry(ha, index, fw_ddb_entry, in qla4xxx_sysfs_ddb_logout()
7797 status = qla4xxx_compare_tuple_ddb(ha, flash_tddb, tmp_tddb, in qla4xxx_sysfs_ddb_logout()
7814 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_sysfs_ddb_logout()
7824 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_get_param() local
8029 qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_get_param()
8040 qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_get_param()
8082 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_set_param() local
8276 if (!qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_set_param()
8286 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_set_param()
8308 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_delete() local
8321 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_delete()
8330 if (is_qla40XX(ha)) { in qla4xxx_sysfs_ddb_delete()
8338 (ha->hw.flt_region_ddb << 2); in qla4xxx_sysfs_ddb_delete()
8342 if (ha->port_num == 1) in qla4xxx_sysfs_ddb_delete()
8343 dev_db_start_offset += (ha->hw.flt_ddb_size / 2); in qla4xxx_sysfs_ddb_delete()
8346 (ha->hw.flt_ddb_size / 2); in qla4xxx_sysfs_ddb_delete()
8355 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: start offset=%u, end offset=%u\n", in qla4xxx_sysfs_ddb_delete()
8360 DEBUG2(ql4_printk(KERN_ERR, ha, "%s:Invalid DDB index %u\n", in qla4xxx_sysfs_ddb_delete()
8365 pddb = dma_alloc_coherent(&ha->pdev->dev, ddb_size, in qla4xxx_sysfs_ddb_delete()
8369 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_delete()
8375 if (is_qla40XX(ha)) { in qla4xxx_sysfs_ddb_delete()
8385 qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, in qla4xxx_sysfs_ddb_delete()
8391 ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_delete()
8393 __func__, target_id, ha->host_no); in qla4xxx_sysfs_ddb_delete()
8396 dma_free_coherent(&ha->pdev->dev, ddb_size, pddb, in qla4xxx_sysfs_ddb_delete()
8407 int qla4xxx_sysfs_ddb_export(struct scsi_qla_host *ha) in qla4xxx_sysfs_ddb_export() argument
8415 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_sysfs_ddb_export()
8419 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_export()
8425 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : in qla4xxx_sysfs_ddb_export()
8429 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, fw_ddb_entry_dma, in qla4xxx_sysfs_ddb_export()
8433 ret = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 0); in qla4xxx_sysfs_ddb_export()
8440 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), fw_ddb_entry, in qla4xxx_sysfs_ddb_export()
8446 static void qla4xxx_sysfs_ddb_remove(struct scsi_qla_host *ha) in qla4xxx_sysfs_ddb_remove() argument
8448 iscsi_destroy_all_flashnode(ha->host); in qla4xxx_sysfs_ddb_remove()
8461 void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset) in qla4xxx_build_ddb_list() argument
8468 if (!test_bit(AF_LINK_UP, &ha->flags)) { in qla4xxx_build_ddb_list()
8469 set_bit(AF_BUILD_DDB_LIST, &ha->flags); in qla4xxx_build_ddb_list()
8470 ha->is_reset = is_reset; in qla4xxx_build_ddb_list()
8477 qla4xxx_build_st_list(ha, &list_st); in qla4xxx_build_ddb_list()
8482 qla4xxx_wait_for_ip_configuration(ha); in qla4xxx_build_ddb_list()
8486 qla4xxx_conn_open(ha, st_ddb_idx->fw_ddb_idx); in qla4xxx_build_ddb_list()
8490 tmo = ((ha->def_timeout > LOGIN_TOV) && in qla4xxx_build_ddb_list()
8491 (ha->def_timeout < LOGIN_TOV * 10) ? in qla4xxx_build_ddb_list()
8492 ha->def_timeout : LOGIN_TOV); in qla4xxx_build_ddb_list()
8494 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_ddb_list()
8502 qla4xxx_remove_failed_ddb(ha, &list_st); in qla4xxx_build_ddb_list()
8507 qla4xxx_build_nt_list(ha, &list_nt, &list_st, is_reset); in qla4xxx_build_ddb_list()
8512 qla4xxx_free_ddb_index(ha); in qla4xxx_build_ddb_list()
8524 static void qla4xxx_wait_login_resp_boot_tgt(struct scsi_qla_host *ha) in qla4xxx_wait_login_resp_boot_tgt() argument
8533 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_wait_login_resp_boot_tgt()
8536 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_wait_login_resp_boot_tgt()
8539 ql4_printk(KERN_ERR, ha, in qla4xxx_wait_login_resp_boot_tgt()
8547 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_wait_login_resp_boot_tgt()
8552 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_login_resp_boot_tgt()
8556 ret = qla4xxx_get_fwddb_entry(ha, in qla4xxx_wait_login_resp_boot_tgt()
8573 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_login_resp_boot_tgt()
8583 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_wait_login_resp_boot_tgt()
8601 struct scsi_qla_host *ha; in qla4xxx_probe_adapter() local
8610 host = iscsi_host_alloc(&qla4xxx_driver_template, sizeof(*ha), 0); in qla4xxx_probe_adapter()
8618 ha = to_qla_host(host); in qla4xxx_probe_adapter()
8619 memset(ha, 0, sizeof(*ha)); in qla4xxx_probe_adapter()
8622 ha->pdev = pdev; in qla4xxx_probe_adapter()
8623 ha->host = host; in qla4xxx_probe_adapter()
8624 ha->host_no = host->host_no; in qla4xxx_probe_adapter()
8625 ha->func_num = PCI_FUNC(ha->pdev->devfn); in qla4xxx_probe_adapter()
8630 if (is_qla8022(ha)) { in qla4xxx_probe_adapter()
8631 ha->isp_ops = &qla4_82xx_isp_ops; in qla4xxx_probe_adapter()
8632 ha->reg_tbl = (uint32_t *) qla4_82xx_reg_tbl; in qla4xxx_probe_adapter()
8633 ha->qdr_sn_window = -1; in qla4xxx_probe_adapter()
8634 ha->ddr_mn_window = -1; in qla4xxx_probe_adapter()
8635 ha->curr_window = 255; in qla4xxx_probe_adapter()
8636 nx_legacy_intr = &legacy_intr[ha->func_num]; in qla4xxx_probe_adapter()
8637 ha->nx_legacy_intr.int_vec_bit = nx_legacy_intr->int_vec_bit; in qla4xxx_probe_adapter()
8638 ha->nx_legacy_intr.tgt_status_reg = in qla4xxx_probe_adapter()
8640 ha->nx_legacy_intr.tgt_mask_reg = nx_legacy_intr->tgt_mask_reg; in qla4xxx_probe_adapter()
8641 ha->nx_legacy_intr.pci_int_reg = nx_legacy_intr->pci_int_reg; in qla4xxx_probe_adapter()
8642 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_probe_adapter()
8643 ha->isp_ops = &qla4_83xx_isp_ops; in qla4xxx_probe_adapter()
8644 ha->reg_tbl = (uint32_t *)qla4_83xx_reg_tbl; in qla4xxx_probe_adapter()
8646 ha->isp_ops = &qla4xxx_isp_ops; in qla4xxx_probe_adapter()
8649 if (is_qla80XX(ha)) { in qla4xxx_probe_adapter()
8650 rwlock_init(&ha->hw_lock); in qla4xxx_probe_adapter()
8651 ha->pf_bit = ha->func_num << 16; in qla4xxx_probe_adapter()
8657 ret = ha->isp_ops->iospace_config(ha); in qla4xxx_probe_adapter()
8661 ql4_printk(KERN_INFO, ha, "Found an ISP%04x, irq %d, iobase 0x%p\n", in qla4xxx_probe_adapter()
8662 pdev->device, pdev->irq, ha->reg); in qla4xxx_probe_adapter()
8664 qla4xxx_config_dma_addressing(ha); in qla4xxx_probe_adapter()
8667 INIT_LIST_HEAD(&ha->free_srb_q); in qla4xxx_probe_adapter()
8669 mutex_init(&ha->mbox_sem); in qla4xxx_probe_adapter()
8670 mutex_init(&ha->chap_sem); in qla4xxx_probe_adapter()
8671 init_completion(&ha->mbx_intr_comp); in qla4xxx_probe_adapter()
8672 init_completion(&ha->disable_acb_comp); in qla4xxx_probe_adapter()
8673 init_completion(&ha->idc_comp); in qla4xxx_probe_adapter()
8674 init_completion(&ha->link_up_comp); in qla4xxx_probe_adapter()
8675 init_completion(&ha->disable_acb_comp); in qla4xxx_probe_adapter()
8677 spin_lock_init(&ha->hardware_lock); in qla4xxx_probe_adapter()
8678 spin_lock_init(&ha->work_lock); in qla4xxx_probe_adapter()
8681 INIT_LIST_HEAD(&ha->work_list); in qla4xxx_probe_adapter()
8684 if (qla4xxx_mem_alloc(ha)) { in qla4xxx_probe_adapter()
8685 ql4_printk(KERN_WARNING, ha, in qla4xxx_probe_adapter()
8702 ql4_printk(KERN_WARNING, ha, in qla4xxx_probe_adapter()
8707 pci_set_drvdata(pdev, ha); in qla4xxx_probe_adapter()
8713 if (is_qla80XX(ha)) in qla4xxx_probe_adapter()
8714 qla4_8xxx_get_flash_info(ha); in qla4xxx_probe_adapter()
8716 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_probe_adapter()
8717 qla4_83xx_read_reset_template(ha); in qla4xxx_probe_adapter()
8725 qla4_83xx_set_idc_dontreset(ha); in qla4xxx_probe_adapter()
8733 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8736 if (is_qla80XX(ha) && (status == QLA_ERROR)) in qla4xxx_probe_adapter()
8739 while ((!test_bit(AF_ONLINE, &ha->flags)) && in qla4xxx_probe_adapter()
8742 if (is_qla80XX(ha)) { in qla4xxx_probe_adapter()
8743 ha->isp_ops->idc_lock(ha); in qla4xxx_probe_adapter()
8744 dev_state = qla4_8xxx_rd_direct(ha, in qla4xxx_probe_adapter()
8746 ha->isp_ops->idc_unlock(ha); in qla4xxx_probe_adapter()
8748 ql4_printk(KERN_WARNING, ha, "%s: don't retry " in qla4xxx_probe_adapter()
8757 if (ha->isp_ops->reset_chip(ha) == QLA_ERROR) in qla4xxx_probe_adapter()
8760 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8761 if (is_qla80XX(ha) && (status == QLA_ERROR)) { in qla4xxx_probe_adapter()
8762 if (qla4_8xxx_check_init_adapter_retry(ha) == QLA_ERROR) in qla4xxx_probe_adapter()
8768 if (!test_bit(AF_ONLINE, &ha->flags)) { in qla4xxx_probe_adapter()
8769 ql4_printk(KERN_WARNING, ha, "Failed to initialize adapter\n"); in qla4xxx_probe_adapter()
8771 if ((is_qla8022(ha) && ql4xdontresethba) || in qla4xxx_probe_adapter()
8772 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_probe_adapter()
8773 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_probe_adapter()
8776 ha->isp_ops->idc_lock(ha); in qla4xxx_probe_adapter()
8777 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4xxx_probe_adapter()
8779 ha->isp_ops->idc_unlock(ha); in qla4xxx_probe_adapter()
8788 sprintf(buf, "qla4xxx_%lu_dpc", ha->host_no); in qla4xxx_probe_adapter()
8789 ha->dpc_thread = create_singlethread_workqueue(buf); in qla4xxx_probe_adapter()
8790 if (!ha->dpc_thread) { in qla4xxx_probe_adapter()
8791 ql4_printk(KERN_WARNING, ha, "Unable to start DPC thread!\n"); in qla4xxx_probe_adapter()
8795 INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc); in qla4xxx_probe_adapter()
8797 ha->task_wq = alloc_workqueue("qla4xxx_%lu_task", WQ_MEM_RECLAIM, 1, in qla4xxx_probe_adapter()
8798 ha->host_no); in qla4xxx_probe_adapter()
8799 if (!ha->task_wq) { in qla4xxx_probe_adapter()
8800 ql4_printk(KERN_WARNING, ha, "Unable to start task thread!\n"); in qla4xxx_probe_adapter()
8811 if (is_qla40XX(ha)) { in qla4xxx_probe_adapter()
8812 ret = qla4xxx_request_irqs(ha); in qla4xxx_probe_adapter()
8814 ql4_printk(KERN_WARNING, ha, "Failed to reserve " in qla4xxx_probe_adapter()
8820 pci_save_state(ha->pdev); in qla4xxx_probe_adapter()
8821 ha->isp_ops->enable_intrs(ha); in qla4xxx_probe_adapter()
8824 qla4xxx_start_timer(ha, qla4xxx_timer, 1); in qla4xxx_probe_adapter()
8826 set_bit(AF_INIT_DONE, &ha->flags); in qla4xxx_probe_adapter()
8828 qla4_8xxx_alloc_sysfs_attr(ha); in qla4xxx_probe_adapter()
8833 qla4xxx_version_str, ha->pdev->device, pci_name(ha->pdev), in qla4xxx_probe_adapter()
8834 ha->host_no, ha->fw_info.fw_major, ha->fw_info.fw_minor, in qla4xxx_probe_adapter()
8835 ha->fw_info.fw_patch, ha->fw_info.fw_build); in qla4xxx_probe_adapter()
8838 if (is_qla80XX(ha)) in qla4xxx_probe_adapter()
8839 qla4_8xxx_set_param(ha, SET_DRVR_VERSION); in qla4xxx_probe_adapter()
8841 if (qla4xxx_setup_boot_info(ha)) in qla4xxx_probe_adapter()
8842 ql4_printk(KERN_ERR, ha, in qla4xxx_probe_adapter()
8845 set_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags); in qla4xxx_probe_adapter()
8847 qla4xxx_build_ddb_list(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8848 iscsi_host_for_each_session(ha->host, qla4xxx_login_flash_ddb); in qla4xxx_probe_adapter()
8849 qla4xxx_wait_login_resp_boot_tgt(ha); in qla4xxx_probe_adapter()
8851 qla4xxx_create_chap_list(ha); in qla4xxx_probe_adapter()
8853 qla4xxx_create_ifaces(ha); in qla4xxx_probe_adapter()
8857 scsi_remove_host(ha->host); in qla4xxx_probe_adapter()
8860 qla4xxx_free_adapter(ha); in qla4xxx_probe_adapter()
8864 scsi_host_put(ha->host); in qla4xxx_probe_adapter()
8880 static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha) in qla4xxx_prevent_other_port_reinit() argument
8887 if (PCI_FUNC(ha->pdev->devfn) & BIT_1) in qla4xxx_prevent_other_port_reinit()
8891 pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus), in qla4xxx_prevent_other_port_reinit()
8892 ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), in qla4xxx_prevent_other_port_reinit()
8901 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: " in qla4xxx_prevent_other_port_reinit()
8910 static void qla4xxx_destroy_ddb(struct scsi_qla_host *ha, in qla4xxx_destroy_ddb() argument
8921 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) { in qla4xxx_destroy_ddb()
8922 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); in qla4xxx_destroy_ddb()
8926 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_destroy_ddb()
8929 ql4_printk(KERN_ERR, ha, in qla4xxx_destroy_ddb()
8936 status = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_destroy_ddb()
8951 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_destroy_ddb()
8954 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_destroy_ddb()
8957 static void qla4xxx_destroy_fw_ddb_session(struct scsi_qla_host *ha) in qla4xxx_destroy_fw_ddb_session() argument
8964 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_destroy_fw_ddb_session()
8968 qla4xxx_destroy_ddb(ha, ddb_entry); in qla4xxx_destroy_fw_ddb_session()
8977 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_destroy_fw_ddb_session()
8988 struct scsi_qla_host *ha; in qla4xxx_remove_adapter() local
8997 ha = pci_get_drvdata(pdev); in qla4xxx_remove_adapter()
8999 if (is_qla40XX(ha)) in qla4xxx_remove_adapter()
9000 qla4xxx_prevent_other_port_reinit(ha); in qla4xxx_remove_adapter()
9003 qla4xxx_destroy_ifaces(ha); in qla4xxx_remove_adapter()
9005 if ((!ql4xdisablesysfsboot) && ha->boot_kset) in qla4xxx_remove_adapter()
9006 iscsi_boot_destroy_kset(ha->boot_kset); in qla4xxx_remove_adapter()
9008 qla4xxx_destroy_fw_ddb_session(ha); in qla4xxx_remove_adapter()
9009 qla4_8xxx_free_sysfs_attr(ha); in qla4xxx_remove_adapter()
9011 qla4xxx_sysfs_ddb_remove(ha); in qla4xxx_remove_adapter()
9012 scsi_remove_host(ha->host); in qla4xxx_remove_adapter()
9014 qla4xxx_free_adapter(ha); in qla4xxx_remove_adapter()
9016 scsi_host_put(ha->host); in qla4xxx_remove_adapter()
9029 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha) in qla4xxx_config_dma_addressing() argument
9034 if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(64)) == 0) { in qla4xxx_config_dma_addressing()
9035 if (pci_set_consistent_dma_mask(ha->pdev, DMA_BIT_MASK(64))) { in qla4xxx_config_dma_addressing()
9036 dev_dbg(&ha->pdev->dev, in qla4xxx_config_dma_addressing()
9039 retval = pci_set_consistent_dma_mask(ha->pdev, in qla4xxx_config_dma_addressing()
9043 retval = pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(32)); in qla4xxx_config_dma_addressing()
9073 struct srb *qla4xxx_del_from_active_array(struct scsi_qla_host *ha, in qla4xxx_del_from_active_array() argument
9079 cmd = scsi_host_find_tag(ha->host, index); in qla4xxx_del_from_active_array()
9089 ha->iocb_cnt -= srb->iocb_cnt; in qla4xxx_del_from_active_array()
9105 static int qla4xxx_eh_wait_on_command(struct scsi_qla_host *ha, in qla4xxx_eh_wait_on_command() argument
9116 if (unlikely(pci_channel_offline(ha->pdev)) || in qla4xxx_eh_wait_on_command()
9117 (test_bit(AF_EEH_BUSY, &ha->flags))) { in qla4xxx_eh_wait_on_command()
9118 ql4_printk(KERN_WARNING, ha, "scsi%ld: Return from %s\n", in qla4xxx_eh_wait_on_command()
9119 ha->host_no, __func__); in qla4xxx_eh_wait_on_command()
9141 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha) in qla4xxx_wait_for_hba_online() argument
9148 if (adapter_up(ha)) in qla4xxx_wait_for_hba_online()
9166 static int qla4xxx_eh_wait_for_commands(struct scsi_qla_host *ha, in qla4xxx_eh_wait_for_commands() argument
9178 for (cnt = 0; cnt < ha->host->can_queue; cnt++) { in qla4xxx_eh_wait_for_commands()
9179 cmd = scsi_host_find_tag(ha->host, cnt); in qla4xxx_eh_wait_for_commands()
9182 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { in qla4xxx_eh_wait_for_commands()
9200 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_abort() local
9208 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Abort command issued cmd=%p, cdb=0x%x\n", in qla4xxx_eh_abort()
9209 ha->host_no, id, lun, cmd, cmd->cmnd[0]); in qla4xxx_eh_abort()
9211 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9214 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9215 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Specified command has already completed.\n", in qla4xxx_eh_abort()
9216 ha->host_no, id, lun); in qla4xxx_eh_abort()
9220 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9222 if (qla4xxx_abort_task(ha, srb) != QLA_SUCCESS) { in qla4xxx_eh_abort()
9224 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9228 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9236 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { in qla4xxx_eh_abort()
9238 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9243 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_abort()
9245 ha->host_no, id, lun, (ret == SUCCESS) ? "succeeded" : "failed"); in qla4xxx_eh_abort()
9259 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_device_reset() local
9271 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9272 "scsi%ld:%d:%d:%llu: DEVICE RESET ISSUED.\n", ha->host_no, in qla4xxx_eh_device_reset()
9277 "dpc_flags=%lx, status=%x allowed=%d\n", ha->host_no, in qla4xxx_eh_device_reset()
9279 ha->dpc_flags, cmd->result, cmd->allowed)); in qla4xxx_eh_device_reset()
9282 stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun); in qla4xxx_eh_device_reset()
9284 ql4_printk(KERN_INFO, ha, "DEVICE RESET FAILED. %d\n", stat); in qla4xxx_eh_device_reset()
9288 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), in qla4xxx_eh_device_reset()
9290 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9297 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, in qla4xxx_eh_device_reset()
9301 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9303 ha->host_no, cmd->device->channel, cmd->device->id, in qla4xxx_eh_device_reset()
9321 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_target_reset() local
9338 ha->host_no, cmd, jiffies, cmd->request->timeout / HZ, in qla4xxx_eh_target_reset()
9339 ha->dpc_flags, cmd->result, cmd->allowed)); in qla4xxx_eh_target_reset()
9341 stat = qla4xxx_reset_target(ha, ddb_entry); in qla4xxx_eh_target_reset()
9348 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), in qla4xxx_eh_target_reset()
9357 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, in qla4xxx_eh_target_reset()
9394 struct scsi_qla_host *ha; in qla4xxx_eh_host_reset() local
9396 ha = to_qla_host(cmd->device->host); in qla4xxx_eh_host_reset()
9398 if ((is_qla8032(ha) || is_qla8042(ha)) && ql4xdontresethba) in qla4xxx_eh_host_reset()
9399 qla4_83xx_set_idc_dontreset(ha); in qla4xxx_eh_host_reset()
9406 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_eh_host_reset()
9407 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_eh_host_reset()
9409 ha->host_no, __func__)); in qla4xxx_eh_host_reset()
9413 qla4xxx_abort_active_cmds(ha, DID_ABORT << 16); in qla4xxx_eh_host_reset()
9418 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_host_reset()
9419 "scsi(%ld:%d:%d:%llu): HOST RESET ISSUED.\n", ha->host_no, in qla4xxx_eh_host_reset()
9422 if (qla4xxx_wait_for_hba_online(ha) != QLA_SUCCESS) { in qla4xxx_eh_host_reset()
9424 "DEAD.\n", ha->host_no, cmd->device->channel, in qla4xxx_eh_host_reset()
9430 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_eh_host_reset()
9431 if (is_qla80XX(ha)) in qla4xxx_eh_host_reset()
9432 set_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_eh_host_reset()
9434 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_eh_host_reset()
9437 if (qla4xxx_recover_adapter(ha) == QLA_SUCCESS) in qla4xxx_eh_host_reset()
9440 ql4_printk(KERN_INFO, ha, "HOST RESET %s.\n", in qla4xxx_eh_host_reset()
9446 static int qla4xxx_context_reset(struct scsi_qla_host *ha) in qla4xxx_context_reset() argument
9455 acb = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_context_reset()
9459 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc acb\n", in qla4xxx_context_reset()
9467 rval = qla4xxx_get_acb(ha, acb_dma, PRIMARI_ACB, acb_len); in qla4xxx_context_reset()
9473 rval = qla4xxx_disable_acb(ha); in qla4xxx_context_reset()
9479 wait_for_completion_timeout(&ha->disable_acb_comp, in qla4xxx_context_reset()
9482 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], acb_dma); in qla4xxx_context_reset()
9489 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk_def), in qla4xxx_context_reset()
9492 DEBUG2(ql4_printk(KERN_INFO, ha, "%s %s\n", __func__, in qla4xxx_context_reset()
9499 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_host_reset() local
9504 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Don't Reset HBA\n", in qla4xxx_host_reset()
9510 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_host_reset()
9515 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_host_reset()
9518 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_host_reset()
9519 if (is_qla80XX(ha)) in qla4xxx_host_reset()
9522 &ha->dpc_flags); in qla4xxx_host_reset()
9524 rval = qla4xxx_context_reset(ha); in qla4xxx_host_reset()
9534 if ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_host_reset()
9535 test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_host_reset()
9536 idc_ctrl = qla4_83xx_rd_reg(ha, QLA83XX_IDC_DRV_CTRL); in qla4xxx_host_reset()
9537 qla4_83xx_wr_reg(ha, QLA83XX_IDC_DRV_CTRL, in qla4xxx_host_reset()
9541 rval = qla4xxx_recover_adapter(ha); in qla4xxx_host_reset()
9543 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: recover adapter fail\n", in qla4xxx_host_reset()
9570 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_error_detected() local
9572 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: error detected:state %x\n", in qla4xxx_pci_error_detected()
9573 ha->host_no, __func__, state); in qla4xxx_pci_error_detected()
9575 if (!is_aer_supported(ha)) in qla4xxx_pci_error_detected()
9580 clear_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9583 set_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9584 qla4xxx_mailbox_premature_completion(ha); in qla4xxx_pci_error_detected()
9585 qla4xxx_free_irqs(ha); in qla4xxx_pci_error_detected()
9588 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_pci_error_detected()
9591 set_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9592 set_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags); in qla4xxx_pci_error_detected()
9593 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_pci_error_detected()
9607 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_mmio_enabled() local
9609 if (!is_aer_supported(ha)) in qla4xxx_pci_mmio_enabled()
9615 static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha) in qla4_8xxx_error_recovery() argument
9621 ql4_printk(KERN_WARNING, ha, "scsi%ld: In %s\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9623 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4_8xxx_error_recovery()
9625 if (test_bit(AF_ONLINE, &ha->flags)) { in qla4_8xxx_error_recovery()
9626 clear_bit(AF_ONLINE, &ha->flags); in qla4_8xxx_error_recovery()
9627 clear_bit(AF_LINK_UP, &ha->flags); in qla4_8xxx_error_recovery()
9628 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); in qla4_8xxx_error_recovery()
9629 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4_8xxx_error_recovery()
9632 fn = PCI_FUNC(ha->pdev->devfn); in qla4_8xxx_error_recovery()
9633 if (is_qla8022(ha)) { in qla4_8xxx_error_recovery()
9636 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Finding PCI device at func %x\n", in qla4_8xxx_error_recovery()
9637 ha->host_no, __func__, fn); in qla4_8xxx_error_recovery()
9641 pci_domain_nr(ha->pdev->bus), in qla4_8xxx_error_recovery()
9642 ha->pdev->bus->number, in qla4_8xxx_error_recovery()
9643 PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), in qla4_8xxx_error_recovery()
9650 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Found PCI func in enabled state%x\n", in qla4_8xxx_error_recovery()
9651 ha->host_no, __func__, fn); in qla4_8xxx_error_recovery()
9659 if (qla4_83xx_can_perform_reset(ha)) { in qla4_8xxx_error_recovery()
9670 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn being reset " in qla4_8xxx_error_recovery()
9671 "0x%x is the owner\n", ha->host_no, __func__, in qla4_8xxx_error_recovery()
9672 ha->pdev->devfn); in qla4_8xxx_error_recovery()
9674 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9675 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9677 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9679 rval = qla4_8xxx_update_idc_reg(ha); in qla4_8xxx_error_recovery()
9681 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: FAILED\n", in qla4_8xxx_error_recovery()
9682 ha->host_no, __func__); in qla4_8xxx_error_recovery()
9683 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9684 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9686 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9690 clear_bit(AF_FW_RECOVERY, &ha->flags); in qla4_8xxx_error_recovery()
9691 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4_8xxx_error_recovery()
9694 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " in qla4_8xxx_error_recovery()
9695 "FAILED\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9696 qla4xxx_free_irqs(ha); in qla4_8xxx_error_recovery()
9697 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9698 qla4_8xxx_clear_drv_active(ha); in qla4_8xxx_error_recovery()
9699 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9701 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9703 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " in qla4_8xxx_error_recovery()
9704 "READY\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9705 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9706 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9709 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DRV_STATE, 0); in qla4_8xxx_error_recovery()
9710 qla4_8xxx_set_drv_active(ha); in qla4_8xxx_error_recovery()
9711 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9712 ha->isp_ops->enable_intrs(ha); in qla4_8xxx_error_recovery()
9715 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn 0x%x is not " in qla4_8xxx_error_recovery()
9716 "the reset owner\n", ha->host_no, __func__, in qla4_8xxx_error_recovery()
9717 ha->pdev->devfn); in qla4_8xxx_error_recovery()
9718 if ((qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE) == in qla4_8xxx_error_recovery()
9720 clear_bit(AF_FW_RECOVERY, &ha->flags); in qla4_8xxx_error_recovery()
9721 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4_8xxx_error_recovery()
9723 ha->isp_ops->enable_intrs(ha); in qla4_8xxx_error_recovery()
9725 qla4xxx_free_irqs(ha); in qla4_8xxx_error_recovery()
9727 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9728 qla4_8xxx_set_drv_active(ha); in qla4_8xxx_error_recovery()
9729 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9733 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4_8xxx_error_recovery()
9741 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_slot_reset() local
9744 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: slot_reset\n", in qla4xxx_pci_slot_reset()
9745 ha->host_no, __func__); in qla4xxx_pci_slot_reset()
9747 if (!is_aer_supported(ha)) in qla4xxx_pci_slot_reset()
9764 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Can't re-enable " in qla4xxx_pci_slot_reset()
9765 "device after reset\n", ha->host_no, __func__); in qla4xxx_pci_slot_reset()
9769 ha->isp_ops->disable_intrs(ha); in qla4xxx_pci_slot_reset()
9771 if (is_qla80XX(ha)) { in qla4xxx_pci_slot_reset()
9772 if (qla4_8xxx_error_recovery(ha) == QLA_SUCCESS) { in qla4xxx_pci_slot_reset()
9780 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Return=%x\n" in qla4xxx_pci_slot_reset()
9781 "device after reset\n", ha->host_no, __func__, ret); in qla4xxx_pci_slot_reset()
9788 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_resume() local
9791 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: pci_resume\n", in qla4xxx_pci_resume()
9792 ha->host_no, __func__); in qla4xxx_pci_resume()
9794 ret = qla4xxx_wait_for_hba_online(ha); in qla4xxx_pci_resume()
9796 ql4_printk(KERN_ERR, ha, "scsi%ld: %s: the device failed to " in qla4xxx_pci_resume()
9797 "resume I/O from slot/link_reset\n", ha->host_no, in qla4xxx_pci_resume()
9802 clear_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_resume()