Lines Matching refs:ha

99 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha);
103 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha);
298 static int qla4xxx_isp_check_reg(struct scsi_qla_host *ha) in qla4xxx_isp_check_reg() argument
303 if (is_qla8022(ha)) in qla4xxx_isp_check_reg()
304 reg_val = readl(&ha->qla4_82xx_reg->host_status); in qla4xxx_isp_check_reg()
305 else if (is_qla8032(ha) || is_qla8042(ha)) in qla4xxx_isp_check_reg()
306 reg_val = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_ALIVE_COUNTER); in qla4xxx_isp_check_reg()
308 reg_val = readw(&ha->reg->ctrl_status); in qla4xxx_isp_check_reg()
320 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_send_ping() local
333 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv4 Ping src: %pI4 " in qla4xxx_send_ping()
335 &ha->ip_config.ip_address, ipaddr)); in qla4xxx_send_ping()
336 rval = qla4xxx_ping_iocb(ha, options, payload_size, pid, in qla4xxx_send_ping()
350 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: LinkLocal Ping " in qla4xxx_send_ping()
352 &ha->ip_config.ipv6_link_local_addr, in qla4xxx_send_ping()
355 rval = qla4xxx_ping_iocb(ha, options, payload_size, in qla4xxx_send_ping()
358 ql4_printk(KERN_WARNING, ha, "%s: iface num = %d " in qla4xxx_send_ping()
372 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " in qla4xxx_send_ping()
375 &ha->ip_config.ipv6_addr0, in qla4xxx_send_ping()
379 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " in qla4xxx_send_ping()
382 &ha->ip_config.ipv6_addr1, in qla4xxx_send_ping()
385 rval = qla4xxx_ping_iocb(ha, options, payload_size, in qla4xxx_send_ping()
631 static void qla4xxx_create_chap_list(struct scsi_qla_host *ha) in qla4xxx_create_chap_list() argument
639 if (is_qla40XX(ha)) in qla4xxx_create_chap_list()
645 chap_size = ha->hw.flt_chap_size / 2; in qla4xxx_create_chap_list()
647 chap_flash_data = dma_alloc_coherent(&ha->pdev->dev, chap_size, in qla4xxx_create_chap_list()
650 ql4_printk(KERN_ERR, ha, "No memory for chap_flash_data\n"); in qla4xxx_create_chap_list()
654 if (is_qla40XX(ha)) { in qla4xxx_create_chap_list()
657 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); in qla4xxx_create_chap_list()
658 if (ha->port_num == 1) in qla4xxx_create_chap_list()
662 rval = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); in qla4xxx_create_chap_list()
666 if (ha->chap_list == NULL) in qla4xxx_create_chap_list()
667 ha->chap_list = vmalloc(chap_size); in qla4xxx_create_chap_list()
668 if (ha->chap_list == NULL) { in qla4xxx_create_chap_list()
669 ql4_printk(KERN_ERR, ha, "No memory for ha->chap_list\n"); in qla4xxx_create_chap_list()
673 memset(ha->chap_list, 0, chap_size); in qla4xxx_create_chap_list()
674 memcpy(ha->chap_list, chap_flash_data, chap_size); in qla4xxx_create_chap_list()
677 dma_free_coherent(&ha->pdev->dev, chap_size, chap_flash_data, chap_dma); in qla4xxx_create_chap_list()
680 static int qla4xxx_get_chap_by_index(struct scsi_qla_host *ha, in qla4xxx_get_chap_by_index() argument
687 if (!ha->chap_list) { in qla4xxx_get_chap_by_index()
688 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); in qla4xxx_get_chap_by_index()
693 if (is_qla80XX(ha)) in qla4xxx_get_chap_by_index()
694 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_chap_by_index()
700 ql4_printk(KERN_ERR, ha, "Invalid Chap index\n"); in qla4xxx_get_chap_by_index()
705 *chap_entry = (struct ql4_chap_table *)ha->chap_list + chap_index; in qla4xxx_get_chap_by_index()
727 static int qla4xxx_find_free_chap_index(struct scsi_qla_host *ha, in qla4xxx_find_free_chap_index() argument
735 if (is_qla80XX(ha)) in qla4xxx_find_free_chap_index()
736 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_find_free_chap_index()
741 if (!ha->chap_list) { in qla4xxx_find_free_chap_index()
742 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); in qla4xxx_find_free_chap_index()
748 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_find_free_chap_index()
772 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_chap_list() local
779 if (is_qla80XX(ha)) in qla4xxx_get_chap_list()
780 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_chap_list()
785 ql4_printk(KERN_INFO, ha, "%s: num_entries = %d, CHAP idx = %d\n", in qla4xxx_get_chap_list()
793 qla4xxx_create_chap_list(ha); in qla4xxx_get_chap_list()
796 mutex_lock(&ha->chap_sem); in qla4xxx_get_chap_list()
798 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_get_chap_list()
824 mutex_unlock(&ha->chap_sem); in qla4xxx_get_chap_list()
827 ql4_printk(KERN_INFO, ha, "%s: Valid CHAP Entries = %d\n", in qla4xxx_get_chap_list()
871 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_delete_chap() local
879 chap_table = dma_pool_zalloc(ha->chap_dma_pool, GFP_KERNEL, &chap_dma); in qla4xxx_delete_chap()
883 if (is_qla80XX(ha)) in qla4xxx_delete_chap()
884 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_delete_chap()
898 ql4_printk(KERN_INFO, ha, "CHAP entry %d is in use, cannot " in qla4xxx_delete_chap()
905 if (is_qla40XX(ha)) in qla4xxx_delete_chap()
908 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); in qla4xxx_delete_chap()
912 if (ha->port_num == 1) in qla4xxx_delete_chap()
913 offset += (ha->hw.flt_chap_size / 2); in qla4xxx_delete_chap()
917 ret = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); in qla4xxx_delete_chap()
923 DEBUG2(ql4_printk(KERN_INFO, ha, "Chap Cookie: x%x\n", in qla4xxx_delete_chap()
927 ql4_printk(KERN_ERR, ha, "No valid chap entry found\n"); in qla4xxx_delete_chap()
935 ret = qla4xxx_set_flash(ha, chap_dma, offset, chap_size, in qla4xxx_delete_chap()
937 if (ret == QLA_SUCCESS && ha->chap_list) { in qla4xxx_delete_chap()
938 mutex_lock(&ha->chap_sem); in qla4xxx_delete_chap()
940 memcpy((struct ql4_chap_table *)ha->chap_list + chap_tbl_idx, in qla4xxx_delete_chap()
942 mutex_unlock(&ha->chap_sem); in qla4xxx_delete_chap()
948 dma_pool_free(ha->chap_dma_pool, chap_table, chap_dma); in qla4xxx_delete_chap()
962 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_chap_entry() local
999 ql4_printk(KERN_ERR, ha, in qla4xxx_set_chap_entry()
1011 if (is_qla80XX(ha)) in qla4xxx_set_chap_entry()
1012 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_set_chap_entry()
1017 mutex_lock(&ha->chap_sem); in qla4xxx_set_chap_entry()
1019 rc = qla4xxx_get_chap_by_index(ha, chap_rec.chap_tbl_idx, in qla4xxx_set_chap_entry()
1023 ql4_printk(KERN_INFO, ha, in qla4xxx_set_chap_entry()
1034 ql4_printk(KERN_INFO, ha, in qla4xxx_set_chap_entry()
1042 rc = qla4xxx_find_free_chap_index(ha, &chap_rec.chap_tbl_idx); in qla4xxx_set_chap_entry()
1044 ql4_printk(KERN_INFO, ha, "CHAP entry not available\n"); in qla4xxx_set_chap_entry()
1050 rc = qla4xxx_set_chap(ha, chap_rec.username, chap_rec.password, in qla4xxx_set_chap_entry()
1054 mutex_unlock(&ha->chap_sem); in qla4xxx_set_chap_entry()
1063 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_host_stats() local
1072 DEBUG2(ql4_printk(KERN_INFO, ha, "Func: %s\n", __func__)); in qla4xxx_get_host_stats()
1077 ql4_printk(KERN_INFO, ha, "%s: host_stats size mismatch expected = %d, is = %d\n", in qla4xxx_get_host_stats()
1091 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, in qla4xxx_get_host_stats()
1094 ql4_printk(KERN_ERR, ha, in qla4xxx_get_host_stats()
1100 ret = qla4xxx_get_mgmt_data(ha, ddb_idx, stats_size, in qla4xxx_get_host_stats()
1103 ql4_printk(KERN_ERR, ha, in qla4xxx_get_host_stats()
1257 dma_free_coherent(&ha->pdev->dev, stats_size, in qla4xxx_get_host_stats()
1260 ql4_printk(KERN_INFO, ha, "%s: Get host stats done\n", in qla4xxx_get_host_stats()
1270 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_iface_param() local
1278 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); in qla4xxx_get_iface_param()
1282 &ha->ip_config.subnet_mask); in qla4xxx_get_iface_param()
1285 len = sprintf(buf, "%pI4\n", &ha->ip_config.gateway); in qla4xxx_get_iface_param()
1289 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1292 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1300 (ha->ip_config.tcp_options & in qla4xxx_get_iface_param()
1307 &ha->ip_config.ipv6_addr0); in qla4xxx_get_iface_param()
1310 &ha->ip_config.ipv6_addr1); in qla4xxx_get_iface_param()
1314 &ha->ip_config.ipv6_link_local_addr); in qla4xxx_get_iface_param()
1318 &ha->ip_config.ipv6_default_router_addr); in qla4xxx_get_iface_param()
1321 pval = (ha->ip_config.ipv6_addl_options & in qla4xxx_get_iface_param()
1328 pval = (ha->ip_config.ipv6_addl_options & in qla4xxx_get_iface_param()
1336 ival = ha->ip_config.ipv4_vlan_tag & in qla4xxx_get_iface_param()
1339 ival = ha->ip_config.ipv6_vlan_tag & in qla4xxx_get_iface_param()
1346 ival = (ha->ip_config.ipv4_vlan_tag >> 13) & in qla4xxx_get_iface_param()
1349 ival = (ha->ip_config.ipv6_vlan_tag >> 13) & in qla4xxx_get_iface_param()
1356 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1359 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1365 len = sprintf(buf, "%d\n", ha->ip_config.eth_mtu_size); in qla4xxx_get_iface_param()
1370 ha->ip_config.ipv4_port); in qla4xxx_get_iface_param()
1373 ha->ip_config.ipv6_port); in qla4xxx_get_iface_param()
1378 ha->ip_config.ipv4_addr_state); in qla4xxx_get_iface_param()
1382 ha->ip_config.ipv6_addr0_state); in qla4xxx_get_iface_param()
1385 ha->ip_config.ipv6_addr1_state); in qla4xxx_get_iface_param()
1392 ha->ip_config.ipv6_link_local_state); in qla4xxx_get_iface_param()
1397 ha->ip_config.ipv6_default_router_state); in qla4xxx_get_iface_param()
1402 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1405 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1412 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1415 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1422 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1425 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1434 ha->ip_config.tcp_wsf); in qla4xxx_get_iface_param()
1437 ha->ip_config.ipv6_tcp_wsf); in qla4xxx_get_iface_param()
1441 ival = (ha->ip_config.tcp_options & in qla4xxx_get_iface_param()
1444 ival = (ha->ip_config.ipv6_tcp_options & in qla4xxx_get_iface_param()
1451 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1454 OP_STATE(ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1462 ha->ip_config.ipv4_cache_id); in qla4xxx_get_iface_param()
1465 ha->ip_config.ipv6_cache_id); in qla4xxx_get_iface_param()
1468 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1474 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1480 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1486 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_tos); in qla4xxx_get_iface_param()
1489 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1495 OP_STATE(ha->ip_config.ipv4_options, IPOPT_ALT_CID_EN, in qla4xxx_get_iface_param()
1501 pval = (ha->ip_config.ipv4_alt_cid_len) ? in qla4xxx_get_iface_param()
1502 (char *)ha->ip_config.ipv4_alt_cid : ""; in qla4xxx_get_iface_param()
1507 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1513 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1519 pval = (ha->ip_config.ipv4_vid_len) ? in qla4xxx_get_iface_param()
1520 (char *)ha->ip_config.ipv4_vid : ""; in qla4xxx_get_iface_param()
1525 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1531 OP_STATE(~ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1537 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1544 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1547 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1553 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_ttl); in qla4xxx_get_iface_param()
1556 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1562 OP_STATE(ha->ip_config.ipv6_addl_options, in qla4xxx_get_iface_param()
1568 len = sprintf(buf, "%u\n", ha->ip_config.ipv6_flow_lbl); in qla4xxx_get_iface_param()
1572 ha->ip_config.ipv6_traffic_class); in qla4xxx_get_iface_param()
1576 ha->ip_config.ipv6_hop_limit); in qla4xxx_get_iface_param()
1580 ha->ip_config.ipv6_nd_reach_time); in qla4xxx_get_iface_param()
1584 ha->ip_config.ipv6_nd_rexmit_timer); in qla4xxx_get_iface_param()
1588 ha->ip_config.ipv6_nd_stale_timeout); in qla4xxx_get_iface_param()
1592 ha->ip_config.ipv6_dup_addr_detect_count); in qla4xxx_get_iface_param()
1596 ha->ip_config.ipv6_gw_advrt_mtu); in qla4xxx_get_iface_param()
1604 len = sprintf(buf, "%d\n", ha->ip_config.def_timeout); in qla4xxx_get_iface_param()
1607 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1613 OP_STATE(ha->ip_config.iscsi_options, 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()
1644 (ha->ip_config.iscsi_options & in qla4xxx_get_iface_param()
1649 ha->ip_config.iscsi_max_pdu_size * in qla4xxx_get_iface_param()
1654 ha->ip_config.iscsi_first_burst_len * in qla4xxx_get_iface_param()
1659 ha->ip_config.iscsi_max_outstnd_r2t); in qla4xxx_get_iface_param()
1663 ha->ip_config.iscsi_max_burst_len * in qla4xxx_get_iface_param()
1667 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1673 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1679 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1685 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1691 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1697 len = sprintf(buf, "%s\n", ha->ip_config.iscsi_name); in qla4xxx_get_iface_param()
1714 struct scsi_qla_host *ha; in qla4xxx_ep_connect() local
1724 ha = iscsi_host_priv(shost); in qla4xxx_ep_connect()
1736 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI4\n", __func__, in qla4xxx_ep_connect()
1742 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI6\n", __func__, in qla4xxx_ep_connect()
1745 ql4_printk(KERN_WARNING, ha, "%s: Invalid endpoint\n", in qla4xxx_ep_connect()
1757 struct scsi_qla_host *ha; in qla4xxx_ep_poll() local
1761 ha = to_qla_host(qla_ep->host); in qla4xxx_ep_poll()
1762 DEBUG2(pr_info_ratelimited("%s: host: %ld\n", __func__, ha->host_no)); in qla4xxx_ep_poll()
1764 if (adapter_up(ha) && !test_bit(AF_BUILD_DDB_LIST, &ha->flags)) in qla4xxx_ep_poll()
1773 struct scsi_qla_host *ha; in qla4xxx_ep_disconnect() local
1776 ha = to_qla_host(qla_ep->host); in qla4xxx_ep_disconnect()
1777 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_ep_disconnect()
1778 ha->host_no)); in qla4xxx_ep_disconnect()
1788 struct scsi_qla_host *ha; in qla4xxx_get_ep_param() local
1793 ha = to_qla_host(qla_ep->host); in qla4xxx_get_ep_param()
1794 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_get_ep_param()
1795 ha->host_no)); in qla4xxx_get_ep_param()
1817 struct scsi_qla_host *ha; in qla4xxx_conn_get_stats() local
1826 ha = ddb_entry->ha; in qla4xxx_conn_get_stats()
1828 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_conn_get_stats()
1829 ha->host_no)); in qla4xxx_conn_get_stats()
1832 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, in qla4xxx_conn_get_stats()
1835 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_get_stats()
1840 ret = qla4xxx_get_mgmt_data(ha, ddb_entry->fw_ddb_index, stats_size, in qla4xxx_conn_get_stats()
1843 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_get_stats()
1873 dma_free_coherent(&ha->pdev->dev, stats_size, ql_iscsi_stats, in qla4xxx_conn_get_stats()
1897 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_port_speed() local
1901 qla4xxx_get_firmware_state(ha); in qla4xxx_set_port_speed()
1903 switch (ha->addl_fw_state & 0x0F00) { in qla4xxx_set_port_speed()
1922 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_port_state() local
1926 if (test_bit(AF_LINK_UP, &ha->flags)) in qla4xxx_set_port_state()
1935 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_host_get_param() local
1940 len = sysfs_format_mac(buf, ha->my_mac, MAC_ADDR_LEN); in qla4xxx_host_get_param()
1943 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); in qla4xxx_host_get_param()
1946 len = sprintf(buf, "%s\n", ha->name_string); in qla4xxx_host_get_param()
1963 static void qla4xxx_create_ipv4_iface(struct scsi_qla_host *ha) in qla4xxx_create_ipv4_iface() argument
1965 if (ha->iface_ipv4) in qla4xxx_create_ipv4_iface()
1969 ha->iface_ipv4 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv4_iface()
1972 if (!ha->iface_ipv4) in qla4xxx_create_ipv4_iface()
1973 ql4_printk(KERN_ERR, ha, "Could not create IPv4 iSCSI " in qla4xxx_create_ipv4_iface()
1977 static void qla4xxx_create_ipv6_iface(struct scsi_qla_host *ha) in qla4xxx_create_ipv6_iface() argument
1979 if (!ha->iface_ipv6_0) in qla4xxx_create_ipv6_iface()
1981 ha->iface_ipv6_0 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv6_iface()
1985 if (!ha->iface_ipv6_0) in qla4xxx_create_ipv6_iface()
1986 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " in qla4xxx_create_ipv6_iface()
1989 if (!ha->iface_ipv6_1) in qla4xxx_create_ipv6_iface()
1991 ha->iface_ipv6_1 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv6_iface()
1995 if (!ha->iface_ipv6_1) in qla4xxx_create_ipv6_iface()
1996 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " in qla4xxx_create_ipv6_iface()
2000 static void qla4xxx_create_ifaces(struct scsi_qla_host *ha) in qla4xxx_create_ifaces() argument
2002 if (ha->ip_config.ipv4_options & IPOPT_IPV4_PROTOCOL_ENABLE) in qla4xxx_create_ifaces()
2003 qla4xxx_create_ipv4_iface(ha); in qla4xxx_create_ifaces()
2005 if (ha->ip_config.ipv6_options & IPV6_OPT_IPV6_PROTOCOL_ENABLE) in qla4xxx_create_ifaces()
2006 qla4xxx_create_ipv6_iface(ha); in qla4xxx_create_ifaces()
2009 static void qla4xxx_destroy_ipv4_iface(struct scsi_qla_host *ha) in qla4xxx_destroy_ipv4_iface() argument
2011 if (ha->iface_ipv4) { in qla4xxx_destroy_ipv4_iface()
2012 iscsi_destroy_iface(ha->iface_ipv4); in qla4xxx_destroy_ipv4_iface()
2013 ha->iface_ipv4 = NULL; in qla4xxx_destroy_ipv4_iface()
2017 static void qla4xxx_destroy_ipv6_iface(struct scsi_qla_host *ha) in qla4xxx_destroy_ipv6_iface() argument
2019 if (ha->iface_ipv6_0) { in qla4xxx_destroy_ipv6_iface()
2020 iscsi_destroy_iface(ha->iface_ipv6_0); in qla4xxx_destroy_ipv6_iface()
2021 ha->iface_ipv6_0 = NULL; in qla4xxx_destroy_ipv6_iface()
2023 if (ha->iface_ipv6_1) { in qla4xxx_destroy_ipv6_iface()
2024 iscsi_destroy_iface(ha->iface_ipv6_1); in qla4xxx_destroy_ipv6_iface()
2025 ha->iface_ipv6_1 = NULL; in qla4xxx_destroy_ipv6_iface()
2029 static void qla4xxx_destroy_ifaces(struct scsi_qla_host *ha) in qla4xxx_destroy_ifaces() argument
2031 qla4xxx_destroy_ipv4_iface(ha); in qla4xxx_destroy_ifaces()
2032 qla4xxx_destroy_ipv6_iface(ha); in qla4xxx_destroy_ifaces()
2035 static void qla4xxx_set_ipv6(struct scsi_qla_host *ha, in qla4xxx_set_ipv6() argument
2080 ql4_printk(KERN_ERR, ha, in qla4xxx_set_ipv6()
2097 ql4_printk(KERN_ERR, ha, in qla4xxx_set_ipv6()
2113 qla4xxx_create_ipv6_iface(ha); in qla4xxx_set_ipv6()
2118 qla4xxx_destroy_ipv6_iface(ha); in qla4xxx_set_ipv6()
2278 ql4_printk(KERN_ERR, ha, "Unknown IPv6 param = %d\n", in qla4xxx_set_ipv6()
2284 static void qla4xxx_set_ipv4(struct scsi_qla_host *ha, in qla4xxx_set_ipv4() argument
2309 ql4_printk(KERN_ERR, ha, "Invalid IPv4 bootproto\n"); in qla4xxx_set_ipv4()
2315 qla4xxx_create_ipv4_iface(ha); in qla4xxx_set_ipv4()
2320 qla4xxx_destroy_ipv4_iface(ha); in qla4xxx_set_ipv4()
2536 ql4_printk(KERN_ERR, ha, "Unknown IPv4 param = %d\n", in qla4xxx_set_ipv4()
2542 static void qla4xxx_set_iscsi_param(struct scsi_qla_host *ha, in qla4xxx_set_iscsi_param() argument
2698 ql4_printk(KERN_ERR, ha, "Unknown iscsi param = %d\n", in qla4xxx_set_iscsi_param()
2729 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_iface_set_param() local
2739 init_fw_cb = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_iface_set_param()
2743 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc init_cb\n", in qla4xxx_iface_set_param()
2751 if (qla4xxx_get_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma)) { in qla4xxx_iface_set_param()
2752 ql4_printk(KERN_ERR, ha, "%s: get ifcb failed\n", __func__); in qla4xxx_iface_set_param()
2765 qla4xxx_set_ipv4(ha, iface_param, in qla4xxx_iface_set_param()
2770 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2780 qla4xxx_set_ipv6(ha, iface_param, in qla4xxx_iface_set_param()
2785 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2792 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2797 qla4xxx_set_iscsi_param(ha, iface_param, in qla4xxx_iface_set_param()
2806 rval = qla4xxx_set_flash(ha, init_fw_cb_dma, FLASH_SEGMENT_IFCB, in qla4xxx_iface_set_param()
2810 ql4_printk(KERN_ERR, ha, "%s: set flash mbx failed\n", in qla4xxx_iface_set_param()
2816 rval = qla4xxx_disable_acb(ha); in qla4xxx_iface_set_param()
2818 ql4_printk(KERN_ERR, ha, "%s: disable acb mbx failed\n", in qla4xxx_iface_set_param()
2824 wait_for_completion_timeout(&ha->disable_acb_comp, in qla4xxx_iface_set_param()
2829 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma); in qla4xxx_iface_set_param()
2831 ql4_printk(KERN_ERR, ha, "%s: set acb mbx failed\n", in qla4xxx_iface_set_param()
2838 qla4xxx_update_local_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb, in qla4xxx_iface_set_param()
2842 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk), in qla4xxx_iface_set_param()
2853 struct scsi_qla_host *ha = ddb_entry->ha; in qla4xxx_session_get_param() local
2862 rval = qla4xxx_get_chap_index(ha, sess->username_in, in qla4xxx_session_get_param()
2879 rval = qla4xxx_get_chap_index(ha, sess->username, in qla4xxx_session_get_param()
2898 rval = qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, in qla4xxx_session_get_param()
2939 int qla4xxx_get_ddb_index(struct scsi_qla_host *ha, uint16_t *ddb_index) in qla4xxx_get_ddb_index() argument
2946 tmp_ddb_index = find_first_zero_bit(ha->ddb_idx_map, MAX_DDB_ENTRIES); in qla4xxx_get_ddb_index()
2949 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2955 if (test_and_set_bit(tmp_ddb_index, ha->ddb_idx_map)) in qla4xxx_get_ddb_index()
2958 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2960 ret = qla4xxx_req_ddb_entry(ha, tmp_ddb_index, &mbx_sts); in qla4xxx_get_ddb_index()
2963 ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2968 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2978 static int qla4xxx_match_ipaddress(struct scsi_qla_host *ha, in qla4xxx_match_ipaddress() argument
3012 static int qla4xxx_match_fwdb_session(struct scsi_qla_host *ha, in qla4xxx_match_fwdb_session() argument
3029 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_match_fwdb_session()
3033 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_match_fwdb_session()
3048 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3053 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3058 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3065 rval = qla4xxx_match_ipaddress(ha, ddb_entry, in qla4xxx_match_fwdb_session()
3078 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3089 struct scsi_qla_host *ha; in qla4xxx_session_create() local
3102 ha = to_qla_host(qla_ep->host); in qla4xxx_session_create()
3103 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_session_create()
3104 ha->host_no)); in qla4xxx_session_create()
3106 ret = qla4xxx_get_ddb_index(ha, &ddb_index); in qla4xxx_session_create()
3121 ddb_entry->ha = ha; in qla4xxx_session_create()
3127 ha->fw_ddb_index_map[ddb_entry->fw_ddb_index] = ddb_entry; in qla4xxx_session_create()
3128 ha->tot_ddbs++; in qla4xxx_session_create()
3137 struct scsi_qla_host *ha; in qla4xxx_session_destroy() local
3146 ha = ddb_entry->ha; in qla4xxx_session_destroy()
3147 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_session_destroy()
3148 ha->host_no)); in qla4xxx_session_destroy()
3150 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_session_destroy()
3153 ql4_printk(KERN_ERR, ha, in qla4xxx_session_destroy()
3160 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_session_destroy()
3175 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_session_destroy()
3177 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); in qla4xxx_session_destroy()
3178 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_session_destroy()
3179 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_session_destroy()
3180 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_session_destroy()
3185 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_session_destroy()
3195 struct scsi_qla_host *ha; in qla4xxx_conn_create() local
3209 ha = ddb_entry->ha; in qla4xxx_conn_create()
3210 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: conn_idx = %u\n", __func__, in qla4xxx_conn_create()
3223 struct scsi_qla_host *ha; in qla4xxx_conn_bind() local
3228 ha = ddb_entry->ha; in qla4xxx_conn_bind()
3230 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, in qla4xxx_conn_bind()
3250 struct scsi_qla_host *ha; in qla4xxx_conn_start() local
3259 ha = ddb_entry->ha; in qla4xxx_conn_start()
3260 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, in qla4xxx_conn_start()
3267 ret = qla4xxx_match_fwdb_session(ha, cls_conn); in qla4xxx_conn_start()
3269 ql4_printk(KERN_INFO, ha, in qla4xxx_conn_start()
3275 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_conn_start()
3278 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_start()
3284 ret = qla4xxx_set_param_ddbentry(ha, ddb_entry, cls_conn, &mbx_sts); in qla4xxx_conn_start()
3298 ql4_printk(KERN_ERR, ha, "%s: Failed set param for index[%d]\n", in qla4xxx_conn_start()
3303 status = qla4xxx_conn_open(ha, ddb_entry->fw_ddb_index); in qla4xxx_conn_start()
3305 ql4_printk(KERN_ERR, ha, "%s: Login failed: %s\n", __func__, in qla4xxx_conn_start()
3322 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_conn_start()
3331 struct scsi_qla_host *ha; in qla4xxx_conn_destroy() local
3337 ha = ddb_entry->ha; in qla4xxx_conn_destroy()
3338 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: cid = %d\n", __func__, in qla4xxx_conn_destroy()
3342 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) in qla4xxx_conn_destroy()
3343 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); in qla4xxx_conn_destroy()
3349 struct scsi_qla_host *ha; in qla4xxx_task_work() local
3360 ha = task_data->ha; in qla4xxx_task_work()
3383 ql4_printk(KERN_ERR, ha, "Passthru failed status = 0x%x\n", in qla4xxx_task_work()
3395 struct scsi_qla_host *ha; in qla4xxx_alloc_pdu() local
3400 ha = ddb_entry->ha; in qla4xxx_alloc_pdu()
3405 ql4_printk(KERN_INFO, ha, in qla4xxx_alloc_pdu()
3411 task_data->ha = ha; in qla4xxx_alloc_pdu()
3415 task_data->data_dma = dma_map_single(&ha->pdev->dev, task->data, in qla4xxx_alloc_pdu()
3420 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", in qla4xxx_alloc_pdu()
3424 task_data->resp_buffer = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_alloc_pdu()
3432 task_data->req_buffer = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_alloc_pdu()
3447 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, in qla4xxx_alloc_pdu()
3451 dma_free_coherent(&ha->pdev->dev, task_data->req_len, in qla4xxx_alloc_pdu()
3461 struct scsi_qla_host *ha; in qla4xxx_task_cleanup() local
3467 ha = ddb_entry->ha; in qla4xxx_task_cleanup()
3471 dma_unmap_single(&ha->pdev->dev, task_data->data_dma, in qla4xxx_task_cleanup()
3475 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", in qla4xxx_task_cleanup()
3478 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, in qla4xxx_task_cleanup()
3480 dma_free_coherent(&ha->pdev->dev, task_data->req_len, in qla4xxx_task_cleanup()
3490 struct scsi_qla_host *ha = ddb_entry->ha; in qla4xxx_task_xmit() local
3495 ql4_printk(KERN_INFO, ha, "%s: scsi cmd xmit not implemented\n", in qla4xxx_task_xmit()
3848 static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha, in qla4xxx_copy_fwddb_param() argument
3890 (char *)ha->name_string, buflen); in qla4xxx_copy_fwddb_param()
3893 if (!qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, in qla4xxx_copy_fwddb_param()
3906 void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha, in qla4xxx_update_session_conn_fwddb_param() argument
3915 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_fwddb_param()
3918 ql4_printk(KERN_ERR, ha, in qla4xxx_update_session_conn_fwddb_param()
3923 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, in qla4xxx_update_session_conn_fwddb_param()
3926 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " in qla4xxx_update_session_conn_fwddb_param()
3928 ha->host_no, __func__, in qla4xxx_update_session_conn_fwddb_param()
3938 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); in qla4xxx_update_session_conn_fwddb_param()
3942 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_fwddb_param()
3946 void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, in qla4xxx_update_session_conn_param() argument
3957 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_param()
3960 ql4_printk(KERN_ERR, ha, in qla4xxx_update_session_conn_param()
3965 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, in qla4xxx_update_session_conn_param()
3968 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " in qla4xxx_update_session_conn_param()
3970 ha->host_no, __func__, in qla4xxx_update_session_conn_param()
3993 memcpy(sess->initiatorname, ha->name_string, in qla4xxx_update_session_conn_param()
3994 min(sizeof(ha->name_string), sizeof(sess->initiatorname))); in qla4xxx_update_session_conn_param()
3998 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_param()
4007 static void qla4xxx_start_timer(struct scsi_qla_host *ha, in qla4xxx_start_timer() argument
4011 __func__, ha->host->host_no)); in qla4xxx_start_timer()
4012 timer_setup(&ha->timer, qla4xxx_timer, 0); in qla4xxx_start_timer()
4013 ha->timer.expires = jiffies + interval * HZ; in qla4xxx_start_timer()
4014 add_timer(&ha->timer); in qla4xxx_start_timer()
4015 ha->timer_active = 1; in qla4xxx_start_timer()
4018 static void qla4xxx_stop_timer(struct scsi_qla_host *ha) in qla4xxx_stop_timer() argument
4020 del_timer_sync(&ha->timer); in qla4xxx_stop_timer()
4021 ha->timer_active = 0; in qla4xxx_stop_timer()
4042 void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha) in qla4xxx_mark_all_devices_missing() argument
4044 iscsi_host_for_each_session(ha->host, qla4xxx_mark_device_missing); in qla4xxx_mark_all_devices_missing()
4047 static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha, in qla4xxx_get_new_srb() argument
4053 srb = mempool_alloc(ha->srb_mempool, GFP_ATOMIC); in qla4xxx_get_new_srb()
4058 srb->ha = ha; in qla4xxx_get_new_srb()
4067 static void qla4xxx_srb_free_dma(struct scsi_qla_host *ha, struct srb *srb) in qla4xxx_srb_free_dma() argument
4082 struct scsi_qla_host *ha = srb->ha; in qla4xxx_srb_compl() local
4084 qla4xxx_srb_free_dma(ha, srb); in qla4xxx_srb_compl()
4086 mempool_free(srb, ha->srb_mempool); in qla4xxx_srb_compl()
4106 struct scsi_qla_host *ha = to_qla_host(host); in qla4xxx_queuecommand() local
4112 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_queuecommand()
4113 if (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags)) in qla4xxx_queuecommand()
4131 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_queuecommand()
4132 test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || in qla4xxx_queuecommand()
4133 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_queuecommand()
4134 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || in qla4xxx_queuecommand()
4135 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || in qla4xxx_queuecommand()
4136 !test_bit(AF_ONLINE, &ha->flags) || in qla4xxx_queuecommand()
4137 !test_bit(AF_LINK_UP, &ha->flags) || in qla4xxx_queuecommand()
4138 test_bit(AF_LOOPBACK, &ha->flags) || in qla4xxx_queuecommand()
4139 test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags) || in qla4xxx_queuecommand()
4140 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags) || in qla4xxx_queuecommand()
4141 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) in qla4xxx_queuecommand()
4144 srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd); in qla4xxx_queuecommand()
4148 rval = qla4xxx_send_command_to_isp(ha, srb); in qla4xxx_queuecommand()
4155 qla4xxx_srb_free_dma(ha, srb); in qla4xxx_queuecommand()
4156 mempool_free(srb, ha->srb_mempool); in qla4xxx_queuecommand()
4173 static void qla4xxx_mem_free(struct scsi_qla_host *ha) in qla4xxx_mem_free() argument
4175 if (ha->queues) in qla4xxx_mem_free()
4176 dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues, in qla4xxx_mem_free()
4177 ha->queues_dma); in qla4xxx_mem_free()
4179 if (ha->fw_dump) in qla4xxx_mem_free()
4180 vfree(ha->fw_dump); in qla4xxx_mem_free()
4182 ha->queues_len = 0; in qla4xxx_mem_free()
4183 ha->queues = NULL; in qla4xxx_mem_free()
4184 ha->queues_dma = 0; in qla4xxx_mem_free()
4185 ha->request_ring = NULL; in qla4xxx_mem_free()
4186 ha->request_dma = 0; in qla4xxx_mem_free()
4187 ha->response_ring = NULL; in qla4xxx_mem_free()
4188 ha->response_dma = 0; in qla4xxx_mem_free()
4189 ha->shadow_regs = NULL; in qla4xxx_mem_free()
4190 ha->shadow_regs_dma = 0; in qla4xxx_mem_free()
4191 ha->fw_dump = NULL; in qla4xxx_mem_free()
4192 ha->fw_dump_size = 0; in qla4xxx_mem_free()
4195 mempool_destroy(ha->srb_mempool); in qla4xxx_mem_free()
4196 ha->srb_mempool = NULL; in qla4xxx_mem_free()
4198 dma_pool_destroy(ha->chap_dma_pool); in qla4xxx_mem_free()
4200 if (ha->chap_list) in qla4xxx_mem_free()
4201 vfree(ha->chap_list); in qla4xxx_mem_free()
4202 ha->chap_list = NULL; in qla4xxx_mem_free()
4204 dma_pool_destroy(ha->fw_ddb_dma_pool); in qla4xxx_mem_free()
4207 if (is_qla8022(ha)) { in qla4xxx_mem_free()
4208 if (ha->nx_pcibase) in qla4xxx_mem_free()
4210 (struct device_reg_82xx __iomem *)ha->nx_pcibase); in qla4xxx_mem_free()
4211 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_mem_free()
4212 if (ha->nx_pcibase) in qla4xxx_mem_free()
4214 (struct device_reg_83xx __iomem *)ha->nx_pcibase); in qla4xxx_mem_free()
4215 } else if (ha->reg) { in qla4xxx_mem_free()
4216 iounmap(ha->reg); in qla4xxx_mem_free()
4219 if (ha->reset_tmplt.buff) in qla4xxx_mem_free()
4220 vfree(ha->reset_tmplt.buff); in qla4xxx_mem_free()
4222 pci_release_regions(ha->pdev); in qla4xxx_mem_free()
4232 static int qla4xxx_mem_alloc(struct scsi_qla_host *ha) in qla4xxx_mem_alloc() argument
4237 ha->queues_len = ((REQUEST_QUEUE_DEPTH * QUEUE_SIZE) + in qla4xxx_mem_alloc()
4242 ha->queues = dma_alloc_coherent(&ha->pdev->dev, ha->queues_len, in qla4xxx_mem_alloc()
4243 &ha->queues_dma, GFP_KERNEL); in qla4xxx_mem_alloc()
4244 if (ha->queues == NULL) { in qla4xxx_mem_alloc()
4245 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4256 if ((unsigned long)ha->queues_dma & (MEM_ALIGN_VALUE - 1)) in qla4xxx_mem_alloc()
4257 align = MEM_ALIGN_VALUE - ((unsigned long)ha->queues_dma & in qla4xxx_mem_alloc()
4261 ha->request_dma = ha->queues_dma + align; in qla4xxx_mem_alloc()
4262 ha->request_ring = (struct queue_entry *) (ha->queues + align); in qla4xxx_mem_alloc()
4263 ha->response_dma = ha->queues_dma + align + in qla4xxx_mem_alloc()
4265 ha->response_ring = (struct queue_entry *) (ha->queues + align + in qla4xxx_mem_alloc()
4268 ha->shadow_regs_dma = ha->queues_dma + align + in qla4xxx_mem_alloc()
4271 ha->shadow_regs = (struct shadow_regs *) (ha->queues + align + in qla4xxx_mem_alloc()
4278 ha->srb_mempool = mempool_create(SRB_MIN_REQ, mempool_alloc_slab, in qla4xxx_mem_alloc()
4280 if (ha->srb_mempool == NULL) { in qla4xxx_mem_alloc()
4281 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4287 ha->chap_dma_pool = dma_pool_create("ql4_chap", &ha->pdev->dev, in qla4xxx_mem_alloc()
4290 if (ha->chap_dma_pool == NULL) { in qla4xxx_mem_alloc()
4291 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4296 ha->fw_ddb_dma_pool = dma_pool_create("ql4_fw_ddb", &ha->pdev->dev, in qla4xxx_mem_alloc()
4299 if (ha->fw_ddb_dma_pool == NULL) { in qla4xxx_mem_alloc()
4300 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4318 static int qla4_8xxx_check_temp(struct scsi_qla_host *ha) in qla4_8xxx_check_temp() argument
4323 temp = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_TEMP_STATE); in qla4_8xxx_check_temp()
4329 ql4_printk(KERN_WARNING, ha, "Device temperature %d degrees C" in qla4_8xxx_check_temp()
4334 if (ha->temperature == QLA82XX_TEMP_NORMAL) in qla4_8xxx_check_temp()
4335 ql4_printk(KERN_WARNING, ha, "Device temperature %d" in qla4_8xxx_check_temp()
4339 if (ha->temperature == QLA82XX_TEMP_WARN) in qla4_8xxx_check_temp()
4340 ql4_printk(KERN_INFO, ha, "Device temperature is" in qla4_8xxx_check_temp()
4344 ha->temperature = temp_state; in qla4_8xxx_check_temp()
4354 static int qla4_8xxx_check_fw_alive(struct scsi_qla_host *ha) in qla4_8xxx_check_fw_alive() argument
4359 fw_heartbeat_counter = qla4_8xxx_rd_direct(ha, in qla4_8xxx_check_fw_alive()
4365 ha->host_no, __func__)); in qla4_8xxx_check_fw_alive()
4369 if (ha->fw_heartbeat_counter == fw_heartbeat_counter) { in qla4_8xxx_check_fw_alive()
4370 ha->seconds_since_last_heartbeat++; in qla4_8xxx_check_fw_alive()
4372 if (ha->seconds_since_last_heartbeat == 2) { in qla4_8xxx_check_fw_alive()
4373 ha->seconds_since_last_heartbeat = 0; in qla4_8xxx_check_fw_alive()
4374 qla4_8xxx_dump_peg_reg(ha); in qla4_8xxx_check_fw_alive()
4378 ha->seconds_since_last_heartbeat = 0; in qla4_8xxx_check_fw_alive()
4380 ha->fw_heartbeat_counter = fw_heartbeat_counter; in qla4_8xxx_check_fw_alive()
4384 static void qla4_8xxx_process_fw_error(struct scsi_qla_host *ha) in qla4_8xxx_process_fw_error() argument
4389 halt_status = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_HALT_STATUS1); in qla4_8xxx_process_fw_error()
4391 if (is_qla8022(ha)) { in qla4_8xxx_process_fw_error()
4392 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4_8xxx_process_fw_error()
4394 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, in qla4_8xxx_process_fw_error()
4399 …ql4_printk(KERN_ERR, ha, "%s: Firmware aborted with error code 0x00006700. Device is being reset\n… in qla4_8xxx_process_fw_error()
4403 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_process_fw_error()
4405 ql4_printk(KERN_ERR, ha, "%s: Firmware error detected device is being reset\n", in qla4_8xxx_process_fw_error()
4416 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); in qla4_8xxx_process_fw_error()
4418 ql4_printk(KERN_INFO, ha, "%s: detect abort needed!\n", in qla4_8xxx_process_fw_error()
4420 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4_8xxx_process_fw_error()
4422 qla4xxx_mailbox_premature_completion(ha); in qla4_8xxx_process_fw_error()
4423 qla4xxx_wake_dpc(ha); in qla4_8xxx_process_fw_error()
4432 void qla4_8xxx_watchdog(struct scsi_qla_host *ha) in qla4_8xxx_watchdog() argument
4437 if (is_qla8032(ha) && in qla4_8xxx_watchdog()
4438 (qla4_83xx_is_detached(ha) == QLA_SUCCESS)) in qla4_8xxx_watchdog()
4440 __func__, ha->func_num); in qla4_8xxx_watchdog()
4443 if (!(test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || in qla4_8xxx_watchdog()
4444 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4_8xxx_watchdog()
4445 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags))) { in qla4_8xxx_watchdog()
4446 dev_state = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE); in qla4_8xxx_watchdog()
4448 if (qla4_8xxx_check_temp(ha)) { in qla4_8xxx_watchdog()
4449 if (is_qla8022(ha)) { in qla4_8xxx_watchdog()
4450 ql4_printk(KERN_INFO, ha, "disabling pause transmit on port 0 & 1.\n"); in qla4_8xxx_watchdog()
4451 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, in qla4_8xxx_watchdog()
4455 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); in qla4_8xxx_watchdog()
4456 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4458 !test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4_8xxx_watchdog()
4460 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED RESET!\n", in qla4_8xxx_watchdog()
4463 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_watchdog()
4464 idc_ctrl = qla4_83xx_rd_reg(ha, in qla4_8xxx_watchdog()
4467 ql4_printk(KERN_INFO, ha, "%s: Graceful reset bit is not set\n", in qla4_8xxx_watchdog()
4470 ha); in qla4_8xxx_watchdog()
4474 if ((is_qla8032(ha) || is_qla8042(ha)) || in qla4_8xxx_watchdog()
4475 (is_qla8022(ha) && !ql4xdontresethba)) { in qla4_8xxx_watchdog()
4476 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4_8xxx_watchdog()
4477 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4480 !test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { in qla4_8xxx_watchdog()
4481 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED QUIES!\n", in qla4_8xxx_watchdog()
4483 set_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags); in qla4_8xxx_watchdog()
4484 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4487 if (qla4_8xxx_check_fw_alive(ha)) in qla4_8xxx_watchdog()
4488 qla4_8xxx_process_fw_error(ha); in qla4_8xxx_watchdog()
4497 struct scsi_qla_host *ha; in qla4xxx_check_relogin_flash_ddb() local
4501 ha = ddb_entry->ha; in qla4xxx_check_relogin_flash_ddb()
4506 if (adapter_up(ha) && !test_bit(DF_RELOGIN, &ddb_entry->flags) && in qla4xxx_check_relogin_flash_ddb()
4514 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_check_relogin_flash_ddb()
4516 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_check_relogin_flash_ddb()
4534 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_check_relogin_flash_ddb()
4540 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_check_relogin_flash_ddb()
4553 struct scsi_qla_host *ha = from_timer(ha, t, timer); in qla4xxx_timer() local
4557 iscsi_host_for_each_session(ha->host, qla4xxx_check_relogin_flash_ddb); in qla4xxx_timer()
4562 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_timer()
4563 mod_timer(&ha->timer, jiffies + HZ); in qla4xxx_timer()
4568 if (!pci_channel_offline(ha->pdev)) in qla4xxx_timer()
4569 pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w); in qla4xxx_timer()
4571 if (is_qla80XX(ha)) in qla4xxx_timer()
4572 qla4_8xxx_watchdog(ha); in qla4xxx_timer()
4574 if (is_qla40XX(ha)) { in qla4xxx_timer()
4576 if (ha->firmware_options & FWOPT_HEARTBEAT_ENABLE && in qla4xxx_timer()
4577 ha->heartbeat_interval != 0) { in qla4xxx_timer()
4578 ha->seconds_since_last_heartbeat++; in qla4xxx_timer()
4579 if (ha->seconds_since_last_heartbeat > in qla4xxx_timer()
4580 ha->heartbeat_interval + 2) in qla4xxx_timer()
4581 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_timer()
4586 if (!list_empty(&ha->work_list)) in qla4xxx_timer()
4591 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_timer()
4592 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags) || in qla4xxx_timer()
4593 test_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags) || in qla4xxx_timer()
4594 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || in qla4xxx_timer()
4595 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_timer()
4596 test_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags) || in qla4xxx_timer()
4597 test_bit(DPC_LINK_CHANGED, &ha->dpc_flags) || in qla4xxx_timer()
4598 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || in qla4xxx_timer()
4599 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || in qla4xxx_timer()
4600 test_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags) || in qla4xxx_timer()
4601 test_bit(DPC_AEN, &ha->dpc_flags)) { in qla4xxx_timer()
4604 ha->host_no, __func__, ha->dpc_flags)); in qla4xxx_timer()
4605 qla4xxx_wake_dpc(ha); in qla4xxx_timer()
4609 mod_timer(&ha->timer, jiffies + HZ); in qla4xxx_timer()
4611 DEBUG2(ha->seconds_since_last_intr++); in qla4xxx_timer()
4621 static int qla4xxx_cmd_wait(struct scsi_qla_host *ha) in qla4xxx_cmd_wait() argument
4629 if (is_qla40XX(ha)) in qla4xxx_cmd_wait()
4632 wtmo = ha->nx_reset_timeout / 2; in qla4xxx_cmd_wait()
4636 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_cmd_wait()
4641 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_cmd_wait()
4643 for (index = 0; index < ha->host->can_queue; index++) { in qla4xxx_cmd_wait()
4644 cmd = scsi_host_find_tag(ha->host, index); in qla4xxx_cmd_wait()
4654 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_cmd_wait()
4657 if (index == ha->host->can_queue) in qla4xxx_cmd_wait()
4667 int qla4xxx_hw_reset(struct scsi_qla_host *ha) in qla4xxx_hw_reset() argument
4672 DEBUG2(printk(KERN_ERR "scsi%ld: %s\n", ha->host_no, __func__)); in qla4xxx_hw_reset()
4674 if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS) in qla4xxx_hw_reset()
4677 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_hw_reset()
4683 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_hw_reset()
4685 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_hw_reset()
4688 writel(set_rmask(CSR_SOFT_RESET), &ha->reg->ctrl_status); in qla4xxx_hw_reset()
4689 readl(&ha->reg->ctrl_status); in qla4xxx_hw_reset()
4691 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_hw_reset()
4699 int qla4xxx_soft_reset(struct scsi_qla_host *ha) in qla4xxx_soft_reset() argument
4706 status = qla4xxx_hw_reset(ha); 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()
4716 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4728 ha->host_no)); in qla4xxx_soft_reset()
4729 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4730 writel(set_rmask(CSR_NET_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4731 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4732 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4738 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4739 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4740 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4754 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4755 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4757 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4758 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4760 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4770 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4771 writel(set_rmask(CSR_FORCE_SOFT_RESET), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4772 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4773 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4777 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4778 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4779 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4803 static void qla4xxx_abort_active_cmds(struct scsi_qla_host *ha, int res) in qla4xxx_abort_active_cmds() argument
4809 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_abort_active_cmds()
4810 for (i = 0; i < ha->host->can_queue; i++) { in qla4xxx_abort_active_cmds()
4811 srb = qla4xxx_del_from_active_array(ha, i); in qla4xxx_abort_active_cmds()
4817 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_abort_active_cmds()
4820 void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha) in qla4xxx_dead_adapter_cleanup() argument
4822 clear_bit(AF_ONLINE, &ha->flags); in qla4xxx_dead_adapter_cleanup()
4825 ql4_printk(KERN_INFO, ha, "Disabling the board\n"); in qla4xxx_dead_adapter_cleanup()
4827 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_dead_adapter_cleanup()
4828 qla4xxx_mark_all_devices_missing(ha); in qla4xxx_dead_adapter_cleanup()
4829 clear_bit(AF_INIT_DONE, &ha->flags); in qla4xxx_dead_adapter_cleanup()
4852 static int qla4xxx_recover_adapter(struct scsi_qla_host *ha) in qla4xxx_recover_adapter() argument
4860 scsi_block_requests(ha->host); in qla4xxx_recover_adapter()
4861 clear_bit(AF_ONLINE, &ha->flags); in qla4xxx_recover_adapter()
4862 clear_bit(AF_LINK_UP, &ha->flags); in qla4xxx_recover_adapter()
4864 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: adapter OFFLINE\n", __func__)); in qla4xxx_recover_adapter()
4866 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4xxx_recover_adapter()
4868 if ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_recover_adapter()
4869 !test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4870 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4xxx_recover_adapter()
4873 qla4_83xx_disable_pause(ha); in qla4xxx_recover_adapter()
4876 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); in qla4xxx_recover_adapter()
4878 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_recover_adapter()
4883 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4890 if (is_qla80XX(ha) && !reset_chip && in qla4xxx_recover_adapter()
4891 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4893 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_recover_adapter()
4895 ha->host_no, __func__)); in qla4xxx_recover_adapter()
4896 status = ha->isp_ops->reset_firmware(ha); in qla4xxx_recover_adapter()
4898 ha->isp_ops->disable_intrs(ha); in qla4xxx_recover_adapter()
4899 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4900 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_recover_adapter()
4905 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_recover_adapter()
4906 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4913 if (is_qla40XX(ha) || reset_chip) { in qla4xxx_recover_adapter()
4914 if (is_qla40XX(ha)) in qla4xxx_recover_adapter()
4920 if (test_bit(AF_FW_RECOVERY, &ha->flags)) in qla4xxx_recover_adapter()
4925 if (qla4_8xxx_check_fw_alive(ha)) { in qla4xxx_recover_adapter()
4926 qla4xxx_mailbox_premature_completion(ha); in qla4xxx_recover_adapter()
4934 if (!test_bit(AF_FW_RECOVERY, &ha->flags)) in qla4xxx_recover_adapter()
4935 qla4xxx_cmd_wait(ha); in qla4xxx_recover_adapter()
4937 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4938 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_recover_adapter()
4940 ha->host_no, __func__)); in qla4xxx_recover_adapter()
4941 status = ha->isp_ops->reset_chip(ha); in qla4xxx_recover_adapter()
4942 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_recover_adapter()
4946 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4954 if (is_qla40XX(ha) && (ha->mac_index == 3)) in qla4xxx_recover_adapter()
4959 status = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4xxx_recover_adapter()
4960 if (is_qla80XX(ha) && (status == QLA_ERROR)) { in qla4xxx_recover_adapter()
4961 status = qla4_8xxx_check_init_adapter_retry(ha); in qla4xxx_recover_adapter()
4963 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Don't retry recover adapter\n", in qla4xxx_recover_adapter()
4964 ha->host_no, __func__); in qla4xxx_recover_adapter()
4965 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4966 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4967 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4969 &ha->dpc_flags); in qla4xxx_recover_adapter()
4978 if (!test_bit(AF_ONLINE, &ha->flags) && in qla4xxx_recover_adapter()
4979 !test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4985 if (is_qla80XX(ha)) { in qla4xxx_recover_adapter()
4986 ha->isp_ops->idc_lock(ha); in qla4xxx_recover_adapter()
4987 dev_state = qla4_8xxx_rd_direct(ha, in qla4xxx_recover_adapter()
4989 ha->isp_ops->idc_unlock(ha); in qla4xxx_recover_adapter()
4991 ql4_printk(KERN_INFO, ha, "%s: don't retry " in qla4xxx_recover_adapter()
4994 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4995 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4996 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4998 &ha->dpc_flags); in qla4xxx_recover_adapter()
5005 if (!test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
5006 ha->retry_reset_ha_cnt = MAX_RESET_HA_RETRIES; in qla4xxx_recover_adapter()
5008 "(%d) more times\n", ha->host_no, in qla4xxx_recover_adapter()
5009 ha->retry_reset_ha_cnt)); in qla4xxx_recover_adapter()
5010 set_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5013 if (ha->retry_reset_ha_cnt > 0) { in qla4xxx_recover_adapter()
5015 ha->retry_reset_ha_cnt--; in qla4xxx_recover_adapter()
5018 ha->host_no, in qla4xxx_recover_adapter()
5019 ha->retry_reset_ha_cnt)); in qla4xxx_recover_adapter()
5023 if (ha->retry_reset_ha_cnt == 0) { in qla4xxx_recover_adapter()
5028 ha->host_no)); in qla4xxx_recover_adapter()
5029 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
5030 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5031 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5033 &ha->dpc_flags); in qla4xxx_recover_adapter()
5038 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5039 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_recover_adapter()
5040 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5044 ha->adapter_error_count++; in qla4xxx_recover_adapter()
5046 if (test_bit(AF_ONLINE, &ha->flags)) in qla4xxx_recover_adapter()
5047 ha->isp_ops->enable_intrs(ha); in qla4xxx_recover_adapter()
5049 scsi_unblock_requests(ha->host); in qla4xxx_recover_adapter()
5051 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4xxx_recover_adapter()
5052 DEBUG2(printk("scsi%ld: recover adapter: %s\n", ha->host_no, in qla4xxx_recover_adapter()
5062 struct scsi_qla_host *ha; in qla4xxx_relogin_devices() local
5066 ha = ddb_entry->ha; in qla4xxx_relogin_devices()
5069 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_relogin_devices()
5070 " unblock session\n", ha->host_no, __func__, in qla4xxx_relogin_devices()
5091 struct scsi_qla_host *ha; in qla4xxx_unblock_flash_ddb() local
5095 ha = ddb_entry->ha; in qla4xxx_unblock_flash_ddb()
5096 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_flash_ddb()
5097 " unblock session\n", ha->host_no, __func__, in qla4xxx_unblock_flash_ddb()
5103 if (test_bit(AF_ONLINE, &ha->flags)) { in qla4xxx_unblock_flash_ddb()
5104 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_flash_ddb()
5105 " start scan\n", ha->host_no, __func__, in qla4xxx_unblock_flash_ddb()
5107 scsi_queue_work(ha->host, &ddb_entry->sess->scan_work); in qla4xxx_unblock_flash_ddb()
5116 struct scsi_qla_host *ha; in qla4xxx_unblock_ddb() local
5121 ha = ddb_entry->ha; in qla4xxx_unblock_ddb()
5122 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_ddb()
5123 " unblock user space session\n", ha->host_no, __func__, in qla4xxx_unblock_ddb()
5131 ql4_printk(KERN_INFO, ha, in qla4xxx_unblock_ddb()
5133 ha->host_no, __func__, ddb_entry->fw_ddb_index, in qla4xxx_unblock_ddb()
5141 static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha) in qla4xxx_relogin_all_devices() argument
5143 iscsi_host_for_each_session(ha->host, qla4xxx_relogin_devices); in qla4xxx_relogin_all_devices()
5151 struct scsi_qla_host *ha; in qla4xxx_relogin_flash_ddb() local
5155 ha = ddb_entry->ha; in qla4xxx_relogin_flash_ddb()
5161 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_relogin_flash_ddb()
5162 "scsi%ld: Relogin index [%d]. TOV=%d\n", ha->host_no, in qla4xxx_relogin_flash_ddb()
5172 struct scsi_qla_host *ha; in qla4xxx_dpc_relogin() local
5176 ha = ddb_entry->ha; in qla4xxx_dpc_relogin()
5186 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_dpc_relogin()
5192 void qla4xxx_wake_dpc(struct scsi_qla_host *ha) in qla4xxx_wake_dpc() argument
5194 if (ha->dpc_thread) in qla4xxx_wake_dpc()
5195 queue_work(ha->dpc_thread, &ha->dpc_work); in qla4xxx_wake_dpc()
5199 qla4xxx_alloc_work(struct scsi_qla_host *ha, uint32_t data_size, in qla4xxx_alloc_work() argument
5214 static void qla4xxx_post_work(struct scsi_qla_host *ha, in qla4xxx_post_work() argument
5219 spin_lock_irqsave(&ha->work_lock, flags); in qla4xxx_post_work()
5220 list_add_tail(&e->list, &ha->work_list); in qla4xxx_post_work()
5221 spin_unlock_irqrestore(&ha->work_lock, flags); in qla4xxx_post_work()
5222 qla4xxx_wake_dpc(ha); in qla4xxx_post_work()
5225 int qla4xxx_post_aen_work(struct scsi_qla_host *ha, in qla4xxx_post_aen_work() argument
5231 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_AEN); in qla4xxx_post_aen_work()
5239 qla4xxx_post_work(ha, e); in qla4xxx_post_aen_work()
5244 int qla4xxx_post_ping_evt_work(struct scsi_qla_host *ha, in qla4xxx_post_ping_evt_work() argument
5250 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_PING_STATUS); in qla4xxx_post_ping_evt_work()
5259 qla4xxx_post_work(ha, e); in qla4xxx_post_ping_evt_work()
5264 static void qla4xxx_do_work(struct scsi_qla_host *ha) in qla4xxx_do_work() argument
5270 spin_lock_irqsave(&ha->work_lock, flags); in qla4xxx_do_work()
5271 list_splice_init(&ha->work_list, &work); in qla4xxx_do_work()
5272 spin_unlock_irqrestore(&ha->work_lock, flags); in qla4xxx_do_work()
5279 iscsi_post_host_event(ha->host_no, in qla4xxx_do_work()
5286 iscsi_ping_comp_event(ha->host_no, in qla4xxx_do_work()
5294 ql4_printk(KERN_WARNING, ha, "event type: 0x%x not " in qla4xxx_do_work()
5314 struct scsi_qla_host *ha = in qla4xxx_do_dpc() local
5318 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_do_dpc()
5320 ha->host_no, __func__, ha->flags, ha->dpc_flags)); in qla4xxx_do_dpc()
5323 if (!test_bit(AF_INIT_DONE, &ha->flags)) in qla4xxx_do_dpc()
5326 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_do_dpc()
5328 ha->host_no, __func__, ha->flags)); in qla4xxx_do_dpc()
5333 qla4xxx_do_work(ha); in qla4xxx_do_dpc()
5335 if (is_qla80XX(ha)) { in qla4xxx_do_dpc()
5336 if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5337 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_do_dpc()
5338 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4xxx_do_dpc()
5341 qla4_83xx_disable_pause(ha); in qla4xxx_do_dpc()
5344 ha->isp_ops->idc_lock(ha); in qla4xxx_do_dpc()
5345 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4xxx_do_dpc()
5347 ha->isp_ops->idc_unlock(ha); in qla4xxx_do_dpc()
5348 ql4_printk(KERN_INFO, ha, "HW State: FAILED\n"); in qla4xxx_do_dpc()
5349 qla4_8xxx_device_state_handler(ha); in qla4xxx_do_dpc()
5352 if (test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5353 if (is_qla8042(ha)) { in qla4xxx_do_dpc()
5354 if (ha->idc_info.info2 & in qla4xxx_do_dpc()
5356 ql4_printk(KERN_INFO, ha, "%s: Disabling ACB\n", in qla4xxx_do_dpc()
5358 status = qla4_84xx_config_acb(ha, in qla4xxx_do_dpc()
5361 ql4_printk(KERN_INFO, ha, "%s: ACB config failed\n", in qla4xxx_do_dpc()
5366 qla4_83xx_post_idc_ack(ha); in qla4xxx_do_dpc()
5367 clear_bit(DPC_POST_IDC_ACK, &ha->dpc_flags); in qla4xxx_do_dpc()
5370 if (is_qla8042(ha) && in qla4xxx_do_dpc()
5371 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5372 ql4_printk(KERN_INFO, ha, "%s: Restoring ACB\n", in qla4xxx_do_dpc()
5374 if (qla4_84xx_config_acb(ha, ACB_CONFIG_SET) != in qla4xxx_do_dpc()
5376 ql4_printk(KERN_INFO, ha, "%s: ACB config failed ", in qla4xxx_do_dpc()
5379 clear_bit(DPC_RESTORE_ACB, &ha->dpc_flags); in qla4xxx_do_dpc()
5382 if (test_and_clear_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5383 qla4_8xxx_need_qsnt_handler(ha); in qla4xxx_do_dpc()
5387 if (!test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) && in qla4xxx_do_dpc()
5388 (test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_do_dpc()
5389 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_do_dpc()
5390 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))) { in qla4xxx_do_dpc()
5391 if ((is_qla8022(ha) && ql4xdontresethba) || in qla4xxx_do_dpc()
5392 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_do_dpc()
5393 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_do_dpc()
5395 ha->host_no, __func__)); in qla4xxx_do_dpc()
5396 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_do_dpc()
5397 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); in qla4xxx_do_dpc()
5398 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_do_dpc()
5401 if (test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || in qla4xxx_do_dpc()
5402 test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_do_dpc()
5403 qla4xxx_recover_adapter(ha); in qla4xxx_do_dpc()
5405 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5408 while ((readw(&ha->reg->ctrl_status) & in qla4xxx_do_dpc()
5417 ha->host_no, __func__)); in qla4xxx_do_dpc()
5418 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_do_dpc()
5419 if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) { in qla4xxx_do_dpc()
5420 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_do_dpc()
5421 status = qla4xxx_recover_adapter(ha); in qla4xxx_do_dpc()
5423 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); in qla4xxx_do_dpc()
5425 ha->isp_ops->enable_intrs(ha); in qla4xxx_do_dpc()
5431 if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags)) in qla4xxx_do_dpc()
5432 qla4xxx_process_aen(ha, PROCESS_ALL_AENS); in qla4xxx_do_dpc()
5435 if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags)) in qla4xxx_do_dpc()
5436 qla4xxx_get_dhcp_ip_address(ha); in qla4xxx_do_dpc()
5439 if (adapter_up(ha) && in qla4xxx_do_dpc()
5440 test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5441 iscsi_host_for_each_session(ha->host, qla4xxx_dpc_relogin); in qla4xxx_do_dpc()
5445 if (!test_bit(AF_LOOPBACK, &ha->flags) && in qla4xxx_do_dpc()
5446 test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5447 if (!test_bit(AF_LINK_UP, &ha->flags)) { in qla4xxx_do_dpc()
5449 qla4xxx_mark_all_devices_missing(ha); in qla4xxx_do_dpc()
5457 if (test_and_clear_bit(AF_BUILD_DDB_LIST, &ha->flags)) { in qla4xxx_do_dpc()
5458 qla4xxx_build_ddb_list(ha, ha->is_reset); in qla4xxx_do_dpc()
5459 iscsi_host_for_each_session(ha->host, in qla4xxx_do_dpc()
5462 qla4xxx_relogin_all_devices(ha); in qla4xxx_do_dpc()
5465 if (test_and_clear_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5466 if (qla4xxx_sysfs_ddb_export(ha)) in qla4xxx_do_dpc()
5467 ql4_printk(KERN_ERR, ha, "%s: Error exporting ddb to sysfs\n", in qla4xxx_do_dpc()
5476 static void qla4xxx_free_adapter(struct scsi_qla_host *ha) in qla4xxx_free_adapter() argument
5478 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_free_adapter()
5481 ha->isp_ops->disable_intrs(ha); in qla4xxx_free_adapter()
5483 if (is_qla40XX(ha)) { in qla4xxx_free_adapter()
5485 &ha->reg->ctrl_status); in qla4xxx_free_adapter()
5486 readl(&ha->reg->ctrl_status); in qla4xxx_free_adapter()
5487 } else if (is_qla8022(ha)) { in qla4xxx_free_adapter()
5488 writel(0, &ha->qla4_82xx_reg->host_int); in qla4xxx_free_adapter()
5489 readl(&ha->qla4_82xx_reg->host_int); in qla4xxx_free_adapter()
5490 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_free_adapter()
5491 writel(0, &ha->qla4_83xx_reg->risc_intr); in qla4xxx_free_adapter()
5492 readl(&ha->qla4_83xx_reg->risc_intr); in qla4xxx_free_adapter()
5496 if (ha->timer_active) in qla4xxx_free_adapter()
5497 qla4xxx_stop_timer(ha); in qla4xxx_free_adapter()
5500 if (ha->dpc_thread) in qla4xxx_free_adapter()
5501 destroy_workqueue(ha->dpc_thread); in qla4xxx_free_adapter()
5504 if (ha->task_wq) in qla4xxx_free_adapter()
5505 destroy_workqueue(ha->task_wq); in qla4xxx_free_adapter()
5508 ha->isp_ops->reset_firmware(ha); in qla4xxx_free_adapter()
5510 if (is_qla80XX(ha)) { in qla4xxx_free_adapter()
5511 ha->isp_ops->idc_lock(ha); in qla4xxx_free_adapter()
5512 qla4_8xxx_clear_drv_active(ha); in qla4xxx_free_adapter()
5513 ha->isp_ops->idc_unlock(ha); in qla4xxx_free_adapter()
5517 qla4xxx_free_irqs(ha); in qla4xxx_free_adapter()
5520 qla4xxx_mem_free(ha); in qla4xxx_free_adapter()
5523 int qla4_8xxx_iospace_config(struct scsi_qla_host *ha) in qla4_8xxx_iospace_config() argument
5527 struct pci_dev *pdev = ha->pdev; in qla4_8xxx_iospace_config()
5533 "status=%d\n", ha->host_no, pci_name(pdev), status); in qla4_8xxx_iospace_config()
5539 ha->revision_id = pdev->revision; in qla4_8xxx_iospace_config()
5548 ha->nx_pcibase = (unsigned long)ioremap(mem_base, mem_len); in qla4_8xxx_iospace_config()
5549 if (!ha->nx_pcibase) { in qla4_8xxx_iospace_config()
5552 pci_release_regions(ha->pdev); in qla4_8xxx_iospace_config()
5559 if (is_qla8022(ha)) { in qla4_8xxx_iospace_config()
5560 ha->qla4_82xx_reg = (struct device_reg_82xx __iomem *) in qla4_8xxx_iospace_config()
5561 ((uint8_t *)ha->nx_pcibase + 0xbc000 + in qla4_8xxx_iospace_config()
5562 (ha->pdev->devfn << 11)); in qla4_8xxx_iospace_config()
5563 ha->nx_db_wr_ptr = (ha->pdev->devfn == 4 ? QLA82XX_CAM_RAM_DB1 : in qla4_8xxx_iospace_config()
5565 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_iospace_config()
5566 ha->qla4_83xx_reg = (struct device_reg_83xx __iomem *) in qla4_8xxx_iospace_config()
5567 ((uint8_t *)ha->nx_pcibase); in qla4_8xxx_iospace_config()
5582 int qla4xxx_iospace_config(struct scsi_qla_host *ha) in qla4xxx_iospace_config() argument
5587 pio = pci_resource_start(ha->pdev, 0); in qla4xxx_iospace_config()
5588 pio_len = pci_resource_len(ha->pdev, 0); in qla4xxx_iospace_config()
5589 pio_flags = pci_resource_flags(ha->pdev, 0); in qla4xxx_iospace_config()
5592 ql4_printk(KERN_WARNING, ha, in qla4xxx_iospace_config()
5597 ql4_printk(KERN_WARNING, ha, "region #0 not a PIO resource\n"); in qla4xxx_iospace_config()
5602 mmio = pci_resource_start(ha->pdev, 1); in qla4xxx_iospace_config()
5603 mmio_len = pci_resource_len(ha->pdev, 1); in qla4xxx_iospace_config()
5604 mmio_flags = pci_resource_flags(ha->pdev, 1); in qla4xxx_iospace_config()
5607 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5614 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5619 if (pci_request_regions(ha->pdev, DRIVER_NAME)) { in qla4xxx_iospace_config()
5620 ql4_printk(KERN_WARNING, ha, in qla4xxx_iospace_config()
5626 ha->pio_address = pio; in qla4xxx_iospace_config()
5627 ha->pio_length = pio_len; in qla4xxx_iospace_config()
5628 ha->reg = ioremap(mmio, MIN_IOBASE_LEN); in qla4xxx_iospace_config()
5629 if (!ha->reg) { in qla4xxx_iospace_config()
5630 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5717 uint16_t qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha) in qla4xxx_rd_shdw_req_q_out() argument
5719 return (uint16_t)le32_to_cpu(ha->shadow_regs->req_q_out); in qla4xxx_rd_shdw_req_q_out()
5722 uint16_t qla4_82xx_rd_shdw_req_q_out(struct scsi_qla_host *ha) in qla4_82xx_rd_shdw_req_q_out() argument
5724 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->req_q_out)); in qla4_82xx_rd_shdw_req_q_out()
5727 uint16_t qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) in qla4xxx_rd_shdw_rsp_q_in() argument
5729 return (uint16_t)le32_to_cpu(ha->shadow_regs->rsp_q_in); in qla4xxx_rd_shdw_rsp_q_in()
5732 uint16_t qla4_82xx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) in qla4_82xx_rd_shdw_rsp_q_in() argument
5734 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->rsp_q_in)); in qla4_82xx_rd_shdw_rsp_q_in()
5739 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_eth_info() local
5751 rc = sysfs_format_mac(str, ha->my_mac, in qla4xxx_show_boot_eth_info()
5780 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_ini_info() local
5786 rc = sprintf(str, "%s\n", ha->name_string); in qla4xxx_show_boot_ini_info()
5868 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_tgt_pri_info() local
5869 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_pri_sess); in qla4xxx_show_boot_tgt_pri_info()
5876 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_tgt_sec_info() local
5877 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_sec_sess); in qla4xxx_show_boot_tgt_sec_info()
5907 struct scsi_qla_host *ha = data; in qla4xxx_boot_release() local
5909 scsi_host_put(ha->host); in qla4xxx_boot_release()
5912 static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[]) in get_fw_boot_info() argument
5923 func_num = PCI_FUNC(ha->pdev->devfn); in get_fw_boot_info()
5925 ql4_printk(KERN_INFO, ha, "%s: Get FW boot info for 0x%x func %d\n", in get_fw_boot_info()
5926 __func__, ha->pdev->device, func_num); in get_fw_boot_info()
5928 if (is_qla40XX(ha)) { in get_fw_boot_info()
5943 val = rd_nvram_byte(ha, addr); in get_fw_boot_info()
5945 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Adapter boot " in get_fw_boot_info()
5952 val = rd_nvram_byte(ha, pri_addr); in get_fw_boot_info()
5957 val = rd_nvram_byte(ha, sec_addr); in get_fw_boot_info()
5961 } else if (is_qla80XX(ha)) { in get_fw_boot_info()
5962 buf = dma_alloc_coherent(&ha->pdev->dev, size, in get_fw_boot_info()
5965 DEBUG2(ql4_printk(KERN_ERR, ha, in get_fw_boot_info()
5972 if (ha->port_num == 0) in get_fw_boot_info()
5974 else if (ha->port_num == 1) in get_fw_boot_info()
5980 addr = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_iscsi_param * 4) + in get_fw_boot_info()
5982 if (qla4xxx_get_flash(ha, buf_dma, addr, in get_fw_boot_info()
5984 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: Get Flash" in get_fw_boot_info()
5985 " failed\n", ha->host_no, __func__)); in get_fw_boot_info()
5991 DEBUG2(ql4_printk(KERN_INFO, ha, "Firmware boot options" in get_fw_boot_info()
6009 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary target ID %d, Secondary" in get_fw_boot_info()
6014 dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma); in get_fw_boot_info()
6016 ha->pri_ddb_idx = ddb_index[0]; in get_fw_boot_info()
6017 ha->sec_ddb_idx = ddb_index[1]; in get_fw_boot_info()
6032 static int qla4xxx_get_bidi_chap(struct scsi_qla_host *ha, char *username, in qla4xxx_get_bidi_chap() argument
6039 if (is_qla80XX(ha)) in qla4xxx_get_bidi_chap()
6040 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_bidi_chap()
6045 if (!ha->chap_list) { in qla4xxx_get_bidi_chap()
6046 ql4_printk(KERN_ERR, ha, "Do not have CHAP table cache\n"); in qla4xxx_get_bidi_chap()
6050 mutex_lock(&ha->chap_sem); in qla4xxx_get_bidi_chap()
6052 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_get_bidi_chap()
6069 mutex_unlock(&ha->chap_sem); in qla4xxx_get_bidi_chap()
6075 static int qla4xxx_get_boot_target(struct scsi_qla_host *ha, in qla4xxx_get_boot_target() argument
6086 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_get_boot_target()
6089 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_get_boot_target()
6096 if (qla4xxx_bootdb_by_index(ha, fw_ddb_entry, in qla4xxx_get_boot_target()
6098 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: No Flash DDB found at " in qla4xxx_get_boot_target()
6126 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting chap\n")); in qla4xxx_get_boot_target()
6128 ret = qla4xxx_get_chap(ha, (char *)&boot_conn->chap. in qla4xxx_get_boot_target()
6133 ql4_printk(KERN_ERR, ha, "Failed to set chap\n"); in qla4xxx_get_boot_target()
6144 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting BIDI chap\n")); in qla4xxx_get_boot_target()
6146 ret = qla4xxx_get_bidi_chap(ha, in qla4xxx_get_boot_target()
6151 ql4_printk(KERN_ERR, ha, "Failed to set BIDI chap\n"); in qla4xxx_get_boot_target()
6161 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_get_boot_target()
6166 static int qla4xxx_get_boot_info(struct scsi_qla_host *ha) in qla4xxx_get_boot_info() argument
6175 ret = get_fw_boot_info(ha, ddb_index); in qla4xxx_get_boot_info()
6177 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_boot_info()
6188 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess), in qla4xxx_get_boot_info()
6191 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary boot target not " in qla4xxx_get_boot_info()
6200 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess), in qla4xxx_get_boot_info()
6203 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Secondary boot target not" in qla4xxx_get_boot_info()
6212 static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha) in qla4xxx_setup_boot_info() argument
6216 if (qla4xxx_get_boot_info(ha) != QLA_SUCCESS) in qla4xxx_setup_boot_info()
6220 ql4_printk(KERN_INFO, ha, in qla4xxx_setup_boot_info()
6227 ha->boot_kset = iscsi_boot_create_host_kset(ha->host->host_no); in qla4xxx_setup_boot_info()
6228 if (!ha->boot_kset) in qla4xxx_setup_boot_info()
6231 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6233 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6240 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6242 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 1, ha, in qla4xxx_setup_boot_info()
6249 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6251 boot_kobj = iscsi_boot_create_initiator(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6258 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6260 boot_kobj = iscsi_boot_create_ethernet(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6270 scsi_host_put(ha->host); in qla4xxx_setup_boot_info()
6272 iscsi_boot_destroy_kset(ha->boot_kset); in qla4xxx_setup_boot_info()
6322 static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha, in qla4xxx_compare_tuple_ddb() argument
6343 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_compare_tuple_ddb()
6352 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_compare_tuple_ddb()
6361 static int qla4xxx_is_session_exists(struct scsi_qla_host *ha, in qla4xxx_is_session_exists() argument
6373 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_session_exists()
6381 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_session_exists()
6390 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_is_session_exists()
6395 if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, false)) { in qla4xxx_is_session_exists()
6445 static int qla4xxx_update_isid(struct scsi_qla_host *ha, in qla4xxx_update_isid() argument
6473 static int qla4xxx_should_update_isid(struct scsi_qla_host *ha, in qla4xxx_should_update_isid() argument
6507 static int qla4xxx_is_flash_ddb_exists(struct scsi_qla_host *ha, in qla4xxx_is_flash_ddb_exists() argument
6518 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_flash_ddb_exists()
6526 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_flash_ddb_exists()
6537 ret = qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, true); in qla4xxx_is_flash_ddb_exists()
6546 ret = qla4xxx_should_update_isid(ha, tmp_tddb, fw_tddb); in qla4xxx_is_flash_ddb_exists()
6548 rval = qla4xxx_update_isid(ha, list_nt, fw_ddb_entry); in qla4xxx_is_flash_ddb_exists()
6576 static struct iscsi_endpoint *qla4xxx_get_ep_fwdb(struct scsi_qla_host *ha, in qla4xxx_get_ep_fwdb() argument
6608 ep = qla4xxx_ep_connect(ha->host, (struct sockaddr *)dst_addr, 0); in qla4xxx_get_ep_fwdb()
6613 static int qla4xxx_verify_boot_idx(struct scsi_qla_host *ha, uint16_t idx) in qla4xxx_verify_boot_idx() argument
6617 if (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx) in qla4xxx_verify_boot_idx()
6622 static void qla4xxx_setup_flash_ddb_entry(struct scsi_qla_host *ha, in qla4xxx_setup_flash_ddb_entry() argument
6631 ddb_entry->ha = ha; in qla4xxx_setup_flash_ddb_entry()
6647 (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx)) in qla4xxx_setup_flash_ddb_entry()
6651 static void qla4xxx_wait_for_ip_configuration(struct scsi_qla_host *ha) in qla4xxx_wait_for_ip_configuration() argument
6666 ret = qla4xxx_get_ip_state(ha, 0, ip_idx[idx], sts); in qla4xxx_wait_for_ip_configuration()
6675 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_for_ip_configuration()
6720 static int qla4xxx_find_flash_st_idx(struct scsi_qla_host *ha, in qla4xxx_find_flash_st_idx() argument
6730 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_find_flash_st_idx()
6733 flash_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_find_flash_st_idx()
6736 ql4_printk(KERN_ERR, ha, "Out of memory\n"); in qla4xxx_find_flash_st_idx()
6740 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6752 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6766 ql4_printk(KERN_ERR, ha, "Failed to find ST [%d] in flash\n", in qla4xxx_find_flash_st_idx()
6771 dma_pool_free(ha->fw_ddb_dma_pool, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6777 static void qla4xxx_build_st_list(struct scsi_qla_host *ha, in qla4xxx_build_st_list() argument
6791 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_st_list()
6794 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_st_list()
6798 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_st_list()
6803 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_st_list()
6821 ret = qla4xxx_find_flash_st_idx(ha, fw_ddb_entry, idx, in qla4xxx_build_st_list()
6824 ql4_printk(KERN_ERR, ha, in qla4xxx_build_st_list()
6828 ql4_printk(KERN_INFO, ha, in qla4xxx_build_st_list()
6844 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_st_list()
6855 static void qla4xxx_remove_failed_ddb(struct scsi_qla_host *ha, in qla4xxx_remove_failed_ddb() argument
6864 ret = qla4xxx_get_fwddb_entry(ha, ddb_idx->fw_ddb_idx, in qla4xxx_remove_failed_ddb()
6878 static void qla4xxx_update_sess_disc_idx(struct scsi_qla_host *ha, in qla4xxx_update_sess_disc_idx() argument
6887 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_update_sess_disc_idx()
6900 static int qla4xxx_sess_conn_setup(struct scsi_qla_host *ha, in qla4xxx_sess_conn_setup() argument
6918 cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, ha->host, in qla4xxx_sess_conn_setup()
6940 qla4xxx_setup_flash_ddb_entry(ha, ddb_entry, idx); in qla4xxx_sess_conn_setup()
6952 ep = qla4xxx_get_ep_fwdb(ha, fw_ddb_entry); in qla4xxx_sess_conn_setup()
6957 DEBUG2(ql4_printk(KERN_ERR, ha, "Unable to get ep\n")); in qla4xxx_sess_conn_setup()
6963 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); in qla4xxx_sess_conn_setup()
6964 qla4xxx_update_sess_disc_idx(ha, ddb_entry, fw_ddb_entry); in qla4xxx_sess_conn_setup()
6973 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_sess_conn_setup()
6981 static void qla4xxx_update_fw_ddb_link(struct scsi_qla_host *ha, in qla4xxx_update_fw_ddb_link() argument
6992 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_update_fw_ddb_link()
7002 static void qla4xxx_build_nt_list(struct scsi_qla_host *ha, in qla4xxx_build_nt_list() argument
7020 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_nt_list()
7023 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_nt_list()
7026 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_nt_list()
7031 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_nt_list()
7037 if (qla4xxx_verify_boot_idx(ha, idx) != QLA_SUCCESS) in qla4xxx_build_nt_list()
7046 qla4xxx_update_fw_ddb_link(ha, list_st, fw_ddb_entry); in qla4xxx_build_nt_list()
7053 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_nt_list()
7071 ret = qla4xxx_is_flash_ddb_exists(ha, list_nt, in qla4xxx_build_nt_list()
7085 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, in qla4xxx_build_nt_list()
7088 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, in qla4xxx_build_nt_list()
7091 qla4xxx_update_sess_disc_idx(ha, in qla4xxx_build_nt_list()
7098 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, is_reset, idx); in qla4xxx_build_nt_list()
7109 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_nt_list()
7112 static void qla4xxx_build_new_nt_list(struct scsi_qla_host *ha, in qla4xxx_build_new_nt_list() argument
7126 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_new_nt_list()
7129 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_new_nt_list()
7132 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_new_nt_list()
7137 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_new_nt_list()
7150 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_new_nt_list()
7159 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); in qla4xxx_build_new_nt_list()
7171 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, in qla4xxx_build_new_nt_list()
7183 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_new_nt_list()
7223 static int qla4xxx_sysfs_ddb_tgt_create(struct scsi_qla_host *ha, in qla4xxx_sysfs_ddb_tgt_create() argument
7231 fnode_sess = iscsi_create_flashnode_sess(ha->host, *idx, in qla4xxx_sysfs_ddb_tgt_create()
7234 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_tgt_create()
7236 __func__, *idx, ha->host_no); in qla4xxx_sysfs_ddb_tgt_create()
7240 fnode_conn = iscsi_create_flashnode_conn(ha->host, fnode_sess, in qla4xxx_sysfs_ddb_tgt_create()
7243 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_tgt_create()
7245 __func__, *idx, ha->host_no); in qla4xxx_sysfs_ddb_tgt_create()
7254 if (*idx == ha->pri_ddb_idx || *idx == ha->sec_ddb_idx) in qla4xxx_sysfs_ddb_tgt_create()
7265 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", in qla4xxx_sysfs_ddb_tgt_create()
7268 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", in qla4xxx_sysfs_ddb_tgt_create()
7292 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_add() local
7303 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Invalid portal type\n", in qla4xxx_sysfs_ddb_add()
7308 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : in qla4xxx_sysfs_ddb_add()
7311 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_add()
7314 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_add()
7320 dev = iscsi_find_flashnode_sess(ha->host, NULL, in qla4xxx_sysfs_ddb_add()
7323 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_add()
7332 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_add()
7343 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_add()
7347 rval = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 1); in qla4xxx_sysfs_ddb_add()
7351 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_add()
7371 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_apply() local
7378 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_apply()
7381 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_apply()
7391 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_apply()
7401 rval = qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, in qla4xxx_sysfs_ddb_apply()
7406 ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_apply()
7408 __func__, fnode_sess->target_id, ha->host_no); in qla4xxx_sysfs_ddb_apply()
7411 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_apply()
7413 __func__, fnode_sess->target_id, ha->host_no); in qla4xxx_sysfs_ddb_apply()
7418 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_apply()
7423 static ssize_t qla4xxx_sysfs_ddb_conn_open(struct scsi_qla_host *ha, in qla4xxx_sysfs_ddb_conn_open() argument
7435 ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*ddb_entry), in qla4xxx_sysfs_ddb_conn_open()
7438 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_conn_open()
7446 ret = qla4xxx_set_ddb_entry(ha, idx, ddb_entry_dma, &mbx_sts); in qla4xxx_sysfs_ddb_conn_open()
7448 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_conn_open()
7454 qla4xxx_conn_open(ha, idx); in qla4xxx_sysfs_ddb_conn_open()
7457 tmo = ((ha->def_timeout > LOGIN_TOV) && in qla4xxx_sysfs_ddb_conn_open()
7458 (ha->def_timeout < LOGIN_TOV * 10) ? in qla4xxx_sysfs_ddb_conn_open()
7459 ha->def_timeout : LOGIN_TOV); in qla4xxx_sysfs_ddb_conn_open()
7461 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_conn_open()
7466 ret = qla4xxx_get_fwddb_entry(ha, idx, NULL, 0, NULL, in qla4xxx_sysfs_ddb_conn_open()
7481 dma_free_coherent(&ha->pdev->dev, sizeof(*ddb_entry), in qla4xxx_sysfs_ddb_conn_open()
7486 static int qla4xxx_ddb_login_st(struct scsi_qla_host *ha, in qla4xxx_ddb_login_st() argument
7495 if (test_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags)) { in qla4xxx_ddb_login_st()
7496 ql4_printk(KERN_WARNING, ha, in qla4xxx_ddb_login_st()
7503 set_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); in qla4xxx_ddb_login_st()
7505 ret = qla4xxx_get_ddb_index(ha, &ddb_index); in qla4xxx_ddb_login_st()
7509 ret = qla4xxx_sysfs_ddb_conn_open(ha, fw_ddb_entry, ddb_index); in qla4xxx_ddb_login_st()
7513 qla4xxx_build_new_nt_list(ha, &list_nt, target_id); in qla4xxx_ddb_login_st()
7517 qla4xxx_clear_ddb_entry(ha, ddb_idx->fw_ddb_idx); in qla4xxx_ddb_login_st()
7522 if (qla4xxx_clear_ddb_entry(ha, ddb_index) == QLA_ERROR) { in qla4xxx_ddb_login_st()
7523 ql4_printk(KERN_ERR, ha, in qla4xxx_ddb_login_st()
7527 clear_bit(ddb_index, ha->ddb_idx_map); in qla4xxx_ddb_login_st()
7530 clear_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); in qla4xxx_ddb_login_st()
7534 static int qla4xxx_ddb_login_nt(struct scsi_qla_host *ha, in qla4xxx_ddb_login_nt() argument
7540 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); in qla4xxx_ddb_login_nt()
7542 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, in qla4xxx_ddb_login_nt()
7561 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_login() local
7568 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_login()
7574 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_login()
7577 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_login()
7587 ret = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_login()
7595 ret = qla4xxx_ddb_login_st(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_login()
7598 ret = qla4xxx_ddb_login_nt(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_login()
7606 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_login()
7621 struct scsi_qla_host *ha; in qla4xxx_sysfs_ddb_logout_sid() local
7632 ha = ddb_entry->ha; in qla4xxx_sysfs_ddb_logout_sid()
7635 ql4_printk(KERN_ERR, ha, "%s: Not a flash node session\n", in qla4xxx_sysfs_ddb_logout_sid()
7642 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout_sid()
7649 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_logout_sid()
7652 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout_sid()
7661 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_sysfs_ddb_logout_sid()
7687 qla4xxx_session_logout_ddb(ha, ddb_entry, options); in qla4xxx_sysfs_ddb_logout_sid()
7692 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_sysfs_ddb_logout_sid()
7707 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_sysfs_ddb_logout_sid()
7717 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_sysfs_ddb_logout_sid()
7718 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_sysfs_ddb_logout_sid()
7719 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); in qla4xxx_sysfs_ddb_logout_sid()
7720 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_sysfs_ddb_logout_sid()
7729 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_logout_sid()
7745 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_logout() local
7757 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_sysfs_ddb_logout()
7760 ql4_printk(KERN_ERR, ha, "%s:Out of memory\n", __func__); in qla4xxx_sysfs_ddb_logout()
7767 ql4_printk(KERN_WARNING, ha, in qla4xxx_sysfs_ddb_logout()
7775 ql4_printk(KERN_WARNING, ha, in qla4xxx_sysfs_ddb_logout()
7782 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout()
7790 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout()
7811 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_sysfs_ddb_logout()
7819 status = qla4xxx_get_fwddb_entry(ha, index, fw_ddb_entry, in qla4xxx_sysfs_ddb_logout()
7830 status = qla4xxx_compare_tuple_ddb(ha, flash_tddb, tmp_tddb, in qla4xxx_sysfs_ddb_logout()
7847 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_sysfs_ddb_logout()
7857 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_get_param() local
8059 qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_get_param()
8070 qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_get_param()
8112 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_set_param() local
8306 if (!qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_set_param()
8316 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_set_param()
8338 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_delete() local
8351 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_delete()
8360 if (is_qla40XX(ha)) { in qla4xxx_sysfs_ddb_delete()
8368 (ha->hw.flt_region_ddb << 2); in qla4xxx_sysfs_ddb_delete()
8372 if (ha->port_num == 1) in qla4xxx_sysfs_ddb_delete()
8373 dev_db_start_offset += (ha->hw.flt_ddb_size / 2); in qla4xxx_sysfs_ddb_delete()
8376 (ha->hw.flt_ddb_size / 2); in qla4xxx_sysfs_ddb_delete()
8385 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: start offset=%u, end offset=%u\n", in qla4xxx_sysfs_ddb_delete()
8390 DEBUG2(ql4_printk(KERN_ERR, ha, "%s:Invalid DDB index %u\n", in qla4xxx_sysfs_ddb_delete()
8395 pddb = dma_alloc_coherent(&ha->pdev->dev, ddb_size, in qla4xxx_sysfs_ddb_delete()
8399 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_delete()
8405 if (is_qla40XX(ha)) { in qla4xxx_sysfs_ddb_delete()
8415 qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, in qla4xxx_sysfs_ddb_delete()
8421 ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_delete()
8423 __func__, target_id, ha->host_no); in qla4xxx_sysfs_ddb_delete()
8426 dma_free_coherent(&ha->pdev->dev, ddb_size, pddb, in qla4xxx_sysfs_ddb_delete()
8437 int qla4xxx_sysfs_ddb_export(struct scsi_qla_host *ha) in qla4xxx_sysfs_ddb_export() argument
8445 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_sysfs_ddb_export()
8449 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_export()
8455 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : in qla4xxx_sysfs_ddb_export()
8459 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, fw_ddb_entry_dma, in qla4xxx_sysfs_ddb_export()
8463 ret = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 0); in qla4xxx_sysfs_ddb_export()
8470 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), fw_ddb_entry, in qla4xxx_sysfs_ddb_export()
8476 static void qla4xxx_sysfs_ddb_remove(struct scsi_qla_host *ha) in qla4xxx_sysfs_ddb_remove() argument
8478 iscsi_destroy_all_flashnode(ha->host); in qla4xxx_sysfs_ddb_remove()
8491 void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset) in qla4xxx_build_ddb_list() argument
8498 if (!test_bit(AF_LINK_UP, &ha->flags)) { in qla4xxx_build_ddb_list()
8499 set_bit(AF_BUILD_DDB_LIST, &ha->flags); in qla4xxx_build_ddb_list()
8500 ha->is_reset = is_reset; in qla4xxx_build_ddb_list()
8507 qla4xxx_build_st_list(ha, &list_st); in qla4xxx_build_ddb_list()
8512 qla4xxx_wait_for_ip_configuration(ha); in qla4xxx_build_ddb_list()
8516 qla4xxx_conn_open(ha, st_ddb_idx->fw_ddb_idx); in qla4xxx_build_ddb_list()
8520 tmo = ((ha->def_timeout > LOGIN_TOV) && in qla4xxx_build_ddb_list()
8521 (ha->def_timeout < LOGIN_TOV * 10) ? in qla4xxx_build_ddb_list()
8522 ha->def_timeout : LOGIN_TOV); in qla4xxx_build_ddb_list()
8524 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_ddb_list()
8532 qla4xxx_remove_failed_ddb(ha, &list_st); in qla4xxx_build_ddb_list()
8537 qla4xxx_build_nt_list(ha, &list_nt, &list_st, is_reset); in qla4xxx_build_ddb_list()
8542 qla4xxx_free_ddb_index(ha); in qla4xxx_build_ddb_list()
8554 static void qla4xxx_wait_login_resp_boot_tgt(struct scsi_qla_host *ha) in qla4xxx_wait_login_resp_boot_tgt() argument
8563 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_wait_login_resp_boot_tgt()
8566 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_wait_login_resp_boot_tgt()
8569 ql4_printk(KERN_ERR, ha, in qla4xxx_wait_login_resp_boot_tgt()
8577 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_wait_login_resp_boot_tgt()
8582 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_login_resp_boot_tgt()
8586 ret = qla4xxx_get_fwddb_entry(ha, in qla4xxx_wait_login_resp_boot_tgt()
8603 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_login_resp_boot_tgt()
8613 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_wait_login_resp_boot_tgt()
8631 struct scsi_qla_host *ha; in qla4xxx_probe_adapter() local
8640 host = iscsi_host_alloc(&qla4xxx_driver_template, sizeof(*ha), 0); in qla4xxx_probe_adapter()
8648 ha = to_qla_host(host); in qla4xxx_probe_adapter()
8649 memset(ha, 0, sizeof(*ha)); in qla4xxx_probe_adapter()
8652 ha->pdev = pdev; in qla4xxx_probe_adapter()
8653 ha->host = host; in qla4xxx_probe_adapter()
8654 ha->host_no = host->host_no; in qla4xxx_probe_adapter()
8655 ha->func_num = PCI_FUNC(ha->pdev->devfn); in qla4xxx_probe_adapter()
8660 if (is_qla8022(ha)) { in qla4xxx_probe_adapter()
8661 ha->isp_ops = &qla4_82xx_isp_ops; in qla4xxx_probe_adapter()
8662 ha->reg_tbl = (uint32_t *) qla4_82xx_reg_tbl; in qla4xxx_probe_adapter()
8663 ha->qdr_sn_window = -1; in qla4xxx_probe_adapter()
8664 ha->ddr_mn_window = -1; in qla4xxx_probe_adapter()
8665 ha->curr_window = 255; in qla4xxx_probe_adapter()
8666 nx_legacy_intr = &legacy_intr[ha->func_num]; in qla4xxx_probe_adapter()
8667 ha->nx_legacy_intr.int_vec_bit = nx_legacy_intr->int_vec_bit; in qla4xxx_probe_adapter()
8668 ha->nx_legacy_intr.tgt_status_reg = in qla4xxx_probe_adapter()
8670 ha->nx_legacy_intr.tgt_mask_reg = nx_legacy_intr->tgt_mask_reg; in qla4xxx_probe_adapter()
8671 ha->nx_legacy_intr.pci_int_reg = nx_legacy_intr->pci_int_reg; in qla4xxx_probe_adapter()
8672 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_probe_adapter()
8673 ha->isp_ops = &qla4_83xx_isp_ops; in qla4xxx_probe_adapter()
8674 ha->reg_tbl = (uint32_t *)qla4_83xx_reg_tbl; in qla4xxx_probe_adapter()
8676 ha->isp_ops = &qla4xxx_isp_ops; in qla4xxx_probe_adapter()
8679 if (is_qla80XX(ha)) { in qla4xxx_probe_adapter()
8680 rwlock_init(&ha->hw_lock); in qla4xxx_probe_adapter()
8681 ha->pf_bit = ha->func_num << 16; in qla4xxx_probe_adapter()
8687 ret = ha->isp_ops->iospace_config(ha); in qla4xxx_probe_adapter()
8691 ql4_printk(KERN_INFO, ha, "Found an ISP%04x, irq %d, iobase 0x%p\n", in qla4xxx_probe_adapter()
8692 pdev->device, pdev->irq, ha->reg); in qla4xxx_probe_adapter()
8694 qla4xxx_config_dma_addressing(ha); in qla4xxx_probe_adapter()
8697 INIT_LIST_HEAD(&ha->free_srb_q); in qla4xxx_probe_adapter()
8699 mutex_init(&ha->mbox_sem); in qla4xxx_probe_adapter()
8700 mutex_init(&ha->chap_sem); in qla4xxx_probe_adapter()
8701 init_completion(&ha->mbx_intr_comp); in qla4xxx_probe_adapter()
8702 init_completion(&ha->disable_acb_comp); in qla4xxx_probe_adapter()
8703 init_completion(&ha->idc_comp); in qla4xxx_probe_adapter()
8704 init_completion(&ha->link_up_comp); in qla4xxx_probe_adapter()
8706 spin_lock_init(&ha->hardware_lock); in qla4xxx_probe_adapter()
8707 spin_lock_init(&ha->work_lock); in qla4xxx_probe_adapter()
8710 INIT_LIST_HEAD(&ha->work_list); in qla4xxx_probe_adapter()
8713 if (qla4xxx_mem_alloc(ha)) { in qla4xxx_probe_adapter()
8714 ql4_printk(KERN_WARNING, ha, in qla4xxx_probe_adapter()
8729 pci_set_drvdata(pdev, ha); in qla4xxx_probe_adapter()
8735 if (is_qla80XX(ha)) in qla4xxx_probe_adapter()
8736 qla4_8xxx_get_flash_info(ha); in qla4xxx_probe_adapter()
8738 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_probe_adapter()
8739 qla4_83xx_read_reset_template(ha); in qla4xxx_probe_adapter()
8747 qla4_83xx_set_idc_dontreset(ha); in qla4xxx_probe_adapter()
8755 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8758 if (is_qla80XX(ha) && (status == QLA_ERROR)) in qla4xxx_probe_adapter()
8761 while ((!test_bit(AF_ONLINE, &ha->flags)) && in qla4xxx_probe_adapter()
8764 if (is_qla80XX(ha)) { in qla4xxx_probe_adapter()
8765 ha->isp_ops->idc_lock(ha); in qla4xxx_probe_adapter()
8766 dev_state = qla4_8xxx_rd_direct(ha, in qla4xxx_probe_adapter()
8768 ha->isp_ops->idc_unlock(ha); in qla4xxx_probe_adapter()
8770 ql4_printk(KERN_WARNING, ha, "%s: don't retry " in qla4xxx_probe_adapter()
8779 if (ha->isp_ops->reset_chip(ha) == QLA_ERROR) in qla4xxx_probe_adapter()
8782 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8783 if (is_qla80XX(ha) && (status == QLA_ERROR)) { in qla4xxx_probe_adapter()
8784 if (qla4_8xxx_check_init_adapter_retry(ha) == QLA_ERROR) in qla4xxx_probe_adapter()
8790 if (!test_bit(AF_ONLINE, &ha->flags)) { in qla4xxx_probe_adapter()
8791 ql4_printk(KERN_WARNING, ha, "Failed to initialize adapter\n"); in qla4xxx_probe_adapter()
8793 if ((is_qla8022(ha) && ql4xdontresethba) || in qla4xxx_probe_adapter()
8794 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_probe_adapter()
8795 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_probe_adapter()
8798 ha->isp_ops->idc_lock(ha); in qla4xxx_probe_adapter()
8799 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4xxx_probe_adapter()
8801 ha->isp_ops->idc_unlock(ha); in qla4xxx_probe_adapter()
8810 sprintf(buf, "qla4xxx_%lu_dpc", ha->host_no); in qla4xxx_probe_adapter()
8811 ha->dpc_thread = create_singlethread_workqueue(buf); in qla4xxx_probe_adapter()
8812 if (!ha->dpc_thread) { in qla4xxx_probe_adapter()
8813 ql4_printk(KERN_WARNING, ha, "Unable to start DPC thread!\n"); in qla4xxx_probe_adapter()
8817 INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc); in qla4xxx_probe_adapter()
8819 ha->task_wq = alloc_workqueue("qla4xxx_%lu_task", WQ_MEM_RECLAIM, 1, in qla4xxx_probe_adapter()
8820 ha->host_no); in qla4xxx_probe_adapter()
8821 if (!ha->task_wq) { in qla4xxx_probe_adapter()
8822 ql4_printk(KERN_WARNING, ha, "Unable to start task thread!\n"); in qla4xxx_probe_adapter()
8833 if (is_qla40XX(ha)) { in qla4xxx_probe_adapter()
8834 ret = qla4xxx_request_irqs(ha); in qla4xxx_probe_adapter()
8836 ql4_printk(KERN_WARNING, ha, "Failed to reserve " in qla4xxx_probe_adapter()
8842 pci_save_state(ha->pdev); in qla4xxx_probe_adapter()
8843 ha->isp_ops->enable_intrs(ha); in qla4xxx_probe_adapter()
8846 qla4xxx_start_timer(ha, 1); in qla4xxx_probe_adapter()
8848 set_bit(AF_INIT_DONE, &ha->flags); in qla4xxx_probe_adapter()
8850 qla4_8xxx_alloc_sysfs_attr(ha); in qla4xxx_probe_adapter()
8855 qla4xxx_version_str, ha->pdev->device, pci_name(ha->pdev), in qla4xxx_probe_adapter()
8856 ha->host_no, ha->fw_info.fw_major, ha->fw_info.fw_minor, in qla4xxx_probe_adapter()
8857 ha->fw_info.fw_patch, ha->fw_info.fw_build); in qla4xxx_probe_adapter()
8860 if (is_qla80XX(ha)) in qla4xxx_probe_adapter()
8861 qla4_8xxx_set_param(ha, SET_DRVR_VERSION); in qla4xxx_probe_adapter()
8863 if (qla4xxx_setup_boot_info(ha)) in qla4xxx_probe_adapter()
8864 ql4_printk(KERN_ERR, ha, in qla4xxx_probe_adapter()
8867 set_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags); in qla4xxx_probe_adapter()
8869 qla4xxx_build_ddb_list(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8870 iscsi_host_for_each_session(ha->host, qla4xxx_login_flash_ddb); in qla4xxx_probe_adapter()
8871 qla4xxx_wait_login_resp_boot_tgt(ha); in qla4xxx_probe_adapter()
8873 qla4xxx_create_chap_list(ha); in qla4xxx_probe_adapter()
8875 qla4xxx_create_ifaces(ha); in qla4xxx_probe_adapter()
8879 scsi_remove_host(ha->host); in qla4xxx_probe_adapter()
8882 qla4xxx_free_adapter(ha); in qla4xxx_probe_adapter()
8886 scsi_host_put(ha->host); in qla4xxx_probe_adapter()
8902 static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha) in qla4xxx_prevent_other_port_reinit() argument
8909 if (PCI_FUNC(ha->pdev->devfn) & BIT_1) in qla4xxx_prevent_other_port_reinit()
8913 pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus), in qla4xxx_prevent_other_port_reinit()
8914 ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), in qla4xxx_prevent_other_port_reinit()
8923 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: " in qla4xxx_prevent_other_port_reinit()
8932 static void qla4xxx_destroy_ddb(struct scsi_qla_host *ha, in qla4xxx_destroy_ddb() argument
8943 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) { in qla4xxx_destroy_ddb()
8944 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); in qla4xxx_destroy_ddb()
8948 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_destroy_ddb()
8951 ql4_printk(KERN_ERR, ha, in qla4xxx_destroy_ddb()
8958 status = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_destroy_ddb()
8973 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_destroy_ddb()
8976 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_destroy_ddb()
8979 static void qla4xxx_destroy_fw_ddb_session(struct scsi_qla_host *ha) in qla4xxx_destroy_fw_ddb_session() argument
8986 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_destroy_fw_ddb_session()
8990 qla4xxx_destroy_ddb(ha, ddb_entry); in qla4xxx_destroy_fw_ddb_session()
8999 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_destroy_fw_ddb_session()
9010 struct scsi_qla_host *ha; in qla4xxx_remove_adapter() local
9019 ha = pci_get_drvdata(pdev); in qla4xxx_remove_adapter()
9021 if (is_qla40XX(ha)) in qla4xxx_remove_adapter()
9022 qla4xxx_prevent_other_port_reinit(ha); in qla4xxx_remove_adapter()
9025 qla4xxx_destroy_ifaces(ha); in qla4xxx_remove_adapter()
9027 if ((!ql4xdisablesysfsboot) && ha->boot_kset) in qla4xxx_remove_adapter()
9028 iscsi_boot_destroy_kset(ha->boot_kset); in qla4xxx_remove_adapter()
9030 qla4xxx_destroy_fw_ddb_session(ha); in qla4xxx_remove_adapter()
9031 qla4_8xxx_free_sysfs_attr(ha); in qla4xxx_remove_adapter()
9033 qla4xxx_sysfs_ddb_remove(ha); in qla4xxx_remove_adapter()
9034 scsi_remove_host(ha->host); in qla4xxx_remove_adapter()
9036 qla4xxx_free_adapter(ha); in qla4xxx_remove_adapter()
9038 scsi_host_put(ha->host); in qla4xxx_remove_adapter()
9048 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha) in qla4xxx_config_dma_addressing() argument
9051 if (dma_set_mask_and_coherent(&ha->pdev->dev, DMA_BIT_MASK(64))) { in qla4xxx_config_dma_addressing()
9052 dev_dbg(&ha->pdev->dev, in qla4xxx_config_dma_addressing()
9055 dma_set_mask_and_coherent(&ha->pdev->dev, DMA_BIT_MASK(32)); in qla4xxx_config_dma_addressing()
9086 struct srb *qla4xxx_del_from_active_array(struct scsi_qla_host *ha, in qla4xxx_del_from_active_array() argument
9092 cmd = scsi_host_find_tag(ha->host, index); in qla4xxx_del_from_active_array()
9102 ha->iocb_cnt -= srb->iocb_cnt; in qla4xxx_del_from_active_array()
9118 static int qla4xxx_eh_wait_on_command(struct scsi_qla_host *ha, in qla4xxx_eh_wait_on_command() argument
9129 if (unlikely(pci_channel_offline(ha->pdev)) || in qla4xxx_eh_wait_on_command()
9130 (test_bit(AF_EEH_BUSY, &ha->flags))) { in qla4xxx_eh_wait_on_command()
9131 ql4_printk(KERN_WARNING, ha, "scsi%ld: Return from %s\n", in qla4xxx_eh_wait_on_command()
9132 ha->host_no, __func__); in qla4xxx_eh_wait_on_command()
9154 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha) in qla4xxx_wait_for_hba_online() argument
9161 if (adapter_up(ha)) in qla4xxx_wait_for_hba_online()
9179 static int qla4xxx_eh_wait_for_commands(struct scsi_qla_host *ha, in qla4xxx_eh_wait_for_commands() argument
9191 for (cnt = 0; cnt < ha->host->can_queue; cnt++) { in qla4xxx_eh_wait_for_commands()
9192 cmd = scsi_host_find_tag(ha->host, cnt); in qla4xxx_eh_wait_for_commands()
9195 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { in qla4xxx_eh_wait_for_commands()
9213 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_abort() local
9222 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Abort command issued cmd=%p, cdb=0x%x\n", in qla4xxx_eh_abort()
9223 ha->host_no, id, lun, cmd, cmd->cmnd[0]); in qla4xxx_eh_abort()
9225 rval = qla4xxx_isp_check_reg(ha); in qla4xxx_eh_abort()
9227 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); in qla4xxx_eh_abort()
9231 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9234 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9235 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Specified command has already completed.\n", in qla4xxx_eh_abort()
9236 ha->host_no, id, lun); in qla4xxx_eh_abort()
9240 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9242 if (qla4xxx_abort_task(ha, srb) != QLA_SUCCESS) { in qla4xxx_eh_abort()
9244 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9248 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9256 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { in qla4xxx_eh_abort()
9258 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9263 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_abort()
9265 ha->host_no, id, lun, (ret == SUCCESS) ? "succeeded" : "failed"); in qla4xxx_eh_abort()
9279 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_device_reset() local
9292 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9293 "scsi%ld:%d:%d:%llu: DEVICE RESET ISSUED.\n", ha->host_no, in qla4xxx_eh_device_reset()
9298 "dpc_flags=%lx, status=%x allowed=%d\n", ha->host_no, in qla4xxx_eh_device_reset()
9300 ha->dpc_flags, cmd->result, cmd->allowed)); in qla4xxx_eh_device_reset()
9302 rval = qla4xxx_isp_check_reg(ha); in qla4xxx_eh_device_reset()
9304 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); in qla4xxx_eh_device_reset()
9309 stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun); in qla4xxx_eh_device_reset()
9311 ql4_printk(KERN_INFO, ha, "DEVICE RESET FAILED. %d\n", stat); in qla4xxx_eh_device_reset()
9315 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), in qla4xxx_eh_device_reset()
9317 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9324 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, in qla4xxx_eh_device_reset()
9328 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9330 ha->host_no, cmd->device->channel, cmd->device->id, in qla4xxx_eh_device_reset()
9348 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_target_reset() local
9366 ha->host_no, cmd, jiffies, cmd->request->timeout / HZ, in qla4xxx_eh_target_reset()
9367 ha->dpc_flags, cmd->result, cmd->allowed)); in qla4xxx_eh_target_reset()
9369 rval = qla4xxx_isp_check_reg(ha); in qla4xxx_eh_target_reset()
9371 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); in qla4xxx_eh_target_reset()
9375 stat = qla4xxx_reset_target(ha, ddb_entry); in qla4xxx_eh_target_reset()
9382 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), in qla4xxx_eh_target_reset()
9391 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, in qla4xxx_eh_target_reset()
9428 struct scsi_qla_host *ha; in qla4xxx_eh_host_reset() local
9431 ha = to_qla_host(cmd->device->host); in qla4xxx_eh_host_reset()
9433 rval = qla4xxx_isp_check_reg(ha); in qla4xxx_eh_host_reset()
9435 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); in qla4xxx_eh_host_reset()
9439 if ((is_qla8032(ha) || is_qla8042(ha)) && ql4xdontresethba) in qla4xxx_eh_host_reset()
9440 qla4_83xx_set_idc_dontreset(ha); in qla4xxx_eh_host_reset()
9447 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_eh_host_reset()
9448 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_eh_host_reset()
9450 ha->host_no, __func__)); in qla4xxx_eh_host_reset()
9454 qla4xxx_abort_active_cmds(ha, DID_ABORT << 16); in qla4xxx_eh_host_reset()
9459 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_host_reset()
9460 "scsi(%ld:%d:%d:%llu): HOST RESET ISSUED.\n", ha->host_no, in qla4xxx_eh_host_reset()
9463 if (qla4xxx_wait_for_hba_online(ha) != QLA_SUCCESS) { in qla4xxx_eh_host_reset()
9465 "DEAD.\n", ha->host_no, cmd->device->channel, in qla4xxx_eh_host_reset()
9471 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_eh_host_reset()
9472 if (is_qla80XX(ha)) in qla4xxx_eh_host_reset()
9473 set_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_eh_host_reset()
9475 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_eh_host_reset()
9478 if (qla4xxx_recover_adapter(ha) == QLA_SUCCESS) in qla4xxx_eh_host_reset()
9481 ql4_printk(KERN_INFO, ha, "HOST RESET %s.\n", in qla4xxx_eh_host_reset()
9487 static int qla4xxx_context_reset(struct scsi_qla_host *ha) in qla4xxx_context_reset() argument
9496 acb = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_context_reset()
9500 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc acb\n", in qla4xxx_context_reset()
9508 rval = qla4xxx_get_acb(ha, acb_dma, PRIMARI_ACB, acb_len); in qla4xxx_context_reset()
9514 rval = qla4xxx_disable_acb(ha); in qla4xxx_context_reset()
9520 wait_for_completion_timeout(&ha->disable_acb_comp, in qla4xxx_context_reset()
9523 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], acb_dma); in qla4xxx_context_reset()
9530 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk_def), in qla4xxx_context_reset()
9533 DEBUG2(ql4_printk(KERN_INFO, ha, "%s %s\n", __func__, in qla4xxx_context_reset()
9540 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_host_reset() local
9545 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Don't Reset HBA\n", in qla4xxx_host_reset()
9551 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_host_reset()
9556 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_host_reset()
9559 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_host_reset()
9560 if (is_qla80XX(ha)) in qla4xxx_host_reset()
9563 &ha->dpc_flags); in qla4xxx_host_reset()
9565 rval = qla4xxx_context_reset(ha); in qla4xxx_host_reset()
9575 if ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_host_reset()
9576 test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_host_reset()
9577 idc_ctrl = qla4_83xx_rd_reg(ha, QLA83XX_IDC_DRV_CTRL); in qla4xxx_host_reset()
9578 qla4_83xx_wr_reg(ha, QLA83XX_IDC_DRV_CTRL, in qla4xxx_host_reset()
9582 rval = qla4xxx_recover_adapter(ha); in qla4xxx_host_reset()
9584 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: recover adapter fail\n", in qla4xxx_host_reset()
9611 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_error_detected() local
9613 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: error detected:state %x\n", in qla4xxx_pci_error_detected()
9614 ha->host_no, __func__, state); in qla4xxx_pci_error_detected()
9616 if (!is_aer_supported(ha)) in qla4xxx_pci_error_detected()
9621 clear_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9624 set_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9625 qla4xxx_mailbox_premature_completion(ha); in qla4xxx_pci_error_detected()
9626 qla4xxx_free_irqs(ha); in qla4xxx_pci_error_detected()
9629 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_pci_error_detected()
9632 set_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9633 set_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags); in qla4xxx_pci_error_detected()
9634 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_pci_error_detected()
9649 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_mmio_enabled() local
9651 if (!is_aer_supported(ha)) in qla4xxx_pci_mmio_enabled()
9657 static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha) in qla4_8xxx_error_recovery() argument
9663 ql4_printk(KERN_WARNING, ha, "scsi%ld: In %s\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9665 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4_8xxx_error_recovery()
9667 if (test_bit(AF_ONLINE, &ha->flags)) { in qla4_8xxx_error_recovery()
9668 clear_bit(AF_ONLINE, &ha->flags); in qla4_8xxx_error_recovery()
9669 clear_bit(AF_LINK_UP, &ha->flags); in qla4_8xxx_error_recovery()
9670 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); in qla4_8xxx_error_recovery()
9671 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4_8xxx_error_recovery()
9674 fn = PCI_FUNC(ha->pdev->devfn); in qla4_8xxx_error_recovery()
9675 if (is_qla8022(ha)) { in qla4_8xxx_error_recovery()
9678 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Finding PCI device at func %x\n", in qla4_8xxx_error_recovery()
9679 ha->host_no, __func__, fn); in qla4_8xxx_error_recovery()
9683 pci_domain_nr(ha->pdev->bus), in qla4_8xxx_error_recovery()
9684 ha->pdev->bus->number, in qla4_8xxx_error_recovery()
9685 PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), in qla4_8xxx_error_recovery()
9692 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Found PCI func in enabled state%x\n", in qla4_8xxx_error_recovery()
9693 ha->host_no, __func__, fn); in qla4_8xxx_error_recovery()
9701 if (qla4_83xx_can_perform_reset(ha)) { in qla4_8xxx_error_recovery()
9712 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn being reset " in qla4_8xxx_error_recovery()
9713 "0x%x is the owner\n", ha->host_no, __func__, in qla4_8xxx_error_recovery()
9714 ha->pdev->devfn); in qla4_8xxx_error_recovery()
9716 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9717 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9719 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9721 rval = qla4_8xxx_update_idc_reg(ha); in qla4_8xxx_error_recovery()
9723 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: FAILED\n", in qla4_8xxx_error_recovery()
9724 ha->host_no, __func__); in qla4_8xxx_error_recovery()
9725 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9726 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9728 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9732 clear_bit(AF_FW_RECOVERY, &ha->flags); in qla4_8xxx_error_recovery()
9733 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4_8xxx_error_recovery()
9736 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " in qla4_8xxx_error_recovery()
9737 "FAILED\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9738 qla4xxx_free_irqs(ha); in qla4_8xxx_error_recovery()
9739 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9740 qla4_8xxx_clear_drv_active(ha); in qla4_8xxx_error_recovery()
9741 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9743 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9745 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " in qla4_8xxx_error_recovery()
9746 "READY\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9747 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9748 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9751 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DRV_STATE, 0); in qla4_8xxx_error_recovery()
9752 qla4_8xxx_set_drv_active(ha); in qla4_8xxx_error_recovery()
9753 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9754 ha->isp_ops->enable_intrs(ha); in qla4_8xxx_error_recovery()
9757 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn 0x%x is not " in qla4_8xxx_error_recovery()
9758 "the reset owner\n", ha->host_no, __func__, in qla4_8xxx_error_recovery()
9759 ha->pdev->devfn); in qla4_8xxx_error_recovery()
9760 if ((qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE) == in qla4_8xxx_error_recovery()
9762 clear_bit(AF_FW_RECOVERY, &ha->flags); in qla4_8xxx_error_recovery()
9763 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4_8xxx_error_recovery()
9765 ha->isp_ops->enable_intrs(ha); in qla4_8xxx_error_recovery()
9767 qla4xxx_free_irqs(ha); in qla4_8xxx_error_recovery()
9769 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9770 qla4_8xxx_set_drv_active(ha); in qla4_8xxx_error_recovery()
9771 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9775 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4_8xxx_error_recovery()
9783 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_slot_reset() local
9786 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: slot_reset\n", in qla4xxx_pci_slot_reset()
9787 ha->host_no, __func__); in qla4xxx_pci_slot_reset()
9789 if (!is_aer_supported(ha)) in qla4xxx_pci_slot_reset()
9806 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Can't re-enable " in qla4xxx_pci_slot_reset()
9807 "device after reset\n", ha->host_no, __func__); in qla4xxx_pci_slot_reset()
9811 ha->isp_ops->disable_intrs(ha); in qla4xxx_pci_slot_reset()
9813 if (is_qla80XX(ha)) { in qla4xxx_pci_slot_reset()
9814 if (qla4_8xxx_error_recovery(ha) == QLA_SUCCESS) { in qla4xxx_pci_slot_reset()
9822 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Return=%x\n" in qla4xxx_pci_slot_reset()
9823 "device after reset\n", ha->host_no, __func__, ret); in qla4xxx_pci_slot_reset()
9830 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_resume() local
9833 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: pci_resume\n", in qla4xxx_pci_resume()
9834 ha->host_no, __func__); in qla4xxx_pci_resume()
9836 ret = qla4xxx_wait_for_hba_online(ha); in qla4xxx_pci_resume()
9838 ql4_printk(KERN_ERR, ha, "scsi%ld: %s: the device failed to " in qla4xxx_pci_resume()
9839 "resume I/O from slot/link_reset\n", ha->host_no, in qla4xxx_pci_resume()
9843 clear_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_resume()