Lines Matching refs:ha

100 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha);
104 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha);
269 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_send_ping() local
282 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv4 Ping src: %pI4 " in qla4xxx_send_ping()
284 &ha->ip_config.ip_address, ipaddr)); in qla4xxx_send_ping()
285 rval = qla4xxx_ping_iocb(ha, options, payload_size, pid, in qla4xxx_send_ping()
299 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: LinkLocal Ping " in qla4xxx_send_ping()
301 &ha->ip_config.ipv6_link_local_addr, in qla4xxx_send_ping()
304 rval = qla4xxx_ping_iocb(ha, options, payload_size, in qla4xxx_send_ping()
307 ql4_printk(KERN_WARNING, ha, "%s: iface num = %d " in qla4xxx_send_ping()
321 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " in qla4xxx_send_ping()
324 &ha->ip_config.ipv6_addr0, in qla4xxx_send_ping()
328 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 " in qla4xxx_send_ping()
331 &ha->ip_config.ipv6_addr1, in qla4xxx_send_ping()
334 rval = qla4xxx_ping_iocb(ha, options, payload_size, in qla4xxx_send_ping()
580 static void qla4xxx_create_chap_list(struct scsi_qla_host *ha) in qla4xxx_create_chap_list() argument
588 if (is_qla40XX(ha)) in qla4xxx_create_chap_list()
594 chap_size = ha->hw.flt_chap_size / 2; in qla4xxx_create_chap_list()
596 chap_flash_data = dma_alloc_coherent(&ha->pdev->dev, chap_size, in qla4xxx_create_chap_list()
599 ql4_printk(KERN_ERR, ha, "No memory for chap_flash_data\n"); in qla4xxx_create_chap_list()
603 if (is_qla40XX(ha)) { in qla4xxx_create_chap_list()
606 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); in qla4xxx_create_chap_list()
607 if (ha->port_num == 1) in qla4xxx_create_chap_list()
611 rval = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); in qla4xxx_create_chap_list()
615 if (ha->chap_list == NULL) in qla4xxx_create_chap_list()
616 ha->chap_list = vmalloc(chap_size); in qla4xxx_create_chap_list()
617 if (ha->chap_list == NULL) { in qla4xxx_create_chap_list()
618 ql4_printk(KERN_ERR, ha, "No memory for ha->chap_list\n"); in qla4xxx_create_chap_list()
622 memset(ha->chap_list, 0, chap_size); in qla4xxx_create_chap_list()
623 memcpy(ha->chap_list, chap_flash_data, chap_size); in qla4xxx_create_chap_list()
626 dma_free_coherent(&ha->pdev->dev, chap_size, chap_flash_data, chap_dma); in qla4xxx_create_chap_list()
629 static int qla4xxx_get_chap_by_index(struct scsi_qla_host *ha, in qla4xxx_get_chap_by_index() argument
636 if (!ha->chap_list) { in qla4xxx_get_chap_by_index()
637 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); in qla4xxx_get_chap_by_index()
642 if (is_qla80XX(ha)) in qla4xxx_get_chap_by_index()
643 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_chap_by_index()
649 ql4_printk(KERN_ERR, ha, "Invalid Chap index\n"); in qla4xxx_get_chap_by_index()
654 *chap_entry = (struct ql4_chap_table *)ha->chap_list + chap_index; in qla4xxx_get_chap_by_index()
676 static int qla4xxx_find_free_chap_index(struct scsi_qla_host *ha, in qla4xxx_find_free_chap_index() argument
684 if (is_qla80XX(ha)) in qla4xxx_find_free_chap_index()
685 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_find_free_chap_index()
690 if (!ha->chap_list) { in qla4xxx_find_free_chap_index()
691 ql4_printk(KERN_ERR, ha, "CHAP table cache is empty!\n"); in qla4xxx_find_free_chap_index()
697 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_find_free_chap_index()
721 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_chap_list() local
728 if (is_qla80XX(ha)) in qla4xxx_get_chap_list()
729 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_chap_list()
734 ql4_printk(KERN_INFO, ha, "%s: num_entries = %d, CHAP idx = %d\n", in qla4xxx_get_chap_list()
742 qla4xxx_create_chap_list(ha); in qla4xxx_get_chap_list()
745 mutex_lock(&ha->chap_sem); in qla4xxx_get_chap_list()
747 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_get_chap_list()
773 mutex_unlock(&ha->chap_sem); in qla4xxx_get_chap_list()
776 ql4_printk(KERN_INFO, ha, "%s: Valid CHAP Entries = %d\n", in qla4xxx_get_chap_list()
820 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_delete_chap() local
828 chap_table = dma_pool_alloc(ha->chap_dma_pool, GFP_KERNEL, &chap_dma); in qla4xxx_delete_chap()
834 if (is_qla80XX(ha)) in qla4xxx_delete_chap()
835 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_delete_chap()
849 ql4_printk(KERN_INFO, ha, "CHAP entry %d is in use, cannot " in qla4xxx_delete_chap()
856 if (is_qla40XX(ha)) in qla4xxx_delete_chap()
859 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2); in qla4xxx_delete_chap()
863 if (ha->port_num == 1) in qla4xxx_delete_chap()
864 offset += (ha->hw.flt_chap_size / 2); in qla4xxx_delete_chap()
868 ret = qla4xxx_get_flash(ha, chap_dma, offset, chap_size); in qla4xxx_delete_chap()
874 DEBUG2(ql4_printk(KERN_INFO, ha, "Chap Cookie: x%x\n", in qla4xxx_delete_chap()
878 ql4_printk(KERN_ERR, ha, "No valid chap entry found\n"); in qla4xxx_delete_chap()
886 ret = qla4xxx_set_flash(ha, chap_dma, offset, chap_size, in qla4xxx_delete_chap()
888 if (ret == QLA_SUCCESS && ha->chap_list) { in qla4xxx_delete_chap()
889 mutex_lock(&ha->chap_sem); in qla4xxx_delete_chap()
891 memcpy((struct ql4_chap_table *)ha->chap_list + chap_tbl_idx, in qla4xxx_delete_chap()
893 mutex_unlock(&ha->chap_sem); in qla4xxx_delete_chap()
899 dma_pool_free(ha->chap_dma_pool, chap_table, chap_dma); in qla4xxx_delete_chap()
913 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_chap_entry() local
950 ql4_printk(KERN_ERR, ha, in qla4xxx_set_chap_entry()
962 if (is_qla80XX(ha)) in qla4xxx_set_chap_entry()
963 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_set_chap_entry()
968 mutex_lock(&ha->chap_sem); in qla4xxx_set_chap_entry()
970 rc = qla4xxx_get_chap_by_index(ha, chap_rec.chap_tbl_idx, in qla4xxx_set_chap_entry()
974 ql4_printk(KERN_INFO, ha, in qla4xxx_set_chap_entry()
985 ql4_printk(KERN_INFO, ha, in qla4xxx_set_chap_entry()
993 rc = qla4xxx_find_free_chap_index(ha, &chap_rec.chap_tbl_idx); in qla4xxx_set_chap_entry()
995 ql4_printk(KERN_INFO, ha, "CHAP entry not available\n"); in qla4xxx_set_chap_entry()
1001 rc = qla4xxx_set_chap(ha, chap_rec.username, chap_rec.password, in qla4xxx_set_chap_entry()
1005 mutex_unlock(&ha->chap_sem); in qla4xxx_set_chap_entry()
1014 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_host_stats() local
1023 DEBUG2(ql4_printk(KERN_INFO, ha, "Func: %s\n", __func__)); in qla4xxx_get_host_stats()
1028 ql4_printk(KERN_INFO, ha, "%s: host_stats size mismatch expected = %d, is = %d\n", in qla4xxx_get_host_stats()
1042 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, in qla4xxx_get_host_stats()
1045 ql4_printk(KERN_ERR, ha, in qla4xxx_get_host_stats()
1051 ret = qla4xxx_get_mgmt_data(ha, ddb_idx, stats_size, in qla4xxx_get_host_stats()
1054 ql4_printk(KERN_ERR, ha, in qla4xxx_get_host_stats()
1208 dma_free_coherent(&ha->pdev->dev, host_stats_size, in qla4xxx_get_host_stats()
1211 ql4_printk(KERN_INFO, ha, "%s: Get host stats done\n", in qla4xxx_get_host_stats()
1221 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_get_iface_param() local
1229 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); in qla4xxx_get_iface_param()
1233 &ha->ip_config.subnet_mask); in qla4xxx_get_iface_param()
1236 len = sprintf(buf, "%pI4\n", &ha->ip_config.gateway); in qla4xxx_get_iface_param()
1240 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1243 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1251 (ha->ip_config.tcp_options & in qla4xxx_get_iface_param()
1258 &ha->ip_config.ipv6_addr0); in qla4xxx_get_iface_param()
1261 &ha->ip_config.ipv6_addr1); in qla4xxx_get_iface_param()
1265 &ha->ip_config.ipv6_link_local_addr); in qla4xxx_get_iface_param()
1269 &ha->ip_config.ipv6_default_router_addr); in qla4xxx_get_iface_param()
1272 pval = (ha->ip_config.ipv6_addl_options & in qla4xxx_get_iface_param()
1279 pval = (ha->ip_config.ipv6_addl_options & in qla4xxx_get_iface_param()
1287 ival = ha->ip_config.ipv4_vlan_tag & in qla4xxx_get_iface_param()
1290 ival = ha->ip_config.ipv6_vlan_tag & in qla4xxx_get_iface_param()
1297 ival = (ha->ip_config.ipv4_vlan_tag >> 13) & in qla4xxx_get_iface_param()
1300 ival = (ha->ip_config.ipv6_vlan_tag >> 13) & in qla4xxx_get_iface_param()
1307 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1310 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1316 len = sprintf(buf, "%d\n", ha->ip_config.eth_mtu_size); in qla4xxx_get_iface_param()
1321 ha->ip_config.ipv4_port); in qla4xxx_get_iface_param()
1324 ha->ip_config.ipv6_port); in qla4xxx_get_iface_param()
1329 ha->ip_config.ipv4_addr_state); in qla4xxx_get_iface_param()
1333 ha->ip_config.ipv6_addr0_state); in qla4xxx_get_iface_param()
1336 ha->ip_config.ipv6_addr1_state); in qla4xxx_get_iface_param()
1343 ha->ip_config.ipv6_link_local_state); in qla4xxx_get_iface_param()
1348 ha->ip_config.ipv6_default_router_state); in qla4xxx_get_iface_param()
1353 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1356 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1363 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1366 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1373 OP_STATE(~ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1376 OP_STATE(~ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1385 ha->ip_config.tcp_wsf); in qla4xxx_get_iface_param()
1388 ha->ip_config.ipv6_tcp_wsf); in qla4xxx_get_iface_param()
1392 ival = (ha->ip_config.tcp_options & in qla4xxx_get_iface_param()
1395 ival = (ha->ip_config.ipv6_tcp_options & in qla4xxx_get_iface_param()
1402 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1405 OP_STATE(ha->ip_config.ipv6_tcp_options, in qla4xxx_get_iface_param()
1413 ha->ip_config.ipv4_cache_id); in qla4xxx_get_iface_param()
1416 ha->ip_config.ipv6_cache_id); in qla4xxx_get_iface_param()
1419 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1425 OP_STATE(ha->ip_config.tcp_options, in qla4xxx_get_iface_param()
1431 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1437 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_tos); in qla4xxx_get_iface_param()
1440 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1446 OP_STATE(ha->ip_config.ipv4_options, IPOPT_ALT_CID_EN, in qla4xxx_get_iface_param()
1452 pval = (ha->ip_config.ipv4_alt_cid_len) ? in qla4xxx_get_iface_param()
1453 (char *)ha->ip_config.ipv4_alt_cid : ""; in qla4xxx_get_iface_param()
1458 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1464 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1470 pval = (ha->ip_config.ipv4_vid_len) ? in qla4xxx_get_iface_param()
1471 (char *)ha->ip_config.ipv4_vid : ""; in qla4xxx_get_iface_param()
1476 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1482 OP_STATE(~ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1488 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1495 OP_STATE(ha->ip_config.ipv4_options, in qla4xxx_get_iface_param()
1498 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1504 len = sprintf(buf, "%d\n", ha->ip_config.ipv4_ttl); in qla4xxx_get_iface_param()
1507 OP_STATE(ha->ip_config.ipv6_options, in qla4xxx_get_iface_param()
1513 OP_STATE(ha->ip_config.ipv6_addl_options, in qla4xxx_get_iface_param()
1519 len = sprintf(buf, "%u\n", ha->ip_config.ipv6_flow_lbl); in qla4xxx_get_iface_param()
1523 ha->ip_config.ipv6_traffic_class); in qla4xxx_get_iface_param()
1527 ha->ip_config.ipv6_hop_limit); in qla4xxx_get_iface_param()
1531 ha->ip_config.ipv6_nd_reach_time); in qla4xxx_get_iface_param()
1535 ha->ip_config.ipv6_nd_rexmit_timer); in qla4xxx_get_iface_param()
1539 ha->ip_config.ipv6_nd_stale_timeout); in qla4xxx_get_iface_param()
1543 ha->ip_config.ipv6_dup_addr_detect_count); in qla4xxx_get_iface_param()
1547 ha->ip_config.ipv6_gw_advrt_mtu); in qla4xxx_get_iface_param()
1555 len = sprintf(buf, "%d\n", ha->ip_config.def_timeout); in qla4xxx_get_iface_param()
1558 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1564 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1570 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1576 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1582 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1588 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1595 (ha->ip_config.iscsi_options & in qla4xxx_get_iface_param()
1600 ha->ip_config.iscsi_max_pdu_size * in qla4xxx_get_iface_param()
1605 ha->ip_config.iscsi_first_burst_len * in qla4xxx_get_iface_param()
1610 ha->ip_config.iscsi_max_outstnd_r2t); in qla4xxx_get_iface_param()
1614 ha->ip_config.iscsi_max_burst_len * 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()
1642 OP_STATE(ha->ip_config.iscsi_options, in qla4xxx_get_iface_param()
1648 len = sprintf(buf, "%s\n", ha->ip_config.iscsi_name); in qla4xxx_get_iface_param()
1665 struct scsi_qla_host *ha; in qla4xxx_ep_connect() local
1675 ha = iscsi_host_priv(shost); in qla4xxx_ep_connect()
1687 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI4\n", __func__, in qla4xxx_ep_connect()
1693 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI6\n", __func__, in qla4xxx_ep_connect()
1696 ql4_printk(KERN_WARNING, ha, "%s: Invalid endpoint\n", in qla4xxx_ep_connect()
1708 struct scsi_qla_host *ha; in qla4xxx_ep_poll() local
1712 ha = to_qla_host(qla_ep->host); in qla4xxx_ep_poll()
1713 DEBUG2(pr_info_ratelimited("%s: host: %ld\n", __func__, ha->host_no)); in qla4xxx_ep_poll()
1715 if (adapter_up(ha) && !test_bit(AF_BUILD_DDB_LIST, &ha->flags)) in qla4xxx_ep_poll()
1724 struct scsi_qla_host *ha; in qla4xxx_ep_disconnect() local
1727 ha = to_qla_host(qla_ep->host); in qla4xxx_ep_disconnect()
1728 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_ep_disconnect()
1729 ha->host_no)); in qla4xxx_ep_disconnect()
1739 struct scsi_qla_host *ha; in qla4xxx_get_ep_param() local
1744 ha = to_qla_host(qla_ep->host); in qla4xxx_get_ep_param()
1745 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_get_ep_param()
1746 ha->host_no)); in qla4xxx_get_ep_param()
1768 struct scsi_qla_host *ha; in qla4xxx_conn_get_stats() local
1777 ha = ddb_entry->ha; in qla4xxx_conn_get_stats()
1779 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_conn_get_stats()
1780 ha->host_no)); in qla4xxx_conn_get_stats()
1783 ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size, in qla4xxx_conn_get_stats()
1786 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_get_stats()
1791 ret = qla4xxx_get_mgmt_data(ha, ddb_entry->fw_ddb_index, stats_size, in qla4xxx_conn_get_stats()
1794 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_get_stats()
1824 dma_free_coherent(&ha->pdev->dev, stats_size, ql_iscsi_stats, in qla4xxx_conn_get_stats()
1850 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_port_speed() local
1854 qla4xxx_get_firmware_state(ha); in qla4xxx_set_port_speed()
1856 switch (ha->addl_fw_state & 0x0F00) { in qla4xxx_set_port_speed()
1875 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_set_port_state() local
1879 if (test_bit(AF_LINK_UP, &ha->flags)) in qla4xxx_set_port_state()
1888 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_host_get_param() local
1893 len = sysfs_format_mac(buf, ha->my_mac, MAC_ADDR_LEN); in qla4xxx_host_get_param()
1896 len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address); in qla4xxx_host_get_param()
1899 len = sprintf(buf, "%s\n", ha->name_string); in qla4xxx_host_get_param()
1916 static void qla4xxx_create_ipv4_iface(struct scsi_qla_host *ha) in qla4xxx_create_ipv4_iface() argument
1918 if (ha->iface_ipv4) in qla4xxx_create_ipv4_iface()
1922 ha->iface_ipv4 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv4_iface()
1925 if (!ha->iface_ipv4) in qla4xxx_create_ipv4_iface()
1926 ql4_printk(KERN_ERR, ha, "Could not create IPv4 iSCSI " in qla4xxx_create_ipv4_iface()
1930 static void qla4xxx_create_ipv6_iface(struct scsi_qla_host *ha) in qla4xxx_create_ipv6_iface() argument
1932 if (!ha->iface_ipv6_0) in qla4xxx_create_ipv6_iface()
1934 ha->iface_ipv6_0 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv6_iface()
1938 if (!ha->iface_ipv6_0) in qla4xxx_create_ipv6_iface()
1939 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " in qla4xxx_create_ipv6_iface()
1942 if (!ha->iface_ipv6_1) in qla4xxx_create_ipv6_iface()
1944 ha->iface_ipv6_1 = iscsi_create_iface(ha->host, in qla4xxx_create_ipv6_iface()
1948 if (!ha->iface_ipv6_1) in qla4xxx_create_ipv6_iface()
1949 ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI " in qla4xxx_create_ipv6_iface()
1953 static void qla4xxx_create_ifaces(struct scsi_qla_host *ha) in qla4xxx_create_ifaces() argument
1955 if (ha->ip_config.ipv4_options & IPOPT_IPV4_PROTOCOL_ENABLE) in qla4xxx_create_ifaces()
1956 qla4xxx_create_ipv4_iface(ha); in qla4xxx_create_ifaces()
1958 if (ha->ip_config.ipv6_options & IPV6_OPT_IPV6_PROTOCOL_ENABLE) in qla4xxx_create_ifaces()
1959 qla4xxx_create_ipv6_iface(ha); in qla4xxx_create_ifaces()
1962 static void qla4xxx_destroy_ipv4_iface(struct scsi_qla_host *ha) in qla4xxx_destroy_ipv4_iface() argument
1964 if (ha->iface_ipv4) { in qla4xxx_destroy_ipv4_iface()
1965 iscsi_destroy_iface(ha->iface_ipv4); in qla4xxx_destroy_ipv4_iface()
1966 ha->iface_ipv4 = NULL; in qla4xxx_destroy_ipv4_iface()
1970 static void qla4xxx_destroy_ipv6_iface(struct scsi_qla_host *ha) in qla4xxx_destroy_ipv6_iface() argument
1972 if (ha->iface_ipv6_0) { in qla4xxx_destroy_ipv6_iface()
1973 iscsi_destroy_iface(ha->iface_ipv6_0); in qla4xxx_destroy_ipv6_iface()
1974 ha->iface_ipv6_0 = NULL; in qla4xxx_destroy_ipv6_iface()
1976 if (ha->iface_ipv6_1) { in qla4xxx_destroy_ipv6_iface()
1977 iscsi_destroy_iface(ha->iface_ipv6_1); in qla4xxx_destroy_ipv6_iface()
1978 ha->iface_ipv6_1 = NULL; in qla4xxx_destroy_ipv6_iface()
1982 static void qla4xxx_destroy_ifaces(struct scsi_qla_host *ha) in qla4xxx_destroy_ifaces() argument
1984 qla4xxx_destroy_ipv4_iface(ha); in qla4xxx_destroy_ifaces()
1985 qla4xxx_destroy_ipv6_iface(ha); in qla4xxx_destroy_ifaces()
1988 static void qla4xxx_set_ipv6(struct scsi_qla_host *ha, in qla4xxx_set_ipv6() argument
2033 ql4_printk(KERN_ERR, ha, in qla4xxx_set_ipv6()
2050 ql4_printk(KERN_ERR, ha, in qla4xxx_set_ipv6()
2066 qla4xxx_create_ipv6_iface(ha); in qla4xxx_set_ipv6()
2071 qla4xxx_destroy_ipv6_iface(ha); in qla4xxx_set_ipv6()
2231 ql4_printk(KERN_ERR, ha, "Unknown IPv6 param = %d\n", in qla4xxx_set_ipv6()
2237 static void qla4xxx_set_ipv4(struct scsi_qla_host *ha, in qla4xxx_set_ipv4() argument
2262 ql4_printk(KERN_ERR, ha, "Invalid IPv4 bootproto\n"); in qla4xxx_set_ipv4()
2268 qla4xxx_create_ipv4_iface(ha); in qla4xxx_set_ipv4()
2273 qla4xxx_destroy_ipv4_iface(ha); in qla4xxx_set_ipv4()
2489 ql4_printk(KERN_ERR, ha, "Unknown IPv4 param = %d\n", in qla4xxx_set_ipv4()
2495 static void qla4xxx_set_iscsi_param(struct scsi_qla_host *ha, in qla4xxx_set_iscsi_param() argument
2651 ql4_printk(KERN_ERR, ha, "Unknown iscsi param = %d\n", in qla4xxx_set_iscsi_param()
2682 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_iface_set_param() local
2692 init_fw_cb = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_iface_set_param()
2696 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc init_cb\n", in qla4xxx_iface_set_param()
2705 if (qla4xxx_get_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma)) { in qla4xxx_iface_set_param()
2706 ql4_printk(KERN_ERR, ha, "%s: get ifcb failed\n", __func__); in qla4xxx_iface_set_param()
2719 qla4xxx_set_ipv4(ha, iface_param, in qla4xxx_iface_set_param()
2724 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2734 qla4xxx_set_ipv6(ha, iface_param, in qla4xxx_iface_set_param()
2739 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2746 ql4_printk(KERN_ERR, ha, in qla4xxx_iface_set_param()
2751 qla4xxx_set_iscsi_param(ha, iface_param, in qla4xxx_iface_set_param()
2760 rval = qla4xxx_set_flash(ha, init_fw_cb_dma, FLASH_SEGMENT_IFCB, in qla4xxx_iface_set_param()
2764 ql4_printk(KERN_ERR, ha, "%s: set flash mbx failed\n", in qla4xxx_iface_set_param()
2770 rval = qla4xxx_disable_acb(ha); in qla4xxx_iface_set_param()
2772 ql4_printk(KERN_ERR, ha, "%s: disable acb mbx failed\n", in qla4xxx_iface_set_param()
2778 wait_for_completion_timeout(&ha->disable_acb_comp, in qla4xxx_iface_set_param()
2783 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma); in qla4xxx_iface_set_param()
2785 ql4_printk(KERN_ERR, ha, "%s: set acb mbx failed\n", in qla4xxx_iface_set_param()
2792 qla4xxx_update_local_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb, in qla4xxx_iface_set_param()
2796 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk), in qla4xxx_iface_set_param()
2807 struct scsi_qla_host *ha = ddb_entry->ha; in qla4xxx_session_get_param() local
2816 rval = qla4xxx_get_chap_index(ha, sess->username_in, in qla4xxx_session_get_param()
2833 rval = qla4xxx_get_chap_index(ha, sess->username, in qla4xxx_session_get_param()
2852 rval = qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, in qla4xxx_session_get_param()
2893 int qla4xxx_get_ddb_index(struct scsi_qla_host *ha, uint16_t *ddb_index) in qla4xxx_get_ddb_index() argument
2900 tmp_ddb_index = find_first_zero_bit(ha->ddb_idx_map, MAX_DDB_ENTRIES); in qla4xxx_get_ddb_index()
2903 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2909 if (test_and_set_bit(tmp_ddb_index, ha->ddb_idx_map)) in qla4xxx_get_ddb_index()
2912 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2914 ret = qla4xxx_req_ddb_entry(ha, tmp_ddb_index, &mbx_sts); in qla4xxx_get_ddb_index()
2917 ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2922 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_ddb_index()
2932 static int qla4xxx_match_ipaddress(struct scsi_qla_host *ha, in qla4xxx_match_ipaddress() argument
2966 static int qla4xxx_match_fwdb_session(struct scsi_qla_host *ha, in qla4xxx_match_fwdb_session() argument
2983 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_match_fwdb_session()
2987 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_match_fwdb_session()
3002 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3007 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3012 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3019 rval = qla4xxx_match_ipaddress(ha, ddb_entry, in qla4xxx_match_fwdb_session()
3032 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_match_fwdb_session()
3043 struct scsi_qla_host *ha; in qla4xxx_session_create() local
3058 ha = to_qla_host(qla_ep->host); in qla4xxx_session_create()
3059 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_session_create()
3060 ha->host_no)); in qla4xxx_session_create()
3062 ret = qla4xxx_get_ddb_index(ha, &ddb_index); in qla4xxx_session_create()
3077 ddb_entry->ha = ha; in qla4xxx_session_create()
3083 ha->fw_ddb_index_map[ddb_entry->fw_ddb_index] = ddb_entry; in qla4xxx_session_create()
3084 ha->tot_ddbs++; in qla4xxx_session_create()
3093 struct scsi_qla_host *ha; in qla4xxx_session_destroy() local
3102 ha = ddb_entry->ha; in qla4xxx_session_destroy()
3103 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: host: %ld\n", __func__, in qla4xxx_session_destroy()
3104 ha->host_no)); in qla4xxx_session_destroy()
3106 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_session_destroy()
3109 ql4_printk(KERN_ERR, ha, in qla4xxx_session_destroy()
3116 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_session_destroy()
3131 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_session_destroy()
3133 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); in qla4xxx_session_destroy()
3134 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_session_destroy()
3135 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_session_destroy()
3136 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_session_destroy()
3141 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_session_destroy()
3151 struct scsi_qla_host *ha; in qla4xxx_conn_create() local
3165 ha = ddb_entry->ha; in qla4xxx_conn_create()
3166 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: conn_idx = %u\n", __func__, in qla4xxx_conn_create()
3179 struct scsi_qla_host *ha; in qla4xxx_conn_bind() local
3184 ha = ddb_entry->ha; in qla4xxx_conn_bind()
3186 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, in qla4xxx_conn_bind()
3203 struct scsi_qla_host *ha; in qla4xxx_conn_start() local
3212 ha = ddb_entry->ha; in qla4xxx_conn_start()
3213 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: sid = %d, cid = %d\n", __func__, in qla4xxx_conn_start()
3220 ret = qla4xxx_match_fwdb_session(ha, cls_conn); in qla4xxx_conn_start()
3222 ql4_printk(KERN_INFO, ha, in qla4xxx_conn_start()
3228 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_conn_start()
3231 ql4_printk(KERN_ERR, ha, in qla4xxx_conn_start()
3237 ret = qla4xxx_set_param_ddbentry(ha, ddb_entry, cls_conn, &mbx_sts); in qla4xxx_conn_start()
3251 ql4_printk(KERN_ERR, ha, "%s: Failed set param for index[%d]\n", in qla4xxx_conn_start()
3256 status = qla4xxx_conn_open(ha, ddb_entry->fw_ddb_index); in qla4xxx_conn_start()
3258 ql4_printk(KERN_ERR, ha, "%s: Login failed: %s\n", __func__, in qla4xxx_conn_start()
3275 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_conn_start()
3284 struct scsi_qla_host *ha; in qla4xxx_conn_destroy() local
3290 ha = ddb_entry->ha; in qla4xxx_conn_destroy()
3291 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: cid = %d\n", __func__, in qla4xxx_conn_destroy()
3295 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) in qla4xxx_conn_destroy()
3296 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); in qla4xxx_conn_destroy()
3302 struct scsi_qla_host *ha; in qla4xxx_task_work() local
3313 ha = task_data->ha; in qla4xxx_task_work()
3336 ql4_printk(KERN_ERR, ha, "Passthru failed status = 0x%x\n", in qla4xxx_task_work()
3348 struct scsi_qla_host *ha; in qla4xxx_alloc_pdu() local
3353 ha = ddb_entry->ha; in qla4xxx_alloc_pdu()
3358 ql4_printk(KERN_INFO, ha, in qla4xxx_alloc_pdu()
3364 task_data->ha = ha; in qla4xxx_alloc_pdu()
3368 task_data->data_dma = dma_map_single(&ha->pdev->dev, task->data, in qla4xxx_alloc_pdu()
3373 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", in qla4xxx_alloc_pdu()
3377 task_data->resp_buffer = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_alloc_pdu()
3385 task_data->req_buffer = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_alloc_pdu()
3400 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, in qla4xxx_alloc_pdu()
3404 dma_free_coherent(&ha->pdev->dev, task_data->req_len, in qla4xxx_alloc_pdu()
3414 struct scsi_qla_host *ha; in qla4xxx_task_cleanup() local
3420 ha = ddb_entry->ha; in qla4xxx_task_cleanup()
3424 dma_unmap_single(&ha->pdev->dev, task_data->data_dma, in qla4xxx_task_cleanup()
3428 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", in qla4xxx_task_cleanup()
3431 dma_free_coherent(&ha->pdev->dev, task_data->resp_len, in qla4xxx_task_cleanup()
3433 dma_free_coherent(&ha->pdev->dev, task_data->req_len, in qla4xxx_task_cleanup()
3443 struct scsi_qla_host *ha = ddb_entry->ha; in qla4xxx_task_xmit() local
3448 ql4_printk(KERN_INFO, ha, "%s: scsi cmd xmit not implemented\n", in qla4xxx_task_xmit()
3801 static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha, in qla4xxx_copy_fwddb_param() argument
3843 (char *)ha->name_string, buflen); in qla4xxx_copy_fwddb_param()
3846 if (!qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name, in qla4xxx_copy_fwddb_param()
3859 void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha, in qla4xxx_update_session_conn_fwddb_param() argument
3868 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_fwddb_param()
3871 ql4_printk(KERN_ERR, ha, in qla4xxx_update_session_conn_fwddb_param()
3876 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, in qla4xxx_update_session_conn_fwddb_param()
3879 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " in qla4xxx_update_session_conn_fwddb_param()
3881 ha->host_no, __func__, in qla4xxx_update_session_conn_fwddb_param()
3891 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); in qla4xxx_update_session_conn_fwddb_param()
3895 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_fwddb_param()
3899 void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, in qla4xxx_update_session_conn_param() argument
3910 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_param()
3913 ql4_printk(KERN_ERR, ha, in qla4xxx_update_session_conn_param()
3918 if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, in qla4xxx_update_session_conn_param()
3921 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " in qla4xxx_update_session_conn_param()
3923 ha->host_no, __func__, in qla4xxx_update_session_conn_param()
3946 memcpy(sess->initiatorname, ha->name_string, in qla4xxx_update_session_conn_param()
3947 min(sizeof(ha->name_string), sizeof(sess->initiatorname))); in qla4xxx_update_session_conn_param()
3951 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_update_session_conn_param()
3959 static void qla4xxx_start_timer(struct scsi_qla_host *ha, void *func, in qla4xxx_start_timer() argument
3963 __func__, ha->host->host_no)); in qla4xxx_start_timer()
3964 init_timer(&ha->timer); in qla4xxx_start_timer()
3965 ha->timer.expires = jiffies + interval * HZ; in qla4xxx_start_timer()
3966 ha->timer.data = (unsigned long)ha; in qla4xxx_start_timer()
3967 ha->timer.function = (void (*)(unsigned long))func; in qla4xxx_start_timer()
3968 add_timer(&ha->timer); in qla4xxx_start_timer()
3969 ha->timer_active = 1; in qla4xxx_start_timer()
3972 static void qla4xxx_stop_timer(struct scsi_qla_host *ha) in qla4xxx_stop_timer() argument
3974 del_timer_sync(&ha->timer); in qla4xxx_stop_timer()
3975 ha->timer_active = 0; in qla4xxx_stop_timer()
3996 void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha) in qla4xxx_mark_all_devices_missing() argument
3998 iscsi_host_for_each_session(ha->host, qla4xxx_mark_device_missing); in qla4xxx_mark_all_devices_missing()
4001 static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha, in qla4xxx_get_new_srb() argument
4007 srb = mempool_alloc(ha->srb_mempool, GFP_ATOMIC); in qla4xxx_get_new_srb()
4012 srb->ha = ha; in qla4xxx_get_new_srb()
4021 static void qla4xxx_srb_free_dma(struct scsi_qla_host *ha, struct srb *srb) in qla4xxx_srb_free_dma() argument
4036 struct scsi_qla_host *ha = srb->ha; in qla4xxx_srb_compl() local
4038 qla4xxx_srb_free_dma(ha, srb); in qla4xxx_srb_compl()
4040 mempool_free(srb, ha->srb_mempool); in qla4xxx_srb_compl()
4060 struct scsi_qla_host *ha = to_qla_host(host); in qla4xxx_queuecommand() local
4066 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_queuecommand()
4067 if (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags)) in qla4xxx_queuecommand()
4085 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_queuecommand()
4086 test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || in qla4xxx_queuecommand()
4087 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_queuecommand()
4088 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || in qla4xxx_queuecommand()
4089 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || in qla4xxx_queuecommand()
4090 !test_bit(AF_ONLINE, &ha->flags) || in qla4xxx_queuecommand()
4091 !test_bit(AF_LINK_UP, &ha->flags) || in qla4xxx_queuecommand()
4092 test_bit(AF_LOOPBACK, &ha->flags) || in qla4xxx_queuecommand()
4093 test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags) || in qla4xxx_queuecommand()
4094 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags) || in qla4xxx_queuecommand()
4095 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) in qla4xxx_queuecommand()
4098 srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd); in qla4xxx_queuecommand()
4102 rval = qla4xxx_send_command_to_isp(ha, srb); in qla4xxx_queuecommand()
4109 qla4xxx_srb_free_dma(ha, srb); in qla4xxx_queuecommand()
4110 mempool_free(srb, ha->srb_mempool); in qla4xxx_queuecommand()
4127 static void qla4xxx_mem_free(struct scsi_qla_host *ha) in qla4xxx_mem_free() argument
4129 if (ha->queues) in qla4xxx_mem_free()
4130 dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues, in qla4xxx_mem_free()
4131 ha->queues_dma); in qla4xxx_mem_free()
4133 if (ha->fw_dump) in qla4xxx_mem_free()
4134 vfree(ha->fw_dump); in qla4xxx_mem_free()
4136 ha->queues_len = 0; in qla4xxx_mem_free()
4137 ha->queues = NULL; in qla4xxx_mem_free()
4138 ha->queues_dma = 0; in qla4xxx_mem_free()
4139 ha->request_ring = NULL; in qla4xxx_mem_free()
4140 ha->request_dma = 0; in qla4xxx_mem_free()
4141 ha->response_ring = NULL; in qla4xxx_mem_free()
4142 ha->response_dma = 0; in qla4xxx_mem_free()
4143 ha->shadow_regs = NULL; in qla4xxx_mem_free()
4144 ha->shadow_regs_dma = 0; in qla4xxx_mem_free()
4145 ha->fw_dump = NULL; in qla4xxx_mem_free()
4146 ha->fw_dump_size = 0; in qla4xxx_mem_free()
4149 if (ha->srb_mempool) in qla4xxx_mem_free()
4150 mempool_destroy(ha->srb_mempool); in qla4xxx_mem_free()
4152 ha->srb_mempool = NULL; in qla4xxx_mem_free()
4154 if (ha->chap_dma_pool) in qla4xxx_mem_free()
4155 dma_pool_destroy(ha->chap_dma_pool); in qla4xxx_mem_free()
4157 if (ha->chap_list) in qla4xxx_mem_free()
4158 vfree(ha->chap_list); in qla4xxx_mem_free()
4159 ha->chap_list = NULL; in qla4xxx_mem_free()
4161 if (ha->fw_ddb_dma_pool) in qla4xxx_mem_free()
4162 dma_pool_destroy(ha->fw_ddb_dma_pool); in qla4xxx_mem_free()
4165 if (is_qla8022(ha)) { in qla4xxx_mem_free()
4166 if (ha->nx_pcibase) in qla4xxx_mem_free()
4168 (struct device_reg_82xx __iomem *)ha->nx_pcibase); in qla4xxx_mem_free()
4169 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_mem_free()
4170 if (ha->nx_pcibase) in qla4xxx_mem_free()
4172 (struct device_reg_83xx __iomem *)ha->nx_pcibase); in qla4xxx_mem_free()
4173 } else if (ha->reg) { in qla4xxx_mem_free()
4174 iounmap(ha->reg); in qla4xxx_mem_free()
4177 if (ha->reset_tmplt.buff) in qla4xxx_mem_free()
4178 vfree(ha->reset_tmplt.buff); in qla4xxx_mem_free()
4180 pci_release_regions(ha->pdev); in qla4xxx_mem_free()
4190 static int qla4xxx_mem_alloc(struct scsi_qla_host *ha) in qla4xxx_mem_alloc() argument
4195 ha->queues_len = ((REQUEST_QUEUE_DEPTH * QUEUE_SIZE) + in qla4xxx_mem_alloc()
4200 ha->queues = dma_alloc_coherent(&ha->pdev->dev, ha->queues_len, in qla4xxx_mem_alloc()
4201 &ha->queues_dma, GFP_KERNEL); in qla4xxx_mem_alloc()
4202 if (ha->queues == NULL) { in qla4xxx_mem_alloc()
4203 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4208 memset(ha->queues, 0, ha->queues_len); in qla4xxx_mem_alloc()
4215 if ((unsigned long)ha->queues_dma & (MEM_ALIGN_VALUE - 1)) in qla4xxx_mem_alloc()
4216 align = MEM_ALIGN_VALUE - ((unsigned long)ha->queues_dma & in qla4xxx_mem_alloc()
4220 ha->request_dma = ha->queues_dma + align; in qla4xxx_mem_alloc()
4221 ha->request_ring = (struct queue_entry *) (ha->queues + align); in qla4xxx_mem_alloc()
4222 ha->response_dma = ha->queues_dma + align + in qla4xxx_mem_alloc()
4224 ha->response_ring = (struct queue_entry *) (ha->queues + align + in qla4xxx_mem_alloc()
4227 ha->shadow_regs_dma = ha->queues_dma + align + in qla4xxx_mem_alloc()
4230 ha->shadow_regs = (struct shadow_regs *) (ha->queues + align + in qla4xxx_mem_alloc()
4237 ha->srb_mempool = mempool_create(SRB_MIN_REQ, mempool_alloc_slab, in qla4xxx_mem_alloc()
4239 if (ha->srb_mempool == NULL) { in qla4xxx_mem_alloc()
4240 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4246 ha->chap_dma_pool = dma_pool_create("ql4_chap", &ha->pdev->dev, in qla4xxx_mem_alloc()
4249 if (ha->chap_dma_pool == NULL) { in qla4xxx_mem_alloc()
4250 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4255 ha->fw_ddb_dma_pool = dma_pool_create("ql4_fw_ddb", &ha->pdev->dev, in qla4xxx_mem_alloc()
4258 if (ha->fw_ddb_dma_pool == NULL) { in qla4xxx_mem_alloc()
4259 ql4_printk(KERN_WARNING, ha, in qla4xxx_mem_alloc()
4268 qla4xxx_mem_free(ha); in qla4xxx_mem_alloc()
4278 static int qla4_8xxx_check_temp(struct scsi_qla_host *ha) in qla4_8xxx_check_temp() argument
4283 temp = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_TEMP_STATE); in qla4_8xxx_check_temp()
4289 ql4_printk(KERN_WARNING, ha, "Device temperature %d degrees C" in qla4_8xxx_check_temp()
4294 if (ha->temperature == QLA82XX_TEMP_NORMAL) in qla4_8xxx_check_temp()
4295 ql4_printk(KERN_WARNING, ha, "Device temperature %d" in qla4_8xxx_check_temp()
4299 if (ha->temperature == QLA82XX_TEMP_WARN) in qla4_8xxx_check_temp()
4300 ql4_printk(KERN_INFO, ha, "Device temperature is" in qla4_8xxx_check_temp()
4304 ha->temperature = temp_state; in qla4_8xxx_check_temp()
4314 static int qla4_8xxx_check_fw_alive(struct scsi_qla_host *ha) in qla4_8xxx_check_fw_alive() argument
4319 fw_heartbeat_counter = qla4_8xxx_rd_direct(ha, in qla4_8xxx_check_fw_alive()
4325 ha->host_no, __func__)); in qla4_8xxx_check_fw_alive()
4329 if (ha->fw_heartbeat_counter == fw_heartbeat_counter) { in qla4_8xxx_check_fw_alive()
4330 ha->seconds_since_last_heartbeat++; in qla4_8xxx_check_fw_alive()
4332 if (ha->seconds_since_last_heartbeat == 2) { in qla4_8xxx_check_fw_alive()
4333 ha->seconds_since_last_heartbeat = 0; in qla4_8xxx_check_fw_alive()
4334 qla4_8xxx_dump_peg_reg(ha); in qla4_8xxx_check_fw_alive()
4338 ha->seconds_since_last_heartbeat = 0; in qla4_8xxx_check_fw_alive()
4340 ha->fw_heartbeat_counter = fw_heartbeat_counter; in qla4_8xxx_check_fw_alive()
4344 static void qla4_8xxx_process_fw_error(struct scsi_qla_host *ha) in qla4_8xxx_process_fw_error() argument
4349 halt_status = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_HALT_STATUS1); in qla4_8xxx_process_fw_error()
4351 if (is_qla8022(ha)) { in qla4_8xxx_process_fw_error()
4352 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4_8xxx_process_fw_error()
4354 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, in qla4_8xxx_process_fw_error()
4359 …ql4_printk(KERN_ERR, ha, "%s: Firmware aborted with error code 0x00006700. Device is being reset\n… in qla4_8xxx_process_fw_error()
4363 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_process_fw_error()
4365 ql4_printk(KERN_ERR, ha, "%s: Firmware error detected device is being reset\n", in qla4_8xxx_process_fw_error()
4376 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); in qla4_8xxx_process_fw_error()
4378 ql4_printk(KERN_INFO, ha, "%s: detect abort needed!\n", in qla4_8xxx_process_fw_error()
4380 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4_8xxx_process_fw_error()
4382 qla4xxx_mailbox_premature_completion(ha); in qla4_8xxx_process_fw_error()
4383 qla4xxx_wake_dpc(ha); in qla4_8xxx_process_fw_error()
4392 void qla4_8xxx_watchdog(struct scsi_qla_host *ha) in qla4_8xxx_watchdog() argument
4397 if (is_qla8032(ha) && in qla4_8xxx_watchdog()
4398 (qla4_83xx_is_detached(ha) == QLA_SUCCESS)) in qla4_8xxx_watchdog()
4400 __func__, ha->func_num); in qla4_8xxx_watchdog()
4403 if (!(test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) || in qla4_8xxx_watchdog()
4404 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4_8xxx_watchdog()
4405 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags))) { in qla4_8xxx_watchdog()
4406 dev_state = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE); in qla4_8xxx_watchdog()
4408 if (qla4_8xxx_check_temp(ha)) { in qla4_8xxx_watchdog()
4409 if (is_qla8022(ha)) { in qla4_8xxx_watchdog()
4410 ql4_printk(KERN_INFO, ha, "disabling pause transmit on port 0 & 1.\n"); in qla4_8xxx_watchdog()
4411 qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, in qla4_8xxx_watchdog()
4415 set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags); in qla4_8xxx_watchdog()
4416 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4418 !test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4_8xxx_watchdog()
4420 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED RESET!\n", in qla4_8xxx_watchdog()
4423 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_watchdog()
4424 idc_ctrl = qla4_83xx_rd_reg(ha, in qla4_8xxx_watchdog()
4427 ql4_printk(KERN_INFO, ha, "%s: Graceful reset bit is not set\n", in qla4_8xxx_watchdog()
4430 ha); in qla4_8xxx_watchdog()
4434 if ((is_qla8032(ha) || is_qla8042(ha)) || in qla4_8xxx_watchdog()
4435 (is_qla8022(ha) && !ql4xdontresethba)) { in qla4_8xxx_watchdog()
4436 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4_8xxx_watchdog()
4437 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4440 !test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { in qla4_8xxx_watchdog()
4441 ql4_printk(KERN_INFO, ha, "%s: HW State: NEED QUIES!\n", in qla4_8xxx_watchdog()
4443 set_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags); in qla4_8xxx_watchdog()
4444 qla4xxx_wake_dpc(ha); in qla4_8xxx_watchdog()
4447 if (qla4_8xxx_check_fw_alive(ha)) in qla4_8xxx_watchdog()
4448 qla4_8xxx_process_fw_error(ha); in qla4_8xxx_watchdog()
4457 struct scsi_qla_host *ha; in qla4xxx_check_relogin_flash_ddb() local
4461 ha = ddb_entry->ha; in qla4xxx_check_relogin_flash_ddb()
4466 if (adapter_up(ha) && !test_bit(DF_RELOGIN, &ddb_entry->flags) && in qla4xxx_check_relogin_flash_ddb()
4474 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_check_relogin_flash_ddb()
4476 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_check_relogin_flash_ddb()
4494 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_check_relogin_flash_ddb()
4500 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_check_relogin_flash_ddb()
4511 static void qla4xxx_timer(struct scsi_qla_host *ha) in qla4xxx_timer() argument
4516 iscsi_host_for_each_session(ha->host, qla4xxx_check_relogin_flash_ddb); in qla4xxx_timer()
4521 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_timer()
4522 mod_timer(&ha->timer, jiffies + HZ); in qla4xxx_timer()
4527 if (!pci_channel_offline(ha->pdev)) in qla4xxx_timer()
4528 pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w); in qla4xxx_timer()
4530 if (is_qla80XX(ha)) in qla4xxx_timer()
4531 qla4_8xxx_watchdog(ha); in qla4xxx_timer()
4533 if (is_qla40XX(ha)) { in qla4xxx_timer()
4535 if (ha->firmware_options & FWOPT_HEARTBEAT_ENABLE && in qla4xxx_timer()
4536 ha->heartbeat_interval != 0) { in qla4xxx_timer()
4537 ha->seconds_since_last_heartbeat++; in qla4xxx_timer()
4538 if (ha->seconds_since_last_heartbeat > in qla4xxx_timer()
4539 ha->heartbeat_interval + 2) in qla4xxx_timer()
4540 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_timer()
4545 if (!list_empty(&ha->work_list)) in qla4xxx_timer()
4550 test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_timer()
4551 test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags) || in qla4xxx_timer()
4552 test_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags) || in qla4xxx_timer()
4553 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || in qla4xxx_timer()
4554 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_timer()
4555 test_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags) || in qla4xxx_timer()
4556 test_bit(DPC_LINK_CHANGED, &ha->dpc_flags) || in qla4xxx_timer()
4557 test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) || in qla4xxx_timer()
4558 test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || in qla4xxx_timer()
4559 test_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags) || in qla4xxx_timer()
4560 test_bit(DPC_AEN, &ha->dpc_flags)) { in qla4xxx_timer()
4563 ha->host_no, __func__, ha->dpc_flags)); in qla4xxx_timer()
4564 qla4xxx_wake_dpc(ha); in qla4xxx_timer()
4568 mod_timer(&ha->timer, jiffies + HZ); in qla4xxx_timer()
4570 DEBUG2(ha->seconds_since_last_intr++); in qla4xxx_timer()
4580 static int qla4xxx_cmd_wait(struct scsi_qla_host *ha) in qla4xxx_cmd_wait() argument
4588 if (is_qla40XX(ha)) in qla4xxx_cmd_wait()
4591 wtmo = ha->nx_reset_timeout / 2; in qla4xxx_cmd_wait()
4595 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_cmd_wait()
4600 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_cmd_wait()
4602 for (index = 0; index < ha->host->can_queue; index++) { in qla4xxx_cmd_wait()
4603 cmd = scsi_host_find_tag(ha->host, index); in qla4xxx_cmd_wait()
4613 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_cmd_wait()
4616 if (index == ha->host->can_queue) in qla4xxx_cmd_wait()
4626 int qla4xxx_hw_reset(struct scsi_qla_host *ha) in qla4xxx_hw_reset() argument
4631 DEBUG2(printk(KERN_ERR "scsi%ld: %s\n", ha->host_no, __func__)); in qla4xxx_hw_reset()
4633 if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS) in qla4xxx_hw_reset()
4636 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_hw_reset()
4642 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_hw_reset()
4644 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_hw_reset()
4647 writel(set_rmask(CSR_SOFT_RESET), &ha->reg->ctrl_status); in qla4xxx_hw_reset()
4648 readl(&ha->reg->ctrl_status); in qla4xxx_hw_reset()
4650 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_hw_reset()
4658 int qla4xxx_soft_reset(struct scsi_qla_host *ha) in qla4xxx_soft_reset() argument
4665 status = qla4xxx_hw_reset(ha); in qla4xxx_soft_reset()
4673 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4674 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4675 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4687 ha->host_no)); in qla4xxx_soft_reset()
4688 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4689 writel(set_rmask(CSR_NET_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4690 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4691 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4697 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4698 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4699 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4713 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4714 ctrl_status = readw(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4716 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4717 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4719 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4729 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
4730 writel(set_rmask(CSR_FORCE_SOFT_RESET), &ha->reg->ctrl_status); in qla4xxx_soft_reset()
4731 readl(&ha->reg->ctrl_status); in qla4xxx_soft_reset()
4732 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_soft_reset()
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()
4762 static void qla4xxx_abort_active_cmds(struct scsi_qla_host *ha, int res) in qla4xxx_abort_active_cmds() argument
4768 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_abort_active_cmds()
4769 for (i = 0; i < ha->host->can_queue; i++) { in qla4xxx_abort_active_cmds()
4770 srb = qla4xxx_del_from_active_array(ha, i); in qla4xxx_abort_active_cmds()
4776 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_abort_active_cmds()
4779 void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha) in qla4xxx_dead_adapter_cleanup() argument
4781 clear_bit(AF_ONLINE, &ha->flags); in qla4xxx_dead_adapter_cleanup()
4784 ql4_printk(KERN_INFO, ha, "Disabling the board\n"); in qla4xxx_dead_adapter_cleanup()
4786 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_dead_adapter_cleanup()
4787 qla4xxx_mark_all_devices_missing(ha); in qla4xxx_dead_adapter_cleanup()
4788 clear_bit(AF_INIT_DONE, &ha->flags); in qla4xxx_dead_adapter_cleanup()
4811 static int qla4xxx_recover_adapter(struct scsi_qla_host *ha) in qla4xxx_recover_adapter() argument
4819 scsi_block_requests(ha->host); in qla4xxx_recover_adapter()
4820 clear_bit(AF_ONLINE, &ha->flags); in qla4xxx_recover_adapter()
4821 clear_bit(AF_LINK_UP, &ha->flags); in qla4xxx_recover_adapter()
4823 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: adapter OFFLINE\n", __func__)); in qla4xxx_recover_adapter()
4825 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4xxx_recover_adapter()
4827 if ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_recover_adapter()
4828 !test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4829 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4xxx_recover_adapter()
4832 qla4_83xx_disable_pause(ha); in qla4xxx_recover_adapter()
4835 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); in qla4xxx_recover_adapter()
4837 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_recover_adapter()
4842 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4849 if (is_qla80XX(ha) && !reset_chip && in qla4xxx_recover_adapter()
4850 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4852 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_recover_adapter()
4854 ha->host_no, __func__)); in qla4xxx_recover_adapter()
4855 status = ha->isp_ops->reset_firmware(ha); in qla4xxx_recover_adapter()
4857 ha->isp_ops->disable_intrs(ha); in qla4xxx_recover_adapter()
4858 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4859 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_recover_adapter()
4864 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_recover_adapter()
4865 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4872 if (is_qla40XX(ha) || reset_chip) { in qla4xxx_recover_adapter()
4873 if (is_qla40XX(ha)) in qla4xxx_recover_adapter()
4879 if (test_bit(AF_FW_RECOVERY, &ha->flags)) in qla4xxx_recover_adapter()
4884 if (qla4_8xxx_check_fw_alive(ha)) { in qla4xxx_recover_adapter()
4885 qla4xxx_mailbox_premature_completion(ha); in qla4xxx_recover_adapter()
4893 if (!test_bit(AF_FW_RECOVERY, &ha->flags)) in qla4xxx_recover_adapter()
4894 qla4xxx_cmd_wait(ha); in qla4xxx_recover_adapter()
4896 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4897 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_recover_adapter()
4899 ha->host_no, __func__)); in qla4xxx_recover_adapter()
4900 status = ha->isp_ops->reset_chip(ha); in qla4xxx_recover_adapter()
4901 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_recover_adapter()
4905 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_recover_adapter()
4913 if (is_qla40XX(ha) && (ha->mac_index == 3)) in qla4xxx_recover_adapter()
4918 status = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4xxx_recover_adapter()
4919 if (is_qla80XX(ha) && (status == QLA_ERROR)) { in qla4xxx_recover_adapter()
4920 status = qla4_8xxx_check_init_adapter_retry(ha); in qla4xxx_recover_adapter()
4922 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Don't retry recover adapter\n", in qla4xxx_recover_adapter()
4923 ha->host_no, __func__); in qla4xxx_recover_adapter()
4924 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4925 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4926 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4928 &ha->dpc_flags); in qla4xxx_recover_adapter()
4937 if (!test_bit(AF_ONLINE, &ha->flags) && in qla4xxx_recover_adapter()
4938 !test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4944 if (is_qla80XX(ha)) { in qla4xxx_recover_adapter()
4945 ha->isp_ops->idc_lock(ha); in qla4xxx_recover_adapter()
4946 dev_state = qla4_8xxx_rd_direct(ha, in qla4xxx_recover_adapter()
4948 ha->isp_ops->idc_unlock(ha); in qla4xxx_recover_adapter()
4950 ql4_printk(KERN_INFO, ha, "%s: don't retry " in qla4xxx_recover_adapter()
4953 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4954 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4955 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4957 &ha->dpc_flags); in qla4xxx_recover_adapter()
4964 if (!test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags)) { in qla4xxx_recover_adapter()
4965 ha->retry_reset_ha_cnt = MAX_RESET_HA_RETRIES; in qla4xxx_recover_adapter()
4967 "(%d) more times\n", ha->host_no, in qla4xxx_recover_adapter()
4968 ha->retry_reset_ha_cnt)); in qla4xxx_recover_adapter()
4969 set_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4972 if (ha->retry_reset_ha_cnt > 0) { in qla4xxx_recover_adapter()
4974 ha->retry_reset_ha_cnt--; in qla4xxx_recover_adapter()
4977 ha->host_no, in qla4xxx_recover_adapter()
4978 ha->retry_reset_ha_cnt)); in qla4xxx_recover_adapter()
4982 if (ha->retry_reset_ha_cnt == 0) { in qla4xxx_recover_adapter()
4987 ha->host_no)); in qla4xxx_recover_adapter()
4988 qla4xxx_dead_adapter_cleanup(ha); in qla4xxx_recover_adapter()
4989 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4990 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4992 &ha->dpc_flags); in qla4xxx_recover_adapter()
4997 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
4998 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_recover_adapter()
4999 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags); in qla4xxx_recover_adapter()
5003 ha->adapter_error_count++; in qla4xxx_recover_adapter()
5005 if (test_bit(AF_ONLINE, &ha->flags)) in qla4xxx_recover_adapter()
5006 ha->isp_ops->enable_intrs(ha); in qla4xxx_recover_adapter()
5008 scsi_unblock_requests(ha->host); in qla4xxx_recover_adapter()
5010 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4xxx_recover_adapter()
5011 DEBUG2(printk("scsi%ld: recover adapter: %s\n", ha->host_no, in qla4xxx_recover_adapter()
5021 struct scsi_qla_host *ha; in qla4xxx_relogin_devices() local
5025 ha = ddb_entry->ha; in qla4xxx_relogin_devices()
5028 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_relogin_devices()
5029 " unblock session\n", ha->host_no, __func__, in qla4xxx_relogin_devices()
5050 struct scsi_qla_host *ha; in qla4xxx_unblock_flash_ddb() local
5054 ha = ddb_entry->ha; in qla4xxx_unblock_flash_ddb()
5055 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_flash_ddb()
5056 " unblock session\n", ha->host_no, __func__, in qla4xxx_unblock_flash_ddb()
5062 if (test_bit(AF_ONLINE, &ha->flags)) { in qla4xxx_unblock_flash_ddb()
5063 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_flash_ddb()
5064 " start scan\n", ha->host_no, __func__, in qla4xxx_unblock_flash_ddb()
5066 scsi_queue_work(ha->host, &ddb_entry->sess->scan_work); in qla4xxx_unblock_flash_ddb()
5075 struct scsi_qla_host *ha; in qla4xxx_unblock_ddb() local
5080 ha = ddb_entry->ha; in qla4xxx_unblock_ddb()
5081 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" in qla4xxx_unblock_ddb()
5082 " unblock user space session\n", ha->host_no, __func__, in qla4xxx_unblock_ddb()
5090 ql4_printk(KERN_INFO, ha, in qla4xxx_unblock_ddb()
5092 ha->host_no, __func__, ddb_entry->fw_ddb_index, in qla4xxx_unblock_ddb()
5100 static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha) in qla4xxx_relogin_all_devices() argument
5102 iscsi_host_for_each_session(ha->host, qla4xxx_relogin_devices); in qla4xxx_relogin_all_devices()
5110 struct scsi_qla_host *ha; in qla4xxx_relogin_flash_ddb() local
5114 ha = ddb_entry->ha; in qla4xxx_relogin_flash_ddb()
5120 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_relogin_flash_ddb()
5121 "scsi%ld: Relogin index [%d]. TOV=%d\n", ha->host_no, in qla4xxx_relogin_flash_ddb()
5131 struct scsi_qla_host *ha; in qla4xxx_dpc_relogin() local
5135 ha = ddb_entry->ha; in qla4xxx_dpc_relogin()
5145 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_dpc_relogin()
5151 void qla4xxx_wake_dpc(struct scsi_qla_host *ha) in qla4xxx_wake_dpc() argument
5153 if (ha->dpc_thread) in qla4xxx_wake_dpc()
5154 queue_work(ha->dpc_thread, &ha->dpc_work); in qla4xxx_wake_dpc()
5158 qla4xxx_alloc_work(struct scsi_qla_host *ha, uint32_t data_size, in qla4xxx_alloc_work() argument
5173 static void qla4xxx_post_work(struct scsi_qla_host *ha, in qla4xxx_post_work() argument
5178 spin_lock_irqsave(&ha->work_lock, flags); in qla4xxx_post_work()
5179 list_add_tail(&e->list, &ha->work_list); in qla4xxx_post_work()
5180 spin_unlock_irqrestore(&ha->work_lock, flags); in qla4xxx_post_work()
5181 qla4xxx_wake_dpc(ha); in qla4xxx_post_work()
5184 int qla4xxx_post_aen_work(struct scsi_qla_host *ha, in qla4xxx_post_aen_work() argument
5190 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_AEN); in qla4xxx_post_aen_work()
5198 qla4xxx_post_work(ha, e); in qla4xxx_post_aen_work()
5203 int qla4xxx_post_ping_evt_work(struct scsi_qla_host *ha, in qla4xxx_post_ping_evt_work() argument
5209 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_PING_STATUS); in qla4xxx_post_ping_evt_work()
5218 qla4xxx_post_work(ha, e); in qla4xxx_post_ping_evt_work()
5223 static void qla4xxx_do_work(struct scsi_qla_host *ha) in qla4xxx_do_work() argument
5229 spin_lock_irqsave(&ha->work_lock, flags); in qla4xxx_do_work()
5230 list_splice_init(&ha->work_list, &work); in qla4xxx_do_work()
5231 spin_unlock_irqrestore(&ha->work_lock, flags); in qla4xxx_do_work()
5238 iscsi_post_host_event(ha->host_no, in qla4xxx_do_work()
5245 iscsi_ping_comp_event(ha->host_no, in qla4xxx_do_work()
5253 ql4_printk(KERN_WARNING, ha, "event type: 0x%x not " in qla4xxx_do_work()
5273 struct scsi_qla_host *ha = in qla4xxx_do_dpc() local
5277 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_do_dpc()
5279 ha->host_no, __func__, ha->flags, ha->dpc_flags)); in qla4xxx_do_dpc()
5282 if (!test_bit(AF_INIT_DONE, &ha->flags)) in qla4xxx_do_dpc()
5285 if (test_bit(AF_EEH_BUSY, &ha->flags)) { in qla4xxx_do_dpc()
5287 ha->host_no, __func__, ha->flags)); in qla4xxx_do_dpc()
5292 qla4xxx_do_work(ha); in qla4xxx_do_dpc()
5294 if (is_qla80XX(ha)) { in qla4xxx_do_dpc()
5295 if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5296 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_do_dpc()
5297 ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n", in qla4xxx_do_dpc()
5300 qla4_83xx_disable_pause(ha); in qla4xxx_do_dpc()
5303 ha->isp_ops->idc_lock(ha); in qla4xxx_do_dpc()
5304 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4xxx_do_dpc()
5306 ha->isp_ops->idc_unlock(ha); in qla4xxx_do_dpc()
5307 ql4_printk(KERN_INFO, ha, "HW State: FAILED\n"); in qla4xxx_do_dpc()
5308 qla4_8xxx_device_state_handler(ha); in qla4xxx_do_dpc()
5311 if (test_bit(DPC_POST_IDC_ACK, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5312 if (is_qla8042(ha)) { in qla4xxx_do_dpc()
5313 if (ha->idc_info.info2 & in qla4xxx_do_dpc()
5315 ql4_printk(KERN_INFO, ha, "%s: Disabling ACB\n", in qla4xxx_do_dpc()
5317 status = qla4_84xx_config_acb(ha, in qla4xxx_do_dpc()
5320 ql4_printk(KERN_INFO, ha, "%s: ACB config failed\n", in qla4xxx_do_dpc()
5325 qla4_83xx_post_idc_ack(ha); in qla4xxx_do_dpc()
5326 clear_bit(DPC_POST_IDC_ACK, &ha->dpc_flags); in qla4xxx_do_dpc()
5329 if (is_qla8042(ha) && in qla4xxx_do_dpc()
5330 test_bit(DPC_RESTORE_ACB, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5331 ql4_printk(KERN_INFO, ha, "%s: Restoring ACB\n", in qla4xxx_do_dpc()
5333 if (qla4_84xx_config_acb(ha, ACB_CONFIG_SET) != in qla4xxx_do_dpc()
5335 ql4_printk(KERN_INFO, ha, "%s: ACB config failed ", in qla4xxx_do_dpc()
5338 clear_bit(DPC_RESTORE_ACB, &ha->dpc_flags); in qla4xxx_do_dpc()
5341 if (test_and_clear_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5342 qla4_8xxx_need_qsnt_handler(ha); in qla4xxx_do_dpc()
5346 if (!test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) && in qla4xxx_do_dpc()
5347 (test_bit(DPC_RESET_HA, &ha->dpc_flags) || in qla4xxx_do_dpc()
5348 test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || in qla4xxx_do_dpc()
5349 test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))) { in qla4xxx_do_dpc()
5350 if ((is_qla8022(ha) && ql4xdontresethba) || in qla4xxx_do_dpc()
5351 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_do_dpc()
5352 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_do_dpc()
5354 ha->host_no, __func__)); in qla4xxx_do_dpc()
5355 clear_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_do_dpc()
5356 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); in qla4xxx_do_dpc()
5357 clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_do_dpc()
5360 if (test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) || in qla4xxx_do_dpc()
5361 test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_do_dpc()
5362 qla4xxx_recover_adapter(ha); in qla4xxx_do_dpc()
5364 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5367 while ((readw(&ha->reg->ctrl_status) & in qla4xxx_do_dpc()
5376 ha->host_no, __func__)); in qla4xxx_do_dpc()
5377 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_do_dpc()
5378 if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) { in qla4xxx_do_dpc()
5379 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4xxx_do_dpc()
5380 status = qla4xxx_recover_adapter(ha); in qla4xxx_do_dpc()
5382 clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); in qla4xxx_do_dpc()
5384 ha->isp_ops->enable_intrs(ha); in qla4xxx_do_dpc()
5390 if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags)) in qla4xxx_do_dpc()
5391 qla4xxx_process_aen(ha, PROCESS_ALL_AENS); in qla4xxx_do_dpc()
5394 if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags)) in qla4xxx_do_dpc()
5395 qla4xxx_get_dhcp_ip_address(ha); in qla4xxx_do_dpc()
5398 if (adapter_up(ha) && in qla4xxx_do_dpc()
5399 test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5400 iscsi_host_for_each_session(ha->host, qla4xxx_dpc_relogin); in qla4xxx_do_dpc()
5404 if (!test_bit(AF_LOOPBACK, &ha->flags) && in qla4xxx_do_dpc()
5405 test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5406 if (!test_bit(AF_LINK_UP, &ha->flags)) { in qla4xxx_do_dpc()
5408 qla4xxx_mark_all_devices_missing(ha); in qla4xxx_do_dpc()
5416 if (test_and_clear_bit(AF_BUILD_DDB_LIST, &ha->flags)) { in qla4xxx_do_dpc()
5417 qla4xxx_build_ddb_list(ha, ha->is_reset); in qla4xxx_do_dpc()
5418 iscsi_host_for_each_session(ha->host, in qla4xxx_do_dpc()
5421 qla4xxx_relogin_all_devices(ha); in qla4xxx_do_dpc()
5424 if (test_and_clear_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags)) { in qla4xxx_do_dpc()
5425 if (qla4xxx_sysfs_ddb_export(ha)) in qla4xxx_do_dpc()
5426 ql4_printk(KERN_ERR, ha, "%s: Error exporting ddb to sysfs\n", in qla4xxx_do_dpc()
5435 static void qla4xxx_free_adapter(struct scsi_qla_host *ha) in qla4xxx_free_adapter() argument
5437 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_free_adapter()
5440 ha->isp_ops->disable_intrs(ha); in qla4xxx_free_adapter()
5442 if (is_qla40XX(ha)) { in qla4xxx_free_adapter()
5444 &ha->reg->ctrl_status); in qla4xxx_free_adapter()
5445 readl(&ha->reg->ctrl_status); in qla4xxx_free_adapter()
5446 } else if (is_qla8022(ha)) { in qla4xxx_free_adapter()
5447 writel(0, &ha->qla4_82xx_reg->host_int); in qla4xxx_free_adapter()
5448 readl(&ha->qla4_82xx_reg->host_int); in qla4xxx_free_adapter()
5449 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_free_adapter()
5450 writel(0, &ha->qla4_83xx_reg->risc_intr); in qla4xxx_free_adapter()
5451 readl(&ha->qla4_83xx_reg->risc_intr); in qla4xxx_free_adapter()
5455 if (ha->timer_active) in qla4xxx_free_adapter()
5456 qla4xxx_stop_timer(ha); in qla4xxx_free_adapter()
5459 if (ha->dpc_thread) in qla4xxx_free_adapter()
5460 destroy_workqueue(ha->dpc_thread); in qla4xxx_free_adapter()
5463 if (ha->task_wq) in qla4xxx_free_adapter()
5464 destroy_workqueue(ha->task_wq); in qla4xxx_free_adapter()
5467 ha->isp_ops->reset_firmware(ha); in qla4xxx_free_adapter()
5469 if (is_qla80XX(ha)) { in qla4xxx_free_adapter()
5470 ha->isp_ops->idc_lock(ha); in qla4xxx_free_adapter()
5471 qla4_8xxx_clear_drv_active(ha); in qla4xxx_free_adapter()
5472 ha->isp_ops->idc_unlock(ha); in qla4xxx_free_adapter()
5476 qla4xxx_free_irqs(ha); in qla4xxx_free_adapter()
5479 qla4xxx_mem_free(ha); in qla4xxx_free_adapter()
5482 int qla4_8xxx_iospace_config(struct scsi_qla_host *ha) in qla4_8xxx_iospace_config() argument
5486 struct pci_dev *pdev = ha->pdev; in qla4_8xxx_iospace_config()
5492 "status=%d\n", ha->host_no, pci_name(pdev), status); in qla4_8xxx_iospace_config()
5498 ha->revision_id = pdev->revision; in qla4_8xxx_iospace_config()
5507 ha->nx_pcibase = (unsigned long)ioremap(mem_base, mem_len); in qla4_8xxx_iospace_config()
5508 if (!ha->nx_pcibase) { in qla4_8xxx_iospace_config()
5511 pci_release_regions(ha->pdev); in qla4_8xxx_iospace_config()
5518 if (is_qla8022(ha)) { in qla4_8xxx_iospace_config()
5519 ha->qla4_82xx_reg = (struct device_reg_82xx __iomem *) in qla4_8xxx_iospace_config()
5520 ((uint8_t *)ha->nx_pcibase + 0xbc000 + in qla4_8xxx_iospace_config()
5521 (ha->pdev->devfn << 11)); in qla4_8xxx_iospace_config()
5522 ha->nx_db_wr_ptr = (ha->pdev->devfn == 4 ? QLA82XX_CAM_RAM_DB1 : in qla4_8xxx_iospace_config()
5524 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4_8xxx_iospace_config()
5525 ha->qla4_83xx_reg = (struct device_reg_83xx __iomem *) in qla4_8xxx_iospace_config()
5526 ((uint8_t *)ha->nx_pcibase); in qla4_8xxx_iospace_config()
5544 int qla4xxx_iospace_config(struct scsi_qla_host *ha) in qla4xxx_iospace_config() argument
5549 pio = pci_resource_start(ha->pdev, 0); in qla4xxx_iospace_config()
5550 pio_len = pci_resource_len(ha->pdev, 0); in qla4xxx_iospace_config()
5551 pio_flags = pci_resource_flags(ha->pdev, 0); in qla4xxx_iospace_config()
5554 ql4_printk(KERN_WARNING, ha, in qla4xxx_iospace_config()
5559 ql4_printk(KERN_WARNING, ha, "region #0 not a PIO resource\n"); in qla4xxx_iospace_config()
5564 mmio = pci_resource_start(ha->pdev, 1); in qla4xxx_iospace_config()
5565 mmio_len = pci_resource_len(ha->pdev, 1); in qla4xxx_iospace_config()
5566 mmio_flags = pci_resource_flags(ha->pdev, 1); in qla4xxx_iospace_config()
5569 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5576 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5581 if (pci_request_regions(ha->pdev, DRIVER_NAME)) { in qla4xxx_iospace_config()
5582 ql4_printk(KERN_WARNING, ha, in qla4xxx_iospace_config()
5588 ha->pio_address = pio; in qla4xxx_iospace_config()
5589 ha->pio_length = pio_len; in qla4xxx_iospace_config()
5590 ha->reg = ioremap(mmio, MIN_IOBASE_LEN); in qla4xxx_iospace_config()
5591 if (!ha->reg) { in qla4xxx_iospace_config()
5592 ql4_printk(KERN_ERR, ha, in qla4xxx_iospace_config()
5679 uint16_t qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha) in qla4xxx_rd_shdw_req_q_out() argument
5681 return (uint16_t)le32_to_cpu(ha->shadow_regs->req_q_out); in qla4xxx_rd_shdw_req_q_out()
5684 uint16_t qla4_82xx_rd_shdw_req_q_out(struct scsi_qla_host *ha) in qla4_82xx_rd_shdw_req_q_out() argument
5686 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->req_q_out)); in qla4_82xx_rd_shdw_req_q_out()
5689 uint16_t qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) in qla4xxx_rd_shdw_rsp_q_in() argument
5691 return (uint16_t)le32_to_cpu(ha->shadow_regs->rsp_q_in); in qla4xxx_rd_shdw_rsp_q_in()
5694 uint16_t qla4_82xx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha) in qla4_82xx_rd_shdw_rsp_q_in() argument
5696 return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->rsp_q_in)); in qla4_82xx_rd_shdw_rsp_q_in()
5701 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_eth_info() local
5713 rc = sysfs_format_mac(str, ha->my_mac, in qla4xxx_show_boot_eth_info()
5742 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_ini_info() local
5748 rc = sprintf(str, "%s\n", ha->name_string); in qla4xxx_show_boot_ini_info()
5830 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_tgt_pri_info() local
5831 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_pri_sess); in qla4xxx_show_boot_tgt_pri_info()
5838 struct scsi_qla_host *ha = data; in qla4xxx_show_boot_tgt_sec_info() local
5839 struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_sec_sess); in qla4xxx_show_boot_tgt_sec_info()
5869 struct scsi_qla_host *ha = data; in qla4xxx_boot_release() local
5871 scsi_host_put(ha->host); in qla4xxx_boot_release()
5874 static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[]) in get_fw_boot_info() argument
5885 func_num = PCI_FUNC(ha->pdev->devfn); in get_fw_boot_info()
5887 ql4_printk(KERN_INFO, ha, "%s: Get FW boot info for 0x%x func %d\n", in get_fw_boot_info()
5888 __func__, ha->pdev->device, func_num); in get_fw_boot_info()
5890 if (is_qla40XX(ha)) { in get_fw_boot_info()
5905 val = rd_nvram_byte(ha, addr); in get_fw_boot_info()
5907 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Adapter boot " in get_fw_boot_info()
5914 val = rd_nvram_byte(ha, pri_addr); in get_fw_boot_info()
5919 val = rd_nvram_byte(ha, sec_addr); in get_fw_boot_info()
5923 } else if (is_qla80XX(ha)) { in get_fw_boot_info()
5924 buf = dma_alloc_coherent(&ha->pdev->dev, size, in get_fw_boot_info()
5927 DEBUG2(ql4_printk(KERN_ERR, ha, in get_fw_boot_info()
5934 if (ha->port_num == 0) in get_fw_boot_info()
5936 else if (ha->port_num == 1) in get_fw_boot_info()
5942 addr = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_iscsi_param * 4) + in get_fw_boot_info()
5944 if (qla4xxx_get_flash(ha, buf_dma, addr, in get_fw_boot_info()
5946 DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: Get Flash" in get_fw_boot_info()
5947 " failed\n", ha->host_no, __func__)); in get_fw_boot_info()
5953 DEBUG2(ql4_printk(KERN_INFO, ha, "Firmware boot options" in get_fw_boot_info()
5971 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary target ID %d, Secondary" in get_fw_boot_info()
5976 dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma); in get_fw_boot_info()
5978 ha->pri_ddb_idx = ddb_index[0]; in get_fw_boot_info()
5979 ha->sec_ddb_idx = ddb_index[1]; in get_fw_boot_info()
5994 static int qla4xxx_get_bidi_chap(struct scsi_qla_host *ha, char *username, in qla4xxx_get_bidi_chap() argument
6001 if (is_qla80XX(ha)) in qla4xxx_get_bidi_chap()
6002 max_chap_entries = (ha->hw.flt_chap_size / 2) / in qla4xxx_get_bidi_chap()
6007 if (!ha->chap_list) { in qla4xxx_get_bidi_chap()
6008 ql4_printk(KERN_ERR, ha, "Do not have CHAP table cache\n"); in qla4xxx_get_bidi_chap()
6012 mutex_lock(&ha->chap_sem); in qla4xxx_get_bidi_chap()
6014 chap_table = (struct ql4_chap_table *)ha->chap_list + i; in qla4xxx_get_bidi_chap()
6031 mutex_unlock(&ha->chap_sem); in qla4xxx_get_bidi_chap()
6037 static int qla4xxx_get_boot_target(struct scsi_qla_host *ha, in qla4xxx_get_boot_target() argument
6048 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_get_boot_target()
6051 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_get_boot_target()
6058 if (qla4xxx_bootdb_by_index(ha, fw_ddb_entry, in qla4xxx_get_boot_target()
6060 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: No Flash DDB found at " in qla4xxx_get_boot_target()
6088 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting chap\n")); in qla4xxx_get_boot_target()
6090 ret = qla4xxx_get_chap(ha, (char *)&boot_conn->chap. in qla4xxx_get_boot_target()
6095 ql4_printk(KERN_ERR, ha, "Failed to set chap\n"); in qla4xxx_get_boot_target()
6106 DEBUG2(ql4_printk(KERN_INFO, ha, "Setting BIDI chap\n")); in qla4xxx_get_boot_target()
6108 ret = qla4xxx_get_bidi_chap(ha, in qla4xxx_get_boot_target()
6113 ql4_printk(KERN_ERR, ha, "Failed to set BIDI chap\n"); in qla4xxx_get_boot_target()
6123 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_get_boot_target()
6128 static int qla4xxx_get_boot_info(struct scsi_qla_host *ha) in qla4xxx_get_boot_info() argument
6137 ret = get_fw_boot_info(ha, ddb_index); in qla4xxx_get_boot_info()
6139 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_get_boot_info()
6150 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess), in qla4xxx_get_boot_info()
6153 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary boot target not " in qla4xxx_get_boot_info()
6162 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess), in qla4xxx_get_boot_info()
6165 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Secondary boot target not" in qla4xxx_get_boot_info()
6174 static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha) in qla4xxx_setup_boot_info() argument
6178 if (qla4xxx_get_boot_info(ha) != QLA_SUCCESS) in qla4xxx_setup_boot_info()
6182 ql4_printk(KERN_INFO, ha, in qla4xxx_setup_boot_info()
6189 ha->boot_kset = iscsi_boot_create_host_kset(ha->host->host_no); in qla4xxx_setup_boot_info()
6190 if (!ha->boot_kset) in qla4xxx_setup_boot_info()
6193 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6195 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6202 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6204 boot_kobj = iscsi_boot_create_target(ha->boot_kset, 1, ha, in qla4xxx_setup_boot_info()
6211 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6213 boot_kobj = iscsi_boot_create_initiator(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6220 if (!scsi_host_get(ha->host)) in qla4xxx_setup_boot_info()
6222 boot_kobj = iscsi_boot_create_ethernet(ha->boot_kset, 0, ha, in qla4xxx_setup_boot_info()
6232 scsi_host_put(ha->host); in qla4xxx_setup_boot_info()
6234 iscsi_boot_destroy_kset(ha->boot_kset); in qla4xxx_setup_boot_info()
6242 struct scsi_qla_host *ha; in qla4xxx_get_param_ddb() local
6249 ha = ddb_entry->ha; in qla4xxx_get_param_ddb()
6286 static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha, in qla4xxx_compare_tuple_ddb() argument
6307 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: old ISID [%02x%02x%02x" in qla4xxx_compare_tuple_ddb()
6320 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_compare_tuple_ddb()
6329 static int qla4xxx_is_session_exists(struct scsi_qla_host *ha, in qla4xxx_is_session_exists() argument
6341 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_session_exists()
6349 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_session_exists()
6358 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_is_session_exists()
6363 if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, false)) { in qla4xxx_is_session_exists()
6413 static int qla4xxx_update_isid(struct scsi_qla_host *ha, in qla4xxx_update_isid() argument
6441 static int qla4xxx_should_update_isid(struct scsi_qla_host *ha, in qla4xxx_should_update_isid() argument
6475 static int qla4xxx_is_flash_ddb_exists(struct scsi_qla_host *ha, in qla4xxx_is_flash_ddb_exists() argument
6486 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_flash_ddb_exists()
6494 DEBUG2(ql4_printk(KERN_WARNING, ha, in qla4xxx_is_flash_ddb_exists()
6505 ret = qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, true); in qla4xxx_is_flash_ddb_exists()
6514 ret = qla4xxx_should_update_isid(ha, tmp_tddb, fw_tddb); in qla4xxx_is_flash_ddb_exists()
6516 rval = qla4xxx_update_isid(ha, list_nt, fw_ddb_entry); in qla4xxx_is_flash_ddb_exists()
6544 static struct iscsi_endpoint *qla4xxx_get_ep_fwdb(struct scsi_qla_host *ha, in qla4xxx_get_ep_fwdb() argument
6576 ep = qla4xxx_ep_connect(ha->host, (struct sockaddr *)dst_addr, 0); in qla4xxx_get_ep_fwdb()
6581 static int qla4xxx_verify_boot_idx(struct scsi_qla_host *ha, uint16_t idx) in qla4xxx_verify_boot_idx() argument
6585 if (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx) in qla4xxx_verify_boot_idx()
6590 static void qla4xxx_setup_flash_ddb_entry(struct scsi_qla_host *ha, in qla4xxx_setup_flash_ddb_entry() argument
6599 ddb_entry->ha = ha; in qla4xxx_setup_flash_ddb_entry()
6615 (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx)) in qla4xxx_setup_flash_ddb_entry()
6619 static void qla4xxx_wait_for_ip_configuration(struct scsi_qla_host *ha) in qla4xxx_wait_for_ip_configuration() argument
6634 ret = qla4xxx_get_ip_state(ha, 0, ip_idx[idx], sts); in qla4xxx_wait_for_ip_configuration()
6643 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_for_ip_configuration()
6688 static int qla4xxx_find_flash_st_idx(struct scsi_qla_host *ha, in qla4xxx_find_flash_st_idx() argument
6698 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_find_flash_st_idx()
6701 flash_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_find_flash_st_idx()
6704 ql4_printk(KERN_ERR, ha, "Out of memory\n"); in qla4xxx_find_flash_st_idx()
6708 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6720 status = qla4xxx_flashdb_by_index(ha, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6734 ql4_printk(KERN_ERR, ha, "Failed to find ST [%d] in flash\n", in qla4xxx_find_flash_st_idx()
6739 dma_pool_free(ha->fw_ddb_dma_pool, flash_ddb_entry, in qla4xxx_find_flash_st_idx()
6745 static void qla4xxx_build_st_list(struct scsi_qla_host *ha, in qla4xxx_build_st_list() argument
6759 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_st_list()
6762 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_st_list()
6766 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_st_list()
6771 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_st_list()
6789 ret = qla4xxx_find_flash_st_idx(ha, fw_ddb_entry, idx, in qla4xxx_build_st_list()
6792 ql4_printk(KERN_ERR, ha, in qla4xxx_build_st_list()
6796 ql4_printk(KERN_INFO, ha, in qla4xxx_build_st_list()
6812 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_st_list()
6823 static void qla4xxx_remove_failed_ddb(struct scsi_qla_host *ha, in qla4xxx_remove_failed_ddb() argument
6832 ret = qla4xxx_get_fwddb_entry(ha, ddb_idx->fw_ddb_idx, in qla4xxx_remove_failed_ddb()
6846 static void qla4xxx_update_sess_disc_idx(struct scsi_qla_host *ha, in qla4xxx_update_sess_disc_idx() argument
6855 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_update_sess_disc_idx()
6868 static int qla4xxx_sess_conn_setup(struct scsi_qla_host *ha, in qla4xxx_sess_conn_setup() argument
6886 cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, ha->host, in qla4xxx_sess_conn_setup()
6908 qla4xxx_setup_flash_ddb_entry(ha, ddb_entry, idx); in qla4xxx_sess_conn_setup()
6920 ep = qla4xxx_get_ep_fwdb(ha, fw_ddb_entry); in qla4xxx_sess_conn_setup()
6925 DEBUG2(ql4_printk(KERN_ERR, ha, "Unable to get ep\n")); in qla4xxx_sess_conn_setup()
6931 qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); in qla4xxx_sess_conn_setup()
6932 qla4xxx_update_sess_disc_idx(ha, ddb_entry, fw_ddb_entry); in qla4xxx_sess_conn_setup()
6941 set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); in qla4xxx_sess_conn_setup()
6949 static void qla4xxx_update_fw_ddb_link(struct scsi_qla_host *ha, in qla4xxx_update_fw_ddb_link() argument
6960 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_update_fw_ddb_link()
6970 static void qla4xxx_build_nt_list(struct scsi_qla_host *ha, in qla4xxx_build_nt_list() argument
6988 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_nt_list()
6991 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_nt_list()
6994 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_nt_list()
6999 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_nt_list()
7005 if (qla4xxx_verify_boot_idx(ha, idx) != QLA_SUCCESS) in qla4xxx_build_nt_list()
7014 qla4xxx_update_fw_ddb_link(ha, list_st, fw_ddb_entry); in qla4xxx_build_nt_list()
7021 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_nt_list()
7039 ret = qla4xxx_is_flash_ddb_exists(ha, list_nt, in qla4xxx_build_nt_list()
7053 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, in qla4xxx_build_nt_list()
7056 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, in qla4xxx_build_nt_list()
7059 qla4xxx_update_sess_disc_idx(ha, in qla4xxx_build_nt_list()
7066 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, is_reset, idx); in qla4xxx_build_nt_list()
7077 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_nt_list()
7080 static void qla4xxx_build_new_nt_list(struct scsi_qla_host *ha, in qla4xxx_build_new_nt_list() argument
7094 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_build_new_nt_list()
7097 DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); in qla4xxx_build_new_nt_list()
7100 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_build_new_nt_list()
7105 ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma, in qla4xxx_build_new_nt_list()
7118 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_new_nt_list()
7127 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); in qla4xxx_build_new_nt_list()
7139 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, in qla4xxx_build_new_nt_list()
7151 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_build_new_nt_list()
7191 static int qla4xxx_sysfs_ddb_tgt_create(struct scsi_qla_host *ha, in qla4xxx_sysfs_ddb_tgt_create() argument
7199 fnode_sess = iscsi_create_flashnode_sess(ha->host, *idx, in qla4xxx_sysfs_ddb_tgt_create()
7202 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_tgt_create()
7204 __func__, *idx, ha->host_no); in qla4xxx_sysfs_ddb_tgt_create()
7208 fnode_conn = iscsi_create_flashnode_conn(ha->host, fnode_sess, in qla4xxx_sysfs_ddb_tgt_create()
7211 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_tgt_create()
7213 __func__, *idx, ha->host_no); in qla4xxx_sysfs_ddb_tgt_create()
7222 if (*idx == ha->pri_ddb_idx || *idx == ha->sec_ddb_idx) in qla4xxx_sysfs_ddb_tgt_create()
7231 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", in qla4xxx_sysfs_ddb_tgt_create()
7234 ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n", in qla4xxx_sysfs_ddb_tgt_create()
7258 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_add() local
7269 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Invalid portal type\n", in qla4xxx_sysfs_ddb_add()
7274 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : in qla4xxx_sysfs_ddb_add()
7277 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_add()
7280 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_add()
7286 dev = iscsi_find_flashnode_sess(ha->host, NULL, in qla4xxx_sysfs_ddb_add()
7289 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_add()
7298 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_add()
7309 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_add()
7313 rval = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 1); in qla4xxx_sysfs_ddb_add()
7317 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_add()
7337 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_apply() local
7344 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_apply()
7347 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_apply()
7357 rval = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_apply()
7367 rval = qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, in qla4xxx_sysfs_ddb_apply()
7372 ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_apply()
7374 __func__, fnode_sess->target_id, ha->host_no); in qla4xxx_sysfs_ddb_apply()
7377 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_apply()
7379 __func__, fnode_sess->target_id, ha->host_no); in qla4xxx_sysfs_ddb_apply()
7384 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_apply()
7389 static ssize_t qla4xxx_sysfs_ddb_conn_open(struct scsi_qla_host *ha, in qla4xxx_sysfs_ddb_conn_open() argument
7401 ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*ddb_entry), in qla4xxx_sysfs_ddb_conn_open()
7404 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_conn_open()
7412 ret = qla4xxx_set_ddb_entry(ha, idx, ddb_entry_dma, &mbx_sts); in qla4xxx_sysfs_ddb_conn_open()
7414 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_conn_open()
7420 qla4xxx_conn_open(ha, idx); in qla4xxx_sysfs_ddb_conn_open()
7423 tmo = ((ha->def_timeout > LOGIN_TOV) && in qla4xxx_sysfs_ddb_conn_open()
7424 (ha->def_timeout < LOGIN_TOV * 10) ? in qla4xxx_sysfs_ddb_conn_open()
7425 ha->def_timeout : LOGIN_TOV); in qla4xxx_sysfs_ddb_conn_open()
7427 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_conn_open()
7432 ret = qla4xxx_get_fwddb_entry(ha, idx, NULL, 0, NULL, in qla4xxx_sysfs_ddb_conn_open()
7447 dma_free_coherent(&ha->pdev->dev, sizeof(*ddb_entry), in qla4xxx_sysfs_ddb_conn_open()
7452 static int qla4xxx_ddb_login_st(struct scsi_qla_host *ha, in qla4xxx_ddb_login_st() argument
7461 if (test_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags)) { in qla4xxx_ddb_login_st()
7462 ql4_printk(KERN_WARNING, ha, in qla4xxx_ddb_login_st()
7469 set_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); in qla4xxx_ddb_login_st()
7471 ret = qla4xxx_get_ddb_index(ha, &ddb_index); in qla4xxx_ddb_login_st()
7475 ret = qla4xxx_sysfs_ddb_conn_open(ha, fw_ddb_entry, ddb_index); in qla4xxx_ddb_login_st()
7479 qla4xxx_build_new_nt_list(ha, &list_nt, target_id); in qla4xxx_ddb_login_st()
7483 qla4xxx_clear_ddb_entry(ha, ddb_idx->fw_ddb_idx); in qla4xxx_ddb_login_st()
7488 if (qla4xxx_clear_ddb_entry(ha, ddb_index) == QLA_ERROR) { in qla4xxx_ddb_login_st()
7489 ql4_printk(KERN_ERR, ha, in qla4xxx_ddb_login_st()
7493 clear_bit(ddb_index, ha->ddb_idx_map); in qla4xxx_ddb_login_st()
7496 clear_bit(AF_ST_DISCOVERY_IN_PROGRESS, &ha->flags); in qla4xxx_ddb_login_st()
7500 static int qla4xxx_ddb_login_nt(struct scsi_qla_host *ha, in qla4xxx_ddb_login_nt() argument
7506 ret = qla4xxx_is_session_exists(ha, fw_ddb_entry, NULL); in qla4xxx_ddb_login_nt()
7508 ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, RESET_ADAPTER, in qla4xxx_ddb_login_nt()
7527 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_login() local
7534 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_login()
7540 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_login()
7543 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_login()
7553 ret = qla4xxx_get_default_ddb(ha, options, fw_ddb_entry_dma); in qla4xxx_sysfs_ddb_login()
7561 ret = qla4xxx_ddb_login_st(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_login()
7564 ret = qla4xxx_ddb_login_nt(ha, fw_ddb_entry, in qla4xxx_sysfs_ddb_login()
7572 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_login()
7587 struct scsi_qla_host *ha; in qla4xxx_sysfs_ddb_logout_sid() local
7598 ha = ddb_entry->ha; in qla4xxx_sysfs_ddb_logout_sid()
7601 ql4_printk(KERN_ERR, ha, "%s: Not a flash node session\n", in qla4xxx_sysfs_ddb_logout_sid()
7608 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout_sid()
7615 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_logout_sid()
7618 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout_sid()
7627 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_sysfs_ddb_logout_sid()
7653 qla4xxx_session_logout_ddb(ha, ddb_entry, options); in qla4xxx_sysfs_ddb_logout_sid()
7658 ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_sysfs_ddb_logout_sid()
7673 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_sysfs_ddb_logout_sid()
7683 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_sysfs_ddb_logout_sid()
7684 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_sysfs_ddb_logout_sid()
7685 clear_bit(ddb_entry->fw_ddb_index, ha->ddb_idx_map); in qla4xxx_sysfs_ddb_logout_sid()
7686 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_sysfs_ddb_logout_sid()
7695 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_sysfs_ddb_logout_sid()
7711 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_logout() local
7723 fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, in qla4xxx_sysfs_ddb_logout()
7726 ql4_printk(KERN_ERR, ha, "%s:Out of memory\n", __func__); in qla4xxx_sysfs_ddb_logout()
7733 ql4_printk(KERN_WARNING, ha, in qla4xxx_sysfs_ddb_logout()
7741 ql4_printk(KERN_WARNING, ha, in qla4xxx_sysfs_ddb_logout()
7748 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout()
7756 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_logout()
7777 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_sysfs_ddb_logout()
7785 status = qla4xxx_get_fwddb_entry(ha, index, fw_ddb_entry, in qla4xxx_sysfs_ddb_logout()
7796 status = qla4xxx_compare_tuple_ddb(ha, flash_tddb, tmp_tddb, in qla4xxx_sysfs_ddb_logout()
7813 dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); in qla4xxx_sysfs_ddb_logout()
7823 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_get_param() local
8028 qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_get_param()
8039 qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_get_param()
8081 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_set_param() local
8275 if (!qla4xxx_get_uni_chap_at_index(ha, in qla4xxx_sysfs_ddb_set_param()
8285 ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_set_param()
8307 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_sysfs_ddb_delete() local
8320 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_delete()
8329 if (is_qla40XX(ha)) { in qla4xxx_sysfs_ddb_delete()
8337 (ha->hw.flt_region_ddb << 2); in qla4xxx_sysfs_ddb_delete()
8341 if (ha->port_num == 1) in qla4xxx_sysfs_ddb_delete()
8342 dev_db_start_offset += (ha->hw.flt_ddb_size / 2); in qla4xxx_sysfs_ddb_delete()
8345 (ha->hw.flt_ddb_size / 2); in qla4xxx_sysfs_ddb_delete()
8354 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: start offset=%u, end offset=%u\n", in qla4xxx_sysfs_ddb_delete()
8359 DEBUG2(ql4_printk(KERN_ERR, ha, "%s:Invalid DDB index %u\n", in qla4xxx_sysfs_ddb_delete()
8364 pddb = dma_alloc_coherent(&ha->pdev->dev, ddb_size, in qla4xxx_sysfs_ddb_delete()
8368 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_delete()
8374 if (is_qla40XX(ha)) { in qla4xxx_sysfs_ddb_delete()
8384 qla4xxx_set_flash(ha, fw_ddb_entry_dma, dev_db_start_offset, in qla4xxx_sysfs_ddb_delete()
8390 ql4_printk(KERN_INFO, ha, in qla4xxx_sysfs_ddb_delete()
8392 __func__, target_id, ha->host_no); in qla4xxx_sysfs_ddb_delete()
8395 dma_free_coherent(&ha->pdev->dev, ddb_size, pddb, in qla4xxx_sysfs_ddb_delete()
8406 int qla4xxx_sysfs_ddb_export(struct scsi_qla_host *ha) in qla4xxx_sysfs_ddb_export() argument
8414 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_sysfs_ddb_export()
8418 DEBUG2(ql4_printk(KERN_ERR, ha, in qla4xxx_sysfs_ddb_export()
8424 max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : in qla4xxx_sysfs_ddb_export()
8428 if (qla4xxx_flashdb_by_index(ha, fw_ddb_entry, fw_ddb_entry_dma, in qla4xxx_sysfs_ddb_export()
8432 ret = qla4xxx_sysfs_ddb_tgt_create(ha, fw_ddb_entry, &idx, 0); in qla4xxx_sysfs_ddb_export()
8439 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), fw_ddb_entry, in qla4xxx_sysfs_ddb_export()
8445 static void qla4xxx_sysfs_ddb_remove(struct scsi_qla_host *ha) in qla4xxx_sysfs_ddb_remove() argument
8447 iscsi_destroy_all_flashnode(ha->host); in qla4xxx_sysfs_ddb_remove()
8460 void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset) in qla4xxx_build_ddb_list() argument
8467 if (!test_bit(AF_LINK_UP, &ha->flags)) { in qla4xxx_build_ddb_list()
8468 set_bit(AF_BUILD_DDB_LIST, &ha->flags); in qla4xxx_build_ddb_list()
8469 ha->is_reset = is_reset; in qla4xxx_build_ddb_list()
8476 qla4xxx_build_st_list(ha, &list_st); in qla4xxx_build_ddb_list()
8481 qla4xxx_wait_for_ip_configuration(ha); in qla4xxx_build_ddb_list()
8485 qla4xxx_conn_open(ha, st_ddb_idx->fw_ddb_idx); in qla4xxx_build_ddb_list()
8489 tmo = ((ha->def_timeout > LOGIN_TOV) && in qla4xxx_build_ddb_list()
8490 (ha->def_timeout < LOGIN_TOV * 10) ? in qla4xxx_build_ddb_list()
8491 ha->def_timeout : LOGIN_TOV); in qla4xxx_build_ddb_list()
8493 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_build_ddb_list()
8501 qla4xxx_remove_failed_ddb(ha, &list_st); in qla4xxx_build_ddb_list()
8506 qla4xxx_build_nt_list(ha, &list_nt, &list_st, is_reset); in qla4xxx_build_ddb_list()
8511 qla4xxx_free_ddb_index(ha); in qla4xxx_build_ddb_list()
8523 static void qla4xxx_wait_login_resp_boot_tgt(struct scsi_qla_host *ha) in qla4xxx_wait_login_resp_boot_tgt() argument
8532 max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : in qla4xxx_wait_login_resp_boot_tgt()
8535 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_wait_login_resp_boot_tgt()
8538 ql4_printk(KERN_ERR, ha, in qla4xxx_wait_login_resp_boot_tgt()
8546 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_wait_login_resp_boot_tgt()
8551 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_login_resp_boot_tgt()
8555 ret = qla4xxx_get_fwddb_entry(ha, in qla4xxx_wait_login_resp_boot_tgt()
8572 DEBUG2(ql4_printk(KERN_INFO, ha, in qla4xxx_wait_login_resp_boot_tgt()
8582 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_wait_login_resp_boot_tgt()
8600 struct scsi_qla_host *ha; in qla4xxx_probe_adapter() local
8609 host = iscsi_host_alloc(&qla4xxx_driver_template, sizeof(*ha), 0); in qla4xxx_probe_adapter()
8617 ha = to_qla_host(host); in qla4xxx_probe_adapter()
8618 memset(ha, 0, sizeof(*ha)); in qla4xxx_probe_adapter()
8621 ha->pdev = pdev; in qla4xxx_probe_adapter()
8622 ha->host = host; in qla4xxx_probe_adapter()
8623 ha->host_no = host->host_no; in qla4xxx_probe_adapter()
8624 ha->func_num = PCI_FUNC(ha->pdev->devfn); in qla4xxx_probe_adapter()
8629 if (is_qla8022(ha)) { in qla4xxx_probe_adapter()
8630 ha->isp_ops = &qla4_82xx_isp_ops; in qla4xxx_probe_adapter()
8631 ha->reg_tbl = (uint32_t *) qla4_82xx_reg_tbl; in qla4xxx_probe_adapter()
8632 ha->qdr_sn_window = -1; in qla4xxx_probe_adapter()
8633 ha->ddr_mn_window = -1; in qla4xxx_probe_adapter()
8634 ha->curr_window = 255; in qla4xxx_probe_adapter()
8635 nx_legacy_intr = &legacy_intr[ha->func_num]; in qla4xxx_probe_adapter()
8636 ha->nx_legacy_intr.int_vec_bit = nx_legacy_intr->int_vec_bit; in qla4xxx_probe_adapter()
8637 ha->nx_legacy_intr.tgt_status_reg = in qla4xxx_probe_adapter()
8639 ha->nx_legacy_intr.tgt_mask_reg = nx_legacy_intr->tgt_mask_reg; in qla4xxx_probe_adapter()
8640 ha->nx_legacy_intr.pci_int_reg = nx_legacy_intr->pci_int_reg; in qla4xxx_probe_adapter()
8641 } else if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_probe_adapter()
8642 ha->isp_ops = &qla4_83xx_isp_ops; in qla4xxx_probe_adapter()
8643 ha->reg_tbl = (uint32_t *)qla4_83xx_reg_tbl; in qla4xxx_probe_adapter()
8645 ha->isp_ops = &qla4xxx_isp_ops; in qla4xxx_probe_adapter()
8648 if (is_qla80XX(ha)) { in qla4xxx_probe_adapter()
8649 rwlock_init(&ha->hw_lock); in qla4xxx_probe_adapter()
8650 ha->pf_bit = ha->func_num << 16; in qla4xxx_probe_adapter()
8656 ret = ha->isp_ops->iospace_config(ha); in qla4xxx_probe_adapter()
8660 ql4_printk(KERN_INFO, ha, "Found an ISP%04x, irq %d, iobase 0x%p\n", in qla4xxx_probe_adapter()
8661 pdev->device, pdev->irq, ha->reg); in qla4xxx_probe_adapter()
8663 qla4xxx_config_dma_addressing(ha); in qla4xxx_probe_adapter()
8666 INIT_LIST_HEAD(&ha->free_srb_q); in qla4xxx_probe_adapter()
8668 mutex_init(&ha->mbox_sem); in qla4xxx_probe_adapter()
8669 mutex_init(&ha->chap_sem); in qla4xxx_probe_adapter()
8670 init_completion(&ha->mbx_intr_comp); in qla4xxx_probe_adapter()
8671 init_completion(&ha->disable_acb_comp); in qla4xxx_probe_adapter()
8672 init_completion(&ha->idc_comp); in qla4xxx_probe_adapter()
8673 init_completion(&ha->link_up_comp); in qla4xxx_probe_adapter()
8674 init_completion(&ha->disable_acb_comp); in qla4xxx_probe_adapter()
8676 spin_lock_init(&ha->hardware_lock); in qla4xxx_probe_adapter()
8677 spin_lock_init(&ha->work_lock); in qla4xxx_probe_adapter()
8680 INIT_LIST_HEAD(&ha->work_list); in qla4xxx_probe_adapter()
8683 if (qla4xxx_mem_alloc(ha)) { in qla4xxx_probe_adapter()
8684 ql4_printk(KERN_WARNING, ha, in qla4xxx_probe_adapter()
8699 pci_set_drvdata(pdev, ha); in qla4xxx_probe_adapter()
8705 if (is_qla80XX(ha)) in qla4xxx_probe_adapter()
8706 qla4_8xxx_get_flash_info(ha); in qla4xxx_probe_adapter()
8708 if (is_qla8032(ha) || is_qla8042(ha)) { in qla4xxx_probe_adapter()
8709 qla4_83xx_read_reset_template(ha); in qla4xxx_probe_adapter()
8717 qla4_83xx_set_idc_dontreset(ha); in qla4xxx_probe_adapter()
8725 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8728 if (is_qla80XX(ha) && (status == QLA_ERROR)) in qla4xxx_probe_adapter()
8731 while ((!test_bit(AF_ONLINE, &ha->flags)) && in qla4xxx_probe_adapter()
8734 if (is_qla80XX(ha)) { in qla4xxx_probe_adapter()
8735 ha->isp_ops->idc_lock(ha); in qla4xxx_probe_adapter()
8736 dev_state = qla4_8xxx_rd_direct(ha, in qla4xxx_probe_adapter()
8738 ha->isp_ops->idc_unlock(ha); in qla4xxx_probe_adapter()
8740 ql4_printk(KERN_WARNING, ha, "%s: don't retry " in qla4xxx_probe_adapter()
8749 if (ha->isp_ops->reset_chip(ha) == QLA_ERROR) in qla4xxx_probe_adapter()
8752 status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8753 if (is_qla80XX(ha) && (status == QLA_ERROR)) { in qla4xxx_probe_adapter()
8754 if (qla4_8xxx_check_init_adapter_retry(ha) == QLA_ERROR) in qla4xxx_probe_adapter()
8760 if (!test_bit(AF_ONLINE, &ha->flags)) { in qla4xxx_probe_adapter()
8761 ql4_printk(KERN_WARNING, ha, "Failed to initialize adapter\n"); in qla4xxx_probe_adapter()
8763 if ((is_qla8022(ha) && ql4xdontresethba) || in qla4xxx_probe_adapter()
8764 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_probe_adapter()
8765 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_probe_adapter()
8768 ha->isp_ops->idc_lock(ha); in qla4xxx_probe_adapter()
8769 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4xxx_probe_adapter()
8771 ha->isp_ops->idc_unlock(ha); in qla4xxx_probe_adapter()
8780 sprintf(buf, "qla4xxx_%lu_dpc", ha->host_no); in qla4xxx_probe_adapter()
8781 ha->dpc_thread = create_singlethread_workqueue(buf); in qla4xxx_probe_adapter()
8782 if (!ha->dpc_thread) { in qla4xxx_probe_adapter()
8783 ql4_printk(KERN_WARNING, ha, "Unable to start DPC thread!\n"); in qla4xxx_probe_adapter()
8787 INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc); in qla4xxx_probe_adapter()
8789 ha->task_wq = alloc_workqueue("qla4xxx_%lu_task", WQ_MEM_RECLAIM, 1, in qla4xxx_probe_adapter()
8790 ha->host_no); in qla4xxx_probe_adapter()
8791 if (!ha->task_wq) { in qla4xxx_probe_adapter()
8792 ql4_printk(KERN_WARNING, ha, "Unable to start task thread!\n"); in qla4xxx_probe_adapter()
8803 if (is_qla40XX(ha)) { in qla4xxx_probe_adapter()
8804 ret = qla4xxx_request_irqs(ha); in qla4xxx_probe_adapter()
8806 ql4_printk(KERN_WARNING, ha, "Failed to reserve " in qla4xxx_probe_adapter()
8812 pci_save_state(ha->pdev); in qla4xxx_probe_adapter()
8813 ha->isp_ops->enable_intrs(ha); in qla4xxx_probe_adapter()
8816 qla4xxx_start_timer(ha, qla4xxx_timer, 1); in qla4xxx_probe_adapter()
8818 set_bit(AF_INIT_DONE, &ha->flags); in qla4xxx_probe_adapter()
8820 qla4_8xxx_alloc_sysfs_attr(ha); in qla4xxx_probe_adapter()
8825 qla4xxx_version_str, ha->pdev->device, pci_name(ha->pdev), in qla4xxx_probe_adapter()
8826 ha->host_no, ha->fw_info.fw_major, ha->fw_info.fw_minor, in qla4xxx_probe_adapter()
8827 ha->fw_info.fw_patch, ha->fw_info.fw_build); in qla4xxx_probe_adapter()
8830 if (is_qla80XX(ha)) in qla4xxx_probe_adapter()
8831 qla4_8xxx_set_param(ha, SET_DRVR_VERSION); in qla4xxx_probe_adapter()
8833 if (qla4xxx_setup_boot_info(ha)) in qla4xxx_probe_adapter()
8834 ql4_printk(KERN_ERR, ha, in qla4xxx_probe_adapter()
8837 set_bit(DPC_SYSFS_DDB_EXPORT, &ha->dpc_flags); in qla4xxx_probe_adapter()
8839 qla4xxx_build_ddb_list(ha, INIT_ADAPTER); in qla4xxx_probe_adapter()
8840 iscsi_host_for_each_session(ha->host, qla4xxx_login_flash_ddb); in qla4xxx_probe_adapter()
8841 qla4xxx_wait_login_resp_boot_tgt(ha); in qla4xxx_probe_adapter()
8843 qla4xxx_create_chap_list(ha); in qla4xxx_probe_adapter()
8845 qla4xxx_create_ifaces(ha); in qla4xxx_probe_adapter()
8849 scsi_remove_host(ha->host); in qla4xxx_probe_adapter()
8852 qla4xxx_free_adapter(ha); in qla4xxx_probe_adapter()
8856 scsi_host_put(ha->host); in qla4xxx_probe_adapter()
8872 static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha) in qla4xxx_prevent_other_port_reinit() argument
8879 if (PCI_FUNC(ha->pdev->devfn) & BIT_1) in qla4xxx_prevent_other_port_reinit()
8883 pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus), in qla4xxx_prevent_other_port_reinit()
8884 ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), in qla4xxx_prevent_other_port_reinit()
8893 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: " in qla4xxx_prevent_other_port_reinit()
8902 static void qla4xxx_destroy_ddb(struct scsi_qla_host *ha, in qla4xxx_destroy_ddb() argument
8913 if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) { in qla4xxx_destroy_ddb()
8914 ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__); in qla4xxx_destroy_ddb()
8918 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_destroy_ddb()
8921 ql4_printk(KERN_ERR, ha, in qla4xxx_destroy_ddb()
8928 status = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, in qla4xxx_destroy_ddb()
8943 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), in qla4xxx_destroy_ddb()
8946 qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); in qla4xxx_destroy_ddb()
8949 static void qla4xxx_destroy_fw_ddb_session(struct scsi_qla_host *ha) in qla4xxx_destroy_fw_ddb_session() argument
8956 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); in qla4xxx_destroy_fw_ddb_session()
8960 qla4xxx_destroy_ddb(ha, ddb_entry); in qla4xxx_destroy_fw_ddb_session()
8969 qla4xxx_free_ddb(ha, ddb_entry); in qla4xxx_destroy_fw_ddb_session()
8980 struct scsi_qla_host *ha; in qla4xxx_remove_adapter() local
8989 ha = pci_get_drvdata(pdev); in qla4xxx_remove_adapter()
8991 if (is_qla40XX(ha)) in qla4xxx_remove_adapter()
8992 qla4xxx_prevent_other_port_reinit(ha); in qla4xxx_remove_adapter()
8995 qla4xxx_destroy_ifaces(ha); in qla4xxx_remove_adapter()
8997 if ((!ql4xdisablesysfsboot) && ha->boot_kset) in qla4xxx_remove_adapter()
8998 iscsi_boot_destroy_kset(ha->boot_kset); in qla4xxx_remove_adapter()
9000 qla4xxx_destroy_fw_ddb_session(ha); in qla4xxx_remove_adapter()
9001 qla4_8xxx_free_sysfs_attr(ha); in qla4xxx_remove_adapter()
9003 qla4xxx_sysfs_ddb_remove(ha); in qla4xxx_remove_adapter()
9004 scsi_remove_host(ha->host); in qla4xxx_remove_adapter()
9006 qla4xxx_free_adapter(ha); in qla4xxx_remove_adapter()
9008 scsi_host_put(ha->host); in qla4xxx_remove_adapter()
9021 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha) in qla4xxx_config_dma_addressing() argument
9026 if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(64)) == 0) { in qla4xxx_config_dma_addressing()
9027 if (pci_set_consistent_dma_mask(ha->pdev, DMA_BIT_MASK(64))) { in qla4xxx_config_dma_addressing()
9028 dev_dbg(&ha->pdev->dev, in qla4xxx_config_dma_addressing()
9031 retval = pci_set_consistent_dma_mask(ha->pdev, in qla4xxx_config_dma_addressing()
9035 retval = pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(32)); in qla4xxx_config_dma_addressing()
9065 struct srb *qla4xxx_del_from_active_array(struct scsi_qla_host *ha, in qla4xxx_del_from_active_array() argument
9071 cmd = scsi_host_find_tag(ha->host, index); in qla4xxx_del_from_active_array()
9081 ha->iocb_cnt -= srb->iocb_cnt; in qla4xxx_del_from_active_array()
9097 static int qla4xxx_eh_wait_on_command(struct scsi_qla_host *ha, in qla4xxx_eh_wait_on_command() argument
9108 if (unlikely(pci_channel_offline(ha->pdev)) || in qla4xxx_eh_wait_on_command()
9109 (test_bit(AF_EEH_BUSY, &ha->flags))) { in qla4xxx_eh_wait_on_command()
9110 ql4_printk(KERN_WARNING, ha, "scsi%ld: Return from %s\n", in qla4xxx_eh_wait_on_command()
9111 ha->host_no, __func__); in qla4xxx_eh_wait_on_command()
9133 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha) in qla4xxx_wait_for_hba_online() argument
9140 if (adapter_up(ha)) in qla4xxx_wait_for_hba_online()
9158 static int qla4xxx_eh_wait_for_commands(struct scsi_qla_host *ha, in qla4xxx_eh_wait_for_commands() argument
9170 for (cnt = 0; cnt < ha->host->can_queue; cnt++) { in qla4xxx_eh_wait_for_commands()
9171 cmd = scsi_host_find_tag(ha->host, cnt); in qla4xxx_eh_wait_for_commands()
9174 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { in qla4xxx_eh_wait_for_commands()
9192 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_abort() local
9200 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Abort command issued cmd=%p, cdb=0x%x\n", in qla4xxx_eh_abort()
9201 ha->host_no, id, lun, cmd, cmd->cmnd[0]); in qla4xxx_eh_abort()
9203 spin_lock_irqsave(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9206 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9207 ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Specified command has already completed.\n", in qla4xxx_eh_abort()
9208 ha->host_no, id, lun); in qla4xxx_eh_abort()
9212 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla4xxx_eh_abort()
9214 if (qla4xxx_abort_task(ha, srb) != QLA_SUCCESS) { in qla4xxx_eh_abort()
9216 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9220 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9228 if (!qla4xxx_eh_wait_on_command(ha, cmd)) { in qla4xxx_eh_abort()
9230 ha->host_no, id, lun)); in qla4xxx_eh_abort()
9235 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_abort()
9237 ha->host_no, id, lun, (ret == SUCCESS) ? "succeeded" : "failed"); in qla4xxx_eh_abort()
9251 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_device_reset() local
9263 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9264 "scsi%ld:%d:%d:%llu: DEVICE RESET ISSUED.\n", ha->host_no, in qla4xxx_eh_device_reset()
9269 "dpc_flags=%lx, status=%x allowed=%d\n", ha->host_no, in qla4xxx_eh_device_reset()
9271 ha->dpc_flags, cmd->result, cmd->allowed)); in qla4xxx_eh_device_reset()
9274 stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun); in qla4xxx_eh_device_reset()
9276 ql4_printk(KERN_INFO, ha, "DEVICE RESET FAILED. %d\n", stat); in qla4xxx_eh_device_reset()
9280 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), in qla4xxx_eh_device_reset()
9282 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9289 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, in qla4xxx_eh_device_reset()
9293 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_device_reset()
9295 ha->host_no, cmd->device->channel, cmd->device->id, in qla4xxx_eh_device_reset()
9313 struct scsi_qla_host *ha = to_qla_host(cmd->device->host); in qla4xxx_eh_target_reset() local
9330 ha->host_no, cmd, jiffies, cmd->request->timeout / HZ, in qla4xxx_eh_target_reset()
9331 ha->dpc_flags, cmd->result, cmd->allowed)); in qla4xxx_eh_target_reset()
9333 stat = qla4xxx_reset_target(ha, ddb_entry); in qla4xxx_eh_target_reset()
9340 if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device), in qla4xxx_eh_target_reset()
9349 if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun, in qla4xxx_eh_target_reset()
9386 struct scsi_qla_host *ha; in qla4xxx_eh_host_reset() local
9388 ha = to_qla_host(cmd->device->host); in qla4xxx_eh_host_reset()
9390 if ((is_qla8032(ha) || is_qla8042(ha)) && ql4xdontresethba) in qla4xxx_eh_host_reset()
9391 qla4_83xx_set_idc_dontreset(ha); in qla4xxx_eh_host_reset()
9398 ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_eh_host_reset()
9399 qla4_83xx_idc_dontreset(ha))) { in qla4xxx_eh_host_reset()
9401 ha->host_no, __func__)); in qla4xxx_eh_host_reset()
9405 qla4xxx_abort_active_cmds(ha, DID_ABORT << 16); in qla4xxx_eh_host_reset()
9410 ql4_printk(KERN_INFO, ha, in qla4xxx_eh_host_reset()
9411 "scsi(%ld:%d:%d:%llu): HOST RESET ISSUED.\n", ha->host_no, in qla4xxx_eh_host_reset()
9414 if (qla4xxx_wait_for_hba_online(ha) != QLA_SUCCESS) { in qla4xxx_eh_host_reset()
9416 "DEAD.\n", ha->host_no, cmd->device->channel, in qla4xxx_eh_host_reset()
9422 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_eh_host_reset()
9423 if (is_qla80XX(ha)) in qla4xxx_eh_host_reset()
9424 set_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags); in qla4xxx_eh_host_reset()
9426 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_eh_host_reset()
9429 if (qla4xxx_recover_adapter(ha) == QLA_SUCCESS) in qla4xxx_eh_host_reset()
9432 ql4_printk(KERN_INFO, ha, "HOST RESET %s.\n", in qla4xxx_eh_host_reset()
9438 static int qla4xxx_context_reset(struct scsi_qla_host *ha) in qla4xxx_context_reset() argument
9447 acb = dma_alloc_coherent(&ha->pdev->dev, in qla4xxx_context_reset()
9451 ql4_printk(KERN_ERR, ha, "%s: Unable to alloc acb\n", in qla4xxx_context_reset()
9459 rval = qla4xxx_get_acb(ha, acb_dma, PRIMARI_ACB, acb_len); in qla4xxx_context_reset()
9465 rval = qla4xxx_disable_acb(ha); in qla4xxx_context_reset()
9471 wait_for_completion_timeout(&ha->disable_acb_comp, in qla4xxx_context_reset()
9474 rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], acb_dma); in qla4xxx_context_reset()
9481 dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk_def), in qla4xxx_context_reset()
9484 DEBUG2(ql4_printk(KERN_INFO, ha, "%s %s\n", __func__, in qla4xxx_context_reset()
9491 struct scsi_qla_host *ha = to_qla_host(shost); in qla4xxx_host_reset() local
9496 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Don't Reset HBA\n", in qla4xxx_host_reset()
9502 if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) in qla4xxx_host_reset()
9507 set_bit(DPC_RESET_HA, &ha->dpc_flags); in qla4xxx_host_reset()
9510 if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_host_reset()
9511 if (is_qla80XX(ha)) in qla4xxx_host_reset()
9514 &ha->dpc_flags); in qla4xxx_host_reset()
9516 rval = qla4xxx_context_reset(ha); in qla4xxx_host_reset()
9526 if ((is_qla8032(ha) || is_qla8042(ha)) && in qla4xxx_host_reset()
9527 test_bit(DPC_RESET_HA, &ha->dpc_flags)) { in qla4xxx_host_reset()
9528 idc_ctrl = qla4_83xx_rd_reg(ha, QLA83XX_IDC_DRV_CTRL); in qla4xxx_host_reset()
9529 qla4_83xx_wr_reg(ha, QLA83XX_IDC_DRV_CTRL, in qla4xxx_host_reset()
9533 rval = qla4xxx_recover_adapter(ha); in qla4xxx_host_reset()
9535 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: recover adapter fail\n", in qla4xxx_host_reset()
9562 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_error_detected() local
9564 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: error detected:state %x\n", in qla4xxx_pci_error_detected()
9565 ha->host_no, __func__, state); in qla4xxx_pci_error_detected()
9567 if (!is_aer_supported(ha)) in qla4xxx_pci_error_detected()
9572 clear_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9575 set_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9576 qla4xxx_mailbox_premature_completion(ha); in qla4xxx_pci_error_detected()
9577 qla4xxx_free_irqs(ha); in qla4xxx_pci_error_detected()
9580 qla4xxx_abort_active_cmds(ha, DID_RESET << 16); in qla4xxx_pci_error_detected()
9583 set_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_error_detected()
9584 set_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags); in qla4xxx_pci_error_detected()
9585 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); in qla4xxx_pci_error_detected()
9599 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_mmio_enabled() local
9601 if (!is_aer_supported(ha)) in qla4xxx_pci_mmio_enabled()
9607 static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha) in qla4_8xxx_error_recovery() argument
9613 ql4_printk(KERN_WARNING, ha, "scsi%ld: In %s\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9615 set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4_8xxx_error_recovery()
9617 if (test_bit(AF_ONLINE, &ha->flags)) { in qla4_8xxx_error_recovery()
9618 clear_bit(AF_ONLINE, &ha->flags); in qla4_8xxx_error_recovery()
9619 clear_bit(AF_LINK_UP, &ha->flags); in qla4_8xxx_error_recovery()
9620 iscsi_host_for_each_session(ha->host, qla4xxx_fail_session); in qla4_8xxx_error_recovery()
9621 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); in qla4_8xxx_error_recovery()
9624 fn = PCI_FUNC(ha->pdev->devfn); in qla4_8xxx_error_recovery()
9625 if (is_qla8022(ha)) { in qla4_8xxx_error_recovery()
9628 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Finding PCI device at func %x\n", in qla4_8xxx_error_recovery()
9629 ha->host_no, __func__, fn); in qla4_8xxx_error_recovery()
9633 pci_domain_nr(ha->pdev->bus), in qla4_8xxx_error_recovery()
9634 ha->pdev->bus->number, in qla4_8xxx_error_recovery()
9635 PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), in qla4_8xxx_error_recovery()
9642 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Found PCI func in enabled state%x\n", in qla4_8xxx_error_recovery()
9643 ha->host_no, __func__, fn); in qla4_8xxx_error_recovery()
9651 if (qla4_83xx_can_perform_reset(ha)) { in qla4_8xxx_error_recovery()
9662 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn being reset " in qla4_8xxx_error_recovery()
9663 "0x%x is the owner\n", ha->host_no, __func__, in qla4_8xxx_error_recovery()
9664 ha->pdev->devfn); in qla4_8xxx_error_recovery()
9666 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9667 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9669 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9671 rval = qla4_8xxx_update_idc_reg(ha); in qla4_8xxx_error_recovery()
9673 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: FAILED\n", in qla4_8xxx_error_recovery()
9674 ha->host_no, __func__); in qla4_8xxx_error_recovery()
9675 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9676 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9678 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9682 clear_bit(AF_FW_RECOVERY, &ha->flags); in qla4_8xxx_error_recovery()
9683 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4_8xxx_error_recovery()
9686 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " in qla4_8xxx_error_recovery()
9687 "FAILED\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9688 qla4xxx_free_irqs(ha); in qla4_8xxx_error_recovery()
9689 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9690 qla4_8xxx_clear_drv_active(ha); in qla4_8xxx_error_recovery()
9691 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9693 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9695 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: " in qla4_8xxx_error_recovery()
9696 "READY\n", ha->host_no, __func__); in qla4_8xxx_error_recovery()
9697 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9698 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, in qla4_8xxx_error_recovery()
9701 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DRV_STATE, 0); in qla4_8xxx_error_recovery()
9702 qla4_8xxx_set_drv_active(ha); in qla4_8xxx_error_recovery()
9703 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9704 ha->isp_ops->enable_intrs(ha); in qla4_8xxx_error_recovery()
9707 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn 0x%x is not " in qla4_8xxx_error_recovery()
9708 "the reset owner\n", ha->host_no, __func__, in qla4_8xxx_error_recovery()
9709 ha->pdev->devfn); in qla4_8xxx_error_recovery()
9710 if ((qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE) == in qla4_8xxx_error_recovery()
9712 clear_bit(AF_FW_RECOVERY, &ha->flags); in qla4_8xxx_error_recovery()
9713 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); in qla4_8xxx_error_recovery()
9715 ha->isp_ops->enable_intrs(ha); in qla4_8xxx_error_recovery()
9717 qla4xxx_free_irqs(ha); in qla4_8xxx_error_recovery()
9719 ha->isp_ops->idc_lock(ha); in qla4_8xxx_error_recovery()
9720 qla4_8xxx_set_drv_active(ha); in qla4_8xxx_error_recovery()
9721 ha->isp_ops->idc_unlock(ha); in qla4_8xxx_error_recovery()
9725 clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); in qla4_8xxx_error_recovery()
9733 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_slot_reset() local
9736 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: slot_reset\n", in qla4xxx_pci_slot_reset()
9737 ha->host_no, __func__); in qla4xxx_pci_slot_reset()
9739 if (!is_aer_supported(ha)) in qla4xxx_pci_slot_reset()
9756 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Can't re-enable " in qla4xxx_pci_slot_reset()
9757 "device after reset\n", ha->host_no, __func__); in qla4xxx_pci_slot_reset()
9761 ha->isp_ops->disable_intrs(ha); in qla4xxx_pci_slot_reset()
9763 if (is_qla80XX(ha)) { in qla4xxx_pci_slot_reset()
9764 if (qla4_8xxx_error_recovery(ha) == QLA_SUCCESS) { in qla4xxx_pci_slot_reset()
9772 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Return=%x\n" in qla4xxx_pci_slot_reset()
9773 "device after reset\n", ha->host_no, __func__, ret); in qla4xxx_pci_slot_reset()
9780 struct scsi_qla_host *ha = pci_get_drvdata(pdev); in qla4xxx_pci_resume() local
9783 ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: pci_resume\n", in qla4xxx_pci_resume()
9784 ha->host_no, __func__); in qla4xxx_pci_resume()
9786 ret = qla4xxx_wait_for_hba_online(ha); in qla4xxx_pci_resume()
9788 ql4_printk(KERN_ERR, ha, "scsi%ld: %s: the device failed to " in qla4xxx_pci_resume()
9789 "resume I/O from slot/link_reset\n", ha->host_no, in qla4xxx_pci_resume()
9794 clear_bit(AF_EEH_BUSY, &ha->flags); in qla4xxx_pci_resume()