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);
297 static int qla4xxx_isp_check_reg(struct scsi_qla_host *ha) in qla4xxx_isp_check_reg() argument
302 if (is_qla8022(ha)) in qla4xxx_isp_check_reg()
303 reg_val = readl(&ha->qla4_82xx_reg->host_status); in qla4xxx_isp_check_reg()
304 else if (is_qla8032(ha) || is_qla8042(ha)) in qla4xxx_isp_check_reg()
305 reg_val = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_ALIVE_COUNTER); in qla4xxx_isp_check_reg()
307 reg_val = readw(&ha->reg->ctrl_status); in qla4xxx_isp_check_reg()
319 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_send_ping() local
332 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv4 Ping src: %pI4 " in qla4xxx_send_ping()
334 &ha->ip_config.ip_address, ipaddr)); in qla4xxx_send_ping()
335 rval = qla4xxx_ping_iocb(ha, options, payload_size, pid, in qla4xxx_send_ping()
349 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: LinkLocal Ping " in qla4xxx_send_ping()
351 &ha->ip_config.ipv6_link_local_addr, in qla4xxx_send_ping()
354 rval = qla4xxx_ping_iocb(ha, options, payload_size, in qla4xxx_send_ping()
357 ql4_printk(KERN_WARNING, ha, "%s: iface num = %d " in qla4xxx_send_ping()
371 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " in qla4xxx_send_ping()
374 &ha->ip_config.ipv6_addr0, in qla4xxx_send_ping()
378 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " in qla4xxx_send_ping()
381 &ha->ip_config.ipv6_addr1, in qla4xxx_send_ping()
384 rval = qla4xxx_ping_iocb(ha, options, payload_size, in qla4xxx_send_ping()
630 static void qla4xxx_create_chap_list(struct scsi_qla_host *ha) in qla4xxx_create_chap_list() argument
638 if (is_qla40XX(ha)) in qla4xxx_create_chap_list()
644 chap_size = ha->hw.flt_chap_size / 2; in qla4xxx_create_chap_list()
646 chap_flash_data = dma_alloc_coherent(&ha->pdev->dev, chap_size, in qla4xxx_create_chap_list()
649 ql4_printk(KERN_ERR, ha, "No memory for chap_flash_data\n"); in qla4xxx_create_chap_list()
653 if (is_qla40XX(ha)) { in qla4xxx_create_chap_list()
656 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); in qla4xxx_create_chap_list()
657 if (ha->port_num == 1) in qla4xxx_create_chap_list()
661 rval = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); in qla4xxx_create_chap_list()
665 if (ha->chap_list == NULL) in qla4xxx_create_chap_list()
666 ha->chap_list = vmalloc(chap_size); in qla4xxx_create_chap_list()
667 if (ha->chap_list == NULL) { in qla4xxx_create_chap_list()
668 ql4_printk(KERN_ERR, ha, "No memory for ha->chap_list\n"); in qla4xxx_create_chap_list()
672 memset(ha->chap_list, 0, chap_size); in qla4xxx_create_chap_list()
673 memcpy(ha->chap_list, chap_flash_data, chap_size); in qla4xxx_create_chap_list()
676 dma_free_coherent(&ha->pdev->dev, chap_size, chap_flash_data, chap_dma); in qla4xxx_create_chap_list()
679 static int qla4xxx_get_chap_by_index(struct scsi_qla_host *ha, in qla4xxx_get_chap_by_index() argument
686 if (!ha->chap_list) { in qla4xxx_get_chap_by_index()
687 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); in qla4xxx_get_chap_by_index()
692 if (is_qla80XX(ha)) in qla4xxx_get_chap_by_index()
693 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_chap_by_index()
699 ql4_printk(KERN_ERR, ha, "Invalid Chap index\n"); in qla4xxx_get_chap_by_index()
704 *chap_entry = (struct ql4_chap_table *)ha->chap_list + chap_index; in qla4xxx_get_chap_by_index()
726 static int qla4xxx_find_free_chap_index(struct scsi_qla_host *ha, in qla4xxx_find_free_chap_index() argument
734 if (is_qla80XX(ha)) in qla4xxx_find_free_chap_index()
735 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_find_free_chap_index()
740 if (!ha->chap_list) { in qla4xxx_find_free_chap_index()
741 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); in qla4xxx_find_free_chap_index()
747 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_find_free_chap_index()
771 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_chap_list() local
778 if (is_qla80XX(ha)) in qla4xxx_get_chap_list()
779 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_chap_list()
784 ql4_printk(KERN_INFO, ha, "%s: num_entries = %d, CHAP idx = %d\n", in qla4xxx_get_chap_list()
792 qla4xxx_create_chap_list(ha); in qla4xxx_get_chap_list()
795 mutex_lock(&ha->chap_sem); in qla4xxx_get_chap_list()
797 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_get_chap_list()
823 mutex_unlock(&ha->chap_sem); in qla4xxx_get_chap_list()
826 ql4_printk(KERN_INFO, ha, "%s: Valid CHAP Entries = %d\n", in qla4xxx_get_chap_list()
870 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_delete_chap() local
878 chap_table = dma_pool_zalloc(ha->chap_dma_pool, GFP_KERNEL, &chap_dma); in qla4xxx_delete_chap()
882 if (is_qla80XX(ha)) in qla4xxx_delete_chap()
883 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_delete_chap()
897 ql4_printk(KERN_INFO, ha, "CHAP entry %d is in use, cannot " in qla4xxx_delete_chap()
904 if (is_qla40XX(ha)) in qla4xxx_delete_chap()
907 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); in qla4xxx_delete_chap()
911 if (ha->port_num == 1) in qla4xxx_delete_chap()
912 offset += (ha->hw.flt_chap_size / 2); in qla4xxx_delete_chap()
916 ret = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); in qla4xxx_delete_chap()
922 DEBUG2(ql4_printk(KERN_INFO, ha, "Chap Cookie: x%x\n", in qla4xxx_delete_chap()
926 ql4_printk(KERN_ERR, ha, "No valid chap entry found\n"); in qla4xxx_delete_chap()
934 ret = qla4xxx_set_flash(ha, chap_dma, offset, chap_size, in qla4xxx_delete_chap()
936 if (ret == QLA_SUCCESS && ha->chap_list) { in qla4xxx_delete_chap()
937 mutex_lock(&ha->chap_sem); in qla4xxx_delete_chap()
939 memcpy((struct ql4_chap_table *)ha->chap_list + chap_tbl_idx, in qla4xxx_delete_chap()
941 mutex_unlock(&ha->chap_sem); in qla4xxx_delete_chap()
947 dma_pool_free(ha->chap_dma_pool, chap_table, chap_dma); in qla4xxx_delete_chap()
961 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_chap_entry() local
998 ql4_printk(KERN_ERR, ha, in qla4xxx_set_chap_entry()
1010 if (is_qla80XX(ha)) in qla4xxx_set_chap_entry()
1011 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_set_chap_entry()
1016 mutex_lock(&ha->chap_sem); in qla4xxx_set_chap_entry()
1018 rc = qla4xxx_get_chap_by_index(ha, chap_rec.chap_tbl_idx, in qla4xxx_set_chap_entry()
1022 ql4_printk(KERN_INFO, ha, in qla4xxx_set_chap_entry()
1033 ql4_printk(KERN_INFO, ha, in qla4xxx_set_chap_entry()
1041 rc = qla4xxx_find_free_chap_index(ha, &chap_rec.chap_tbl_idx); in qla4xxx_set_chap_entry()
1043 ql4_printk(KERN_INFO, ha, "CHAP entry not available\n"); in qla4xxx_set_chap_entry()
1049 rc = qla4xxx_set_chap(ha, chap_rec.username, chap_rec.password, in qla4xxx_set_chap_entry()
1053 mutex_unlock(&ha->chap_sem); in qla4xxx_set_chap_entry()
1062 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_host_stats() local
1071 DEBUG2(ql4_printk(KERN_INFO, ha, "Func: %s\n", __func__)); in qla4xxx_get_host_stats()
1076 ql4_printk(KERN_INFO, ha, "%s: host_stats size mismatch expected = %d, is = %d\n", in qla4xxx_get_host_stats()
1090 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, in qla4xxx_get_host_stats()
1093 ql4_printk(KERN_ERR, ha, in qla4xxx_get_host_stats()
1099 ret = qla4xxx_get_mgmt_data(ha, ddb_idx, stats_size, in qla4xxx_get_host_stats()
1102 ql4_printk(KERN_ERR, ha, in qla4xxx_get_host_stats()
1256 dma_free_coherent(&ha->pdev->dev, stats_size, in qla4xxx_get_host_stats()
1259 ql4_printk(KERN_INFO, ha, "%s: Get host stats done\n", in qla4xxx_get_host_stats()
1269 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_iface_param() local
1277 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); in qla4xxx_get_iface_param()
1281 &ha->ip_config.subnet_mask); in qla4xxx_get_iface_param()
1284 len = sprintf(buf, "%pI4\n", &ha->ip_config.gateway); in qla4xxx_get_iface_param()
1288 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1291 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1299 (ha->ip_config.tcp_options & in qla4xxx_get_iface_param()
1306 &ha->ip_config.ipv6_addr0); in qla4xxx_get_iface_param()
1309 &ha->ip_config.ipv6_addr1); in qla4xxx_get_iface_param()
1313 &ha->ip_config.ipv6_link_local_addr); in qla4xxx_get_iface_param()
1317 &ha->ip_config.ipv6_default_router_addr); in qla4xxx_get_iface_param()
1320 pval = (ha->ip_config.ipv6_addl_options & in qla4xxx_get_iface_param()
1327 pval = (ha->ip_config.ipv6_addl_options & in qla4xxx_get_iface_param()
1335 ival = ha->ip_config.ipv4_vlan_tag & in qla4xxx_get_iface_param()
1338 ival = ha->ip_config.ipv6_vlan_tag & in qla4xxx_get_iface_param()
1345 ival = (ha->ip_config.ipv4_vlan_tag >> 13) & in qla4xxx_get_iface_param()
1348 ival = (ha->ip_config.ipv6_vlan_tag >> 13) & in qla4xxx_get_iface_param()
1355 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1358 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1364 len = sprintf(buf, "%d\n", ha->ip_config.eth_mtu_size); in qla4xxx_get_iface_param()
1369 ha->ip_config.ipv4_port); in qla4xxx_get_iface_param()
1372 ha->ip_config.ipv6_port); in qla4xxx_get_iface_param()
1377 ha->ip_config.ipv4_addr_state); in qla4xxx_get_iface_param()
1381 ha->ip_config.ipv6_addr0_state); in qla4xxx_get_iface_param()
1384 ha->ip_config.ipv6_addr1_state); in qla4xxx_get_iface_param()
1391 ha->ip_config.ipv6_link_local_state); in qla4xxx_get_iface_param()
1396 ha->ip_config.ipv6_default_router_state); in qla4xxx_get_iface_param()
1401 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1404 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1411 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1414 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1421 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1424 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1433 ha->ip_config.tcp_wsf); in qla4xxx_get_iface_param()
1436 ha->ip_config.ipv6_tcp_wsf); in qla4xxx_get_iface_param()
1440 ival = (ha->ip_config.tcp_options & in qla4xxx_get_iface_param()
1443 ival = (ha->ip_config.ipv6_tcp_options & in qla4xxx_get_iface_param()
1450 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1453 OP_STATE(ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1461 ha->ip_config.ipv4_cache_id); in qla4xxx_get_iface_param()
1464 ha->ip_config.ipv6_cache_id); in qla4xxx_get_iface_param()
1467 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1473 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1479 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1485 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_tos); in qla4xxx_get_iface_param()
1488 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1494 OP_STATE(ha->ip_config.ipv4_options, IPOPT_ALT_CID_EN, in qla4xxx_get_iface_param()
1500 pval = (ha->ip_config.ipv4_alt_cid_len) ? in qla4xxx_get_iface_param()
1501 (char *)ha->ip_config.ipv4_alt_cid : ""; in qla4xxx_get_iface_param()
1506 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1512 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1518 pval = (ha->ip_config.ipv4_vid_len) ? in qla4xxx_get_iface_param()
1519 (char *)ha->ip_config.ipv4_vid : ""; in qla4xxx_get_iface_param()
1524 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1530 OP_STATE(~ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1536 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1543 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1546 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1552 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_ttl); in qla4xxx_get_iface_param()
1555 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1561 OP_STATE(ha->ip_config.ipv6_addl_options, in qla4xxx_get_iface_param()
1567 len = sprintf(buf, "%u\n", ha->ip_config.ipv6_flow_lbl); in qla4xxx_get_iface_param()
1571 ha->ip_config.ipv6_traffic_class); in qla4xxx_get_iface_param()
1575 ha->ip_config.ipv6_hop_limit); in qla4xxx_get_iface_param()
1579 ha->ip_config.ipv6_nd_reach_time); in qla4xxx_get_iface_param()
1583 ha->ip_config.ipv6_nd_rexmit_timer); in qla4xxx_get_iface_param()
1587 ha->ip_config.ipv6_nd_stale_timeout); in qla4xxx_get_iface_param()
1591 ha->ip_config.ipv6_dup_addr_detect_count); in qla4xxx_get_iface_param()
1595 ha->ip_config.ipv6_gw_advrt_mtu); in qla4xxx_get_iface_param()
1603 len = sprintf(buf, "%d\n", ha->ip_config.def_timeout); in qla4xxx_get_iface_param()
1606 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1612 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1618 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1624 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1630 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1636 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1643 (ha->ip_config.iscsi_options & in qla4xxx_get_iface_param()
1648 ha->ip_config.iscsi_max_pdu_size * in qla4xxx_get_iface_param()
1653 ha->ip_config.iscsi_first_burst_len * in qla4xxx_get_iface_param()
1658 ha->ip_config.iscsi_max_outstnd_r2t); in qla4xxx_get_iface_param()
1662 ha->ip_config.iscsi_max_burst_len * in qla4xxx_get_iface_param()
1666 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1672 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1678 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1684 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1690 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1696 len = sprintf(buf, "%s\n", ha->ip_config.iscsi_name); in qla4xxx_get_iface_param()
1713 struct scsi_qla_host *ha; in qla4xxx_ep_connect() local
1723 ha = iscsi_host_priv(shost); in qla4xxx_ep_connect()
1735 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI4\n", __func__, in qla4xxx_ep_connect()
1741 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI6\n", __func__, in qla4xxx_ep_connect()
1744 ql4_printk(KERN_WARNING, ha, "%s: Invalid endpoint\n", in qla4xxx_ep_connect()
1756 struct scsi_qla_host *ha; in qla4xxx_ep_poll() local
1760 ha = to_qla_host(qla_ep->host); in qla4xxx_ep_poll()
1761 DEBUG2(pr_info_ratelimited("%s: host: %ld\n", __func__, ha->host_no)); in qla4xxx_ep_poll()
1763 if (adapter_up(ha) && !test_bit(AF_BUILD_DDB_LIST, &ha->flags)) in qla4xxx_ep_poll()
1772 struct scsi_qla_host *ha; in qla4xxx_ep_disconnect() local
1775 ha = to_qla_host(qla_ep->host); in qla4xxx_ep_disconnect()
1776 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_ep_disconnect()
1777 ha->host_no)); in qla4xxx_ep_disconnect()
1787 struct scsi_qla_host *ha; in qla4xxx_get_ep_param() local
1792 ha = to_qla_host(qla_ep->host); in qla4xxx_get_ep_param()
1793 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_get_ep_param()
1794 ha->host_no)); in qla4xxx_get_ep_param()
1816 struct scsi_qla_host *ha; in qla4xxx_conn_get_stats() local
1825 ha = ddb_entry->ha; in qla4xxx_conn_get_stats()
1827 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_conn_get_stats()
1828 ha->host_no)); in qla4xxx_conn_get_stats()
1831 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, in qla4xxx_conn_get_stats()
1834 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_get_stats()
1839 ret = qla4xxx_get_mgmt_data(ha, ddb_entry->fw_ddb_index, stats_size, in qla4xxx_conn_get_stats()
1842 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_get_stats()
1872 dma_free_coherent(&ha->pdev->dev, stats_size, ql_iscsi_stats, in qla4xxx_conn_get_stats()
1896 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_port_speed() local
1900 qla4xxx_get_firmware_state(ha); in qla4xxx_set_port_speed()
1902 switch (ha->addl_fw_state & 0x0F00) { in qla4xxx_set_port_speed()
1921 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_port_state() local
1925 if (test_bit(AF_LINK_UP, &ha->flags)) in qla4xxx_set_port_state()
1934 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_host_get_param() local
1939 len = sysfs_format_mac(buf, ha->my_mac, MAC_ADDR_LEN); in qla4xxx_host_get_param()
1942 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); in qla4xxx_host_get_param()
1945 len = sprintf(buf, "%s\n", ha->name_string); in qla4xxx_host_get_param()
1962 static void qla4xxx_create_ipv4_iface(struct scsi_qla_host *ha) in qla4xxx_create_ipv4_iface() argument
1964 if (ha->iface_ipv4) in qla4xxx_create_ipv4_iface()
1968 ha->iface_ipv4 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv4_iface()
1971 if (!ha->iface_ipv4) in qla4xxx_create_ipv4_iface()
1972 ql4_printk(KERN_ERR, ha, "Could not create IPv4 iSCSI " in qla4xxx_create_ipv4_iface()
1976 static void qla4xxx_create_ipv6_iface(struct scsi_qla_host *ha) in qla4xxx_create_ipv6_iface() argument
1978 if (!ha->iface_ipv6_0) in qla4xxx_create_ipv6_iface()
1980 ha->iface_ipv6_0 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv6_iface()
1984 if (!ha->iface_ipv6_0) in qla4xxx_create_ipv6_iface()
1985 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " in qla4xxx_create_ipv6_iface()
1988 if (!ha->iface_ipv6_1) in qla4xxx_create_ipv6_iface()
1990 ha->iface_ipv6_1 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv6_iface()
1994 if (!ha->iface_ipv6_1) in qla4xxx_create_ipv6_iface()
1995 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " in qla4xxx_create_ipv6_iface()
1999 static void qla4xxx_create_ifaces(struct scsi_qla_host *ha) in qla4xxx_create_ifaces() argument
2001 if (ha->ip_config.ipv4_options & IPOPT_IPV4_PROTOCOL_ENABLE) in qla4xxx_create_ifaces()
2002 qla4xxx_create_ipv4_iface(ha); in qla4xxx_create_ifaces()
2004 if (ha->ip_config.ipv6_options & IPV6_OPT_IPV6_PROTOCOL_ENABLE) in qla4xxx_create_ifaces()
2005 qla4xxx_create_ipv6_iface(ha); in qla4xxx_create_ifaces()
2008 static void qla4xxx_destroy_ipv4_iface(struct scsi_qla_host *ha) in qla4xxx_destroy_ipv4_iface() argument
2010 if (ha->iface_ipv4) { in qla4xxx_destroy_ipv4_iface()
2011 iscsi_destroy_iface(ha->iface_ipv4); in qla4xxx_destroy_ipv4_iface()
2012 ha->iface_ipv4 = NULL; in qla4xxx_destroy_ipv4_iface()
2016 static void qla4xxx_destroy_ipv6_iface(struct scsi_qla_host *ha) in qla4xxx_destroy_ipv6_iface() argument
2018 if (ha->iface_ipv6_0) { in qla4xxx_destroy_ipv6_iface()
2019 iscsi_destroy_iface(ha->iface_ipv6_0); in qla4xxx_destroy_ipv6_iface()
2020 ha->iface_ipv6_0 = NULL; in qla4xxx_destroy_ipv6_iface()
2022 if (ha->iface_ipv6_1) { in qla4xxx_destroy_ipv6_iface()
2023 iscsi_destroy_iface(ha->iface_ipv6_1); in qla4xxx_destroy_ipv6_iface()
2024 ha->iface_ipv6_1 = NULL; in qla4xxx_destroy_ipv6_iface()
2028 static void qla4xxx_destroy_ifaces(struct scsi_qla_host *ha) in qla4xxx_destroy_ifaces() argument
2030 qla4xxx_destroy_ipv4_iface(ha); in qla4xxx_destroy_ifaces()
2031 qla4xxx_destroy_ipv6_iface(ha); in qla4xxx_destroy_ifaces()
2034 static void qla4xxx_set_ipv6(struct scsi_qla_host *ha, in qla4xxx_set_ipv6() argument
2079 ql4_printk(KERN_ERR, ha, in qla4xxx_set_ipv6()
2096 ql4_printk(KERN_ERR, ha, in qla4xxx_set_ipv6()
2112 qla4xxx_create_ipv6_iface(ha); in qla4xxx_set_ipv6()
2117 qla4xxx_destroy_ipv6_iface(ha); in qla4xxx_set_ipv6()
2277 ql4_printk(KERN_ERR, ha, "Unknown IPv6 param = %d\n", in qla4xxx_set_ipv6()
2283 static void qla4xxx_set_ipv4(struct scsi_qla_host *ha, in qla4xxx_set_ipv4() argument
2308 ql4_printk(KERN_ERR, ha, "Invalid IPv4 bootproto\n"); in qla4xxx_set_ipv4()
2314 qla4xxx_create_ipv4_iface(ha); in qla4xxx_set_ipv4()
2319 qla4xxx_destroy_ipv4_iface(ha); in qla4xxx_set_ipv4()
2535 ql4_printk(KERN_ERR, ha, "Unknown IPv4 param = %d\n", in qla4xxx_set_ipv4()
2541 static void qla4xxx_set_iscsi_param(struct scsi_qla_host *ha, in qla4xxx_set_iscsi_param() argument
2697 ql4_printk(KERN_ERR, ha, "Unknown iscsi param = %d\n", in qla4xxx_set_iscsi_param()
2728 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_iface_set_param() local
2738 init_fw_cb = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_iface_set_param()
2742 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc init_cb\n", in qla4xxx_iface_set_param()
2750 if (qla4xxx_get_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma)) { in qla4xxx_iface_set_param()
2751 ql4_printk(KERN_ERR, ha, "%s: get ifcb failed\n", __func__); in qla4xxx_iface_set_param()
2764 qla4xxx_set_ipv4(ha, iface_param, in qla4xxx_iface_set_param()
2769 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2779 qla4xxx_set_ipv6(ha, iface_param, in qla4xxx_iface_set_param()
2784 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2791 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2796 qla4xxx_set_iscsi_param(ha, iface_param, in qla4xxx_iface_set_param()
2805 rval = qla4xxx_set_flash(ha, init_fw_cb_dma, FLASH_SEGMENT_IFCB, in qla4xxx_iface_set_param()
2809 ql4_printk(KERN_ERR, ha, "%s: set flash mbx failed\n", in qla4xxx_iface_set_param()
2815 rval = qla4xxx_disable_acb(ha); in qla4xxx_iface_set_param()
2817 ql4_printk(KERN_ERR, ha, "%s: disable acb mbx failed\n", in qla4xxx_iface_set_param()
2823 wait_for_completion_timeout(&ha->disable_acb_comp, in qla4xxx_iface_set_param()
2828 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma); in qla4xxx_iface_set_param()
2830 ql4_printk(KERN_ERR, ha, "%s: set acb mbx failed\n", in qla4xxx_iface_set_param()
2837 qla4xxx_update_local_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb, in qla4xxx_iface_set_param()
2841 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk), in qla4xxx_iface_set_param()
2852 struct scsi_qla_host *ha = ddb_entry->ha; in qla4xxx_session_get_param() local
2861 rval = qla4xxx_get_chap_index(ha, sess->username_in, in qla4xxx_session_get_param()
2878 rval = qla4xxx_get_chap_index(ha, sess->username, in qla4xxx_session_get_param()
2897 rval = qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, in qla4xxx_session_get_param()
2938 int qla4xxx_get_ddb_index(struct scsi_qla_host *ha, uint16_t *ddb_index) in qla4xxx_get_ddb_index() argument
2945 tmp_ddb_index = find_first_zero_bit(ha->ddb_idx_map, MAX_DDB_ENTRIES); in qla4xxx_get_ddb_index()
2948 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2954 if (test_and_set_bit(tmp_ddb_index, ha->ddb_idx_map)) in qla4xxx_get_ddb_index()
2957 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2959 ret = qla4xxx_req_ddb_entry(ha, tmp_ddb_index, &mbx_sts); in qla4xxx_get_ddb_index()
2962 ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2967 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2977 static int qla4xxx_match_ipaddress(struct scsi_qla_host *ha, in qla4xxx_match_ipaddress() argument
3011 static int qla4xxx_match_fwdb_session(struct scsi_qla_host *ha, in qla4xxx_match_fwdb_session() argument
3028 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_match_fwdb_session()
3032 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_match_fwdb_session()
3047 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3052 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3057 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3064 rval = qla4xxx_match_ipaddress(ha, ddb_entry, in qla4xxx_match_fwdb_session()
3077 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3088 struct scsi_qla_host *ha; in qla4xxx_session_create() local
3101 ha = to_qla_host(qla_ep->host); in qla4xxx_session_create()
3102 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_session_create()
3103 ha->host_no)); in qla4xxx_session_create()
3105 ret = qla4xxx_get_ddb_index(ha, &ddb_index); in qla4xxx_session_create()
3120 ddb_entry->ha = ha; in qla4xxx_session_create()
3126 ha->fw_ddb_index_map[ddb_entry->fw_ddb_index] = ddb_entry; in qla4xxx_session_create()
3127 ha->tot_ddbs++; in qla4xxx_session_create()
3136 struct scsi_qla_host *ha; in qla4xxx_session_destroy() local
3145 ha = ddb_entry->ha; in qla4xxx_session_destroy()
3146 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_session_destroy()
3147 ha->host_no)); in qla4xxx_session_destroy()
3149 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_session_destroy()
3152 ql4_printk(KERN_ERR, ha, in qla4xxx_session_destroy()
3159 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_session_destroy()
3174 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_session_destroy()
3176 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); in qla4xxx_session_destroy()
3177 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_session_destroy()
3178 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_session_destroy()
3179 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_session_destroy()
3184 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_session_destroy()
3194 struct scsi_qla_host *ha; in qla4xxx_conn_create() local
3208 ha = ddb_entry->ha; in qla4xxx_conn_create()
3209 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: conn_idx = %u\n", __func__, in qla4xxx_conn_create()
3222 struct scsi_qla_host *ha; in qla4xxx_conn_bind() local
3227 ha = ddb_entry->ha; in qla4xxx_conn_bind()
3229 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, in qla4xxx_conn_bind()
3248 struct scsi_qla_host *ha; in qla4xxx_conn_start() local
3257 ha = ddb_entry->ha; in qla4xxx_conn_start()
3258 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, in qla4xxx_conn_start()
3265 ret = qla4xxx_match_fwdb_session(ha, cls_conn); in qla4xxx_conn_start()
3267 ql4_printk(KERN_INFO, ha, in qla4xxx_conn_start()
3273 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_conn_start()
3276 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_start()
3282 ret = qla4xxx_set_param_ddbentry(ha, ddb_entry, cls_conn, &mbx_sts); in qla4xxx_conn_start()
3296 ql4_printk(KERN_ERR, ha, "%s: Failed set param for index[%d]\n", in qla4xxx_conn_start()
3301 status = qla4xxx_conn_open(ha, ddb_entry->fw_ddb_index); in qla4xxx_conn_start()
3303 ql4_printk(KERN_ERR, ha, "%s: Login failed: %s\n", __func__, in qla4xxx_conn_start()
3320 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_conn_start()
3329 struct scsi_qla_host *ha; in qla4xxx_conn_destroy() local
3335 ha = ddb_entry->ha; in qla4xxx_conn_destroy()
3336 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: cid = %d\n", __func__, in qla4xxx_conn_destroy()
3340 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) in qla4xxx_conn_destroy()
3341 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); in qla4xxx_conn_destroy()
3347 struct scsi_qla_host *ha; in qla4xxx_task_work() local
3358 ha = task_data->ha; in qla4xxx_task_work()
3381 ql4_printk(KERN_ERR, ha, "Passthru failed status = 0x%x\n", in qla4xxx_task_work()
3393 struct scsi_qla_host *ha; in qla4xxx_alloc_pdu() local
3398 ha = ddb_entry->ha; in qla4xxx_alloc_pdu()
3403 ql4_printk(KERN_INFO, ha, in qla4xxx_alloc_pdu()
3409 task_data->ha = ha; in qla4xxx_alloc_pdu()
3413 task_data->data_dma = dma_map_single(&ha->pdev->dev, task->data, in qla4xxx_alloc_pdu()
3418 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", in qla4xxx_alloc_pdu()
3422 task_data->resp_buffer = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_alloc_pdu()
3430 task_data->req_buffer = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_alloc_pdu()
3445 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, in qla4xxx_alloc_pdu()
3449 dma_free_coherent(&ha->pdev->dev, task_data->req_len, in qla4xxx_alloc_pdu()
3459 struct scsi_qla_host *ha; in qla4xxx_task_cleanup() local
3465 ha = ddb_entry->ha; in qla4xxx_task_cleanup()
3469 dma_unmap_single(&ha->pdev->dev, task_data->data_dma, in qla4xxx_task_cleanup()
3473 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", in qla4xxx_task_cleanup()
3476 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, in qla4xxx_task_cleanup()
3478 dma_free_coherent(&ha->pdev->dev, task_data->req_len, in qla4xxx_task_cleanup()
3488 struct scsi_qla_host *ha = ddb_entry->ha; in qla4xxx_task_xmit() local
3493 ql4_printk(KERN_INFO, ha, "%s: scsi cmd xmit not implemented\n", in qla4xxx_task_xmit()
3846 static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha, in qla4xxx_copy_fwddb_param() argument
3888 (char *)ha->name_string, buflen); in qla4xxx_copy_fwddb_param()
3891 if (!qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, in qla4xxx_copy_fwddb_param()
3904 void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha, in qla4xxx_update_session_conn_fwddb_param() argument
3913 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_fwddb_param()
3916 ql4_printk(KERN_ERR, ha, in qla4xxx_update_session_conn_fwddb_param()
3921 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, in qla4xxx_update_session_conn_fwddb_param()
3924 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " in qla4xxx_update_session_conn_fwddb_param()
3926 ha->host_no, __func__, in qla4xxx_update_session_conn_fwddb_param()
3936 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); in qla4xxx_update_session_conn_fwddb_param()
3940 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_fwddb_param()
3944 void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, in qla4xxx_update_session_conn_param() argument
3955 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_param()
3958 ql4_printk(KERN_ERR, ha, in qla4xxx_update_session_conn_param()
3963 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, in qla4xxx_update_session_conn_param()
3966 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " in qla4xxx_update_session_conn_param()
3968 ha->host_no, __func__, in qla4xxx_update_session_conn_param()
3991 memcpy(sess->initiatorname, ha->name_string, in qla4xxx_update_session_conn_param()
3992 min(sizeof(ha->name_string), sizeof(sess->initiatorname))); in qla4xxx_update_session_conn_param()
3996 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_param()
4005 static void qla4xxx_start_timer(struct scsi_qla_host *ha, in qla4xxx_start_timer() argument
4009 __func__, ha->host->host_no)); in qla4xxx_start_timer()
4010 timer_setup(&ha->timer, qla4xxx_timer, 0); in qla4xxx_start_timer()
4011 ha->timer.expires = jiffies + interval * HZ; in qla4xxx_start_timer()
4012 add_timer(&ha->timer); in qla4xxx_start_timer()
4013 ha->timer_active = 1; in qla4xxx_start_timer()
4016 static void qla4xxx_stop_timer(struct scsi_qla_host *ha) in qla4xxx_stop_timer() argument
4018 del_timer_sync(&ha->timer); in qla4xxx_stop_timer()
4019 ha->timer_active = 0; in qla4xxx_stop_timer()
4040 void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha) in qla4xxx_mark_all_devices_missing() argument
4042 iscsi_host_for_each_session(ha->host, qla4xxx_mark_device_missing); in qla4xxx_mark_all_devices_missing()
4045 static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha, in qla4xxx_get_new_srb() argument
4051 srb = mempool_alloc(ha->srb_mempool, GFP_ATOMIC); in qla4xxx_get_new_srb()
4056 srb->ha = ha; in qla4xxx_get_new_srb()
4065 static void qla4xxx_srb_free_dma(struct scsi_qla_host *ha, struct srb *srb) in qla4xxx_srb_free_dma() argument
4080 struct scsi_qla_host *ha = srb->ha; in qla4xxx_srb_compl() local
4082 qla4xxx_srb_free_dma(ha, srb); in qla4xxx_srb_compl()
4084 mempool_free(srb, ha->srb_mempool); in qla4xxx_srb_compl()
4104 struct scsi_qla_host *ha = to_qla_host(host); in qla4xxx_queuecommand() local
4110 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_queuecommand()
4111 if (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags)) in qla4xxx_queuecommand()
4129 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_queuecommand()
4130 test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || in qla4xxx_queuecommand()
4131 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_queuecommand()
4132 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || in qla4xxx_queuecommand()
4133 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || in qla4xxx_queuecommand()
4134 !test_bit(AF_ONLINE, &ha->flags) || in qla4xxx_queuecommand()
4135 !test_bit(AF_LINK_UP, &ha->flags) || in qla4xxx_queuecommand()
4136 test_bit(AF_LOOPBACK, &ha->flags) || in qla4xxx_queuecommand()
4137 test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags) || in qla4xxx_queuecommand()
4138 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags) || in qla4xxx_queuecommand()
4139 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) in qla4xxx_queuecommand()
4142 srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd); in qla4xxx_queuecommand()
4146 rval = qla4xxx_send_command_to_isp(ha, srb); in qla4xxx_queuecommand()
4153 qla4xxx_srb_free_dma(ha, srb); in qla4xxx_queuecommand()
4154 mempool_free(srb, ha->srb_mempool); in qla4xxx_queuecommand()
4171 static void qla4xxx_mem_free(struct scsi_qla_host *ha) in qla4xxx_mem_free() argument
4173 if (ha->queues) in qla4xxx_mem_free()
4174 dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues, in qla4xxx_mem_free()
4175 ha->queues_dma); in qla4xxx_mem_free()
4177 if (ha->fw_dump) in qla4xxx_mem_free()
4178 vfree(ha->fw_dump); in qla4xxx_mem_free()
4180 ha->queues_len = 0; in qla4xxx_mem_free()
4181 ha->queues = NULL; in qla4xxx_mem_free()
4182 ha->queues_dma = 0; in qla4xxx_mem_free()
4183 ha->request_ring = NULL; in qla4xxx_mem_free()
4184 ha->request_dma = 0; in qla4xxx_mem_free()
4185 ha->response_ring = NULL; in qla4xxx_mem_free()
4186 ha->response_dma = 0; in qla4xxx_mem_free()
4187 ha->shadow_regs = NULL; in qla4xxx_mem_free()
4188 ha->shadow_regs_dma = 0; in qla4xxx_mem_free()
4189 ha->fw_dump = NULL; in qla4xxx_mem_free()
4190 ha->fw_dump_size = 0; in qla4xxx_mem_free()
4193 mempool_destroy(ha->srb_mempool); in qla4xxx_mem_free()
4194 ha->srb_mempool = NULL; in qla4xxx_mem_free()
4196 dma_pool_destroy(ha->chap_dma_pool); in qla4xxx_mem_free()
4198 if (ha->chap_list) in qla4xxx_mem_free()
4199 vfree(ha->chap_list); in qla4xxx_mem_free()
4200 ha->chap_list = NULL; in qla4xxx_mem_free()
4202 dma_pool_destroy(ha->fw_ddb_dma_pool); in qla4xxx_mem_free()
4205 if (is_qla8022(ha)) { in qla4xxx_mem_free()
4206 if (ha->nx_pcibase) in qla4xxx_mem_free()
4208 (struct device_reg_82xx __iomem *)ha->nx_pcibase); in qla4xxx_mem_free()
4209 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_mem_free()
4210 if (ha->nx_pcibase) in qla4xxx_mem_free()
4212 (struct device_reg_83xx __iomem *)ha->nx_pcibase); in qla4xxx_mem_free()
4213 } else if (ha->reg) { in qla4xxx_mem_free()
4214 iounmap(ha->reg); in qla4xxx_mem_free()
4217 if (ha->reset_tmplt.buff) in qla4xxx_mem_free()
4218 vfree(ha->reset_tmplt.buff); in qla4xxx_mem_free()
4220 pci_release_regions(ha->pdev); in qla4xxx_mem_free()
4230 static int qla4xxx_mem_alloc(struct scsi_qla_host *ha) in qla4xxx_mem_alloc() argument
4235 ha->queues_len = ((REQUEST_QUEUE_DEPTH * QUEUE_SIZE) + in qla4xxx_mem_alloc()
4240 ha->queues = dma_alloc_coherent(&ha->pdev->dev, ha->queues_len, in qla4xxx_mem_alloc()
4241 &ha->queues_dma, GFP_KERNEL); in qla4xxx_mem_alloc()
4242 if (ha->queues == NULL) { in qla4xxx_mem_alloc()
4243 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4254 if ((unsigned long)ha->queues_dma & (MEM_ALIGN_VALUE - 1)) in qla4xxx_mem_alloc()
4255 align = MEM_ALIGN_VALUE - ((unsigned long)ha->queues_dma & in qla4xxx_mem_alloc()
4259 ha->request_dma = ha->queues_dma + align; in qla4xxx_mem_alloc()
4260 ha->request_ring = (struct queue_entry *) (ha->queues + align); in qla4xxx_mem_alloc()
4261 ha->response_dma = ha->queues_dma + align + in qla4xxx_mem_alloc()
4263 ha->response_ring = (struct queue_entry *) (ha->queues + align + in qla4xxx_mem_alloc()
4266 ha->shadow_regs_dma = ha->queues_dma + align + in qla4xxx_mem_alloc()
4269 ha->shadow_regs = (struct shadow_regs *) (ha->queues + align + in qla4xxx_mem_alloc()
4276 ha->srb_mempool = mempool_create(SRB_MIN_REQ, mempool_alloc_slab, in qla4xxx_mem_alloc()
4278 if (ha->srb_mempool == NULL) { in qla4xxx_mem_alloc()
4279 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4285 ha->chap_dma_pool = dma_pool_create("ql4_chap", &ha->pdev->dev, in qla4xxx_mem_alloc()
4288 if (ha->chap_dma_pool == NULL) { in qla4xxx_mem_alloc()
4289 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4294 ha->fw_ddb_dma_pool = dma_pool_create("ql4_fw_ddb", &ha->pdev->dev, in qla4xxx_mem_alloc()
4297 if (ha->fw_ddb_dma_pool == NULL) { in qla4xxx_mem_alloc()
4298 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4316 static int qla4_8xxx_check_temp(struct scsi_qla_host *ha) in qla4_8xxx_check_temp() argument
4321 temp = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_TEMP_STATE); in qla4_8xxx_check_temp()
4327 ql4_printk(KERN_WARNING, ha, "Device temperature %d degrees C" in qla4_8xxx_check_temp()
4332 if (ha->temperature == QLA82XX_TEMP_NORMAL) in qla4_8xxx_check_temp()
4333 ql4_printk(KERN_WARNING, ha, "Device temperature %d" in qla4_8xxx_check_temp()
4337 if (ha->temperature == QLA82XX_TEMP_WARN) in qla4_8xxx_check_temp()
4338 ql4_printk(KERN_INFO, ha, "Device temperature is" in qla4_8xxx_check_temp()
4342 ha->temperature = temp_state; in qla4_8xxx_check_temp()
4352 static int qla4_8xxx_check_fw_alive(struct scsi_qla_host *ha) in qla4_8xxx_check_fw_alive() argument
4357 fw_heartbeat_counter = qla4_8xxx_rd_direct(ha, in qla4_8xxx_check_fw_alive()
4363 ha->host_no, __func__)); in qla4_8xxx_check_fw_alive()
4367 if (ha->fw_heartbeat_counter == fw_heartbeat_counter) { in qla4_8xxx_check_fw_alive()
4368 ha->seconds_since_last_heartbeat++; in qla4_8xxx_check_fw_alive()
4370 if (ha->seconds_since_last_heartbeat == 2) { in qla4_8xxx_check_fw_alive()
4371 ha->seconds_since_last_heartbeat = 0; in qla4_8xxx_check_fw_alive()
4372 qla4_8xxx_dump_peg_reg(ha); in qla4_8xxx_check_fw_alive()
4376 ha->seconds_since_last_heartbeat = 0; in qla4_8xxx_check_fw_alive()
4378 ha->fw_heartbeat_counter = fw_heartbeat_counter; in qla4_8xxx_check_fw_alive()
4382 static void qla4_8xxx_process_fw_error(struct scsi_qla_host *ha) in qla4_8xxx_process_fw_error() argument
4387 halt_status = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_HALT_STATUS1); in qla4_8xxx_process_fw_error()
4389 if (is_qla8022(ha)) { in qla4_8xxx_process_fw_error()
4390 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4_8xxx_process_fw_error()
4392 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, in qla4_8xxx_process_fw_error()
4397 …ql4_printk(KERN_ERR, ha, "%s: Firmware aborted with error code 0x00006700. Device is being reset\n… in qla4_8xxx_process_fw_error()
4401 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_process_fw_error()
4403 ql4_printk(KERN_ERR, ha, "%s: Firmware error detected device is being reset\n", in qla4_8xxx_process_fw_error()
4414 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); in qla4_8xxx_process_fw_error()
4416 ql4_printk(KERN_INFO, ha, "%s: detect abort needed!\n", in qla4_8xxx_process_fw_error()
4418 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4_8xxx_process_fw_error()
4420 qla4xxx_mailbox_premature_completion(ha); in qla4_8xxx_process_fw_error()
4421 qla4xxx_wake_dpc(ha); in qla4_8xxx_process_fw_error()
4430 void qla4_8xxx_watchdog(struct scsi_qla_host *ha) in qla4_8xxx_watchdog() argument
4435 if (is_qla8032(ha) && in qla4_8xxx_watchdog()
4436 (qla4_83xx_is_detached(ha) == QLA_SUCCESS)) in qla4_8xxx_watchdog()
4438 __func__, ha->func_num); in qla4_8xxx_watchdog()
4441 if (!(test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || in qla4_8xxx_watchdog()
4442 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4_8xxx_watchdog()
4443 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags))) { in qla4_8xxx_watchdog()
4444 dev_state = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE); in qla4_8xxx_watchdog()
4446 if (qla4_8xxx_check_temp(ha)) { in qla4_8xxx_watchdog()
4447 if (is_qla8022(ha)) { in qla4_8xxx_watchdog()
4448 ql4_printk(KERN_INFO, ha, "disabling pause transmit on port 0 & 1.\n"); in qla4_8xxx_watchdog()
4449 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, in qla4_8xxx_watchdog()
4453 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); in qla4_8xxx_watchdog()
4454 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4456 !test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4_8xxx_watchdog()
4458 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED RESET!\n", in qla4_8xxx_watchdog()
4461 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_watchdog()
4462 idc_ctrl = qla4_83xx_rd_reg(ha, in qla4_8xxx_watchdog()
4465 ql4_printk(KERN_INFO, ha, "%s: Graceful reset bit is not set\n", in qla4_8xxx_watchdog()
4468 ha); in qla4_8xxx_watchdog()
4472 if ((is_qla8032(ha) || is_qla8042(ha)) || in qla4_8xxx_watchdog()
4473 (is_qla8022(ha) && !ql4xdontresethba)) { in qla4_8xxx_watchdog()
4474 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4_8xxx_watchdog()
4475 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4478 !test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { in qla4_8xxx_watchdog()
4479 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED QUIES!\n", in qla4_8xxx_watchdog()
4481 set_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags); in qla4_8xxx_watchdog()
4482 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4485 if (qla4_8xxx_check_fw_alive(ha)) in qla4_8xxx_watchdog()
4486 qla4_8xxx_process_fw_error(ha); in qla4_8xxx_watchdog()
4495 struct scsi_qla_host *ha; in qla4xxx_check_relogin_flash_ddb() local
4499 ha = ddb_entry->ha; in qla4xxx_check_relogin_flash_ddb()
4504 if (adapter_up(ha) && !test_bit(DF_RELOGIN, &ddb_entry->flags) && in qla4xxx_check_relogin_flash_ddb()
4512 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_check_relogin_flash_ddb()
4514 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_check_relogin_flash_ddb()
4532 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_check_relogin_flash_ddb()
4538 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_check_relogin_flash_ddb()
4551 struct scsi_qla_host *ha = from_timer(ha, t, timer); in qla4xxx_timer() local
4555 iscsi_host_for_each_session(ha->host, qla4xxx_check_relogin_flash_ddb); in qla4xxx_timer()
4560 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_timer()
4561 mod_timer(&ha->timer, jiffies + HZ); in qla4xxx_timer()
4566 if (!pci_channel_offline(ha->pdev)) in qla4xxx_timer()
4567 pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w); in qla4xxx_timer()
4569 if (is_qla80XX(ha)) in qla4xxx_timer()
4570 qla4_8xxx_watchdog(ha); in qla4xxx_timer()
4572 if (is_qla40XX(ha)) { in qla4xxx_timer()
4574 if (ha->firmware_options & FWOPT_HEARTBEAT_ENABLE && in qla4xxx_timer()
4575 ha->heartbeat_interval != 0) { in qla4xxx_timer()
4576 ha->seconds_since_last_heartbeat++; in qla4xxx_timer()
4577 if (ha->seconds_since_last_heartbeat > in qla4xxx_timer()
4578 ha->heartbeat_interval + 2) in qla4xxx_timer()
4579 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_timer()
4584 if (!list_empty(&ha->work_list)) in qla4xxx_timer()
4589 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_timer()
4590 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags) || in qla4xxx_timer()
4591 test_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags) || in qla4xxx_timer()
4592 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || in qla4xxx_timer()
4593 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_timer()
4594 test_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags) || in qla4xxx_timer()
4595 test_bit(DPC_LINK_CHANGED, &ha->dpc_flags) || in qla4xxx_timer()
4596 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || in qla4xxx_timer()
4597 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || in qla4xxx_timer()
4598 test_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags) || in qla4xxx_timer()
4599 test_bit(DPC_AEN, &ha->dpc_flags)) { in qla4xxx_timer()
4602 ha->host_no, __func__, ha->dpc_flags)); in qla4xxx_timer()
4603 qla4xxx_wake_dpc(ha); in qla4xxx_timer()
4607 mod_timer(&ha->timer, jiffies + HZ); in qla4xxx_timer()
4609 DEBUG2(ha->seconds_since_last_intr++); in qla4xxx_timer()
4619 static int qla4xxx_cmd_wait(struct scsi_qla_host *ha) in qla4xxx_cmd_wait() argument
4627 if (is_qla40XX(ha)) in qla4xxx_cmd_wait()
4630 wtmo = ha->nx_reset_timeout / 2; in qla4xxx_cmd_wait()
4634 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_cmd_wait()
4639 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_cmd_wait()
4641 for (index = 0; index < ha->host->can_queue; index++) { in qla4xxx_cmd_wait()
4642 cmd = scsi_host_find_tag(ha->host, index); in qla4xxx_cmd_wait()
4652 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_cmd_wait()
4655 if (index == ha->host->can_queue) in qla4xxx_cmd_wait()
4665 int qla4xxx_hw_reset(struct scsi_qla_host *ha) in qla4xxx_hw_reset() argument
4670 DEBUG2(printk(KERN_ERR "scsi%ld: %s\n", ha->host_no, __func__)); in qla4xxx_hw_reset()
4672 if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS) in qla4xxx_hw_reset()
4675 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_hw_reset()
4681 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_hw_reset()
4683 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_hw_reset()
4686 writel(set_rmask(CSR_SOFT_RESET), &ha->reg->ctrl_status); in qla4xxx_hw_reset()
4687 readl(&ha->reg->ctrl_status); in qla4xxx_hw_reset()
4689 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_hw_reset()
4697 int qla4xxx_soft_reset(struct scsi_qla_host *ha) in qla4xxx_soft_reset() argument
4704 status = qla4xxx_hw_reset(ha); in qla4xxx_soft_reset()
4712 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4713 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4714 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4726 ha->host_no)); in qla4xxx_soft_reset()
4727 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4728 writel(set_rmask(CSR_NET_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4729 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4730 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4736 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4737 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4738 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4752 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4753 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4755 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4756 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4758 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4768 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4769 writel(set_rmask(CSR_FORCE_SOFT_RESET), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4770 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4771 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4775 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4776 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4777 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4801 static void qla4xxx_abort_active_cmds(struct scsi_qla_host *ha, int res) in qla4xxx_abort_active_cmds() argument
4807 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_abort_active_cmds()
4808 for (i = 0; i < ha->host->can_queue; i++) { in qla4xxx_abort_active_cmds()
4809 srb = qla4xxx_del_from_active_array(ha, i); in qla4xxx_abort_active_cmds()
4815 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_abort_active_cmds()
4818 void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha) in qla4xxx_dead_adapter_cleanup() argument
4820 clear_bit(AF_ONLINE, &ha->flags); in qla4xxx_dead_adapter_cleanup()
4823 ql4_printk(KERN_INFO, ha, "Disabling the board\n"); in qla4xxx_dead_adapter_cleanup()
4825 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_dead_adapter_cleanup()
4826 qla4xxx_mark_all_devices_missing(ha); in qla4xxx_dead_adapter_cleanup()
4827 clear_bit(AF_INIT_DONE, &ha->flags); in qla4xxx_dead_adapter_cleanup()
4850 static int qla4xxx_recover_adapter(struct scsi_qla_host *ha) in qla4xxx_recover_adapter() argument
4858 scsi_block_requests(ha->host); in qla4xxx_recover_adapter()
4859 clear_bit(AF_ONLINE, &ha->flags); in qla4xxx_recover_adapter()
4860 clear_bit(AF_LINK_UP, &ha->flags); in qla4xxx_recover_adapter()
4862 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: adapter OFFLINE\n", __func__)); in qla4xxx_recover_adapter()
4864 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4xxx_recover_adapter()
4866 if ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_recover_adapter()
4867 !test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4868 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4xxx_recover_adapter()
4871 qla4_83xx_disable_pause(ha); in qla4xxx_recover_adapter()
4874 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); in qla4xxx_recover_adapter()
4876 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_recover_adapter()
4881 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4888 if (is_qla80XX(ha) && !reset_chip && in qla4xxx_recover_adapter()
4889 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4891 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_recover_adapter()
4893 ha->host_no, __func__)); in qla4xxx_recover_adapter()
4894 status = ha->isp_ops->reset_firmware(ha); in qla4xxx_recover_adapter()
4896 ha->isp_ops->disable_intrs(ha); in qla4xxx_recover_adapter()
4897 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4898 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_recover_adapter()
4903 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_recover_adapter()
4904 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4911 if (is_qla40XX(ha) || reset_chip) { in qla4xxx_recover_adapter()
4912 if (is_qla40XX(ha)) in qla4xxx_recover_adapter()
4918 if (test_bit(AF_FW_RECOVERY, &ha->flags)) in qla4xxx_recover_adapter()
4923 if (qla4_8xxx_check_fw_alive(ha)) { in qla4xxx_recover_adapter()
4924 qla4xxx_mailbox_premature_completion(ha); in qla4xxx_recover_adapter()
4932 if (!test_bit(AF_FW_RECOVERY, &ha->flags)) in qla4xxx_recover_adapter()
4933 qla4xxx_cmd_wait(ha); in qla4xxx_recover_adapter()
4935 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4936 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_recover_adapter()
4938 ha->host_no, __func__)); in qla4xxx_recover_adapter()
4939 status = ha->isp_ops->reset_chip(ha); in qla4xxx_recover_adapter()
4940 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_recover_adapter()
4944 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4952 if (is_qla40XX(ha) && (ha->mac_index == 3)) in qla4xxx_recover_adapter()
4957 status = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4xxx_recover_adapter()
4958 if (is_qla80XX(ha) && (status == QLA_ERROR)) { in qla4xxx_recover_adapter()
4959 status = qla4_8xxx_check_init_adapter_retry(ha); in qla4xxx_recover_adapter()
4961 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Don't retry recover adapter\n", in qla4xxx_recover_adapter()
4962 ha->host_no, __func__); in qla4xxx_recover_adapter()
4963 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4964 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4965 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4967 &ha->dpc_flags); in qla4xxx_recover_adapter()
4976 if (!test_bit(AF_ONLINE, &ha->flags) && in qla4xxx_recover_adapter()
4977 !test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4983 if (is_qla80XX(ha)) { in qla4xxx_recover_adapter()
4984 ha->isp_ops->idc_lock(ha); in qla4xxx_recover_adapter()
4985 dev_state = qla4_8xxx_rd_direct(ha, in qla4xxx_recover_adapter()
4987 ha->isp_ops->idc_unlock(ha); in qla4xxx_recover_adapter()
4989 ql4_printk(KERN_INFO, ha, "%s: don't retry " in qla4xxx_recover_adapter()
4992 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4993 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4994 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4996 &ha->dpc_flags); in qla4xxx_recover_adapter()
5003 if (!test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
5004 ha->retry_reset_ha_cnt = MAX_RESET_HA_RETRIES; in qla4xxx_recover_adapter()
5006 "(%d) more times\n", ha->host_no, in qla4xxx_recover_adapter()
5007 ha->retry_reset_ha_cnt)); in qla4xxx_recover_adapter()
5008 set_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5011 if (ha->retry_reset_ha_cnt > 0) { in qla4xxx_recover_adapter()
5013 ha->retry_reset_ha_cnt--; in qla4xxx_recover_adapter()
5016 ha->host_no, in qla4xxx_recover_adapter()
5017 ha->retry_reset_ha_cnt)); in qla4xxx_recover_adapter()
5021 if (ha->retry_reset_ha_cnt == 0) { in qla4xxx_recover_adapter()
5026 ha->host_no)); in qla4xxx_recover_adapter()
5027 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
5028 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5029 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5031 &ha->dpc_flags); in qla4xxx_recover_adapter()
5036 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5037 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_recover_adapter()
5038 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5042 ha->adapter_error_count++; in qla4xxx_recover_adapter()
5044 if (test_bit(AF_ONLINE, &ha->flags)) in qla4xxx_recover_adapter()
5045 ha->isp_ops->enable_intrs(ha); in qla4xxx_recover_adapter()
5047 scsi_unblock_requests(ha->host); in qla4xxx_recover_adapter()
5049 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4xxx_recover_adapter()
5050 DEBUG2(printk("scsi%ld: recover adapter: %s\n", ha->host_no, in qla4xxx_recover_adapter()
5060 struct scsi_qla_host *ha; in qla4xxx_relogin_devices() local
5064 ha = ddb_entry->ha; in qla4xxx_relogin_devices()
5067 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_relogin_devices()
5068 " unblock session\n", ha->host_no, __func__, in qla4xxx_relogin_devices()
5089 struct scsi_qla_host *ha; in qla4xxx_unblock_flash_ddb() local
5093 ha = ddb_entry->ha; in qla4xxx_unblock_flash_ddb()
5094 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_flash_ddb()
5095 " unblock session\n", ha->host_no, __func__, in qla4xxx_unblock_flash_ddb()
5101 if (test_bit(AF_ONLINE, &ha->flags)) { in qla4xxx_unblock_flash_ddb()
5102 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_flash_ddb()
5103 " start scan\n", ha->host_no, __func__, in qla4xxx_unblock_flash_ddb()
5105 scsi_queue_work(ha->host, &ddb_entry->sess->scan_work); in qla4xxx_unblock_flash_ddb()
5114 struct scsi_qla_host *ha; in qla4xxx_unblock_ddb() local
5119 ha = ddb_entry->ha; in qla4xxx_unblock_ddb()
5120 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_ddb()
5121 " unblock user space session\n", ha->host_no, __func__, in qla4xxx_unblock_ddb()
5129 ql4_printk(KERN_INFO, ha, in qla4xxx_unblock_ddb()
5131 ha->host_no, __func__, ddb_entry->fw_ddb_index, in qla4xxx_unblock_ddb()
5139 static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha) in qla4xxx_relogin_all_devices() argument
5141 iscsi_host_for_each_session(ha->host, qla4xxx_relogin_devices); in qla4xxx_relogin_all_devices()
5149 struct scsi_qla_host *ha; in qla4xxx_relogin_flash_ddb() local
5153 ha = ddb_entry->ha; in qla4xxx_relogin_flash_ddb()
5159 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_relogin_flash_ddb()
5160 "scsi%ld: Relogin index [%d]. TOV=%d\n", ha->host_no, in qla4xxx_relogin_flash_ddb()
5170 struct scsi_qla_host *ha; in qla4xxx_dpc_relogin() local
5174 ha = ddb_entry->ha; in qla4xxx_dpc_relogin()
5184 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_dpc_relogin()
5190 void qla4xxx_wake_dpc(struct scsi_qla_host *ha) in qla4xxx_wake_dpc() argument
5192 if (ha->dpc_thread) in qla4xxx_wake_dpc()
5193 queue_work(ha->dpc_thread, &ha->dpc_work); in qla4xxx_wake_dpc()
5197 qla4xxx_alloc_work(struct scsi_qla_host *ha, uint32_t data_size, in qla4xxx_alloc_work() argument
5212 static void qla4xxx_post_work(struct scsi_qla_host *ha, in qla4xxx_post_work() argument
5217 spin_lock_irqsave(&ha->work_lock, flags); in qla4xxx_post_work()
5218 list_add_tail(&e->list, &ha->work_list); in qla4xxx_post_work()
5219 spin_unlock_irqrestore(&ha->work_lock, flags); in qla4xxx_post_work()
5220 qla4xxx_wake_dpc(ha); in qla4xxx_post_work()
5223 int qla4xxx_post_aen_work(struct scsi_qla_host *ha, in qla4xxx_post_aen_work() argument
5229 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_AEN); in qla4xxx_post_aen_work()
5237 qla4xxx_post_work(ha, e); in qla4xxx_post_aen_work()
5242 int qla4xxx_post_ping_evt_work(struct scsi_qla_host *ha, in qla4xxx_post_ping_evt_work() argument
5248 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_PING_STATUS); in qla4xxx_post_ping_evt_work()
5257 qla4xxx_post_work(ha, e); in qla4xxx_post_ping_evt_work()
5262 static void qla4xxx_do_work(struct scsi_qla_host *ha) in qla4xxx_do_work() argument
5268 spin_lock_irqsave(&ha->work_lock, flags); in qla4xxx_do_work()
5269 list_splice_init(&ha->work_list, &work); in qla4xxx_do_work()
5270 spin_unlock_irqrestore(&ha->work_lock, flags); in qla4xxx_do_work()
5277 iscsi_post_host_event(ha->host_no, in qla4xxx_do_work()
5284 iscsi_ping_comp_event(ha->host_no, in qla4xxx_do_work()
5292 ql4_printk(KERN_WARNING, ha, "event type: 0x%x not " in qla4xxx_do_work()
5312 struct scsi_qla_host *ha = in qla4xxx_do_dpc() local
5316 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_do_dpc()
5318 ha->host_no, __func__, ha->flags, ha->dpc_flags)); in qla4xxx_do_dpc()
5321 if (!test_bit(AF_INIT_DONE, &ha->flags)) in qla4xxx_do_dpc()
5324 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_do_dpc()
5326 ha->host_no, __func__, ha->flags)); in qla4xxx_do_dpc()
5331 qla4xxx_do_work(ha); in qla4xxx_do_dpc()
5333 if (is_qla80XX(ha)) { in qla4xxx_do_dpc()
5334 if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5335 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_do_dpc()
5336 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4xxx_do_dpc()
5339 qla4_83xx_disable_pause(ha); in qla4xxx_do_dpc()
5342 ha->isp_ops->idc_lock(ha); in qla4xxx_do_dpc()
5343 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4xxx_do_dpc()
5345 ha->isp_ops->idc_unlock(ha); in qla4xxx_do_dpc()
5346 ql4_printk(KERN_INFO, ha, "HW State: FAILED\n"); in qla4xxx_do_dpc()
5347 qla4_8xxx_device_state_handler(ha); in qla4xxx_do_dpc()
5350 if (test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5351 if (is_qla8042(ha)) { in qla4xxx_do_dpc()
5352 if (ha->idc_info.info2 & in qla4xxx_do_dpc()
5354 ql4_printk(KERN_INFO, ha, "%s: Disabling ACB\n", in qla4xxx_do_dpc()
5356 status = qla4_84xx_config_acb(ha, in qla4xxx_do_dpc()
5359 ql4_printk(KERN_INFO, ha, "%s: ACB config failed\n", in qla4xxx_do_dpc()
5364 qla4_83xx_post_idc_ack(ha); in qla4xxx_do_dpc()
5365 clear_bit(DPC_POST_IDC_ACK, &ha->dpc_flags); in qla4xxx_do_dpc()
5368 if (is_qla8042(ha) && in qla4xxx_do_dpc()
5369 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5370 ql4_printk(KERN_INFO, ha, "%s: Restoring ACB\n", in qla4xxx_do_dpc()
5372 if (qla4_84xx_config_acb(ha, ACB_CONFIG_SET) != in qla4xxx_do_dpc()
5374 ql4_printk(KERN_INFO, ha, "%s: ACB config failed ", in qla4xxx_do_dpc()
5377 clear_bit(DPC_RESTORE_ACB, &ha->dpc_flags); in qla4xxx_do_dpc()
5380 if (test_and_clear_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5381 qla4_8xxx_need_qsnt_handler(ha); in qla4xxx_do_dpc()
5385 if (!test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) && in qla4xxx_do_dpc()
5386 (test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_do_dpc()
5387 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_do_dpc()
5388 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))) { in qla4xxx_do_dpc()
5389 if ((is_qla8022(ha) && ql4xdontresethba) || in qla4xxx_do_dpc()
5390 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_do_dpc()
5391 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_do_dpc()
5393 ha->host_no, __func__)); in qla4xxx_do_dpc()
5394 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_do_dpc()
5395 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); in qla4xxx_do_dpc()
5396 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_do_dpc()
5399 if (test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || in qla4xxx_do_dpc()
5400 test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_do_dpc()
5401 qla4xxx_recover_adapter(ha); in qla4xxx_do_dpc()
5403 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5406 while ((readw(&ha->reg->ctrl_status) & in qla4xxx_do_dpc()
5415 ha->host_no, __func__)); in qla4xxx_do_dpc()
5416 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_do_dpc()
5417 if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) { in qla4xxx_do_dpc()
5418 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_do_dpc()
5419 status = qla4xxx_recover_adapter(ha); in qla4xxx_do_dpc()
5421 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); in qla4xxx_do_dpc()
5423 ha->isp_ops->enable_intrs(ha); in qla4xxx_do_dpc()
5429 if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags)) in qla4xxx_do_dpc()
5430 qla4xxx_process_aen(ha, PROCESS_ALL_AENS); in qla4xxx_do_dpc()
5433 if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags)) in qla4xxx_do_dpc()
5434 qla4xxx_get_dhcp_ip_address(ha); in qla4xxx_do_dpc()
5437 if (adapter_up(ha) && in qla4xxx_do_dpc()
5438 test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5439 iscsi_host_for_each_session(ha->host, qla4xxx_dpc_relogin); in qla4xxx_do_dpc()
5443 if (!test_bit(AF_LOOPBACK, &ha->flags) && in qla4xxx_do_dpc()
5444 test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5445 if (!test_bit(AF_LINK_UP, &ha->flags)) { in qla4xxx_do_dpc()
5447 qla4xxx_mark_all_devices_missing(ha); in qla4xxx_do_dpc()
5455 if (test_and_clear_bit(AF_BUILD_DDB_LIST, &ha->flags)) { in qla4xxx_do_dpc()
5456 qla4xxx_build_ddb_list(ha, ha->is_reset); in qla4xxx_do_dpc()
5457 iscsi_host_for_each_session(ha->host, in qla4xxx_do_dpc()
5460 qla4xxx_relogin_all_devices(ha); in qla4xxx_do_dpc()
5463 if (test_and_clear_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5464 if (qla4xxx_sysfs_ddb_export(ha)) in qla4xxx_do_dpc()
5465 ql4_printk(KERN_ERR, ha, "%s: Error exporting ddb to sysfs\n", in qla4xxx_do_dpc()
5474 static void qla4xxx_free_adapter(struct scsi_qla_host *ha) in qla4xxx_free_adapter() argument
5476 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_free_adapter()
5479 ha->isp_ops->disable_intrs(ha); in qla4xxx_free_adapter()
5481 if (is_qla40XX(ha)) { in qla4xxx_free_adapter()
5483 &ha->reg->ctrl_status); in qla4xxx_free_adapter()
5484 readl(&ha->reg->ctrl_status); in qla4xxx_free_adapter()
5485 } else if (is_qla8022(ha)) { in qla4xxx_free_adapter()
5486 writel(0, &ha->qla4_82xx_reg->host_int); in qla4xxx_free_adapter()
5487 readl(&ha->qla4_82xx_reg->host_int); in qla4xxx_free_adapter()
5488 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_free_adapter()
5489 writel(0, &ha->qla4_83xx_reg->risc_intr); in qla4xxx_free_adapter()
5490 readl(&ha->qla4_83xx_reg->risc_intr); in qla4xxx_free_adapter()
5494 if (ha->timer_active) in qla4xxx_free_adapter()
5495 qla4xxx_stop_timer(ha); in qla4xxx_free_adapter()
5498 if (ha->dpc_thread) in qla4xxx_free_adapter()
5499 destroy_workqueue(ha->dpc_thread); in qla4xxx_free_adapter()
5502 if (ha->task_wq) in qla4xxx_free_adapter()
5503 destroy_workqueue(ha->task_wq); in qla4xxx_free_adapter()
5506 ha->isp_ops->reset_firmware(ha); in qla4xxx_free_adapter()
5508 if (is_qla80XX(ha)) { in qla4xxx_free_adapter()
5509 ha->isp_ops->idc_lock(ha); in qla4xxx_free_adapter()
5510 qla4_8xxx_clear_drv_active(ha); in qla4xxx_free_adapter()
5511 ha->isp_ops->idc_unlock(ha); in qla4xxx_free_adapter()
5515 qla4xxx_free_irqs(ha); in qla4xxx_free_adapter()
5518 qla4xxx_mem_free(ha); in qla4xxx_free_adapter()
5521 int qla4_8xxx_iospace_config(struct scsi_qla_host *ha) in qla4_8xxx_iospace_config() argument
5525 struct pci_dev *pdev = ha->pdev; in qla4_8xxx_iospace_config()
5531 "status=%d\n", ha->host_no, pci_name(pdev), status); in qla4_8xxx_iospace_config()
5537 ha->revision_id = pdev->revision; in qla4_8xxx_iospace_config()
5546 ha->nx_pcibase = (unsigned long)ioremap(mem_base, mem_len); in qla4_8xxx_iospace_config()
5547 if (!ha->nx_pcibase) { in qla4_8xxx_iospace_config()
5550 pci_release_regions(ha->pdev); in qla4_8xxx_iospace_config()
5557 if (is_qla8022(ha)) { in qla4_8xxx_iospace_config()
5558 ha->qla4_82xx_reg = (struct device_reg_82xx __iomem *) in qla4_8xxx_iospace_config()
5559 ((uint8_t *)ha->nx_pcibase + 0xbc000 + in qla4_8xxx_iospace_config()
5560 (ha->pdev->devfn << 11)); in qla4_8xxx_iospace_config()
5561 ha->nx_db_wr_ptr = (ha->pdev->devfn == 4 ? QLA82XX_CAM_RAM_DB1 : in qla4_8xxx_iospace_config()
5563 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_iospace_config()
5564 ha->qla4_83xx_reg = (struct device_reg_83xx __iomem *) in qla4_8xxx_iospace_config()
5565 ((uint8_t *)ha->nx_pcibase); in qla4_8xxx_iospace_config()
5580 int qla4xxx_iospace_config(struct scsi_qla_host *ha) in qla4xxx_iospace_config() argument
5585 pio = pci_resource_start(ha->pdev, 0); in qla4xxx_iospace_config()
5586 pio_len = pci_resource_len(ha->pdev, 0); in qla4xxx_iospace_config()
5587 pio_flags = pci_resource_flags(ha->pdev, 0); in qla4xxx_iospace_config()
5590 ql4_printk(KERN_WARNING, ha, in qla4xxx_iospace_config()
5595 ql4_printk(KERN_WARNING, ha, "region #0 not a PIO resource\n"); in qla4xxx_iospace_config()
5600 mmio = pci_resource_start(ha->pdev, 1); in qla4xxx_iospace_config()
5601 mmio_len = pci_resource_len(ha->pdev, 1); in qla4xxx_iospace_config()
5602 mmio_flags = pci_resource_flags(ha->pdev, 1); in qla4xxx_iospace_config()
5605 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5612 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5617 if (pci_request_regions(ha->pdev, DRIVER_NAME)) { in qla4xxx_iospace_config()
5618 ql4_printk(KERN_WARNING, ha, in qla4xxx_iospace_config()
5624 ha->pio_address = pio; in qla4xxx_iospace_config()
5625 ha->pio_length = pio_len; in qla4xxx_iospace_config()
5626 ha->reg = ioremap(mmio, MIN_IOBASE_LEN); in qla4xxx_iospace_config()
5627 if (!ha->reg) { in qla4xxx_iospace_config()
5628 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5715 uint16_t qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha) in qla4xxx_rd_shdw_req_q_out() argument
5717 return (uint16_t)le32_to_cpu(ha->shadow_regs->req_q_out); in qla4xxx_rd_shdw_req_q_out()
5720 uint16_t qla4_82xx_rd_shdw_req_q_out(struct scsi_qla_host *ha) in qla4_82xx_rd_shdw_req_q_out() argument
5722 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->req_q_out)); in qla4_82xx_rd_shdw_req_q_out()
5725 uint16_t qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) in qla4xxx_rd_shdw_rsp_q_in() argument
5727 return (uint16_t)le32_to_cpu(ha->shadow_regs->rsp_q_in); in qla4xxx_rd_shdw_rsp_q_in()
5730 uint16_t qla4_82xx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) in qla4_82xx_rd_shdw_rsp_q_in() argument
5732 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->rsp_q_in)); in qla4_82xx_rd_shdw_rsp_q_in()
5737 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_eth_info() local
5749 rc = sysfs_format_mac(str, ha->my_mac, in qla4xxx_show_boot_eth_info()
5778 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_ini_info() local
5784 rc = sprintf(str, "%s\n", ha->name_string); in qla4xxx_show_boot_ini_info()
5866 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_tgt_pri_info() local
5867 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_pri_sess); in qla4xxx_show_boot_tgt_pri_info()
5874 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_tgt_sec_info() local
5875 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_sec_sess); in qla4xxx_show_boot_tgt_sec_info()
5905 struct scsi_qla_host *ha = data; in qla4xxx_boot_release() local
5907 scsi_host_put(ha->host); in qla4xxx_boot_release()
5910 static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[]) in get_fw_boot_info() argument
5921 func_num = PCI_FUNC(ha->pdev->devfn); in get_fw_boot_info()
5923 ql4_printk(KERN_INFO, ha, "%s: Get FW boot info for 0x%x func %d\n", in get_fw_boot_info()
5924 __func__, ha->pdev->device, func_num); in get_fw_boot_info()
5926 if (is_qla40XX(ha)) { in get_fw_boot_info()
5941 val = rd_nvram_byte(ha, addr); in get_fw_boot_info()
5943 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Adapter boot " in get_fw_boot_info()
5950 val = rd_nvram_byte(ha, pri_addr); in get_fw_boot_info()
5955 val = rd_nvram_byte(ha, sec_addr); in get_fw_boot_info()
5959 } else if (is_qla80XX(ha)) { in get_fw_boot_info()
5960 buf = dma_alloc_coherent(&ha->pdev->dev, size, in get_fw_boot_info()
5963 DEBUG2(ql4_printk(KERN_ERR, ha, in get_fw_boot_info()
5970 if (ha->port_num == 0) in get_fw_boot_info()
5972 else if (ha->port_num == 1) in get_fw_boot_info()
5978 addr = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_iscsi_param * 4) + in get_fw_boot_info()
5980 if (qla4xxx_get_flash(ha, buf_dma, addr, in get_fw_boot_info()
5982 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: Get Flash" in get_fw_boot_info()
5983 " failed\n", ha->host_no, __func__)); in get_fw_boot_info()
5989 DEBUG2(ql4_printk(KERN_INFO, ha, "Firmware boot options" in get_fw_boot_info()
6007 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary target ID %d, Secondary" in get_fw_boot_info()
6012 dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma); in get_fw_boot_info()
6014 ha->pri_ddb_idx = ddb_index[0]; in get_fw_boot_info()
6015 ha->sec_ddb_idx = ddb_index[1]; in get_fw_boot_info()
6030 static int qla4xxx_get_bidi_chap(struct scsi_qla_host *ha, char *username, in qla4xxx_get_bidi_chap() argument
6037 if (is_qla80XX(ha)) in qla4xxx_get_bidi_chap()
6038 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_bidi_chap()
6043 if (!ha->chap_list) { in qla4xxx_get_bidi_chap()
6044 ql4_printk(KERN_ERR, ha, "Do not have CHAP table cache\n"); in qla4xxx_get_bidi_chap()
6048 mutex_lock(&ha->chap_sem); in qla4xxx_get_bidi_chap()
6050 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_get_bidi_chap()
6067 mutex_unlock(&ha->chap_sem); in qla4xxx_get_bidi_chap()
6073 static int qla4xxx_get_boot_target(struct scsi_qla_host *ha, in qla4xxx_get_boot_target() argument
6084 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_get_boot_target()
6087 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_get_boot_target()
6094 if (qla4xxx_bootdb_by_index(ha, fw_ddb_entry, in qla4xxx_get_boot_target()
6096 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: No Flash DDB found at " in qla4xxx_get_boot_target()
6124 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting chap\n")); in qla4xxx_get_boot_target()
6126 ret = qla4xxx_get_chap(ha, (char *)&boot_conn->chap. in qla4xxx_get_boot_target()
6131 ql4_printk(KERN_ERR, ha, "Failed to set chap\n"); in qla4xxx_get_boot_target()
6142 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting BIDI chap\n")); in qla4xxx_get_boot_target()
6144 ret = qla4xxx_get_bidi_chap(ha, in qla4xxx_get_boot_target()
6149 ql4_printk(KERN_ERR, ha, "Failed to set BIDI chap\n"); in qla4xxx_get_boot_target()
6159 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_get_boot_target()
6164 static int qla4xxx_get_boot_info(struct scsi_qla_host *ha) in qla4xxx_get_boot_info() argument
6173 ret = get_fw_boot_info(ha, ddb_index); in qla4xxx_get_boot_info()
6175 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_boot_info()
6186 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess), in qla4xxx_get_boot_info()
6189 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary boot target not " in qla4xxx_get_boot_info()
6198 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess), in qla4xxx_get_boot_info()
6201 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Secondary boot target not" in qla4xxx_get_boot_info()
6210 static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha) in qla4xxx_setup_boot_info() argument
6214 if (qla4xxx_get_boot_info(ha) != QLA_SUCCESS) in qla4xxx_setup_boot_info()
6218 ql4_printk(KERN_INFO, ha, in qla4xxx_setup_boot_info()
6225 ha->boot_kset = iscsi_boot_create_host_kset(ha->host->host_no); in qla4xxx_setup_boot_info()
6226 if (!ha->boot_kset) in qla4xxx_setup_boot_info()
6229 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6231 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6238 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6240 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 1, ha, in qla4xxx_setup_boot_info()
6247 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6249 boot_kobj = iscsi_boot_create_initiator(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6256 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6258 boot_kobj = iscsi_boot_create_ethernet(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6268 scsi_host_put(ha->host); in qla4xxx_setup_boot_info()
6270 iscsi_boot_destroy_kset(ha->boot_kset); in qla4xxx_setup_boot_info()
6320 static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha, in qla4xxx_compare_tuple_ddb() argument
6341 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_compare_tuple_ddb()
6350 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_compare_tuple_ddb()
6359 static int qla4xxx_is_session_exists(struct scsi_qla_host *ha, in qla4xxx_is_session_exists() argument
6371 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_session_exists()
6379 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_session_exists()
6388 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_is_session_exists()
6393 if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, false)) { in qla4xxx_is_session_exists()
6443 static int qla4xxx_update_isid(struct scsi_qla_host *ha, in qla4xxx_update_isid() argument
6471 static int qla4xxx_should_update_isid(struct scsi_qla_host *ha, in qla4xxx_should_update_isid() argument
6505 static int qla4xxx_is_flash_ddb_exists(struct scsi_qla_host *ha, in qla4xxx_is_flash_ddb_exists() argument
6516 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_flash_ddb_exists()
6524 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_flash_ddb_exists()
6535 ret = qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, true); in qla4xxx_is_flash_ddb_exists()
6544 ret = qla4xxx_should_update_isid(ha, tmp_tddb, fw_tddb); in qla4xxx_is_flash_ddb_exists()
6546 rval = qla4xxx_update_isid(ha, list_nt, fw_ddb_entry); in qla4xxx_is_flash_ddb_exists()
6574 static struct iscsi_endpoint *qla4xxx_get_ep_fwdb(struct scsi_qla_host *ha, in qla4xxx_get_ep_fwdb() argument
6606 ep = qla4xxx_ep_connect(ha->host, (struct sockaddr *)dst_addr, 0); in qla4xxx_get_ep_fwdb()
6611 static int qla4xxx_verify_boot_idx(struct scsi_qla_host *ha, uint16_t idx) in qla4xxx_verify_boot_idx() argument
6615 if (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx) in qla4xxx_verify_boot_idx()
6620 static void qla4xxx_setup_flash_ddb_entry(struct scsi_qla_host *ha, in qla4xxx_setup_flash_ddb_entry() argument
6629 ddb_entry->ha = ha; in qla4xxx_setup_flash_ddb_entry()
6645 (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx)) in qla4xxx_setup_flash_ddb_entry()
6649 static void qla4xxx_wait_for_ip_configuration(struct scsi_qla_host *ha) in qla4xxx_wait_for_ip_configuration() argument
6664 ret = qla4xxx_get_ip_state(ha, 0, ip_idx[idx], sts); in qla4xxx_wait_for_ip_configuration()
6673 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_for_ip_configuration()
6718 static int qla4xxx_find_flash_st_idx(struct scsi_qla_host *ha, in qla4xxx_find_flash_st_idx() argument
6728 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_find_flash_st_idx()
6731 flash_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_find_flash_st_idx()
6734 ql4_printk(KERN_ERR, ha, "Out of memory\n"); in qla4xxx_find_flash_st_idx()
6738 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6750 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6764 ql4_printk(KERN_ERR, ha, "Failed to find ST [%d] in flash\n", in qla4xxx_find_flash_st_idx()
6769 dma_pool_free(ha->fw_ddb_dma_pool, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6775 static void qla4xxx_build_st_list(struct scsi_qla_host *ha, in qla4xxx_build_st_list() argument
6789 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_st_list()
6792 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_st_list()
6796 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_st_list()
6801 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_st_list()
6819 ret = qla4xxx_find_flash_st_idx(ha, fw_ddb_entry, idx, in qla4xxx_build_st_list()
6822 ql4_printk(KERN_ERR, ha, in qla4xxx_build_st_list()
6826 ql4_printk(KERN_INFO, ha, in qla4xxx_build_st_list()
6842 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_st_list()
6853 static void qla4xxx_remove_failed_ddb(struct scsi_qla_host *ha, in qla4xxx_remove_failed_ddb() argument
6862 ret = qla4xxx_get_fwddb_entry(ha, ddb_idx->fw_ddb_idx, in qla4xxx_remove_failed_ddb()
6876 static void qla4xxx_update_sess_disc_idx(struct scsi_qla_host *ha, in qla4xxx_update_sess_disc_idx() argument
6885 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_update_sess_disc_idx()
6898 static int qla4xxx_sess_conn_setup(struct scsi_qla_host *ha, in qla4xxx_sess_conn_setup() argument
6916 cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, ha->host, in qla4xxx_sess_conn_setup()
6938 qla4xxx_setup_flash_ddb_entry(ha, ddb_entry, idx); in qla4xxx_sess_conn_setup()
6950 ep = qla4xxx_get_ep_fwdb(ha, fw_ddb_entry); in qla4xxx_sess_conn_setup()
6955 DEBUG2(ql4_printk(KERN_ERR, ha, "Unable to get ep\n")); in qla4xxx_sess_conn_setup()
6961 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); in qla4xxx_sess_conn_setup()
6962 qla4xxx_update_sess_disc_idx(ha, ddb_entry, fw_ddb_entry); in qla4xxx_sess_conn_setup()
6971 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_sess_conn_setup()
6979 static void qla4xxx_update_fw_ddb_link(struct scsi_qla_host *ha, in qla4xxx_update_fw_ddb_link() argument
6990 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_update_fw_ddb_link()
7000 static void qla4xxx_build_nt_list(struct scsi_qla_host *ha, in qla4xxx_build_nt_list() argument
7018 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_nt_list()
7021 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_nt_list()
7024 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_nt_list()
7029 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_nt_list()
7035 if (qla4xxx_verify_boot_idx(ha, idx) != QLA_SUCCESS) in qla4xxx_build_nt_list()
7044 qla4xxx_update_fw_ddb_link(ha, list_st, fw_ddb_entry); in qla4xxx_build_nt_list()
7051 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_nt_list()
7069 ret = qla4xxx_is_flash_ddb_exists(ha, list_nt, in qla4xxx_build_nt_list()
7083 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, in qla4xxx_build_nt_list()
7086 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, in qla4xxx_build_nt_list()
7089 qla4xxx_update_sess_disc_idx(ha, in qla4xxx_build_nt_list()
7096 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, is_reset, idx); in qla4xxx_build_nt_list()
7107 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_nt_list()
7110 static void qla4xxx_build_new_nt_list(struct scsi_qla_host *ha, in qla4xxx_build_new_nt_list() argument
7124 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_new_nt_list()
7127 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_new_nt_list()
7130 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_new_nt_list()
7135 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_new_nt_list()
7148 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_new_nt_list()
7157 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); in qla4xxx_build_new_nt_list()
7169 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, in qla4xxx_build_new_nt_list()
7181 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_new_nt_list()
7221 static int qla4xxx_sysfs_ddb_tgt_create(struct scsi_qla_host *ha, in qla4xxx_sysfs_ddb_tgt_create() argument
7229 fnode_sess = iscsi_create_flashnode_sess(ha->host, *idx, in qla4xxx_sysfs_ddb_tgt_create()
7232 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_tgt_create()
7234 __func__, *idx, ha->host_no); in qla4xxx_sysfs_ddb_tgt_create()
7238 fnode_conn = iscsi_create_flashnode_conn(ha->host, fnode_sess, in qla4xxx_sysfs_ddb_tgt_create()
7241 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_tgt_create()
7243 __func__, *idx, ha->host_no); in qla4xxx_sysfs_ddb_tgt_create()
7252 if (*idx == ha->pri_ddb_idx || *idx == ha->sec_ddb_idx) in qla4xxx_sysfs_ddb_tgt_create()
7263 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", in qla4xxx_sysfs_ddb_tgt_create()
7266 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", in qla4xxx_sysfs_ddb_tgt_create()
7290 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_add() local
7301 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Invalid portal type\n", in qla4xxx_sysfs_ddb_add()
7306 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : in qla4xxx_sysfs_ddb_add()
7309 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_add()
7312 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_add()
7318 dev = iscsi_find_flashnode_sess(ha->host, NULL, in qla4xxx_sysfs_ddb_add()
7321 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_add()
7330 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_add()
7341 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_add()
7345 rval = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 1); in qla4xxx_sysfs_ddb_add()
7349 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_add()
7369 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_apply() local
7376 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_apply()
7379 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_apply()
7389 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_apply()
7399 rval = qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, in qla4xxx_sysfs_ddb_apply()
7404 ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_apply()
7406 __func__, fnode_sess->target_id, ha->host_no); in qla4xxx_sysfs_ddb_apply()
7409 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_apply()
7411 __func__, fnode_sess->target_id, ha->host_no); in qla4xxx_sysfs_ddb_apply()
7416 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_apply()
7421 static ssize_t qla4xxx_sysfs_ddb_conn_open(struct scsi_qla_host *ha, in qla4xxx_sysfs_ddb_conn_open() argument
7433 ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*ddb_entry), in qla4xxx_sysfs_ddb_conn_open()
7436 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_conn_open()
7444 ret = qla4xxx_set_ddb_entry(ha, idx, ddb_entry_dma, &mbx_sts); in qla4xxx_sysfs_ddb_conn_open()
7446 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_conn_open()
7452 qla4xxx_conn_open(ha, idx); in qla4xxx_sysfs_ddb_conn_open()
7455 tmo = ((ha->def_timeout > LOGIN_TOV) && in qla4xxx_sysfs_ddb_conn_open()
7456 (ha->def_timeout < LOGIN_TOV * 10) ? in qla4xxx_sysfs_ddb_conn_open()
7457 ha->def_timeout : LOGIN_TOV); in qla4xxx_sysfs_ddb_conn_open()
7459 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_conn_open()
7464 ret = qla4xxx_get_fwddb_entry(ha, idx, NULL, 0, NULL, in qla4xxx_sysfs_ddb_conn_open()
7479 dma_free_coherent(&ha->pdev->dev, sizeof(*ddb_entry), in qla4xxx_sysfs_ddb_conn_open()
7484 static int qla4xxx_ddb_login_st(struct scsi_qla_host *ha, in qla4xxx_ddb_login_st() argument
7493 if (test_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags)) { in qla4xxx_ddb_login_st()
7494 ql4_printk(KERN_WARNING, ha, in qla4xxx_ddb_login_st()
7501 set_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); in qla4xxx_ddb_login_st()
7503 ret = qla4xxx_get_ddb_index(ha, &ddb_index); in qla4xxx_ddb_login_st()
7507 ret = qla4xxx_sysfs_ddb_conn_open(ha, fw_ddb_entry, ddb_index); in qla4xxx_ddb_login_st()
7511 qla4xxx_build_new_nt_list(ha, &list_nt, target_id); in qla4xxx_ddb_login_st()
7515 qla4xxx_clear_ddb_entry(ha, ddb_idx->fw_ddb_idx); in qla4xxx_ddb_login_st()
7520 if (qla4xxx_clear_ddb_entry(ha, ddb_index) == QLA_ERROR) { in qla4xxx_ddb_login_st()
7521 ql4_printk(KERN_ERR, ha, in qla4xxx_ddb_login_st()
7525 clear_bit(ddb_index, ha->ddb_idx_map); in qla4xxx_ddb_login_st()
7528 clear_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); in qla4xxx_ddb_login_st()
7532 static int qla4xxx_ddb_login_nt(struct scsi_qla_host *ha, in qla4xxx_ddb_login_nt() argument
7538 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); in qla4xxx_ddb_login_nt()
7540 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, in qla4xxx_ddb_login_nt()
7559 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_login() local
7566 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_login()
7572 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_login()
7575 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_login()
7585 ret = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_login()
7593 ret = qla4xxx_ddb_login_st(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_login()
7596 ret = qla4xxx_ddb_login_nt(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_login()
7604 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_login()
7619 struct scsi_qla_host *ha; in qla4xxx_sysfs_ddb_logout_sid() local
7630 ha = ddb_entry->ha; in qla4xxx_sysfs_ddb_logout_sid()
7633 ql4_printk(KERN_ERR, ha, "%s: Not a flash node session\n", in qla4xxx_sysfs_ddb_logout_sid()
7640 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout_sid()
7647 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_logout_sid()
7650 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout_sid()
7659 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_sysfs_ddb_logout_sid()
7685 qla4xxx_session_logout_ddb(ha, ddb_entry, options); in qla4xxx_sysfs_ddb_logout_sid()
7690 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_sysfs_ddb_logout_sid()
7705 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_sysfs_ddb_logout_sid()
7715 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_sysfs_ddb_logout_sid()
7716 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_sysfs_ddb_logout_sid()
7717 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); in qla4xxx_sysfs_ddb_logout_sid()
7718 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_sysfs_ddb_logout_sid()
7727 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_logout_sid()
7743 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_logout() local
7755 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_sysfs_ddb_logout()
7758 ql4_printk(KERN_ERR, ha, "%s:Out of memory\n", __func__); in qla4xxx_sysfs_ddb_logout()
7765 ql4_printk(KERN_WARNING, ha, in qla4xxx_sysfs_ddb_logout()
7773 ql4_printk(KERN_WARNING, ha, in qla4xxx_sysfs_ddb_logout()
7780 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout()
7788 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout()
7809 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_sysfs_ddb_logout()
7817 status = qla4xxx_get_fwddb_entry(ha, index, fw_ddb_entry, in qla4xxx_sysfs_ddb_logout()
7828 status = qla4xxx_compare_tuple_ddb(ha, flash_tddb, tmp_tddb, in qla4xxx_sysfs_ddb_logout()
7845 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_sysfs_ddb_logout()
7855 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_get_param() local
8057 qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_get_param()
8068 qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_get_param()
8110 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_set_param() local
8304 if (!qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_set_param()
8314 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_set_param()
8336 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_delete() local
8349 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_delete()
8358 if (is_qla40XX(ha)) { in qla4xxx_sysfs_ddb_delete()
8366 (ha->hw.flt_region_ddb << 2); in qla4xxx_sysfs_ddb_delete()
8370 if (ha->port_num == 1) in qla4xxx_sysfs_ddb_delete()
8371 dev_db_start_offset += (ha->hw.flt_ddb_size / 2); in qla4xxx_sysfs_ddb_delete()
8374 (ha->hw.flt_ddb_size / 2); in qla4xxx_sysfs_ddb_delete()
8383 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: start offset=%u, end offset=%u\n", in qla4xxx_sysfs_ddb_delete()
8388 DEBUG2(ql4_printk(KERN_ERR, ha, "%s:Invalid DDB index %u\n", in qla4xxx_sysfs_ddb_delete()
8393 pddb = dma_alloc_coherent(&ha->pdev->dev, ddb_size, in qla4xxx_sysfs_ddb_delete()
8397 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_delete()
8403 if (is_qla40XX(ha)) { in qla4xxx_sysfs_ddb_delete()
8413 qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, in qla4xxx_sysfs_ddb_delete()
8419 ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_delete()
8421 __func__, target_id, ha->host_no); in qla4xxx_sysfs_ddb_delete()
8424 dma_free_coherent(&ha->pdev->dev, ddb_size, pddb, in qla4xxx_sysfs_ddb_delete()
8435 int qla4xxx_sysfs_ddb_export(struct scsi_qla_host *ha) in qla4xxx_sysfs_ddb_export() argument
8443 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_sysfs_ddb_export()
8447 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_export()
8453 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : in qla4xxx_sysfs_ddb_export()
8457 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, fw_ddb_entry_dma, in qla4xxx_sysfs_ddb_export()
8461 ret = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 0); in qla4xxx_sysfs_ddb_export()
8468 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), fw_ddb_entry, in qla4xxx_sysfs_ddb_export()
8474 static void qla4xxx_sysfs_ddb_remove(struct scsi_qla_host *ha) in qla4xxx_sysfs_ddb_remove() argument
8476 iscsi_destroy_all_flashnode(ha->host); in qla4xxx_sysfs_ddb_remove()
8489 void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset) in qla4xxx_build_ddb_list() argument
8496 if (!test_bit(AF_LINK_UP, &ha->flags)) { in qla4xxx_build_ddb_list()
8497 set_bit(AF_BUILD_DDB_LIST, &ha->flags); in qla4xxx_build_ddb_list()
8498 ha->is_reset = is_reset; in qla4xxx_build_ddb_list()
8505 qla4xxx_build_st_list(ha, &list_st); in qla4xxx_build_ddb_list()
8510 qla4xxx_wait_for_ip_configuration(ha); in qla4xxx_build_ddb_list()
8514 qla4xxx_conn_open(ha, st_ddb_idx->fw_ddb_idx); in qla4xxx_build_ddb_list()
8518 tmo = ((ha->def_timeout > LOGIN_TOV) && in qla4xxx_build_ddb_list()
8519 (ha->def_timeout < LOGIN_TOV * 10) ? in qla4xxx_build_ddb_list()
8520 ha->def_timeout : LOGIN_TOV); in qla4xxx_build_ddb_list()
8522 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_ddb_list()
8530 qla4xxx_remove_failed_ddb(ha, &list_st); in qla4xxx_build_ddb_list()
8535 qla4xxx_build_nt_list(ha, &list_nt, &list_st, is_reset); in qla4xxx_build_ddb_list()
8540 qla4xxx_free_ddb_index(ha); in qla4xxx_build_ddb_list()
8552 static void qla4xxx_wait_login_resp_boot_tgt(struct scsi_qla_host *ha) in qla4xxx_wait_login_resp_boot_tgt() argument
8561 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_wait_login_resp_boot_tgt()
8564 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_wait_login_resp_boot_tgt()
8567 ql4_printk(KERN_ERR, ha, in qla4xxx_wait_login_resp_boot_tgt()
8575 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_wait_login_resp_boot_tgt()
8580 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_login_resp_boot_tgt()
8584 ret = qla4xxx_get_fwddb_entry(ha, in qla4xxx_wait_login_resp_boot_tgt()
8601 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_login_resp_boot_tgt()
8611 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_wait_login_resp_boot_tgt()
8629 struct scsi_qla_host *ha; in qla4xxx_probe_adapter() local
8638 host = iscsi_host_alloc(&qla4xxx_driver_template, sizeof(*ha), 0); in qla4xxx_probe_adapter()
8646 ha = to_qla_host(host); in qla4xxx_probe_adapter()
8647 memset(ha, 0, sizeof(*ha)); in qla4xxx_probe_adapter()
8650 ha->pdev = pdev; in qla4xxx_probe_adapter()
8651 ha->host = host; in qla4xxx_probe_adapter()
8652 ha->host_no = host->host_no; in qla4xxx_probe_adapter()
8653 ha->func_num = PCI_FUNC(ha->pdev->devfn); in qla4xxx_probe_adapter()
8658 if (is_qla8022(ha)) { in qla4xxx_probe_adapter()
8659 ha->isp_ops = &qla4_82xx_isp_ops; in qla4xxx_probe_adapter()
8660 ha->reg_tbl = (uint32_t *) qla4_82xx_reg_tbl; in qla4xxx_probe_adapter()
8661 ha->qdr_sn_window = -1; in qla4xxx_probe_adapter()
8662 ha->ddr_mn_window = -1; in qla4xxx_probe_adapter()
8663 ha->curr_window = 255; in qla4xxx_probe_adapter()
8664 nx_legacy_intr = &legacy_intr[ha->func_num]; in qla4xxx_probe_adapter()
8665 ha->nx_legacy_intr.int_vec_bit = nx_legacy_intr->int_vec_bit; in qla4xxx_probe_adapter()
8666 ha->nx_legacy_intr.tgt_status_reg = in qla4xxx_probe_adapter()
8668 ha->nx_legacy_intr.tgt_mask_reg = nx_legacy_intr->tgt_mask_reg; in qla4xxx_probe_adapter()
8669 ha->nx_legacy_intr.pci_int_reg = nx_legacy_intr->pci_int_reg; in qla4xxx_probe_adapter()
8670 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_probe_adapter()
8671 ha->isp_ops = &qla4_83xx_isp_ops; in qla4xxx_probe_adapter()
8672 ha->reg_tbl = (uint32_t *)qla4_83xx_reg_tbl; in qla4xxx_probe_adapter()
8674 ha->isp_ops = &qla4xxx_isp_ops; in qla4xxx_probe_adapter()
8677 if (is_qla80XX(ha)) { in qla4xxx_probe_adapter()
8678 rwlock_init(&ha->hw_lock); in qla4xxx_probe_adapter()
8679 ha->pf_bit = ha->func_num << 16; in qla4xxx_probe_adapter()
8685 ret = ha->isp_ops->iospace_config(ha); in qla4xxx_probe_adapter()
8689 ql4_printk(KERN_INFO, ha, "Found an ISP%04x, irq %d, iobase 0x%p\n", in qla4xxx_probe_adapter()
8690 pdev->device, pdev->irq, ha->reg); in qla4xxx_probe_adapter()
8692 qla4xxx_config_dma_addressing(ha); in qla4xxx_probe_adapter()
8695 INIT_LIST_HEAD(&ha->free_srb_q); in qla4xxx_probe_adapter()
8697 mutex_init(&ha->mbox_sem); in qla4xxx_probe_adapter()
8698 mutex_init(&ha->chap_sem); in qla4xxx_probe_adapter()
8699 init_completion(&ha->mbx_intr_comp); in qla4xxx_probe_adapter()
8700 init_completion(&ha->disable_acb_comp); in qla4xxx_probe_adapter()
8701 init_completion(&ha->idc_comp); in qla4xxx_probe_adapter()
8702 init_completion(&ha->link_up_comp); in qla4xxx_probe_adapter()
8704 spin_lock_init(&ha->hardware_lock); in qla4xxx_probe_adapter()
8705 spin_lock_init(&ha->work_lock); in qla4xxx_probe_adapter()
8708 INIT_LIST_HEAD(&ha->work_list); in qla4xxx_probe_adapter()
8711 if (qla4xxx_mem_alloc(ha)) { in qla4xxx_probe_adapter()
8712 ql4_printk(KERN_WARNING, ha, in qla4xxx_probe_adapter()
8727 pci_set_drvdata(pdev, ha); in qla4xxx_probe_adapter()
8733 if (is_qla80XX(ha)) in qla4xxx_probe_adapter()
8734 qla4_8xxx_get_flash_info(ha); in qla4xxx_probe_adapter()
8736 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_probe_adapter()
8737 qla4_83xx_read_reset_template(ha); in qla4xxx_probe_adapter()
8745 qla4_83xx_set_idc_dontreset(ha); in qla4xxx_probe_adapter()
8753 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8756 if (is_qla80XX(ha) && (status == QLA_ERROR)) in qla4xxx_probe_adapter()
8759 while ((!test_bit(AF_ONLINE, &ha->flags)) && in qla4xxx_probe_adapter()
8762 if (is_qla80XX(ha)) { in qla4xxx_probe_adapter()
8763 ha->isp_ops->idc_lock(ha); in qla4xxx_probe_adapter()
8764 dev_state = qla4_8xxx_rd_direct(ha, in qla4xxx_probe_adapter()
8766 ha->isp_ops->idc_unlock(ha); in qla4xxx_probe_adapter()
8768 ql4_printk(KERN_WARNING, ha, "%s: don't retry " in qla4xxx_probe_adapter()
8777 if (ha->isp_ops->reset_chip(ha) == QLA_ERROR) in qla4xxx_probe_adapter()
8780 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8781 if (is_qla80XX(ha) && (status == QLA_ERROR)) { in qla4xxx_probe_adapter()
8782 if (qla4_8xxx_check_init_adapter_retry(ha) == QLA_ERROR) in qla4xxx_probe_adapter()
8788 if (!test_bit(AF_ONLINE, &ha->flags)) { in qla4xxx_probe_adapter()
8789 ql4_printk(KERN_WARNING, ha, "Failed to initialize adapter\n"); in qla4xxx_probe_adapter()
8791 if ((is_qla8022(ha) && ql4xdontresethba) || in qla4xxx_probe_adapter()
8792 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_probe_adapter()
8793 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_probe_adapter()
8796 ha->isp_ops->idc_lock(ha); in qla4xxx_probe_adapter()
8797 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4xxx_probe_adapter()
8799 ha->isp_ops->idc_unlock(ha); in qla4xxx_probe_adapter()
8808 sprintf(buf, "qla4xxx_%lu_dpc", ha->host_no); in qla4xxx_probe_adapter()
8809 ha->dpc_thread = create_singlethread_workqueue(buf); in qla4xxx_probe_adapter()
8810 if (!ha->dpc_thread) { in qla4xxx_probe_adapter()
8811 ql4_printk(KERN_WARNING, ha, "Unable to start DPC thread!\n"); in qla4xxx_probe_adapter()
8815 INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc); in qla4xxx_probe_adapter()
8817 ha->task_wq = alloc_workqueue("qla4xxx_%lu_task", WQ_MEM_RECLAIM, 1, in qla4xxx_probe_adapter()
8818 ha->host_no); in qla4xxx_probe_adapter()
8819 if (!ha->task_wq) { in qla4xxx_probe_adapter()
8820 ql4_printk(KERN_WARNING, ha, "Unable to start task thread!\n"); in qla4xxx_probe_adapter()
8831 if (is_qla40XX(ha)) { in qla4xxx_probe_adapter()
8832 ret = qla4xxx_request_irqs(ha); in qla4xxx_probe_adapter()
8834 ql4_printk(KERN_WARNING, ha, "Failed to reserve " in qla4xxx_probe_adapter()
8840 pci_save_state(ha->pdev); in qla4xxx_probe_adapter()
8841 ha->isp_ops->enable_intrs(ha); in qla4xxx_probe_adapter()
8844 qla4xxx_start_timer(ha, 1); in qla4xxx_probe_adapter()
8846 set_bit(AF_INIT_DONE, &ha->flags); in qla4xxx_probe_adapter()
8848 qla4_8xxx_alloc_sysfs_attr(ha); in qla4xxx_probe_adapter()
8853 qla4xxx_version_str, ha->pdev->device, pci_name(ha->pdev), in qla4xxx_probe_adapter()
8854 ha->host_no, ha->fw_info.fw_major, ha->fw_info.fw_minor, in qla4xxx_probe_adapter()
8855 ha->fw_info.fw_patch, ha->fw_info.fw_build); in qla4xxx_probe_adapter()
8858 if (is_qla80XX(ha)) in qla4xxx_probe_adapter()
8859 qla4_8xxx_set_param(ha, SET_DRVR_VERSION); in qla4xxx_probe_adapter()
8861 if (qla4xxx_setup_boot_info(ha)) in qla4xxx_probe_adapter()
8862 ql4_printk(KERN_ERR, ha, in qla4xxx_probe_adapter()
8865 set_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags); in qla4xxx_probe_adapter()
8867 qla4xxx_build_ddb_list(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8868 iscsi_host_for_each_session(ha->host, qla4xxx_login_flash_ddb); in qla4xxx_probe_adapter()
8869 qla4xxx_wait_login_resp_boot_tgt(ha); in qla4xxx_probe_adapter()
8871 qla4xxx_create_chap_list(ha); in qla4xxx_probe_adapter()
8873 qla4xxx_create_ifaces(ha); in qla4xxx_probe_adapter()
8877 scsi_remove_host(ha->host); in qla4xxx_probe_adapter()
8880 qla4xxx_free_adapter(ha); in qla4xxx_probe_adapter()
8884 scsi_host_put(ha->host); in qla4xxx_probe_adapter()
8900 static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha) in qla4xxx_prevent_other_port_reinit() argument
8907 if (PCI_FUNC(ha->pdev->devfn) & BIT_1) in qla4xxx_prevent_other_port_reinit()
8911 pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus), in qla4xxx_prevent_other_port_reinit()
8912 ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), in qla4xxx_prevent_other_port_reinit()
8921 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: " in qla4xxx_prevent_other_port_reinit()
8930 static void qla4xxx_destroy_ddb(struct scsi_qla_host *ha, in qla4xxx_destroy_ddb() argument
8941 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) { in qla4xxx_destroy_ddb()
8942 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); in qla4xxx_destroy_ddb()
8946 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_destroy_ddb()
8949 ql4_printk(KERN_ERR, ha, in qla4xxx_destroy_ddb()
8956 status = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_destroy_ddb()
8971 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_destroy_ddb()
8974 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_destroy_ddb()
8977 static void qla4xxx_destroy_fw_ddb_session(struct scsi_qla_host *ha) in qla4xxx_destroy_fw_ddb_session() argument
8984 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_destroy_fw_ddb_session()
8988 qla4xxx_destroy_ddb(ha, ddb_entry); in qla4xxx_destroy_fw_ddb_session()
8997 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_destroy_fw_ddb_session()
9008 struct scsi_qla_host *ha; in qla4xxx_remove_adapter() local
9017 ha = pci_get_drvdata(pdev); in qla4xxx_remove_adapter()
9019 if (is_qla40XX(ha)) in qla4xxx_remove_adapter()
9020 qla4xxx_prevent_other_port_reinit(ha); in qla4xxx_remove_adapter()
9023 qla4xxx_destroy_ifaces(ha); in qla4xxx_remove_adapter()
9025 if ((!ql4xdisablesysfsboot) && ha->boot_kset) in qla4xxx_remove_adapter()
9026 iscsi_boot_destroy_kset(ha->boot_kset); in qla4xxx_remove_adapter()
9028 qla4xxx_destroy_fw_ddb_session(ha); in qla4xxx_remove_adapter()
9029 qla4_8xxx_free_sysfs_attr(ha); in qla4xxx_remove_adapter()
9031 qla4xxx_sysfs_ddb_remove(ha); in qla4xxx_remove_adapter()
9032 scsi_remove_host(ha->host); in qla4xxx_remove_adapter()
9034 qla4xxx_free_adapter(ha); in qla4xxx_remove_adapter()
9036 scsi_host_put(ha->host); in qla4xxx_remove_adapter()
9046 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha) in qla4xxx_config_dma_addressing() argument
9049 if (dma_set_mask_and_coherent(&ha->pdev->dev, DMA_BIT_MASK(64))) { in qla4xxx_config_dma_addressing()
9050 dev_dbg(&ha->pdev->dev, in qla4xxx_config_dma_addressing()
9053 dma_set_mask_and_coherent(&ha->pdev->dev, DMA_BIT_MASK(32)); in qla4xxx_config_dma_addressing()
9084 struct srb *qla4xxx_del_from_active_array(struct scsi_qla_host *ha, in qla4xxx_del_from_active_array() argument
9090 cmd = scsi_host_find_tag(ha->host, index); in qla4xxx_del_from_active_array()
9100 ha->iocb_cnt -= srb->iocb_cnt; in qla4xxx_del_from_active_array()
9116 static int qla4xxx_eh_wait_on_command(struct scsi_qla_host *ha, in qla4xxx_eh_wait_on_command() argument
9127 if (unlikely(pci_channel_offline(ha->pdev)) || in qla4xxx_eh_wait_on_command()
9128 (test_bit(AF_EEH_BUSY, &ha->flags))) { in qla4xxx_eh_wait_on_command()
9129 ql4_printk(KERN_WARNING, ha, "scsi%ld: Return from %s\n", in qla4xxx_eh_wait_on_command()
9130 ha->host_no, __func__); in qla4xxx_eh_wait_on_command()
9152 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha) in qla4xxx_wait_for_hba_online() argument
9159 if (adapter_up(ha)) in qla4xxx_wait_for_hba_online()
9177 static int qla4xxx_eh_wait_for_commands(struct scsi_qla_host *ha, in qla4xxx_eh_wait_for_commands() argument
9189 for (cnt = 0; cnt < ha->host->can_queue; cnt++) { in qla4xxx_eh_wait_for_commands()
9190 cmd = scsi_host_find_tag(ha->host, cnt); in qla4xxx_eh_wait_for_commands()
9193 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { in qla4xxx_eh_wait_for_commands()
9211 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_abort() local
9220 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Abort command issued cmd=%p, cdb=0x%x\n", in qla4xxx_eh_abort()
9221 ha->host_no, id, lun, cmd, cmd->cmnd[0]); in qla4xxx_eh_abort()
9223 rval = qla4xxx_isp_check_reg(ha); in qla4xxx_eh_abort()
9225 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); in qla4xxx_eh_abort()
9229 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9232 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9233 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Specified command has already completed.\n", in qla4xxx_eh_abort()
9234 ha->host_no, id, lun); in qla4xxx_eh_abort()
9238 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9240 if (qla4xxx_abort_task(ha, srb) != QLA_SUCCESS) { in qla4xxx_eh_abort()
9242 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9246 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9254 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { in qla4xxx_eh_abort()
9256 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9261 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_abort()
9263 ha->host_no, id, lun, (ret == SUCCESS) ? "succeeded" : "failed"); in qla4xxx_eh_abort()
9277 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_device_reset() local
9290 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9291 "scsi%ld:%d:%d:%llu: DEVICE RESET ISSUED.\n", ha->host_no, in qla4xxx_eh_device_reset()
9296 "dpc_flags=%lx, status=%x allowed=%d\n", ha->host_no, in qla4xxx_eh_device_reset()
9298 ha->dpc_flags, cmd->result, cmd->allowed)); in qla4xxx_eh_device_reset()
9300 rval = qla4xxx_isp_check_reg(ha); in qla4xxx_eh_device_reset()
9302 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); in qla4xxx_eh_device_reset()
9307 stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun); in qla4xxx_eh_device_reset()
9309 ql4_printk(KERN_INFO, ha, "DEVICE RESET FAILED. %d\n", stat); in qla4xxx_eh_device_reset()
9313 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), in qla4xxx_eh_device_reset()
9315 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9322 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, in qla4xxx_eh_device_reset()
9326 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9328 ha->host_no, cmd->device->channel, cmd->device->id, in qla4xxx_eh_device_reset()
9346 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_target_reset() local
9364 ha->host_no, cmd, jiffies, cmd->request->timeout / HZ, in qla4xxx_eh_target_reset()
9365 ha->dpc_flags, cmd->result, cmd->allowed)); in qla4xxx_eh_target_reset()
9367 rval = qla4xxx_isp_check_reg(ha); in qla4xxx_eh_target_reset()
9369 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); in qla4xxx_eh_target_reset()
9373 stat = qla4xxx_reset_target(ha, ddb_entry); in qla4xxx_eh_target_reset()
9380 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), in qla4xxx_eh_target_reset()
9389 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, in qla4xxx_eh_target_reset()
9426 struct scsi_qla_host *ha; in qla4xxx_eh_host_reset() local
9429 ha = to_qla_host(cmd->device->host); in qla4xxx_eh_host_reset()
9431 rval = qla4xxx_isp_check_reg(ha); in qla4xxx_eh_host_reset()
9433 ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n"); in qla4xxx_eh_host_reset()
9437 if ((is_qla8032(ha) || is_qla8042(ha)) && ql4xdontresethba) in qla4xxx_eh_host_reset()
9438 qla4_83xx_set_idc_dontreset(ha); in qla4xxx_eh_host_reset()
9445 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_eh_host_reset()
9446 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_eh_host_reset()
9448 ha->host_no, __func__)); in qla4xxx_eh_host_reset()
9452 qla4xxx_abort_active_cmds(ha, DID_ABORT << 16); in qla4xxx_eh_host_reset()
9457 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_host_reset()
9458 "scsi(%ld:%d:%d:%llu): HOST RESET ISSUED.\n", ha->host_no, in qla4xxx_eh_host_reset()
9461 if (qla4xxx_wait_for_hba_online(ha) != QLA_SUCCESS) { in qla4xxx_eh_host_reset()
9463 "DEAD.\n", ha->host_no, cmd->device->channel, in qla4xxx_eh_host_reset()
9469 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_eh_host_reset()
9470 if (is_qla80XX(ha)) in qla4xxx_eh_host_reset()
9471 set_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_eh_host_reset()
9473 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_eh_host_reset()
9476 if (qla4xxx_recover_adapter(ha) == QLA_SUCCESS) in qla4xxx_eh_host_reset()
9479 ql4_printk(KERN_INFO, ha, "HOST RESET %s.\n", in qla4xxx_eh_host_reset()
9485 static int qla4xxx_context_reset(struct scsi_qla_host *ha) in qla4xxx_context_reset() argument
9494 acb = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_context_reset()
9498 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc acb\n", in qla4xxx_context_reset()
9506 rval = qla4xxx_get_acb(ha, acb_dma, PRIMARI_ACB, acb_len); in qla4xxx_context_reset()
9512 rval = qla4xxx_disable_acb(ha); in qla4xxx_context_reset()
9518 wait_for_completion_timeout(&ha->disable_acb_comp, in qla4xxx_context_reset()
9521 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], acb_dma); in qla4xxx_context_reset()
9528 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk_def), in qla4xxx_context_reset()
9531 DEBUG2(ql4_printk(KERN_INFO, ha, "%s %s\n", __func__, in qla4xxx_context_reset()
9538 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_host_reset() local
9543 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Don't Reset HBA\n", in qla4xxx_host_reset()
9549 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_host_reset()
9554 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_host_reset()
9557 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_host_reset()
9558 if (is_qla80XX(ha)) in qla4xxx_host_reset()
9561 &ha->dpc_flags); in qla4xxx_host_reset()
9563 rval = qla4xxx_context_reset(ha); in qla4xxx_host_reset()
9573 if ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_host_reset()
9574 test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_host_reset()
9575 idc_ctrl = qla4_83xx_rd_reg(ha, QLA83XX_IDC_DRV_CTRL); in qla4xxx_host_reset()
9576 qla4_83xx_wr_reg(ha, QLA83XX_IDC_DRV_CTRL, in qla4xxx_host_reset()
9580 rval = qla4xxx_recover_adapter(ha); in qla4xxx_host_reset()
9582 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: recover adapter fail\n", in qla4xxx_host_reset()
9609 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_error_detected() local
9611 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: error detected:state %x\n", in qla4xxx_pci_error_detected()
9612 ha->host_no, __func__, state); in qla4xxx_pci_error_detected()
9614 if (!is_aer_supported(ha)) in qla4xxx_pci_error_detected()
9619 clear_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9622 set_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9623 qla4xxx_mailbox_premature_completion(ha); in qla4xxx_pci_error_detected()
9624 qla4xxx_free_irqs(ha); in qla4xxx_pci_error_detected()
9627 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_pci_error_detected()
9630 set_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9631 set_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags); in qla4xxx_pci_error_detected()
9632 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_pci_error_detected()
9647 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_mmio_enabled() local
9649 if (!is_aer_supported(ha)) in qla4xxx_pci_mmio_enabled()
9655 static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha) in qla4_8xxx_error_recovery() argument
9661 ql4_printk(KERN_WARNING, ha, "scsi%ld: In %s\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9663 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4_8xxx_error_recovery()
9665 if (test_bit(AF_ONLINE, &ha->flags)) { in qla4_8xxx_error_recovery()
9666 clear_bit(AF_ONLINE, &ha->flags); in qla4_8xxx_error_recovery()
9667 clear_bit(AF_LINK_UP, &ha->flags); in qla4_8xxx_error_recovery()
9668 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); in qla4_8xxx_error_recovery()
9669 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4_8xxx_error_recovery()
9672 fn = PCI_FUNC(ha->pdev->devfn); in qla4_8xxx_error_recovery()
9673 if (is_qla8022(ha)) { in qla4_8xxx_error_recovery()
9676 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Finding PCI device at func %x\n", in qla4_8xxx_error_recovery()
9677 ha->host_no, __func__, fn); in qla4_8xxx_error_recovery()
9681 pci_domain_nr(ha->pdev->bus), in qla4_8xxx_error_recovery()
9682 ha->pdev->bus->number, in qla4_8xxx_error_recovery()
9683 PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), in qla4_8xxx_error_recovery()
9690 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Found PCI func in enabled state%x\n", in qla4_8xxx_error_recovery()
9691 ha->host_no, __func__, fn); in qla4_8xxx_error_recovery()
9699 if (qla4_83xx_can_perform_reset(ha)) { in qla4_8xxx_error_recovery()
9710 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn being reset " in qla4_8xxx_error_recovery()
9711 "0x%x is the owner\n", ha->host_no, __func__, in qla4_8xxx_error_recovery()
9712 ha->pdev->devfn); in qla4_8xxx_error_recovery()
9714 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9715 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9717 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9719 rval = qla4_8xxx_update_idc_reg(ha); in qla4_8xxx_error_recovery()
9721 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: FAILED\n", in qla4_8xxx_error_recovery()
9722 ha->host_no, __func__); in qla4_8xxx_error_recovery()
9723 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9724 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9726 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9730 clear_bit(AF_FW_RECOVERY, &ha->flags); in qla4_8xxx_error_recovery()
9731 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4_8xxx_error_recovery()
9734 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " in qla4_8xxx_error_recovery()
9735 "FAILED\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9736 qla4xxx_free_irqs(ha); in qla4_8xxx_error_recovery()
9737 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9738 qla4_8xxx_clear_drv_active(ha); in qla4_8xxx_error_recovery()
9739 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9741 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9743 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " in qla4_8xxx_error_recovery()
9744 "READY\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9745 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9746 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9749 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DRV_STATE, 0); in qla4_8xxx_error_recovery()
9750 qla4_8xxx_set_drv_active(ha); in qla4_8xxx_error_recovery()
9751 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9752 ha->isp_ops->enable_intrs(ha); in qla4_8xxx_error_recovery()
9755 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn 0x%x is not " in qla4_8xxx_error_recovery()
9756 "the reset owner\n", ha->host_no, __func__, in qla4_8xxx_error_recovery()
9757 ha->pdev->devfn); in qla4_8xxx_error_recovery()
9758 if ((qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE) == in qla4_8xxx_error_recovery()
9760 clear_bit(AF_FW_RECOVERY, &ha->flags); in qla4_8xxx_error_recovery()
9761 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4_8xxx_error_recovery()
9763 ha->isp_ops->enable_intrs(ha); in qla4_8xxx_error_recovery()
9765 qla4xxx_free_irqs(ha); in qla4_8xxx_error_recovery()
9767 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9768 qla4_8xxx_set_drv_active(ha); in qla4_8xxx_error_recovery()
9769 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9773 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4_8xxx_error_recovery()
9781 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_slot_reset() local
9784 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: slot_reset\n", in qla4xxx_pci_slot_reset()
9785 ha->host_no, __func__); in qla4xxx_pci_slot_reset()
9787 if (!is_aer_supported(ha)) in qla4xxx_pci_slot_reset()
9804 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Can't re-enable " in qla4xxx_pci_slot_reset()
9805 "device after reset\n", ha->host_no, __func__); in qla4xxx_pci_slot_reset()
9809 ha->isp_ops->disable_intrs(ha); in qla4xxx_pci_slot_reset()
9811 if (is_qla80XX(ha)) { in qla4xxx_pci_slot_reset()
9812 if (qla4_8xxx_error_recovery(ha) == QLA_SUCCESS) { in qla4xxx_pci_slot_reset()
9820 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Return=%x\n" in qla4xxx_pci_slot_reset()
9821 "device after reset\n", ha->host_no, __func__, ret); in qla4xxx_pci_slot_reset()
9828 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_resume() local
9831 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: pci_resume\n", in qla4xxx_pci_resume()
9832 ha->host_no, __func__); in qla4xxx_pci_resume()
9834 ret = qla4xxx_wait_for_hba_online(ha); in qla4xxx_pci_resume()
9836 ql4_printk(KERN_ERR, ha, "scsi%ld: %s: the device failed to " in qla4xxx_pci_resume()
9837 "resume I/O from slot/link_reset\n", ha->host_no, in qla4xxx_pci_resume()
9841 clear_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_resume()