diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-22 15:55:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-22 15:55:29 -0400 |
commit | 424a6f6ef990b7e9f56f6627bfc6c46b493faeb4 (patch) | |
tree | 0028356ed8003495fbbe1f716f359e3c8ebc35b6 /drivers/scsi/qla2xxx | |
parent | 1ab142d499294b844ecc81e8004db4ce029b0b61 (diff) | |
parent | cd8df932d894f3128c884e3ae1b2b484540513db (diff) |
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
SCSI updates from James Bottomley:
"The update includes the usual assortment of driver updates (lpfc,
qla2xxx, qla4xxx, bfa, bnx2fc, bnx2i, isci, fcoe, hpsa) plus a huge
amount of infrastructure work in the SAS library and transport class
as well as an iSCSI update. There's also a new SCSI based virtio
driver."
* tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (177 commits)
[SCSI] qla4xxx: Update driver version to 5.02.00-k15
[SCSI] qla4xxx: trivial cleanup
[SCSI] qla4xxx: Fix sparse warning
[SCSI] qla4xxx: Add support for multiple session per host.
[SCSI] qla4xxx: Export CHAP index as sysfs attribute
[SCSI] scsi_transport: Export CHAP index as sysfs attribute
[SCSI] qla4xxx: Add support to display CHAP list and delete CHAP entry
[SCSI] iscsi_transport: Add support to display CHAP list and delete CHAP entry
[SCSI] pm8001: fix endian issue with code optimization.
[SCSI] pm8001: Fix possible racing condition.
[SCSI] pm8001: Fix bogus interrupt state flag issue.
[SCSI] ipr: update PCI ID definitions for new adapters
[SCSI] qla2xxx: handle default case in qla2x00_request_firmware()
[SCSI] isci: improvements in driver unloading routine
[SCSI] isci: improve phy event warnings
[SCSI] isci: debug, provide state-enum-to-string conversions
[SCSI] scsi_transport_sas: 'enable' phys on reset
[SCSI] libsas: don't recover end devices attached to disabled phys
[SCSI] libsas: fixup target_port_protocols for expanders that don't report sata
[SCSI] libsas: set attached device type and target protocols for local phys
...
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 177 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_bsg.c | 120 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 630 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.h | 63 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 117 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dfs.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_fw.h | 13 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 22 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gs.c | 86 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 540 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_inline.h | 51 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_iocb.c | 167 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 445 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 410 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mid.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_nx.c | 90 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_nx.h | 3 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 435 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_sup.c | 148 |
19 files changed, 2198 insertions, 1323 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 9f41b3b4358..5926f5a87ea 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -356,7 +356,8 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, | |||
356 | else if (start == (ha->flt_region_boot * 4) || | 356 | else if (start == (ha->flt_region_boot * 4) || |
357 | start == (ha->flt_region_fw * 4)) | 357 | start == (ha->flt_region_fw * 4)) |
358 | valid = 1; | 358 | valid = 1; |
359 | else if (IS_QLA25XX(ha) || IS_QLA8XXX_TYPE(ha)) | 359 | else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) |
360 | || IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)) | ||
360 | valid = 1; | 361 | valid = 1; |
361 | if (!valid) { | 362 | if (!valid) { |
362 | ql_log(ql_log_warn, vha, 0x7065, | 363 | ql_log(ql_log_warn, vha, 0x7065, |
@@ -627,144 +628,6 @@ static struct bin_attribute sysfs_reset_attr = { | |||
627 | }; | 628 | }; |
628 | 629 | ||
629 | static ssize_t | 630 | static ssize_t |
630 | qla2x00_sysfs_write_edc(struct file *filp, struct kobject *kobj, | ||
631 | struct bin_attribute *bin_attr, | ||
632 | char *buf, loff_t off, size_t count) | ||
633 | { | ||
634 | struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, | ||
635 | struct device, kobj))); | ||
636 | struct qla_hw_data *ha = vha->hw; | ||
637 | uint16_t dev, adr, opt, len; | ||
638 | int rval; | ||
639 | |||
640 | ha->edc_data_len = 0; | ||
641 | |||
642 | if (!capable(CAP_SYS_ADMIN) || off != 0 || count < 8) | ||
643 | return -EINVAL; | ||
644 | |||
645 | if (!ha->edc_data) { | ||
646 | ha->edc_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, | ||
647 | &ha->edc_data_dma); | ||
648 | if (!ha->edc_data) { | ||
649 | ql_log(ql_log_warn, vha, 0x7073, | ||
650 | "Unable to allocate memory for EDC write.\n"); | ||
651 | return -ENOMEM; | ||
652 | } | ||
653 | } | ||
654 | |||
655 | dev = le16_to_cpup((void *)&buf[0]); | ||
656 | adr = le16_to_cpup((void *)&buf[2]); | ||
657 | opt = le16_to_cpup((void *)&buf[4]); | ||
658 | len = le16_to_cpup((void *)&buf[6]); | ||
659 | |||
660 | if (!(opt & BIT_0)) | ||
661 | if (len == 0 || len > DMA_POOL_SIZE || len > count - 8) | ||
662 | return -EINVAL; | ||
663 | |||
664 | memcpy(ha->edc_data, &buf[8], len); | ||
665 | |||
666 | rval = qla2x00_write_sfp(vha, ha->edc_data_dma, ha->edc_data, | ||
667 | dev, adr, len, opt); | ||
668 | if (rval != QLA_SUCCESS) { | ||
669 | ql_log(ql_log_warn, vha, 0x7074, | ||
670 | "Unable to write EDC (%x) %02x:%04x:%02x:%02x:%02hhx\n", | ||
671 | rval, dev, adr, opt, len, buf[8]); | ||
672 | return -EIO; | ||
673 | } | ||
674 | |||
675 | return count; | ||
676 | } | ||
677 | |||
678 | static struct bin_attribute sysfs_edc_attr = { | ||
679 | .attr = { | ||
680 | .name = "edc", | ||
681 | .mode = S_IWUSR, | ||
682 | }, | ||
683 | .size = 0, | ||
684 | .write = qla2x00_sysfs_write_edc, | ||
685 | }; | ||
686 | |||
687 | static ssize_t | ||
688 | qla2x00_sysfs_write_edc_status(struct file *filp, struct kobject *kobj, | ||
689 | struct bin_attribute *bin_attr, | ||
690 | char *buf, loff_t off, size_t count) | ||
691 | { | ||
692 | struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, | ||
693 | struct device, kobj))); | ||
694 | struct qla_hw_data *ha = vha->hw; | ||
695 | uint16_t dev, adr, opt, len; | ||
696 | int rval; | ||
697 | |||
698 | ha->edc_data_len = 0; | ||
699 | |||
700 | if (!capable(CAP_SYS_ADMIN) || off != 0 || count < 8) | ||
701 | return -EINVAL; | ||
702 | |||
703 | if (!ha->edc_data) { | ||
704 | ha->edc_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, | ||
705 | &ha->edc_data_dma); | ||
706 | if (!ha->edc_data) { | ||
707 | ql_log(ql_log_warn, vha, 0x708c, | ||
708 | "Unable to allocate memory for EDC status.\n"); | ||
709 | return -ENOMEM; | ||
710 | } | ||
711 | } | ||
712 | |||
713 | dev = le16_to_cpup((void *)&buf[0]); | ||
714 | adr = le16_to_cpup((void *)&buf[2]); | ||
715 | opt = le16_to_cpup((void *)&buf[4]); | ||
716 | len = le16_to_cpup((void *)&buf[6]); | ||
717 | |||
718 | if (!(opt & BIT_0)) | ||
719 | if (len == 0 || len > DMA_POOL_SIZE) | ||
720 | return -EINVAL; | ||
721 | |||
722 | memset(ha->edc_data, 0, len); | ||
723 | rval = qla2x00_read_sfp(vha, ha->edc_data_dma, ha->edc_data, | ||
724 | dev, adr, len, opt); | ||
725 | if (rval != QLA_SUCCESS) { | ||
726 | ql_log(ql_log_info, vha, 0x7075, | ||
727 | "Unable to write EDC status (%x) %02x:%04x:%02x:%02x.\n", | ||
728 | rval, dev, adr, opt, len); | ||
729 | return -EIO; | ||
730 | } | ||
731 | |||
732 | ha->edc_data_len = len; | ||
733 | |||
734 | return count; | ||
735 | } | ||
736 | |||
737 | static ssize_t | ||
738 | qla2x00_sysfs_read_edc_status(struct file *filp, struct kobject *kobj, | ||
739 | struct bin_attribute *bin_attr, | ||
740 | char *buf, loff_t off, size_t count) | ||
741 | { | ||
742 | struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, | ||
743 | struct device, kobj))); | ||
744 | struct qla_hw_data *ha = vha->hw; | ||
745 | |||
746 | if (!capable(CAP_SYS_ADMIN) || off != 0 || count == 0) | ||
747 | return 0; | ||
748 | |||
749 | if (!ha->edc_data || ha->edc_data_len == 0 || ha->edc_data_len > count) | ||
750 | return -EINVAL; | ||
751 | |||
752 | memcpy(buf, ha->edc_data, ha->edc_data_len); | ||
753 | |||
754 | return ha->edc_data_len; | ||
755 | } | ||
756 | |||
757 | static struct bin_attribute sysfs_edc_status_attr = { | ||
758 | .attr = { | ||
759 | .name = "edc_status", | ||
760 | .mode = S_IRUSR | S_IWUSR, | ||
761 | }, | ||
762 | .size = 0, | ||
763 | .write = qla2x00_sysfs_write_edc_status, | ||
764 | .read = qla2x00_sysfs_read_edc_status, | ||
765 | }; | ||
766 | |||
767 | static ssize_t | ||
768 | qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj, | 631 | qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj, |
769 | struct bin_attribute *bin_attr, | 632 | struct bin_attribute *bin_attr, |
770 | char *buf, loff_t off, size_t count) | 633 | char *buf, loff_t off, size_t count) |
@@ -879,8 +742,6 @@ static struct sysfs_entry { | |||
879 | { "vpd", &sysfs_vpd_attr, 1 }, | 742 | { "vpd", &sysfs_vpd_attr, 1 }, |
880 | { "sfp", &sysfs_sfp_attr, 1 }, | 743 | { "sfp", &sysfs_sfp_attr, 1 }, |
881 | { "reset", &sysfs_reset_attr, }, | 744 | { "reset", &sysfs_reset_attr, }, |
882 | { "edc", &sysfs_edc_attr, 2 }, | ||
883 | { "edc_status", &sysfs_edc_status_attr, 2 }, | ||
884 | { "xgmac_stats", &sysfs_xgmac_stats_attr, 3 }, | 745 | { "xgmac_stats", &sysfs_xgmac_stats_attr, 3 }, |
885 | { "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 }, | 746 | { "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 }, |
886 | { NULL }, | 747 | { NULL }, |
@@ -898,7 +759,7 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha) | |||
898 | continue; | 759 | continue; |
899 | if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw)) | 760 | if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw)) |
900 | continue; | 761 | continue; |
901 | if (iter->is4GBp_only == 3 && !(IS_QLA8XXX_TYPE(vha->hw))) | 762 | if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw))) |
902 | continue; | 763 | continue; |
903 | 764 | ||
904 | ret = sysfs_create_bin_file(&host->shost_gendev.kobj, | 765 | ret = sysfs_create_bin_file(&host->shost_gendev.kobj, |
@@ -926,7 +787,7 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha) | |||
926 | continue; | 787 | continue; |
927 | if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha)) | 788 | if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha)) |
928 | continue; | 789 | continue; |
929 | if (iter->is4GBp_only == 3 && !!(IS_QLA8XXX_TYPE(vha->hw))) | 790 | if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw))) |
930 | continue; | 791 | continue; |
931 | 792 | ||
932 | sysfs_remove_bin_file(&host->shost_gendev.kobj, | 793 | sysfs_remove_bin_file(&host->shost_gendev.kobj, |
@@ -1231,7 +1092,7 @@ qla2x00_optrom_gold_fw_version_show(struct device *dev, | |||
1231 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); | 1092 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); |
1232 | struct qla_hw_data *ha = vha->hw; | 1093 | struct qla_hw_data *ha = vha->hw; |
1233 | 1094 | ||
1234 | if (!IS_QLA81XX(ha)) | 1095 | if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha)) |
1235 | return snprintf(buf, PAGE_SIZE, "\n"); | 1096 | return snprintf(buf, PAGE_SIZE, "\n"); |
1236 | 1097 | ||
1237 | return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n", | 1098 | return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n", |
@@ -1278,7 +1139,7 @@ qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr, | |||
1278 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); | 1139 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); |
1279 | struct qla_hw_data *ha = vha->hw; | 1140 | struct qla_hw_data *ha = vha->hw; |
1280 | 1141 | ||
1281 | if (!IS_QLA81XX(ha)) | 1142 | if (!IS_QLA81XX(ha) && !IS_QLA8031(ha)) |
1282 | return snprintf(buf, PAGE_SIZE, "\n"); | 1143 | return snprintf(buf, PAGE_SIZE, "\n"); |
1283 | 1144 | ||
1284 | return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n", | 1145 | return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n", |
@@ -1293,7 +1154,7 @@ qla2x00_phy_version_show(struct device *dev, struct device_attribute *attr, | |||
1293 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); | 1154 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); |
1294 | struct qla_hw_data *ha = vha->hw; | 1155 | struct qla_hw_data *ha = vha->hw; |
1295 | 1156 | ||
1296 | if (!IS_QLA81XX(ha)) | 1157 | if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha)) |
1297 | return snprintf(buf, PAGE_SIZE, "\n"); | 1158 | return snprintf(buf, PAGE_SIZE, "\n"); |
1298 | 1159 | ||
1299 | return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n", | 1160 | return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n", |
@@ -1316,7 +1177,7 @@ qla2x00_vlan_id_show(struct device *dev, struct device_attribute *attr, | |||
1316 | { | 1177 | { |
1317 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); | 1178 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); |
1318 | 1179 | ||
1319 | if (!IS_QLA8XXX_TYPE(vha->hw)) | 1180 | if (!IS_CNA_CAPABLE(vha->hw)) |
1320 | return snprintf(buf, PAGE_SIZE, "\n"); | 1181 | return snprintf(buf, PAGE_SIZE, "\n"); |
1321 | 1182 | ||
1322 | return snprintf(buf, PAGE_SIZE, "%d\n", vha->fcoe_vlan_id); | 1183 | return snprintf(buf, PAGE_SIZE, "%d\n", vha->fcoe_vlan_id); |
@@ -1328,7 +1189,7 @@ qla2x00_vn_port_mac_address_show(struct device *dev, | |||
1328 | { | 1189 | { |
1329 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); | 1190 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); |
1330 | 1191 | ||
1331 | if (!IS_QLA8XXX_TYPE(vha->hw)) | 1192 | if (!IS_CNA_CAPABLE(vha->hw)) |
1332 | return snprintf(buf, PAGE_SIZE, "\n"); | 1193 | return snprintf(buf, PAGE_SIZE, "\n"); |
1333 | 1194 | ||
1334 | return snprintf(buf, PAGE_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x\n", | 1195 | return snprintf(buf, PAGE_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x\n", |
@@ -1364,7 +1225,7 @@ qla2x00_thermal_temp_show(struct device *dev, | |||
1364 | else if (!vha->hw->flags.eeh_busy) | 1225 | else if (!vha->hw->flags.eeh_busy) |
1365 | rval = qla2x00_get_thermal_temp(vha, &temp, &frac); | 1226 | rval = qla2x00_get_thermal_temp(vha, &temp, &frac); |
1366 | if (rval != QLA_SUCCESS) | 1227 | if (rval != QLA_SUCCESS) |
1367 | temp = frac = 0; | 1228 | return snprintf(buf, PAGE_SIZE, "\n"); |
1368 | 1229 | ||
1369 | return snprintf(buf, PAGE_SIZE, "%d.%02d\n", temp, frac); | 1230 | return snprintf(buf, PAGE_SIZE, "%d.%02d\n", temp, frac); |
1370 | } | 1231 | } |
@@ -1493,6 +1354,9 @@ qla2x00_get_host_speed(struct Scsi_Host *shost) | |||
1493 | case PORT_SPEED_10GB: | 1354 | case PORT_SPEED_10GB: |
1494 | speed = FC_PORTSPEED_10GBIT; | 1355 | speed = FC_PORTSPEED_10GBIT; |
1495 | break; | 1356 | break; |
1357 | case PORT_SPEED_16GB: | ||
1358 | speed = FC_PORTSPEED_16GBIT; | ||
1359 | break; | ||
1496 | } | 1360 | } |
1497 | fc_host_speed(shost) = speed; | 1361 | fc_host_speed(shost) = speed; |
1498 | } | 1362 | } |
@@ -1643,10 +1507,14 @@ qla2x00_terminate_rport_io(struct fc_rport *rport) | |||
1643 | * final cleanup of firmware resources (PCBs and XCBs). | 1507 | * final cleanup of firmware resources (PCBs and XCBs). |
1644 | */ | 1508 | */ |
1645 | if (fcport->loop_id != FC_NO_LOOP_ID && | 1509 | if (fcport->loop_id != FC_NO_LOOP_ID && |
1646 | !test_bit(UNLOADING, &fcport->vha->dpc_flags)) | 1510 | !test_bit(UNLOADING, &fcport->vha->dpc_flags)) { |
1647 | fcport->vha->hw->isp_ops->fabric_logout(fcport->vha, | 1511 | if (IS_FWI2_CAPABLE(fcport->vha->hw)) |
1648 | fcport->loop_id, fcport->d_id.b.domain, | 1512 | fcport->vha->hw->isp_ops->fabric_logout(fcport->vha, |
1649 | fcport->d_id.b.area, fcport->d_id.b.al_pa); | 1513 | fcport->loop_id, fcport->d_id.b.domain, |
1514 | fcport->d_id.b.area, fcport->d_id.b.al_pa); | ||
1515 | else | ||
1516 | qla2x00_port_logout(fcport->vha, fcport); | ||
1517 | } | ||
1650 | } | 1518 | } |
1651 | 1519 | ||
1652 | static int | 1520 | static int |
@@ -1889,6 +1757,7 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) | |||
1889 | break; | 1757 | break; |
1890 | } | 1758 | } |
1891 | } | 1759 | } |
1760 | |||
1892 | if (qos) { | 1761 | if (qos) { |
1893 | ret = qla25xx_create_req_que(ha, options, vha->vp_idx, 0, 0, | 1762 | ret = qla25xx_create_req_que(ha, options, vha->vp_idx, 0, 0, |
1894 | qos); | 1763 | qos); |
@@ -2086,7 +1955,7 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha) | |||
2086 | fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; | 1955 | fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; |
2087 | fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; | 1956 | fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; |
2088 | 1957 | ||
2089 | if (IS_QLA8XXX_TYPE(ha)) | 1958 | if (IS_CNA_CAPABLE(ha)) |
2090 | speed = FC_PORTSPEED_10GBIT; | 1959 | speed = FC_PORTSPEED_10GBIT; |
2091 | else if (IS_QLA25XX(ha)) | 1960 | else if (IS_QLA25XX(ha)) |
2092 | speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | | 1961 | speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | |
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c index 2c4714279bc..f74cc0602f3 100644 --- a/drivers/scsi/qla2xxx/qla_bsg.c +++ b/drivers/scsi/qla2xxx/qla_bsg.c | |||
@@ -11,29 +11,36 @@ | |||
11 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
12 | 12 | ||
13 | /* BSG support for ELS/CT pass through */ | 13 | /* BSG support for ELS/CT pass through */ |
14 | inline srb_t * | 14 | void |
15 | qla2x00_get_ctx_bsg_sp(scsi_qla_host_t *vha, fc_port_t *fcport, size_t size) | 15 | qla2x00_bsg_job_done(void *data, void *ptr, int res) |
16 | { | 16 | { |
17 | srb_t *sp; | 17 | srb_t *sp = (srb_t *)ptr; |
18 | struct scsi_qla_host *vha = (scsi_qla_host_t *)data; | ||
19 | struct fc_bsg_job *bsg_job = sp->u.bsg_job; | ||
20 | |||
21 | bsg_job->reply->result = res; | ||
22 | bsg_job->job_done(bsg_job); | ||
23 | sp->free(vha, sp); | ||
24 | } | ||
25 | |||
26 | void | ||
27 | qla2x00_bsg_sp_free(void *data, void *ptr) | ||
28 | { | ||
29 | srb_t *sp = (srb_t *)ptr; | ||
30 | struct scsi_qla_host *vha = (scsi_qla_host_t *)data; | ||
31 | struct fc_bsg_job *bsg_job = sp->u.bsg_job; | ||
18 | struct qla_hw_data *ha = vha->hw; | 32 | struct qla_hw_data *ha = vha->hw; |
19 | struct srb_ctx *ctx; | ||
20 | 33 | ||
21 | sp = mempool_alloc(ha->srb_mempool, GFP_KERNEL); | 34 | dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, |
22 | if (!sp) | 35 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); |
23 | goto done; | ||
24 | ctx = kzalloc(size, GFP_KERNEL); | ||
25 | if (!ctx) { | ||
26 | mempool_free(sp, ha->srb_mempool); | ||
27 | sp = NULL; | ||
28 | goto done; | ||
29 | } | ||
30 | 36 | ||
31 | memset(sp, 0, sizeof(*sp)); | 37 | dma_unmap_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list, |
32 | sp->fcport = fcport; | 38 | bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE); |
33 | sp->ctx = ctx; | 39 | |
34 | ctx->iocbs = 1; | 40 | if (sp->type == SRB_CT_CMD || |
35 | done: | 41 | sp->type == SRB_ELS_CMD_HST) |
36 | return sp; | 42 | kfree(sp->fcport); |
43 | mempool_free(sp, vha->hw->srb_mempool); | ||
37 | } | 44 | } |
38 | 45 | ||
39 | int | 46 | int |
@@ -101,8 +108,6 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job) | |||
101 | uint32_t len; | 108 | uint32_t len; |
102 | uint32_t oper; | 109 | uint32_t oper; |
103 | 110 | ||
104 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
105 | |||
106 | if (!(IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA82XX(ha))) { | 111 | if (!(IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA82XX(ha))) { |
107 | ret = -EINVAL; | 112 | ret = -EINVAL; |
108 | goto exit_fcp_prio_cfg; | 113 | goto exit_fcp_prio_cfg; |
@@ -217,6 +222,7 @@ exit_fcp_prio_cfg: | |||
217 | bsg_job->job_done(bsg_job); | 222 | bsg_job->job_done(bsg_job); |
218 | return ret; | 223 | return ret; |
219 | } | 224 | } |
225 | |||
220 | static int | 226 | static int |
221 | qla2x00_process_els(struct fc_bsg_job *bsg_job) | 227 | qla2x00_process_els(struct fc_bsg_job *bsg_job) |
222 | { | 228 | { |
@@ -230,7 +236,6 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job) | |||
230 | int req_sg_cnt, rsp_sg_cnt; | 236 | int req_sg_cnt, rsp_sg_cnt; |
231 | int rval = (DRIVER_ERROR << 16); | 237 | int rval = (DRIVER_ERROR << 16); |
232 | uint16_t nextlid = 0; | 238 | uint16_t nextlid = 0; |
233 | struct srb_ctx *els; | ||
234 | 239 | ||
235 | if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) { | 240 | if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) { |
236 | rport = bsg_job->rport; | 241 | rport = bsg_job->rport; |
@@ -337,20 +342,21 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job) | |||
337 | } | 342 | } |
338 | 343 | ||
339 | /* Alloc SRB structure */ | 344 | /* Alloc SRB structure */ |
340 | sp = qla2x00_get_ctx_bsg_sp(vha, fcport, sizeof(struct srb_ctx)); | 345 | sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); |
341 | if (!sp) { | 346 | if (!sp) { |
342 | rval = -ENOMEM; | 347 | rval = -ENOMEM; |
343 | goto done_unmap_sg; | 348 | goto done_unmap_sg; |
344 | } | 349 | } |
345 | 350 | ||
346 | els = sp->ctx; | 351 | sp->type = |
347 | els->type = | ||
348 | (bsg_job->request->msgcode == FC_BSG_RPT_ELS ? | 352 | (bsg_job->request->msgcode == FC_BSG_RPT_ELS ? |
349 | SRB_ELS_CMD_RPT : SRB_ELS_CMD_HST); | 353 | SRB_ELS_CMD_RPT : SRB_ELS_CMD_HST); |
350 | els->name = | 354 | sp->name = |
351 | (bsg_job->request->msgcode == FC_BSG_RPT_ELS ? | 355 | (bsg_job->request->msgcode == FC_BSG_RPT_ELS ? |
352 | "bsg_els_rpt" : "bsg_els_hst"); | 356 | "bsg_els_rpt" : "bsg_els_hst"); |
353 | els->u.bsg_job = bsg_job; | 357 | sp->u.bsg_job = bsg_job; |
358 | sp->free = qla2x00_bsg_sp_free; | ||
359 | sp->done = qla2x00_bsg_job_done; | ||
354 | 360 | ||
355 | ql_dbg(ql_dbg_user, vha, 0x700a, | 361 | ql_dbg(ql_dbg_user, vha, 0x700a, |
356 | "bsg rqst type: %s els type: %x - loop-id=%x " | 362 | "bsg rqst type: %s els type: %x - loop-id=%x " |
@@ -362,7 +368,6 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job) | |||
362 | if (rval != QLA_SUCCESS) { | 368 | if (rval != QLA_SUCCESS) { |
363 | ql_log(ql_log_warn, vha, 0x700e, | 369 | ql_log(ql_log_warn, vha, 0x700e, |
364 | "qla2x00_start_sp failed = %d\n", rval); | 370 | "qla2x00_start_sp failed = %d\n", rval); |
365 | kfree(sp->ctx); | ||
366 | mempool_free(sp, ha->srb_mempool); | 371 | mempool_free(sp, ha->srb_mempool); |
367 | rval = -EIO; | 372 | rval = -EIO; |
368 | goto done_unmap_sg; | 373 | goto done_unmap_sg; |
@@ -409,7 +414,6 @@ qla2x00_process_ct(struct fc_bsg_job *bsg_job) | |||
409 | uint16_t loop_id; | 414 | uint16_t loop_id; |
410 | struct fc_port *fcport; | 415 | struct fc_port *fcport; |
411 | char *type = "FC_BSG_HST_CT"; | 416 | char *type = "FC_BSG_HST_CT"; |
412 | struct srb_ctx *ct; | ||
413 | 417 | ||
414 | req_sg_cnt = | 418 | req_sg_cnt = |
415 | dma_map_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, | 419 | dma_map_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, |
@@ -486,19 +490,20 @@ qla2x00_process_ct(struct fc_bsg_job *bsg_job) | |||
486 | fcport->loop_id = loop_id; | 490 | fcport->loop_id = loop_id; |
487 | 491 | ||
488 | /* Alloc SRB structure */ | 492 | /* Alloc SRB structure */ |
489 | sp = qla2x00_get_ctx_bsg_sp(vha, fcport, sizeof(struct srb_ctx)); | 493 | sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); |
490 | if (!sp) { | 494 | if (!sp) { |
491 | ql_log(ql_log_warn, vha, 0x7015, | 495 | ql_log(ql_log_warn, vha, 0x7015, |
492 | "qla2x00_get_ctx_bsg_sp failed.\n"); | 496 | "qla2x00_get_sp failed.\n"); |
493 | rval = -ENOMEM; | 497 | rval = -ENOMEM; |
494 | goto done_free_fcport; | 498 | goto done_free_fcport; |
495 | } | 499 | } |
496 | 500 | ||
497 | ct = sp->ctx; | 501 | sp->type = SRB_CT_CMD; |
498 | ct->type = SRB_CT_CMD; | 502 | sp->name = "bsg_ct"; |
499 | ct->name = "bsg_ct"; | 503 | sp->iocbs = qla24xx_calc_ct_iocbs(req_sg_cnt + rsp_sg_cnt); |
500 | ct->iocbs = qla24xx_calc_ct_iocbs(req_sg_cnt + rsp_sg_cnt); | 504 | sp->u.bsg_job = bsg_job; |
501 | ct->u.bsg_job = bsg_job; | 505 | sp->free = qla2x00_bsg_sp_free; |
506 | sp->done = qla2x00_bsg_job_done; | ||
502 | 507 | ||
503 | ql_dbg(ql_dbg_user, vha, 0x7016, | 508 | ql_dbg(ql_dbg_user, vha, 0x7016, |
504 | "bsg rqst type: %s else type: %x - " | 509 | "bsg rqst type: %s else type: %x - " |
@@ -511,7 +516,6 @@ qla2x00_process_ct(struct fc_bsg_job *bsg_job) | |||
511 | if (rval != QLA_SUCCESS) { | 516 | if (rval != QLA_SUCCESS) { |
512 | ql_log(ql_log_warn, vha, 0x7017, | 517 | ql_log(ql_log_warn, vha, 0x7017, |
513 | "qla2x00_start_sp failed=%d.\n", rval); | 518 | "qla2x00_start_sp failed=%d.\n", rval); |
514 | kfree(sp->ctx); | ||
515 | mempool_free(sp, ha->srb_mempool); | 519 | mempool_free(sp, ha->srb_mempool); |
516 | rval = -EIO; | 520 | rval = -EIO; |
517 | goto done_free_fcport; | 521 | goto done_free_fcport; |
@@ -540,7 +544,7 @@ qla81xx_set_internal_loopback(scsi_qla_host_t *vha, uint16_t *config, | |||
540 | int rval = 0; | 544 | int rval = 0; |
541 | struct qla_hw_data *ha = vha->hw; | 545 | struct qla_hw_data *ha = vha->hw; |
542 | 546 | ||
543 | if (!IS_QLA81XX(ha)) | 547 | if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha)) |
544 | goto done_set_internal; | 548 | goto done_set_internal; |
545 | 549 | ||
546 | new_config[0] = config[0] | (ENABLE_INTERNAL_LOOPBACK << 1); | 550 | new_config[0] = config[0] | (ENABLE_INTERNAL_LOOPBACK << 1); |
@@ -582,7 +586,7 @@ qla81xx_reset_internal_loopback(scsi_qla_host_t *vha, uint16_t *config, | |||
582 | uint16_t new_config[4]; | 586 | uint16_t new_config[4]; |
583 | struct qla_hw_data *ha = vha->hw; | 587 | struct qla_hw_data *ha = vha->hw; |
584 | 588 | ||
585 | if (!IS_QLA81XX(ha)) | 589 | if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha)) |
586 | goto done_reset_internal; | 590 | goto done_reset_internal; |
587 | 591 | ||
588 | memset(new_config, 0 , sizeof(new_config)); | 592 | memset(new_config, 0 , sizeof(new_config)); |
@@ -707,7 +711,7 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
707 | 711 | ||
708 | if ((ha->current_topology == ISP_CFG_F || | 712 | if ((ha->current_topology == ISP_CFG_F || |
709 | (atomic_read(&vha->loop_state) == LOOP_DOWN) || | 713 | (atomic_read(&vha->loop_state) == LOOP_DOWN) || |
710 | (IS_QLA81XX(ha) && | 714 | ((IS_QLA81XX(ha) || IS_QLA83XX(ha)) && |
711 | le32_to_cpu(*(uint32_t *)req_data) == ELS_OPCODE_BYTE | 715 | le32_to_cpu(*(uint32_t *)req_data) == ELS_OPCODE_BYTE |
712 | && req_data_len == MAX_ELS_FRAME_PAYLOAD)) && | 716 | && req_data_len == MAX_ELS_FRAME_PAYLOAD)) && |
713 | elreq.options == EXTERNAL_LOOPBACK) { | 717 | elreq.options == EXTERNAL_LOOPBACK) { |
@@ -717,13 +721,12 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
717 | command_sent = INT_DEF_LB_ECHO_CMD; | 721 | command_sent = INT_DEF_LB_ECHO_CMD; |
718 | rval = qla2x00_echo_test(vha, &elreq, response); | 722 | rval = qla2x00_echo_test(vha, &elreq, response); |
719 | } else { | 723 | } else { |
720 | if (IS_QLA81XX(ha)) { | 724 | if (IS_QLA81XX(ha) || IS_QLA8031(ha)) { |
721 | memset(config, 0, sizeof(config)); | 725 | memset(config, 0, sizeof(config)); |
722 | memset(new_config, 0, sizeof(new_config)); | 726 | memset(new_config, 0, sizeof(new_config)); |
723 | if (qla81xx_get_port_config(vha, config)) { | 727 | if (qla81xx_get_port_config(vha, config)) { |
724 | ql_log(ql_log_warn, vha, 0x701f, | 728 | ql_log(ql_log_warn, vha, 0x701f, |
725 | "Get port config failed.\n"); | 729 | "Get port config failed.\n"); |
726 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
727 | bsg_job->reply->result = (DID_ERROR << 16); | 730 | bsg_job->reply->result = (DID_ERROR << 16); |
728 | rval = -EPERM; | 731 | rval = -EPERM; |
729 | goto done_free_dma_req; | 732 | goto done_free_dma_req; |
@@ -737,8 +740,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
737 | new_config)) { | 740 | new_config)) { |
738 | ql_log(ql_log_warn, vha, 0x7024, | 741 | ql_log(ql_log_warn, vha, 0x7024, |
739 | "Internal loopback failed.\n"); | 742 | "Internal loopback failed.\n"); |
740 | bsg_job->reply->reply_payload_rcv_len = | ||
741 | 0; | ||
742 | bsg_job->reply->result = | 743 | bsg_job->reply->result = |
743 | (DID_ERROR << 16); | 744 | (DID_ERROR << 16); |
744 | rval = -EPERM; | 745 | rval = -EPERM; |
@@ -750,8 +751,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
750 | */ | 751 | */ |
751 | if (qla81xx_reset_internal_loopback(vha, | 752 | if (qla81xx_reset_internal_loopback(vha, |
752 | config, 1)) { | 753 | config, 1)) { |
753 | bsg_job->reply->reply_payload_rcv_len = | ||
754 | 0; | ||
755 | bsg_job->reply->result = | 754 | bsg_job->reply->result = |
756 | (DID_ERROR << 16); | 755 | (DID_ERROR << 16); |
757 | rval = -EPERM; | 756 | rval = -EPERM; |
@@ -788,7 +787,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
788 | "MPI reset failed.\n"); | 787 | "MPI reset failed.\n"); |
789 | } | 788 | } |
790 | 789 | ||
791 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
792 | bsg_job->reply->result = (DID_ERROR << 16); | 790 | bsg_job->reply->result = (DID_ERROR << 16); |
793 | rval = -EIO; | 791 | rval = -EIO; |
794 | goto done_free_dma_req; | 792 | goto done_free_dma_req; |
@@ -813,7 +811,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
813 | fw_sts_ptr += sizeof(response); | 811 | fw_sts_ptr += sizeof(response); |
814 | *fw_sts_ptr = command_sent; | 812 | *fw_sts_ptr = command_sent; |
815 | rval = 0; | 813 | rval = 0; |
816 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
817 | bsg_job->reply->result = (DID_ERROR << 16); | 814 | bsg_job->reply->result = (DID_ERROR << 16); |
818 | } else { | 815 | } else { |
819 | ql_dbg(ql_dbg_user, vha, 0x702d, | 816 | ql_dbg(ql_dbg_user, vha, 0x702d, |
@@ -872,7 +869,7 @@ qla84xx_reset(struct fc_bsg_job *bsg_job) | |||
872 | if (rval) { | 869 | if (rval) { |
873 | ql_log(ql_log_warn, vha, 0x7030, | 870 | ql_log(ql_log_warn, vha, 0x7030, |
874 | "Vendor request 84xx reset failed.\n"); | 871 | "Vendor request 84xx reset failed.\n"); |
875 | rval = bsg_job->reply->reply_payload_rcv_len = 0; | 872 | rval = 0; |
876 | bsg_job->reply->result = (DID_ERROR << 16); | 873 | bsg_job->reply->result = (DID_ERROR << 16); |
877 | 874 | ||
878 | } else { | 875 | } else { |
@@ -971,9 +968,8 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job) | |||
971 | ql_log(ql_log_warn, vha, 0x7037, | 968 | ql_log(ql_log_warn, vha, 0x7037, |
972 | "Vendor request 84xx updatefw failed.\n"); | 969 | "Vendor request 84xx updatefw failed.\n"); |
973 | 970 | ||
974 | rval = bsg_job->reply->reply_payload_rcv_len = 0; | 971 | rval = 0; |
975 | bsg_job->reply->result = (DID_ERROR << 16); | 972 | bsg_job->reply->result = (DID_ERROR << 16); |
976 | |||
977 | } else { | 973 | } else { |
978 | ql_dbg(ql_dbg_user, vha, 0x7038, | 974 | ql_dbg(ql_dbg_user, vha, 0x7038, |
979 | "Vendor request 84xx updatefw completed.\n"); | 975 | "Vendor request 84xx updatefw completed.\n"); |
@@ -1159,7 +1155,7 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job) | |||
1159 | ql_log(ql_log_warn, vha, 0x7043, | 1155 | ql_log(ql_log_warn, vha, 0x7043, |
1160 | "Vendor request 84xx mgmt failed.\n"); | 1156 | "Vendor request 84xx mgmt failed.\n"); |
1161 | 1157 | ||
1162 | rval = bsg_job->reply->reply_payload_rcv_len = 0; | 1158 | rval = 0; |
1163 | bsg_job->reply->result = (DID_ERROR << 16); | 1159 | bsg_job->reply->result = (DID_ERROR << 16); |
1164 | 1160 | ||
1165 | } else { | 1161 | } else { |
@@ -1210,8 +1206,6 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job) | |||
1210 | uint16_t mb[MAILBOX_REGISTER_COUNT]; | 1206 | uint16_t mb[MAILBOX_REGISTER_COUNT]; |
1211 | uint8_t *rsp_ptr = NULL; | 1207 | uint8_t *rsp_ptr = NULL; |
1212 | 1208 | ||
1213 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
1214 | |||
1215 | if (!IS_IIDMA_CAPABLE(vha->hw)) { | 1209 | if (!IS_IIDMA_CAPABLE(vha->hw)) { |
1216 | ql_log(ql_log_info, vha, 0x7046, "iiDMA not supported.\n"); | 1210 | ql_log(ql_log_info, vha, 0x7046, "iiDMA not supported.\n"); |
1217 | return -EINVAL; | 1211 | return -EINVAL; |
@@ -1304,8 +1298,6 @@ qla2x00_optrom_setup(struct fc_bsg_job *bsg_job, scsi_qla_host_t *vha, | |||
1304 | int valid = 0; | 1298 | int valid = 0; |
1305 | struct qla_hw_data *ha = vha->hw; | 1299 | struct qla_hw_data *ha = vha->hw; |
1306 | 1300 | ||
1307 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
1308 | |||
1309 | if (unlikely(pci_channel_offline(ha->pdev))) | 1301 | if (unlikely(pci_channel_offline(ha->pdev))) |
1310 | return -EINVAL; | 1302 | return -EINVAL; |
1311 | 1303 | ||
@@ -1331,7 +1323,7 @@ qla2x00_optrom_setup(struct fc_bsg_job *bsg_job, scsi_qla_host_t *vha, | |||
1331 | start == (ha->flt_region_fw * 4)) | 1323 | start == (ha->flt_region_fw * 4)) |
1332 | valid = 1; | 1324 | valid = 1; |
1333 | else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || | 1325 | else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || |
1334 | IS_QLA8XXX_TYPE(ha)) | 1326 | IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)) |
1335 | valid = 1; | 1327 | valid = 1; |
1336 | if (!valid) { | 1328 | if (!valid) { |
1337 | ql_log(ql_log_warn, vha, 0x7058, | 1329 | ql_log(ql_log_warn, vha, 0x7058, |
@@ -1617,6 +1609,9 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job) | |||
1617 | struct Scsi_Host *host; | 1609 | struct Scsi_Host *host; |
1618 | scsi_qla_host_t *vha; | 1610 | scsi_qla_host_t *vha; |
1619 | 1611 | ||
1612 | /* In case no data transferred. */ | ||
1613 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
1614 | |||
1620 | if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) { | 1615 | if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) { |
1621 | rport = bsg_job->rport; | 1616 | rport = bsg_job->rport; |
1622 | fcport = *(fc_port_t **) rport->dd_data; | 1617 | fcport = *(fc_port_t **) rport->dd_data; |
@@ -1655,6 +1650,7 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job) | |||
1655 | case FC_BSG_RPT_CT: | 1650 | case FC_BSG_RPT_CT: |
1656 | default: | 1651 | default: |
1657 | ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n"); | 1652 | ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n"); |
1653 | bsg_job->reply->result = ret; | ||
1658 | break; | 1654 | break; |
1659 | } | 1655 | } |
1660 | return ret; | 1656 | return ret; |
@@ -1669,7 +1665,6 @@ qla24xx_bsg_timeout(struct fc_bsg_job *bsg_job) | |||
1669 | int cnt, que; | 1665 | int cnt, que; |
1670 | unsigned long flags; | 1666 | unsigned long flags; |
1671 | struct req_que *req; | 1667 | struct req_que *req; |
1672 | struct srb_ctx *sp_bsg; | ||
1673 | 1668 | ||
1674 | /* find the bsg job from the active list of commands */ | 1669 | /* find the bsg job from the active list of commands */ |
1675 | spin_lock_irqsave(&ha->hardware_lock, flags); | 1670 | spin_lock_irqsave(&ha->hardware_lock, flags); |
@@ -1681,11 +1676,9 @@ qla24xx_bsg_timeout(struct fc_bsg_job *bsg_job) | |||
1681 | for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { | 1676 | for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { |
1682 | sp = req->outstanding_cmds[cnt]; | 1677 | sp = req->outstanding_cmds[cnt]; |
1683 | if (sp) { | 1678 | if (sp) { |
1684 | sp_bsg = sp->ctx; | 1679 | if (((sp->type == SRB_CT_CMD) || |
1685 | 1680 | (sp->type == SRB_ELS_CMD_HST)) | |
1686 | if (((sp_bsg->type == SRB_CT_CMD) || | 1681 | && (sp->u.bsg_job == bsg_job)) { |
1687 | (sp_bsg->type == SRB_ELS_CMD_HST)) | ||
1688 | && (sp_bsg->u.bsg_job == bsg_job)) { | ||
1689 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1682 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1690 | if (ha->isp_ops->abort_command(sp)) { | 1683 | if (ha->isp_ops->abort_command(sp)) { |
1691 | ql_log(ql_log_warn, vha, 0x7089, | 1684 | ql_log(ql_log_warn, vha, 0x7089, |
@@ -1715,7 +1708,6 @@ done: | |||
1715 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1708 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1716 | if (bsg_job->request->msgcode == FC_BSG_HST_CT) | 1709 | if (bsg_job->request->msgcode == FC_BSG_HST_CT) |
1717 | kfree(sp->fcport); | 1710 | kfree(sp->fcport); |
1718 | kfree(sp->ctx); | ||
1719 | mempool_free(sp, ha->srb_mempool); | 1711 | mempool_free(sp, ha->srb_mempool); |
1720 | return 0; | 1712 | return 0; |
1721 | } | 1713 | } |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 45cbf0ba624..897731b93df 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -11,23 +11,27 @@ | |||
11 | * ---------------------------------------------------------------------- | 11 | * ---------------------------------------------------------------------- |
12 | * | Level | Last Value Used | Holes | | 12 | * | Level | Last Value Used | Holes | |
13 | * ---------------------------------------------------------------------- | 13 | * ---------------------------------------------------------------------- |
14 | * | Module Init and Probe | 0x0116 | 0xfa | | 14 | * | Module Init and Probe | 0x0120 | 0x4b,0xba,0xfa | |
15 | * | Mailbox commands | 0x112b | | | 15 | * | Mailbox commands | 0x113e | 0x112c-0x112e | |
16 | * | Device Discovery | 0x2084 | | | 16 | * | | | 0x113a | |
17 | * | Queue Command and IO tracing | 0x302f | 0x3008,0x302d, | | 17 | * | Device Discovery | 0x2086 | 0x2020-0x2022 | |
18 | * | | | 0x302e | | 18 | * | Queue Command and IO tracing | 0x302f | 0x3006,0x3008 | |
19 | * | | | 0x302d-0x302e | | ||
19 | * | DPC Thread | 0x401c | | | 20 | * | DPC Thread | 0x401c | | |
20 | * | Async Events | 0x5057 | 0x5052 | | 21 | * | Async Events | 0x505d | 0x502b-0x502f | |
21 | * | Timer Routines | 0x6011 | 0x600e,0x600f | | 22 | * | | | 0x5047,0x5052 | |
22 | * | User Space Interactions | 0x709e | 0x7018,0x702e | | 23 | * | Timer Routines | 0x6011 | 0x600e-0x600f | |
23 | * | | | 0x7039,0x7045 | | 24 | * | User Space Interactions | 0x709f | 0x7018,0x702e, | |
25 | * | | | 0x7039,0x7045, | | ||
26 | * | | | 0x7073-0x7075, | | ||
27 | * | | | 0x708c | | ||
24 | * | Task Management | 0x803c | 0x8025-0x8026 | | 28 | * | Task Management | 0x803c | 0x8025-0x8026 | |
25 | * | | | 0x800b,0x8039 | | 29 | * | | | 0x800b,0x8039 | |
26 | * | AER/EEH | 0x900f | | | 30 | * | AER/EEH | 0x900f | | |
27 | * | Virtual Port | 0xa007 | | | 31 | * | Virtual Port | 0xa007 | | |
28 | * | ISP82XX Specific | 0xb052 | | | 32 | * | ISP82XX Specific | 0xb054 | 0xb053 | |
29 | * | MultiQ | 0xc00b | | | 33 | * | MultiQ | 0xc00c | | |
30 | * | Misc | 0xd00b | | | 34 | * | Misc | 0xd010 | | |
31 | * ---------------------------------------------------------------------- | 35 | * ---------------------------------------------------------------------- |
32 | */ | 36 | */ |
33 | 37 | ||
@@ -85,7 +89,7 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram, | |||
85 | WRT_REG_WORD(®->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED); | 89 | WRT_REG_WORD(®->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED); |
86 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); | 90 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); |
87 | 91 | ||
88 | dwords = GID_LIST_SIZE / 4; | 92 | dwords = qla2x00_gid_list_size(ha) / 4; |
89 | for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS; | 93 | for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS; |
90 | cnt += dwords, addr += dwords) { | 94 | cnt += dwords, addr += dwords) { |
91 | if (cnt + dwords > ram_dwords) | 95 | if (cnt + dwords > ram_dwords) |
@@ -260,7 +264,7 @@ qla2xxx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint16_t *ram, | |||
260 | WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED); | 264 | WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED); |
261 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); | 265 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); |
262 | 266 | ||
263 | words = GID_LIST_SIZE / 2; | 267 | words = qla2x00_gid_list_size(ha) / 2; |
264 | for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS; | 268 | for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS; |
265 | cnt += words, addr += words) { | 269 | cnt += words, addr += words) { |
266 | if (cnt + words > ram_words) | 270 | if (cnt + words > ram_words) |
@@ -375,6 +379,77 @@ qla25xx_copy_fce(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | |||
375 | } | 379 | } |
376 | 380 | ||
377 | static inline void * | 381 | static inline void * |
382 | qla25xx_copy_mqueues(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | ||
383 | { | ||
384 | struct qla2xxx_mqueue_chain *q; | ||
385 | struct qla2xxx_mqueue_header *qh; | ||
386 | struct req_que *req; | ||
387 | struct rsp_que *rsp; | ||
388 | int que; | ||
389 | |||
390 | if (!ha->mqenable) | ||
391 | return ptr; | ||
392 | |||
393 | /* Request queues */ | ||
394 | for (que = 1; que < ha->max_req_queues; que++) { | ||
395 | req = ha->req_q_map[que]; | ||
396 | if (!req) | ||
397 | break; | ||
398 | |||
399 | /* Add chain. */ | ||
400 | q = ptr; | ||
401 | *last_chain = &q->type; | ||
402 | q->type = __constant_htonl(DUMP_CHAIN_QUEUE); | ||
403 | q->chain_size = htonl( | ||
404 | sizeof(struct qla2xxx_mqueue_chain) + | ||
405 | sizeof(struct qla2xxx_mqueue_header) + | ||
406 | (req->length * sizeof(request_t))); | ||
407 | ptr += sizeof(struct qla2xxx_mqueue_chain); | ||
408 | |||
409 | /* Add header. */ | ||
410 | qh = ptr; | ||
411 | qh->queue = __constant_htonl(TYPE_REQUEST_QUEUE); | ||
412 | qh->number = htonl(que); | ||
413 | qh->size = htonl(req->length * sizeof(request_t)); | ||
414 | ptr += sizeof(struct qla2xxx_mqueue_header); | ||
415 | |||
416 | /* Add data. */ | ||
417 | memcpy(ptr, req->ring, req->length * sizeof(request_t)); | ||
418 | ptr += req->length * sizeof(request_t); | ||
419 | } | ||
420 | |||
421 | /* Response queues */ | ||
422 | for (que = 1; que < ha->max_rsp_queues; que++) { | ||
423 | rsp = ha->rsp_q_map[que]; | ||
424 | if (!rsp) | ||
425 | break; | ||
426 | |||
427 | /* Add chain. */ | ||
428 | q = ptr; | ||
429 | *last_chain = &q->type; | ||
430 | q->type = __constant_htonl(DUMP_CHAIN_QUEUE); | ||
431 | q->chain_size = htonl( | ||
432 | sizeof(struct qla2xxx_mqueue_chain) + | ||
433 | sizeof(struct qla2xxx_mqueue_header) + | ||
434 | (rsp->length * sizeof(response_t))); | ||
435 | ptr += sizeof(struct qla2xxx_mqueue_chain); | ||
436 | |||
437 | /* Add header. */ | ||
438 | qh = ptr; | ||
439 | qh->queue = __constant_htonl(TYPE_RESPONSE_QUEUE); | ||
440 | qh->number = htonl(que); | ||
441 | qh->size = htonl(rsp->length * sizeof(response_t)); | ||
442 | ptr += sizeof(struct qla2xxx_mqueue_header); | ||
443 | |||
444 | /* Add data. */ | ||
445 | memcpy(ptr, rsp->ring, rsp->length * sizeof(response_t)); | ||
446 | ptr += rsp->length * sizeof(response_t); | ||
447 | } | ||
448 | |||
449 | return ptr; | ||
450 | } | ||
451 | |||
452 | static inline void * | ||
378 | qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | 453 | qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) |
379 | { | 454 | { |
380 | uint32_t cnt, que_idx; | 455 | uint32_t cnt, que_idx; |
@@ -382,7 +457,7 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | |||
382 | struct qla2xxx_mq_chain *mq = ptr; | 457 | struct qla2xxx_mq_chain *mq = ptr; |
383 | struct device_reg_25xxmq __iomem *reg; | 458 | struct device_reg_25xxmq __iomem *reg; |
384 | 459 | ||
385 | if (!ha->mqenable) | 460 | if (!ha->mqenable || IS_QLA83XX(ha)) |
386 | return ptr; | 461 | return ptr; |
387 | 462 | ||
388 | mq = ptr; | 463 | mq = ptr; |
@@ -1322,12 +1397,16 @@ qla25xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | |||
1322 | nxt = qla24xx_copy_eft(ha, nxt); | 1397 | nxt = qla24xx_copy_eft(ha, nxt); |
1323 | 1398 | ||
1324 | /* Chain entries -- started with MQ. */ | 1399 | /* Chain entries -- started with MQ. */ |
1325 | qla25xx_copy_fce(ha, nxt_chain, &last_chain); | 1400 | nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain); |
1401 | nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain); | ||
1326 | if (last_chain) { | 1402 | if (last_chain) { |
1327 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); | 1403 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); |
1328 | *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); | 1404 | *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); |
1329 | } | 1405 | } |
1330 | 1406 | ||
1407 | /* Adjust valid length. */ | ||
1408 | ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump); | ||
1409 | |||
1331 | qla25xx_fw_dump_failed_0: | 1410 | qla25xx_fw_dump_failed_0: |
1332 | qla2xxx_dump_post_process(base_vha, rval); | 1411 | qla2xxx_dump_post_process(base_vha, rval); |
1333 | 1412 | ||
@@ -1636,12 +1715,16 @@ qla81xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | |||
1636 | nxt = qla24xx_copy_eft(ha, nxt); | 1715 | nxt = qla24xx_copy_eft(ha, nxt); |
1637 | 1716 | ||
1638 | /* Chain entries -- started with MQ. */ | 1717 | /* Chain entries -- started with MQ. */ |
1639 | qla25xx_copy_fce(ha, nxt_chain, &last_chain); | 1718 | nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain); |
1719 | nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain); | ||
1640 | if (last_chain) { | 1720 | if (last_chain) { |
1641 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); | 1721 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); |
1642 | *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); | 1722 | *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); |
1643 | } | 1723 | } |
1644 | 1724 | ||
1725 | /* Adjust valid length. */ | ||
1726 | ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump); | ||
1727 | |||
1645 | qla81xx_fw_dump_failed_0: | 1728 | qla81xx_fw_dump_failed_0: |
1646 | qla2xxx_dump_post_process(base_vha, rval); | 1729 | qla2xxx_dump_post_process(base_vha, rval); |
1647 | 1730 | ||
@@ -1650,6 +1733,507 @@ qla81xx_fw_dump_failed: | |||
1650 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1733 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1651 | } | 1734 | } |
1652 | 1735 | ||
1736 | void | ||
1737 | qla83xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | ||
1738 | { | ||
1739 | int rval; | ||
1740 | uint32_t cnt, reg_data; | ||
1741 | uint32_t risc_address; | ||
1742 | struct qla_hw_data *ha = vha->hw; | ||
1743 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | ||
1744 | uint32_t __iomem *dmp_reg; | ||
1745 | uint32_t *iter_reg; | ||
1746 | uint16_t __iomem *mbx_reg; | ||
1747 | unsigned long flags; | ||
1748 | struct qla83xx_fw_dump *fw; | ||
1749 | uint32_t ext_mem_cnt; | ||
1750 | void *nxt, *nxt_chain; | ||
1751 | uint32_t *last_chain = NULL; | ||
1752 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); | ||
1753 | |||
1754 | risc_address = ext_mem_cnt = 0; | ||
1755 | flags = 0; | ||
1756 | |||
1757 | if (!hardware_locked) | ||
1758 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1759 | |||
1760 | if (!ha->fw_dump) { | ||
1761 | ql_log(ql_log_warn, vha, 0xd00c, | ||
1762 | "No buffer available for dump!!!\n"); | ||
1763 | goto qla83xx_fw_dump_failed; | ||
1764 | } | ||
1765 | |||
1766 | if (ha->fw_dumped) { | ||
1767 | ql_log(ql_log_warn, vha, 0xd00d, | ||
1768 | "Firmware has been previously dumped (%p) -- ignoring " | ||
1769 | "request...\n", ha->fw_dump); | ||
1770 | goto qla83xx_fw_dump_failed; | ||
1771 | } | ||
1772 | fw = &ha->fw_dump->isp.isp83; | ||
1773 | qla2xxx_prep_dump(ha, ha->fw_dump); | ||
1774 | |||
1775 | fw->host_status = htonl(RD_REG_DWORD(®->host_status)); | ||
1776 | |||
1777 | /* Pause RISC. */ | ||
1778 | rval = qla24xx_pause_risc(reg); | ||
1779 | if (rval != QLA_SUCCESS) | ||
1780 | goto qla83xx_fw_dump_failed_0; | ||
1781 | |||
1782 | WRT_REG_DWORD(®->iobase_addr, 0x6000); | ||
1783 | dmp_reg = ®->iobase_window; | ||
1784 | reg_data = RD_REG_DWORD(dmp_reg); | ||
1785 | WRT_REG_DWORD(dmp_reg, 0); | ||
1786 | |||
1787 | dmp_reg = ®->unused_4_1[0]; | ||
1788 | reg_data = RD_REG_DWORD(dmp_reg); | ||
1789 | WRT_REG_DWORD(dmp_reg, 0); | ||
1790 | |||
1791 | WRT_REG_DWORD(®->iobase_addr, 0x6010); | ||
1792 | dmp_reg = ®->unused_4_1[2]; | ||
1793 | reg_data = RD_REG_DWORD(dmp_reg); | ||
1794 | WRT_REG_DWORD(dmp_reg, 0); | ||
1795 | |||
1796 | /* select PCR and disable ecc checking and correction */ | ||
1797 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); | ||
1798 | RD_REG_DWORD(®->iobase_addr); | ||
1799 | WRT_REG_DWORD(®->iobase_select, 0x60000000); /* write to F0h = PCR */ | ||
1800 | |||
1801 | /* Host/Risc registers. */ | ||
1802 | iter_reg = fw->host_risc_reg; | ||
1803 | iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg); | ||
1804 | iter_reg = qla24xx_read_window(reg, 0x7010, 16, iter_reg); | ||
1805 | qla24xx_read_window(reg, 0x7040, 16, iter_reg); | ||
1806 | |||
1807 | /* PCIe registers. */ | ||
1808 | WRT_REG_DWORD(®->iobase_addr, 0x7C00); | ||
1809 | RD_REG_DWORD(®->iobase_addr); | ||
1810 | WRT_REG_DWORD(®->iobase_window, 0x01); | ||
1811 | dmp_reg = ®->iobase_c4; | ||
1812 | fw->pcie_regs[0] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1813 | fw->pcie_regs[1] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1814 | fw->pcie_regs[2] = htonl(RD_REG_DWORD(dmp_reg)); | ||
1815 | fw->pcie_regs[3] = htonl(RD_REG_DWORD(®->iobase_window)); | ||
1816 | |||
1817 | WRT_REG_DWORD(®->iobase_window, 0x00); | ||
1818 | RD_REG_DWORD(®->iobase_window); | ||
1819 | |||
1820 | /* Host interface registers. */ | ||
1821 | dmp_reg = ®->flash_addr; | ||
1822 | for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) | ||
1823 | fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1824 | |||
1825 | /* Disable interrupts. */ | ||
1826 | WRT_REG_DWORD(®->ictrl, 0); | ||
1827 | RD_REG_DWORD(®->ictrl); | ||
1828 | |||
1829 | /* Shadow registers. */ | ||
1830 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); | ||
1831 | RD_REG_DWORD(®->iobase_addr); | ||
1832 | WRT_REG_DWORD(®->iobase_select, 0xB0000000); | ||
1833 | fw->shadow_reg[0] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1834 | |||
1835 | WRT_REG_DWORD(®->iobase_select, 0xB0100000); | ||
1836 | fw->shadow_reg[1] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1837 | |||
1838 | WRT_REG_DWORD(®->iobase_select, 0xB0200000); | ||
1839 | fw->shadow_reg[2] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1840 | |||
1841 | WRT_REG_DWORD(®->iobase_select, 0xB0300000); | ||
1842 | fw->shadow_reg[3] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1843 | |||
1844 | WRT_REG_DWORD(®->iobase_select, 0xB0400000); | ||
1845 | fw->shadow_reg[4] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1846 | |||
1847 | WRT_REG_DWORD(®->iobase_select, 0xB0500000); | ||
1848 | fw->shadow_reg[5] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1849 | |||
1850 | WRT_REG_DWORD(®->iobase_select, 0xB0600000); | ||
1851 | fw->shadow_reg[6] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1852 | |||
1853 | WRT_REG_DWORD(®->iobase_select, 0xB0700000); | ||
1854 | fw->shadow_reg[7] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1855 | |||
1856 | WRT_REG_DWORD(®->iobase_select, 0xB0800000); | ||
1857 | fw->shadow_reg[8] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1858 | |||
1859 | WRT_REG_DWORD(®->iobase_select, 0xB0900000); | ||
1860 | fw->shadow_reg[9] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1861 | |||
1862 | WRT_REG_DWORD(®->iobase_select, 0xB0A00000); | ||
1863 | fw->shadow_reg[10] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1864 | |||
1865 | /* RISC I/O register. */ | ||
1866 | WRT_REG_DWORD(®->iobase_addr, 0x0010); | ||
1867 | fw->risc_io_reg = htonl(RD_REG_DWORD(®->iobase_window)); | ||
1868 | |||
1869 | /* Mailbox registers. */ | ||
1870 | mbx_reg = ®->mailbox0; | ||
1871 | for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) | ||
1872 | fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++)); | ||
1873 | |||
1874 | /* Transfer sequence registers. */ | ||
1875 | iter_reg = fw->xseq_gp_reg; | ||
1876 | iter_reg = qla24xx_read_window(reg, 0xBE00, 16, iter_reg); | ||
1877 | iter_reg = qla24xx_read_window(reg, 0xBE10, 16, iter_reg); | ||
1878 | iter_reg = qla24xx_read_window(reg, 0xBE20, 16, iter_reg); | ||
1879 | iter_reg = qla24xx_read_window(reg, 0xBE30, 16, iter_reg); | ||
1880 | iter_reg = qla24xx_read_window(reg, 0xBE40, 16, iter_reg); | ||
1881 | iter_reg = qla24xx_read_window(reg, 0xBE50, 16, iter_reg); | ||
1882 | iter_reg = qla24xx_read_window(reg, 0xBE60, 16, iter_reg); | ||
1883 | iter_reg = qla24xx_read_window(reg, 0xBE70, 16, iter_reg); | ||
1884 | iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg); | ||
1885 | iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg); | ||
1886 | iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg); | ||
1887 | iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg); | ||
1888 | iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg); | ||
1889 | iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg); | ||
1890 | iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg); | ||
1891 | qla24xx_read_window(reg, 0xBF70, 16, iter_reg); | ||
1892 | |||
1893 | iter_reg = fw->xseq_0_reg; | ||
1894 | iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg); | ||
1895 | iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg); | ||
1896 | qla24xx_read_window(reg, 0xBFE0, 16, iter_reg); | ||
1897 | |||
1898 | qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg); | ||
1899 | |||
1900 | qla24xx_read_window(reg, 0xBEF0, 16, fw->xseq_2_reg); | ||
1901 | |||
1902 | /* Receive sequence registers. */ | ||
1903 | iter_reg = fw->rseq_gp_reg; | ||
1904 | iter_reg = qla24xx_read_window(reg, 0xFE00, 16, iter_reg); | ||
1905 | iter_reg = qla24xx_read_window(reg, 0xFE10, 16, iter_reg); | ||
1906 | iter_reg = qla24xx_read_window(reg, 0xFE20, 16, iter_reg); | ||
1907 | iter_reg = qla24xx_read_window(reg, 0xFE30, 16, iter_reg); | ||
1908 | iter_reg = qla24xx_read_window(reg, 0xFE40, 16, iter_reg); | ||
1909 | iter_reg = qla24xx_read_window(reg, 0xFE50, 16, iter_reg); | ||
1910 | iter_reg = qla24xx_read_window(reg, 0xFE60, 16, iter_reg); | ||
1911 | iter_reg = qla24xx_read_window(reg, 0xFE70, 16, iter_reg); | ||
1912 | iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg); | ||
1913 | iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg); | ||
1914 | iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg); | ||
1915 | iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg); | ||
1916 | iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg); | ||
1917 | iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg); | ||
1918 | iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg); | ||
1919 | qla24xx_read_window(reg, 0xFF70, 16, iter_reg); | ||
1920 | |||
1921 | iter_reg = fw->rseq_0_reg; | ||
1922 | iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg); | ||
1923 | qla24xx_read_window(reg, 0xFFD0, 16, iter_reg); | ||
1924 | |||
1925 | qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg); | ||
1926 | qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg); | ||
1927 | qla24xx_read_window(reg, 0xFEF0, 16, fw->rseq_3_reg); | ||
1928 | |||
1929 | /* Auxiliary sequence registers. */ | ||
1930 | iter_reg = fw->aseq_gp_reg; | ||
1931 | iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg); | ||
1932 | iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg); | ||
1933 | iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg); | ||
1934 | iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg); | ||
1935 | iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg); | ||
1936 | iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg); | ||
1937 | iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg); | ||
1938 | iter_reg = qla24xx_read_window(reg, 0xB070, 16, iter_reg); | ||
1939 | iter_reg = qla24xx_read_window(reg, 0xB100, 16, iter_reg); | ||
1940 | iter_reg = qla24xx_read_window(reg, 0xB110, 16, iter_reg); | ||
1941 | iter_reg = qla24xx_read_window(reg, 0xB120, 16, iter_reg); | ||
1942 | iter_reg = qla24xx_read_window(reg, 0xB130, 16, iter_reg); | ||
1943 | iter_reg = qla24xx_read_window(reg, 0xB140, 16, iter_reg); | ||
1944 | iter_reg = qla24xx_read_window(reg, 0xB150, 16, iter_reg); | ||
1945 | iter_reg = qla24xx_read_window(reg, 0xB160, 16, iter_reg); | ||
1946 | qla24xx_read_window(reg, 0xB170, 16, iter_reg); | ||
1947 | |||
1948 | iter_reg = fw->aseq_0_reg; | ||
1949 | iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg); | ||
1950 | qla24xx_read_window(reg, 0xB0D0, 16, iter_reg); | ||
1951 | |||
1952 | qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg); | ||
1953 | qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg); | ||
1954 | qla24xx_read_window(reg, 0xB1F0, 16, fw->aseq_3_reg); | ||
1955 | |||
1956 | /* Command DMA registers. */ | ||
1957 | iter_reg = fw->cmd_dma_reg; | ||
1958 | iter_reg = qla24xx_read_window(reg, 0x7100, 16, iter_reg); | ||
1959 | iter_reg = qla24xx_read_window(reg, 0x7120, 16, iter_reg); | ||
1960 | iter_reg = qla24xx_read_window(reg, 0x7130, 16, iter_reg); | ||
1961 | qla24xx_read_window(reg, 0x71F0, 16, iter_reg); | ||
1962 | |||
1963 | /* Queues. */ | ||
1964 | iter_reg = fw->req0_dma_reg; | ||
1965 | iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg); | ||
1966 | dmp_reg = ®->iobase_q; | ||
1967 | for (cnt = 0; cnt < 7; cnt++) | ||
1968 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1969 | |||
1970 | iter_reg = fw->resp0_dma_reg; | ||
1971 | iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg); | ||
1972 | dmp_reg = ®->iobase_q; | ||
1973 | for (cnt = 0; cnt < 7; cnt++) | ||
1974 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1975 | |||
1976 | iter_reg = fw->req1_dma_reg; | ||
1977 | iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg); | ||
1978 | dmp_reg = ®->iobase_q; | ||
1979 | for (cnt = 0; cnt < 7; cnt++) | ||
1980 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1981 | |||
1982 | /* Transmit DMA registers. */ | ||
1983 | iter_reg = fw->xmt0_dma_reg; | ||
1984 | iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg); | ||
1985 | qla24xx_read_window(reg, 0x7610, 16, iter_reg); | ||
1986 | |||
1987 | iter_reg = fw->xmt1_dma_reg; | ||
1988 | iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg); | ||
1989 | qla24xx_read_window(reg, 0x7630, 16, iter_reg); | ||
1990 | |||
1991 | iter_reg = fw->xmt2_dma_reg; | ||
1992 | iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg); | ||
1993 | qla24xx_read_window(reg, 0x7650, 16, iter_reg); | ||
1994 | |||
1995 | iter_reg = fw->xmt3_dma_reg; | ||
1996 | iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg); | ||
1997 | qla24xx_read_window(reg, 0x7670, 16, iter_reg); | ||
1998 | |||
1999 | iter_reg = fw->xmt4_dma_reg; | ||
2000 | iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg); | ||
2001 | qla24xx_read_window(reg, 0x7690, 16, iter_reg); | ||
2002 | |||
2003 | qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg); | ||
2004 | |||
2005 | /* Receive DMA registers. */ | ||
2006 | iter_reg = fw->rcvt0_data_dma_reg; | ||
2007 | iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg); | ||
2008 | qla24xx_read_window(reg, 0x7710, 16, iter_reg); | ||
2009 | |||
2010 | iter_reg = fw->rcvt1_data_dma_reg; | ||
2011 | iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg); | ||
2012 | qla24xx_read_window(reg, 0x7730, 16, iter_reg); | ||
2013 | |||
2014 | /* RISC registers. */ | ||
2015 | iter_reg = fw->risc_gp_reg; | ||
2016 | iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg); | ||
2017 | iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg); | ||
2018 | iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg); | ||
2019 | iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg); | ||
2020 | iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg); | ||
2021 | iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg); | ||
2022 | iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg); | ||
2023 | qla24xx_read_window(reg, 0x0F70, 16, iter_reg); | ||
2024 | |||
2025 | /* Local memory controller registers. */ | ||
2026 | iter_reg = fw->lmc_reg; | ||
2027 | iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg); | ||
2028 | iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg); | ||
2029 | iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg); | ||
2030 | iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg); | ||
2031 | iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg); | ||
2032 | iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg); | ||
2033 | iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg); | ||
2034 | qla24xx_read_window(reg, 0x3070, 16, iter_reg); | ||
2035 | |||
2036 | /* Fibre Protocol Module registers. */ | ||
2037 | iter_reg = fw->fpm_hdw_reg; | ||
2038 | iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg); | ||
2039 | iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg); | ||
2040 | iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg); | ||
2041 | iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg); | ||
2042 | iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg); | ||
2043 | iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg); | ||
2044 | iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg); | ||
2045 | iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg); | ||
2046 | iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg); | ||
2047 | iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg); | ||
2048 | iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg); | ||
2049 | iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg); | ||
2050 | iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg); | ||
2051 | iter_reg = qla24xx_read_window(reg, 0x40D0, 16, iter_reg); | ||
2052 | iter_reg = qla24xx_read_window(reg, 0x40E0, 16, iter_reg); | ||
2053 | qla24xx_read_window(reg, 0x40F0, 16, iter_reg); | ||
2054 | |||
2055 | /* RQ0 Array registers. */ | ||
2056 | iter_reg = fw->rq0_array_reg; | ||
2057 | iter_reg = qla24xx_read_window(reg, 0x5C00, 16, iter_reg); | ||
2058 | iter_reg = qla24xx_read_window(reg, 0x5C10, 16, iter_reg); | ||
2059 | iter_reg = qla24xx_read_window(reg, 0x5C20, 16, iter_reg); | ||
2060 | iter_reg = qla24xx_read_window(reg, 0x5C30, 16, iter_reg); | ||
2061 | iter_reg = qla24xx_read_window(reg, 0x5C40, 16, iter_reg); | ||
2062 | iter_reg = qla24xx_read_window(reg, 0x5C50, 16, iter_reg); | ||
2063 | iter_reg = qla24xx_read_window(reg, 0x5C60, 16, iter_reg); | ||
2064 | iter_reg = qla24xx_read_window(reg, 0x5C70, 16, iter_reg); | ||
2065 | iter_reg = qla24xx_read_window(reg, 0x5C80, 16, iter_reg); | ||
2066 | iter_reg = qla24xx_read_window(reg, 0x5C90, 16, iter_reg); | ||
2067 | iter_reg = qla24xx_read_window(reg, 0x5CA0, 16, iter_reg); | ||
2068 | iter_reg = qla24xx_read_window(reg, 0x5CB0, 16, iter_reg); | ||
2069 | iter_reg = qla24xx_read_window(reg, 0x5CC0, 16, iter_reg); | ||
2070 | iter_reg = qla24xx_read_window(reg, 0x5CD0, 16, iter_reg); | ||
2071 | iter_reg = qla24xx_read_window(reg, 0x5CE0, 16, iter_reg); | ||
2072 | qla24xx_read_window(reg, 0x5CF0, 16, iter_reg); | ||
2073 | |||
2074 | /* RQ1 Array registers. */ | ||
2075 | iter_reg = fw->rq1_array_reg; | ||
2076 | iter_reg = qla24xx_read_window(reg, 0x5D00, 16, iter_reg); | ||
2077 | iter_reg = qla24xx_read_window(reg, 0x5D10, 16, iter_reg); | ||
2078 | iter_reg = qla24xx_read_window(reg, 0x5D20, 16, iter_reg); | ||
2079 | iter_reg = qla24xx_read_window(reg, 0x5D30, 16, iter_reg); | ||
2080 | iter_reg = qla24xx_read_window(reg, 0x5D40, 16, iter_reg); | ||
2081 | iter_reg = qla24xx_read_window(reg, 0x5D50, 16, iter_reg); | ||
2082 | iter_reg = qla24xx_read_window(reg, 0x5D60, 16, iter_reg); | ||
2083 | iter_reg = qla24xx_read_window(reg, 0x5D70, 16, iter_reg); | ||
2084 | iter_reg = qla24xx_read_window(reg, 0x5D80, 16, iter_reg); | ||
2085 | iter_reg = qla24xx_read_window(reg, 0x5D90, 16, iter_reg); | ||
2086 | iter_reg = qla24xx_read_window(reg, 0x5DA0, 16, iter_reg); | ||
2087 | iter_reg = qla24xx_read_window(reg, 0x5DB0, 16, iter_reg); | ||
2088 | iter_reg = qla24xx_read_window(reg, 0x5DC0, 16, iter_reg); | ||
2089 | iter_reg = qla24xx_read_window(reg, 0x5DD0, 16, iter_reg); | ||
2090 | iter_reg = qla24xx_read_window(reg, 0x5DE0, 16, iter_reg); | ||
2091 | qla24xx_read_window(reg, 0x5DF0, 16, iter_reg); | ||
2092 | |||
2093 | /* RP0 Array registers. */ | ||
2094 | iter_reg = fw->rp0_array_reg; | ||
2095 | iter_reg = qla24xx_read_window(reg, 0x5E00, 16, iter_reg); | ||
2096 | iter_reg = qla24xx_read_window(reg, 0x5E10, 16, iter_reg); | ||
2097 | iter_reg = qla24xx_read_window(reg, 0x5E20, 16, iter_reg); | ||
2098 | iter_reg = qla24xx_read_window(reg, 0x5E30, 16, iter_reg); | ||
2099 | iter_reg = qla24xx_read_window(reg, 0x5E40, 16, iter_reg); | ||
2100 | iter_reg = qla24xx_read_window(reg, 0x5E50, 16, iter_reg); | ||
2101 | iter_reg = qla24xx_read_window(reg, 0x5E60, 16, iter_reg); | ||
2102 | iter_reg = qla24xx_read_window(reg, 0x5E70, 16, iter_reg); | ||
2103 | iter_reg = qla24xx_read_window(reg, 0x5E80, 16, iter_reg); | ||
2104 | iter_reg = qla24xx_read_window(reg, 0x5E90, 16, iter_reg); | ||
2105 | iter_reg = qla24xx_read_window(reg, 0x5EA0, 16, iter_reg); | ||
2106 | iter_reg = qla24xx_read_window(reg, 0x5EB0, 16, iter_reg); | ||
2107 | iter_reg = qla24xx_read_window(reg, 0x5EC0, 16, iter_reg); | ||
2108 | iter_reg = qla24xx_read_window(reg, 0x5ED0, 16, iter_reg); | ||
2109 | iter_reg = qla24xx_read_window(reg, 0x5EE0, 16, iter_reg); | ||
2110 | qla24xx_read_window(reg, 0x5EF0, 16, iter_reg); | ||
2111 | |||
2112 | /* RP1 Array registers. */ | ||
2113 | iter_reg = fw->rp1_array_reg; | ||
2114 | iter_reg = qla24xx_read_window(reg, 0x5F00, 16, iter_reg); | ||
2115 | iter_reg = qla24xx_read_window(reg, 0x5F10, 16, iter_reg); | ||
2116 | iter_reg = qla24xx_read_window(reg, 0x5F20, 16, iter_reg); | ||
2117 | iter_reg = qla24xx_read_window(reg, 0x5F30, 16, iter_reg); | ||
2118 | iter_reg = qla24xx_read_window(reg, 0x5F40, 16, iter_reg); | ||
2119 | iter_reg = qla24xx_read_window(reg, 0x5F50, 16, iter_reg); | ||
2120 | iter_reg = qla24xx_read_window(reg, 0x5F60, 16, iter_reg); | ||
2121 | iter_reg = qla24xx_read_window(reg, 0x5F70, 16, iter_reg); | ||
2122 | iter_reg = qla24xx_read_window(reg, 0x5F80, 16, iter_reg); | ||
2123 | iter_reg = qla24xx_read_window(reg, 0x5F90, 16, iter_reg); | ||
2124 | iter_reg = qla24xx_read_window(reg, 0x5FA0, 16, iter_reg); | ||
2125 | iter_reg = qla24xx_read_window(reg, 0x5FB0, 16, iter_reg); | ||
2126 | iter_reg = qla24xx_read_window(reg, 0x5FC0, 16, iter_reg); | ||
2127 | iter_reg = qla24xx_read_window(reg, 0x5FD0, 16, iter_reg); | ||
2128 | iter_reg = qla24xx_read_window(reg, 0x5FE0, 16, iter_reg); | ||
2129 | qla24xx_read_window(reg, 0x5FF0, 16, iter_reg); | ||
2130 | |||
2131 | iter_reg = fw->at0_array_reg; | ||
2132 | iter_reg = qla24xx_read_window(reg, 0x7080, 16, iter_reg); | ||
2133 | iter_reg = qla24xx_read_window(reg, 0x7090, 16, iter_reg); | ||
2134 | iter_reg = qla24xx_read_window(reg, 0x70A0, 16, iter_reg); | ||
2135 | iter_reg = qla24xx_read_window(reg, 0x70B0, 16, iter_reg); | ||
2136 | iter_reg = qla24xx_read_window(reg, 0x70C0, 16, iter_reg); | ||
2137 | iter_reg = qla24xx_read_window(reg, 0x70D0, 16, iter_reg); | ||
2138 | iter_reg = qla24xx_read_window(reg, 0x70E0, 16, iter_reg); | ||
2139 | qla24xx_read_window(reg, 0x70F0, 16, iter_reg); | ||
2140 | |||
2141 | /* I/O Queue Control registers. */ | ||
2142 | qla24xx_read_window(reg, 0x7800, 16, fw->queue_control_reg); | ||
2143 | |||
2144 | /* Frame Buffer registers. */ | ||
2145 | iter_reg = fw->fb_hdw_reg; | ||
2146 | iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg); | ||
2147 | iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg); | ||
2148 | iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg); | ||
2149 | iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg); | ||
2150 | iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg); | ||
2151 | iter_reg = qla24xx_read_window(reg, 0x6060, 16, iter_reg); | ||
2152 | iter_reg = qla24xx_read_window(reg, 0x6070, 16, iter_reg); | ||
2153 | iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg); | ||
2154 | iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg); | ||
2155 | iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg); | ||
2156 | iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg); | ||
2157 | iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg); | ||
2158 | iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg); | ||
2159 | iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg); | ||
2160 | iter_reg = qla24xx_read_window(reg, 0x6530, 16, iter_reg); | ||
2161 | iter_reg = qla24xx_read_window(reg, 0x6540, 16, iter_reg); | ||
2162 | iter_reg = qla24xx_read_window(reg, 0x6550, 16, iter_reg); | ||
2163 | iter_reg = qla24xx_read_window(reg, 0x6560, 16, iter_reg); | ||
2164 | iter_reg = qla24xx_read_window(reg, 0x6570, 16, iter_reg); | ||
2165 | iter_reg = qla24xx_read_window(reg, 0x6580, 16, iter_reg); | ||
2166 | iter_reg = qla24xx_read_window(reg, 0x6590, 16, iter_reg); | ||
2167 | iter_reg = qla24xx_read_window(reg, 0x65A0, 16, iter_reg); | ||
2168 | iter_reg = qla24xx_read_window(reg, 0x65B0, 16, iter_reg); | ||
2169 | iter_reg = qla24xx_read_window(reg, 0x65C0, 16, iter_reg); | ||
2170 | iter_reg = qla24xx_read_window(reg, 0x65D0, 16, iter_reg); | ||
2171 | iter_reg = qla24xx_read_window(reg, 0x65E0, 16, iter_reg); | ||
2172 | qla24xx_read_window(reg, 0x6F00, 16, iter_reg); | ||
2173 | |||
2174 | /* Multi queue registers */ | ||
2175 | nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset, | ||
2176 | &last_chain); | ||
2177 | |||
2178 | rval = qla24xx_soft_reset(ha); | ||
2179 | if (rval != QLA_SUCCESS) { | ||
2180 | ql_log(ql_log_warn, vha, 0xd00e, | ||
2181 | "SOFT RESET FAILED, forcing continuation of dump!!!\n"); | ||
2182 | rval = QLA_SUCCESS; | ||
2183 | |||
2184 | ql_log(ql_log_warn, vha, 0xd00f, "try a bigger hammer!!!\n"); | ||
2185 | |||
2186 | WRT_REG_DWORD(®->hccr, HCCRX_SET_RISC_RESET); | ||
2187 | RD_REG_DWORD(®->hccr); | ||
2188 | |||
2189 | WRT_REG_DWORD(®->hccr, HCCRX_REL_RISC_PAUSE); | ||
2190 | RD_REG_DWORD(®->hccr); | ||
2191 | |||
2192 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_RESET); | ||
2193 | RD_REG_DWORD(®->hccr); | ||
2194 | |||
2195 | for (cnt = 30000; cnt && (RD_REG_WORD(®->mailbox0)); cnt--) | ||
2196 | udelay(5); | ||
2197 | |||
2198 | if (!cnt) { | ||
2199 | nxt = fw->code_ram; | ||
2200 | nxt += sizeof(fw->code_ram), | ||
2201 | nxt += (ha->fw_memory_size - 0x100000 + 1); | ||
2202 | goto copy_queue; | ||
2203 | } else | ||
2204 | ql_log(ql_log_warn, vha, 0xd010, | ||
2205 | "bigger hammer success?\n"); | ||
2206 | } | ||
2207 | |||
2208 | rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram), | ||
2209 | &nxt); | ||
2210 | if (rval != QLA_SUCCESS) | ||
2211 | goto qla83xx_fw_dump_failed_0; | ||
2212 | |||
2213 | copy_queue: | ||
2214 | nxt = qla2xxx_copy_queues(ha, nxt); | ||
2215 | |||
2216 | nxt = qla24xx_copy_eft(ha, nxt); | ||
2217 | |||
2218 | /* Chain entries -- started with MQ. */ | ||
2219 | nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain); | ||
2220 | nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain); | ||
2221 | if (last_chain) { | ||
2222 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); | ||
2223 | *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); | ||
2224 | } | ||
2225 | |||
2226 | /* Adjust valid length. */ | ||
2227 | ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump); | ||
2228 | |||
2229 | qla83xx_fw_dump_failed_0: | ||
2230 | qla2xxx_dump_post_process(base_vha, rval); | ||
2231 | |||
2232 | qla83xx_fw_dump_failed: | ||
2233 | if (!hardware_locked) | ||
2234 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
2235 | } | ||
2236 | |||
1653 | /****************************************************************************/ | 2237 | /****************************************************************************/ |
1654 | /* Driver Debug Functions. */ | 2238 | /* Driver Debug Functions. */ |
1655 | /****************************************************************************/ | 2239 | /****************************************************************************/ |
@@ -1782,13 +2366,13 @@ ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...) | |||
1782 | vaf.va = &va; | 2366 | vaf.va = &va; |
1783 | 2367 | ||
1784 | switch (level) { | 2368 | switch (level) { |
1785 | case 0: /* FATAL LOG */ | 2369 | case ql_log_fatal: /* FATAL LOG */ |
1786 | pr_crit("%s%pV", pbuf, &vaf); | 2370 | pr_crit("%s%pV", pbuf, &vaf); |
1787 | break; | 2371 | break; |
1788 | case 1: | 2372 | case ql_log_warn: |
1789 | pr_err("%s%pV", pbuf, &vaf); | 2373 | pr_err("%s%pV", pbuf, &vaf); |
1790 | break; | 2374 | break; |
1791 | case 2: | 2375 | case ql_log_info: |
1792 | pr_warn("%s%pV", pbuf, &vaf); | 2376 | pr_warn("%s%pV", pbuf, &vaf); |
1793 | break; | 2377 | break; |
1794 | default: | 2378 | default: |
@@ -1837,13 +2421,13 @@ ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t id, | |||
1837 | vaf.va = &va; | 2421 | vaf.va = &va; |
1838 | 2422 | ||
1839 | switch (level) { | 2423 | switch (level) { |
1840 | case 0: /* FATAL LOG */ | 2424 | case ql_log_fatal: /* FATAL LOG */ |
1841 | pr_crit("%s%pV", pbuf, &vaf); | 2425 | pr_crit("%s%pV", pbuf, &vaf); |
1842 | break; | 2426 | break; |
1843 | case 1: | 2427 | case ql_log_warn: |
1844 | pr_err("%s%pV", pbuf, &vaf); | 2428 | pr_err("%s%pV", pbuf, &vaf); |
1845 | break; | 2429 | break; |
1846 | case 2: | 2430 | case ql_log_info: |
1847 | pr_warn("%s%pV", pbuf, &vaf); | 2431 | pr_warn("%s%pV", pbuf, &vaf); |
1848 | break; | 2432 | break; |
1849 | default: | 2433 | default: |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h index 5f1b6d9c3dc..2157bdf1569 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.h +++ b/drivers/scsi/qla2xxx/qla_dbg.h | |||
@@ -165,6 +165,54 @@ struct qla81xx_fw_dump { | |||
165 | uint32_t ext_mem[1]; | 165 | uint32_t ext_mem[1]; |
166 | }; | 166 | }; |
167 | 167 | ||
168 | struct qla83xx_fw_dump { | ||
169 | uint32_t host_status; | ||
170 | uint32_t host_risc_reg[48]; | ||
171 | uint32_t pcie_regs[4]; | ||
172 | uint32_t host_reg[32]; | ||
173 | uint32_t shadow_reg[11]; | ||
174 | uint32_t risc_io_reg; | ||
175 | uint16_t mailbox_reg[32]; | ||
176 | uint32_t xseq_gp_reg[256]; | ||
177 | uint32_t xseq_0_reg[48]; | ||
178 | uint32_t xseq_1_reg[16]; | ||
179 | uint32_t xseq_2_reg[16]; | ||
180 | uint32_t rseq_gp_reg[256]; | ||
181 | uint32_t rseq_0_reg[32]; | ||
182 | uint32_t rseq_1_reg[16]; | ||
183 | uint32_t rseq_2_reg[16]; | ||
184 | uint32_t rseq_3_reg[16]; | ||
185 | uint32_t aseq_gp_reg[256]; | ||
186 | uint32_t aseq_0_reg[32]; | ||
187 | uint32_t aseq_1_reg[16]; | ||
188 | uint32_t aseq_2_reg[16]; | ||
189 | uint32_t aseq_3_reg[16]; | ||
190 | uint32_t cmd_dma_reg[64]; | ||
191 | uint32_t req0_dma_reg[15]; | ||
192 | uint32_t resp0_dma_reg[15]; | ||
193 | uint32_t req1_dma_reg[15]; | ||
194 | uint32_t xmt0_dma_reg[32]; | ||
195 | uint32_t xmt1_dma_reg[32]; | ||
196 | uint32_t xmt2_dma_reg[32]; | ||
197 | uint32_t xmt3_dma_reg[32]; | ||
198 | uint32_t xmt4_dma_reg[32]; | ||
199 | uint32_t xmt_data_dma_reg[16]; | ||
200 | uint32_t rcvt0_data_dma_reg[32]; | ||
201 | uint32_t rcvt1_data_dma_reg[32]; | ||
202 | uint32_t risc_gp_reg[128]; | ||
203 | uint32_t lmc_reg[128]; | ||
204 | uint32_t fpm_hdw_reg[256]; | ||
205 | uint32_t rq0_array_reg[256]; | ||
206 | uint32_t rq1_array_reg[256]; | ||
207 | uint32_t rp0_array_reg[256]; | ||
208 | uint32_t rp1_array_reg[256]; | ||
209 | uint32_t queue_control_reg[16]; | ||
210 | uint32_t fb_hdw_reg[432]; | ||
211 | uint32_t at0_array_reg[128]; | ||
212 | uint32_t code_ram[0x2400]; | ||
213 | uint32_t ext_mem[1]; | ||
214 | }; | ||
215 | |||
168 | #define EFT_NUM_BUFFERS 4 | 216 | #define EFT_NUM_BUFFERS 4 |
169 | #define EFT_BYTES_PER_BUFFER 0x4000 | 217 | #define EFT_BYTES_PER_BUFFER 0x4000 |
170 | #define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) | 218 | #define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) |
@@ -192,9 +240,23 @@ struct qla2xxx_mq_chain { | |||
192 | uint32_t qregs[4 * QLA_MQ_SIZE]; | 240 | uint32_t qregs[4 * QLA_MQ_SIZE]; |
193 | }; | 241 | }; |
194 | 242 | ||
243 | struct qla2xxx_mqueue_header { | ||
244 | uint32_t queue; | ||
245 | #define TYPE_REQUEST_QUEUE 0x1 | ||
246 | #define TYPE_RESPONSE_QUEUE 0x2 | ||
247 | uint32_t number; | ||
248 | uint32_t size; | ||
249 | }; | ||
250 | |||
251 | struct qla2xxx_mqueue_chain { | ||
252 | uint32_t type; | ||
253 | uint32_t chain_size; | ||
254 | }; | ||
255 | |||
195 | #define DUMP_CHAIN_VARIANT 0x80000000 | 256 | #define DUMP_CHAIN_VARIANT 0x80000000 |
196 | #define DUMP_CHAIN_FCE 0x7FFFFAF0 | 257 | #define DUMP_CHAIN_FCE 0x7FFFFAF0 |
197 | #define DUMP_CHAIN_MQ 0x7FFFFAF1 | 258 | #define DUMP_CHAIN_MQ 0x7FFFFAF1 |
259 | #define DUMP_CHAIN_QUEUE 0x7FFFFAF2 | ||
198 | #define DUMP_CHAIN_LAST 0x80000000 | 260 | #define DUMP_CHAIN_LAST 0x80000000 |
199 | 261 | ||
200 | struct qla2xxx_fw_dump { | 262 | struct qla2xxx_fw_dump { |
@@ -228,6 +290,7 @@ struct qla2xxx_fw_dump { | |||
228 | struct qla24xx_fw_dump isp24; | 290 | struct qla24xx_fw_dump isp24; |
229 | struct qla25xx_fw_dump isp25; | 291 | struct qla25xx_fw_dump isp25; |
230 | struct qla81xx_fw_dump isp81; | 292 | struct qla81xx_fw_dump isp81; |
293 | struct qla83xx_fw_dump isp83; | ||
231 | } isp; | 294 | } isp; |
232 | }; | 295 | }; |
233 | 296 | ||
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index af1003f9de1..a2443031dbe 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -125,17 +125,17 @@ | |||
125 | * Fibre Channel device definitions. | 125 | * Fibre Channel device definitions. |
126 | */ | 126 | */ |
127 | #define WWN_SIZE 8 /* Size of WWPN, WWN & WWNN */ | 127 | #define WWN_SIZE 8 /* Size of WWPN, WWN & WWNN */ |
128 | #define MAX_FIBRE_DEVICES 512 | 128 | #define MAX_FIBRE_DEVICES_2100 512 |
129 | #define MAX_FIBRE_DEVICES_2400 2048 | ||
130 | #define MAX_FIBRE_DEVICES_LOOP 128 | ||
131 | #define MAX_FIBRE_DEVICES_MAX MAX_FIBRE_DEVICES_2400 | ||
129 | #define MAX_FIBRE_LUNS 0xFFFF | 132 | #define MAX_FIBRE_LUNS 0xFFFF |
130 | #define MAX_RSCN_COUNT 32 | ||
131 | #define MAX_HOST_COUNT 16 | 133 | #define MAX_HOST_COUNT 16 |
132 | 134 | ||
133 | /* | 135 | /* |
134 | * Host adapter default definitions. | 136 | * Host adapter default definitions. |
135 | */ | 137 | */ |
136 | #define MAX_BUSES 1 /* We only have one bus today */ | 138 | #define MAX_BUSES 1 /* We only have one bus today */ |
137 | #define MAX_TARGETS_2100 MAX_FIBRE_DEVICES | ||
138 | #define MAX_TARGETS_2200 MAX_FIBRE_DEVICES | ||
139 | #define MIN_LUNS 8 | 139 | #define MIN_LUNS 8 |
140 | #define MAX_LUNS MAX_FIBRE_LUNS | 140 | #define MAX_LUNS MAX_FIBRE_LUNS |
141 | #define MAX_CMDS_PER_LUN 255 | 141 | #define MAX_CMDS_PER_LUN 255 |
@@ -202,20 +202,12 @@ struct sd_dif_tuple { | |||
202 | /* | 202 | /* |
203 | * SCSI Request Block | 203 | * SCSI Request Block |
204 | */ | 204 | */ |
205 | typedef struct srb { | 205 | struct srb_cmd { |
206 | atomic_t ref_count; | ||
207 | struct fc_port *fcport; | ||
208 | uint32_t handle; | ||
209 | |||
210 | struct scsi_cmnd *cmd; /* Linux SCSI command pkt */ | 206 | struct scsi_cmnd *cmd; /* Linux SCSI command pkt */ |
211 | |||
212 | uint16_t flags; | ||
213 | |||
214 | uint32_t request_sense_length; | 207 | uint32_t request_sense_length; |
215 | uint8_t *request_sense_ptr; | 208 | uint8_t *request_sense_ptr; |
216 | |||
217 | void *ctx; | 209 | void *ctx; |
218 | } srb_t; | 210 | }; |
219 | 211 | ||
220 | /* | 212 | /* |
221 | * SRB flag definitions | 213 | * SRB flag definitions |
@@ -254,10 +246,7 @@ struct srb_iocb { | |||
254 | } u; | 246 | } u; |
255 | 247 | ||
256 | struct timer_list timer; | 248 | struct timer_list timer; |
257 | 249 | void (*timeout)(void *); | |
258 | void (*done)(srb_t *); | ||
259 | void (*free)(srb_t *); | ||
260 | void (*timeout)(srb_t *); | ||
261 | }; | 250 | }; |
262 | 251 | ||
263 | /* Values for srb_ctx type */ | 252 | /* Values for srb_ctx type */ |
@@ -268,16 +257,37 @@ struct srb_iocb { | |||
268 | #define SRB_CT_CMD 5 | 257 | #define SRB_CT_CMD 5 |
269 | #define SRB_ADISC_CMD 6 | 258 | #define SRB_ADISC_CMD 6 |
270 | #define SRB_TM_CMD 7 | 259 | #define SRB_TM_CMD 7 |
260 | #define SRB_SCSI_CMD 8 | ||
271 | 261 | ||
272 | struct srb_ctx { | 262 | typedef struct srb { |
263 | atomic_t ref_count; | ||
264 | struct fc_port *fcport; | ||
265 | uint32_t handle; | ||
266 | uint16_t flags; | ||
273 | uint16_t type; | 267 | uint16_t type; |
274 | char *name; | 268 | char *name; |
275 | int iocbs; | 269 | int iocbs; |
276 | union { | 270 | union { |
277 | struct srb_iocb *iocb_cmd; | 271 | struct srb_iocb iocb_cmd; |
278 | struct fc_bsg_job *bsg_job; | 272 | struct fc_bsg_job *bsg_job; |
273 | struct srb_cmd scmd; | ||
279 | } u; | 274 | } u; |
280 | }; | 275 | void (*done)(void *, void *, int); |
276 | void (*free)(void *, void *); | ||
277 | } srb_t; | ||
278 | |||
279 | #define GET_CMD_SP(sp) (sp->u.scmd.cmd) | ||
280 | #define SET_CMD_SP(sp, cmd) (sp->u.scmd.cmd = cmd) | ||
281 | #define GET_CMD_CTX_SP(sp) (sp->u.scmd.ctx) | ||
282 | |||
283 | #define GET_CMD_SENSE_LEN(sp) \ | ||
284 | (sp->u.scmd.request_sense_length) | ||
285 | #define SET_CMD_SENSE_LEN(sp, len) \ | ||
286 | (sp->u.scmd.request_sense_length = len) | ||
287 | #define GET_CMD_SENSE_PTR(sp) \ | ||
288 | (sp->u.scmd.request_sense_ptr) | ||
289 | #define SET_CMD_SENSE_PTR(sp, ptr) \ | ||
290 | (sp->u.scmd.request_sense_ptr = ptr) | ||
281 | 291 | ||
282 | struct msg_echo_lb { | 292 | struct msg_echo_lb { |
283 | dma_addr_t send_dma; | 293 | dma_addr_t send_dma; |
@@ -653,8 +663,10 @@ typedef struct { | |||
653 | #define MBC_DIAGNOSTIC_LOOP_BACK 0x45 /* Diagnostic loop back. */ | 663 | #define MBC_DIAGNOSTIC_LOOP_BACK 0x45 /* Diagnostic loop back. */ |
654 | #define MBC_ONLINE_SELF_TEST 0x46 /* Online self-test. */ | 664 | #define MBC_ONLINE_SELF_TEST 0x46 /* Online self-test. */ |
655 | #define MBC_ENHANCED_GET_PORT_DATABASE 0x47 /* Get port database + login */ | 665 | #define MBC_ENHANCED_GET_PORT_DATABASE 0x47 /* Get port database + login */ |
666 | #define MBC_CONFIGURE_VF 0x4b /* Configure VFs */ | ||
656 | #define MBC_RESET_LINK_STATUS 0x52 /* Reset Link Error Status */ | 667 | #define MBC_RESET_LINK_STATUS 0x52 /* Reset Link Error Status */ |
657 | #define MBC_IOCB_COMMAND_A64 0x54 /* Execute IOCB command (64) */ | 668 | #define MBC_IOCB_COMMAND_A64 0x54 /* Execute IOCB command (64) */ |
669 | #define MBC_PORT_LOGOUT 0x56 /* Port Logout request */ | ||
658 | #define MBC_SEND_RNID_ELS 0x57 /* Send RNID ELS request */ | 670 | #define MBC_SEND_RNID_ELS 0x57 /* Send RNID ELS request */ |
659 | #define MBC_SET_RNID_PARAMS 0x59 /* Set RNID parameters */ | 671 | #define MBC_SET_RNID_PARAMS 0x59 /* Set RNID parameters */ |
660 | #define MBC_GET_RNID_PARAMS 0x5a /* Data Rate */ | 672 | #define MBC_GET_RNID_PARAMS 0x5a /* Data Rate */ |
@@ -1709,6 +1721,7 @@ typedef struct fc_port { | |||
1709 | 1721 | ||
1710 | uint16_t vp_idx; | 1722 | uint16_t vp_idx; |
1711 | uint8_t fc4_type; | 1723 | uint8_t fc4_type; |
1724 | uint8_t scan_state; | ||
1712 | } fc_port_t; | 1725 | } fc_port_t; |
1713 | 1726 | ||
1714 | /* | 1727 | /* |
@@ -1761,7 +1774,6 @@ static const char * const port_state_str[] = { | |||
1761 | 1774 | ||
1762 | #define GID_PT_CMD 0x1A1 | 1775 | #define GID_PT_CMD 0x1A1 |
1763 | #define GID_PT_REQ_SIZE (16 + 4) | 1776 | #define GID_PT_REQ_SIZE (16 + 4) |
1764 | #define GID_PT_RSP_SIZE (16 + (MAX_FIBRE_DEVICES * 4)) | ||
1765 | 1777 | ||
1766 | #define GPN_ID_CMD 0x112 | 1778 | #define GPN_ID_CMD 0x112 |
1767 | #define GPN_ID_REQ_SIZE (16 + 4) | 1779 | #define GPN_ID_REQ_SIZE (16 + 4) |
@@ -2051,7 +2063,9 @@ struct ct_sns_rsp { | |||
2051 | } ga_nxt; | 2063 | } ga_nxt; |
2052 | 2064 | ||
2053 | struct { | 2065 | struct { |
2054 | struct ct_sns_gid_pt_data entries[MAX_FIBRE_DEVICES]; | 2066 | /* Assume the largest number of targets for the union */ |
2067 | struct ct_sns_gid_pt_data | ||
2068 | entries[MAX_FIBRE_DEVICES_MAX]; | ||
2055 | } gid_pt; | 2069 | } gid_pt; |
2056 | 2070 | ||
2057 | struct { | 2071 | struct { |
@@ -2112,7 +2126,11 @@ struct ct_sns_pkt { | |||
2112 | 2126 | ||
2113 | #define GID_PT_SNS_SCMD_LEN 6 | 2127 | #define GID_PT_SNS_SCMD_LEN 6 |
2114 | #define GID_PT_SNS_CMD_SIZE 28 | 2128 | #define GID_PT_SNS_CMD_SIZE 28 |
2115 | #define GID_PT_SNS_DATA_SIZE (MAX_FIBRE_DEVICES * 4 + 16) | 2129 | /* |
2130 | * Assume MAX_FIBRE_DEVICES_2100 as these defines are only used with older | ||
2131 | * adapters. | ||
2132 | */ | ||
2133 | #define GID_PT_SNS_DATA_SIZE (MAX_FIBRE_DEVICES_2100 * 4 + 16) | ||
2116 | 2134 | ||
2117 | #define GPN_ID_SNS_SCMD_LEN 6 | 2135 | #define GPN_ID_SNS_SCMD_LEN 6 |
2118 | #define GPN_ID_SNS_CMD_SIZE 28 | 2136 | #define GPN_ID_SNS_CMD_SIZE 28 |
@@ -2160,7 +2178,6 @@ struct gid_list_info { | |||
2160 | uint16_t loop_id; /* ISP23XX -- 6 bytes. */ | 2178 | uint16_t loop_id; /* ISP23XX -- 6 bytes. */ |
2161 | uint16_t reserved_1; /* ISP24XX -- 8 bytes. */ | 2179 | uint16_t reserved_1; /* ISP24XX -- 8 bytes. */ |
2162 | }; | 2180 | }; |
2163 | #define GID_LIST_SIZE (sizeof(struct gid_list_info) * MAX_FIBRE_DEVICES) | ||
2164 | 2181 | ||
2165 | /* NPIV */ | 2182 | /* NPIV */ |
2166 | typedef struct vport_info { | 2183 | typedef struct vport_info { |
@@ -2261,6 +2278,7 @@ struct isp_operations { | |||
2261 | #define QLA_MIDX_DEFAULT 0 | 2278 | #define QLA_MIDX_DEFAULT 0 |
2262 | #define QLA_MIDX_RSP_Q 1 | 2279 | #define QLA_MIDX_RSP_Q 1 |
2263 | #define QLA_PCI_MSIX_CONTROL 0xa2 | 2280 | #define QLA_PCI_MSIX_CONTROL 0xa2 |
2281 | #define QLA_83XX_PCI_MSIX_CONTROL 0x92 | ||
2264 | 2282 | ||
2265 | struct scsi_qla_host; | 2283 | struct scsi_qla_host; |
2266 | 2284 | ||
@@ -2341,7 +2359,7 @@ struct qla_statistics { | |||
2341 | #define QLA_MQ_SIZE 32 | 2359 | #define QLA_MQ_SIZE 32 |
2342 | #define QLA_MAX_QUEUES 256 | 2360 | #define QLA_MAX_QUEUES 256 |
2343 | #define ISP_QUE_REG(ha, id) \ | 2361 | #define ISP_QUE_REG(ha, id) \ |
2344 | ((ha->mqenable) ? \ | 2362 | ((ha->mqenable || IS_QLA83XX(ha)) ? \ |
2345 | ((void *)(ha->mqiobase) +\ | 2363 | ((void *)(ha->mqiobase) +\ |
2346 | (QLA_QUE_PAGE * id)) :\ | 2364 | (QLA_QUE_PAGE * id)) :\ |
2347 | ((void *)(ha->iobase))) | 2365 | ((void *)(ha->iobase))) |
@@ -2461,6 +2479,7 @@ struct qla_hw_data { | |||
2461 | #define MIN_IOBASE_LEN 0x100 | 2479 | #define MIN_IOBASE_LEN 0x100 |
2462 | /* Multi queue data structs */ | 2480 | /* Multi queue data structs */ |
2463 | device_reg_t __iomem *mqiobase; | 2481 | device_reg_t __iomem *mqiobase; |
2482 | device_reg_t __iomem *msixbase; | ||
2464 | uint16_t msix_count; | 2483 | uint16_t msix_count; |
2465 | uint8_t mqenable; | 2484 | uint8_t mqenable; |
2466 | struct req_que **req_q_map; | 2485 | struct req_que **req_q_map; |
@@ -2485,6 +2504,7 @@ struct qla_hw_data { | |||
2485 | atomic_t loop_down_timer; /* loop down timer */ | 2504 | atomic_t loop_down_timer; /* loop down timer */ |
2486 | uint8_t link_down_timeout; /* link down timeout */ | 2505 | uint8_t link_down_timeout; /* link down timeout */ |
2487 | uint16_t max_loop_id; | 2506 | uint16_t max_loop_id; |
2507 | uint16_t max_fibre_devices; /* Maximum number of targets */ | ||
2488 | 2508 | ||
2489 | uint16_t fb_rev; | 2509 | uint16_t fb_rev; |
2490 | uint16_t min_external_loopid; /* First external loop Id */ | 2510 | uint16_t min_external_loopid; /* First external loop Id */ |
@@ -2494,6 +2514,7 @@ struct qla_hw_data { | |||
2494 | #define PORT_SPEED_2GB 0x01 | 2514 | #define PORT_SPEED_2GB 0x01 |
2495 | #define PORT_SPEED_4GB 0x03 | 2515 | #define PORT_SPEED_4GB 0x03 |
2496 | #define PORT_SPEED_8GB 0x04 | 2516 | #define PORT_SPEED_8GB 0x04 |
2517 | #define PORT_SPEED_16GB 0x05 | ||
2497 | #define PORT_SPEED_10GB 0x13 | 2518 | #define PORT_SPEED_10GB 0x13 |
2498 | uint16_t link_data_rate; /* F/W operating speed */ | 2519 | uint16_t link_data_rate; /* F/W operating speed */ |
2499 | 2520 | ||
@@ -2515,6 +2536,8 @@ struct qla_hw_data { | |||
2515 | #define PCI_DEVICE_ID_QLOGIC_ISP2532 0x2532 | 2536 | #define PCI_DEVICE_ID_QLOGIC_ISP2532 0x2532 |
2516 | #define PCI_DEVICE_ID_QLOGIC_ISP8432 0x8432 | 2537 | #define PCI_DEVICE_ID_QLOGIC_ISP8432 0x8432 |
2517 | #define PCI_DEVICE_ID_QLOGIC_ISP8001 0x8001 | 2538 | #define PCI_DEVICE_ID_QLOGIC_ISP8001 0x8001 |
2539 | #define PCI_DEVICE_ID_QLOGIC_ISP8031 0x8031 | ||
2540 | #define PCI_DEVICE_ID_QLOGIC_ISP2031 0x2031 | ||
2518 | uint32_t device_type; | 2541 | uint32_t device_type; |
2519 | #define DT_ISP2100 BIT_0 | 2542 | #define DT_ISP2100 BIT_0 |
2520 | #define DT_ISP2200 BIT_1 | 2543 | #define DT_ISP2200 BIT_1 |
@@ -2531,7 +2554,9 @@ struct qla_hw_data { | |||
2531 | #define DT_ISP8432 BIT_12 | 2554 | #define DT_ISP8432 BIT_12 |
2532 | #define DT_ISP8001 BIT_13 | 2555 | #define DT_ISP8001 BIT_13 |
2533 | #define DT_ISP8021 BIT_14 | 2556 | #define DT_ISP8021 BIT_14 |
2534 | #define DT_ISP_LAST (DT_ISP8021 << 1) | 2557 | #define DT_ISP2031 BIT_15 |
2558 | #define DT_ISP8031 BIT_16 | ||
2559 | #define DT_ISP_LAST (DT_ISP8031 << 1) | ||
2535 | 2560 | ||
2536 | #define DT_T10_PI BIT_25 | 2561 | #define DT_T10_PI BIT_25 |
2537 | #define DT_IIDMA BIT_26 | 2562 | #define DT_IIDMA BIT_26 |
@@ -2555,26 +2580,30 @@ struct qla_hw_data { | |||
2555 | #define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532) | 2580 | #define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532) |
2556 | #define IS_QLA8432(ha) (DT_MASK(ha) & DT_ISP8432) | 2581 | #define IS_QLA8432(ha) (DT_MASK(ha) & DT_ISP8432) |
2557 | #define IS_QLA8001(ha) (DT_MASK(ha) & DT_ISP8001) | 2582 | #define IS_QLA8001(ha) (DT_MASK(ha) & DT_ISP8001) |
2583 | #define IS_QLA81XX(ha) (IS_QLA8001(ha)) | ||
2558 | #define IS_QLA82XX(ha) (DT_MASK(ha) & DT_ISP8021) | 2584 | #define IS_QLA82XX(ha) (DT_MASK(ha) & DT_ISP8021) |
2585 | #define IS_QLA2031(ha) (DT_MASK(ha) & DT_ISP2031) | ||
2586 | #define IS_QLA8031(ha) (DT_MASK(ha) & DT_ISP8031) | ||
2559 | 2587 | ||
2560 | #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ | 2588 | #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ |
2561 | IS_QLA6312(ha) || IS_QLA6322(ha)) | 2589 | IS_QLA6312(ha) || IS_QLA6322(ha)) |
2562 | #define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha)) | 2590 | #define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha)) |
2563 | #define IS_QLA54XX(ha) (IS_QLA5422(ha) || IS_QLA5432(ha)) | 2591 | #define IS_QLA54XX(ha) (IS_QLA5422(ha) || IS_QLA5432(ha)) |
2564 | #define IS_QLA25XX(ha) (IS_QLA2532(ha)) | 2592 | #define IS_QLA25XX(ha) (IS_QLA2532(ha)) |
2593 | #define IS_QLA83XX(ha) (IS_QLA2031(ha) || IS_QLA8031(ha)) | ||
2565 | #define IS_QLA84XX(ha) (IS_QLA8432(ha)) | 2594 | #define IS_QLA84XX(ha) (IS_QLA8432(ha)) |
2566 | #define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \ | 2595 | #define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \ |
2567 | IS_QLA84XX(ha)) | 2596 | IS_QLA84XX(ha)) |
2568 | #define IS_QLA81XX(ha) (IS_QLA8001(ha)) | 2597 | #define IS_CNA_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA82XX(ha) || \ |
2569 | #define IS_QLA8XXX_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA82XX(ha)) | 2598 | IS_QLA8031(ha)) |
2570 | #define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \ | 2599 | #define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \ |
2571 | IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ | 2600 | IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ |
2572 | IS_QLA82XX(ha)) | 2601 | IS_QLA82XX(ha) || IS_QLA83XX(ha)) |
2573 | #define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha)) | 2602 | #define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) |
2574 | #define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && \ | 2603 | #define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ |
2575 | (ha)->flags.msix_enabled) | 2604 | IS_QLA83XX(ha)) && (ha)->flags.msix_enabled) |
2576 | #define IS_FAC_REQUIRED(ha) (IS_QLA81XX(ha)) | 2605 | #define IS_FAC_REQUIRED(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) |
2577 | #define IS_NOCACHE_VPD_TYPE(ha) (IS_QLA81XX(ha)) | 2606 | #define IS_NOCACHE_VPD_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) |
2578 | #define IS_ALOGIO_CAPABLE(ha) (IS_QLA23XX(ha) || IS_FWI2_CAPABLE(ha)) | 2607 | #define IS_ALOGIO_CAPABLE(ha) (IS_QLA23XX(ha) || IS_FWI2_CAPABLE(ha)) |
2579 | 2608 | ||
2580 | #define IS_T10_PI_CAPABLE(ha) ((ha)->device_type & DT_T10_PI) | 2609 | #define IS_T10_PI_CAPABLE(ha) ((ha)->device_type & DT_T10_PI) |
@@ -2583,6 +2612,8 @@ struct qla_hw_data { | |||
2583 | #define IS_ZIO_SUPPORTED(ha) ((ha)->device_type & DT_ZIO_SUPPORTED) | 2612 | #define IS_ZIO_SUPPORTED(ha) ((ha)->device_type & DT_ZIO_SUPPORTED) |
2584 | #define IS_OEM_001(ha) ((ha)->device_type & DT_OEM_001) | 2613 | #define IS_OEM_001(ha) ((ha)->device_type & DT_OEM_001) |
2585 | #define HAS_EXTENDED_IDS(ha) ((ha)->device_type & DT_EXTENDED_IDS) | 2614 | #define HAS_EXTENDED_IDS(ha) ((ha)->device_type & DT_EXTENDED_IDS) |
2615 | #define IS_CT6_SUPPORTED(ha) ((ha)->device_type & DT_CT6_SUPPORTED) | ||
2616 | #define IS_MQUE_CAPABLE(ha) ((ha)->mqenable || IS_QLA83XX(ha)) | ||
2586 | 2617 | ||
2587 | /* HBA serial number */ | 2618 | /* HBA serial number */ |
2588 | uint8_t serial0; | 2619 | uint8_t serial0; |
@@ -2621,10 +2652,6 @@ struct qla_hw_data { | |||
2621 | void *sfp_data; | 2652 | void *sfp_data; |
2622 | dma_addr_t sfp_data_dma; | 2653 | dma_addr_t sfp_data_dma; |
2623 | 2654 | ||
2624 | uint8_t *edc_data; | ||
2625 | dma_addr_t edc_data_dma; | ||
2626 | uint16_t edc_data_len; | ||
2627 | |||
2628 | #define XGMAC_DATA_SIZE 4096 | 2655 | #define XGMAC_DATA_SIZE 4096 |
2629 | void *xgmac_data; | 2656 | void *xgmac_data; |
2630 | dma_addr_t xgmac_data_dma; | 2657 | dma_addr_t xgmac_data_dma; |
@@ -2653,6 +2680,8 @@ struct qla_hw_data { | |||
2653 | void *async_pd; | 2680 | void *async_pd; |
2654 | dma_addr_t async_pd_dma; | 2681 | dma_addr_t async_pd_dma; |
2655 | 2682 | ||
2683 | void *swl; | ||
2684 | |||
2656 | /* These are used by mailbox operations. */ | 2685 | /* These are used by mailbox operations. */ |
2657 | volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT]; | 2686 | volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT]; |
2658 | 2687 | ||
@@ -2674,6 +2703,8 @@ struct qla_hw_data { | |||
2674 | uint16_t fw_minor_version; | 2703 | uint16_t fw_minor_version; |
2675 | uint16_t fw_subminor_version; | 2704 | uint16_t fw_subminor_version; |
2676 | uint16_t fw_attributes; | 2705 | uint16_t fw_attributes; |
2706 | uint16_t fw_attributes_h; | ||
2707 | uint16_t fw_attributes_ext[2]; | ||
2677 | uint32_t fw_memory_size; | 2708 | uint32_t fw_memory_size; |
2678 | uint32_t fw_transfer_size; | 2709 | uint32_t fw_transfer_size; |
2679 | uint32_t fw_srisc_address; | 2710 | uint32_t fw_srisc_address; |
@@ -2851,7 +2882,6 @@ typedef struct scsi_qla_host { | |||
2851 | volatile struct { | 2882 | volatile struct { |
2852 | uint32_t init_done :1; | 2883 | uint32_t init_done :1; |
2853 | uint32_t online :1; | 2884 | uint32_t online :1; |
2854 | uint32_t rscn_queue_overflow :1; | ||
2855 | uint32_t reset_active :1; | 2885 | uint32_t reset_active :1; |
2856 | 2886 | ||
2857 | uint32_t management_server_logged_in :1; | 2887 | uint32_t management_server_logged_in :1; |
@@ -2905,11 +2935,6 @@ typedef struct scsi_qla_host { | |||
2905 | 2935 | ||
2906 | 2936 | ||
2907 | 2937 | ||
2908 | /* RSCN queue. */ | ||
2909 | uint32_t rscn_queue[MAX_RSCN_COUNT]; | ||
2910 | uint8_t rscn_in_ptr; | ||
2911 | uint8_t rscn_out_ptr; | ||
2912 | |||
2913 | /* Timeout timers. */ | 2938 | /* Timeout timers. */ |
2914 | uint8_t loop_down_abort_time; /* port down timer */ | 2939 | uint8_t loop_down_abort_time; /* port down timer */ |
2915 | atomic_t loop_down_timer; /* loop down timer */ | 2940 | atomic_t loop_down_timer; /* loop down timer */ |
@@ -3005,7 +3030,6 @@ typedef struct scsi_qla_host { | |||
3005 | #define QLA_ABORTED 0x105 | 3030 | #define QLA_ABORTED 0x105 |
3006 | #define QLA_SUSPENDED 0x106 | 3031 | #define QLA_SUSPENDED 0x106 |
3007 | #define QLA_BUSY 0x107 | 3032 | #define QLA_BUSY 0x107 |
3008 | #define QLA_RSCNS_HANDLED 0x108 | ||
3009 | #define QLA_ALREADY_REGISTERED 0x109 | 3033 | #define QLA_ALREADY_REGISTERED 0x109 |
3010 | 3034 | ||
3011 | #define NVRAM_DELAY() udelay(10) | 3035 | #define NVRAM_DELAY() udelay(10) |
@@ -3021,6 +3045,7 @@ typedef struct scsi_qla_host { | |||
3021 | #define OPTROM_SIZE_25XX 0x200000 | 3045 | #define OPTROM_SIZE_25XX 0x200000 |
3022 | #define OPTROM_SIZE_81XX 0x400000 | 3046 | #define OPTROM_SIZE_81XX 0x400000 |
3023 | #define OPTROM_SIZE_82XX 0x800000 | 3047 | #define OPTROM_SIZE_82XX 0x800000 |
3048 | #define OPTROM_SIZE_83XX 0x1000000 | ||
3024 | 3049 | ||
3025 | #define OPTROM_BURST_SIZE 0x1000 | 3050 | #define OPTROM_BURST_SIZE 0x1000 |
3026 | #define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4) | 3051 | #define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4) |
diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c index 0b4c2b794c6..499c74e39ee 100644 --- a/drivers/scsi/qla2xxx/qla_dfs.c +++ b/drivers/scsi/qla2xxx/qla_dfs.c | |||
@@ -114,7 +114,7 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha) | |||
114 | { | 114 | { |
115 | struct qla_hw_data *ha = vha->hw; | 115 | struct qla_hw_data *ha = vha->hw; |
116 | 116 | ||
117 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) | 117 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha)) |
118 | goto out; | 118 | goto out; |
119 | if (!ha->fce) | 119 | if (!ha->fce) |
120 | goto out; | 120 | goto out; |
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index aa69486dc06..6d7d7758c79 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h | |||
@@ -1327,6 +1327,11 @@ struct qla_flt_header { | |||
1327 | #define FLT_REG_GOLD_FW 0x2f | 1327 | #define FLT_REG_GOLD_FW 0x2f |
1328 | #define FLT_REG_FCP_PRIO_0 0x87 | 1328 | #define FLT_REG_FCP_PRIO_0 0x87 |
1329 | #define FLT_REG_FCP_PRIO_1 0x88 | 1329 | #define FLT_REG_FCP_PRIO_1 0x88 |
1330 | #define FLT_REG_FCOE_FW 0xA4 | ||
1331 | #define FLT_REG_FCOE_VPD_0 0xA9 | ||
1332 | #define FLT_REG_FCOE_NVRAM_0 0xAA | ||
1333 | #define FLT_REG_FCOE_VPD_1 0xAB | ||
1334 | #define FLT_REG_FCOE_NVRAM_1 0xAC | ||
1330 | 1335 | ||
1331 | struct qla_flt_region { | 1336 | struct qla_flt_region { |
1332 | uint32_t code; | 1337 | uint32_t code; |
@@ -1494,6 +1499,11 @@ struct access_chip_rsp_84xx { | |||
1494 | #define MBC_GET_XGMAC_STATS 0x7a | 1499 | #define MBC_GET_XGMAC_STATS 0x7a |
1495 | #define MBC_GET_DCBX_PARAMS 0x51 | 1500 | #define MBC_GET_DCBX_PARAMS 0x51 |
1496 | 1501 | ||
1502 | /* | ||
1503 | * ISP83xx mailbox commands | ||
1504 | */ | ||
1505 | #define MBC_WRITE_REMOTE_REG 0x0001 /* Write remote register */ | ||
1506 | |||
1497 | /* Flash access control option field bit definitions */ | 1507 | /* Flash access control option field bit definitions */ |
1498 | #define FAC_OPT_FORCE_SEMAPHORE BIT_15 | 1508 | #define FAC_OPT_FORCE_SEMAPHORE BIT_15 |
1499 | #define FAC_OPT_REQUESTOR_ID BIT_14 | 1509 | #define FAC_OPT_REQUESTOR_ID BIT_14 |
@@ -1875,4 +1885,7 @@ struct qla_fcp_prio_cfg { | |||
1875 | #define FA_NPIV_CONF0_ADDR_81 0xD1000 | 1885 | #define FA_NPIV_CONF0_ADDR_81 0xD1000 |
1876 | #define FA_NPIV_CONF1_ADDR_81 0xD2000 | 1886 | #define FA_NPIV_CONF1_ADDR_81 0xD2000 |
1877 | 1887 | ||
1888 | /* 83XX Flash locations -- occupies second 8MB region. */ | ||
1889 | #define FA_FLASH_LAYOUT_ADDR_83 0xFC400 | ||
1890 | |||
1878 | #endif | 1891 | #endif |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 408679be8fd..9f065804bd1 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -71,8 +71,6 @@ extern void qla2x00_async_logout_done(struct scsi_qla_host *, fc_port_t *, | |||
71 | uint16_t *); | 71 | uint16_t *); |
72 | extern void qla2x00_async_adisc_done(struct scsi_qla_host *, fc_port_t *, | 72 | extern void qla2x00_async_adisc_done(struct scsi_qla_host *, fc_port_t *, |
73 | uint16_t *); | 73 | uint16_t *); |
74 | extern void qla2x00_async_tm_cmd_done(struct scsi_qla_host *, fc_port_t *, | ||
75 | struct srb_iocb *); | ||
76 | extern void *qla2x00_alloc_iocbs(struct scsi_qla_host *, srb_t *); | 74 | extern void *qla2x00_alloc_iocbs(struct scsi_qla_host *, srb_t *); |
77 | extern int qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *, fc_port_t *); | 75 | extern int qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *, fc_port_t *); |
78 | 76 | ||
@@ -156,8 +154,7 @@ extern void qla2x00_do_dpc_all_vps(scsi_qla_host_t *); | |||
156 | extern int qla24xx_vport_create_req_sanity_check(struct fc_vport *); | 154 | extern int qla24xx_vport_create_req_sanity_check(struct fc_vport *); |
157 | extern scsi_qla_host_t * qla24xx_create_vhost(struct fc_vport *); | 155 | extern scsi_qla_host_t * qla24xx_create_vhost(struct fc_vport *); |
158 | 156 | ||
159 | extern void qla2x00_sp_compl(struct qla_hw_data *, srb_t *); | 157 | extern void qla2x00_sp_free_dma(void *, void *); |
160 | |||
161 | extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *); | 158 | extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *); |
162 | 159 | ||
163 | extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int); | 160 | extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int); |
@@ -205,8 +202,7 @@ extern int | |||
205 | qla2x00_execute_fw(scsi_qla_host_t *, uint32_t); | 202 | qla2x00_execute_fw(scsi_qla_host_t *, uint32_t); |
206 | 203 | ||
207 | extern int | 204 | extern int |
208 | qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, uint16_t *, uint16_t *, | 205 | qla2x00_get_fw_version(scsi_qla_host_t *); |
209 | uint16_t *, uint32_t *, uint8_t *, uint32_t *, uint8_t *); | ||
210 | 206 | ||
211 | extern int | 207 | extern int |
212 | qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *); | 208 | qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *); |
@@ -371,6 +367,9 @@ qla81xx_get_port_config(scsi_qla_host_t *, uint16_t *); | |||
371 | extern int | 367 | extern int |
372 | qla81xx_set_port_config(scsi_qla_host_t *, uint16_t *); | 368 | qla81xx_set_port_config(scsi_qla_host_t *, uint16_t *); |
373 | 369 | ||
370 | extern int | ||
371 | qla2x00_port_logout(scsi_qla_host_t *, struct fc_port *); | ||
372 | |||
374 | /* | 373 | /* |
375 | * Global Function Prototypes in qla_isr.c source file. | 374 | * Global Function Prototypes in qla_isr.c source file. |
376 | */ | 375 | */ |
@@ -409,8 +408,10 @@ extern void qla2x00_beacon_blink(struct scsi_qla_host *); | |||
409 | extern int qla24xx_beacon_on(struct scsi_qla_host *); | 408 | extern int qla24xx_beacon_on(struct scsi_qla_host *); |
410 | extern int qla24xx_beacon_off(struct scsi_qla_host *); | 409 | extern int qla24xx_beacon_off(struct scsi_qla_host *); |
411 | extern void qla24xx_beacon_blink(struct scsi_qla_host *); | 410 | extern void qla24xx_beacon_blink(struct scsi_qla_host *); |
411 | extern void qla83xx_beacon_blink(struct scsi_qla_host *); | ||
412 | extern int qla82xx_beacon_on(struct scsi_qla_host *); | 412 | extern int qla82xx_beacon_on(struct scsi_qla_host *); |
413 | extern int qla82xx_beacon_off(struct scsi_qla_host *); | 413 | extern int qla82xx_beacon_off(struct scsi_qla_host *); |
414 | extern int qla83xx_write_remote_reg(struct scsi_qla_host *, uint32_t, uint32_t); | ||
414 | 415 | ||
415 | extern uint8_t *qla2x00_read_optrom_data(struct scsi_qla_host *, uint8_t *, | 416 | extern uint8_t *qla2x00_read_optrom_data(struct scsi_qla_host *, uint8_t *, |
416 | uint32_t, uint32_t); | 417 | uint32_t, uint32_t); |
@@ -541,6 +542,10 @@ extern int qla82xx_restart_isp(scsi_qla_host_t *); | |||
541 | 542 | ||
542 | /* IOCB related functions */ | 543 | /* IOCB related functions */ |
543 | extern int qla82xx_start_scsi(srb_t *); | 544 | extern int qla82xx_start_scsi(srb_t *); |
545 | extern void qla2x00_sp_free(void *, void *); | ||
546 | extern void qla2x00_sp_timeout(unsigned long); | ||
547 | extern void qla2x00_bsg_job_done(void *, void *, int); | ||
548 | extern void qla2x00_bsg_sp_free(void *, void *); | ||
544 | 549 | ||
545 | /* Interrupt related */ | 550 | /* Interrupt related */ |
546 | extern irqreturn_t qla82xx_intr_handler(int, void *); | 551 | extern irqreturn_t qla82xx_intr_handler(int, void *); |
@@ -576,6 +581,8 @@ extern void qla82xx_start_iocbs(scsi_qla_host_t *); | |||
576 | extern int qla82xx_fcoe_ctx_reset(scsi_qla_host_t *); | 581 | extern int qla82xx_fcoe_ctx_reset(scsi_qla_host_t *); |
577 | extern int qla82xx_check_md_needed(scsi_qla_host_t *); | 582 | extern int qla82xx_check_md_needed(scsi_qla_host_t *); |
578 | extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *); | 583 | extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *); |
584 | extern int qla81xx_set_led_config(scsi_qla_host_t *, uint16_t *); | ||
585 | extern int qla81xx_get_led_config(scsi_qla_host_t *, uint16_t *); | ||
579 | extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int); | 586 | extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int); |
580 | extern char *qdev_state(uint32_t); | 587 | extern char *qdev_state(uint32_t); |
581 | extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *); | 588 | extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *); |
@@ -589,6 +596,9 @@ extern int qla2x00_issue_iocb_timeout(scsi_qla_host_t *, void *, | |||
589 | extern int qla2x00_get_idma_speed(scsi_qla_host_t *, uint16_t, | 596 | extern int qla2x00_get_idma_speed(scsi_qla_host_t *, uint16_t, |
590 | uint16_t *, uint16_t *); | 597 | uint16_t *, uint16_t *); |
591 | 598 | ||
599 | /* 83xx related functions */ | ||
600 | extern void qla83xx_fw_dump(scsi_qla_host_t *, int); | ||
601 | |||
592 | /* Minidump related functions */ | 602 | /* Minidump related functions */ |
593 | extern int qla82xx_md_get_template_size(scsi_qla_host_t *); | 603 | extern int qla82xx_md_get_template_size(scsi_qla_host_t *); |
594 | extern int qla82xx_md_get_template(scsi_qla_host_t *); | 604 | extern int qla82xx_md_get_template(scsi_qla_host_t *); |
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 4aea4ae2330..3128f80441f 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c | |||
@@ -240,6 +240,12 @@ qla2x00_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) | |||
240 | return (rval); | 240 | return (rval); |
241 | } | 241 | } |
242 | 242 | ||
243 | static inline int | ||
244 | qla2x00_gid_pt_rsp_size(scsi_qla_host_t *vha) | ||
245 | { | ||
246 | return vha->hw->max_fibre_devices * 4 + 16; | ||
247 | } | ||
248 | |||
243 | /** | 249 | /** |
244 | * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command. | 250 | * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command. |
245 | * @ha: HA context | 251 | * @ha: HA context |
@@ -261,20 +267,21 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
261 | 267 | ||
262 | struct ct_sns_gid_pt_data *gid_data; | 268 | struct ct_sns_gid_pt_data *gid_data; |
263 | struct qla_hw_data *ha = vha->hw; | 269 | struct qla_hw_data *ha = vha->hw; |
270 | uint16_t gid_pt_rsp_size; | ||
264 | 271 | ||
265 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) | 272 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) |
266 | return qla2x00_sns_gid_pt(vha, list); | 273 | return qla2x00_sns_gid_pt(vha, list); |
267 | 274 | ||
268 | gid_data = NULL; | 275 | gid_data = NULL; |
269 | 276 | gid_pt_rsp_size = qla2x00_gid_pt_rsp_size(vha); | |
270 | /* Issue GID_PT */ | 277 | /* Issue GID_PT */ |
271 | /* Prepare common MS IOCB */ | 278 | /* Prepare common MS IOCB */ |
272 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GID_PT_REQ_SIZE, | 279 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GID_PT_REQ_SIZE, |
273 | GID_PT_RSP_SIZE); | 280 | gid_pt_rsp_size); |
274 | 281 | ||
275 | /* Prepare CT request */ | 282 | /* Prepare CT request */ |
276 | ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GID_PT_CMD, | 283 | ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GID_PT_CMD, |
277 | GID_PT_RSP_SIZE); | 284 | gid_pt_rsp_size); |
278 | ct_rsp = &ha->ct_sns->p.rsp; | 285 | ct_rsp = &ha->ct_sns->p.rsp; |
279 | 286 | ||
280 | /* Prepare CT arguments -- port_type */ | 287 | /* Prepare CT arguments -- port_type */ |
@@ -292,7 +299,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
292 | rval = QLA_FUNCTION_FAILED; | 299 | rval = QLA_FUNCTION_FAILED; |
293 | } else { | 300 | } else { |
294 | /* Set port IDs in switch info list. */ | 301 | /* Set port IDs in switch info list. */ |
295 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 302 | for (i = 0; i < ha->max_fibre_devices; i++) { |
296 | gid_data = &ct_rsp->rsp.gid_pt.entries[i]; | 303 | gid_data = &ct_rsp->rsp.gid_pt.entries[i]; |
297 | list[i].d_id.b.domain = gid_data->port_id[0]; | 304 | list[i].d_id.b.domain = gid_data->port_id[0]; |
298 | list[i].d_id.b.area = gid_data->port_id[1]; | 305 | list[i].d_id.b.area = gid_data->port_id[1]; |
@@ -313,7 +320,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
313 | * single call. Return a failed status, and let GA_NXT handle | 320 | * single call. Return a failed status, and let GA_NXT handle |
314 | * the overload. | 321 | * the overload. |
315 | */ | 322 | */ |
316 | if (i == MAX_FIBRE_DEVICES) | 323 | if (i == ha->max_fibre_devices) |
317 | rval = QLA_FUNCTION_FAILED; | 324 | rval = QLA_FUNCTION_FAILED; |
318 | } | 325 | } |
319 | 326 | ||
@@ -330,7 +337,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
330 | int | 337 | int |
331 | qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | 338 | qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) |
332 | { | 339 | { |
333 | int rval; | 340 | int rval = QLA_SUCCESS; |
334 | uint16_t i; | 341 | uint16_t i; |
335 | 342 | ||
336 | ms_iocb_entry_t *ms_pkt; | 343 | ms_iocb_entry_t *ms_pkt; |
@@ -341,7 +348,7 @@ qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
341 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) | 348 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) |
342 | return qla2x00_sns_gpn_id(vha, list); | 349 | return qla2x00_sns_gpn_id(vha, list); |
343 | 350 | ||
344 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 351 | for (i = 0; i < ha->max_fibre_devices; i++) { |
345 | /* Issue GPN_ID */ | 352 | /* Issue GPN_ID */ |
346 | /* Prepare common MS IOCB */ | 353 | /* Prepare common MS IOCB */ |
347 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GPN_ID_REQ_SIZE, | 354 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GPN_ID_REQ_SIZE, |
@@ -364,9 +371,11 @@ qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
364 | /*EMPTY*/ | 371 | /*EMPTY*/ |
365 | ql_dbg(ql_dbg_disc, vha, 0x2056, | 372 | ql_dbg(ql_dbg_disc, vha, 0x2056, |
366 | "GPN_ID issue IOCB failed (%d).\n", rval); | 373 | "GPN_ID issue IOCB failed (%d).\n", rval); |
374 | break; | ||
367 | } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, | 375 | } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, |
368 | "GPN_ID") != QLA_SUCCESS) { | 376 | "GPN_ID") != QLA_SUCCESS) { |
369 | rval = QLA_FUNCTION_FAILED; | 377 | rval = QLA_FUNCTION_FAILED; |
378 | break; | ||
370 | } else { | 379 | } else { |
371 | /* Save portname */ | 380 | /* Save portname */ |
372 | memcpy(list[i].port_name, | 381 | memcpy(list[i].port_name, |
@@ -391,7 +400,7 @@ qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
391 | int | 400 | int |
392 | qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) | 401 | qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) |
393 | { | 402 | { |
394 | int rval; | 403 | int rval = QLA_SUCCESS; |
395 | uint16_t i; | 404 | uint16_t i; |
396 | struct qla_hw_data *ha = vha->hw; | 405 | struct qla_hw_data *ha = vha->hw; |
397 | ms_iocb_entry_t *ms_pkt; | 406 | ms_iocb_entry_t *ms_pkt; |
@@ -401,7 +410,7 @@ qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
401 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) | 410 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) |
402 | return qla2x00_sns_gnn_id(vha, list); | 411 | return qla2x00_sns_gnn_id(vha, list); |
403 | 412 | ||
404 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 413 | for (i = 0; i < ha->max_fibre_devices; i++) { |
405 | /* Issue GNN_ID */ | 414 | /* Issue GNN_ID */ |
406 | /* Prepare common MS IOCB */ | 415 | /* Prepare common MS IOCB */ |
407 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GNN_ID_REQ_SIZE, | 416 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GNN_ID_REQ_SIZE, |
@@ -424,9 +433,11 @@ qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
424 | /*EMPTY*/ | 433 | /*EMPTY*/ |
425 | ql_dbg(ql_dbg_disc, vha, 0x2057, | 434 | ql_dbg(ql_dbg_disc, vha, 0x2057, |
426 | "GNN_ID issue IOCB failed (%d).\n", rval); | 435 | "GNN_ID issue IOCB failed (%d).\n", rval); |
436 | break; | ||
427 | } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, | 437 | } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, |
428 | "GNN_ID") != QLA_SUCCESS) { | 438 | "GNN_ID") != QLA_SUCCESS) { |
429 | rval = QLA_FUNCTION_FAILED; | 439 | rval = QLA_FUNCTION_FAILED; |
440 | break; | ||
430 | } else { | 441 | } else { |
431 | /* Save nodename */ | 442 | /* Save nodename */ |
432 | memcpy(list[i].node_name, | 443 | memcpy(list[i].node_name, |
@@ -735,7 +746,7 @@ qla2x00_prep_sns_cmd(scsi_qla_host_t *vha, uint16_t cmd, uint16_t scmd_len, | |||
735 | static int | 746 | static int |
736 | qla2x00_sns_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) | 747 | qla2x00_sns_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) |
737 | { | 748 | { |
738 | int rval; | 749 | int rval = QLA_SUCCESS; |
739 | struct qla_hw_data *ha = vha->hw; | 750 | struct qla_hw_data *ha = vha->hw; |
740 | struct sns_cmd_pkt *sns_cmd; | 751 | struct sns_cmd_pkt *sns_cmd; |
741 | 752 | ||
@@ -814,11 +825,14 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
814 | uint16_t i; | 825 | uint16_t i; |
815 | uint8_t *entry; | 826 | uint8_t *entry; |
816 | struct sns_cmd_pkt *sns_cmd; | 827 | struct sns_cmd_pkt *sns_cmd; |
828 | uint16_t gid_pt_sns_data_size; | ||
829 | |||
830 | gid_pt_sns_data_size = qla2x00_gid_pt_rsp_size(vha); | ||
817 | 831 | ||
818 | /* Issue GID_PT. */ | 832 | /* Issue GID_PT. */ |
819 | /* Prepare SNS command request. */ | 833 | /* Prepare SNS command request. */ |
820 | sns_cmd = qla2x00_prep_sns_cmd(vha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN, | 834 | sns_cmd = qla2x00_prep_sns_cmd(vha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN, |
821 | GID_PT_SNS_DATA_SIZE); | 835 | gid_pt_sns_data_size); |
822 | 836 | ||
823 | /* Prepare SNS command arguments -- port_type. */ | 837 | /* Prepare SNS command arguments -- port_type. */ |
824 | sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE; | 838 | sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE; |
@@ -839,7 +853,7 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
839 | rval = QLA_FUNCTION_FAILED; | 853 | rval = QLA_FUNCTION_FAILED; |
840 | } else { | 854 | } else { |
841 | /* Set port IDs in switch info list. */ | 855 | /* Set port IDs in switch info list. */ |
842 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 856 | for (i = 0; i < ha->max_fibre_devices; i++) { |
843 | entry = &sns_cmd->p.gid_data[(i * 4) + 16]; | 857 | entry = &sns_cmd->p.gid_data[(i * 4) + 16]; |
844 | list[i].d_id.b.domain = entry[1]; | 858 | list[i].d_id.b.domain = entry[1]; |
845 | list[i].d_id.b.area = entry[2]; | 859 | list[i].d_id.b.area = entry[2]; |
@@ -858,7 +872,7 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
858 | * single call. Return a failed status, and let GA_NXT handle | 872 | * single call. Return a failed status, and let GA_NXT handle |
859 | * the overload. | 873 | * the overload. |
860 | */ | 874 | */ |
861 | if (i == MAX_FIBRE_DEVICES) | 875 | if (i == ha->max_fibre_devices) |
862 | rval = QLA_FUNCTION_FAILED; | 876 | rval = QLA_FUNCTION_FAILED; |
863 | } | 877 | } |
864 | 878 | ||
@@ -877,12 +891,12 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
877 | static int | 891 | static int |
878 | qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | 892 | qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) |
879 | { | 893 | { |
880 | int rval; | 894 | int rval = QLA_SUCCESS; |
881 | struct qla_hw_data *ha = vha->hw; | 895 | struct qla_hw_data *ha = vha->hw; |
882 | uint16_t i; | 896 | uint16_t i; |
883 | struct sns_cmd_pkt *sns_cmd; | 897 | struct sns_cmd_pkt *sns_cmd; |
884 | 898 | ||
885 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 899 | for (i = 0; i < ha->max_fibre_devices; i++) { |
886 | /* Issue GPN_ID */ | 900 | /* Issue GPN_ID */ |
887 | /* Prepare SNS command request. */ | 901 | /* Prepare SNS command request. */ |
888 | sns_cmd = qla2x00_prep_sns_cmd(vha, GPN_ID_CMD, | 902 | sns_cmd = qla2x00_prep_sns_cmd(vha, GPN_ID_CMD, |
@@ -933,12 +947,12 @@ qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
933 | static int | 947 | static int |
934 | qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) | 948 | qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) |
935 | { | 949 | { |
936 | int rval; | 950 | int rval = QLA_SUCCESS; |
937 | struct qla_hw_data *ha = vha->hw; | 951 | struct qla_hw_data *ha = vha->hw; |
938 | uint16_t i; | 952 | uint16_t i; |
939 | struct sns_cmd_pkt *sns_cmd; | 953 | struct sns_cmd_pkt *sns_cmd; |
940 | 954 | ||
941 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 955 | for (i = 0; i < ha->max_fibre_devices; i++) { |
942 | /* Issue GNN_ID */ | 956 | /* Issue GNN_ID */ |
943 | /* Prepare SNS command request. */ | 957 | /* Prepare SNS command request. */ |
944 | sns_cmd = qla2x00_prep_sns_cmd(vha, GNN_ID_CMD, | 958 | sns_cmd = qla2x00_prep_sns_cmd(vha, GNN_ID_CMD, |
@@ -1107,20 +1121,26 @@ qla2x00_sns_rnn_id(scsi_qla_host_t *vha) | |||
1107 | static int | 1121 | static int |
1108 | qla2x00_mgmt_svr_login(scsi_qla_host_t *vha) | 1122 | qla2x00_mgmt_svr_login(scsi_qla_host_t *vha) |
1109 | { | 1123 | { |
1110 | int ret; | 1124 | int ret, rval; |
1111 | uint16_t mb[MAILBOX_REGISTER_COUNT]; | 1125 | uint16_t mb[MAILBOX_REGISTER_COUNT]; |
1112 | struct qla_hw_data *ha = vha->hw; | 1126 | struct qla_hw_data *ha = vha->hw; |
1113 | ret = QLA_SUCCESS; | 1127 | ret = QLA_SUCCESS; |
1114 | if (vha->flags.management_server_logged_in) | 1128 | if (vha->flags.management_server_logged_in) |
1115 | return ret; | 1129 | return ret; |
1116 | 1130 | ||
1117 | ha->isp_ops->fabric_login(vha, vha->mgmt_svr_loop_id, 0xff, 0xff, 0xfa, | 1131 | rval = ha->isp_ops->fabric_login(vha, vha->mgmt_svr_loop_id, 0xff, 0xff, |
1118 | mb, BIT_1|BIT_0); | 1132 | 0xfa, mb, BIT_1|BIT_0); |
1119 | if (mb[0] != MBS_COMMAND_COMPLETE) { | 1133 | if (rval != QLA_SUCCESS || mb[0] != MBS_COMMAND_COMPLETE) { |
1120 | ql_dbg(ql_dbg_disc, vha, 0x2024, | 1134 | if (rval == QLA_MEMORY_ALLOC_FAILED) |
1121 | "Failed management_server login: loopid=%x mb[0]=%x " | 1135 | ql_dbg(ql_dbg_disc, vha, 0x2085, |
1122 | "mb[1]=%x mb[2]=%x mb[6]=%x mb[7]=%x.\n", | 1136 | "Failed management_server login: loopid=%x " |
1123 | vha->mgmt_svr_loop_id, mb[0], mb[1], mb[2], mb[6], mb[7]); | 1137 | "rval=%d\n", vha->mgmt_svr_loop_id, rval); |
1138 | else | ||
1139 | ql_dbg(ql_dbg_disc, vha, 0x2024, | ||
1140 | "Failed management_server login: loopid=%x " | ||
1141 | "mb[0]=%x mb[1]=%x mb[2]=%x mb[6]=%x mb[7]=%x.\n", | ||
1142 | vha->mgmt_svr_loop_id, mb[0], mb[1], mb[2], mb[6], | ||
1143 | mb[7]); | ||
1124 | ret = QLA_FUNCTION_FAILED; | 1144 | ret = QLA_FUNCTION_FAILED; |
1125 | } else | 1145 | } else |
1126 | vha->flags.management_server_logged_in = 1; | 1146 | vha->flags.management_server_logged_in = 1; |
@@ -1547,7 +1567,7 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha) | |||
1547 | eiter = (struct ct_fdmi_port_attr *) (entries + size); | 1567 | eiter = (struct ct_fdmi_port_attr *) (entries + size); |
1548 | eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); | 1568 | eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); |
1549 | eiter->len = __constant_cpu_to_be16(4 + 4); | 1569 | eiter->len = __constant_cpu_to_be16(4 + 4); |
1550 | if (IS_QLA8XXX_TYPE(ha)) | 1570 | if (IS_CNA_CAPABLE(ha)) |
1551 | eiter->a.sup_speed = __constant_cpu_to_be32( | 1571 | eiter->a.sup_speed = __constant_cpu_to_be32( |
1552 | FDMI_PORT_SPEED_10GB); | 1572 | FDMI_PORT_SPEED_10GB); |
1553 | else if (IS_QLA25XX(ha)) | 1573 | else if (IS_QLA25XX(ha)) |
@@ -1594,6 +1614,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha) | |||
1594 | eiter->a.cur_speed = | 1614 | eiter->a.cur_speed = |
1595 | __constant_cpu_to_be32(FDMI_PORT_SPEED_10GB); | 1615 | __constant_cpu_to_be32(FDMI_PORT_SPEED_10GB); |
1596 | break; | 1616 | break; |
1617 | case PORT_SPEED_16GB: | ||
1618 | eiter->a.cur_speed = | ||
1619 | __constant_cpu_to_be32(FDMI_PORT_SPEED_16GB); | ||
1620 | break; | ||
1597 | default: | 1621 | default: |
1598 | eiter->a.cur_speed = | 1622 | eiter->a.cur_speed = |
1599 | __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); | 1623 | __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); |
@@ -1724,7 +1748,7 @@ qla2x00_fdmi_register(scsi_qla_host_t *vha) | |||
1724 | int | 1748 | int |
1725 | qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) | 1749 | qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) |
1726 | { | 1750 | { |
1727 | int rval; | 1751 | int rval = QLA_SUCCESS; |
1728 | uint16_t i; | 1752 | uint16_t i; |
1729 | struct qla_hw_data *ha = vha->hw; | 1753 | struct qla_hw_data *ha = vha->hw; |
1730 | ms_iocb_entry_t *ms_pkt; | 1754 | ms_iocb_entry_t *ms_pkt; |
@@ -1734,7 +1758,7 @@ qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
1734 | if (!IS_IIDMA_CAPABLE(ha)) | 1758 | if (!IS_IIDMA_CAPABLE(ha)) |
1735 | return QLA_FUNCTION_FAILED; | 1759 | return QLA_FUNCTION_FAILED; |
1736 | 1760 | ||
1737 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 1761 | for (i = 0; i < ha->max_fibre_devices; i++) { |
1738 | /* Issue GFPN_ID */ | 1762 | /* Issue GFPN_ID */ |
1739 | /* Prepare common MS IOCB */ | 1763 | /* Prepare common MS IOCB */ |
1740 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GFPN_ID_REQ_SIZE, | 1764 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GFPN_ID_REQ_SIZE, |
@@ -1757,9 +1781,11 @@ qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
1757 | /*EMPTY*/ | 1781 | /*EMPTY*/ |
1758 | ql_dbg(ql_dbg_disc, vha, 0x2023, | 1782 | ql_dbg(ql_dbg_disc, vha, 0x2023, |
1759 | "GFPN_ID issue IOCB failed (%d).\n", rval); | 1783 | "GFPN_ID issue IOCB failed (%d).\n", rval); |
1784 | break; | ||
1760 | } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, | 1785 | } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, |
1761 | "GFPN_ID") != QLA_SUCCESS) { | 1786 | "GFPN_ID") != QLA_SUCCESS) { |
1762 | rval = QLA_FUNCTION_FAILED; | 1787 | rval = QLA_FUNCTION_FAILED; |
1788 | break; | ||
1763 | } else { | 1789 | } else { |
1764 | /* Save fabric portname */ | 1790 | /* Save fabric portname */ |
1765 | memcpy(list[i].fabric_port_name, | 1791 | memcpy(list[i].fabric_port_name, |
@@ -1846,7 +1872,7 @@ qla2x00_gpsc(scsi_qla_host_t *vha, sw_info_t *list) | |||
1846 | if (rval) | 1872 | if (rval) |
1847 | return rval; | 1873 | return rval; |
1848 | 1874 | ||
1849 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 1875 | for (i = 0; i < ha->max_fibre_devices; i++) { |
1850 | /* Issue GFPN_ID */ | 1876 | /* Issue GFPN_ID */ |
1851 | /* Prepare common MS IOCB */ | 1877 | /* Prepare common MS IOCB */ |
1852 | ms_pkt = qla24xx_prep_ms_fm_iocb(vha, GPSC_REQ_SIZE, | 1878 | ms_pkt = qla24xx_prep_ms_fm_iocb(vha, GPSC_REQ_SIZE, |
@@ -1947,7 +1973,7 @@ qla2x00_gff_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
1947 | struct qla_hw_data *ha = vha->hw; | 1973 | struct qla_hw_data *ha = vha->hw; |
1948 | uint8_t fcp_scsi_features = 0; | 1974 | uint8_t fcp_scsi_features = 0; |
1949 | 1975 | ||
1950 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 1976 | for (i = 0; i < ha->max_fibre_devices; i++) { |
1951 | /* Set default FC4 Type as UNKNOWN so the default is to | 1977 | /* Set default FC4 Type as UNKNOWN so the default is to |
1952 | * Process this port */ | 1978 | * Process this port */ |
1953 | list[i].fc4_type = FC4_TYPE_UNKNOWN; | 1979 | list[i].fc4_type = FC4_TYPE_UNKNOWN; |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 1fa067e053d..b9465643396 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -29,7 +29,6 @@ static int qla2x00_configure_loop(scsi_qla_host_t *); | |||
29 | static int qla2x00_configure_local_loop(scsi_qla_host_t *); | 29 | static int qla2x00_configure_local_loop(scsi_qla_host_t *); |
30 | static int qla2x00_configure_fabric(scsi_qla_host_t *); | 30 | static int qla2x00_configure_fabric(scsi_qla_host_t *); |
31 | static int qla2x00_find_all_fabric_devs(scsi_qla_host_t *, struct list_head *); | 31 | static int qla2x00_find_all_fabric_devs(scsi_qla_host_t *, struct list_head *); |
32 | static int qla2x00_device_resync(scsi_qla_host_t *); | ||
33 | static int qla2x00_fabric_dev_login(scsi_qla_host_t *, fc_port_t *, | 32 | static int qla2x00_fabric_dev_login(scsi_qla_host_t *, fc_port_t *, |
34 | uint16_t *); | 33 | uint16_t *); |
35 | 34 | ||
@@ -41,11 +40,10 @@ static int qla25xx_init_queues(struct qla_hw_data *); | |||
41 | 40 | ||
42 | /* SRB Extensions ---------------------------------------------------------- */ | 41 | /* SRB Extensions ---------------------------------------------------------- */ |
43 | 42 | ||
44 | static void | 43 | void |
45 | qla2x00_ctx_sp_timeout(unsigned long __data) | 44 | qla2x00_sp_timeout(unsigned long __data) |
46 | { | 45 | { |
47 | srb_t *sp = (srb_t *)__data; | 46 | srb_t *sp = (srb_t *)__data; |
48 | struct srb_ctx *ctx; | ||
49 | struct srb_iocb *iocb; | 47 | struct srb_iocb *iocb; |
50 | fc_port_t *fcport = sp->fcport; | 48 | fc_port_t *fcport = sp->fcport; |
51 | struct qla_hw_data *ha = fcport->vha->hw; | 49 | struct qla_hw_data *ha = fcport->vha->hw; |
@@ -55,79 +53,25 @@ qla2x00_ctx_sp_timeout(unsigned long __data) | |||
55 | spin_lock_irqsave(&ha->hardware_lock, flags); | 53 | spin_lock_irqsave(&ha->hardware_lock, flags); |
56 | req = ha->req_q_map[0]; | 54 | req = ha->req_q_map[0]; |
57 | req->outstanding_cmds[sp->handle] = NULL; | 55 | req->outstanding_cmds[sp->handle] = NULL; |
58 | ctx = sp->ctx; | 56 | iocb = &sp->u.iocb_cmd; |
59 | iocb = ctx->u.iocb_cmd; | ||
60 | iocb->timeout(sp); | 57 | iocb->timeout(sp); |
61 | iocb->free(sp); | 58 | sp->free(fcport->vha, sp); |
62 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 59 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
63 | } | 60 | } |
64 | 61 | ||
65 | static void | 62 | void |
66 | qla2x00_ctx_sp_free(srb_t *sp) | 63 | qla2x00_sp_free(void *data, void *ptr) |
67 | { | 64 | { |
68 | struct srb_ctx *ctx = sp->ctx; | 65 | srb_t *sp = (srb_t *)ptr; |
69 | struct srb_iocb *iocb = ctx->u.iocb_cmd; | 66 | struct srb_iocb *iocb = &sp->u.iocb_cmd; |
70 | struct scsi_qla_host *vha = sp->fcport->vha; | 67 | struct scsi_qla_host *vha = (scsi_qla_host_t *)data; |
71 | 68 | ||
72 | del_timer(&iocb->timer); | 69 | del_timer(&iocb->timer); |
73 | kfree(iocb); | 70 | mempool_free(sp, vha->hw->srb_mempool); |
74 | kfree(ctx); | ||
75 | mempool_free(sp, sp->fcport->vha->hw->srb_mempool); | ||
76 | 71 | ||
77 | QLA_VHA_MARK_NOT_BUSY(vha); | 72 | QLA_VHA_MARK_NOT_BUSY(vha); |
78 | } | 73 | } |
79 | 74 | ||
80 | inline srb_t * | ||
81 | qla2x00_get_ctx_sp(scsi_qla_host_t *vha, fc_port_t *fcport, size_t size, | ||
82 | unsigned long tmo) | ||
83 | { | ||
84 | srb_t *sp = NULL; | ||
85 | struct qla_hw_data *ha = vha->hw; | ||
86 | struct srb_ctx *ctx; | ||
87 | struct srb_iocb *iocb; | ||
88 | uint8_t bail; | ||
89 | |||
90 | QLA_VHA_MARK_BUSY(vha, bail); | ||
91 | if (bail) | ||
92 | return NULL; | ||
93 | |||
94 | sp = mempool_alloc(ha->srb_mempool, GFP_KERNEL); | ||
95 | if (!sp) | ||
96 | goto done; | ||
97 | ctx = kzalloc(size, GFP_KERNEL); | ||
98 | if (!ctx) { | ||
99 | mempool_free(sp, ha->srb_mempool); | ||
100 | sp = NULL; | ||
101 | goto done; | ||
102 | } | ||
103 | iocb = kzalloc(sizeof(struct srb_iocb), GFP_KERNEL); | ||
104 | if (!iocb) { | ||
105 | mempool_free(sp, ha->srb_mempool); | ||
106 | sp = NULL; | ||
107 | kfree(ctx); | ||
108 | goto done; | ||
109 | } | ||
110 | |||
111 | memset(sp, 0, sizeof(*sp)); | ||
112 | sp->fcport = fcport; | ||
113 | sp->ctx = ctx; | ||
114 | ctx->iocbs = 1; | ||
115 | ctx->u.iocb_cmd = iocb; | ||
116 | iocb->free = qla2x00_ctx_sp_free; | ||
117 | |||
118 | init_timer(&iocb->timer); | ||
119 | if (!tmo) | ||
120 | goto done; | ||
121 | iocb->timer.expires = jiffies + tmo * HZ; | ||
122 | iocb->timer.data = (unsigned long)sp; | ||
123 | iocb->timer.function = qla2x00_ctx_sp_timeout; | ||
124 | add_timer(&iocb->timer); | ||
125 | done: | ||
126 | if (!sp) | ||
127 | QLA_VHA_MARK_NOT_BUSY(vha); | ||
128 | return sp; | ||
129 | } | ||
130 | |||
131 | /* Asynchronous Login/Logout Routines -------------------------------------- */ | 75 | /* Asynchronous Login/Logout Routines -------------------------------------- */ |
132 | 76 | ||
133 | static inline unsigned long | 77 | static inline unsigned long |
@@ -149,19 +93,19 @@ qla2x00_get_async_timeout(struct scsi_qla_host *vha) | |||
149 | } | 93 | } |
150 | 94 | ||
151 | static void | 95 | static void |
152 | qla2x00_async_iocb_timeout(srb_t *sp) | 96 | qla2x00_async_iocb_timeout(void *data) |
153 | { | 97 | { |
98 | srb_t *sp = (srb_t *)data; | ||
154 | fc_port_t *fcport = sp->fcport; | 99 | fc_port_t *fcport = sp->fcport; |
155 | struct srb_ctx *ctx = sp->ctx; | ||
156 | 100 | ||
157 | ql_dbg(ql_dbg_disc, fcport->vha, 0x2071, | 101 | ql_dbg(ql_dbg_disc, fcport->vha, 0x2071, |
158 | "Async-%s timeout - hdl=%x portid=%02x%02x%02x.\n", | 102 | "Async-%s timeout - hdl=%x portid=%02x%02x%02x.\n", |
159 | ctx->name, sp->handle, fcport->d_id.b.domain, fcport->d_id.b.area, | 103 | sp->name, sp->handle, fcport->d_id.b.domain, fcport->d_id.b.area, |
160 | fcport->d_id.b.al_pa); | 104 | fcport->d_id.b.al_pa); |
161 | 105 | ||
162 | fcport->flags &= ~FCF_ASYNC_SENT; | 106 | fcport->flags &= ~FCF_ASYNC_SENT; |
163 | if (ctx->type == SRB_LOGIN_CMD) { | 107 | if (sp->type == SRB_LOGIN_CMD) { |
164 | struct srb_iocb *lio = ctx->u.iocb_cmd; | 108 | struct srb_iocb *lio = &sp->u.iocb_cmd; |
165 | qla2x00_post_async_logout_work(fcport->vha, fcport, NULL); | 109 | qla2x00_post_async_logout_work(fcport->vha, fcport, NULL); |
166 | /* Retry as needed. */ | 110 | /* Retry as needed. */ |
167 | lio->u.logio.data[0] = MBS_COMMAND_ERROR; | 111 | lio->u.logio.data[0] = MBS_COMMAND_ERROR; |
@@ -173,14 +117,16 @@ qla2x00_async_iocb_timeout(srb_t *sp) | |||
173 | } | 117 | } |
174 | 118 | ||
175 | static void | 119 | static void |
176 | qla2x00_async_login_ctx_done(srb_t *sp) | 120 | qla2x00_async_login_sp_done(void *data, void *ptr, int res) |
177 | { | 121 | { |
178 | struct srb_ctx *ctx = sp->ctx; | 122 | srb_t *sp = (srb_t *)ptr; |
179 | struct srb_iocb *lio = ctx->u.iocb_cmd; | 123 | struct srb_iocb *lio = &sp->u.iocb_cmd; |
180 | 124 | struct scsi_qla_host *vha = (scsi_qla_host_t *)data; | |
181 | qla2x00_post_async_login_done_work(sp->fcport->vha, sp->fcport, | 125 | |
182 | lio->u.logio.data); | 126 | if (!test_bit(UNLOADING, &vha->dpc_flags)) |
183 | lio->free(sp); | 127 | qla2x00_post_async_login_done_work(sp->fcport->vha, sp->fcport, |
128 | lio->u.logio.data); | ||
129 | sp->free(sp->fcport->vha, sp); | ||
184 | } | 130 | } |
185 | 131 | ||
186 | int | 132 | int |
@@ -188,22 +134,21 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport, | |||
188 | uint16_t *data) | 134 | uint16_t *data) |
189 | { | 135 | { |
190 | srb_t *sp; | 136 | srb_t *sp; |
191 | struct srb_ctx *ctx; | ||
192 | struct srb_iocb *lio; | 137 | struct srb_iocb *lio; |
193 | int rval; | 138 | int rval; |
194 | 139 | ||
195 | rval = QLA_FUNCTION_FAILED; | 140 | rval = QLA_FUNCTION_FAILED; |
196 | sp = qla2x00_get_ctx_sp(vha, fcport, sizeof(struct srb_ctx), | 141 | sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); |
197 | qla2x00_get_async_timeout(vha) + 2); | ||
198 | if (!sp) | 142 | if (!sp) |
199 | goto done; | 143 | goto done; |
200 | 144 | ||
201 | ctx = sp->ctx; | 145 | sp->type = SRB_LOGIN_CMD; |
202 | ctx->type = SRB_LOGIN_CMD; | 146 | sp->name = "login"; |
203 | ctx->name = "login"; | 147 | qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); |
204 | lio = ctx->u.iocb_cmd; | 148 | |
149 | lio = &sp->u.iocb_cmd; | ||
205 | lio->timeout = qla2x00_async_iocb_timeout; | 150 | lio->timeout = qla2x00_async_iocb_timeout; |
206 | lio->done = qla2x00_async_login_ctx_done; | 151 | sp->done = qla2x00_async_login_sp_done; |
207 | lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI; | 152 | lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI; |
208 | if (data[1] & QLA_LOGIO_LOGIN_RETRIED) | 153 | if (data[1] & QLA_LOGIO_LOGIN_RETRIED) |
209 | lio->u.logio.flags |= SRB_LOGIN_RETRIED; | 154 | lio->u.logio.flags |= SRB_LOGIN_RETRIED; |
@@ -219,42 +164,43 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport, | |||
219 | return rval; | 164 | return rval; |
220 | 165 | ||
221 | done_free_sp: | 166 | done_free_sp: |
222 | lio->free(sp); | 167 | sp->free(fcport->vha, sp); |
223 | done: | 168 | done: |
224 | return rval; | 169 | return rval; |
225 | } | 170 | } |
226 | 171 | ||
227 | static void | 172 | static void |
228 | qla2x00_async_logout_ctx_done(srb_t *sp) | 173 | qla2x00_async_logout_sp_done(void *data, void *ptr, int res) |
229 | { | 174 | { |
230 | struct srb_ctx *ctx = sp->ctx; | 175 | srb_t *sp = (srb_t *)ptr; |
231 | struct srb_iocb *lio = ctx->u.iocb_cmd; | 176 | struct srb_iocb *lio = &sp->u.iocb_cmd; |
232 | 177 | struct scsi_qla_host *vha = (scsi_qla_host_t *)data; | |
233 | qla2x00_post_async_logout_done_work(sp->fcport->vha, sp->fcport, | 178 | |
234 | lio->u.logio.data); | 179 | if (!test_bit(UNLOADING, &vha->dpc_flags)) |
235 | lio->free(sp); | 180 | qla2x00_post_async_logout_done_work(sp->fcport->vha, sp->fcport, |
181 | lio->u.logio.data); | ||
182 | sp->free(sp->fcport->vha, sp); | ||
236 | } | 183 | } |
237 | 184 | ||
238 | int | 185 | int |
239 | qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport) | 186 | qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport) |
240 | { | 187 | { |
241 | srb_t *sp; | 188 | srb_t *sp; |
242 | struct srb_ctx *ctx; | ||
243 | struct srb_iocb *lio; | 189 | struct srb_iocb *lio; |
244 | int rval; | 190 | int rval; |
245 | 191 | ||
246 | rval = QLA_FUNCTION_FAILED; | 192 | rval = QLA_FUNCTION_FAILED; |
247 | sp = qla2x00_get_ctx_sp(vha, fcport, sizeof(struct srb_ctx), | 193 | sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); |
248 | qla2x00_get_async_timeout(vha) + 2); | ||
249 | if (!sp) | 194 | if (!sp) |
250 | goto done; | 195 | goto done; |
251 | 196 | ||
252 | ctx = sp->ctx; | 197 | sp->type = SRB_LOGOUT_CMD; |
253 | ctx->type = SRB_LOGOUT_CMD; | 198 | sp->name = "logout"; |
254 | ctx->name = "logout"; | 199 | qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); |
255 | lio = ctx->u.iocb_cmd; | 200 | |
201 | lio = &sp->u.iocb_cmd; | ||
256 | lio->timeout = qla2x00_async_iocb_timeout; | 202 | lio->timeout = qla2x00_async_iocb_timeout; |
257 | lio->done = qla2x00_async_logout_ctx_done; | 203 | sp->done = qla2x00_async_logout_sp_done; |
258 | rval = qla2x00_start_sp(sp); | 204 | rval = qla2x00_start_sp(sp); |
259 | if (rval != QLA_SUCCESS) | 205 | if (rval != QLA_SUCCESS) |
260 | goto done_free_sp; | 206 | goto done_free_sp; |
@@ -266,20 +212,22 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport) | |||
266 | return rval; | 212 | return rval; |
267 | 213 | ||
268 | done_free_sp: | 214 | done_free_sp: |
269 | lio->free(sp); | 215 | sp->free(fcport->vha, sp); |
270 | done: | 216 | done: |
271 | return rval; | 217 | return rval; |
272 | } | 218 | } |
273 | 219 | ||
274 | static void | 220 | static void |
275 | qla2x00_async_adisc_ctx_done(srb_t *sp) | 221 | qla2x00_async_adisc_sp_done(void *data, void *ptr, int res) |
276 | { | 222 | { |
277 | struct srb_ctx *ctx = sp->ctx; | 223 | srb_t *sp = (srb_t *)ptr; |
278 | struct srb_iocb *lio = ctx->u.iocb_cmd; | 224 | struct srb_iocb *lio = &sp->u.iocb_cmd; |
279 | 225 | struct scsi_qla_host *vha = (scsi_qla_host_t *)data; | |
280 | qla2x00_post_async_adisc_done_work(sp->fcport->vha, sp->fcport, | 226 | |
281 | lio->u.logio.data); | 227 | if (!test_bit(UNLOADING, &vha->dpc_flags)) |
282 | lio->free(sp); | 228 | qla2x00_post_async_adisc_done_work(sp->fcport->vha, sp->fcport, |
229 | lio->u.logio.data); | ||
230 | sp->free(sp->fcport->vha, sp); | ||
283 | } | 231 | } |
284 | 232 | ||
285 | int | 233 | int |
@@ -287,22 +235,21 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport, | |||
287 | uint16_t *data) | 235 | uint16_t *data) |
288 | { | 236 | { |
289 | srb_t *sp; | 237 | srb_t *sp; |
290 | struct srb_ctx *ctx; | ||
291 | struct srb_iocb *lio; | 238 | struct srb_iocb *lio; |
292 | int rval; | 239 | int rval; |
293 | 240 | ||
294 | rval = QLA_FUNCTION_FAILED; | 241 | rval = QLA_FUNCTION_FAILED; |
295 | sp = qla2x00_get_ctx_sp(vha, fcport, sizeof(struct srb_ctx), | 242 | sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); |
296 | qla2x00_get_async_timeout(vha) + 2); | ||
297 | if (!sp) | 243 | if (!sp) |
298 | goto done; | 244 | goto done; |
299 | 245 | ||
300 | ctx = sp->ctx; | 246 | sp->type = SRB_ADISC_CMD; |
301 | ctx->type = SRB_ADISC_CMD; | 247 | sp->name = "adisc"; |
302 | ctx->name = "adisc"; | 248 | qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); |
303 | lio = ctx->u.iocb_cmd; | 249 | |
250 | lio = &sp->u.iocb_cmd; | ||
304 | lio->timeout = qla2x00_async_iocb_timeout; | 251 | lio->timeout = qla2x00_async_iocb_timeout; |
305 | lio->done = qla2x00_async_adisc_ctx_done; | 252 | sp->done = qla2x00_async_adisc_sp_done; |
306 | if (data[1] & QLA_LOGIO_LOGIN_RETRIED) | 253 | if (data[1] & QLA_LOGIO_LOGIN_RETRIED) |
307 | lio->u.logio.flags |= SRB_LOGIN_RETRIED; | 254 | lio->u.logio.flags |= SRB_LOGIN_RETRIED; |
308 | rval = qla2x00_start_sp(sp); | 255 | rval = qla2x00_start_sp(sp); |
@@ -316,46 +263,62 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport, | |||
316 | return rval; | 263 | return rval; |
317 | 264 | ||
318 | done_free_sp: | 265 | done_free_sp: |
319 | lio->free(sp); | 266 | sp->free(fcport->vha, sp); |
320 | done: | 267 | done: |
321 | return rval; | 268 | return rval; |
322 | } | 269 | } |
323 | 270 | ||
324 | static void | 271 | static void |
325 | qla2x00_async_tm_cmd_ctx_done(srb_t *sp) | 272 | qla2x00_async_tm_cmd_done(void *data, void *ptr, int res) |
326 | { | 273 | { |
327 | struct srb_ctx *ctx = sp->ctx; | 274 | srb_t *sp = (srb_t *)ptr; |
328 | struct srb_iocb *iocb = (struct srb_iocb *)ctx->u.iocb_cmd; | 275 | struct srb_iocb *iocb = &sp->u.iocb_cmd; |
276 | struct scsi_qla_host *vha = (scsi_qla_host_t *)data; | ||
277 | uint32_t flags; | ||
278 | uint16_t lun; | ||
279 | int rval; | ||
280 | |||
281 | if (!test_bit(UNLOADING, &vha->dpc_flags)) { | ||
282 | flags = iocb->u.tmf.flags; | ||
283 | lun = (uint16_t)iocb->u.tmf.lun; | ||
284 | |||
285 | /* Issue Marker IOCB */ | ||
286 | rval = qla2x00_marker(vha, vha->hw->req_q_map[0], | ||
287 | vha->hw->rsp_q_map[0], sp->fcport->loop_id, lun, | ||
288 | flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID); | ||
329 | 289 | ||
330 | qla2x00_async_tm_cmd_done(sp->fcport->vha, sp->fcport, iocb); | 290 | if ((rval != QLA_SUCCESS) || iocb->u.tmf.data) { |
331 | iocb->free(sp); | 291 | ql_dbg(ql_dbg_taskm, vha, 0x8030, |
292 | "TM IOCB failed (%x).\n", rval); | ||
293 | } | ||
294 | } | ||
295 | sp->free(sp->fcport->vha, sp); | ||
332 | } | 296 | } |
333 | 297 | ||
334 | int | 298 | int |
335 | qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun, | 299 | qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t tm_flags, uint32_t lun, |
336 | uint32_t tag) | 300 | uint32_t tag) |
337 | { | 301 | { |
338 | struct scsi_qla_host *vha = fcport->vha; | 302 | struct scsi_qla_host *vha = fcport->vha; |
339 | srb_t *sp; | 303 | srb_t *sp; |
340 | struct srb_ctx *ctx; | ||
341 | struct srb_iocb *tcf; | 304 | struct srb_iocb *tcf; |
342 | int rval; | 305 | int rval; |
343 | 306 | ||
344 | rval = QLA_FUNCTION_FAILED; | 307 | rval = QLA_FUNCTION_FAILED; |
345 | sp = qla2x00_get_ctx_sp(vha, fcport, sizeof(struct srb_ctx), | 308 | sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); |
346 | qla2x00_get_async_timeout(vha) + 2); | ||
347 | if (!sp) | 309 | if (!sp) |
348 | goto done; | 310 | goto done; |
349 | 311 | ||
350 | ctx = sp->ctx; | 312 | sp->type = SRB_TM_CMD; |
351 | ctx->type = SRB_TM_CMD; | 313 | sp->name = "tmf"; |
352 | ctx->name = "tmf"; | 314 | qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); |
353 | tcf = ctx->u.iocb_cmd; | 315 | |
354 | tcf->u.tmf.flags = flags; | 316 | tcf = &sp->u.iocb_cmd; |
317 | tcf->u.tmf.flags = tm_flags; | ||
355 | tcf->u.tmf.lun = lun; | 318 | tcf->u.tmf.lun = lun; |
356 | tcf->u.tmf.data = tag; | 319 | tcf->u.tmf.data = tag; |
357 | tcf->timeout = qla2x00_async_iocb_timeout; | 320 | tcf->timeout = qla2x00_async_iocb_timeout; |
358 | tcf->done = qla2x00_async_tm_cmd_ctx_done; | 321 | sp->done = qla2x00_async_tm_cmd_done; |
359 | 322 | ||
360 | rval = qla2x00_start_sp(sp); | 323 | rval = qla2x00_start_sp(sp); |
361 | if (rval != QLA_SUCCESS) | 324 | if (rval != QLA_SUCCESS) |
@@ -368,7 +331,7 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun, | |||
368 | return rval; | 331 | return rval; |
369 | 332 | ||
370 | done_free_sp: | 333 | done_free_sp: |
371 | tcf->free(sp); | 334 | sp->free(fcport->vha, sp); |
372 | done: | 335 | done: |
373 | return rval; | 336 | return rval; |
374 | } | 337 | } |
@@ -387,6 +350,13 @@ qla2x00_async_login_done(struct scsi_qla_host *vha, fc_port_t *fcport, | |||
387 | * requests. | 350 | * requests. |
388 | */ | 351 | */ |
389 | rval = qla2x00_get_port_database(vha, fcport, 0); | 352 | rval = qla2x00_get_port_database(vha, fcport, 0); |
353 | if (rval == QLA_NOT_LOGGED_IN) { | ||
354 | fcport->flags &= ~FCF_ASYNC_SENT; | ||
355 | fcport->flags |= FCF_LOGIN_NEEDED; | ||
356 | set_bit(RELOGIN_NEEDED, &vha->dpc_flags); | ||
357 | break; | ||
358 | } | ||
359 | |||
390 | if (rval != QLA_SUCCESS) { | 360 | if (rval != QLA_SUCCESS) { |
391 | qla2x00_post_async_logout_work(vha, fcport, NULL); | 361 | qla2x00_post_async_logout_work(vha, fcport, NULL); |
392 | qla2x00_post_async_login_work(vha, fcport, NULL); | 362 | qla2x00_post_async_login_work(vha, fcport, NULL); |
@@ -452,30 +422,6 @@ qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport, | |||
452 | return; | 422 | return; |
453 | } | 423 | } |
454 | 424 | ||
455 | void | ||
456 | qla2x00_async_tm_cmd_done(struct scsi_qla_host *vha, fc_port_t *fcport, | ||
457 | struct srb_iocb *iocb) | ||
458 | { | ||
459 | int rval; | ||
460 | uint32_t flags; | ||
461 | uint16_t lun; | ||
462 | |||
463 | flags = iocb->u.tmf.flags; | ||
464 | lun = (uint16_t)iocb->u.tmf.lun; | ||
465 | |||
466 | /* Issue Marker IOCB */ | ||
467 | rval = qla2x00_marker(vha, vha->hw->req_q_map[0], | ||
468 | vha->hw->rsp_q_map[0], fcport->loop_id, lun, | ||
469 | flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID); | ||
470 | |||
471 | if ((rval != QLA_SUCCESS) || iocb->u.tmf.data) { | ||
472 | ql_dbg(ql_dbg_taskm, vha, 0x8030, | ||
473 | "TM IOCB failed (%x).\n", rval); | ||
474 | } | ||
475 | |||
476 | return; | ||
477 | } | ||
478 | |||
479 | /****************************************************************************/ | 425 | /****************************************************************************/ |
480 | /* QLogic ISP2x00 Hardware Support Functions. */ | 426 | /* QLogic ISP2x00 Hardware Support Functions. */ |
481 | /****************************************************************************/ | 427 | /****************************************************************************/ |
@@ -969,6 +915,9 @@ qla81xx_reset_mpi(scsi_qla_host_t *vha) | |||
969 | { | 915 | { |
970 | uint16_t mb[4] = {0x1010, 0, 1, 0}; | 916 | uint16_t mb[4] = {0x1010, 0, 1, 0}; |
971 | 917 | ||
918 | if (!IS_QLA81XX(vha->hw)) | ||
919 | return QLA_SUCCESS; | ||
920 | |||
972 | return qla81xx_write_mpi_register(vha, mb); | 921 | return qla81xx_write_mpi_register(vha, mb); |
973 | } | 922 | } |
974 | 923 | ||
@@ -1262,7 +1211,9 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha) | |||
1262 | mem_size = (ha->fw_memory_size - 0x11000 + 1) * | 1211 | mem_size = (ha->fw_memory_size - 0x11000 + 1) * |
1263 | sizeof(uint16_t); | 1212 | sizeof(uint16_t); |
1264 | } else if (IS_FWI2_CAPABLE(ha)) { | 1213 | } else if (IS_FWI2_CAPABLE(ha)) { |
1265 | if (IS_QLA81XX(ha)) | 1214 | if (IS_QLA83XX(ha)) |
1215 | fixed_size = offsetof(struct qla83xx_fw_dump, ext_mem); | ||
1216 | else if (IS_QLA81XX(ha)) | ||
1266 | fixed_size = offsetof(struct qla81xx_fw_dump, ext_mem); | 1217 | fixed_size = offsetof(struct qla81xx_fw_dump, ext_mem); |
1267 | else if (IS_QLA25XX(ha)) | 1218 | else if (IS_QLA25XX(ha)) |
1268 | fixed_size = offsetof(struct qla25xx_fw_dump, ext_mem); | 1219 | fixed_size = offsetof(struct qla25xx_fw_dump, ext_mem); |
@@ -1270,10 +1221,20 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha) | |||
1270 | fixed_size = offsetof(struct qla24xx_fw_dump, ext_mem); | 1221 | fixed_size = offsetof(struct qla24xx_fw_dump, ext_mem); |
1271 | mem_size = (ha->fw_memory_size - 0x100000 + 1) * | 1222 | mem_size = (ha->fw_memory_size - 0x100000 + 1) * |
1272 | sizeof(uint32_t); | 1223 | sizeof(uint32_t); |
1273 | if (ha->mqenable) | 1224 | if (ha->mqenable) { |
1274 | mq_size = sizeof(struct qla2xxx_mq_chain); | 1225 | if (!IS_QLA83XX(ha)) |
1226 | mq_size = sizeof(struct qla2xxx_mq_chain); | ||
1227 | /* | ||
1228 | * Allocate maximum buffer size for all queues. | ||
1229 | * Resizing must be done at end-of-dump processing. | ||
1230 | */ | ||
1231 | mq_size += ha->max_req_queues * | ||
1232 | (req->length * sizeof(request_t)); | ||
1233 | mq_size += ha->max_rsp_queues * | ||
1234 | (rsp->length * sizeof(response_t)); | ||
1235 | } | ||
1275 | /* Allocate memory for Fibre Channel Event Buffer. */ | 1236 | /* Allocate memory for Fibre Channel Event Buffer. */ |
1276 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) | 1237 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha)) |
1277 | goto try_eft; | 1238 | goto try_eft; |
1278 | 1239 | ||
1279 | tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma, | 1240 | tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma, |
@@ -1484,17 +1445,8 @@ enable_82xx_npiv: | |||
1484 | fw_major_version = ha->fw_major_version; | 1445 | fw_major_version = ha->fw_major_version; |
1485 | if (IS_QLA82XX(ha)) | 1446 | if (IS_QLA82XX(ha)) |
1486 | qla82xx_check_md_needed(vha); | 1447 | qla82xx_check_md_needed(vha); |
1487 | else { | 1448 | else |
1488 | rval = qla2x00_get_fw_version(vha, | 1449 | rval = qla2x00_get_fw_version(vha); |
1489 | &ha->fw_major_version, | ||
1490 | &ha->fw_minor_version, | ||
1491 | &ha->fw_subminor_version, | ||
1492 | &ha->fw_attributes, | ||
1493 | &ha->fw_memory_size, | ||
1494 | ha->mpi_version, | ||
1495 | &ha->mpi_capabilities, | ||
1496 | ha->phy_version); | ||
1497 | } | ||
1498 | if (rval != QLA_SUCCESS) | 1450 | if (rval != QLA_SUCCESS) |
1499 | goto failed; | 1451 | goto failed; |
1500 | ha->flags.npiv_supported = 0; | 1452 | ha->flags.npiv_supported = 0; |
@@ -1535,6 +1487,9 @@ enable_82xx_npiv: | |||
1535 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1487 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1536 | } | 1488 | } |
1537 | 1489 | ||
1490 | if (IS_QLA83XX(ha)) | ||
1491 | goto skip_fac_check; | ||
1492 | |||
1538 | if (rval == QLA_SUCCESS && IS_FAC_REQUIRED(ha)) { | 1493 | if (rval == QLA_SUCCESS && IS_FAC_REQUIRED(ha)) { |
1539 | uint32_t size; | 1494 | uint32_t size; |
1540 | 1495 | ||
@@ -1547,6 +1502,11 @@ enable_82xx_npiv: | |||
1547 | "Unsupported FAC firmware (%d.%02d.%02d).\n", | 1502 | "Unsupported FAC firmware (%d.%02d.%02d).\n", |
1548 | ha->fw_major_version, ha->fw_minor_version, | 1503 | ha->fw_major_version, ha->fw_minor_version, |
1549 | ha->fw_subminor_version); | 1504 | ha->fw_subminor_version); |
1505 | skip_fac_check: | ||
1506 | if (IS_QLA83XX(ha)) { | ||
1507 | ha->flags.fac_supported = 0; | ||
1508 | rval = QLA_SUCCESS; | ||
1509 | } | ||
1550 | } | 1510 | } |
1551 | } | 1511 | } |
1552 | failed: | 1512 | failed: |
@@ -1725,7 +1685,7 @@ qla24xx_config_rings(struct scsi_qla_host *vha) | |||
1725 | struct req_que *req = ha->req_q_map[0]; | 1685 | struct req_que *req = ha->req_q_map[0]; |
1726 | struct rsp_que *rsp = ha->rsp_q_map[0]; | 1686 | struct rsp_que *rsp = ha->rsp_q_map[0]; |
1727 | 1687 | ||
1728 | /* Setup ring parameters in initialization control block. */ | 1688 | /* Setup ring parameters in initialization control block. */ |
1729 | icb = (struct init_cb_24xx *)ha->init_cb; | 1689 | icb = (struct init_cb_24xx *)ha->init_cb; |
1730 | icb->request_q_outpointer = __constant_cpu_to_le16(0); | 1690 | icb->request_q_outpointer = __constant_cpu_to_le16(0); |
1731 | icb->response_q_inpointer = __constant_cpu_to_le16(0); | 1691 | icb->response_q_inpointer = __constant_cpu_to_le16(0); |
@@ -1736,7 +1696,7 @@ qla24xx_config_rings(struct scsi_qla_host *vha) | |||
1736 | icb->response_q_address[0] = cpu_to_le32(LSD(rsp->dma)); | 1696 | icb->response_q_address[0] = cpu_to_le32(LSD(rsp->dma)); |
1737 | icb->response_q_address[1] = cpu_to_le32(MSD(rsp->dma)); | 1697 | icb->response_q_address[1] = cpu_to_le32(MSD(rsp->dma)); |
1738 | 1698 | ||
1739 | if (ha->mqenable) { | 1699 | if (ha->mqenable || IS_QLA83XX(ha)) { |
1740 | icb->qos = __constant_cpu_to_le16(QLA_DEFAULT_QUE_QOS); | 1700 | icb->qos = __constant_cpu_to_le16(QLA_DEFAULT_QUE_QOS); |
1741 | icb->rid = __constant_cpu_to_le16(rid); | 1701 | icb->rid = __constant_cpu_to_le16(rid); |
1742 | if (ha->flags.msix_enabled) { | 1702 | if (ha->flags.msix_enabled) { |
@@ -1756,7 +1716,8 @@ qla24xx_config_rings(struct scsi_qla_host *vha) | |||
1756 | __constant_cpu_to_le32(BIT_18); | 1716 | __constant_cpu_to_le32(BIT_18); |
1757 | 1717 | ||
1758 | /* Use Disable MSIX Handshake mode for capable adapters */ | 1718 | /* Use Disable MSIX Handshake mode for capable adapters */ |
1759 | if (IS_MSIX_NACK_CAPABLE(ha)) { | 1719 | if ((ha->fw_attributes & BIT_6) && (IS_MSIX_NACK_CAPABLE(ha)) && |
1720 | (ha->flags.msix_enabled)) { | ||
1760 | icb->firmware_options_2 &= | 1721 | icb->firmware_options_2 &= |
1761 | __constant_cpu_to_le32(~BIT_22); | 1722 | __constant_cpu_to_le32(~BIT_22); |
1762 | ha->flags.disable_msix_handshake = 1; | 1723 | ha->flags.disable_msix_handshake = 1; |
@@ -1800,7 +1761,6 @@ qla2x00_init_rings(scsi_qla_host_t *vha) | |||
1800 | struct qla_hw_data *ha = vha->hw; | 1761 | struct qla_hw_data *ha = vha->hw; |
1801 | struct req_que *req; | 1762 | struct req_que *req; |
1802 | struct rsp_que *rsp; | 1763 | struct rsp_que *rsp; |
1803 | struct scsi_qla_host *vp; | ||
1804 | struct mid_init_cb_24xx *mid_init_cb = | 1764 | struct mid_init_cb_24xx *mid_init_cb = |
1805 | (struct mid_init_cb_24xx *) ha->init_cb; | 1765 | (struct mid_init_cb_24xx *) ha->init_cb; |
1806 | 1766 | ||
@@ -1831,11 +1791,6 @@ qla2x00_init_rings(scsi_qla_host_t *vha) | |||
1831 | } | 1791 | } |
1832 | 1792 | ||
1833 | spin_lock(&ha->vport_slock); | 1793 | spin_lock(&ha->vport_slock); |
1834 | /* Clear RSCN queue. */ | ||
1835 | list_for_each_entry(vp, &ha->vp_list, list) { | ||
1836 | vp->rscn_in_ptr = 0; | ||
1837 | vp->rscn_out_ptr = 0; | ||
1838 | } | ||
1839 | 1794 | ||
1840 | spin_unlock(&ha->vport_slock); | 1795 | spin_unlock(&ha->vport_slock); |
1841 | 1796 | ||
@@ -2028,7 +1983,7 @@ qla2x00_configure_hba(scsi_qla_host_t *vha) | |||
2028 | &loop_id, &al_pa, &area, &domain, &topo, &sw_cap); | 1983 | &loop_id, &al_pa, &area, &domain, &topo, &sw_cap); |
2029 | if (rval != QLA_SUCCESS) { | 1984 | if (rval != QLA_SUCCESS) { |
2030 | if (LOOP_TRANSITION(vha) || atomic_read(&ha->loop_down_timer) || | 1985 | if (LOOP_TRANSITION(vha) || atomic_read(&ha->loop_down_timer) || |
2031 | IS_QLA8XXX_TYPE(ha) || | 1986 | IS_CNA_CAPABLE(ha) || |
2032 | (rval == QLA_COMMAND_ERROR && loop_id == 0x7)) { | 1987 | (rval == QLA_COMMAND_ERROR && loop_id == 0x7)) { |
2033 | ql_dbg(ql_dbg_disc, vha, 0x2008, | 1988 | ql_dbg(ql_dbg_disc, vha, 0x2008, |
2034 | "Loop is in a transition state.\n"); | 1989 | "Loop is in a transition state.\n"); |
@@ -2120,7 +2075,7 @@ qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len, | |||
2120 | uint16_t index; | 2075 | uint16_t index; |
2121 | struct qla_hw_data *ha = vha->hw; | 2076 | struct qla_hw_data *ha = vha->hw; |
2122 | int use_tbl = !IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && | 2077 | int use_tbl = !IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && |
2123 | !IS_QLA8XXX_TYPE(ha); | 2078 | !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha); |
2124 | 2079 | ||
2125 | if (memcmp(model, BINZERO, len) != 0) { | 2080 | if (memcmp(model, BINZERO, len) != 0) { |
2126 | strncpy(ha->model_number, model, len); | 2081 | strncpy(ha->model_number, model, len); |
@@ -2596,13 +2551,11 @@ qla2x00_configure_loop(scsi_qla_host_t *vha) | |||
2596 | if (ha->current_topology == ISP_CFG_FL && | 2551 | if (ha->current_topology == ISP_CFG_FL && |
2597 | (test_bit(LOCAL_LOOP_UPDATE, &flags))) { | 2552 | (test_bit(LOCAL_LOOP_UPDATE, &flags))) { |
2598 | 2553 | ||
2599 | vha->flags.rscn_queue_overflow = 1; | ||
2600 | set_bit(RSCN_UPDATE, &flags); | 2554 | set_bit(RSCN_UPDATE, &flags); |
2601 | 2555 | ||
2602 | } else if (ha->current_topology == ISP_CFG_F && | 2556 | } else if (ha->current_topology == ISP_CFG_F && |
2603 | (test_bit(LOCAL_LOOP_UPDATE, &flags))) { | 2557 | (test_bit(LOCAL_LOOP_UPDATE, &flags))) { |
2604 | 2558 | ||
2605 | vha->flags.rscn_queue_overflow = 1; | ||
2606 | set_bit(RSCN_UPDATE, &flags); | 2559 | set_bit(RSCN_UPDATE, &flags); |
2607 | clear_bit(LOCAL_LOOP_UPDATE, &flags); | 2560 | clear_bit(LOCAL_LOOP_UPDATE, &flags); |
2608 | 2561 | ||
@@ -2612,7 +2565,6 @@ qla2x00_configure_loop(scsi_qla_host_t *vha) | |||
2612 | } else if (!vha->flags.online || | 2565 | } else if (!vha->flags.online || |
2613 | (test_bit(ABORT_ISP_ACTIVE, &flags))) { | 2566 | (test_bit(ABORT_ISP_ACTIVE, &flags))) { |
2614 | 2567 | ||
2615 | vha->flags.rscn_queue_overflow = 1; | ||
2616 | set_bit(RSCN_UPDATE, &flags); | 2568 | set_bit(RSCN_UPDATE, &flags); |
2617 | set_bit(LOCAL_LOOP_UPDATE, &flags); | 2569 | set_bit(LOCAL_LOOP_UPDATE, &flags); |
2618 | } | 2570 | } |
@@ -2622,8 +2574,7 @@ qla2x00_configure_loop(scsi_qla_host_t *vha) | |||
2622 | ql_dbg(ql_dbg_disc, vha, 0x2015, | 2574 | ql_dbg(ql_dbg_disc, vha, 0x2015, |
2623 | "Loop resync needed, failing.\n"); | 2575 | "Loop resync needed, failing.\n"); |
2624 | rval = QLA_FUNCTION_FAILED; | 2576 | rval = QLA_FUNCTION_FAILED; |
2625 | } | 2577 | } else |
2626 | else | ||
2627 | rval = qla2x00_configure_local_loop(vha); | 2578 | rval = qla2x00_configure_local_loop(vha); |
2628 | } | 2579 | } |
2629 | 2580 | ||
@@ -2662,8 +2613,6 @@ qla2x00_configure_loop(scsi_qla_host_t *vha) | |||
2662 | set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); | 2613 | set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); |
2663 | if (test_bit(RSCN_UPDATE, &save_flags)) { | 2614 | if (test_bit(RSCN_UPDATE, &save_flags)) { |
2664 | set_bit(RSCN_UPDATE, &vha->dpc_flags); | 2615 | set_bit(RSCN_UPDATE, &vha->dpc_flags); |
2665 | if (!IS_ALOGIO_CAPABLE(ha)) | ||
2666 | vha->flags.rscn_queue_overflow = 1; | ||
2667 | } | 2616 | } |
2668 | } | 2617 | } |
2669 | 2618 | ||
@@ -2699,7 +2648,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha) | |||
2699 | 2648 | ||
2700 | found_devs = 0; | 2649 | found_devs = 0; |
2701 | new_fcport = NULL; | 2650 | new_fcport = NULL; |
2702 | entries = MAX_FIBRE_DEVICES; | 2651 | entries = MAX_FIBRE_DEVICES_LOOP; |
2703 | 2652 | ||
2704 | ql_dbg(ql_dbg_disc, vha, 0x2016, | 2653 | ql_dbg(ql_dbg_disc, vha, 0x2016, |
2705 | "Getting FCAL position map.\n"); | 2654 | "Getting FCAL position map.\n"); |
@@ -2707,7 +2656,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha) | |||
2707 | qla2x00_get_fcal_position_map(vha, NULL); | 2656 | qla2x00_get_fcal_position_map(vha, NULL); |
2708 | 2657 | ||
2709 | /* Get list of logged in devices. */ | 2658 | /* Get list of logged in devices. */ |
2710 | memset(ha->gid_list, 0, GID_LIST_SIZE); | 2659 | memset(ha->gid_list, 0, qla2x00_gid_list_size(ha)); |
2711 | rval = qla2x00_get_id_list(vha, ha->gid_list, ha->gid_list_dma, | 2660 | rval = qla2x00_get_id_list(vha, ha->gid_list, ha->gid_list_dma, |
2712 | &entries); | 2661 | &entries); |
2713 | if (rval != QLA_SUCCESS) | 2662 | if (rval != QLA_SUCCESS) |
@@ -2971,7 +2920,7 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport) | |||
2971 | static int | 2920 | static int |
2972 | qla2x00_configure_fabric(scsi_qla_host_t *vha) | 2921 | qla2x00_configure_fabric(scsi_qla_host_t *vha) |
2973 | { | 2922 | { |
2974 | int rval, rval2; | 2923 | int rval; |
2975 | fc_port_t *fcport, *fcptemp; | 2924 | fc_port_t *fcport, *fcptemp; |
2976 | uint16_t next_loopid; | 2925 | uint16_t next_loopid; |
2977 | uint16_t mb[MAILBOX_REGISTER_COUNT]; | 2926 | uint16_t mb[MAILBOX_REGISTER_COUNT]; |
@@ -2995,12 +2944,6 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha) | |||
2995 | } | 2944 | } |
2996 | vha->device_flags |= SWITCH_FOUND; | 2945 | vha->device_flags |= SWITCH_FOUND; |
2997 | 2946 | ||
2998 | /* Mark devices that need re-synchronization. */ | ||
2999 | rval2 = qla2x00_device_resync(vha); | ||
3000 | if (rval2 == QLA_RSCNS_HANDLED) { | ||
3001 | /* No point doing the scan, just continue. */ | ||
3002 | return (QLA_SUCCESS); | ||
3003 | } | ||
3004 | do { | 2947 | do { |
3005 | /* FDMI support. */ | 2948 | /* FDMI support. */ |
3006 | if (ql2xfdmienable && | 2949 | if (ql2xfdmienable && |
@@ -3012,8 +2955,12 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha) | |||
3012 | loop_id = NPH_SNS; | 2955 | loop_id = NPH_SNS; |
3013 | else | 2956 | else |
3014 | loop_id = SIMPLE_NAME_SERVER; | 2957 | loop_id = SIMPLE_NAME_SERVER; |
3015 | ha->isp_ops->fabric_login(vha, loop_id, 0xff, 0xff, | 2958 | rval = ha->isp_ops->fabric_login(vha, loop_id, 0xff, 0xff, |
3016 | 0xfc, mb, BIT_1 | BIT_0); | 2959 | 0xfc, mb, BIT_1|BIT_0); |
2960 | if (rval != QLA_SUCCESS) { | ||
2961 | set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); | ||
2962 | return rval; | ||
2963 | } | ||
3017 | if (mb[0] != MBS_COMMAND_COMPLETE) { | 2964 | if (mb[0] != MBS_COMMAND_COMPLETE) { |
3018 | ql_dbg(ql_dbg_disc, vha, 0x2042, | 2965 | ql_dbg(ql_dbg_disc, vha, 0x2042, |
3019 | "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x " | 2966 | "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x " |
@@ -3044,6 +2991,13 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha) | |||
3044 | } | 2991 | } |
3045 | } | 2992 | } |
3046 | 2993 | ||
2994 | #define QLA_FCPORT_SCAN 1 | ||
2995 | #define QLA_FCPORT_FOUND 2 | ||
2996 | |||
2997 | list_for_each_entry(fcport, &vha->vp_fcports, list) { | ||
2998 | fcport->scan_state = QLA_FCPORT_SCAN; | ||
2999 | } | ||
3000 | |||
3047 | rval = qla2x00_find_all_fabric_devs(vha, &new_fcports); | 3001 | rval = qla2x00_find_all_fabric_devs(vha, &new_fcports); |
3048 | if (rval != QLA_SUCCESS) | 3002 | if (rval != QLA_SUCCESS) |
3049 | break; | 3003 | break; |
@@ -3059,7 +3013,8 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha) | |||
3059 | if ((fcport->flags & FCF_FABRIC_DEVICE) == 0) | 3013 | if ((fcport->flags & FCF_FABRIC_DEVICE) == 0) |
3060 | continue; | 3014 | continue; |
3061 | 3015 | ||
3062 | if (atomic_read(&fcport->state) == FCS_DEVICE_LOST) { | 3016 | if (fcport->scan_state == QLA_FCPORT_SCAN && |
3017 | atomic_read(&fcport->state) == FCS_ONLINE) { | ||
3063 | qla2x00_mark_device_lost(vha, fcport, | 3018 | qla2x00_mark_device_lost(vha, fcport, |
3064 | ql2xplogiabsentdevice, 0); | 3019 | ql2xplogiabsentdevice, 0); |
3065 | if (fcport->loop_id != FC_NO_LOOP_ID && | 3020 | if (fcport->loop_id != FC_NO_LOOP_ID && |
@@ -3184,20 +3139,21 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
3184 | rval = QLA_SUCCESS; | 3139 | rval = QLA_SUCCESS; |
3185 | 3140 | ||
3186 | /* Try GID_PT to get device list, else GAN. */ | 3141 | /* Try GID_PT to get device list, else GAN. */ |
3187 | swl = kcalloc(MAX_FIBRE_DEVICES, sizeof(sw_info_t), GFP_KERNEL); | 3142 | if (!ha->swl) |
3143 | ha->swl = kcalloc(ha->max_fibre_devices, sizeof(sw_info_t), | ||
3144 | GFP_KERNEL); | ||
3145 | swl = ha->swl; | ||
3188 | if (!swl) { | 3146 | if (!swl) { |
3189 | /*EMPTY*/ | 3147 | /*EMPTY*/ |
3190 | ql_dbg(ql_dbg_disc, vha, 0x2054, | 3148 | ql_dbg(ql_dbg_disc, vha, 0x2054, |
3191 | "GID_PT allocations failed, fallback on GA_NXT.\n"); | 3149 | "GID_PT allocations failed, fallback on GA_NXT.\n"); |
3192 | } else { | 3150 | } else { |
3151 | memset(swl, 0, ha->max_fibre_devices * sizeof(sw_info_t)); | ||
3193 | if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) { | 3152 | if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) { |
3194 | kfree(swl); | ||
3195 | swl = NULL; | 3153 | swl = NULL; |
3196 | } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) { | 3154 | } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) { |
3197 | kfree(swl); | ||
3198 | swl = NULL; | 3155 | swl = NULL; |
3199 | } else if (qla2x00_gnn_id(vha, swl) != QLA_SUCCESS) { | 3156 | } else if (qla2x00_gnn_id(vha, swl) != QLA_SUCCESS) { |
3200 | kfree(swl); | ||
3201 | swl = NULL; | 3157 | swl = NULL; |
3202 | } else if (ql2xiidmaenable && | 3158 | } else if (ql2xiidmaenable && |
3203 | qla2x00_gfpn_id(vha, swl) == QLA_SUCCESS) { | 3159 | qla2x00_gfpn_id(vha, swl) == QLA_SUCCESS) { |
@@ -3215,7 +3171,6 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
3215 | if (new_fcport == NULL) { | 3171 | if (new_fcport == NULL) { |
3216 | ql_log(ql_log_warn, vha, 0x205e, | 3172 | ql_log(ql_log_warn, vha, 0x205e, |
3217 | "Failed to allocate memory for fcport.\n"); | 3173 | "Failed to allocate memory for fcport.\n"); |
3218 | kfree(swl); | ||
3219 | return (QLA_MEMORY_ALLOC_FAILED); | 3174 | return (QLA_MEMORY_ALLOC_FAILED); |
3220 | } | 3175 | } |
3221 | new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED); | 3176 | new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED); |
@@ -3332,6 +3287,8 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
3332 | WWN_SIZE)) | 3287 | WWN_SIZE)) |
3333 | continue; | 3288 | continue; |
3334 | 3289 | ||
3290 | fcport->scan_state = QLA_FCPORT_FOUND; | ||
3291 | |||
3335 | found++; | 3292 | found++; |
3336 | 3293 | ||
3337 | /* Update port state. */ | 3294 | /* Update port state. */ |
@@ -3368,6 +3325,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
3368 | fcport->flags |= FCF_LOGIN_NEEDED; | 3325 | fcport->flags |= FCF_LOGIN_NEEDED; |
3369 | if (fcport->loop_id != FC_NO_LOOP_ID && | 3326 | if (fcport->loop_id != FC_NO_LOOP_ID && |
3370 | (fcport->flags & FCF_FCP2_DEVICE) == 0 && | 3327 | (fcport->flags & FCF_FCP2_DEVICE) == 0 && |
3328 | (fcport->flags & FCF_ASYNC_SENT) == 0 && | ||
3371 | fcport->port_type != FCT_INITIATOR && | 3329 | fcport->port_type != FCT_INITIATOR && |
3372 | fcport->port_type != FCT_BROADCAST) { | 3330 | fcport->port_type != FCT_BROADCAST) { |
3373 | ha->isp_ops->fabric_logout(vha, fcport->loop_id, | 3331 | ha->isp_ops->fabric_logout(vha, fcport->loop_id, |
@@ -3390,14 +3348,12 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
3390 | if (new_fcport == NULL) { | 3348 | if (new_fcport == NULL) { |
3391 | ql_log(ql_log_warn, vha, 0x2066, | 3349 | ql_log(ql_log_warn, vha, 0x2066, |
3392 | "Memory allocation failed for fcport.\n"); | 3350 | "Memory allocation failed for fcport.\n"); |
3393 | kfree(swl); | ||
3394 | return (QLA_MEMORY_ALLOC_FAILED); | 3351 | return (QLA_MEMORY_ALLOC_FAILED); |
3395 | } | 3352 | } |
3396 | new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED); | 3353 | new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED); |
3397 | new_fcport->d_id.b24 = nxt_d_id.b24; | 3354 | new_fcport->d_id.b24 = nxt_d_id.b24; |
3398 | } | 3355 | } |
3399 | 3356 | ||
3400 | kfree(swl); | ||
3401 | kfree(new_fcport); | 3357 | kfree(new_fcport); |
3402 | 3358 | ||
3403 | return (rval); | 3359 | return (rval); |
@@ -3470,6 +3426,9 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) | |||
3470 | 3426 | ||
3471 | /* If not in use then it is free to use. */ | 3427 | /* If not in use then it is free to use. */ |
3472 | if (!found) { | 3428 | if (!found) { |
3429 | ql_dbg(ql_dbg_disc, dev->vha, 0x2086, | ||
3430 | "Assigning new loopid=%x, portid=%x.\n", | ||
3431 | dev->loop_id, dev->d_id.b24); | ||
3473 | break; | 3432 | break; |
3474 | } | 3433 | } |
3475 | 3434 | ||
@@ -3488,110 +3447,6 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) | |||
3488 | } | 3447 | } |
3489 | 3448 | ||
3490 | /* | 3449 | /* |
3491 | * qla2x00_device_resync | ||
3492 | * Marks devices in the database that needs resynchronization. | ||
3493 | * | ||
3494 | * Input: | ||
3495 | * ha = adapter block pointer. | ||
3496 | * | ||
3497 | * Context: | ||
3498 | * Kernel context. | ||
3499 | */ | ||
3500 | static int | ||
3501 | qla2x00_device_resync(scsi_qla_host_t *vha) | ||
3502 | { | ||
3503 | int rval; | ||
3504 | uint32_t mask; | ||
3505 | fc_port_t *fcport; | ||
3506 | uint32_t rscn_entry; | ||
3507 | uint8_t rscn_out_iter; | ||
3508 | uint8_t format; | ||
3509 | port_id_t d_id = {}; | ||
3510 | |||
3511 | rval = QLA_RSCNS_HANDLED; | ||
3512 | |||
3513 | while (vha->rscn_out_ptr != vha->rscn_in_ptr || | ||
3514 | vha->flags.rscn_queue_overflow) { | ||
3515 | |||
3516 | rscn_entry = vha->rscn_queue[vha->rscn_out_ptr]; | ||
3517 | format = MSB(MSW(rscn_entry)); | ||
3518 | d_id.b.domain = LSB(MSW(rscn_entry)); | ||
3519 | d_id.b.area = MSB(LSW(rscn_entry)); | ||
3520 | d_id.b.al_pa = LSB(LSW(rscn_entry)); | ||
3521 | |||
3522 | ql_dbg(ql_dbg_disc, vha, 0x2020, | ||
3523 | "RSCN queue entry[%d] = [%02x/%02x%02x%02x].\n", | ||
3524 | vha->rscn_out_ptr, format, d_id.b.domain, d_id.b.area, | ||
3525 | d_id.b.al_pa); | ||
3526 | |||
3527 | vha->rscn_out_ptr++; | ||
3528 | if (vha->rscn_out_ptr == MAX_RSCN_COUNT) | ||
3529 | vha->rscn_out_ptr = 0; | ||
3530 | |||
3531 | /* Skip duplicate entries. */ | ||
3532 | for (rscn_out_iter = vha->rscn_out_ptr; | ||
3533 | !vha->flags.rscn_queue_overflow && | ||
3534 | rscn_out_iter != vha->rscn_in_ptr; | ||
3535 | rscn_out_iter = (rscn_out_iter == | ||
3536 | (MAX_RSCN_COUNT - 1)) ? 0: rscn_out_iter + 1) { | ||
3537 | |||
3538 | if (rscn_entry != vha->rscn_queue[rscn_out_iter]) | ||
3539 | break; | ||
3540 | |||
3541 | ql_dbg(ql_dbg_disc, vha, 0x2021, | ||
3542 | "Skipping duplicate RSCN queue entry found at " | ||
3543 | "[%d].\n", rscn_out_iter); | ||
3544 | |||
3545 | vha->rscn_out_ptr = rscn_out_iter; | ||
3546 | } | ||
3547 | |||
3548 | /* Queue overflow, set switch default case. */ | ||
3549 | if (vha->flags.rscn_queue_overflow) { | ||
3550 | ql_dbg(ql_dbg_disc, vha, 0x2022, | ||
3551 | "device_resync: rscn overflow.\n"); | ||
3552 | |||
3553 | format = 3; | ||
3554 | vha->flags.rscn_queue_overflow = 0; | ||
3555 | } | ||
3556 | |||
3557 | switch (format) { | ||
3558 | case 0: | ||
3559 | mask = 0xffffff; | ||
3560 | break; | ||
3561 | case 1: | ||
3562 | mask = 0xffff00; | ||
3563 | break; | ||
3564 | case 2: | ||
3565 | mask = 0xff0000; | ||
3566 | break; | ||
3567 | default: | ||
3568 | mask = 0x0; | ||
3569 | d_id.b24 = 0; | ||
3570 | vha->rscn_out_ptr = vha->rscn_in_ptr; | ||
3571 | break; | ||
3572 | } | ||
3573 | |||
3574 | rval = QLA_SUCCESS; | ||
3575 | |||
3576 | list_for_each_entry(fcport, &vha->vp_fcports, list) { | ||
3577 | if ((fcport->flags & FCF_FABRIC_DEVICE) == 0 || | ||
3578 | (fcport->d_id.b24 & mask) != d_id.b24 || | ||
3579 | fcport->port_type == FCT_BROADCAST) | ||
3580 | continue; | ||
3581 | |||
3582 | if (atomic_read(&fcport->state) == FCS_ONLINE) { | ||
3583 | if (format != 3 || | ||
3584 | fcport->port_type != FCT_INITIATOR) { | ||
3585 | qla2x00_mark_device_lost(vha, fcport, | ||
3586 | 0, 0); | ||
3587 | } | ||
3588 | } | ||
3589 | } | ||
3590 | } | ||
3591 | return (rval); | ||
3592 | } | ||
3593 | |||
3594 | /* | ||
3595 | * qla2x00_fabric_dev_login | 3450 | * qla2x00_fabric_dev_login |
3596 | * Login fabric target device and update FC port database. | 3451 | * Login fabric target device and update FC port database. |
3597 | * | 3452 | * |
@@ -3644,6 +3499,9 @@ qla2x00_fabric_dev_login(scsi_qla_host_t *vha, fc_port_t *fcport, | |||
3644 | } else { | 3499 | } else { |
3645 | qla2x00_update_fcport(vha, fcport); | 3500 | qla2x00_update_fcport(vha, fcport); |
3646 | } | 3501 | } |
3502 | } else { | ||
3503 | /* Retry Login. */ | ||
3504 | qla2x00_mark_device_lost(vha, fcport, 1, 0); | ||
3647 | } | 3505 | } |
3648 | 3506 | ||
3649 | return (rval); | 3507 | return (rval); |
@@ -3684,9 +3542,12 @@ qla2x00_fabric_login(scsi_qla_host_t *vha, fc_port_t *fcport, | |||
3684 | fcport->d_id.b.area, fcport->d_id.b.al_pa); | 3542 | fcport->d_id.b.area, fcport->d_id.b.al_pa); |
3685 | 3543 | ||
3686 | /* Login fcport on switch. */ | 3544 | /* Login fcport on switch. */ |
3687 | ha->isp_ops->fabric_login(vha, fcport->loop_id, | 3545 | rval = ha->isp_ops->fabric_login(vha, fcport->loop_id, |
3688 | fcport->d_id.b.domain, fcport->d_id.b.area, | 3546 | fcport->d_id.b.domain, fcport->d_id.b.area, |
3689 | fcport->d_id.b.al_pa, mb, BIT_0); | 3547 | fcport->d_id.b.al_pa, mb, BIT_0); |
3548 | if (rval != QLA_SUCCESS) { | ||
3549 | return rval; | ||
3550 | } | ||
3690 | if (mb[0] == MBS_PORT_ID_USED) { | 3551 | if (mb[0] == MBS_PORT_ID_USED) { |
3691 | /* | 3552 | /* |
3692 | * Device has another loop ID. The firmware team | 3553 | * Device has another loop ID. The firmware team |
@@ -4100,15 +3961,8 @@ qla2x00_abort_isp(scsi_qla_host_t *vha) | |||
4100 | ha->isp_abort_cnt = 0; | 3961 | ha->isp_abort_cnt = 0; |
4101 | clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags); | 3962 | clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags); |
4102 | 3963 | ||
4103 | if (IS_QLA81XX(ha)) | 3964 | if (IS_QLA81XX(ha) || IS_QLA8031(ha)) |
4104 | qla2x00_get_fw_version(vha, | 3965 | qla2x00_get_fw_version(vha); |
4105 | &ha->fw_major_version, | ||
4106 | &ha->fw_minor_version, | ||
4107 | &ha->fw_subminor_version, | ||
4108 | &ha->fw_attributes, &ha->fw_memory_size, | ||
4109 | ha->mpi_version, &ha->mpi_capabilities, | ||
4110 | ha->phy_version); | ||
4111 | |||
4112 | if (ha->fce) { | 3966 | if (ha->fce) { |
4113 | ha->flags.fce_enabled = 1; | 3967 | ha->flags.fce_enabled = 1; |
4114 | memset(ha->fce, 0, | 3968 | memset(ha->fce, 0, |
@@ -4974,7 +4828,6 @@ try_blob_fw: | |||
4974 | 4828 | ||
4975 | ql_log(ql_log_info, vha, 0x009a, "Update operational firmware.\n"); | 4829 | ql_log(ql_log_info, vha, 0x009a, "Update operational firmware.\n"); |
4976 | ha->flags.running_gold_fw = 1; | 4830 | ha->flags.running_gold_fw = 1; |
4977 | |||
4978 | return rval; | 4831 | return rval; |
4979 | } | 4832 | } |
4980 | 4833 | ||
@@ -5009,6 +4862,7 @@ int | |||
5009 | qla24xx_configure_vhba(scsi_qla_host_t *vha) | 4862 | qla24xx_configure_vhba(scsi_qla_host_t *vha) |
5010 | { | 4863 | { |
5011 | int rval = QLA_SUCCESS; | 4864 | int rval = QLA_SUCCESS; |
4865 | int rval2; | ||
5012 | uint16_t mb[MAILBOX_REGISTER_COUNT]; | 4866 | uint16_t mb[MAILBOX_REGISTER_COUNT]; |
5013 | struct qla_hw_data *ha = vha->hw; | 4867 | struct qla_hw_data *ha = vha->hw; |
5014 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); | 4868 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); |
@@ -5033,12 +4887,18 @@ qla24xx_configure_vhba(scsi_qla_host_t *vha) | |||
5033 | vha->flags.management_server_logged_in = 0; | 4887 | vha->flags.management_server_logged_in = 0; |
5034 | 4888 | ||
5035 | /* Login to SNS first */ | 4889 | /* Login to SNS first */ |
5036 | ha->isp_ops->fabric_login(vha, NPH_SNS, 0xff, 0xff, 0xfc, mb, BIT_1); | 4890 | rval2 = ha->isp_ops->fabric_login(vha, NPH_SNS, 0xff, 0xff, 0xfc, mb, |
5037 | if (mb[0] != MBS_COMMAND_COMPLETE) { | 4891 | BIT_1); |
5038 | ql_dbg(ql_dbg_init, vha, 0x0103, | 4892 | if (rval2 != QLA_SUCCESS || mb[0] != MBS_COMMAND_COMPLETE) { |
5039 | "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x " | 4893 | if (rval2 == QLA_MEMORY_ALLOC_FAILED) |
5040 | "mb[6]=%x mb[7]=%x.\n", | 4894 | ql_dbg(ql_dbg_init, vha, 0x0120, |
5041 | NPH_SNS, mb[0], mb[1], mb[2], mb[6], mb[7]); | 4895 | "Failed SNS login: loop_id=%x, rval2=%d\n", |
4896 | NPH_SNS, rval2); | ||
4897 | else | ||
4898 | ql_dbg(ql_dbg_init, vha, 0x0103, | ||
4899 | "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x " | ||
4900 | "mb[2]=%x mb[6]=%x mb[7]=%x.\n", | ||
4901 | NPH_SNS, mb[0], mb[1], mb[2], mb[6], mb[7]); | ||
5042 | return (QLA_FUNCTION_FAILED); | 4902 | return (QLA_FUNCTION_FAILED); |
5043 | } | 4903 | } |
5044 | 4904 | ||
@@ -5214,10 +5074,10 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) | |||
5214 | nv->reset_delay = 5; | 5074 | nv->reset_delay = 5; |
5215 | nv->max_luns_per_target = __constant_cpu_to_le16(128); | 5075 | nv->max_luns_per_target = __constant_cpu_to_le16(128); |
5216 | nv->port_down_retry_count = __constant_cpu_to_le16(30); | 5076 | nv->port_down_retry_count = __constant_cpu_to_le16(30); |
5217 | nv->link_down_timeout = __constant_cpu_to_le16(30); | 5077 | nv->link_down_timeout = __constant_cpu_to_le16(180); |
5218 | nv->enode_mac[0] = 0x00; | 5078 | nv->enode_mac[0] = 0x00; |
5219 | nv->enode_mac[1] = 0x02; | 5079 | nv->enode_mac[1] = 0xC0; |
5220 | nv->enode_mac[2] = 0x03; | 5080 | nv->enode_mac[2] = 0xDD; |
5221 | nv->enode_mac[3] = 0x04; | 5081 | nv->enode_mac[3] = 0x04; |
5222 | nv->enode_mac[4] = 0x05; | 5082 | nv->enode_mac[4] = 0x05; |
5223 | nv->enode_mac[5] = 0x06 + ha->port_no; | 5083 | nv->enode_mac[5] = 0x06 + ha->port_no; |
@@ -5248,9 +5108,9 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) | |||
5248 | memcpy(icb->enode_mac, nv->enode_mac, sizeof(icb->enode_mac)); | 5108 | memcpy(icb->enode_mac, nv->enode_mac, sizeof(icb->enode_mac)); |
5249 | /* Some boards (with valid NVRAMs) still have NULL enode_mac!! */ | 5109 | /* Some boards (with valid NVRAMs) still have NULL enode_mac!! */ |
5250 | if (!memcmp(icb->enode_mac, "\0\0\0\0\0\0", sizeof(icb->enode_mac))) { | 5110 | if (!memcmp(icb->enode_mac, "\0\0\0\0\0\0", sizeof(icb->enode_mac))) { |
5251 | icb->enode_mac[0] = 0x01; | 5111 | icb->enode_mac[0] = 0x00; |
5252 | icb->enode_mac[1] = 0x02; | 5112 | icb->enode_mac[1] = 0xC0; |
5253 | icb->enode_mac[2] = 0x03; | 5113 | icb->enode_mac[2] = 0xDD; |
5254 | icb->enode_mac[3] = 0x04; | 5114 | icb->enode_mac[3] = 0x04; |
5255 | icb->enode_mac[4] = 0x05; | 5115 | icb->enode_mac[4] = 0x05; |
5256 | icb->enode_mac[5] = 0x06 + ha->port_no; | 5116 | icb->enode_mac[5] = 0x06 + ha->port_no; |
@@ -5353,6 +5213,10 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) | |||
5353 | if (ql2xloginretrycount) | 5213 | if (ql2xloginretrycount) |
5354 | ha->login_retry_count = ql2xloginretrycount; | 5214 | ha->login_retry_count = ql2xloginretrycount; |
5355 | 5215 | ||
5216 | /* if not running MSI-X we need handshaking on interrupts */ | ||
5217 | if (!vha->hw->flags.msix_enabled && IS_QLA83XX(ha)) | ||
5218 | icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_22); | ||
5219 | |||
5356 | /* Enable ZIO. */ | 5220 | /* Enable ZIO. */ |
5357 | if (!vha->flags.init_done) { | 5221 | if (!vha->flags.init_done) { |
5358 | ha->zio_mode = le32_to_cpu(icb->firmware_options_2) & | 5222 | ha->zio_mode = le32_to_cpu(icb->firmware_options_2) & |
diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h index 7cc4f36cd53..6e457643c63 100644 --- a/drivers/scsi/qla2xxx/qla_inline.h +++ b/drivers/scsi/qla2xxx/qla_inline.h | |||
@@ -72,16 +72,19 @@ static inline void | |||
72 | qla2x00_clean_dsd_pool(struct qla_hw_data *ha, srb_t *sp) | 72 | qla2x00_clean_dsd_pool(struct qla_hw_data *ha, srb_t *sp) |
73 | { | 73 | { |
74 | struct dsd_dma *dsd_ptr, *tdsd_ptr; | 74 | struct dsd_dma *dsd_ptr, *tdsd_ptr; |
75 | struct crc_context *ctx; | ||
76 | |||
77 | ctx = (struct crc_context *)GET_CMD_CTX_SP(sp); | ||
75 | 78 | ||
76 | /* clean up allocated prev pool */ | 79 | /* clean up allocated prev pool */ |
77 | list_for_each_entry_safe(dsd_ptr, tdsd_ptr, | 80 | list_for_each_entry_safe(dsd_ptr, tdsd_ptr, |
78 | &((struct crc_context *)sp->ctx)->dsd_list, list) { | 81 | &ctx->dsd_list, list) { |
79 | dma_pool_free(ha->dl_dma_pool, dsd_ptr->dsd_addr, | 82 | dma_pool_free(ha->dl_dma_pool, dsd_ptr->dsd_addr, |
80 | dsd_ptr->dsd_list_dma); | 83 | dsd_ptr->dsd_list_dma); |
81 | list_del(&dsd_ptr->list); | 84 | list_del(&dsd_ptr->list); |
82 | kfree(dsd_ptr); | 85 | kfree(dsd_ptr); |
83 | } | 86 | } |
84 | INIT_LIST_HEAD(&((struct crc_context *)sp->ctx)->dsd_list); | 87 | INIT_LIST_HEAD(&ctx->dsd_list); |
85 | } | 88 | } |
86 | 89 | ||
87 | static inline void | 90 | static inline void |
@@ -113,8 +116,7 @@ qla2x00_hba_err_chk_enabled(srb_t *sp) | |||
113 | return 0; | 116 | return 0; |
114 | * | 117 | * |
115 | */ | 118 | */ |
116 | 119 | switch (scsi_get_prot_op(GET_CMD_SP(sp))) { | |
117 | switch (scsi_get_prot_op(sp->cmd)) { | ||
118 | case SCSI_PROT_READ_STRIP: | 120 | case SCSI_PROT_READ_STRIP: |
119 | case SCSI_PROT_WRITE_INSERT: | 121 | case SCSI_PROT_WRITE_INSERT: |
120 | if (ql2xenablehba_err_chk >= 1) | 122 | if (ql2xenablehba_err_chk >= 1) |
@@ -144,3 +146,44 @@ qla2x00_reset_active(scsi_qla_host_t *vha) | |||
144 | test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) || | 146 | test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) || |
145 | test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); | 147 | test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); |
146 | } | 148 | } |
149 | |||
150 | static inline srb_t * | ||
151 | qla2x00_get_sp(scsi_qla_host_t *vha, fc_port_t *fcport, gfp_t flag) | ||
152 | { | ||
153 | srb_t *sp = NULL; | ||
154 | struct qla_hw_data *ha = vha->hw; | ||
155 | uint8_t bail; | ||
156 | |||
157 | QLA_VHA_MARK_BUSY(vha, bail); | ||
158 | if (unlikely(bail)) | ||
159 | return NULL; | ||
160 | |||
161 | sp = mempool_alloc(ha->srb_mempool, flag); | ||
162 | if (!sp) | ||
163 | goto done; | ||
164 | |||
165 | memset(sp, 0, sizeof(*sp)); | ||
166 | sp->fcport = fcport; | ||
167 | sp->iocbs = 1; | ||
168 | done: | ||
169 | if (!sp) | ||
170 | QLA_VHA_MARK_NOT_BUSY(vha); | ||
171 | return sp; | ||
172 | } | ||
173 | |||
174 | static inline void | ||
175 | qla2x00_init_timer(srb_t *sp, unsigned long tmo) | ||
176 | { | ||
177 | init_timer(&sp->u.iocb_cmd.timer); | ||
178 | sp->u.iocb_cmd.timer.expires = jiffies + tmo * HZ; | ||
179 | sp->u.iocb_cmd.timer.data = (unsigned long)sp; | ||
180 | sp->u.iocb_cmd.timer.function = qla2x00_sp_timeout; | ||
181 | add_timer(&sp->u.iocb_cmd.timer); | ||
182 | sp->free = qla2x00_sp_free; | ||
183 | } | ||
184 | |||
185 | static inline int | ||
186 | qla2x00_gid_list_size(struct qla_hw_data *ha) | ||
187 | { | ||
188 | return sizeof(struct gid_list_info) * ha->max_fibre_devices; | ||
189 | } | ||
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index 55a96761b5a..eac95092449 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c | |||
@@ -22,18 +22,19 @@ static inline uint16_t | |||
22 | qla2x00_get_cmd_direction(srb_t *sp) | 22 | qla2x00_get_cmd_direction(srb_t *sp) |
23 | { | 23 | { |
24 | uint16_t cflags; | 24 | uint16_t cflags; |
25 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); | ||
25 | 26 | ||
26 | cflags = 0; | 27 | cflags = 0; |
27 | 28 | ||
28 | /* Set transfer direction */ | 29 | /* Set transfer direction */ |
29 | if (sp->cmd->sc_data_direction == DMA_TO_DEVICE) { | 30 | if (cmd->sc_data_direction == DMA_TO_DEVICE) { |
30 | cflags = CF_WRITE; | 31 | cflags = CF_WRITE; |
31 | sp->fcport->vha->hw->qla_stats.output_bytes += | 32 | sp->fcport->vha->hw->qla_stats.output_bytes += |
32 | scsi_bufflen(sp->cmd); | 33 | scsi_bufflen(cmd); |
33 | } else if (sp->cmd->sc_data_direction == DMA_FROM_DEVICE) { | 34 | } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { |
34 | cflags = CF_READ; | 35 | cflags = CF_READ; |
35 | sp->fcport->vha->hw->qla_stats.input_bytes += | 36 | sp->fcport->vha->hw->qla_stats.input_bytes += |
36 | scsi_bufflen(sp->cmd); | 37 | scsi_bufflen(cmd); |
37 | } | 38 | } |
38 | return (cflags); | 39 | return (cflags); |
39 | } | 40 | } |
@@ -143,12 +144,13 @@ qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha, struct req_que *req) | |||
143 | static inline int | 144 | static inline int |
144 | qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts) | 145 | qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts) |
145 | { | 146 | { |
146 | uint8_t guard = scsi_host_get_guard(sp->cmd->device->host); | 147 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
148 | uint8_t guard = scsi_host_get_guard(cmd->device->host); | ||
147 | 149 | ||
148 | /* We only support T10 DIF right now */ | 150 | /* We only support T10 DIF right now */ |
149 | if (guard != SHOST_DIX_GUARD_CRC) { | 151 | if (guard != SHOST_DIX_GUARD_CRC) { |
150 | ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3007, | 152 | ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3007, |
151 | "Unsupported guard: %d for cmd=%p.\n", guard, sp->cmd); | 153 | "Unsupported guard: %d for cmd=%p.\n", guard, cmd); |
152 | return 0; | 154 | return 0; |
153 | } | 155 | } |
154 | 156 | ||
@@ -156,7 +158,7 @@ qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts) | |||
156 | *fw_prot_opts = 0; | 158 | *fw_prot_opts = 0; |
157 | 159 | ||
158 | /* Translate SCSI opcode to a protection opcode */ | 160 | /* Translate SCSI opcode to a protection opcode */ |
159 | switch (scsi_get_prot_op(sp->cmd)) { | 161 | switch (scsi_get_prot_op(cmd)) { |
160 | case SCSI_PROT_READ_STRIP: | 162 | case SCSI_PROT_READ_STRIP: |
161 | *fw_prot_opts |= PO_MODE_DIF_REMOVE; | 163 | *fw_prot_opts |= PO_MODE_DIF_REMOVE; |
162 | break; | 164 | break; |
@@ -180,7 +182,7 @@ qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts) | |||
180 | break; | 182 | break; |
181 | } | 183 | } |
182 | 184 | ||
183 | return scsi_prot_sg_count(sp->cmd); | 185 | return scsi_prot_sg_count(cmd); |
184 | } | 186 | } |
185 | 187 | ||
186 | /* | 188 | /* |
@@ -201,7 +203,7 @@ void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt, | |||
201 | struct scatterlist *sg; | 203 | struct scatterlist *sg; |
202 | int i; | 204 | int i; |
203 | 205 | ||
204 | cmd = sp->cmd; | 206 | cmd = GET_CMD_SP(sp); |
205 | 207 | ||
206 | /* Update entry type to indicate Command Type 2 IOCB */ | 208 | /* Update entry type to indicate Command Type 2 IOCB */ |
207 | *((uint32_t *)(&cmd_pkt->entry_type)) = | 209 | *((uint32_t *)(&cmd_pkt->entry_type)) = |
@@ -259,7 +261,7 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt, | |||
259 | struct scatterlist *sg; | 261 | struct scatterlist *sg; |
260 | int i; | 262 | int i; |
261 | 263 | ||
262 | cmd = sp->cmd; | 264 | cmd = GET_CMD_SP(sp); |
263 | 265 | ||
264 | /* Update entry type to indicate Command Type 3 IOCB */ | 266 | /* Update entry type to indicate Command Type 3 IOCB */ |
265 | *((uint32_t *)(&cmd_pkt->entry_type)) = | 267 | *((uint32_t *)(&cmd_pkt->entry_type)) = |
@@ -333,7 +335,7 @@ qla2x00_start_scsi(srb_t *sp) | |||
333 | vha = sp->fcport->vha; | 335 | vha = sp->fcport->vha; |
334 | ha = vha->hw; | 336 | ha = vha->hw; |
335 | reg = &ha->iobase->isp; | 337 | reg = &ha->iobase->isp; |
336 | cmd = sp->cmd; | 338 | cmd = GET_CMD_SP(sp); |
337 | req = ha->req_q_map[0]; | 339 | req = ha->req_q_map[0]; |
338 | rsp = ha->rsp_q_map[0]; | 340 | rsp = ha->rsp_q_map[0]; |
339 | /* So we know we haven't pci_map'ed anything yet */ | 341 | /* So we know we haven't pci_map'ed anything yet */ |
@@ -391,7 +393,7 @@ qla2x00_start_scsi(srb_t *sp) | |||
391 | req->current_outstanding_cmd = handle; | 393 | req->current_outstanding_cmd = handle; |
392 | req->outstanding_cmds[handle] = sp; | 394 | req->outstanding_cmds[handle] = sp; |
393 | sp->handle = handle; | 395 | sp->handle = handle; |
394 | sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; | 396 | cmd->host_scribble = (unsigned char *)(unsigned long)handle; |
395 | req->cnt -= req_cnt; | 397 | req->cnt -= req_cnt; |
396 | 398 | ||
397 | cmd_pkt = (cmd_entry_t *)req->ring_ptr; | 399 | cmd_pkt = (cmd_entry_t *)req->ring_ptr; |
@@ -403,7 +405,7 @@ qla2x00_start_scsi(srb_t *sp) | |||
403 | 405 | ||
404 | /* Set target ID and LUN number*/ | 406 | /* Set target ID and LUN number*/ |
405 | SET_TARGET_ID(ha, cmd_pkt->target, sp->fcport->loop_id); | 407 | SET_TARGET_ID(ha, cmd_pkt->target, sp->fcport->loop_id); |
406 | cmd_pkt->lun = cpu_to_le16(sp->cmd->device->lun); | 408 | cmd_pkt->lun = cpu_to_le16(cmd->device->lun); |
407 | 409 | ||
408 | /* Update tagged queuing modifier */ | 410 | /* Update tagged queuing modifier */ |
409 | if (scsi_populate_tag_msg(cmd, tag)) { | 411 | if (scsi_populate_tag_msg(cmd, tag)) { |
@@ -473,7 +475,6 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req) | |||
473 | { | 475 | { |
474 | struct qla_hw_data *ha = vha->hw; | 476 | struct qla_hw_data *ha = vha->hw; |
475 | device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id); | 477 | device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id); |
476 | struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp; | ||
477 | 478 | ||
478 | if (IS_QLA82XX(ha)) { | 479 | if (IS_QLA82XX(ha)) { |
479 | qla82xx_start_iocbs(vha); | 480 | qla82xx_start_iocbs(vha); |
@@ -487,9 +488,9 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req) | |||
487 | req->ring_ptr++; | 488 | req->ring_ptr++; |
488 | 489 | ||
489 | /* Set chip new ring index. */ | 490 | /* Set chip new ring index. */ |
490 | if (ha->mqenable) { | 491 | if (ha->mqenable || IS_QLA83XX(ha)) { |
491 | WRT_REG_DWORD(®->isp25mq.req_q_in, req->ring_index); | 492 | WRT_REG_DWORD(req->req_q_in, req->ring_index); |
492 | RD_REG_DWORD(&ioreg->hccr); | 493 | RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr); |
493 | } else if (IS_FWI2_CAPABLE(ha)) { | 494 | } else if (IS_FWI2_CAPABLE(ha)) { |
494 | WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index); | 495 | WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index); |
495 | RD_REG_DWORD_RELAXED(®->isp24.req_q_in); | 496 | RD_REG_DWORD_RELAXED(®->isp24.req_q_in); |
@@ -609,7 +610,7 @@ qla24xx_build_scsi_type_6_iocbs(srb_t *sp, struct cmd_type_6 *cmd_pkt, | |||
609 | struct dsd_dma *dsd_ptr; | 610 | struct dsd_dma *dsd_ptr; |
610 | struct ct6_dsd *ctx; | 611 | struct ct6_dsd *ctx; |
611 | 612 | ||
612 | cmd = sp->cmd; | 613 | cmd = GET_CMD_SP(sp); |
613 | 614 | ||
614 | /* Update entry type to indicate Command Type 3 IOCB */ | 615 | /* Update entry type to indicate Command Type 3 IOCB */ |
615 | *((uint32_t *)(&cmd_pkt->entry_type)) = | 616 | *((uint32_t *)(&cmd_pkt->entry_type)) = |
@@ -636,7 +637,7 @@ qla24xx_build_scsi_type_6_iocbs(srb_t *sp, struct cmd_type_6 *cmd_pkt, | |||
636 | } | 637 | } |
637 | 638 | ||
638 | cur_seg = scsi_sglist(cmd); | 639 | cur_seg = scsi_sglist(cmd); |
639 | ctx = sp->ctx; | 640 | ctx = GET_CMD_CTX_SP(sp); |
640 | 641 | ||
641 | while (tot_dsds) { | 642 | while (tot_dsds) { |
642 | avail_dsds = (tot_dsds > QLA_DSDS_PER_IOCB) ? | 643 | avail_dsds = (tot_dsds > QLA_DSDS_PER_IOCB) ? |
@@ -725,7 +726,7 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt, | |||
725 | int i; | 726 | int i; |
726 | struct req_que *req; | 727 | struct req_que *req; |
727 | 728 | ||
728 | cmd = sp->cmd; | 729 | cmd = GET_CMD_SP(sp); |
729 | 730 | ||
730 | /* Update entry type to indicate Command Type 3 IOCB */ | 731 | /* Update entry type to indicate Command Type 3 IOCB */ |
731 | *((uint32_t *)(&cmd_pkt->entry_type)) = | 732 | *((uint32_t *)(&cmd_pkt->entry_type)) = |
@@ -745,12 +746,12 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt, | |||
745 | cmd_pkt->task_mgmt_flags = | 746 | cmd_pkt->task_mgmt_flags = |
746 | __constant_cpu_to_le16(TMF_WRITE_DATA); | 747 | __constant_cpu_to_le16(TMF_WRITE_DATA); |
747 | sp->fcport->vha->hw->qla_stats.output_bytes += | 748 | sp->fcport->vha->hw->qla_stats.output_bytes += |
748 | scsi_bufflen(sp->cmd); | 749 | scsi_bufflen(cmd); |
749 | } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { | 750 | } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { |
750 | cmd_pkt->task_mgmt_flags = | 751 | cmd_pkt->task_mgmt_flags = |
751 | __constant_cpu_to_le16(TMF_READ_DATA); | 752 | __constant_cpu_to_le16(TMF_READ_DATA); |
752 | sp->fcport->vha->hw->qla_stats.input_bytes += | 753 | sp->fcport->vha->hw->qla_stats.input_bytes += |
753 | scsi_bufflen(sp->cmd); | 754 | scsi_bufflen(cmd); |
754 | } | 755 | } |
755 | 756 | ||
756 | /* One DSD is available in the Command Type 3 IOCB */ | 757 | /* One DSD is available in the Command Type 3 IOCB */ |
@@ -797,7 +798,7 @@ static inline void | |||
797 | qla24xx_set_t10dif_tags(srb_t *sp, struct fw_dif_context *pkt, | 798 | qla24xx_set_t10dif_tags(srb_t *sp, struct fw_dif_context *pkt, |
798 | unsigned int protcnt) | 799 | unsigned int protcnt) |
799 | { | 800 | { |
800 | struct scsi_cmnd *cmd = sp->cmd; | 801 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
801 | scsi_qla_host_t *vha = shost_priv(cmd->device->host); | 802 | scsi_qla_host_t *vha = shost_priv(cmd->device->host); |
802 | 803 | ||
803 | switch (scsi_get_prot_type(cmd)) { | 804 | switch (scsi_get_prot_type(cmd)) { |
@@ -952,16 +953,16 @@ qla24xx_walk_and_build_sglist_no_difb(struct qla_hw_data *ha, srb_t *sp, | |||
952 | struct qla2_sgx sgx; | 953 | struct qla2_sgx sgx; |
953 | dma_addr_t sle_dma; | 954 | dma_addr_t sle_dma; |
954 | uint32_t sle_dma_len, tot_prot_dma_len = 0; | 955 | uint32_t sle_dma_len, tot_prot_dma_len = 0; |
955 | struct scsi_cmnd *cmd = sp->cmd; | 956 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
956 | 957 | ||
957 | prot_int = cmd->device->sector_size; | 958 | prot_int = cmd->device->sector_size; |
958 | 959 | ||
959 | memset(&sgx, 0, sizeof(struct qla2_sgx)); | 960 | memset(&sgx, 0, sizeof(struct qla2_sgx)); |
960 | sgx.tot_bytes = scsi_bufflen(sp->cmd); | 961 | sgx.tot_bytes = scsi_bufflen(cmd); |
961 | sgx.cur_sg = scsi_sglist(sp->cmd); | 962 | sgx.cur_sg = scsi_sglist(cmd); |
962 | sgx.sp = sp; | 963 | sgx.sp = sp; |
963 | 964 | ||
964 | sg_prot = scsi_prot_sglist(sp->cmd); | 965 | sg_prot = scsi_prot_sglist(cmd); |
965 | 966 | ||
966 | while (qla24xx_get_one_block_sg(prot_int, &sgx, &partial)) { | 967 | while (qla24xx_get_one_block_sg(prot_int, &sgx, &partial)) { |
967 | 968 | ||
@@ -995,7 +996,7 @@ alloc_and_fill: | |||
995 | } | 996 | } |
996 | 997 | ||
997 | list_add_tail(&dsd_ptr->list, | 998 | list_add_tail(&dsd_ptr->list, |
998 | &((struct crc_context *)sp->ctx)->dsd_list); | 999 | &((struct crc_context *)sp->u.scmd.ctx)->dsd_list); |
999 | 1000 | ||
1000 | sp->flags |= SRB_CRC_CTX_DSD_VALID; | 1001 | sp->flags |= SRB_CRC_CTX_DSD_VALID; |
1001 | 1002 | ||
@@ -1044,11 +1045,12 @@ qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd, | |||
1044 | uint32_t *cur_dsd = dsd; | 1045 | uint32_t *cur_dsd = dsd; |
1045 | int i; | 1046 | int i; |
1046 | uint16_t used_dsds = tot_dsds; | 1047 | uint16_t used_dsds = tot_dsds; |
1047 | scsi_qla_host_t *vha = shost_priv(sp->cmd->device->host); | 1048 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
1049 | scsi_qla_host_t *vha = shost_priv(cmd->device->host); | ||
1048 | 1050 | ||
1049 | uint8_t *cp; | 1051 | uint8_t *cp; |
1050 | 1052 | ||
1051 | scsi_for_each_sg(sp->cmd, sg, tot_dsds, i) { | 1053 | scsi_for_each_sg(cmd, sg, tot_dsds, i) { |
1052 | dma_addr_t sle_dma; | 1054 | dma_addr_t sle_dma; |
1053 | 1055 | ||
1054 | /* Allocate additional continuation packets? */ | 1056 | /* Allocate additional continuation packets? */ |
@@ -1078,7 +1080,7 @@ qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd, | |||
1078 | } | 1080 | } |
1079 | 1081 | ||
1080 | list_add_tail(&dsd_ptr->list, | 1082 | list_add_tail(&dsd_ptr->list, |
1081 | &((struct crc_context *)sp->ctx)->dsd_list); | 1083 | &((struct crc_context *)sp->u.scmd.ctx)->dsd_list); |
1082 | 1084 | ||
1083 | sp->flags |= SRB_CRC_CTX_DSD_VALID; | 1085 | sp->flags |= SRB_CRC_CTX_DSD_VALID; |
1084 | 1086 | ||
@@ -1091,17 +1093,16 @@ qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd, | |||
1091 | sle_dma = sg_dma_address(sg); | 1093 | sle_dma = sg_dma_address(sg); |
1092 | ql_dbg(ql_dbg_io, vha, 0x300a, | 1094 | ql_dbg(ql_dbg_io, vha, 0x300a, |
1093 | "sg entry %d - addr=0x%x 0x%x, " "len=%d for cmd=%p.\n", | 1095 | "sg entry %d - addr=0x%x 0x%x, " "len=%d for cmd=%p.\n", |
1094 | i, LSD(sle_dma), MSD(sle_dma), sg_dma_len(sg), | 1096 | i, LSD(sle_dma), MSD(sle_dma), sg_dma_len(sg), cmd); |
1095 | sp->cmd); | ||
1096 | *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); | 1097 | *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); |
1097 | *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); | 1098 | *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); |
1098 | *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); | 1099 | *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); |
1099 | avail_dsds--; | 1100 | avail_dsds--; |
1100 | 1101 | ||
1101 | if (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_PASS) { | 1102 | if (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_PASS) { |
1102 | cp = page_address(sg_page(sg)) + sg->offset; | 1103 | cp = page_address(sg_page(sg)) + sg->offset; |
1103 | ql_dbg(ql_dbg_io, vha, 0x300b, | 1104 | ql_dbg(ql_dbg_io, vha, 0x300b, |
1104 | "User data buffer=%p for cmd=%p.\n", cp, sp->cmd); | 1105 | "User data buffer=%p for cmd=%p.\n", cp, cmd); |
1105 | } | 1106 | } |
1106 | } | 1107 | } |
1107 | /* Null termination */ | 1108 | /* Null termination */ |
@@ -1128,8 +1129,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, | |||
1128 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); | 1129 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); |
1129 | uint8_t *cp; | 1130 | uint8_t *cp; |
1130 | 1131 | ||
1131 | 1132 | cmd = GET_CMD_SP(sp); | |
1132 | cmd = sp->cmd; | ||
1133 | scsi_for_each_prot_sg(cmd, sg, tot_dsds, i) { | 1133 | scsi_for_each_prot_sg(cmd, sg, tot_dsds, i) { |
1134 | dma_addr_t sle_dma; | 1134 | dma_addr_t sle_dma; |
1135 | 1135 | ||
@@ -1160,7 +1160,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, | |||
1160 | } | 1160 | } |
1161 | 1161 | ||
1162 | list_add_tail(&dsd_ptr->list, | 1162 | list_add_tail(&dsd_ptr->list, |
1163 | &((struct crc_context *)sp->ctx)->dsd_list); | 1163 | &((struct crc_context *)sp->u.scmd.ctx)->dsd_list); |
1164 | 1164 | ||
1165 | sp->flags |= SRB_CRC_CTX_DSD_VALID; | 1165 | sp->flags |= SRB_CRC_CTX_DSD_VALID; |
1166 | 1166 | ||
@@ -1171,7 +1171,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, | |||
1171 | cur_dsd = (uint32_t *)next_dsd; | 1171 | cur_dsd = (uint32_t *)next_dsd; |
1172 | } | 1172 | } |
1173 | sle_dma = sg_dma_address(sg); | 1173 | sle_dma = sg_dma_address(sg); |
1174 | if (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_PASS) { | 1174 | if (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_PASS) { |
1175 | ql_dbg(ql_dbg_io, vha, 0x3027, | 1175 | ql_dbg(ql_dbg_io, vha, 0x3027, |
1176 | "%s(): %p, sg_entry %d - " | 1176 | "%s(): %p, sg_entry %d - " |
1177 | "addr=0x%x0x%x, len=%d.\n", | 1177 | "addr=0x%x0x%x, len=%d.\n", |
@@ -1182,7 +1182,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, | |||
1182 | *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); | 1182 | *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); |
1183 | *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); | 1183 | *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); |
1184 | 1184 | ||
1185 | if (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_PASS) { | 1185 | if (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_PASS) { |
1186 | cp = page_address(sg_page(sg)) + sg->offset; | 1186 | cp = page_address(sg_page(sg)) + sg->offset; |
1187 | ql_dbg(ql_dbg_io, vha, 0x3028, | 1187 | ql_dbg(ql_dbg_io, vha, 0x3028, |
1188 | "%s(): Protection Data buffer = %p.\n", __func__, | 1188 | "%s(): Protection Data buffer = %p.\n", __func__, |
@@ -1228,7 +1228,7 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, | |||
1228 | dma_addr_t crc_ctx_dma; | 1228 | dma_addr_t crc_ctx_dma; |
1229 | char tag[2]; | 1229 | char tag[2]; |
1230 | 1230 | ||
1231 | cmd = sp->cmd; | 1231 | cmd = GET_CMD_SP(sp); |
1232 | 1232 | ||
1233 | sgc = 0; | 1233 | sgc = 0; |
1234 | /* Update entry type to indicate Command Type CRC_2 IOCB */ | 1234 | /* Update entry type to indicate Command Type CRC_2 IOCB */ |
@@ -1256,15 +1256,15 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, | |||
1256 | __constant_cpu_to_le16(CF_READ_DATA); | 1256 | __constant_cpu_to_le16(CF_READ_DATA); |
1257 | } | 1257 | } |
1258 | 1258 | ||
1259 | if ((scsi_get_prot_op(sp->cmd) == SCSI_PROT_READ_INSERT) || | 1259 | if ((scsi_get_prot_op(cmd) == SCSI_PROT_READ_INSERT) || |
1260 | (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_STRIP) || | 1260 | (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_STRIP) || |
1261 | (scsi_get_prot_op(sp->cmd) == SCSI_PROT_READ_STRIP) || | 1261 | (scsi_get_prot_op(cmd) == SCSI_PROT_READ_STRIP) || |
1262 | (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_INSERT)) | 1262 | (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_INSERT)) |
1263 | bundling = 0; | 1263 | bundling = 0; |
1264 | 1264 | ||
1265 | /* Allocate CRC context from global pool */ | 1265 | /* Allocate CRC context from global pool */ |
1266 | crc_ctx_pkt = sp->ctx = dma_pool_alloc(ha->dl_dma_pool, | 1266 | crc_ctx_pkt = sp->u.scmd.ctx = |
1267 | GFP_ATOMIC, &crc_ctx_dma); | 1267 | dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, &crc_ctx_dma); |
1268 | 1268 | ||
1269 | if (!crc_ctx_pkt) | 1269 | if (!crc_ctx_pkt) |
1270 | goto crc_queuing_error; | 1270 | goto crc_queuing_error; |
@@ -1310,7 +1310,7 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, | |||
1310 | else if (cmd->sc_data_direction == DMA_FROM_DEVICE) | 1310 | else if (cmd->sc_data_direction == DMA_FROM_DEVICE) |
1311 | fcp_cmnd->additional_cdb_len |= 2; | 1311 | fcp_cmnd->additional_cdb_len |= 2; |
1312 | 1312 | ||
1313 | int_to_scsilun(sp->cmd->device->lun, &fcp_cmnd->lun); | 1313 | int_to_scsilun(cmd->device->lun, &fcp_cmnd->lun); |
1314 | memcpy(fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); | 1314 | memcpy(fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); |
1315 | cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(fcp_cmnd_len); | 1315 | cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(fcp_cmnd_len); |
1316 | cmd_pkt->fcp_cmnd_dseg_address[0] = cpu_to_le32( | 1316 | cmd_pkt->fcp_cmnd_dseg_address[0] = cpu_to_le32( |
@@ -1345,7 +1345,7 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, | |||
1345 | blk_size = cmd->device->sector_size; | 1345 | blk_size = cmd->device->sector_size; |
1346 | dif_bytes = (data_bytes / blk_size) * 8; | 1346 | dif_bytes = (data_bytes / blk_size) * 8; |
1347 | 1347 | ||
1348 | switch (scsi_get_prot_op(sp->cmd)) { | 1348 | switch (scsi_get_prot_op(GET_CMD_SP(sp))) { |
1349 | case SCSI_PROT_READ_INSERT: | 1349 | case SCSI_PROT_READ_INSERT: |
1350 | case SCSI_PROT_WRITE_STRIP: | 1350 | case SCSI_PROT_WRITE_STRIP: |
1351 | total_bytes = data_bytes; | 1351 | total_bytes = data_bytes; |
@@ -1445,7 +1445,7 @@ qla24xx_start_scsi(srb_t *sp) | |||
1445 | uint16_t tot_dsds; | 1445 | uint16_t tot_dsds; |
1446 | struct req_que *req = NULL; | 1446 | struct req_que *req = NULL; |
1447 | struct rsp_que *rsp = NULL; | 1447 | struct rsp_que *rsp = NULL; |
1448 | struct scsi_cmnd *cmd = sp->cmd; | 1448 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
1449 | struct scsi_qla_host *vha = sp->fcport->vha; | 1449 | struct scsi_qla_host *vha = sp->fcport->vha; |
1450 | struct qla_hw_data *ha = vha->hw; | 1450 | struct qla_hw_data *ha = vha->hw; |
1451 | char tag[2]; | 1451 | char tag[2]; |
@@ -1510,7 +1510,7 @@ qla24xx_start_scsi(srb_t *sp) | |||
1510 | req->current_outstanding_cmd = handle; | 1510 | req->current_outstanding_cmd = handle; |
1511 | req->outstanding_cmds[handle] = sp; | 1511 | req->outstanding_cmds[handle] = sp; |
1512 | sp->handle = handle; | 1512 | sp->handle = handle; |
1513 | sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; | 1513 | cmd->host_scribble = (unsigned char *)(unsigned long)handle; |
1514 | req->cnt -= req_cnt; | 1514 | req->cnt -= req_cnt; |
1515 | 1515 | ||
1516 | cmd_pkt = (struct cmd_type_7 *)req->ring_ptr; | 1516 | cmd_pkt = (struct cmd_type_7 *)req->ring_ptr; |
@@ -1529,7 +1529,7 @@ qla24xx_start_scsi(srb_t *sp) | |||
1529 | cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; | 1529 | cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; |
1530 | cmd_pkt->vp_index = sp->fcport->vp_idx; | 1530 | cmd_pkt->vp_index = sp->fcport->vp_idx; |
1531 | 1531 | ||
1532 | int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); | 1532 | int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); |
1533 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); | 1533 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); |
1534 | 1534 | ||
1535 | /* Update tagged queuing modifier -- default is TSK_SIMPLE (0). */ | 1535 | /* Update tagged queuing modifier -- default is TSK_SIMPLE (0). */ |
@@ -1611,7 +1611,7 @@ qla24xx_dif_start_scsi(srb_t *sp) | |||
1611 | uint16_t fw_prot_opts = 0; | 1611 | uint16_t fw_prot_opts = 0; |
1612 | struct req_que *req = NULL; | 1612 | struct req_que *req = NULL; |
1613 | struct rsp_que *rsp = NULL; | 1613 | struct rsp_que *rsp = NULL; |
1614 | struct scsi_cmnd *cmd = sp->cmd; | 1614 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
1615 | struct scsi_qla_host *vha = sp->fcport->vha; | 1615 | struct scsi_qla_host *vha = sp->fcport->vha; |
1616 | struct qla_hw_data *ha = vha->hw; | 1616 | struct qla_hw_data *ha = vha->hw; |
1617 | struct cmd_type_crc_2 *cmd_pkt; | 1617 | struct cmd_type_crc_2 *cmd_pkt; |
@@ -1728,7 +1728,7 @@ qla24xx_dif_start_scsi(srb_t *sp) | |||
1728 | req->current_outstanding_cmd = handle; | 1728 | req->current_outstanding_cmd = handle; |
1729 | req->outstanding_cmds[handle] = sp; | 1729 | req->outstanding_cmds[handle] = sp; |
1730 | sp->handle = handle; | 1730 | sp->handle = handle; |
1731 | sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; | 1731 | cmd->host_scribble = (unsigned char *)(unsigned long)handle; |
1732 | req->cnt -= req_cnt; | 1732 | req->cnt -= req_cnt; |
1733 | 1733 | ||
1734 | /* Fill-in common area */ | 1734 | /* Fill-in common area */ |
@@ -1744,7 +1744,7 @@ qla24xx_dif_start_scsi(srb_t *sp) | |||
1744 | cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; | 1744 | cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; |
1745 | cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; | 1745 | cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; |
1746 | 1746 | ||
1747 | int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); | 1747 | int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); |
1748 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); | 1748 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); |
1749 | 1749 | ||
1750 | /* Total Data and protection segment(s) */ | 1750 | /* Total Data and protection segment(s) */ |
@@ -1797,7 +1797,7 @@ queuing_error: | |||
1797 | 1797 | ||
1798 | static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp) | 1798 | static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp) |
1799 | { | 1799 | { |
1800 | struct scsi_cmnd *cmd = sp->cmd; | 1800 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
1801 | struct qla_hw_data *ha = sp->fcport->vha->hw; | 1801 | struct qla_hw_data *ha = sp->fcport->vha->hw; |
1802 | int affinity = cmd->request->cpu; | 1802 | int affinity = cmd->request->cpu; |
1803 | 1803 | ||
@@ -1818,7 +1818,6 @@ qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp) | |||
1818 | uint32_t index, handle; | 1818 | uint32_t index, handle; |
1819 | request_t *pkt; | 1819 | request_t *pkt; |
1820 | uint16_t cnt, req_cnt; | 1820 | uint16_t cnt, req_cnt; |
1821 | struct srb_ctx *ctx; | ||
1822 | 1821 | ||
1823 | pkt = NULL; | 1822 | pkt = NULL; |
1824 | req_cnt = 1; | 1823 | req_cnt = 1; |
@@ -1848,15 +1847,13 @@ qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp) | |||
1848 | sp->handle = handle; | 1847 | sp->handle = handle; |
1849 | 1848 | ||
1850 | /* Adjust entry-counts as needed. */ | 1849 | /* Adjust entry-counts as needed. */ |
1851 | if (sp->ctx) { | 1850 | if (sp->type != SRB_SCSI_CMD) |
1852 | ctx = sp->ctx; | 1851 | req_cnt = sp->iocbs; |
1853 | req_cnt = ctx->iocbs; | ||
1854 | } | ||
1855 | 1852 | ||
1856 | skip_cmd_array: | 1853 | skip_cmd_array: |
1857 | /* Check for room on request queue. */ | 1854 | /* Check for room on request queue. */ |
1858 | if (req->cnt < req_cnt) { | 1855 | if (req->cnt < req_cnt) { |
1859 | if (ha->mqenable) | 1856 | if (ha->mqenable || IS_QLA83XX(ha)) |
1860 | cnt = RD_REG_DWORD(®->isp25mq.req_q_out); | 1857 | cnt = RD_REG_DWORD(®->isp25mq.req_q_out); |
1861 | else if (IS_QLA82XX(ha)) | 1858 | else if (IS_QLA82XX(ha)) |
1862 | cnt = RD_REG_DWORD(®->isp82.req_q_out); | 1859 | cnt = RD_REG_DWORD(®->isp82.req_q_out); |
@@ -1889,8 +1886,7 @@ queuing_error: | |||
1889 | static void | 1886 | static void |
1890 | qla24xx_login_iocb(srb_t *sp, struct logio_entry_24xx *logio) | 1887 | qla24xx_login_iocb(srb_t *sp, struct logio_entry_24xx *logio) |
1891 | { | 1888 | { |
1892 | struct srb_ctx *ctx = sp->ctx; | 1889 | struct srb_iocb *lio = &sp->u.iocb_cmd; |
1893 | struct srb_iocb *lio = ctx->u.iocb_cmd; | ||
1894 | 1890 | ||
1895 | logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; | 1891 | logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; |
1896 | logio->control_flags = cpu_to_le16(LCF_COMMAND_PLOGI); | 1892 | logio->control_flags = cpu_to_le16(LCF_COMMAND_PLOGI); |
@@ -1909,8 +1905,7 @@ static void | |||
1909 | qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx) | 1905 | qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx) |
1910 | { | 1906 | { |
1911 | struct qla_hw_data *ha = sp->fcport->vha->hw; | 1907 | struct qla_hw_data *ha = sp->fcport->vha->hw; |
1912 | struct srb_ctx *ctx = sp->ctx; | 1908 | struct srb_iocb *lio = &sp->u.iocb_cmd; |
1913 | struct srb_iocb *lio = ctx->u.iocb_cmd; | ||
1914 | uint16_t opts; | 1909 | uint16_t opts; |
1915 | 1910 | ||
1916 | mbx->entry_type = MBX_IOCB_TYPE; | 1911 | mbx->entry_type = MBX_IOCB_TYPE; |
@@ -1999,8 +1994,7 @@ qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk) | |||
1999 | struct fc_port *fcport = sp->fcport; | 1994 | struct fc_port *fcport = sp->fcport; |
2000 | scsi_qla_host_t *vha = fcport->vha; | 1995 | scsi_qla_host_t *vha = fcport->vha; |
2001 | struct qla_hw_data *ha = vha->hw; | 1996 | struct qla_hw_data *ha = vha->hw; |
2002 | struct srb_ctx *ctx = sp->ctx; | 1997 | struct srb_iocb *iocb = &sp->u.iocb_cmd; |
2003 | struct srb_iocb *iocb = ctx->u.iocb_cmd; | ||
2004 | struct req_que *req = vha->req; | 1998 | struct req_que *req = vha->req; |
2005 | 1999 | ||
2006 | flags = iocb->u.tmf.flags; | 2000 | flags = iocb->u.tmf.flags; |
@@ -2027,7 +2021,7 @@ qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk) | |||
2027 | static void | 2021 | static void |
2028 | qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb) | 2022 | qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb) |
2029 | { | 2023 | { |
2030 | struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; | 2024 | struct fc_bsg_job *bsg_job = sp->u.bsg_job; |
2031 | 2025 | ||
2032 | els_iocb->entry_type = ELS_IOCB_TYPE; | 2026 | els_iocb->entry_type = ELS_IOCB_TYPE; |
2033 | els_iocb->entry_count = 1; | 2027 | els_iocb->entry_count = 1; |
@@ -2041,7 +2035,7 @@ qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb) | |||
2041 | els_iocb->rx_dsd_count = __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt); | 2035 | els_iocb->rx_dsd_count = __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt); |
2042 | 2036 | ||
2043 | els_iocb->opcode = | 2037 | els_iocb->opcode = |
2044 | (((struct srb_ctx *)sp->ctx)->type == SRB_ELS_CMD_RPT) ? | 2038 | sp->type == SRB_ELS_CMD_RPT ? |
2045 | bsg_job->request->rqst_data.r_els.els_code : | 2039 | bsg_job->request->rqst_data.r_els.els_code : |
2046 | bsg_job->request->rqst_data.h_els.command_code; | 2040 | bsg_job->request->rqst_data.h_els.command_code; |
2047 | els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; | 2041 | els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; |
@@ -2078,7 +2072,7 @@ qla2x00_ct_iocb(srb_t *sp, ms_iocb_entry_t *ct_iocb) | |||
2078 | uint16_t tot_dsds; | 2072 | uint16_t tot_dsds; |
2079 | scsi_qla_host_t *vha = sp->fcport->vha; | 2073 | scsi_qla_host_t *vha = sp->fcport->vha; |
2080 | struct qla_hw_data *ha = vha->hw; | 2074 | struct qla_hw_data *ha = vha->hw; |
2081 | struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; | 2075 | struct fc_bsg_job *bsg_job = sp->u.bsg_job; |
2082 | int loop_iterartion = 0; | 2076 | int loop_iterartion = 0; |
2083 | int cont_iocb_prsnt = 0; | 2077 | int cont_iocb_prsnt = 0; |
2084 | int entry_count = 1; | 2078 | int entry_count = 1; |
@@ -2155,7 +2149,7 @@ qla24xx_ct_iocb(srb_t *sp, struct ct_entry_24xx *ct_iocb) | |||
2155 | uint16_t tot_dsds; | 2149 | uint16_t tot_dsds; |
2156 | scsi_qla_host_t *vha = sp->fcport->vha; | 2150 | scsi_qla_host_t *vha = sp->fcport->vha; |
2157 | struct qla_hw_data *ha = vha->hw; | 2151 | struct qla_hw_data *ha = vha->hw; |
2158 | struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; | 2152 | struct fc_bsg_job *bsg_job = sp->u.bsg_job; |
2159 | int loop_iterartion = 0; | 2153 | int loop_iterartion = 0; |
2160 | int cont_iocb_prsnt = 0; | 2154 | int cont_iocb_prsnt = 0; |
2161 | int entry_count = 1; | 2155 | int entry_count = 1; |
@@ -2245,12 +2239,12 @@ qla82xx_start_scsi(srb_t *sp) | |||
2245 | struct qla_hw_data *ha = vha->hw; | 2239 | struct qla_hw_data *ha = vha->hw; |
2246 | struct req_que *req = NULL; | 2240 | struct req_que *req = NULL; |
2247 | struct rsp_que *rsp = NULL; | 2241 | struct rsp_que *rsp = NULL; |
2248 | char tag[2]; | 2242 | char tag[2]; |
2249 | 2243 | ||
2250 | /* Setup device pointers. */ | 2244 | /* Setup device pointers. */ |
2251 | ret = 0; | 2245 | ret = 0; |
2252 | reg = &ha->iobase->isp82; | 2246 | reg = &ha->iobase->isp82; |
2253 | cmd = sp->cmd; | 2247 | cmd = GET_CMD_SP(sp); |
2254 | req = vha->req; | 2248 | req = vha->req; |
2255 | rsp = ha->rsp_q_map[0]; | 2249 | rsp = ha->rsp_q_map[0]; |
2256 | 2250 | ||
@@ -2354,12 +2348,14 @@ sufficient_dsds: | |||
2354 | if (req->cnt < (req_cnt + 2)) | 2348 | if (req->cnt < (req_cnt + 2)) |
2355 | goto queuing_error; | 2349 | goto queuing_error; |
2356 | 2350 | ||
2357 | ctx = sp->ctx = mempool_alloc(ha->ctx_mempool, GFP_ATOMIC); | 2351 | ctx = sp->u.scmd.ctx = |
2358 | if (!sp->ctx) { | 2352 | mempool_alloc(ha->ctx_mempool, GFP_ATOMIC); |
2353 | if (!ctx) { | ||
2359 | ql_log(ql_log_fatal, vha, 0x3010, | 2354 | ql_log(ql_log_fatal, vha, 0x3010, |
2360 | "Failed to allocate ctx for cmd=%p.\n", cmd); | 2355 | "Failed to allocate ctx for cmd=%p.\n", cmd); |
2361 | goto queuing_error; | 2356 | goto queuing_error; |
2362 | } | 2357 | } |
2358 | |||
2363 | memset(ctx, 0, sizeof(struct ct6_dsd)); | 2359 | memset(ctx, 0, sizeof(struct ct6_dsd)); |
2364 | ctx->fcp_cmnd = dma_pool_alloc(ha->fcp_cmnd_dma_pool, | 2360 | ctx->fcp_cmnd = dma_pool_alloc(ha->fcp_cmnd_dma_pool, |
2365 | GFP_ATOMIC, &ctx->fcp_cmnd_dma); | 2361 | GFP_ATOMIC, &ctx->fcp_cmnd_dma); |
@@ -2410,12 +2406,12 @@ sufficient_dsds: | |||
2410 | if (qla24xx_build_scsi_type_6_iocbs(sp, cmd_pkt, tot_dsds)) | 2406 | if (qla24xx_build_scsi_type_6_iocbs(sp, cmd_pkt, tot_dsds)) |
2411 | goto queuing_error_fcp_cmnd; | 2407 | goto queuing_error_fcp_cmnd; |
2412 | 2408 | ||
2413 | int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); | 2409 | int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); |
2414 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); | 2410 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); |
2415 | 2411 | ||
2416 | /* build FCP_CMND IU */ | 2412 | /* build FCP_CMND IU */ |
2417 | memset(ctx->fcp_cmnd, 0, sizeof(struct fcp_cmnd)); | 2413 | memset(ctx->fcp_cmnd, 0, sizeof(struct fcp_cmnd)); |
2418 | int_to_scsilun(sp->cmd->device->lun, &ctx->fcp_cmnd->lun); | 2414 | int_to_scsilun(cmd->device->lun, &ctx->fcp_cmnd->lun); |
2419 | ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len; | 2415 | ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len; |
2420 | 2416 | ||
2421 | if (cmd->sc_data_direction == DMA_TO_DEVICE) | 2417 | if (cmd->sc_data_direction == DMA_TO_DEVICE) |
@@ -2495,9 +2491,9 @@ sufficient_dsds: | |||
2495 | cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; | 2491 | cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; |
2496 | cmd_pkt->vp_index = sp->fcport->vp_idx; | 2492 | cmd_pkt->vp_index = sp->fcport->vp_idx; |
2497 | 2493 | ||
2498 | int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); | 2494 | int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); |
2499 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, | 2495 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, |
2500 | sizeof(cmd_pkt->lun)); | 2496 | sizeof(cmd_pkt->lun)); |
2501 | 2497 | ||
2502 | /* | 2498 | /* |
2503 | * Update tagged queuing modifier -- default is TSK_SIMPLE (0). | 2499 | * Update tagged queuing modifier -- default is TSK_SIMPLE (0). |
@@ -2538,7 +2534,7 @@ sufficient_dsds: | |||
2538 | req->current_outstanding_cmd = handle; | 2534 | req->current_outstanding_cmd = handle; |
2539 | req->outstanding_cmds[handle] = sp; | 2535 | req->outstanding_cmds[handle] = sp; |
2540 | sp->handle = handle; | 2536 | sp->handle = handle; |
2541 | sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; | 2537 | cmd->host_scribble = (unsigned char *)(unsigned long)handle; |
2542 | req->cnt -= req_cnt; | 2538 | req->cnt -= req_cnt; |
2543 | wmb(); | 2539 | wmb(); |
2544 | 2540 | ||
@@ -2584,9 +2580,9 @@ queuing_error: | |||
2584 | if (tot_dsds) | 2580 | if (tot_dsds) |
2585 | scsi_dma_unmap(cmd); | 2581 | scsi_dma_unmap(cmd); |
2586 | 2582 | ||
2587 | if (sp->ctx) { | 2583 | if (sp->u.scmd.ctx) { |
2588 | mempool_free(sp->ctx, ha->ctx_mempool); | 2584 | mempool_free(sp->u.scmd.ctx, ha->ctx_mempool); |
2589 | sp->ctx = NULL; | 2585 | sp->u.scmd.ctx = NULL; |
2590 | } | 2586 | } |
2591 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 2587 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
2592 | 2588 | ||
@@ -2599,7 +2595,6 @@ qla2x00_start_sp(srb_t *sp) | |||
2599 | int rval; | 2595 | int rval; |
2600 | struct qla_hw_data *ha = sp->fcport->vha->hw; | 2596 | struct qla_hw_data *ha = sp->fcport->vha->hw; |
2601 | void *pkt; | 2597 | void *pkt; |
2602 | struct srb_ctx *ctx = sp->ctx; | ||
2603 | unsigned long flags; | 2598 | unsigned long flags; |
2604 | 2599 | ||
2605 | rval = QLA_FUNCTION_FAILED; | 2600 | rval = QLA_FUNCTION_FAILED; |
@@ -2612,7 +2607,7 @@ qla2x00_start_sp(srb_t *sp) | |||
2612 | } | 2607 | } |
2613 | 2608 | ||
2614 | rval = QLA_SUCCESS; | 2609 | rval = QLA_SUCCESS; |
2615 | switch (ctx->type) { | 2610 | switch (sp->type) { |
2616 | case SRB_LOGIN_CMD: | 2611 | case SRB_LOGIN_CMD: |
2617 | IS_FWI2_CAPABLE(ha) ? | 2612 | IS_FWI2_CAPABLE(ha) ? |
2618 | qla24xx_login_iocb(sp, pkt) : | 2613 | qla24xx_login_iocb(sp, pkt) : |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 349843ea32f..f79844ce712 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -44,8 +44,8 @@ qla2100_intr_handler(int irq, void *dev_id) | |||
44 | 44 | ||
45 | rsp = (struct rsp_que *) dev_id; | 45 | rsp = (struct rsp_que *) dev_id; |
46 | if (!rsp) { | 46 | if (!rsp) { |
47 | printk(KERN_INFO | 47 | ql_log(ql_log_info, NULL, 0x505d, |
48 | "%s(): NULL response queue pointer.\n", __func__); | 48 | "%s: NULL response queue pointer.\n", __func__); |
49 | return (IRQ_NONE); | 49 | return (IRQ_NONE); |
50 | } | 50 | } |
51 | 51 | ||
@@ -141,8 +141,8 @@ qla2300_intr_handler(int irq, void *dev_id) | |||
141 | 141 | ||
142 | rsp = (struct rsp_que *) dev_id; | 142 | rsp = (struct rsp_que *) dev_id; |
143 | if (!rsp) { | 143 | if (!rsp) { |
144 | printk(KERN_INFO | 144 | ql_log(ql_log_info, NULL, 0x5058, |
145 | "%s(): NULL response queue pointer.\n", __func__); | 145 | "%s: NULL response queue pointer.\n", __func__); |
146 | return (IRQ_NONE); | 146 | return (IRQ_NONE); |
147 | } | 147 | } |
148 | 148 | ||
@@ -289,7 +289,7 @@ qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr) | |||
289 | mb[cnt] = RD_REG_WORD(wptr); | 289 | mb[cnt] = RD_REG_WORD(wptr); |
290 | 290 | ||
291 | ql_dbg(ql_dbg_async, vha, 0x5021, | 291 | ql_dbg(ql_dbg_async, vha, 0x5021, |
292 | "Inter-Driver Commucation %s -- " | 292 | "Inter-Driver Communication %s -- " |
293 | "%04x %04x %04x %04x %04x %04x %04x.\n", | 293 | "%04x %04x %04x %04x %04x %04x %04x.\n", |
294 | event[aen & 0xff], mb[0], mb[1], mb[2], mb[3], | 294 | event[aen & 0xff], mb[0], mb[1], mb[2], mb[3], |
295 | mb[4], mb[5], mb[6]); | 295 | mb[4], mb[5], mb[6]); |
@@ -318,7 +318,7 @@ void | |||
318 | qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | 318 | qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) |
319 | { | 319 | { |
320 | #define LS_UNKNOWN 2 | 320 | #define LS_UNKNOWN 2 |
321 | static char *link_speeds[] = { "1", "2", "?", "4", "8", "10" }; | 321 | static char *link_speeds[] = { "1", "2", "?", "4", "8", "16", "10" }; |
322 | char *link_speed; | 322 | char *link_speed; |
323 | uint16_t handle_cnt; | 323 | uint16_t handle_cnt; |
324 | uint16_t cnt, mbx; | 324 | uint16_t cnt, mbx; |
@@ -328,12 +328,11 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
328 | struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24; | 328 | struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24; |
329 | struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82; | 329 | struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82; |
330 | uint32_t rscn_entry, host_pid; | 330 | uint32_t rscn_entry, host_pid; |
331 | uint8_t rscn_queue_index; | ||
332 | unsigned long flags; | 331 | unsigned long flags; |
333 | 332 | ||
334 | /* Setup to process RIO completion. */ | 333 | /* Setup to process RIO completion. */ |
335 | handle_cnt = 0; | 334 | handle_cnt = 0; |
336 | if (IS_QLA8XXX_TYPE(ha)) | 335 | if (IS_CNA_CAPABLE(ha)) |
337 | goto skip_rio; | 336 | goto skip_rio; |
338 | switch (mb[0]) { | 337 | switch (mb[0]) { |
339 | case MBA_SCSI_COMPLETION: | 338 | case MBA_SCSI_COMPLETION: |
@@ -405,7 +404,8 @@ skip_rio: | |||
405 | break; | 404 | break; |
406 | 405 | ||
407 | case MBA_SYSTEM_ERR: /* System Error */ | 406 | case MBA_SYSTEM_ERR: /* System Error */ |
408 | mbx = IS_QLA81XX(ha) ? RD_REG_WORD(®24->mailbox7) : 0; | 407 | mbx = (IS_QLA81XX(ha) || IS_QLA83XX(ha)) ? |
408 | RD_REG_WORD(®24->mailbox7) : 0; | ||
409 | ql_log(ql_log_warn, vha, 0x5003, | 409 | ql_log(ql_log_warn, vha, 0x5003, |
410 | "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh " | 410 | "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh " |
411 | "mbx7=%xh.\n", mb[1], mb[2], mb[3], mbx); | 411 | "mbx7=%xh.\n", mb[1], mb[2], mb[3], mbx); |
@@ -418,6 +418,7 @@ skip_rio: | |||
418 | "Unrecoverable Hardware Error: adapter " | 418 | "Unrecoverable Hardware Error: adapter " |
419 | "marked OFFLINE!\n"); | 419 | "marked OFFLINE!\n"); |
420 | vha->flags.online = 0; | 420 | vha->flags.online = 0; |
421 | vha->device_flags |= DFLG_DEV_FAILED; | ||
421 | } else { | 422 | } else { |
422 | /* Check to see if MPI timeout occurred */ | 423 | /* Check to see if MPI timeout occurred */ |
423 | if ((mbx & MBX_3) && (ha->flags.port0)) | 424 | if ((mbx & MBX_3) && (ha->flags.port0)) |
@@ -431,6 +432,7 @@ skip_rio: | |||
431 | "Unrecoverable Hardware Error: adapter marked " | 432 | "Unrecoverable Hardware Error: adapter marked " |
432 | "OFFLINE!\n"); | 433 | "OFFLINE!\n"); |
433 | vha->flags.online = 0; | 434 | vha->flags.online = 0; |
435 | vha->device_flags |= DFLG_DEV_FAILED; | ||
434 | } else | 436 | } else |
435 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); | 437 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); |
436 | break; | 438 | break; |
@@ -482,10 +484,10 @@ skip_rio: | |||
482 | ha->link_data_rate = PORT_SPEED_1GB; | 484 | ha->link_data_rate = PORT_SPEED_1GB; |
483 | } else { | 485 | } else { |
484 | link_speed = link_speeds[LS_UNKNOWN]; | 486 | link_speed = link_speeds[LS_UNKNOWN]; |
485 | if (mb[1] < 5) | 487 | if (mb[1] < 6) |
486 | link_speed = link_speeds[mb[1]]; | 488 | link_speed = link_speeds[mb[1]]; |
487 | else if (mb[1] == 0x13) | 489 | else if (mb[1] == 0x13) |
488 | link_speed = link_speeds[5]; | 490 | link_speed = link_speeds[6]; |
489 | ha->link_data_rate = mb[1]; | 491 | ha->link_data_rate = mb[1]; |
490 | } | 492 | } |
491 | 493 | ||
@@ -497,7 +499,8 @@ skip_rio: | |||
497 | break; | 499 | break; |
498 | 500 | ||
499 | case MBA_LOOP_DOWN: /* Loop Down Event */ | 501 | case MBA_LOOP_DOWN: /* Loop Down Event */ |
500 | mbx = IS_QLA81XX(ha) ? RD_REG_WORD(®24->mailbox4) : 0; | 502 | mbx = (IS_QLA81XX(ha) || IS_QLA8031(ha)) |
503 | ? RD_REG_WORD(®24->mailbox4) : 0; | ||
501 | mbx = IS_QLA82XX(ha) ? RD_REG_WORD(®82->mailbox_out[4]) : mbx; | 504 | mbx = IS_QLA82XX(ha) ? RD_REG_WORD(®82->mailbox_out[4]) : mbx; |
502 | ql_dbg(ql_dbg_async, vha, 0x500b, | 505 | ql_dbg(ql_dbg_async, vha, 0x500b, |
503 | "LOOP DOWN detected (%x %x %x %x).\n", | 506 | "LOOP DOWN detected (%x %x %x %x).\n", |
@@ -547,7 +550,7 @@ skip_rio: | |||
547 | if (IS_QLA2100(ha)) | 550 | if (IS_QLA2100(ha)) |
548 | break; | 551 | break; |
549 | 552 | ||
550 | if (IS_QLA8XXX_TYPE(ha)) { | 553 | if (IS_QLA81XX(ha) || IS_QLA82XX(ha) || IS_QLA8031(ha)) { |
551 | ql_dbg(ql_dbg_async, vha, 0x500d, | 554 | ql_dbg(ql_dbg_async, vha, 0x500d, |
552 | "DCBX Completed -- %04x %04x %04x.\n", | 555 | "DCBX Completed -- %04x %04x %04x.\n", |
553 | mb[1], mb[2], mb[3]); | 556 | mb[1], mb[2], mb[3]); |
@@ -681,8 +684,6 @@ skip_rio: | |||
681 | 684 | ||
682 | qla2x00_mark_all_devices_lost(vha, 1); | 685 | qla2x00_mark_all_devices_lost(vha, 1); |
683 | 686 | ||
684 | vha->flags.rscn_queue_overflow = 1; | ||
685 | |||
686 | set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); | 687 | set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); |
687 | set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); | 688 | set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); |
688 | break; | 689 | break; |
@@ -711,15 +712,6 @@ skip_rio: | |||
711 | 712 | ||
712 | /* Ignore reserved bits from RSCN-payload. */ | 713 | /* Ignore reserved bits from RSCN-payload. */ |
713 | rscn_entry = ((mb[1] & 0x3ff) << 16) | mb[2]; | 714 | rscn_entry = ((mb[1] & 0x3ff) << 16) | mb[2]; |
714 | rscn_queue_index = vha->rscn_in_ptr + 1; | ||
715 | if (rscn_queue_index == MAX_RSCN_COUNT) | ||
716 | rscn_queue_index = 0; | ||
717 | if (rscn_queue_index != vha->rscn_out_ptr) { | ||
718 | vha->rscn_queue[vha->rscn_in_ptr] = rscn_entry; | ||
719 | vha->rscn_in_ptr = rscn_queue_index; | ||
720 | } else { | ||
721 | vha->flags.rscn_queue_overflow = 1; | ||
722 | } | ||
723 | 715 | ||
724 | atomic_set(&vha->loop_down_timer, 0); | 716 | atomic_set(&vha->loop_down_timer, 0); |
725 | vha->flags.management_server_logged_in = 0; | 717 | vha->flags.management_server_logged_in = 0; |
@@ -809,6 +801,10 @@ skip_rio: | |||
809 | case MBA_IDC_TIME_EXT: | 801 | case MBA_IDC_TIME_EXT: |
810 | qla81xx_idc_event(vha, mb[0], mb[1]); | 802 | qla81xx_idc_event(vha, mb[0], mb[1]); |
811 | break; | 803 | break; |
804 | default: | ||
805 | ql_dbg(ql_dbg_async, vha, 0x5057, | ||
806 | "Unknown AEN:%04x %04x %04x %04x\n", | ||
807 | mb[0], mb[1], mb[2], mb[3]); | ||
812 | } | 808 | } |
813 | 809 | ||
814 | if (!vha->vp_idx && ha->num_vhosts) | 810 | if (!vha->vp_idx && ha->num_vhosts) |
@@ -845,8 +841,7 @@ qla2x00_process_completed_request(struct scsi_qla_host *vha, | |||
845 | req->outstanding_cmds[index] = NULL; | 841 | req->outstanding_cmds[index] = NULL; |
846 | 842 | ||
847 | /* Save ISP completion status */ | 843 | /* Save ISP completion status */ |
848 | sp->cmd->result = DID_OK << 16; | 844 | sp->done(ha, sp, DID_OK << 16); |
849 | qla2x00_sp_compl(ha, sp); | ||
850 | } else { | 845 | } else { |
851 | ql_log(ql_log_warn, vha, 0x3016, "Invalid SCSI SRB.\n"); | 846 | ql_log(ql_log_warn, vha, 0x3016, "Invalid SCSI SRB.\n"); |
852 | 847 | ||
@@ -903,7 +898,6 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
903 | fc_port_t *fcport; | 898 | fc_port_t *fcport; |
904 | srb_t *sp; | 899 | srb_t *sp; |
905 | struct srb_iocb *lio; | 900 | struct srb_iocb *lio; |
906 | struct srb_ctx *ctx; | ||
907 | uint16_t *data; | 901 | uint16_t *data; |
908 | uint16_t status; | 902 | uint16_t status; |
909 | 903 | ||
@@ -911,9 +905,8 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
911 | if (!sp) | 905 | if (!sp) |
912 | return; | 906 | return; |
913 | 907 | ||
914 | ctx = sp->ctx; | 908 | lio = &sp->u.iocb_cmd; |
915 | lio = ctx->u.iocb_cmd; | 909 | type = sp->name; |
916 | type = ctx->name; | ||
917 | fcport = sp->fcport; | 910 | fcport = sp->fcport; |
918 | data = lio->u.logio.data; | 911 | data = lio->u.logio.data; |
919 | 912 | ||
@@ -937,7 +930,7 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
937 | } | 930 | } |
938 | 931 | ||
939 | status = le16_to_cpu(mbx->status); | 932 | status = le16_to_cpu(mbx->status); |
940 | if (status == 0x30 && ctx->type == SRB_LOGIN_CMD && | 933 | if (status == 0x30 && sp->type == SRB_LOGIN_CMD && |
941 | le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) | 934 | le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) |
942 | status = 0; | 935 | status = 0; |
943 | if (!status && le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) { | 936 | if (!status && le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) { |
@@ -948,7 +941,7 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
948 | le16_to_cpu(mbx->mb1)); | 941 | le16_to_cpu(mbx->mb1)); |
949 | 942 | ||
950 | data[0] = MBS_COMMAND_COMPLETE; | 943 | data[0] = MBS_COMMAND_COMPLETE; |
951 | if (ctx->type == SRB_LOGIN_CMD) { | 944 | if (sp->type == SRB_LOGIN_CMD) { |
952 | fcport->port_type = FCT_TARGET; | 945 | fcport->port_type = FCT_TARGET; |
953 | if (le16_to_cpu(mbx->mb1) & BIT_0) | 946 | if (le16_to_cpu(mbx->mb1) & BIT_0) |
954 | fcport->port_type = FCT_INITIATOR; | 947 | fcport->port_type = FCT_INITIATOR; |
@@ -979,7 +972,7 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
979 | le16_to_cpu(mbx->mb7)); | 972 | le16_to_cpu(mbx->mb7)); |
980 | 973 | ||
981 | logio_done: | 974 | logio_done: |
982 | lio->done(sp); | 975 | sp->done(vha, sp, 0); |
983 | } | 976 | } |
984 | 977 | ||
985 | static void | 978 | static void |
@@ -988,29 +981,18 @@ qla2x00_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
988 | { | 981 | { |
989 | const char func[] = "CT_IOCB"; | 982 | const char func[] = "CT_IOCB"; |
990 | const char *type; | 983 | const char *type; |
991 | struct qla_hw_data *ha = vha->hw; | ||
992 | srb_t *sp; | 984 | srb_t *sp; |
993 | struct srb_ctx *sp_bsg; | ||
994 | struct fc_bsg_job *bsg_job; | 985 | struct fc_bsg_job *bsg_job; |
995 | uint16_t comp_status; | 986 | uint16_t comp_status; |
987 | int res; | ||
996 | 988 | ||
997 | sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); | 989 | sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); |
998 | if (!sp) | 990 | if (!sp) |
999 | return; | 991 | return; |
1000 | 992 | ||
1001 | sp_bsg = sp->ctx; | 993 | bsg_job = sp->u.bsg_job; |
1002 | bsg_job = sp_bsg->u.bsg_job; | ||
1003 | 994 | ||
1004 | type = NULL; | 995 | type = "ct pass-through"; |
1005 | switch (sp_bsg->type) { | ||
1006 | case SRB_CT_CMD: | ||
1007 | type = "ct pass-through"; | ||
1008 | break; | ||
1009 | default: | ||
1010 | ql_log(ql_log_warn, vha, 0x5047, | ||
1011 | "Unrecognized SRB: (%p) type=%d.\n", sp, sp_bsg->type); | ||
1012 | return; | ||
1013 | } | ||
1014 | 996 | ||
1015 | comp_status = le16_to_cpu(pkt->comp_status); | 997 | comp_status = le16_to_cpu(pkt->comp_status); |
1016 | 998 | ||
@@ -1022,7 +1004,7 @@ qla2x00_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1022 | 1004 | ||
1023 | if (comp_status != CS_COMPLETE) { | 1005 | if (comp_status != CS_COMPLETE) { |
1024 | if (comp_status == CS_DATA_UNDERRUN) { | 1006 | if (comp_status == CS_DATA_UNDERRUN) { |
1025 | bsg_job->reply->result = DID_OK << 16; | 1007 | res = DID_OK << 16; |
1026 | bsg_job->reply->reply_payload_rcv_len = | 1008 | bsg_job->reply->reply_payload_rcv_len = |
1027 | le16_to_cpu(((sts_entry_t *)pkt)->rsp_info_len); | 1009 | le16_to_cpu(((sts_entry_t *)pkt)->rsp_info_len); |
1028 | 1010 | ||
@@ -1035,30 +1017,19 @@ qla2x00_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1035 | ql_log(ql_log_warn, vha, 0x5049, | 1017 | ql_log(ql_log_warn, vha, 0x5049, |
1036 | "CT pass-through-%s error " | 1018 | "CT pass-through-%s error " |
1037 | "comp_status-status=0x%x.\n", type, comp_status); | 1019 | "comp_status-status=0x%x.\n", type, comp_status); |
1038 | bsg_job->reply->result = DID_ERROR << 16; | 1020 | res = DID_ERROR << 16; |
1039 | bsg_job->reply->reply_payload_rcv_len = 0; | 1021 | bsg_job->reply->reply_payload_rcv_len = 0; |
1040 | } | 1022 | } |
1041 | ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5035, | 1023 | ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5035, |
1042 | (uint8_t *)pkt, sizeof(*pkt)); | 1024 | (uint8_t *)pkt, sizeof(*pkt)); |
1043 | } else { | 1025 | } else { |
1044 | bsg_job->reply->result = DID_OK << 16; | 1026 | res = DID_OK << 16; |
1045 | bsg_job->reply->reply_payload_rcv_len = | 1027 | bsg_job->reply->reply_payload_rcv_len = |
1046 | bsg_job->reply_payload.payload_len; | 1028 | bsg_job->reply_payload.payload_len; |
1047 | bsg_job->reply_len = 0; | 1029 | bsg_job->reply_len = 0; |
1048 | } | 1030 | } |
1049 | 1031 | ||
1050 | dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, | 1032 | sp->done(vha, sp, res); |
1051 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | ||
1052 | |||
1053 | dma_unmap_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list, | ||
1054 | bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE); | ||
1055 | |||
1056 | if (sp_bsg->type == SRB_ELS_CMD_HST || sp_bsg->type == SRB_CT_CMD) | ||
1057 | kfree(sp->fcport); | ||
1058 | |||
1059 | kfree(sp->ctx); | ||
1060 | mempool_free(sp, ha->srb_mempool); | ||
1061 | bsg_job->job_done(bsg_job); | ||
1062 | } | 1033 | } |
1063 | 1034 | ||
1064 | static void | 1035 | static void |
@@ -1067,22 +1038,20 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1067 | { | 1038 | { |
1068 | const char func[] = "ELS_CT_IOCB"; | 1039 | const char func[] = "ELS_CT_IOCB"; |
1069 | const char *type; | 1040 | const char *type; |
1070 | struct qla_hw_data *ha = vha->hw; | ||
1071 | srb_t *sp; | 1041 | srb_t *sp; |
1072 | struct srb_ctx *sp_bsg; | ||
1073 | struct fc_bsg_job *bsg_job; | 1042 | struct fc_bsg_job *bsg_job; |
1074 | uint16_t comp_status; | 1043 | uint16_t comp_status; |
1075 | uint32_t fw_status[3]; | 1044 | uint32_t fw_status[3]; |
1076 | uint8_t* fw_sts_ptr; | 1045 | uint8_t* fw_sts_ptr; |
1046 | int res; | ||
1077 | 1047 | ||
1078 | sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); | 1048 | sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); |
1079 | if (!sp) | 1049 | if (!sp) |
1080 | return; | 1050 | return; |
1081 | sp_bsg = sp->ctx; | 1051 | bsg_job = sp->u.bsg_job; |
1082 | bsg_job = sp_bsg->u.bsg_job; | ||
1083 | 1052 | ||
1084 | type = NULL; | 1053 | type = NULL; |
1085 | switch (sp_bsg->type) { | 1054 | switch (sp->type) { |
1086 | case SRB_ELS_CMD_RPT: | 1055 | case SRB_ELS_CMD_RPT: |
1087 | case SRB_ELS_CMD_HST: | 1056 | case SRB_ELS_CMD_HST: |
1088 | type = "els"; | 1057 | type = "els"; |
@@ -1091,8 +1060,8 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1091 | type = "ct pass-through"; | 1060 | type = "ct pass-through"; |
1092 | break; | 1061 | break; |
1093 | default: | 1062 | default: |
1094 | ql_log(ql_log_warn, vha, 0x503e, | 1063 | ql_dbg(ql_dbg_user, vha, 0x503e, |
1095 | "Unrecognized SRB: (%p) type=%d.\n", sp, sp_bsg->type); | 1064 | "Unrecognized SRB: (%p) type=%d.\n", sp, sp->type); |
1096 | return; | 1065 | return; |
1097 | } | 1066 | } |
1098 | 1067 | ||
@@ -1108,11 +1077,11 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1108 | 1077 | ||
1109 | if (comp_status != CS_COMPLETE) { | 1078 | if (comp_status != CS_COMPLETE) { |
1110 | if (comp_status == CS_DATA_UNDERRUN) { | 1079 | if (comp_status == CS_DATA_UNDERRUN) { |
1111 | bsg_job->reply->result = DID_OK << 16; | 1080 | res = DID_OK << 16; |
1112 | bsg_job->reply->reply_payload_rcv_len = | 1081 | bsg_job->reply->reply_payload_rcv_len = |
1113 | le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->total_byte_count); | 1082 | le16_to_cpu(((struct els_sts_entry_24xx *)pkt)->total_byte_count); |
1114 | 1083 | ||
1115 | ql_log(ql_log_info, vha, 0x503f, | 1084 | ql_dbg(ql_dbg_user, vha, 0x503f, |
1116 | "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x " | 1085 | "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x " |
1117 | "error subcode 1=0x%x error subcode 2=0x%x total_byte = 0x%x.\n", | 1086 | "error subcode 1=0x%x error subcode 2=0x%x total_byte = 0x%x.\n", |
1118 | type, sp->handle, comp_status, fw_status[1], fw_status[2], | 1087 | type, sp->handle, comp_status, fw_status[1], fw_status[2], |
@@ -1122,7 +1091,7 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1122 | memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); | 1091 | memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); |
1123 | } | 1092 | } |
1124 | else { | 1093 | else { |
1125 | ql_log(ql_log_info, vha, 0x5040, | 1094 | ql_dbg(ql_dbg_user, vha, 0x5040, |
1126 | "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x " | 1095 | "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x " |
1127 | "error subcode 1=0x%x error subcode 2=0x%x.\n", | 1096 | "error subcode 1=0x%x error subcode 2=0x%x.\n", |
1128 | type, sp->handle, comp_status, | 1097 | type, sp->handle, comp_status, |
@@ -1130,32 +1099,21 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1130 | pkt)->error_subcode_1), | 1099 | pkt)->error_subcode_1), |
1131 | le16_to_cpu(((struct els_sts_entry_24xx *) | 1100 | le16_to_cpu(((struct els_sts_entry_24xx *) |
1132 | pkt)->error_subcode_2)); | 1101 | pkt)->error_subcode_2)); |
1133 | bsg_job->reply->result = DID_ERROR << 16; | 1102 | res = DID_ERROR << 16; |
1134 | bsg_job->reply->reply_payload_rcv_len = 0; | 1103 | bsg_job->reply->reply_payload_rcv_len = 0; |
1135 | fw_sts_ptr = ((uint8_t*)bsg_job->req->sense) + sizeof(struct fc_bsg_reply); | 1104 | fw_sts_ptr = ((uint8_t*)bsg_job->req->sense) + sizeof(struct fc_bsg_reply); |
1136 | memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); | 1105 | memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); |
1137 | } | 1106 | } |
1138 | ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5056, | 1107 | ql_dump_buffer(ql_dbg_user + ql_dbg_buffer, vha, 0x5056, |
1139 | (uint8_t *)pkt, sizeof(*pkt)); | 1108 | (uint8_t *)pkt, sizeof(*pkt)); |
1140 | } | 1109 | } |
1141 | else { | 1110 | else { |
1142 | bsg_job->reply->result = DID_OK << 16; | 1111 | res = DID_OK << 16; |
1143 | bsg_job->reply->reply_payload_rcv_len = bsg_job->reply_payload.payload_len; | 1112 | bsg_job->reply->reply_payload_rcv_len = bsg_job->reply_payload.payload_len; |
1144 | bsg_job->reply_len = 0; | 1113 | bsg_job->reply_len = 0; |
1145 | } | 1114 | } |
1146 | 1115 | ||
1147 | dma_unmap_sg(&ha->pdev->dev, | 1116 | sp->done(vha, sp, res); |
1148 | bsg_job->request_payload.sg_list, | ||
1149 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | ||
1150 | dma_unmap_sg(&ha->pdev->dev, | ||
1151 | bsg_job->reply_payload.sg_list, | ||
1152 | bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE); | ||
1153 | if ((sp_bsg->type == SRB_ELS_CMD_HST) || | ||
1154 | (sp_bsg->type == SRB_CT_CMD)) | ||
1155 | kfree(sp->fcport); | ||
1156 | kfree(sp->ctx); | ||
1157 | mempool_free(sp, ha->srb_mempool); | ||
1158 | bsg_job->job_done(bsg_job); | ||
1159 | } | 1117 | } |
1160 | 1118 | ||
1161 | static void | 1119 | static void |
@@ -1167,7 +1125,6 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1167 | fc_port_t *fcport; | 1125 | fc_port_t *fcport; |
1168 | srb_t *sp; | 1126 | srb_t *sp; |
1169 | struct srb_iocb *lio; | 1127 | struct srb_iocb *lio; |
1170 | struct srb_ctx *ctx; | ||
1171 | uint16_t *data; | 1128 | uint16_t *data; |
1172 | uint32_t iop[2]; | 1129 | uint32_t iop[2]; |
1173 | 1130 | ||
@@ -1175,9 +1132,8 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1175 | if (!sp) | 1132 | if (!sp) |
1176 | return; | 1133 | return; |
1177 | 1134 | ||
1178 | ctx = sp->ctx; | 1135 | lio = &sp->u.iocb_cmd; |
1179 | lio = ctx->u.iocb_cmd; | 1136 | type = sp->name; |
1180 | type = ctx->name; | ||
1181 | fcport = sp->fcport; | 1137 | fcport = sp->fcport; |
1182 | data = lio->u.logio.data; | 1138 | data = lio->u.logio.data; |
1183 | 1139 | ||
@@ -1185,7 +1141,7 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1185 | data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ? | 1141 | data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ? |
1186 | QLA_LOGIO_LOGIN_RETRIED : 0; | 1142 | QLA_LOGIO_LOGIN_RETRIED : 0; |
1187 | if (logio->entry_status) { | 1143 | if (logio->entry_status) { |
1188 | ql_log(ql_log_warn, vha, 0x5034, | 1144 | ql_log(ql_log_warn, fcport->vha, 0x5034, |
1189 | "Async-%s error entry - hdl=%x" | 1145 | "Async-%s error entry - hdl=%x" |
1190 | "portid=%02x%02x%02x entry-status=%x.\n", | 1146 | "portid=%02x%02x%02x entry-status=%x.\n", |
1191 | type, sp->handle, fcport->d_id.b.domain, | 1147 | type, sp->handle, fcport->d_id.b.domain, |
@@ -1198,14 +1154,14 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1198 | } | 1154 | } |
1199 | 1155 | ||
1200 | if (le16_to_cpu(logio->comp_status) == CS_COMPLETE) { | 1156 | if (le16_to_cpu(logio->comp_status) == CS_COMPLETE) { |
1201 | ql_dbg(ql_dbg_async, vha, 0x5036, | 1157 | ql_dbg(ql_dbg_async, fcport->vha, 0x5036, |
1202 | "Async-%s complete - hdl=%x portid=%02x%02x%02x " | 1158 | "Async-%s complete - hdl=%x portid=%02x%02x%02x " |
1203 | "iop0=%x.\n", type, sp->handle, fcport->d_id.b.domain, | 1159 | "iop0=%x.\n", type, sp->handle, fcport->d_id.b.domain, |
1204 | fcport->d_id.b.area, fcport->d_id.b.al_pa, | 1160 | fcport->d_id.b.area, fcport->d_id.b.al_pa, |
1205 | le32_to_cpu(logio->io_parameter[0])); | 1161 | le32_to_cpu(logio->io_parameter[0])); |
1206 | 1162 | ||
1207 | data[0] = MBS_COMMAND_COMPLETE; | 1163 | data[0] = MBS_COMMAND_COMPLETE; |
1208 | if (ctx->type != SRB_LOGIN_CMD) | 1164 | if (sp->type != SRB_LOGIN_CMD) |
1209 | goto logio_done; | 1165 | goto logio_done; |
1210 | 1166 | ||
1211 | iop[0] = le32_to_cpu(logio->io_parameter[0]); | 1167 | iop[0] = le32_to_cpu(logio->io_parameter[0]); |
@@ -1239,7 +1195,7 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1239 | break; | 1195 | break; |
1240 | } | 1196 | } |
1241 | 1197 | ||
1242 | ql_dbg(ql_dbg_async, vha, 0x5037, | 1198 | ql_dbg(ql_dbg_async, fcport->vha, 0x5037, |
1243 | "Async-%s failed - hdl=%x portid=%02x%02x%02x comp=%x " | 1199 | "Async-%s failed - hdl=%x portid=%02x%02x%02x comp=%x " |
1244 | "iop0=%x iop1=%x.\n", type, sp->handle, fcport->d_id.b.domain, | 1200 | "iop0=%x iop1=%x.\n", type, sp->handle, fcport->d_id.b.domain, |
1245 | fcport->d_id.b.area, fcport->d_id.b.al_pa, | 1201 | fcport->d_id.b.area, fcport->d_id.b.al_pa, |
@@ -1248,7 +1204,7 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1248 | le32_to_cpu(logio->io_parameter[1])); | 1204 | le32_to_cpu(logio->io_parameter[1])); |
1249 | 1205 | ||
1250 | logio_done: | 1206 | logio_done: |
1251 | lio->done(sp); | 1207 | sp->done(vha, sp, 0); |
1252 | } | 1208 | } |
1253 | 1209 | ||
1254 | static void | 1210 | static void |
@@ -1260,7 +1216,6 @@ qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1260 | fc_port_t *fcport; | 1216 | fc_port_t *fcport; |
1261 | srb_t *sp; | 1217 | srb_t *sp; |
1262 | struct srb_iocb *iocb; | 1218 | struct srb_iocb *iocb; |
1263 | struct srb_ctx *ctx; | ||
1264 | struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk; | 1219 | struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk; |
1265 | int error = 1; | 1220 | int error = 1; |
1266 | 1221 | ||
@@ -1268,30 +1223,29 @@ qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1268 | if (!sp) | 1223 | if (!sp) |
1269 | return; | 1224 | return; |
1270 | 1225 | ||
1271 | ctx = sp->ctx; | 1226 | iocb = &sp->u.iocb_cmd; |
1272 | iocb = ctx->u.iocb_cmd; | 1227 | type = sp->name; |
1273 | type = ctx->name; | ||
1274 | fcport = sp->fcport; | 1228 | fcport = sp->fcport; |
1275 | 1229 | ||
1276 | if (sts->entry_status) { | 1230 | if (sts->entry_status) { |
1277 | ql_log(ql_log_warn, vha, 0x5038, | 1231 | ql_log(ql_log_warn, fcport->vha, 0x5038, |
1278 | "Async-%s error - hdl=%x entry-status(%x).\n", | 1232 | "Async-%s error - hdl=%x entry-status(%x).\n", |
1279 | type, sp->handle, sts->entry_status); | 1233 | type, sp->handle, sts->entry_status); |
1280 | } else if (sts->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { | 1234 | } else if (sts->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { |
1281 | ql_log(ql_log_warn, vha, 0x5039, | 1235 | ql_log(ql_log_warn, fcport->vha, 0x5039, |
1282 | "Async-%s error - hdl=%x completion status(%x).\n", | 1236 | "Async-%s error - hdl=%x completion status(%x).\n", |
1283 | type, sp->handle, sts->comp_status); | 1237 | type, sp->handle, sts->comp_status); |
1284 | } else if (!(le16_to_cpu(sts->scsi_status) & | 1238 | } else if (!(le16_to_cpu(sts->scsi_status) & |
1285 | SS_RESPONSE_INFO_LEN_VALID)) { | 1239 | SS_RESPONSE_INFO_LEN_VALID)) { |
1286 | ql_log(ql_log_warn, vha, 0x503a, | 1240 | ql_log(ql_log_warn, fcport->vha, 0x503a, |
1287 | "Async-%s error - hdl=%x no response info(%x).\n", | 1241 | "Async-%s error - hdl=%x no response info(%x).\n", |
1288 | type, sp->handle, sts->scsi_status); | 1242 | type, sp->handle, sts->scsi_status); |
1289 | } else if (le32_to_cpu(sts->rsp_data_len) < 4) { | 1243 | } else if (le32_to_cpu(sts->rsp_data_len) < 4) { |
1290 | ql_log(ql_log_warn, vha, 0x503b, | 1244 | ql_log(ql_log_warn, fcport->vha, 0x503b, |
1291 | "Async-%s error - hdl=%x not enough response(%d).\n", | 1245 | "Async-%s error - hdl=%x not enough response(%d).\n", |
1292 | type, sp->handle, sts->rsp_data_len); | 1246 | type, sp->handle, sts->rsp_data_len); |
1293 | } else if (sts->data[3]) { | 1247 | } else if (sts->data[3]) { |
1294 | ql_log(ql_log_warn, vha, 0x503c, | 1248 | ql_log(ql_log_warn, fcport->vha, 0x503c, |
1295 | "Async-%s error - hdl=%x response(%x).\n", | 1249 | "Async-%s error - hdl=%x response(%x).\n", |
1296 | type, sp->handle, sts->data[3]); | 1250 | type, sp->handle, sts->data[3]); |
1297 | } else { | 1251 | } else { |
@@ -1304,7 +1258,7 @@ qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1304 | (uint8_t *)sts, sizeof(*sts)); | 1258 | (uint8_t *)sts, sizeof(*sts)); |
1305 | } | 1259 | } |
1306 | 1260 | ||
1307 | iocb->done(sp); | 1261 | sp->done(vha, sp, 0); |
1308 | } | 1262 | } |
1309 | 1263 | ||
1310 | /** | 1264 | /** |
@@ -1390,25 +1344,32 @@ qla2x00_process_response_queue(struct rsp_que *rsp) | |||
1390 | 1344 | ||
1391 | static inline void | 1345 | static inline void |
1392 | qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len, | 1346 | qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len, |
1393 | uint32_t sense_len, struct rsp_que *rsp) | 1347 | uint32_t sense_len, struct rsp_que *rsp, int res) |
1394 | { | 1348 | { |
1395 | struct scsi_qla_host *vha = sp->fcport->vha; | 1349 | struct scsi_qla_host *vha = sp->fcport->vha; |
1396 | struct scsi_cmnd *cp = sp->cmd; | 1350 | struct scsi_cmnd *cp = GET_CMD_SP(sp); |
1351 | uint32_t track_sense_len; | ||
1397 | 1352 | ||
1398 | if (sense_len >= SCSI_SENSE_BUFFERSIZE) | 1353 | if (sense_len >= SCSI_SENSE_BUFFERSIZE) |
1399 | sense_len = SCSI_SENSE_BUFFERSIZE; | 1354 | sense_len = SCSI_SENSE_BUFFERSIZE; |
1400 | 1355 | ||
1401 | sp->request_sense_length = sense_len; | 1356 | SET_CMD_SENSE_LEN(sp, sense_len); |
1402 | sp->request_sense_ptr = cp->sense_buffer; | 1357 | SET_CMD_SENSE_PTR(sp, cp->sense_buffer); |
1403 | if (sp->request_sense_length > par_sense_len) | 1358 | track_sense_len = sense_len; |
1359 | |||
1360 | if (sense_len > par_sense_len) | ||
1404 | sense_len = par_sense_len; | 1361 | sense_len = par_sense_len; |
1405 | 1362 | ||
1406 | memcpy(cp->sense_buffer, sense_data, sense_len); | 1363 | memcpy(cp->sense_buffer, sense_data, sense_len); |
1407 | 1364 | ||
1408 | sp->request_sense_ptr += sense_len; | 1365 | SET_CMD_SENSE_PTR(sp, cp->sense_buffer + sense_len); |
1409 | sp->request_sense_length -= sense_len; | 1366 | track_sense_len -= sense_len; |
1410 | if (sp->request_sense_length != 0) | 1367 | SET_CMD_SENSE_LEN(sp, track_sense_len); |
1368 | |||
1369 | if (track_sense_len != 0) { | ||
1411 | rsp->status_srb = sp; | 1370 | rsp->status_srb = sp; |
1371 | cp->result = res; | ||
1372 | } | ||
1412 | 1373 | ||
1413 | if (sense_len) { | 1374 | if (sense_len) { |
1414 | ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x301c, | 1375 | ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x301c, |
@@ -1436,7 +1397,7 @@ static inline int | |||
1436 | qla2x00_handle_dif_error(srb_t *sp, struct sts_entry_24xx *sts24) | 1397 | qla2x00_handle_dif_error(srb_t *sp, struct sts_entry_24xx *sts24) |
1437 | { | 1398 | { |
1438 | struct scsi_qla_host *vha = sp->fcport->vha; | 1399 | struct scsi_qla_host *vha = sp->fcport->vha; |
1439 | struct scsi_cmnd *cmd = sp->cmd; | 1400 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
1440 | uint8_t *ap = &sts24->data[12]; | 1401 | uint8_t *ap = &sts24->data[12]; |
1441 | uint8_t *ep = &sts24->data[20]; | 1402 | uint8_t *ep = &sts24->data[20]; |
1442 | uint32_t e_ref_tag, a_ref_tag; | 1403 | uint32_t e_ref_tag, a_ref_tag; |
@@ -1580,6 +1541,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
1580 | uint16_t que; | 1541 | uint16_t que; |
1581 | struct req_que *req; | 1542 | struct req_que *req; |
1582 | int logit = 1; | 1543 | int logit = 1; |
1544 | int res = 0; | ||
1583 | 1545 | ||
1584 | sts = (sts_entry_t *) pkt; | 1546 | sts = (sts_entry_t *) pkt; |
1585 | sts24 = (struct sts_entry_24xx *) pkt; | 1547 | sts24 = (struct sts_entry_24xx *) pkt; |
@@ -1619,7 +1581,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
1619 | qla2xxx_wake_dpc(vha); | 1581 | qla2xxx_wake_dpc(vha); |
1620 | return; | 1582 | return; |
1621 | } | 1583 | } |
1622 | cp = sp->cmd; | 1584 | cp = GET_CMD_SP(sp); |
1623 | if (cp == NULL) { | 1585 | if (cp == NULL) { |
1624 | ql_dbg(ql_dbg_io, vha, 0x3018, | 1586 | ql_dbg(ql_dbg_io, vha, 0x3018, |
1625 | "Command already returned (0x%x/%p).\n", | 1587 | "Command already returned (0x%x/%p).\n", |
@@ -1668,11 +1630,11 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
1668 | par_sense_len -= rsp_info_len; | 1630 | par_sense_len -= rsp_info_len; |
1669 | } | 1631 | } |
1670 | if (rsp_info_len > 3 && rsp_info[3]) { | 1632 | if (rsp_info_len > 3 && rsp_info[3]) { |
1671 | ql_dbg(ql_dbg_io, vha, 0x3019, | 1633 | ql_dbg(ql_dbg_io, fcport->vha, 0x3019, |
1672 | "FCP I/O protocol failure (0x%x/0x%x).\n", | 1634 | "FCP I/O protocol failure (0x%x/0x%x).\n", |
1673 | rsp_info_len, rsp_info[3]); | 1635 | rsp_info_len, rsp_info[3]); |
1674 | 1636 | ||
1675 | cp->result = DID_BUS_BUSY << 16; | 1637 | res = DID_BUS_BUSY << 16; |
1676 | goto out; | 1638 | goto out; |
1677 | } | 1639 | } |
1678 | } | 1640 | } |
@@ -1689,7 +1651,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
1689 | case CS_COMPLETE: | 1651 | case CS_COMPLETE: |
1690 | case CS_QUEUE_FULL: | 1652 | case CS_QUEUE_FULL: |
1691 | if (scsi_status == 0) { | 1653 | if (scsi_status == 0) { |
1692 | cp->result = DID_OK << 16; | 1654 | res = DID_OK << 16; |
1693 | break; | 1655 | break; |
1694 | } | 1656 | } |
1695 | if (scsi_status & (SS_RESIDUAL_UNDER | SS_RESIDUAL_OVER)) { | 1657 | if (scsi_status & (SS_RESIDUAL_UNDER | SS_RESIDUAL_OVER)) { |
@@ -1699,19 +1661,19 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
1699 | if (!lscsi_status && | 1661 | if (!lscsi_status && |
1700 | ((unsigned)(scsi_bufflen(cp) - resid) < | 1662 | ((unsigned)(scsi_bufflen(cp) - resid) < |
1701 | cp->underflow)) { | 1663 | cp->underflow)) { |
1702 | ql_dbg(ql_dbg_io, vha, 0x301a, | 1664 | ql_dbg(ql_dbg_io, fcport->vha, 0x301a, |
1703 | "Mid-layer underflow " | 1665 | "Mid-layer underflow " |
1704 | "detected (0x%x of 0x%x bytes).\n", | 1666 | "detected (0x%x of 0x%x bytes).\n", |
1705 | resid, scsi_bufflen(cp)); | 1667 | resid, scsi_bufflen(cp)); |
1706 | 1668 | ||
1707 | cp->result = DID_ERROR << 16; | 1669 | res = DID_ERROR << 16; |
1708 | break; | 1670 | break; |
1709 | } | 1671 | } |
1710 | } | 1672 | } |
1711 | cp->result = DID_OK << 16 | lscsi_status; | 1673 | res = DID_OK << 16 | lscsi_status; |
1712 | 1674 | ||
1713 | if (lscsi_status == SAM_STAT_TASK_SET_FULL) { | 1675 | if (lscsi_status == SAM_STAT_TASK_SET_FULL) { |
1714 | ql_dbg(ql_dbg_io, vha, 0x301b, | 1676 | ql_dbg(ql_dbg_io, fcport->vha, 0x301b, |
1715 | "QUEUE FULL detected.\n"); | 1677 | "QUEUE FULL detected.\n"); |
1716 | break; | 1678 | break; |
1717 | } | 1679 | } |
@@ -1724,7 +1686,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
1724 | break; | 1686 | break; |
1725 | 1687 | ||
1726 | qla2x00_handle_sense(sp, sense_data, par_sense_len, sense_len, | 1688 | qla2x00_handle_sense(sp, sense_data, par_sense_len, sense_len, |
1727 | rsp); | 1689 | rsp, res); |
1728 | break; | 1690 | break; |
1729 | 1691 | ||
1730 | case CS_DATA_UNDERRUN: | 1692 | case CS_DATA_UNDERRUN: |
@@ -1733,36 +1695,36 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
1733 | scsi_set_resid(cp, resid); | 1695 | scsi_set_resid(cp, resid); |
1734 | if (scsi_status & SS_RESIDUAL_UNDER) { | 1696 | if (scsi_status & SS_RESIDUAL_UNDER) { |
1735 | if (IS_FWI2_CAPABLE(ha) && fw_resid_len != resid_len) { | 1697 | if (IS_FWI2_CAPABLE(ha) && fw_resid_len != resid_len) { |
1736 | ql_dbg(ql_dbg_io, vha, 0x301d, | 1698 | ql_dbg(ql_dbg_io, fcport->vha, 0x301d, |
1737 | "Dropped frame(s) detected " | 1699 | "Dropped frame(s) detected " |
1738 | "(0x%x of 0x%x bytes).\n", | 1700 | "(0x%x of 0x%x bytes).\n", |
1739 | resid, scsi_bufflen(cp)); | 1701 | resid, scsi_bufflen(cp)); |
1740 | 1702 | ||
1741 | cp->result = DID_ERROR << 16 | lscsi_status; | 1703 | res = DID_ERROR << 16 | lscsi_status; |
1742 | goto check_scsi_status; | 1704 | goto check_scsi_status; |
1743 | } | 1705 | } |
1744 | 1706 | ||
1745 | if (!lscsi_status && | 1707 | if (!lscsi_status && |
1746 | ((unsigned)(scsi_bufflen(cp) - resid) < | 1708 | ((unsigned)(scsi_bufflen(cp) - resid) < |
1747 | cp->underflow)) { | 1709 | cp->underflow)) { |
1748 | ql_dbg(ql_dbg_io, vha, 0x301e, | 1710 | ql_dbg(ql_dbg_io, fcport->vha, 0x301e, |
1749 | "Mid-layer underflow " | 1711 | "Mid-layer underflow " |
1750 | "detected (0x%x of 0x%x bytes).\n", | 1712 | "detected (0x%x of 0x%x bytes).\n", |
1751 | resid, scsi_bufflen(cp)); | 1713 | resid, scsi_bufflen(cp)); |
1752 | 1714 | ||
1753 | cp->result = DID_ERROR << 16; | 1715 | res = DID_ERROR << 16; |
1754 | break; | 1716 | break; |
1755 | } | 1717 | } |
1756 | } else { | 1718 | } else { |
1757 | ql_dbg(ql_dbg_io, vha, 0x301f, | 1719 | ql_dbg(ql_dbg_io, fcport->vha, 0x301f, |
1758 | "Dropped frame(s) detected (0x%x " | 1720 | "Dropped frame(s) detected (0x%x " |
1759 | "of 0x%x bytes).\n", resid, scsi_bufflen(cp)); | 1721 | "of 0x%x bytes).\n", resid, scsi_bufflen(cp)); |
1760 | 1722 | ||
1761 | cp->result = DID_ERROR << 16 | lscsi_status; | 1723 | res = DID_ERROR << 16 | lscsi_status; |
1762 | goto check_scsi_status; | 1724 | goto check_scsi_status; |
1763 | } | 1725 | } |
1764 | 1726 | ||
1765 | cp->result = DID_OK << 16 | lscsi_status; | 1727 | res = DID_OK << 16 | lscsi_status; |
1766 | logit = 0; | 1728 | logit = 0; |
1767 | 1729 | ||
1768 | check_scsi_status: | 1730 | check_scsi_status: |
@@ -1772,7 +1734,7 @@ check_scsi_status: | |||
1772 | */ | 1734 | */ |
1773 | if (lscsi_status != 0) { | 1735 | if (lscsi_status != 0) { |
1774 | if (lscsi_status == SAM_STAT_TASK_SET_FULL) { | 1736 | if (lscsi_status == SAM_STAT_TASK_SET_FULL) { |
1775 | ql_dbg(ql_dbg_io, vha, 0x3020, | 1737 | ql_dbg(ql_dbg_io, fcport->vha, 0x3020, |
1776 | "QUEUE FULL detected.\n"); | 1738 | "QUEUE FULL detected.\n"); |
1777 | logit = 1; | 1739 | logit = 1; |
1778 | break; | 1740 | break; |
@@ -1785,7 +1747,7 @@ check_scsi_status: | |||
1785 | break; | 1747 | break; |
1786 | 1748 | ||
1787 | qla2x00_handle_sense(sp, sense_data, par_sense_len, | 1749 | qla2x00_handle_sense(sp, sense_data, par_sense_len, |
1788 | sense_len, rsp); | 1750 | sense_len, rsp, res); |
1789 | } | 1751 | } |
1790 | break; | 1752 | break; |
1791 | 1753 | ||
@@ -1802,7 +1764,7 @@ check_scsi_status: | |||
1802 | * while we try to recover so instruct the mid layer | 1764 | * while we try to recover so instruct the mid layer |
1803 | * to requeue until the class decides how to handle this. | 1765 | * to requeue until the class decides how to handle this. |
1804 | */ | 1766 | */ |
1805 | cp->result = DID_TRANSPORT_DISRUPTED << 16; | 1767 | res = DID_TRANSPORT_DISRUPTED << 16; |
1806 | 1768 | ||
1807 | if (comp_status == CS_TIMEOUT) { | 1769 | if (comp_status == CS_TIMEOUT) { |
1808 | if (IS_FWI2_CAPABLE(ha)) | 1770 | if (IS_FWI2_CAPABLE(ha)) |
@@ -1812,7 +1774,7 @@ check_scsi_status: | |||
1812 | break; | 1774 | break; |
1813 | } | 1775 | } |
1814 | 1776 | ||
1815 | ql_dbg(ql_dbg_io, vha, 0x3021, | 1777 | ql_dbg(ql_dbg_io, fcport->vha, 0x3021, |
1816 | "Port down status: port-state=0x%x.\n", | 1778 | "Port down status: port-state=0x%x.\n", |
1817 | atomic_read(&fcport->state)); | 1779 | atomic_read(&fcport->state)); |
1818 | 1780 | ||
@@ -1821,25 +1783,25 @@ check_scsi_status: | |||
1821 | break; | 1783 | break; |
1822 | 1784 | ||
1823 | case CS_ABORTED: | 1785 | case CS_ABORTED: |
1824 | cp->result = DID_RESET << 16; | 1786 | res = DID_RESET << 16; |
1825 | break; | 1787 | break; |
1826 | 1788 | ||
1827 | case CS_DIF_ERROR: | 1789 | case CS_DIF_ERROR: |
1828 | logit = qla2x00_handle_dif_error(sp, sts24); | 1790 | logit = qla2x00_handle_dif_error(sp, sts24); |
1829 | break; | 1791 | break; |
1830 | default: | 1792 | default: |
1831 | cp->result = DID_ERROR << 16; | 1793 | res = DID_ERROR << 16; |
1832 | break; | 1794 | break; |
1833 | } | 1795 | } |
1834 | 1796 | ||
1835 | out: | 1797 | out: |
1836 | if (logit) | 1798 | if (logit) |
1837 | ql_dbg(ql_dbg_io, vha, 0x3022, | 1799 | ql_dbg(ql_dbg_io, fcport->vha, 0x3022, |
1838 | "FCP command status: 0x%x-0x%x (0x%x) " | 1800 | "FCP command status: 0x%x-0x%x (0x%x) " |
1839 | "nexus=%ld:%d:%d portid=%02x%02x%02x oxid=0x%x " | 1801 | "nexus=%ld:%d:%d portid=%02x%02x%02x oxid=0x%x " |
1840 | "cdb=%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x len=0x%x " | 1802 | "cdb=%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x len=0x%x " |
1841 | "rsp_info=0x%x resid=0x%x fw_resid=0x%x.\n", | 1803 | "rsp_info=0x%x resid=0x%x fw_resid=0x%x.\n", |
1842 | comp_status, scsi_status, cp->result, vha->host_no, | 1804 | comp_status, scsi_status, res, vha->host_no, |
1843 | cp->device->id, cp->device->lun, fcport->d_id.b.domain, | 1805 | cp->device->id, cp->device->lun, fcport->d_id.b.domain, |
1844 | fcport->d_id.b.area, fcport->d_id.b.al_pa, ox_id, | 1806 | fcport->d_id.b.area, fcport->d_id.b.al_pa, ox_id, |
1845 | cp->cmnd[0], cp->cmnd[1], cp->cmnd[2], cp->cmnd[3], | 1807 | cp->cmnd[0], cp->cmnd[1], cp->cmnd[2], cp->cmnd[3], |
@@ -1848,7 +1810,7 @@ out: | |||
1848 | resid_len, fw_resid_len); | 1810 | resid_len, fw_resid_len); |
1849 | 1811 | ||
1850 | if (rsp->status_srb == NULL) | 1812 | if (rsp->status_srb == NULL) |
1851 | qla2x00_sp_compl(ha, sp); | 1813 | sp->done(ha, sp, res); |
1852 | } | 1814 | } |
1853 | 1815 | ||
1854 | /** | 1816 | /** |
@@ -1861,84 +1823,52 @@ out: | |||
1861 | static void | 1823 | static void |
1862 | qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt) | 1824 | qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt) |
1863 | { | 1825 | { |
1864 | uint8_t sense_sz = 0; | 1826 | uint8_t sense_sz = 0; |
1865 | struct qla_hw_data *ha = rsp->hw; | 1827 | struct qla_hw_data *ha = rsp->hw; |
1866 | struct scsi_qla_host *vha = pci_get_drvdata(ha->pdev); | 1828 | struct scsi_qla_host *vha = pci_get_drvdata(ha->pdev); |
1867 | srb_t *sp = rsp->status_srb; | 1829 | srb_t *sp = rsp->status_srb; |
1868 | struct scsi_cmnd *cp; | 1830 | struct scsi_cmnd *cp; |
1831 | uint32_t sense_len; | ||
1832 | uint8_t *sense_ptr; | ||
1869 | 1833 | ||
1870 | if (sp != NULL && sp->request_sense_length != 0) { | 1834 | if (!sp || !GET_CMD_SENSE_LEN(sp)) |
1871 | cp = sp->cmd; | 1835 | return; |
1872 | if (cp == NULL) { | ||
1873 | ql_log(ql_log_warn, vha, 0x3025, | ||
1874 | "cmd is NULL: already returned to OS (sp=%p).\n", | ||
1875 | sp); | ||
1876 | 1836 | ||
1877 | rsp->status_srb = NULL; | 1837 | sense_len = GET_CMD_SENSE_LEN(sp); |
1878 | return; | 1838 | sense_ptr = GET_CMD_SENSE_PTR(sp); |
1879 | } | ||
1880 | 1839 | ||
1881 | if (sp->request_sense_length > sizeof(pkt->data)) { | 1840 | cp = GET_CMD_SP(sp); |
1882 | sense_sz = sizeof(pkt->data); | 1841 | if (cp == NULL) { |
1883 | } else { | 1842 | ql_log(ql_log_warn, vha, 0x3025, |
1884 | sense_sz = sp->request_sense_length; | 1843 | "cmd is NULL: already returned to OS (sp=%p).\n", sp); |
1885 | } | ||
1886 | 1844 | ||
1887 | /* Move sense data. */ | 1845 | rsp->status_srb = NULL; |
1888 | if (IS_FWI2_CAPABLE(ha)) | 1846 | return; |
1889 | host_to_fcp_swap(pkt->data, sizeof(pkt->data)); | ||
1890 | memcpy(sp->request_sense_ptr, pkt->data, sense_sz); | ||
1891 | ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x302c, | ||
1892 | sp->request_sense_ptr, sense_sz); | ||
1893 | |||
1894 | sp->request_sense_ptr += sense_sz; | ||
1895 | sp->request_sense_length -= sense_sz; | ||
1896 | |||
1897 | /* Place command on done queue. */ | ||
1898 | if (sp->request_sense_length == 0) { | ||
1899 | rsp->status_srb = NULL; | ||
1900 | qla2x00_sp_compl(ha, sp); | ||
1901 | } | ||
1902 | } | 1847 | } |
1903 | } | ||
1904 | 1848 | ||
1905 | static int | 1849 | if (sense_len > sizeof(pkt->data)) |
1906 | qla2x00_free_sp_ctx(scsi_qla_host_t *vha, srb_t *sp) | 1850 | sense_sz = sizeof(pkt->data); |
1907 | { | 1851 | else |
1908 | struct qla_hw_data *ha = vha->hw; | 1852 | sense_sz = sense_len; |
1909 | struct srb_ctx *ctx; | ||
1910 | 1853 | ||
1911 | if (!sp->ctx) | 1854 | /* Move sense data. */ |
1912 | return 1; | 1855 | if (IS_FWI2_CAPABLE(ha)) |
1856 | host_to_fcp_swap(pkt->data, sizeof(pkt->data)); | ||
1857 | memcpy(sense_ptr, pkt->data, sense_sz); | ||
1858 | ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x302c, | ||
1859 | sense_ptr, sense_sz); | ||
1913 | 1860 | ||
1914 | ctx = sp->ctx; | 1861 | sense_len -= sense_sz; |
1862 | sense_ptr += sense_sz; | ||
1915 | 1863 | ||
1916 | if (ctx->type == SRB_LOGIN_CMD || | 1864 | SET_CMD_SENSE_PTR(sp, sense_ptr); |
1917 | ctx->type == SRB_LOGOUT_CMD || | 1865 | SET_CMD_SENSE_LEN(sp, sense_len); |
1918 | ctx->type == SRB_TM_CMD) { | 1866 | |
1919 | ctx->u.iocb_cmd->done(sp); | 1867 | /* Place command on done queue. */ |
1920 | return 0; | 1868 | if (sense_len == 0) { |
1921 | } else if (ctx->type == SRB_ADISC_CMD) { | 1869 | rsp->status_srb = NULL; |
1922 | ctx->u.iocb_cmd->free(sp); | 1870 | sp->done(ha, sp, cp->result); |
1923 | return 0; | ||
1924 | } else { | ||
1925 | struct fc_bsg_job *bsg_job; | ||
1926 | |||
1927 | bsg_job = ctx->u.bsg_job; | ||
1928 | if (ctx->type == SRB_ELS_CMD_HST || | ||
1929 | ctx->type == SRB_CT_CMD) | ||
1930 | kfree(sp->fcport); | ||
1931 | |||
1932 | bsg_job->reply->reply_data.ctels_reply.status = | ||
1933 | FC_CTELS_STATUS_OK; | ||
1934 | bsg_job->reply->result = DID_ERROR << 16; | ||
1935 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
1936 | kfree(sp->ctx); | ||
1937 | mempool_free(sp, ha->srb_mempool); | ||
1938 | bsg_job->job_done(bsg_job); | ||
1939 | return 0; | ||
1940 | } | 1871 | } |
1941 | return 1; | ||
1942 | } | 1872 | } |
1943 | 1873 | ||
1944 | /** | 1874 | /** |
@@ -1953,53 +1883,34 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt) | |||
1953 | struct qla_hw_data *ha = vha->hw; | 1883 | struct qla_hw_data *ha = vha->hw; |
1954 | const char func[] = "ERROR-IOCB"; | 1884 | const char func[] = "ERROR-IOCB"; |
1955 | uint16_t que = MSW(pkt->handle); | 1885 | uint16_t que = MSW(pkt->handle); |
1956 | struct req_que *req = ha->req_q_map[que]; | 1886 | struct req_que *req = NULL; |
1957 | 1887 | int res = DID_ERROR << 16; | |
1958 | if (pkt->entry_status & RF_INV_E_ORDER) | 1888 | |
1959 | ql_dbg(ql_dbg_async, vha, 0x502a, | 1889 | ql_dbg(ql_dbg_async, vha, 0x502a, |
1960 | "Invalid Entry Order.\n"); | 1890 | "type of error status in response: 0x%x\n", pkt->entry_status); |
1961 | else if (pkt->entry_status & RF_INV_E_COUNT) | 1891 | |
1962 | ql_dbg(ql_dbg_async, vha, 0x502b, | 1892 | if (que >= ha->max_req_queues || !ha->req_q_map[que]) |
1963 | "Invalid Entry Count.\n"); | 1893 | goto fatal; |
1964 | else if (pkt->entry_status & RF_INV_E_PARAM) | 1894 | |
1965 | ql_dbg(ql_dbg_async, vha, 0x502c, | 1895 | req = ha->req_q_map[que]; |
1966 | "Invalid Entry Parameter.\n"); | 1896 | |
1967 | else if (pkt->entry_status & RF_INV_E_TYPE) | 1897 | if (pkt->entry_status & RF_BUSY) |
1968 | ql_dbg(ql_dbg_async, vha, 0x502d, | 1898 | res = DID_BUS_BUSY << 16; |
1969 | "Invalid Entry Type.\n"); | ||
1970 | else if (pkt->entry_status & RF_BUSY) | ||
1971 | ql_dbg(ql_dbg_async, vha, 0x502e, | ||
1972 | "Busy.\n"); | ||
1973 | else | ||
1974 | ql_dbg(ql_dbg_async, vha, 0x502f, | ||
1975 | "UNKNOWN flag error.\n"); | ||
1976 | 1899 | ||
1977 | sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); | 1900 | sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); |
1978 | if (sp) { | 1901 | if (sp) { |
1979 | if (qla2x00_free_sp_ctx(vha, sp)) { | 1902 | sp->done(ha, sp, res); |
1980 | if (pkt->entry_status & | 1903 | return; |
1981 | (RF_INV_E_ORDER | RF_INV_E_COUNT | | ||
1982 | RF_INV_E_PARAM | RF_INV_E_TYPE)) { | ||
1983 | sp->cmd->result = DID_ERROR << 16; | ||
1984 | } else if (pkt->entry_status & RF_BUSY) { | ||
1985 | sp->cmd->result = DID_BUS_BUSY << 16; | ||
1986 | } else { | ||
1987 | sp->cmd->result = DID_ERROR << 16; | ||
1988 | } | ||
1989 | qla2x00_sp_compl(ha, sp); | ||
1990 | } | ||
1991 | } else if (pkt->entry_type == COMMAND_A64_TYPE || pkt->entry_type == | ||
1992 | COMMAND_TYPE || pkt->entry_type == COMMAND_TYPE_7 | ||
1993 | || pkt->entry_type == COMMAND_TYPE_6) { | ||
1994 | ql_log(ql_log_warn, vha, 0x5030, | ||
1995 | "Error entry - invalid handle.\n"); | ||
1996 | |||
1997 | if (IS_QLA82XX(ha)) | ||
1998 | set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); | ||
1999 | else | ||
2000 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); | ||
2001 | qla2xxx_wake_dpc(vha); | ||
2002 | } | 1904 | } |
1905 | fatal: | ||
1906 | ql_log(ql_log_warn, vha, 0x5030, | ||
1907 | "Error entry - invalid handle/queue.\n"); | ||
1908 | |||
1909 | if (IS_QLA82XX(ha)) | ||
1910 | set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); | ||
1911 | else | ||
1912 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); | ||
1913 | qla2xxx_wake_dpc(vha); | ||
2003 | } | 1914 | } |
2004 | 1915 | ||
2005 | /** | 1916 | /** |
@@ -2127,7 +2038,7 @@ qla2xxx_check_risc_status(scsi_qla_host_t *vha) | |||
2127 | struct qla_hw_data *ha = vha->hw; | 2038 | struct qla_hw_data *ha = vha->hw; |
2128 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | 2039 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
2129 | 2040 | ||
2130 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) | 2041 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha)) |
2131 | return; | 2042 | return; |
2132 | 2043 | ||
2133 | rval = QLA_SUCCESS; | 2044 | rval = QLA_SUCCESS; |
@@ -2168,7 +2079,7 @@ done: | |||
2168 | } | 2079 | } |
2169 | 2080 | ||
2170 | /** | 2081 | /** |
2171 | * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP63xx. | 2082 | * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP24xx. |
2172 | * @irq: | 2083 | * @irq: |
2173 | * @dev_id: SCSI driver HA context | 2084 | * @dev_id: SCSI driver HA context |
2174 | * | 2085 | * |
@@ -2192,8 +2103,8 @@ qla24xx_intr_handler(int irq, void *dev_id) | |||
2192 | 2103 | ||
2193 | rsp = (struct rsp_que *) dev_id; | 2104 | rsp = (struct rsp_que *) dev_id; |
2194 | if (!rsp) { | 2105 | if (!rsp) { |
2195 | printk(KERN_INFO | 2106 | ql_log(ql_log_info, NULL, 0x5059, |
2196 | "%s(): NULL response queue pointer.\n", __func__); | 2107 | "%s: NULL response queue pointer.\n", __func__); |
2197 | return IRQ_NONE; | 2108 | return IRQ_NONE; |
2198 | } | 2109 | } |
2199 | 2110 | ||
@@ -2276,8 +2187,8 @@ qla24xx_msix_rsp_q(int irq, void *dev_id) | |||
2276 | 2187 | ||
2277 | rsp = (struct rsp_que *) dev_id; | 2188 | rsp = (struct rsp_que *) dev_id; |
2278 | if (!rsp) { | 2189 | if (!rsp) { |
2279 | printk(KERN_INFO | 2190 | ql_log(ql_log_info, NULL, 0x505a, |
2280 | "%s(): NULL response queue pointer.\n", __func__); | 2191 | "%s: NULL response queue pointer.\n", __func__); |
2281 | return IRQ_NONE; | 2192 | return IRQ_NONE; |
2282 | } | 2193 | } |
2283 | ha = rsp->hw; | 2194 | ha = rsp->hw; |
@@ -2306,8 +2217,8 @@ qla25xx_msix_rsp_q(int irq, void *dev_id) | |||
2306 | 2217 | ||
2307 | rsp = (struct rsp_que *) dev_id; | 2218 | rsp = (struct rsp_que *) dev_id; |
2308 | if (!rsp) { | 2219 | if (!rsp) { |
2309 | printk(KERN_INFO | 2220 | ql_log(ql_log_info, NULL, 0x505b, |
2310 | "%s(): NULL response queue pointer.\n", __func__); | 2221 | "%s: NULL response queue pointer.\n", __func__); |
2311 | return IRQ_NONE; | 2222 | return IRQ_NONE; |
2312 | } | 2223 | } |
2313 | ha = rsp->hw; | 2224 | ha = rsp->hw; |
@@ -2340,8 +2251,8 @@ qla24xx_msix_default(int irq, void *dev_id) | |||
2340 | 2251 | ||
2341 | rsp = (struct rsp_que *) dev_id; | 2252 | rsp = (struct rsp_que *) dev_id; |
2342 | if (!rsp) { | 2253 | if (!rsp) { |
2343 | printk(KERN_INFO | 2254 | ql_log(ql_log_info, NULL, 0x505c, |
2344 | "%s(): NULL response queue pointer.\n", __func__); | 2255 | "%s: NULL response queue pointer.\n", __func__); |
2345 | return IRQ_NONE; | 2256 | return IRQ_NONE; |
2346 | } | 2257 | } |
2347 | ha = rsp->hw; | 2258 | ha = rsp->hw; |
@@ -2530,8 +2441,14 @@ msix_failed: | |||
2530 | } | 2441 | } |
2531 | 2442 | ||
2532 | /* Enable MSI-X vector for response queue update for queue 0 */ | 2443 | /* Enable MSI-X vector for response queue update for queue 0 */ |
2533 | if (ha->mqiobase && (ha->max_rsp_queues > 1 || ha->max_req_queues > 1)) | 2444 | if (IS_QLA83XX(ha)) { |
2534 | ha->mqenable = 1; | 2445 | if (ha->msixbase && ha->mqiobase && |
2446 | (ha->max_rsp_queues > 1 || ha->max_req_queues > 1)) | ||
2447 | ha->mqenable = 1; | ||
2448 | } else | ||
2449 | if (ha->mqiobase | ||
2450 | && (ha->max_rsp_queues > 1 || ha->max_req_queues > 1)) | ||
2451 | ha->mqenable = 1; | ||
2535 | ql_dbg(ql_dbg_multiq, vha, 0xc005, | 2452 | ql_dbg(ql_dbg_multiq, vha, 0xc005, |
2536 | "mqiobase=%p, max_rsp_queues=%d, max_req_queues=%d.\n", | 2453 | "mqiobase=%p, max_rsp_queues=%d, max_req_queues=%d.\n", |
2537 | ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues); | 2454 | ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues); |
@@ -2552,8 +2469,8 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp) | |||
2552 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); | 2469 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); |
2553 | 2470 | ||
2554 | /* If possible, enable MSI-X. */ | 2471 | /* If possible, enable MSI-X. */ |
2555 | if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && | 2472 | if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) && |
2556 | !IS_QLA8432(ha) && !IS_QLA8XXX_TYPE(ha)) | 2473 | !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha)) |
2557 | goto skip_msi; | 2474 | goto skip_msi; |
2558 | 2475 | ||
2559 | if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP && | 2476 | if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP && |
@@ -2615,7 +2532,7 @@ clear_risc_ints: | |||
2615 | * FIXME: Noted that 8014s were being dropped during NK testing. | 2532 | * FIXME: Noted that 8014s were being dropped during NK testing. |
2616 | * Timing deltas during MSI-X/INTa transitions? | 2533 | * Timing deltas during MSI-X/INTa transitions? |
2617 | */ | 2534 | */ |
2618 | if (IS_QLA81XX(ha) || IS_QLA82XX(ha)) | 2535 | if (IS_QLA81XX(ha) || IS_QLA82XX(ha) || IS_QLA83XX(ha)) |
2619 | goto fail; | 2536 | goto fail; |
2620 | spin_lock_irq(&ha->hardware_lock); | 2537 | spin_lock_irq(&ha->hardware_lock); |
2621 | if (IS_FWI2_CAPABLE(ha)) { | 2538 | if (IS_FWI2_CAPABLE(ha)) { |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 08f1d01bdc1..b4a23394a7b 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -46,17 +46,17 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
46 | struct qla_hw_data *ha = vha->hw; | 46 | struct qla_hw_data *ha = vha->hw; |
47 | scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); | 47 | scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); |
48 | 48 | ||
49 | ql_dbg(ql_dbg_mbx, base_vha, 0x1000, "Entered %s.\n", __func__); | 49 | ql_dbg(ql_dbg_mbx, vha, 0x1000, "Entered %s.\n", __func__); |
50 | 50 | ||
51 | if (ha->pdev->error_state > pci_channel_io_frozen) { | 51 | if (ha->pdev->error_state > pci_channel_io_frozen) { |
52 | ql_log(ql_log_warn, base_vha, 0x1001, | 52 | ql_log(ql_log_warn, vha, 0x1001, |
53 | "error_state is greater than pci_channel_io_frozen, " | 53 | "error_state is greater than pci_channel_io_frozen, " |
54 | "exiting.\n"); | 54 | "exiting.\n"); |
55 | return QLA_FUNCTION_TIMEOUT; | 55 | return QLA_FUNCTION_TIMEOUT; |
56 | } | 56 | } |
57 | 57 | ||
58 | if (vha->device_flags & DFLG_DEV_FAILED) { | 58 | if (vha->device_flags & DFLG_DEV_FAILED) { |
59 | ql_log(ql_log_warn, base_vha, 0x1002, | 59 | ql_log(ql_log_warn, vha, 0x1002, |
60 | "Device in failed state, exiting.\n"); | 60 | "Device in failed state, exiting.\n"); |
61 | return QLA_FUNCTION_TIMEOUT; | 61 | return QLA_FUNCTION_TIMEOUT; |
62 | } | 62 | } |
@@ -69,7 +69,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
69 | 69 | ||
70 | 70 | ||
71 | if (ha->flags.pci_channel_io_perm_failure) { | 71 | if (ha->flags.pci_channel_io_perm_failure) { |
72 | ql_log(ql_log_warn, base_vha, 0x1003, | 72 | ql_log(ql_log_warn, vha, 0x1003, |
73 | "Perm failure on EEH timeout MBX, exiting.\n"); | 73 | "Perm failure on EEH timeout MBX, exiting.\n"); |
74 | return QLA_FUNCTION_TIMEOUT; | 74 | return QLA_FUNCTION_TIMEOUT; |
75 | } | 75 | } |
@@ -77,7 +77,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
77 | if (ha->flags.isp82xx_fw_hung) { | 77 | if (ha->flags.isp82xx_fw_hung) { |
78 | /* Setting Link-Down error */ | 78 | /* Setting Link-Down error */ |
79 | mcp->mb[0] = MBS_LINK_DOWN_ERROR; | 79 | mcp->mb[0] = MBS_LINK_DOWN_ERROR; |
80 | ql_log(ql_log_warn, base_vha, 0x1004, | 80 | ql_log(ql_log_warn, vha, 0x1004, |
81 | "FW hung = %d.\n", ha->flags.isp82xx_fw_hung); | 81 | "FW hung = %d.\n", ha->flags.isp82xx_fw_hung); |
82 | return QLA_FUNCTION_TIMEOUT; | 82 | return QLA_FUNCTION_TIMEOUT; |
83 | } | 83 | } |
@@ -89,8 +89,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
89 | */ | 89 | */ |
90 | if (!wait_for_completion_timeout(&ha->mbx_cmd_comp, mcp->tov * HZ)) { | 90 | if (!wait_for_completion_timeout(&ha->mbx_cmd_comp, mcp->tov * HZ)) { |
91 | /* Timeout occurred. Return error. */ | 91 | /* Timeout occurred. Return error. */ |
92 | ql_log(ql_log_warn, base_vha, 0x1005, | 92 | ql_log(ql_log_warn, vha, 0x1005, |
93 | "Cmd access timeout, Exiting.\n"); | 93 | "Cmd access timeout, cmd=0x%x, Exiting.\n", |
94 | mcp->mb[0]); | ||
94 | return QLA_FUNCTION_TIMEOUT; | 95 | return QLA_FUNCTION_TIMEOUT; |
95 | } | 96 | } |
96 | 97 | ||
@@ -98,7 +99,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
98 | /* Save mailbox command for debug */ | 99 | /* Save mailbox command for debug */ |
99 | ha->mcp = mcp; | 100 | ha->mcp = mcp; |
100 | 101 | ||
101 | ql_dbg(ql_dbg_mbx, base_vha, 0x1006, | 102 | ql_dbg(ql_dbg_mbx, vha, 0x1006, |
102 | "Prepare to issue mbox cmd=0x%x.\n", mcp->mb[0]); | 103 | "Prepare to issue mbox cmd=0x%x.\n", mcp->mb[0]); |
103 | 104 | ||
104 | spin_lock_irqsave(&ha->hardware_lock, flags); | 105 | spin_lock_irqsave(&ha->hardware_lock, flags); |
@@ -127,28 +128,28 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
127 | iptr++; | 128 | iptr++; |
128 | } | 129 | } |
129 | 130 | ||
130 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1111, | 131 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1111, |
131 | "Loaded MBX registers (displayed in bytes) =.\n"); | 132 | "Loaded MBX registers (displayed in bytes) =.\n"); |
132 | ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1112, | 133 | ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1112, |
133 | (uint8_t *)mcp->mb, 16); | 134 | (uint8_t *)mcp->mb, 16); |
134 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1113, | 135 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1113, |
135 | ".\n"); | 136 | ".\n"); |
136 | ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1114, | 137 | ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1114, |
137 | ((uint8_t *)mcp->mb + 0x10), 16); | 138 | ((uint8_t *)mcp->mb + 0x10), 16); |
138 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1115, | 139 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1115, |
139 | ".\n"); | 140 | ".\n"); |
140 | ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1116, | 141 | ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1116, |
141 | ((uint8_t *)mcp->mb + 0x20), 8); | 142 | ((uint8_t *)mcp->mb + 0x20), 8); |
142 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1117, | 143 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1117, |
143 | "I/O Address = %p.\n", optr); | 144 | "I/O Address = %p.\n", optr); |
144 | ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x100e); | 145 | ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, vha, 0x100e); |
145 | 146 | ||
146 | /* Issue set host interrupt command to send cmd out. */ | 147 | /* Issue set host interrupt command to send cmd out. */ |
147 | ha->flags.mbox_int = 0; | 148 | ha->flags.mbox_int = 0; |
148 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); | 149 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); |
149 | 150 | ||
150 | /* Unlock mbx registers and wait for interrupt */ | 151 | /* Unlock mbx registers and wait for interrupt */ |
151 | ql_dbg(ql_dbg_mbx, base_vha, 0x100f, | 152 | ql_dbg(ql_dbg_mbx, vha, 0x100f, |
152 | "Going to unlock irq & waiting for interrupts. " | 153 | "Going to unlock irq & waiting for interrupts. " |
153 | "jiffies=%lx.\n", jiffies); | 154 | "jiffies=%lx.\n", jiffies); |
154 | 155 | ||
@@ -163,7 +164,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
163 | spin_unlock_irqrestore(&ha->hardware_lock, | 164 | spin_unlock_irqrestore(&ha->hardware_lock, |
164 | flags); | 165 | flags); |
165 | ha->flags.mbox_busy = 0; | 166 | ha->flags.mbox_busy = 0; |
166 | ql_dbg(ql_dbg_mbx, base_vha, 0x1010, | 167 | ql_dbg(ql_dbg_mbx, vha, 0x1010, |
167 | "Pending mailbox timeout, exiting.\n"); | 168 | "Pending mailbox timeout, exiting.\n"); |
168 | rval = QLA_FUNCTION_TIMEOUT; | 169 | rval = QLA_FUNCTION_TIMEOUT; |
169 | goto premature_exit; | 170 | goto premature_exit; |
@@ -180,7 +181,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
180 | clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); | 181 | clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); |
181 | 182 | ||
182 | } else { | 183 | } else { |
183 | ql_dbg(ql_dbg_mbx, base_vha, 0x1011, | 184 | ql_dbg(ql_dbg_mbx, vha, 0x1011, |
184 | "Cmd=%x Polling Mode.\n", command); | 185 | "Cmd=%x Polling Mode.\n", command); |
185 | 186 | ||
186 | if (IS_QLA82XX(ha)) { | 187 | if (IS_QLA82XX(ha)) { |
@@ -189,7 +190,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
189 | spin_unlock_irqrestore(&ha->hardware_lock, | 190 | spin_unlock_irqrestore(&ha->hardware_lock, |
190 | flags); | 191 | flags); |
191 | ha->flags.mbox_busy = 0; | 192 | ha->flags.mbox_busy = 0; |
192 | ql_dbg(ql_dbg_mbx, base_vha, 0x1012, | 193 | ql_dbg(ql_dbg_mbx, vha, 0x1012, |
193 | "Pending mailbox timeout, exiting.\n"); | 194 | "Pending mailbox timeout, exiting.\n"); |
194 | rval = QLA_FUNCTION_TIMEOUT; | 195 | rval = QLA_FUNCTION_TIMEOUT; |
195 | goto premature_exit; | 196 | goto premature_exit; |
@@ -214,7 +215,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
214 | command == MBC_LOAD_RISC_RAM_EXTENDED)) | 215 | command == MBC_LOAD_RISC_RAM_EXTENDED)) |
215 | msleep(10); | 216 | msleep(10); |
216 | } /* while */ | 217 | } /* while */ |
217 | ql_dbg(ql_dbg_mbx, base_vha, 0x1013, | 218 | ql_dbg(ql_dbg_mbx, vha, 0x1013, |
218 | "Waited %d sec.\n", | 219 | "Waited %d sec.\n", |
219 | (uint)((jiffies - (wait_time - (mcp->tov * HZ)))/HZ)); | 220 | (uint)((jiffies - (wait_time - (mcp->tov * HZ)))/HZ)); |
220 | } | 221 | } |
@@ -223,7 +224,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
223 | if (ha->flags.mbox_int) { | 224 | if (ha->flags.mbox_int) { |
224 | uint16_t *iptr2; | 225 | uint16_t *iptr2; |
225 | 226 | ||
226 | ql_dbg(ql_dbg_mbx, base_vha, 0x1014, | 227 | ql_dbg(ql_dbg_mbx, vha, 0x1014, |
227 | "Cmd=%x completed.\n", command); | 228 | "Cmd=%x completed.\n", command); |
228 | 229 | ||
229 | /* Got interrupt. Clear the flag. */ | 230 | /* Got interrupt. Clear the flag. */ |
@@ -236,7 +237,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
236 | mcp->mb[0] = MBS_LINK_DOWN_ERROR; | 237 | mcp->mb[0] = MBS_LINK_DOWN_ERROR; |
237 | ha->mcp = NULL; | 238 | ha->mcp = NULL; |
238 | rval = QLA_FUNCTION_FAILED; | 239 | rval = QLA_FUNCTION_FAILED; |
239 | ql_log(ql_log_warn, base_vha, 0x1015, | 240 | ql_log(ql_log_warn, vha, 0x1015, |
240 | "FW hung = %d.\n", ha->flags.isp82xx_fw_hung); | 241 | "FW hung = %d.\n", ha->flags.isp82xx_fw_hung); |
241 | goto premature_exit; | 242 | goto premature_exit; |
242 | } | 243 | } |
@@ -268,13 +269,19 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
268 | mb0 = RD_MAILBOX_REG(ha, ®->isp, 0); | 269 | mb0 = RD_MAILBOX_REG(ha, ®->isp, 0); |
269 | ictrl = RD_REG_WORD(®->isp.ictrl); | 270 | ictrl = RD_REG_WORD(®->isp.ictrl); |
270 | } | 271 | } |
271 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1119, | 272 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1119, |
272 | "MBX Command timeout for cmd %x.\n", command); | 273 | "MBX Command timeout for cmd %x.\n", command); |
273 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x111a, | 274 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111a, |
274 | "iocontrol=%x jiffies=%lx.\n", ictrl, jiffies); | 275 | "iocontrol=%x jiffies=%lx.\n", ictrl, jiffies); |
275 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x111b, | 276 | ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111b, |
276 | "mb[0] = 0x%x.\n", mb0); | 277 | "mb[0] = 0x%x.\n", mb0); |
277 | ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1019); | 278 | ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1019); |
279 | |||
280 | /* | ||
281 | * Attempt to capture a firmware dump for further analysis | ||
282 | * of the current firmware state | ||
283 | */ | ||
284 | ha->isp_ops->fw_dump(vha, 0); | ||
278 | 285 | ||
279 | rval = QLA_FUNCTION_TIMEOUT; | 286 | rval = QLA_FUNCTION_TIMEOUT; |
280 | } | 287 | } |
@@ -285,7 +292,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
285 | ha->mcp = NULL; | 292 | ha->mcp = NULL; |
286 | 293 | ||
287 | if ((abort_active || !io_lock_on) && !IS_NOPOLLING_TYPE(ha)) { | 294 | if ((abort_active || !io_lock_on) && !IS_NOPOLLING_TYPE(ha)) { |
288 | ql_dbg(ql_dbg_mbx, base_vha, 0x101a, | 295 | ql_dbg(ql_dbg_mbx, vha, 0x101a, |
289 | "Checking for additional resp interrupt.\n"); | 296 | "Checking for additional resp interrupt.\n"); |
290 | 297 | ||
291 | /* polling mode for non isp_abort commands. */ | 298 | /* polling mode for non isp_abort commands. */ |
@@ -297,7 +304,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
297 | if (!io_lock_on || (mcp->flags & IOCTL_CMD) || | 304 | if (!io_lock_on || (mcp->flags & IOCTL_CMD) || |
298 | ha->flags.eeh_busy) { | 305 | ha->flags.eeh_busy) { |
299 | /* not in dpc. schedule it for dpc to take over. */ | 306 | /* not in dpc. schedule it for dpc to take over. */ |
300 | ql_dbg(ql_dbg_mbx, base_vha, 0x101b, | 307 | ql_dbg(ql_dbg_mbx, vha, 0x101b, |
301 | "Timeout, schedule isp_abort_needed.\n"); | 308 | "Timeout, schedule isp_abort_needed.\n"); |
302 | 309 | ||
303 | if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && | 310 | if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && |
@@ -313,15 +320,16 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
313 | CRB_NIU_XG_PAUSE_CTL_P1); | 320 | CRB_NIU_XG_PAUSE_CTL_P1); |
314 | } | 321 | } |
315 | ql_log(ql_log_info, base_vha, 0x101c, | 322 | ql_log(ql_log_info, base_vha, 0x101c, |
316 | "Mailbox cmd timeout occured. " | 323 | "Mailbox cmd timeout occured, cmd=0x%x, " |
317 | "Scheduling ISP abort eeh_busy=0x%x.\n", | 324 | "mb[0]=0x%x, eeh_busy=0x%x. Scheduling ISP " |
318 | ha->flags.eeh_busy); | 325 | "abort.\n", command, mcp->mb[0], |
326 | ha->flags.eeh_busy); | ||
319 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); | 327 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); |
320 | qla2xxx_wake_dpc(vha); | 328 | qla2xxx_wake_dpc(vha); |
321 | } | 329 | } |
322 | } else if (!abort_active) { | 330 | } else if (!abort_active) { |
323 | /* call abort directly since we are in the DPC thread */ | 331 | /* call abort directly since we are in the DPC thread */ |
324 | ql_dbg(ql_dbg_mbx, base_vha, 0x101d, | 332 | ql_dbg(ql_dbg_mbx, vha, 0x101d, |
325 | "Timeout, calling abort_isp.\n"); | 333 | "Timeout, calling abort_isp.\n"); |
326 | 334 | ||
327 | if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && | 335 | if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && |
@@ -337,9 +345,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
337 | CRB_NIU_XG_PAUSE_CTL_P1); | 345 | CRB_NIU_XG_PAUSE_CTL_P1); |
338 | } | 346 | } |
339 | ql_log(ql_log_info, base_vha, 0x101e, | 347 | ql_log(ql_log_info, base_vha, 0x101e, |
340 | "Mailbox cmd timeout occured. " | 348 | "Mailbox cmd timeout occured, cmd=0x%x, " |
341 | "Scheduling ISP abort.\n"); | 349 | "mb[0]=0x%x. Scheduling ISP abort ", |
342 | 350 | command, mcp->mb[0]); | |
343 | set_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); | 351 | set_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); |
344 | clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); | 352 | clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); |
345 | /* Allow next mbx cmd to come in. */ | 353 | /* Allow next mbx cmd to come in. */ |
@@ -350,7 +358,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
350 | &vha->dpc_flags); | 358 | &vha->dpc_flags); |
351 | } | 359 | } |
352 | clear_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); | 360 | clear_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); |
353 | ql_dbg(ql_dbg_mbx, base_vha, 0x101f, | 361 | ql_dbg(ql_dbg_mbx, vha, 0x101f, |
354 | "Finished abort_isp.\n"); | 362 | "Finished abort_isp.\n"); |
355 | goto mbx_done; | 363 | goto mbx_done; |
356 | } | 364 | } |
@@ -364,8 +372,8 @@ premature_exit: | |||
364 | mbx_done: | 372 | mbx_done: |
365 | if (rval) { | 373 | if (rval) { |
366 | ql_dbg(ql_dbg_mbx, base_vha, 0x1020, | 374 | ql_dbg(ql_dbg_mbx, base_vha, 0x1020, |
367 | "**** Failed mbx[0]=%x, mb[1]=%x, mb[2]=%x, cmd=%x ****.\n", | 375 | "**** Failed mbx[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x, cmd=%x ****.\n", |
368 | mcp->mb[0], mcp->mb[1], mcp->mb[2], command); | 376 | mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], command); |
369 | } else { | 377 | } else { |
370 | ql_dbg(ql_dbg_mbx, base_vha, 0x1021, "Done %s.\n", __func__); | 378 | ql_dbg(ql_dbg_mbx, base_vha, 0x1021, "Done %s.\n", __func__); |
371 | } | 379 | } |
@@ -455,7 +463,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) | |||
455 | mcp->mb[1] = MSW(risc_addr); | 463 | mcp->mb[1] = MSW(risc_addr); |
456 | mcp->mb[2] = LSW(risc_addr); | 464 | mcp->mb[2] = LSW(risc_addr); |
457 | mcp->mb[3] = 0; | 465 | mcp->mb[3] = 0; |
458 | if (IS_QLA81XX(ha)) { | 466 | if (IS_QLA81XX(ha) || IS_QLA83XX(ha)) { |
459 | struct nvram_81xx *nv = ha->nvram; | 467 | struct nvram_81xx *nv = ha->nvram; |
460 | mcp->mb[4] = (nv->enhanced_features & | 468 | mcp->mb[4] = (nv->enhanced_features & |
461 | EXTENDED_BB_CREDITS); | 469 | EXTENDED_BB_CREDITS); |
@@ -508,21 +516,22 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) | |||
508 | * Kernel context. | 516 | * Kernel context. |
509 | */ | 517 | */ |
510 | int | 518 | int |
511 | qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | 519 | qla2x00_get_fw_version(scsi_qla_host_t *vha) |
512 | uint16_t *subminor, uint16_t *attributes, uint32_t *memory, uint8_t *mpi, | ||
513 | uint32_t *mpi_caps, uint8_t *phy) | ||
514 | { | 520 | { |
515 | int rval; | 521 | int rval; |
516 | mbx_cmd_t mc; | 522 | mbx_cmd_t mc; |
517 | mbx_cmd_t *mcp = &mc; | 523 | mbx_cmd_t *mcp = &mc; |
524 | struct qla_hw_data *ha = vha->hw; | ||
518 | 525 | ||
519 | ql_dbg(ql_dbg_mbx, vha, 0x1029, "Entered %s.\n", __func__); | 526 | ql_dbg(ql_dbg_mbx, vha, 0x1029, "Entered %s.\n", __func__); |
520 | 527 | ||
521 | mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; | 528 | mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; |
522 | mcp->out_mb = MBX_0; | 529 | mcp->out_mb = MBX_0; |
523 | mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; | 530 | mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; |
524 | if (IS_QLA81XX(vha->hw)) | 531 | if (IS_QLA81XX(vha->hw) || IS_QLA8031(ha)) |
525 | mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8; | 532 | mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8; |
533 | if (IS_QLA83XX(vha->hw)) | ||
534 | mcp->in_mb |= MBX_17|MBX_16|MBX_15; | ||
526 | mcp->flags = 0; | 535 | mcp->flags = 0; |
527 | mcp->tov = MBX_TOV_SECONDS; | 536 | mcp->tov = MBX_TOV_SECONDS; |
528 | rval = qla2x00_mailbox_command(vha, mcp); | 537 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -530,23 +539,37 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
530 | goto failed; | 539 | goto failed; |
531 | 540 | ||
532 | /* Return mailbox data. */ | 541 | /* Return mailbox data. */ |
533 | *major = mcp->mb[1]; | 542 | ha->fw_major_version = mcp->mb[1]; |
534 | *minor = mcp->mb[2]; | 543 | ha->fw_minor_version = mcp->mb[2]; |
535 | *subminor = mcp->mb[3]; | 544 | ha->fw_subminor_version = mcp->mb[3]; |
536 | *attributes = mcp->mb[6]; | 545 | ha->fw_attributes = mcp->mb[6]; |
537 | if (IS_QLA2100(vha->hw) || IS_QLA2200(vha->hw)) | 546 | if (IS_QLA2100(vha->hw) || IS_QLA2200(vha->hw)) |
538 | *memory = 0x1FFFF; /* Defaults to 128KB. */ | 547 | ha->fw_memory_size = 0x1FFFF; /* Defaults to 128KB. */ |
539 | else | 548 | else |
540 | *memory = (mcp->mb[5] << 16) | mcp->mb[4]; | 549 | ha->fw_memory_size = (mcp->mb[5] << 16) | mcp->mb[4]; |
541 | if (IS_QLA81XX(vha->hw)) { | 550 | if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw)) { |
542 | mpi[0] = mcp->mb[10] & 0xff; | 551 | ha->mpi_version[0] = mcp->mb[10] & 0xff; |
543 | mpi[1] = mcp->mb[11] >> 8; | 552 | ha->mpi_version[1] = mcp->mb[11] >> 8; |
544 | mpi[2] = mcp->mb[11] & 0xff; | 553 | ha->mpi_version[2] = mcp->mb[11] & 0xff; |
545 | *mpi_caps = (mcp->mb[12] << 16) | mcp->mb[13]; | 554 | ha->mpi_capabilities = (mcp->mb[12] << 16) | mcp->mb[13]; |
546 | phy[0] = mcp->mb[8] & 0xff; | 555 | ha->phy_version[0] = mcp->mb[8] & 0xff; |
547 | phy[1] = mcp->mb[9] >> 8; | 556 | ha->phy_version[1] = mcp->mb[9] >> 8; |
548 | phy[2] = mcp->mb[9] & 0xff; | 557 | ha->phy_version[2] = mcp->mb[9] & 0xff; |
558 | } | ||
559 | if (IS_QLA83XX(ha)) { | ||
560 | if (mcp->mb[6] & BIT_15) { | ||
561 | ha->fw_attributes_h = mcp->mb[15]; | ||
562 | ha->fw_attributes_ext[0] = mcp->mb[16]; | ||
563 | ha->fw_attributes_ext[1] = mcp->mb[17]; | ||
564 | ql_dbg(ql_dbg_mbx, vha, 0x1139, | ||
565 | "%s: FW_attributes Upper: 0x%x, Lower: 0x%x.\n", | ||
566 | __func__, mcp->mb[15], mcp->mb[6]); | ||
567 | } else | ||
568 | ql_dbg(ql_dbg_mbx, vha, 0x112f, | ||
569 | "%s: FwAttributes [Upper] invalid, MB6:%04x\n", | ||
570 | __func__, mcp->mb[6]); | ||
549 | } | 571 | } |
572 | |||
550 | failed: | 573 | failed: |
551 | if (rval != QLA_SUCCESS) { | 574 | if (rval != QLA_SUCCESS) { |
552 | /*EMPTY*/ | 575 | /*EMPTY*/ |
@@ -859,6 +882,7 @@ qla2x00_abort_command(srb_t *sp) | |||
859 | scsi_qla_host_t *vha = fcport->vha; | 882 | scsi_qla_host_t *vha = fcport->vha; |
860 | struct qla_hw_data *ha = vha->hw; | 883 | struct qla_hw_data *ha = vha->hw; |
861 | struct req_que *req = vha->req; | 884 | struct req_que *req = vha->req; |
885 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); | ||
862 | 886 | ||
863 | ql_dbg(ql_dbg_mbx, vha, 0x103b, "Entered %s.\n", __func__); | 887 | ql_dbg(ql_dbg_mbx, vha, 0x103b, "Entered %s.\n", __func__); |
864 | 888 | ||
@@ -881,7 +905,7 @@ qla2x00_abort_command(srb_t *sp) | |||
881 | mcp->mb[1] = fcport->loop_id << 8; | 905 | mcp->mb[1] = fcport->loop_id << 8; |
882 | mcp->mb[2] = (uint16_t)handle; | 906 | mcp->mb[2] = (uint16_t)handle; |
883 | mcp->mb[3] = (uint16_t)(handle >> 16); | 907 | mcp->mb[3] = (uint16_t)(handle >> 16); |
884 | mcp->mb[6] = (uint16_t)sp->cmd->device->lun; | 908 | mcp->mb[6] = (uint16_t)cmd->device->lun; |
885 | mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; | 909 | mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; |
886 | mcp->in_mb = MBX_0; | 910 | mcp->in_mb = MBX_0; |
887 | mcp->tov = MBX_TOV_SECONDS; | 911 | mcp->tov = MBX_TOV_SECONDS; |
@@ -1028,7 +1052,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa, | |||
1028 | mcp->mb[9] = vha->vp_idx; | 1052 | mcp->mb[9] = vha->vp_idx; |
1029 | mcp->out_mb = MBX_9|MBX_0; | 1053 | mcp->out_mb = MBX_9|MBX_0; |
1030 | mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; | 1054 | mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; |
1031 | if (IS_QLA8XXX_TYPE(vha->hw)) | 1055 | if (IS_CNA_CAPABLE(vha->hw)) |
1032 | mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10; | 1056 | mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10; |
1033 | mcp->tov = MBX_TOV_SECONDS; | 1057 | mcp->tov = MBX_TOV_SECONDS; |
1034 | mcp->flags = 0; | 1058 | mcp->flags = 0; |
@@ -1052,7 +1076,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa, | |||
1052 | } else { | 1076 | } else { |
1053 | ql_dbg(ql_dbg_mbx, vha, 0x1048, "Done %s.\n", __func__); | 1077 | ql_dbg(ql_dbg_mbx, vha, 0x1048, "Done %s.\n", __func__); |
1054 | 1078 | ||
1055 | if (IS_QLA8XXX_TYPE(vha->hw)) { | 1079 | if (IS_CNA_CAPABLE(vha->hw)) { |
1056 | vha->fcoe_vlan_id = mcp->mb[9] & 0xfff; | 1080 | vha->fcoe_vlan_id = mcp->mb[9] & 0xfff; |
1057 | vha->fcoe_fcf_idx = mcp->mb[10]; | 1081 | vha->fcoe_fcf_idx = mcp->mb[10]; |
1058 | vha->fcoe_vn_port_mac[5] = mcp->mb[11] >> 8; | 1082 | vha->fcoe_vn_port_mac[5] = mcp->mb[11] >> 8; |
@@ -1163,7 +1187,7 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size) | |||
1163 | mcp->mb[6] = MSW(MSD(ha->init_cb_dma)); | 1187 | mcp->mb[6] = MSW(MSD(ha->init_cb_dma)); |
1164 | mcp->mb[7] = LSW(MSD(ha->init_cb_dma)); | 1188 | mcp->mb[7] = LSW(MSD(ha->init_cb_dma)); |
1165 | mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; | 1189 | mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; |
1166 | if (IS_QLA81XX(ha) && ha->ex_init_cb->ex_version) { | 1190 | if ((IS_QLA81XX(ha) || IS_QLA83XX(ha)) && ha->ex_init_cb->ex_version) { |
1167 | mcp->mb[1] = BIT_0; | 1191 | mcp->mb[1] = BIT_0; |
1168 | mcp->mb[10] = MSW(ha->ex_init_cb_dma); | 1192 | mcp->mb[10] = MSW(ha->ex_init_cb_dma); |
1169 | mcp->mb[11] = LSW(ha->ex_init_cb_dma); | 1193 | mcp->mb[11] = LSW(ha->ex_init_cb_dma); |
@@ -1172,7 +1196,11 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size) | |||
1172 | mcp->mb[14] = sizeof(*ha->ex_init_cb); | 1196 | mcp->mb[14] = sizeof(*ha->ex_init_cb); |
1173 | mcp->out_mb |= MBX_14|MBX_13|MBX_12|MBX_11|MBX_10; | 1197 | mcp->out_mb |= MBX_14|MBX_13|MBX_12|MBX_11|MBX_10; |
1174 | } | 1198 | } |
1175 | mcp->in_mb = MBX_0; | 1199 | /* 1 and 2 should normally be captured. */ |
1200 | mcp->in_mb = MBX_2|MBX_1|MBX_0; | ||
1201 | if (IS_QLA83XX(ha)) | ||
1202 | /* mb3 is additional info about the installed SFP. */ | ||
1203 | mcp->in_mb |= MBX_3; | ||
1176 | mcp->buf_size = size; | 1204 | mcp->buf_size = size; |
1177 | mcp->flags = MBX_DMA_OUT; | 1205 | mcp->flags = MBX_DMA_OUT; |
1178 | mcp->tov = MBX_TOV_SECONDS; | 1206 | mcp->tov = MBX_TOV_SECONDS; |
@@ -1181,7 +1209,8 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size) | |||
1181 | if (rval != QLA_SUCCESS) { | 1209 | if (rval != QLA_SUCCESS) { |
1182 | /*EMPTY*/ | 1210 | /*EMPTY*/ |
1183 | ql_dbg(ql_dbg_mbx, vha, 0x104d, | 1211 | ql_dbg(ql_dbg_mbx, vha, 0x104d, |
1184 | "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); | 1212 | "Failed=%x mb[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x,.\n", |
1213 | rval, mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3]); | ||
1185 | } else { | 1214 | } else { |
1186 | /*EMPTY*/ | 1215 | /*EMPTY*/ |
1187 | ql_dbg(ql_dbg_mbx, vha, 0x104e, "Done %s.\n", __func__); | 1216 | ql_dbg(ql_dbg_mbx, vha, 0x104e, "Done %s.\n", __func__); |
@@ -1260,6 +1289,7 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt) | |||
1260 | goto gpd_error_out; | 1289 | goto gpd_error_out; |
1261 | 1290 | ||
1262 | if (IS_FWI2_CAPABLE(ha)) { | 1291 | if (IS_FWI2_CAPABLE(ha)) { |
1292 | uint64_t zero = 0; | ||
1263 | pd24 = (struct port_database_24xx *) pd; | 1293 | pd24 = (struct port_database_24xx *) pd; |
1264 | 1294 | ||
1265 | /* Check for logged in state. */ | 1295 | /* Check for logged in state. */ |
@@ -1273,6 +1303,14 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt) | |||
1273 | goto gpd_error_out; | 1303 | goto gpd_error_out; |
1274 | } | 1304 | } |
1275 | 1305 | ||
1306 | if (fcport->loop_id == FC_NO_LOOP_ID || | ||
1307 | (memcmp(fcport->port_name, (uint8_t *)&zero, 8) && | ||
1308 | memcmp(fcport->port_name, pd24->port_name, 8))) { | ||
1309 | /* We lost the device mid way. */ | ||
1310 | rval = QLA_NOT_LOGGED_IN; | ||
1311 | goto gpd_error_out; | ||
1312 | } | ||
1313 | |||
1276 | /* Names are little-endian. */ | 1314 | /* Names are little-endian. */ |
1277 | memcpy(fcport->node_name, pd24->node_name, WWN_SIZE); | 1315 | memcpy(fcport->node_name, pd24->node_name, WWN_SIZE); |
1278 | memcpy(fcport->port_name, pd24->port_name, WWN_SIZE); | 1316 | memcpy(fcport->port_name, pd24->port_name, WWN_SIZE); |
@@ -1289,6 +1327,8 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt) | |||
1289 | else | 1327 | else |
1290 | fcport->port_type = FCT_TARGET; | 1328 | fcport->port_type = FCT_TARGET; |
1291 | } else { | 1329 | } else { |
1330 | uint64_t zero = 0; | ||
1331 | |||
1292 | /* Check for logged in state. */ | 1332 | /* Check for logged in state. */ |
1293 | if (pd->master_state != PD_STATE_PORT_LOGGED_IN && | 1333 | if (pd->master_state != PD_STATE_PORT_LOGGED_IN && |
1294 | pd->slave_state != PD_STATE_PORT_LOGGED_IN) { | 1334 | pd->slave_state != PD_STATE_PORT_LOGGED_IN) { |
@@ -1301,6 +1341,14 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt) | |||
1301 | goto gpd_error_out; | 1341 | goto gpd_error_out; |
1302 | } | 1342 | } |
1303 | 1343 | ||
1344 | if (fcport->loop_id == FC_NO_LOOP_ID || | ||
1345 | (memcmp(fcport->port_name, (uint8_t *)&zero, 8) && | ||
1346 | memcmp(fcport->port_name, pd->port_name, 8))) { | ||
1347 | /* We lost the device mid way. */ | ||
1348 | rval = QLA_NOT_LOGGED_IN; | ||
1349 | goto gpd_error_out; | ||
1350 | } | ||
1351 | |||
1304 | /* Names are little-endian. */ | 1352 | /* Names are little-endian. */ |
1305 | memcpy(fcport->node_name, pd->node_name, WWN_SIZE); | 1353 | memcpy(fcport->node_name, pd->node_name, WWN_SIZE); |
1306 | memcpy(fcport->port_name, pd->port_name, WWN_SIZE); | 1354 | memcpy(fcport->port_name, pd->port_name, WWN_SIZE); |
@@ -1481,7 +1529,7 @@ qla2x00_lip_reset(scsi_qla_host_t *vha) | |||
1481 | 1529 | ||
1482 | ql_dbg(ql_dbg_mbx, vha, 0x105a, "Entered %s.\n", __func__); | 1530 | ql_dbg(ql_dbg_mbx, vha, 0x105a, "Entered %s.\n", __func__); |
1483 | 1531 | ||
1484 | if (IS_QLA8XXX_TYPE(vha->hw)) { | 1532 | if (IS_CNA_CAPABLE(vha->hw)) { |
1485 | /* Logout across all FCFs. */ | 1533 | /* Logout across all FCFs. */ |
1486 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; | 1534 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; |
1487 | mcp->mb[1] = BIT_1; | 1535 | mcp->mb[1] = BIT_1; |
@@ -1622,7 +1670,8 @@ qla24xx_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, | |||
1622 | lg->port_id[1] = area; | 1670 | lg->port_id[1] = area; |
1623 | lg->port_id[2] = domain; | 1671 | lg->port_id[2] = domain; |
1624 | lg->vp_index = vha->vp_idx; | 1672 | lg->vp_index = vha->vp_idx; |
1625 | rval = qla2x00_issue_iocb(vha, lg, lg_dma, 0); | 1673 | rval = qla2x00_issue_iocb_timeout(vha, lg, lg_dma, 0, |
1674 | (ha->r_a_tov / 10 * 2) + 2); | ||
1626 | if (rval != QLA_SUCCESS) { | 1675 | if (rval != QLA_SUCCESS) { |
1627 | ql_dbg(ql_dbg_mbx, vha, 0x1063, | 1676 | ql_dbg(ql_dbg_mbx, vha, 0x1063, |
1628 | "Failed to issue login IOCB (%x).\n", rval); | 1677 | "Failed to issue login IOCB (%x).\n", rval); |
@@ -1885,8 +1934,8 @@ qla24xx_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, | |||
1885 | lg->port_id[1] = area; | 1934 | lg->port_id[1] = area; |
1886 | lg->port_id[2] = domain; | 1935 | lg->port_id[2] = domain; |
1887 | lg->vp_index = vha->vp_idx; | 1936 | lg->vp_index = vha->vp_idx; |
1888 | 1937 | rval = qla2x00_issue_iocb_timeout(vha, lg, lg_dma, 0, | |
1889 | rval = qla2x00_issue_iocb(vha, lg, lg_dma, 0); | 1938 | (ha->r_a_tov / 10 * 2) + 2); |
1890 | if (rval != QLA_SUCCESS) { | 1939 | if (rval != QLA_SUCCESS) { |
1891 | ql_dbg(ql_dbg_mbx, vha, 0x106f, | 1940 | ql_dbg(ql_dbg_mbx, vha, 0x106f, |
1892 | "Failed to issue logout IOCB (%x).\n", rval); | 1941 | "Failed to issue logout IOCB (%x).\n", rval); |
@@ -2094,7 +2143,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *vha, uint16_t *cur_xchg_cnt, | |||
2094 | mcp->mb[0] = MBC_GET_RESOURCE_COUNTS; | 2143 | mcp->mb[0] = MBC_GET_RESOURCE_COUNTS; |
2095 | mcp->out_mb = MBX_0; | 2144 | mcp->out_mb = MBX_0; |
2096 | mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; | 2145 | mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; |
2097 | if (IS_QLA81XX(vha->hw)) | 2146 | if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw)) |
2098 | mcp->in_mb |= MBX_12; | 2147 | mcp->in_mb |= MBX_12; |
2099 | mcp->tov = MBX_TOV_SECONDS; | 2148 | mcp->tov = MBX_TOV_SECONDS; |
2100 | mcp->flags = 0; | 2149 | mcp->flags = 0; |
@@ -2121,7 +2170,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *vha, uint16_t *cur_xchg_cnt, | |||
2121 | *orig_iocb_cnt = mcp->mb[10]; | 2170 | *orig_iocb_cnt = mcp->mb[10]; |
2122 | if (vha->hw->flags.npiv_supported && max_npiv_vports) | 2171 | if (vha->hw->flags.npiv_supported && max_npiv_vports) |
2123 | *max_npiv_vports = mcp->mb[11]; | 2172 | *max_npiv_vports = mcp->mb[11]; |
2124 | if (IS_QLA81XX(vha->hw) && max_fcfs) | 2173 | if ((IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw)) && max_fcfs) |
2125 | *max_fcfs = mcp->mb[12]; | 2174 | *max_fcfs = mcp->mb[12]; |
2126 | } | 2175 | } |
2127 | 2176 | ||
@@ -2686,7 +2735,8 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma, | |||
2686 | 2735 | ||
2687 | ql_dbg(ql_dbg_mbx, vha, 0x10aa, "Entered %s.\n", __func__); | 2736 | ql_dbg(ql_dbg_mbx, vha, 0x10aa, "Entered %s.\n", __func__); |
2688 | 2737 | ||
2689 | if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw)) | 2738 | if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw) && |
2739 | !IS_QLA83XX(vha->hw)) | ||
2690 | return QLA_FUNCTION_FAILED; | 2740 | return QLA_FUNCTION_FAILED; |
2691 | 2741 | ||
2692 | if (unlikely(pci_channel_offline(vha->hw->pdev))) | 2742 | if (unlikely(pci_channel_offline(vha->hw->pdev))) |
@@ -2828,7 +2878,7 @@ qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id, | |||
2828 | mcp->mb[0] = MBC_PORT_PARAMS; | 2878 | mcp->mb[0] = MBC_PORT_PARAMS; |
2829 | mcp->mb[1] = loop_id; | 2879 | mcp->mb[1] = loop_id; |
2830 | mcp->mb[2] = BIT_0; | 2880 | mcp->mb[2] = BIT_0; |
2831 | if (IS_QLA8XXX_TYPE(vha->hw)) | 2881 | if (IS_CNA_CAPABLE(vha->hw)) |
2832 | mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0); | 2882 | mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0); |
2833 | else | 2883 | else |
2834 | mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0); | 2884 | mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0); |
@@ -3298,6 +3348,8 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) | |||
3298 | mcp->mb[12] = req->qos; | 3348 | mcp->mb[12] = req->qos; |
3299 | mcp->mb[11] = req->vp_idx; | 3349 | mcp->mb[11] = req->vp_idx; |
3300 | mcp->mb[13] = req->rid; | 3350 | mcp->mb[13] = req->rid; |
3351 | if (IS_QLA83XX(ha)) | ||
3352 | mcp->mb[15] = 0; | ||
3301 | 3353 | ||
3302 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + | 3354 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + |
3303 | QLA_QUE_PAGE * req->id); | 3355 | QLA_QUE_PAGE * req->id); |
@@ -3311,12 +3363,21 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) | |||
3311 | MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; | 3363 | MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; |
3312 | mcp->in_mb = MBX_0; | 3364 | mcp->in_mb = MBX_0; |
3313 | mcp->flags = MBX_DMA_OUT; | 3365 | mcp->flags = MBX_DMA_OUT; |
3314 | mcp->tov = 60; | 3366 | mcp->tov = MBX_TOV_SECONDS * 2; |
3367 | |||
3368 | if (IS_QLA81XX(ha) || IS_QLA83XX(ha)) | ||
3369 | mcp->in_mb |= MBX_1; | ||
3370 | if (IS_QLA83XX(ha)) { | ||
3371 | mcp->out_mb |= MBX_15; | ||
3372 | /* debug q create issue in SR-IOV */ | ||
3373 | mcp->in_mb |= MBX_9 | MBX_8 | MBX_7; | ||
3374 | } | ||
3315 | 3375 | ||
3316 | spin_lock_irqsave(&ha->hardware_lock, flags); | 3376 | spin_lock_irqsave(&ha->hardware_lock, flags); |
3317 | if (!(req->options & BIT_0)) { | 3377 | if (!(req->options & BIT_0)) { |
3318 | WRT_REG_DWORD(®->req_q_in, 0); | 3378 | WRT_REG_DWORD(®->req_q_in, 0); |
3319 | WRT_REG_DWORD(®->req_q_out, 0); | 3379 | if (!IS_QLA83XX(ha)) |
3380 | WRT_REG_DWORD(®->req_q_out, 0); | ||
3320 | } | 3381 | } |
3321 | req->req_q_in = ®->req_q_in; | 3382 | req->req_q_in = ®->req_q_in; |
3322 | req->req_q_out = ®->req_q_out; | 3383 | req->req_q_out = ®->req_q_out; |
@@ -3354,6 +3415,8 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) | |||
3354 | mcp->mb[5] = rsp->length; | 3415 | mcp->mb[5] = rsp->length; |
3355 | mcp->mb[14] = rsp->msix->entry; | 3416 | mcp->mb[14] = rsp->msix->entry; |
3356 | mcp->mb[13] = rsp->rid; | 3417 | mcp->mb[13] = rsp->rid; |
3418 | if (IS_QLA83XX(ha)) | ||
3419 | mcp->mb[15] = 0; | ||
3357 | 3420 | ||
3358 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + | 3421 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + |
3359 | QLA_QUE_PAGE * rsp->id); | 3422 | QLA_QUE_PAGE * rsp->id); |
@@ -3367,12 +3430,23 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) | |||
3367 | |MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; | 3430 | |MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; |
3368 | mcp->in_mb = MBX_0; | 3431 | mcp->in_mb = MBX_0; |
3369 | mcp->flags = MBX_DMA_OUT; | 3432 | mcp->flags = MBX_DMA_OUT; |
3370 | mcp->tov = 60; | 3433 | mcp->tov = MBX_TOV_SECONDS * 2; |
3434 | |||
3435 | if (IS_QLA81XX(ha)) { | ||
3436 | mcp->out_mb |= MBX_12|MBX_11|MBX_10; | ||
3437 | mcp->in_mb |= MBX_1; | ||
3438 | } else if (IS_QLA83XX(ha)) { | ||
3439 | mcp->out_mb |= MBX_15|MBX_12|MBX_11|MBX_10; | ||
3440 | mcp->in_mb |= MBX_1; | ||
3441 | /* debug q create issue in SR-IOV */ | ||
3442 | mcp->in_mb |= MBX_9 | MBX_8 | MBX_7; | ||
3443 | } | ||
3371 | 3444 | ||
3372 | spin_lock_irqsave(&ha->hardware_lock, flags); | 3445 | spin_lock_irqsave(&ha->hardware_lock, flags); |
3373 | if (!(rsp->options & BIT_0)) { | 3446 | if (!(rsp->options & BIT_0)) { |
3374 | WRT_REG_DWORD(®->rsp_q_out, 0); | 3447 | WRT_REG_DWORD(®->rsp_q_out, 0); |
3375 | WRT_REG_DWORD(®->rsp_q_in, 0); | 3448 | if (!IS_QLA83XX(ha)) |
3449 | WRT_REG_DWORD(®->rsp_q_in, 0); | ||
3376 | } | 3450 | } |
3377 | 3451 | ||
3378 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 3452 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
@@ -3424,7 +3498,7 @@ qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size) | |||
3424 | 3498 | ||
3425 | ql_dbg(ql_dbg_mbx, vha, 0x10dc, "Entered %s.\n", __func__); | 3499 | ql_dbg(ql_dbg_mbx, vha, 0x10dc, "Entered %s.\n", __func__); |
3426 | 3500 | ||
3427 | if (!IS_QLA81XX(vha->hw)) | 3501 | if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw)) |
3428 | return QLA_FUNCTION_FAILED; | 3502 | return QLA_FUNCTION_FAILED; |
3429 | 3503 | ||
3430 | mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; | 3504 | mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; |
@@ -3454,7 +3528,7 @@ qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable) | |||
3454 | mbx_cmd_t mc; | 3528 | mbx_cmd_t mc; |
3455 | mbx_cmd_t *mcp = &mc; | 3529 | mbx_cmd_t *mcp = &mc; |
3456 | 3530 | ||
3457 | if (!IS_QLA81XX(vha->hw)) | 3531 | if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw)) |
3458 | return QLA_FUNCTION_FAILED; | 3532 | return QLA_FUNCTION_FAILED; |
3459 | 3533 | ||
3460 | ql_dbg(ql_dbg_mbx, vha, 0x10df, "Entered %s.\n", __func__); | 3534 | ql_dbg(ql_dbg_mbx, vha, 0x10df, "Entered %s.\n", __func__); |
@@ -3486,7 +3560,7 @@ qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish) | |||
3486 | mbx_cmd_t mc; | 3560 | mbx_cmd_t mc; |
3487 | mbx_cmd_t *mcp = &mc; | 3561 | mbx_cmd_t *mcp = &mc; |
3488 | 3562 | ||
3489 | if (!IS_QLA81XX(vha->hw)) | 3563 | if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw)) |
3490 | return QLA_FUNCTION_FAILED; | 3564 | return QLA_FUNCTION_FAILED; |
3491 | 3565 | ||
3492 | ql_dbg(ql_dbg_mbx, vha, 0x10e2, "Entered %s.\n", __func__); | 3566 | ql_dbg(ql_dbg_mbx, vha, 0x10e2, "Entered %s.\n", __func__); |
@@ -3641,7 +3715,7 @@ qla2x00_get_xgmac_stats(scsi_qla_host_t *vha, dma_addr_t stats_dma, | |||
3641 | 3715 | ||
3642 | ql_dbg(ql_dbg_mbx, vha, 0x10ee, "Entered %s.\n", __func__); | 3716 | ql_dbg(ql_dbg_mbx, vha, 0x10ee, "Entered %s.\n", __func__); |
3643 | 3717 | ||
3644 | if (!IS_QLA8XXX_TYPE(vha->hw)) | 3718 | if (!IS_CNA_CAPABLE(vha->hw)) |
3645 | return QLA_FUNCTION_FAILED; | 3719 | return QLA_FUNCTION_FAILED; |
3646 | 3720 | ||
3647 | mcp->mb[0] = MBC_GET_XGMAC_STATS; | 3721 | mcp->mb[0] = MBC_GET_XGMAC_STATS; |
@@ -3680,7 +3754,7 @@ qla2x00_get_dcbx_params(scsi_qla_host_t *vha, dma_addr_t tlv_dma, | |||
3680 | 3754 | ||
3681 | ql_dbg(ql_dbg_mbx, vha, 0x10f1, "Entered %s.\n", __func__); | 3755 | ql_dbg(ql_dbg_mbx, vha, 0x10f1, "Entered %s.\n", __func__); |
3682 | 3756 | ||
3683 | if (!IS_QLA8XXX_TYPE(vha->hw)) | 3757 | if (!IS_CNA_CAPABLE(vha->hw)) |
3684 | return QLA_FUNCTION_FAILED; | 3758 | return QLA_FUNCTION_FAILED; |
3685 | 3759 | ||
3686 | mcp->mb[0] = MBC_GET_DCBX_PARAMS; | 3760 | mcp->mb[0] = MBC_GET_DCBX_PARAMS; |
@@ -3775,7 +3849,7 @@ qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, | |||
3775 | 3849 | ||
3776 | mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15| | 3850 | mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15| |
3777 | MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; | 3851 | MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; |
3778 | if (IS_QLA8XXX_TYPE(vha->hw)) | 3852 | if (IS_CNA_CAPABLE(vha->hw)) |
3779 | mcp->out_mb |= MBX_2; | 3853 | mcp->out_mb |= MBX_2; |
3780 | mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0; | 3854 | mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0; |
3781 | 3855 | ||
@@ -3813,7 +3887,7 @@ qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, | |||
3813 | memset(mcp->mb, 0 , sizeof(mcp->mb)); | 3887 | memset(mcp->mb, 0 , sizeof(mcp->mb)); |
3814 | mcp->mb[0] = MBC_DIAGNOSTIC_ECHO; | 3888 | mcp->mb[0] = MBC_DIAGNOSTIC_ECHO; |
3815 | mcp->mb[1] = mreq->options | BIT_6; /* BIT_6 specifies 64bit address */ | 3889 | mcp->mb[1] = mreq->options | BIT_6; /* BIT_6 specifies 64bit address */ |
3816 | if (IS_QLA8XXX_TYPE(ha)) { | 3890 | if (IS_CNA_CAPABLE(ha)) { |
3817 | mcp->mb[1] |= BIT_15; | 3891 | mcp->mb[1] |= BIT_15; |
3818 | mcp->mb[2] = vha->fcoe_fcf_idx; | 3892 | mcp->mb[2] = vha->fcoe_fcf_idx; |
3819 | } | 3893 | } |
@@ -3831,13 +3905,14 @@ qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, | |||
3831 | 3905 | ||
3832 | mcp->out_mb = MBX_21|MBX_20|MBX_17|MBX_16|MBX_15| | 3906 | mcp->out_mb = MBX_21|MBX_20|MBX_17|MBX_16|MBX_15| |
3833 | MBX_14|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; | 3907 | MBX_14|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; |
3834 | if (IS_QLA8XXX_TYPE(ha)) | 3908 | if (IS_CNA_CAPABLE(ha)) |
3835 | mcp->out_mb |= MBX_2; | 3909 | mcp->out_mb |= MBX_2; |
3836 | 3910 | ||
3837 | mcp->in_mb = MBX_0; | 3911 | mcp->in_mb = MBX_0; |
3838 | if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA8XXX_TYPE(ha)) | 3912 | if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || |
3913 | IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)) | ||
3839 | mcp->in_mb |= MBX_1; | 3914 | mcp->in_mb |= MBX_1; |
3840 | if (IS_QLA8XXX_TYPE(ha)) | 3915 | if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)) |
3841 | mcp->in_mb |= MBX_3; | 3916 | mcp->in_mb |= MBX_3; |
3842 | 3917 | ||
3843 | mcp->tov = MBX_TOV_SECONDS; | 3918 | mcp->tov = MBX_TOV_SECONDS; |
@@ -3976,6 +4051,7 @@ qla81xx_write_mpi_register(scsi_qla_host_t *vha, uint16_t *mb) | |||
3976 | 4051 | ||
3977 | return rval; | 4052 | return rval; |
3978 | } | 4053 | } |
4054 | |||
3979 | int | 4055 | int |
3980 | qla2x00_get_data_rate(scsi_qla_host_t *vha) | 4056 | qla2x00_get_data_rate(scsi_qla_host_t *vha) |
3981 | { | 4057 | { |
@@ -3993,6 +4069,8 @@ qla2x00_get_data_rate(scsi_qla_host_t *vha) | |||
3993 | mcp->mb[1] = 0; | 4069 | mcp->mb[1] = 0; |
3994 | mcp->out_mb = MBX_1|MBX_0; | 4070 | mcp->out_mb = MBX_1|MBX_0; |
3995 | mcp->in_mb = MBX_2|MBX_1|MBX_0; | 4071 | mcp->in_mb = MBX_2|MBX_1|MBX_0; |
4072 | if (IS_QLA83XX(ha)) | ||
4073 | mcp->in_mb |= MBX_3; | ||
3996 | mcp->tov = MBX_TOV_SECONDS; | 4074 | mcp->tov = MBX_TOV_SECONDS; |
3997 | mcp->flags = 0; | 4075 | mcp->flags = 0; |
3998 | rval = qla2x00_mailbox_command(vha, mcp); | 4076 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -4018,7 +4096,7 @@ qla81xx_get_port_config(scsi_qla_host_t *vha, uint16_t *mb) | |||
4018 | 4096 | ||
4019 | ql_dbg(ql_dbg_mbx, vha, 0x1109, "Entered %s.\n", __func__); | 4097 | ql_dbg(ql_dbg_mbx, vha, 0x1109, "Entered %s.\n", __func__); |
4020 | 4098 | ||
4021 | if (!IS_QLA81XX(ha)) | 4099 | if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha)) |
4022 | return QLA_FUNCTION_FAILED; | 4100 | return QLA_FUNCTION_FAILED; |
4023 | mcp->mb[0] = MBC_GET_PORT_CONFIG; | 4101 | mcp->mb[0] = MBC_GET_PORT_CONFIG; |
4024 | mcp->out_mb = MBX_0; | 4102 | mcp->out_mb = MBX_0; |
@@ -4299,6 +4377,90 @@ qla82xx_md_get_template(scsi_qla_host_t *vha) | |||
4299 | } | 4377 | } |
4300 | 4378 | ||
4301 | int | 4379 | int |
4380 | qla81xx_set_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg) | ||
4381 | { | ||
4382 | int rval; | ||
4383 | struct qla_hw_data *ha = vha->hw; | ||
4384 | mbx_cmd_t mc; | ||
4385 | mbx_cmd_t *mcp = &mc; | ||
4386 | |||
4387 | if (!IS_QLA81XX(ha) && !IS_QLA8031(ha)) | ||
4388 | return QLA_FUNCTION_FAILED; | ||
4389 | |||
4390 | ql_dbg(ql_dbg_mbx, vha, 0x1133, "Entered %s.\n", __func__); | ||
4391 | |||
4392 | memset(mcp, 0, sizeof(mbx_cmd_t)); | ||
4393 | mcp->mb[0] = MBC_SET_LED_CONFIG; | ||
4394 | mcp->mb[1] = led_cfg[0]; | ||
4395 | mcp->mb[2] = led_cfg[1]; | ||
4396 | if (IS_QLA8031(ha)) { | ||
4397 | mcp->mb[3] = led_cfg[2]; | ||
4398 | mcp->mb[4] = led_cfg[3]; | ||
4399 | mcp->mb[5] = led_cfg[4]; | ||
4400 | mcp->mb[6] = led_cfg[5]; | ||
4401 | } | ||
4402 | |||
4403 | mcp->out_mb = MBX_2|MBX_1|MBX_0; | ||
4404 | if (IS_QLA8031(ha)) | ||
4405 | mcp->out_mb |= MBX_6|MBX_5|MBX_4|MBX_3; | ||
4406 | mcp->in_mb = MBX_0; | ||
4407 | mcp->tov = 30; | ||
4408 | mcp->flags = 0; | ||
4409 | |||
4410 | rval = qla2x00_mailbox_command(vha, mcp); | ||
4411 | if (rval != QLA_SUCCESS) { | ||
4412 | ql_dbg(ql_dbg_mbx, vha, 0x1134, | ||
4413 | "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); | ||
4414 | } else { | ||
4415 | ql_dbg(ql_dbg_mbx, vha, 0x1135, "Done %s.\n", __func__); | ||
4416 | } | ||
4417 | |||
4418 | return rval; | ||
4419 | } | ||
4420 | |||
4421 | int | ||
4422 | qla81xx_get_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg) | ||
4423 | { | ||
4424 | int rval; | ||
4425 | struct qla_hw_data *ha = vha->hw; | ||
4426 | mbx_cmd_t mc; | ||
4427 | mbx_cmd_t *mcp = &mc; | ||
4428 | |||
4429 | if (!IS_QLA81XX(ha) && !IS_QLA8031(ha)) | ||
4430 | return QLA_FUNCTION_FAILED; | ||
4431 | |||
4432 | ql_dbg(ql_dbg_mbx, vha, 0x1136, "Entered %s.\n", __func__); | ||
4433 | |||
4434 | memset(mcp, 0, sizeof(mbx_cmd_t)); | ||
4435 | mcp->mb[0] = MBC_GET_LED_CONFIG; | ||
4436 | |||
4437 | mcp->out_mb = MBX_0; | ||
4438 | mcp->in_mb = MBX_2|MBX_1|MBX_0; | ||
4439 | if (IS_QLA8031(ha)) | ||
4440 | mcp->in_mb |= MBX_6|MBX_5|MBX_4|MBX_3; | ||
4441 | mcp->tov = 30; | ||
4442 | mcp->flags = 0; | ||
4443 | |||
4444 | rval = qla2x00_mailbox_command(vha, mcp); | ||
4445 | if (rval != QLA_SUCCESS) { | ||
4446 | ql_dbg(ql_dbg_mbx, vha, 0x1137, | ||
4447 | "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); | ||
4448 | } else { | ||
4449 | led_cfg[0] = mcp->mb[1]; | ||
4450 | led_cfg[1] = mcp->mb[2]; | ||
4451 | if (IS_QLA8031(ha)) { | ||
4452 | led_cfg[2] = mcp->mb[3]; | ||
4453 | led_cfg[3] = mcp->mb[4]; | ||
4454 | led_cfg[4] = mcp->mb[5]; | ||
4455 | led_cfg[5] = mcp->mb[6]; | ||
4456 | } | ||
4457 | ql_dbg(ql_dbg_mbx, vha, 0x1138, "Done %s.\n", __func__); | ||
4458 | } | ||
4459 | |||
4460 | return rval; | ||
4461 | } | ||
4462 | |||
4463 | int | ||
4302 | qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable) | 4464 | qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable) |
4303 | { | 4465 | { |
4304 | int rval; | 4466 | int rval; |
@@ -4321,7 +4483,7 @@ qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable) | |||
4321 | 4483 | ||
4322 | mcp->out_mb = MBX_7|MBX_0; | 4484 | mcp->out_mb = MBX_7|MBX_0; |
4323 | mcp->in_mb = MBX_0; | 4485 | mcp->in_mb = MBX_0; |
4324 | mcp->tov = 30; | 4486 | mcp->tov = MBX_TOV_SECONDS; |
4325 | mcp->flags = 0; | 4487 | mcp->flags = 0; |
4326 | 4488 | ||
4327 | rval = qla2x00_mailbox_command(vha, mcp); | 4489 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -4335,3 +4497,75 @@ qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable) | |||
4335 | 4497 | ||
4336 | return rval; | 4498 | return rval; |
4337 | } | 4499 | } |
4500 | |||
4501 | int | ||
4502 | qla83xx_write_remote_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t data) | ||
4503 | { | ||
4504 | int rval; | ||
4505 | struct qla_hw_data *ha = vha->hw; | ||
4506 | mbx_cmd_t mc; | ||
4507 | mbx_cmd_t *mcp = &mc; | ||
4508 | |||
4509 | if (!IS_QLA83XX(ha)) | ||
4510 | return QLA_FUNCTION_FAILED; | ||
4511 | |||
4512 | ql_dbg(ql_dbg_mbx, vha, 0x1130, "Entered %s.\n", __func__); | ||
4513 | |||
4514 | mcp->mb[0] = MBC_WRITE_REMOTE_REG; | ||
4515 | mcp->mb[1] = LSW(reg); | ||
4516 | mcp->mb[2] = MSW(reg); | ||
4517 | mcp->mb[3] = LSW(data); | ||
4518 | mcp->mb[4] = MSW(data); | ||
4519 | mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; | ||
4520 | |||
4521 | mcp->in_mb = MBX_1|MBX_0; | ||
4522 | mcp->tov = MBX_TOV_SECONDS; | ||
4523 | mcp->flags = 0; | ||
4524 | rval = qla2x00_mailbox_command(vha, mcp); | ||
4525 | |||
4526 | if (rval != QLA_SUCCESS) { | ||
4527 | ql_dbg(ql_dbg_mbx, vha, 0x1131, | ||
4528 | "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); | ||
4529 | } else { | ||
4530 | ql_dbg(ql_dbg_mbx, vha, 0x1132, | ||
4531 | "Done %s.\n", __func__); | ||
4532 | } | ||
4533 | |||
4534 | return rval; | ||
4535 | } | ||
4536 | |||
4537 | int | ||
4538 | qla2x00_port_logout(scsi_qla_host_t *vha, struct fc_port *fcport) | ||
4539 | { | ||
4540 | int rval; | ||
4541 | struct qla_hw_data *ha = vha->hw; | ||
4542 | mbx_cmd_t mc; | ||
4543 | mbx_cmd_t *mcp = &mc; | ||
4544 | |||
4545 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) { | ||
4546 | ql_dbg(ql_dbg_mbx, vha, 0x113b, | ||
4547 | "Implicit LOGO Unsupported.\n"); | ||
4548 | return QLA_FUNCTION_FAILED; | ||
4549 | } | ||
4550 | |||
4551 | |||
4552 | ql_dbg(ql_dbg_mbx, vha, 0x113c, "Done %s.\n", __func__); | ||
4553 | |||
4554 | /* Perform Implicit LOGO. */ | ||
4555 | mcp->mb[0] = MBC_PORT_LOGOUT; | ||
4556 | mcp->mb[1] = fcport->loop_id; | ||
4557 | mcp->mb[10] = BIT_15; | ||
4558 | mcp->out_mb = MBX_10|MBX_1|MBX_0; | ||
4559 | mcp->in_mb = MBX_0; | ||
4560 | mcp->tov = MBX_TOV_SECONDS; | ||
4561 | mcp->flags = 0; | ||
4562 | rval = qla2x00_mailbox_command(vha, mcp); | ||
4563 | if (rval != QLA_SUCCESS) | ||
4564 | ql_dbg(ql_dbg_mbx, vha, 0x113d, | ||
4565 | "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); | ||
4566 | else | ||
4567 | ql_dbg(ql_dbg_mbx, vha, 0x113e, "Done %s.\n", __func__); | ||
4568 | |||
4569 | return rval; | ||
4570 | } | ||
4571 | |||
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index f488cc69fc7..aa062a1b0ca 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
@@ -479,7 +479,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport) | |||
479 | host->max_channel = MAX_BUSES - 1; | 479 | host->max_channel = MAX_BUSES - 1; |
480 | host->max_lun = ql2xmaxlun; | 480 | host->max_lun = ql2xmaxlun; |
481 | host->unique_id = host->host_no; | 481 | host->unique_id = host->host_no; |
482 | host->max_id = MAX_TARGETS_2200; | 482 | host->max_id = ha->max_fibre_devices; |
483 | host->transportt = qla2xxx_transport_vport_template; | 483 | host->transportt = qla2xxx_transport_vport_template; |
484 | 484 | ||
485 | ql_dbg(ql_dbg_vport, vha, 0xa007, | 485 | ql_dbg(ql_dbg_vport, vha, 0xa007, |
diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c index 270ba3130fd..f0528539bbb 100644 --- a/drivers/scsi/qla2xxx/qla_nx.c +++ b/drivers/scsi/qla2xxx/qla_nx.c | |||
@@ -908,27 +908,37 @@ qla82xx_wait_rom_done(struct qla_hw_data *ha) | |||
908 | return 0; | 908 | return 0; |
909 | } | 909 | } |
910 | 910 | ||
911 | int | ||
912 | qla82xx_md_rw_32(struct qla_hw_data *ha, uint32_t off, u32 data, uint8_t flag) | ||
913 | { | ||
914 | uint32_t off_value, rval = 0; | ||
915 | |||
916 | WRT_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase), | ||
917 | (off & 0xFFFF0000)); | ||
918 | |||
919 | /* Read back value to make sure write has gone through */ | ||
920 | RD_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase)); | ||
921 | off_value = (off & 0x0000FFFF); | ||
922 | |||
923 | if (flag) | ||
924 | WRT_REG_DWORD((void *) | ||
925 | (off_value + CRB_INDIRECT_2M + ha->nx_pcibase), | ||
926 | data); | ||
927 | else | ||
928 | rval = RD_REG_DWORD((void *) | ||
929 | (off_value + CRB_INDIRECT_2M + ha->nx_pcibase)); | ||
930 | |||
931 | return rval; | ||
932 | } | ||
933 | |||
911 | static int | 934 | static int |
912 | qla82xx_do_rom_fast_read(struct qla_hw_data *ha, int addr, int *valp) | 935 | qla82xx_do_rom_fast_read(struct qla_hw_data *ha, int addr, int *valp) |
913 | { | 936 | { |
914 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); | 937 | /* Dword reads to flash. */ |
938 | qla82xx_md_rw_32(ha, MD_DIRECT_ROM_WINDOW, (addr & 0xFFFF0000), 1); | ||
939 | *valp = qla82xx_md_rw_32(ha, MD_DIRECT_ROM_READ_BASE + | ||
940 | (addr & 0x0000FFFF), 0, 0); | ||
915 | 941 | ||
916 | qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_ADDRESS, addr); | ||
917 | qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | ||
918 | qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_ABYTE_CNT, 3); | ||
919 | qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_INSTR_OPCODE, 0xb); | ||
920 | qla82xx_wait_rom_busy(ha); | ||
921 | if (qla82xx_wait_rom_done(ha)) { | ||
922 | ql_log(ql_log_fatal, vha, 0x00ba, | ||
923 | "Error waiting for rom done.\n"); | ||
924 | return -1; | ||
925 | } | ||
926 | /* Reset abyte_cnt and dummy_byte_cnt */ | ||
927 | qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | ||
928 | udelay(10); | ||
929 | cond_resched(); | ||
930 | qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_ABYTE_CNT, 0); | ||
931 | *valp = qla82xx_rd_32(ha, QLA82XX_ROMUSB_ROM_RDATA); | ||
932 | return 0; | 942 | return 0; |
933 | } | 943 | } |
934 | 944 | ||
@@ -2040,8 +2050,8 @@ qla82xx_intr_handler(int irq, void *dev_id) | |||
2040 | 2050 | ||
2041 | rsp = (struct rsp_que *) dev_id; | 2051 | rsp = (struct rsp_que *) dev_id; |
2042 | if (!rsp) { | 2052 | if (!rsp) { |
2043 | printk(KERN_INFO | 2053 | ql_log(ql_log_info, NULL, 0xb054, |
2044 | "%s(): NULL response queue pointer.\n", __func__); | 2054 | "%s: NULL response queue pointer.\n", __func__); |
2045 | return IRQ_NONE; | 2055 | return IRQ_NONE; |
2046 | } | 2056 | } |
2047 | ha = rsp->hw; | 2057 | ha = rsp->hw; |
@@ -3136,12 +3146,7 @@ qla82xx_check_md_needed(scsi_qla_host_t *vha) | |||
3136 | fw_minor_version = ha->fw_minor_version; | 3146 | fw_minor_version = ha->fw_minor_version; |
3137 | fw_subminor_version = ha->fw_subminor_version; | 3147 | fw_subminor_version = ha->fw_subminor_version; |
3138 | 3148 | ||
3139 | rval = qla2x00_get_fw_version(vha, &ha->fw_major_version, | 3149 | rval = qla2x00_get_fw_version(vha); |
3140 | &ha->fw_minor_version, &ha->fw_subminor_version, | ||
3141 | &ha->fw_attributes, &ha->fw_memory_size, | ||
3142 | ha->mpi_version, &ha->mpi_capabilities, | ||
3143 | ha->phy_version); | ||
3144 | |||
3145 | if (rval != QLA_SUCCESS) | 3150 | if (rval != QLA_SUCCESS) |
3146 | return rval; | 3151 | return rval; |
3147 | 3152 | ||
@@ -3150,7 +3155,6 @@ qla82xx_check_md_needed(scsi_qla_host_t *vha) | |||
3150 | if (fw_major_version != ha->fw_major_version || | 3155 | if (fw_major_version != ha->fw_major_version || |
3151 | fw_minor_version != ha->fw_minor_version || | 3156 | fw_minor_version != ha->fw_minor_version || |
3152 | fw_subminor_version != ha->fw_subminor_version) { | 3157 | fw_subminor_version != ha->fw_subminor_version) { |
3153 | |||
3154 | ql_log(ql_log_info, vha, 0xb02d, | 3158 | ql_log(ql_log_info, vha, 0xb02d, |
3155 | "Firmware version differs " | 3159 | "Firmware version differs " |
3156 | "Previous version: %d:%d:%d - " | 3160 | "Previous version: %d:%d:%d - " |
@@ -3614,7 +3618,7 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha) | |||
3614 | for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { | 3618 | for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { |
3615 | sp = req->outstanding_cmds[cnt]; | 3619 | sp = req->outstanding_cmds[cnt]; |
3616 | if (sp) { | 3620 | if (sp) { |
3617 | if (!sp->ctx || | 3621 | if (!sp->u.scmd.ctx || |
3618 | (sp->flags & SRB_FCP_CMND_DMA_VALID)) { | 3622 | (sp->flags & SRB_FCP_CMND_DMA_VALID)) { |
3619 | spin_unlock_irqrestore( | 3623 | spin_unlock_irqrestore( |
3620 | &ha->hardware_lock, flags); | 3624 | &ha->hardware_lock, flags); |
@@ -3645,29 +3649,6 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha) | |||
3645 | } | 3649 | } |
3646 | 3650 | ||
3647 | /* Minidump related functions */ | 3651 | /* Minidump related functions */ |
3648 | int | ||
3649 | qla82xx_md_rw_32(struct qla_hw_data *ha, uint32_t off, u32 data, uint8_t flag) | ||
3650 | { | ||
3651 | uint32_t off_value, rval = 0; | ||
3652 | |||
3653 | WRT_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase), | ||
3654 | (off & 0xFFFF0000)); | ||
3655 | |||
3656 | /* Read back value to make sure write has gone through */ | ||
3657 | RD_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase)); | ||
3658 | off_value = (off & 0x0000FFFF); | ||
3659 | |||
3660 | if (flag) | ||
3661 | WRT_REG_DWORD((void *) | ||
3662 | (off_value + CRB_INDIRECT_2M + ha->nx_pcibase), | ||
3663 | data); | ||
3664 | else | ||
3665 | rval = RD_REG_DWORD((void *) | ||
3666 | (off_value + CRB_INDIRECT_2M + ha->nx_pcibase)); | ||
3667 | |||
3668 | return rval; | ||
3669 | } | ||
3670 | |||
3671 | static int | 3652 | static int |
3672 | qla82xx_minidump_process_control(scsi_qla_host_t *vha, | 3653 | qla82xx_minidump_process_control(scsi_qla_host_t *vha, |
3673 | qla82xx_md_entry_hdr_t *entry_hdr, uint32_t **d_ptr) | 3654 | qla82xx_md_entry_hdr_t *entry_hdr, uint32_t **d_ptr) |
@@ -4117,8 +4098,9 @@ qla82xx_md_collect(scsi_qla_host_t *vha) | |||
4117 | data_ptr = (uint32_t *)ha->md_dump; | 4098 | data_ptr = (uint32_t *)ha->md_dump; |
4118 | 4099 | ||
4119 | if (ha->fw_dumped) { | 4100 | if (ha->fw_dumped) { |
4120 | ql_log(ql_log_info, vha, 0xb037, | 4101 | ql_log(ql_log_warn, vha, 0xb037, |
4121 | "Firmware dump available to retrive\n"); | 4102 | "Firmware has been previously dumped (%p) " |
4103 | "-- ignoring request.\n", ha->fw_dump); | ||
4122 | goto md_failed; | 4104 | goto md_failed; |
4123 | } | 4105 | } |
4124 | 4106 | ||
@@ -4161,7 +4143,7 @@ qla82xx_md_collect(scsi_qla_host_t *vha) | |||
4161 | 4143 | ||
4162 | total_data_size = ha->md_dump_size; | 4144 | total_data_size = ha->md_dump_size; |
4163 | 4145 | ||
4164 | ql_dbg(ql_log_info, vha, 0xb03d, | 4146 | ql_dbg(ql_dbg_p3p, vha, 0xb03d, |
4165 | "Total minidump data_size 0x%x to be captured\n", total_data_size); | 4147 | "Total minidump data_size 0x%x to be captured\n", total_data_size); |
4166 | 4148 | ||
4167 | /* Check whether template obtained is valid */ | 4149 | /* Check whether template obtained is valid */ |
@@ -4284,7 +4266,7 @@ skip_nxt_entry: | |||
4284 | } | 4266 | } |
4285 | 4267 | ||
4286 | if (data_collected != total_data_size) { | 4268 | if (data_collected != total_data_size) { |
4287 | ql_dbg(ql_log_warn, vha, 0xb043, | 4269 | ql_dbg(ql_dbg_p3p, vha, 0xb043, |
4288 | "MiniDump data mismatch: Data collected: [0x%x]," | 4270 | "MiniDump data mismatch: Data collected: [0x%x]," |
4289 | "total_data_size:[0x%x]\n", | 4271 | "total_data_size:[0x%x]\n", |
4290 | data_collected, total_data_size); | 4272 | data_collected, total_data_size); |
diff --git a/drivers/scsi/qla2xxx/qla_nx.h b/drivers/scsi/qla2xxx/qla_nx.h index 57a226be339..4ac50e27466 100644 --- a/drivers/scsi/qla2xxx/qla_nx.h +++ b/drivers/scsi/qla2xxx/qla_nx.h | |||
@@ -888,7 +888,8 @@ struct ct6_dsd { | |||
888 | }; | 888 | }; |
889 | 889 | ||
890 | #define MBC_TOGGLE_INTERRUPT 0x10 | 890 | #define MBC_TOGGLE_INTERRUPT 0x10 |
891 | #define MBC_SET_LED_CONFIG 0x125 | 891 | #define MBC_SET_LED_CONFIG 0x125 /* FCoE specific LED control */ |
892 | #define MBC_GET_LED_CONFIG 0x126 /* FCoE specific LED control */ | ||
892 | 893 | ||
893 | /* Flash offset */ | 894 | /* Flash offset */ |
894 | #define FLT_REG_BOOTLOAD_82XX 0x72 | 895 | #define FLT_REG_BOOTLOAD_82XX 0x72 |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 036030c9533..a2f999273a5 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -304,7 +304,6 @@ static int qla2x00_mem_alloc(struct qla_hw_data *, uint16_t, uint16_t, | |||
304 | struct req_que **, struct rsp_que **); | 304 | struct req_que **, struct rsp_que **); |
305 | static void qla2x00_free_fw_dump(struct qla_hw_data *); | 305 | static void qla2x00_free_fw_dump(struct qla_hw_data *); |
306 | static void qla2x00_mem_free(struct qla_hw_data *); | 306 | static void qla2x00_mem_free(struct qla_hw_data *); |
307 | static void qla2x00_sp_free_dma(srb_t *); | ||
308 | 307 | ||
309 | /* -------------------------------------------------------------------------- */ | 308 | /* -------------------------------------------------------------------------- */ |
310 | static int qla2x00_alloc_queues(struct qla_hw_data *ha) | 309 | static int qla2x00_alloc_queues(struct qla_hw_data *ha) |
@@ -559,28 +558,75 @@ qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str) | |||
559 | return str; | 558 | return str; |
560 | } | 559 | } |
561 | 560 | ||
562 | static inline srb_t * | 561 | void |
563 | qla2x00_get_new_sp(scsi_qla_host_t *vha, fc_port_t *fcport, | 562 | qla2x00_sp_free_dma(void *vha, void *ptr) |
564 | struct scsi_cmnd *cmd) | ||
565 | { | 563 | { |
566 | srb_t *sp; | 564 | srb_t *sp = (srb_t *)ptr; |
567 | struct qla_hw_data *ha = vha->hw; | 565 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
566 | struct qla_hw_data *ha = sp->fcport->vha->hw; | ||
567 | void *ctx = GET_CMD_CTX_SP(sp); | ||
568 | 568 | ||
569 | sp = mempool_alloc(ha->srb_mempool, GFP_ATOMIC); | 569 | if (sp->flags & SRB_DMA_VALID) { |
570 | if (!sp) { | 570 | scsi_dma_unmap(cmd); |
571 | ql_log(ql_log_warn, vha, 0x3006, | 571 | sp->flags &= ~SRB_DMA_VALID; |
572 | "Memory allocation failed for sp.\n"); | ||
573 | return sp; | ||
574 | } | 572 | } |
575 | 573 | ||
576 | atomic_set(&sp->ref_count, 1); | 574 | if (sp->flags & SRB_CRC_PROT_DMA_VALID) { |
577 | sp->fcport = fcport; | 575 | dma_unmap_sg(&ha->pdev->dev, scsi_prot_sglist(cmd), |
578 | sp->cmd = cmd; | 576 | scsi_prot_sg_count(cmd), cmd->sc_data_direction); |
579 | sp->flags = 0; | 577 | sp->flags &= ~SRB_CRC_PROT_DMA_VALID; |
580 | CMD_SP(cmd) = (void *)sp; | 578 | } |
581 | sp->ctx = NULL; | ||
582 | 579 | ||
583 | return sp; | 580 | if (sp->flags & SRB_CRC_CTX_DSD_VALID) { |
581 | /* List assured to be having elements */ | ||
582 | qla2x00_clean_dsd_pool(ha, sp); | ||
583 | sp->flags &= ~SRB_CRC_CTX_DSD_VALID; | ||
584 | } | ||
585 | |||
586 | if (sp->flags & SRB_CRC_CTX_DMA_VALID) { | ||
587 | dma_pool_free(ha->dl_dma_pool, ctx, | ||
588 | ((struct crc_context *)ctx)->crc_ctx_dma); | ||
589 | sp->flags &= ~SRB_CRC_CTX_DMA_VALID; | ||
590 | } | ||
591 | |||
592 | if (sp->flags & SRB_FCP_CMND_DMA_VALID) { | ||
593 | struct ct6_dsd *ctx1 = (struct ct6_dsd *)ctx; | ||
594 | |||
595 | dma_pool_free(ha->fcp_cmnd_dma_pool, ctx1->fcp_cmnd, | ||
596 | ctx1->fcp_cmnd_dma); | ||
597 | list_splice(&ctx1->dsd_list, &ha->gbl_dsd_list); | ||
598 | ha->gbl_dsd_inuse -= ctx1->dsd_use_cnt; | ||
599 | ha->gbl_dsd_avail += ctx1->dsd_use_cnt; | ||
600 | mempool_free(ctx1, ha->ctx_mempool); | ||
601 | ctx1 = NULL; | ||
602 | } | ||
603 | |||
604 | CMD_SP(cmd) = NULL; | ||
605 | mempool_free(sp, ha->srb_mempool); | ||
606 | } | ||
607 | |||
608 | static void | ||
609 | qla2x00_sp_compl(void *data, void *ptr, int res) | ||
610 | { | ||
611 | struct qla_hw_data *ha = (struct qla_hw_data *)data; | ||
612 | srb_t *sp = (srb_t *)ptr; | ||
613 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); | ||
614 | |||
615 | cmd->result = res; | ||
616 | |||
617 | if (atomic_read(&sp->ref_count) == 0) { | ||
618 | ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3015, | ||
619 | "SP reference-count to ZERO -- sp=%p cmd=%p.\n", | ||
620 | sp, GET_CMD_SP(sp)); | ||
621 | if (ql2xextended_error_logging & ql_dbg_io) | ||
622 | BUG(); | ||
623 | return; | ||
624 | } | ||
625 | if (!atomic_dec_and_test(&sp->ref_count)) | ||
626 | return; | ||
627 | |||
628 | qla2x00_sp_free_dma(ha, sp); | ||
629 | cmd->scsi_done(cmd); | ||
584 | } | 630 | } |
585 | 631 | ||
586 | static int | 632 | static int |
@@ -644,10 +690,17 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) | |||
644 | goto qc24_target_busy; | 690 | goto qc24_target_busy; |
645 | } | 691 | } |
646 | 692 | ||
647 | sp = qla2x00_get_new_sp(base_vha, fcport, cmd); | 693 | sp = qla2x00_get_sp(base_vha, fcport, GFP_ATOMIC); |
648 | if (!sp) | 694 | if (!sp) |
649 | goto qc24_host_busy; | 695 | goto qc24_host_busy; |
650 | 696 | ||
697 | sp->u.scmd.cmd = cmd; | ||
698 | sp->type = SRB_SCSI_CMD; | ||
699 | atomic_set(&sp->ref_count, 1); | ||
700 | CMD_SP(cmd) = (void *)sp; | ||
701 | sp->free = qla2x00_sp_free_dma; | ||
702 | sp->done = qla2x00_sp_compl; | ||
703 | |||
651 | rval = ha->isp_ops->start_scsi(sp); | 704 | rval = ha->isp_ops->start_scsi(sp); |
652 | if (rval != QLA_SUCCESS) { | 705 | if (rval != QLA_SUCCESS) { |
653 | ql_dbg(ql_dbg_io, vha, 0x3013, | 706 | ql_dbg(ql_dbg_io, vha, 0x3013, |
@@ -658,8 +711,7 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) | |||
658 | return 0; | 711 | return 0; |
659 | 712 | ||
660 | qc24_host_busy_free_sp: | 713 | qc24_host_busy_free_sp: |
661 | qla2x00_sp_free_dma(sp); | 714 | qla2x00_sp_free_dma(ha, sp); |
662 | mempool_free(sp, ha->srb_mempool); | ||
663 | 715 | ||
664 | qc24_host_busy: | 716 | qc24_host_busy: |
665 | return SCSI_MLQUEUE_HOST_BUSY; | 717 | return SCSI_MLQUEUE_HOST_BUSY; |
@@ -893,7 +945,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) | |||
893 | } | 945 | } |
894 | 946 | ||
895 | spin_lock_irqsave(&ha->hardware_lock, flags); | 947 | spin_lock_irqsave(&ha->hardware_lock, flags); |
896 | qla2x00_sp_compl(ha, sp); | 948 | sp->done(ha, sp, 0); |
897 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 949 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
898 | 950 | ||
899 | /* Did the command return during mailbox execution? */ | 951 | /* Did the command return during mailbox execution? */ |
@@ -925,6 +977,7 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t, | |||
925 | struct qla_hw_data *ha = vha->hw; | 977 | struct qla_hw_data *ha = vha->hw; |
926 | struct req_que *req; | 978 | struct req_que *req; |
927 | srb_t *sp; | 979 | srb_t *sp; |
980 | struct scsi_cmnd *cmd; | ||
928 | 981 | ||
929 | status = QLA_SUCCESS; | 982 | status = QLA_SUCCESS; |
930 | 983 | ||
@@ -935,28 +988,29 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t, | |||
935 | sp = req->outstanding_cmds[cnt]; | 988 | sp = req->outstanding_cmds[cnt]; |
936 | if (!sp) | 989 | if (!sp) |
937 | continue; | 990 | continue; |
938 | if ((sp->ctx) && !IS_PROT_IO(sp)) | 991 | if (sp->type != SRB_SCSI_CMD) |
939 | continue; | 992 | continue; |
940 | if (vha->vp_idx != sp->fcport->vha->vp_idx) | 993 | if (vha->vp_idx != sp->fcport->vha->vp_idx) |
941 | continue; | 994 | continue; |
942 | match = 0; | 995 | match = 0; |
996 | cmd = GET_CMD_SP(sp); | ||
943 | switch (type) { | 997 | switch (type) { |
944 | case WAIT_HOST: | 998 | case WAIT_HOST: |
945 | match = 1; | 999 | match = 1; |
946 | break; | 1000 | break; |
947 | case WAIT_TARGET: | 1001 | case WAIT_TARGET: |
948 | match = sp->cmd->device->id == t; | 1002 | match = cmd->device->id == t; |
949 | break; | 1003 | break; |
950 | case WAIT_LUN: | 1004 | case WAIT_LUN: |
951 | match = (sp->cmd->device->id == t && | 1005 | match = (cmd->device->id == t && |
952 | sp->cmd->device->lun == l); | 1006 | cmd->device->lun == l); |
953 | break; | 1007 | break; |
954 | } | 1008 | } |
955 | if (!match) | 1009 | if (!match) |
956 | continue; | 1010 | continue; |
957 | 1011 | ||
958 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1012 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
959 | status = qla2x00_eh_wait_on_command(sp->cmd); | 1013 | status = qla2x00_eh_wait_on_command(cmd); |
960 | spin_lock_irqsave(&ha->hardware_lock, flags); | 1014 | spin_lock_irqsave(&ha->hardware_lock, flags); |
961 | } | 1015 | } |
962 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1016 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
@@ -1219,7 +1273,7 @@ qla2x00_loop_reset(scsi_qla_host_t *vha) | |||
1219 | } | 1273 | } |
1220 | } | 1274 | } |
1221 | 1275 | ||
1222 | if (ha->flags.enable_lip_full_login && !IS_QLA8XXX_TYPE(ha)) { | 1276 | if (ha->flags.enable_lip_full_login && !IS_CNA_CAPABLE(ha)) { |
1223 | ret = qla2x00_full_login_lip(vha); | 1277 | ret = qla2x00_full_login_lip(vha); |
1224 | if (ret != QLA_SUCCESS) { | 1278 | if (ret != QLA_SUCCESS) { |
1225 | ql_dbg(ql_dbg_taskm, vha, 0x802d, | 1279 | ql_dbg(ql_dbg_taskm, vha, 0x802d, |
@@ -1249,7 +1303,6 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) | |||
1249 | int que, cnt; | 1303 | int que, cnt; |
1250 | unsigned long flags; | 1304 | unsigned long flags; |
1251 | srb_t *sp; | 1305 | srb_t *sp; |
1252 | struct srb_ctx *ctx; | ||
1253 | struct qla_hw_data *ha = vha->hw; | 1306 | struct qla_hw_data *ha = vha->hw; |
1254 | struct req_que *req; | 1307 | struct req_que *req; |
1255 | 1308 | ||
@@ -1262,31 +1315,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) | |||
1262 | sp = req->outstanding_cmds[cnt]; | 1315 | sp = req->outstanding_cmds[cnt]; |
1263 | if (sp) { | 1316 | if (sp) { |
1264 | req->outstanding_cmds[cnt] = NULL; | 1317 | req->outstanding_cmds[cnt] = NULL; |
1265 | if (!sp->ctx || | 1318 | sp->done(vha, sp, res); |
1266 | (sp->flags & SRB_FCP_CMND_DMA_VALID) || | ||
1267 | IS_PROT_IO(sp)) { | ||
1268 | sp->cmd->result = res; | ||
1269 | qla2x00_sp_compl(ha, sp); | ||
1270 | } else { | ||
1271 | ctx = sp->ctx; | ||
1272 | if (ctx->type == SRB_ELS_CMD_RPT || | ||
1273 | ctx->type == SRB_ELS_CMD_HST || | ||
1274 | ctx->type == SRB_CT_CMD) { | ||
1275 | struct fc_bsg_job *bsg_job = | ||
1276 | ctx->u.bsg_job; | ||
1277 | if (bsg_job->request->msgcode | ||
1278 | == FC_BSG_HST_CT) | ||
1279 | kfree(sp->fcport); | ||
1280 | bsg_job->req->errors = 0; | ||
1281 | bsg_job->reply->result = res; | ||
1282 | bsg_job->job_done(bsg_job); | ||
1283 | kfree(sp->ctx); | ||
1284 | mempool_free(sp, | ||
1285 | ha->srb_mempool); | ||
1286 | } else { | ||
1287 | ctx->u.iocb_cmd->free(sp); | ||
1288 | } | ||
1289 | } | ||
1290 | } | 1319 | } |
1291 | } | 1320 | } |
1292 | } | 1321 | } |
@@ -1488,9 +1517,6 @@ qla2x00_iospace_config(struct qla_hw_data *ha) | |||
1488 | uint16_t msix; | 1517 | uint16_t msix; |
1489 | int cpus; | 1518 | int cpus; |
1490 | 1519 | ||
1491 | if (IS_QLA82XX(ha)) | ||
1492 | return qla82xx_iospace_config(ha); | ||
1493 | |||
1494 | if (pci_request_selected_regions(ha->pdev, ha->bars, | 1520 | if (pci_request_selected_regions(ha->pdev, ha->bars, |
1495 | QLA2XXX_DRIVER_NAME)) { | 1521 | QLA2XXX_DRIVER_NAME)) { |
1496 | ql_log_pci(ql_log_fatal, ha->pdev, 0x0011, | 1522 | ql_log_pci(ql_log_fatal, ha->pdev, 0x0011, |
@@ -1593,6 +1619,96 @@ iospace_error_exit: | |||
1593 | } | 1619 | } |
1594 | 1620 | ||
1595 | 1621 | ||
1622 | static int | ||
1623 | qla83xx_iospace_config(struct qla_hw_data *ha) | ||
1624 | { | ||
1625 | uint16_t msix; | ||
1626 | int cpus; | ||
1627 | |||
1628 | if (pci_request_selected_regions(ha->pdev, ha->bars, | ||
1629 | QLA2XXX_DRIVER_NAME)) { | ||
1630 | ql_log_pci(ql_log_fatal, ha->pdev, 0x0117, | ||
1631 | "Failed to reserve PIO/MMIO regions (%s), aborting.\n", | ||
1632 | pci_name(ha->pdev)); | ||
1633 | |||
1634 | goto iospace_error_exit; | ||
1635 | } | ||
1636 | |||
1637 | /* Use MMIO operations for all accesses. */ | ||
1638 | if (!(pci_resource_flags(ha->pdev, 0) & IORESOURCE_MEM)) { | ||
1639 | ql_log_pci(ql_log_warn, ha->pdev, 0x0118, | ||
1640 | "Invalid pci I/O region size (%s).\n", | ||
1641 | pci_name(ha->pdev)); | ||
1642 | goto iospace_error_exit; | ||
1643 | } | ||
1644 | if (pci_resource_len(ha->pdev, 0) < MIN_IOBASE_LEN) { | ||
1645 | ql_log_pci(ql_log_warn, ha->pdev, 0x0119, | ||
1646 | "Invalid PCI mem region size (%s), aborting\n", | ||
1647 | pci_name(ha->pdev)); | ||
1648 | goto iospace_error_exit; | ||
1649 | } | ||
1650 | |||
1651 | ha->iobase = ioremap(pci_resource_start(ha->pdev, 0), MIN_IOBASE_LEN); | ||
1652 | if (!ha->iobase) { | ||
1653 | ql_log_pci(ql_log_fatal, ha->pdev, 0x011a, | ||
1654 | "Cannot remap MMIO (%s), aborting.\n", | ||
1655 | pci_name(ha->pdev)); | ||
1656 | goto iospace_error_exit; | ||
1657 | } | ||
1658 | |||
1659 | /* 64bit PCI BAR - BAR2 will correspoond to region 4 */ | ||
1660 | /* 83XX 26XX always use MQ type access for queues | ||
1661 | * - mbar 2, a.k.a region 4 */ | ||
1662 | ha->max_req_queues = ha->max_rsp_queues = 1; | ||
1663 | ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 4), | ||
1664 | pci_resource_len(ha->pdev, 4)); | ||
1665 | |||
1666 | if (!ha->mqiobase) { | ||
1667 | ql_log_pci(ql_log_fatal, ha->pdev, 0x011d, | ||
1668 | "BAR2/region4 not enabled\n"); | ||
1669 | goto mqiobase_exit; | ||
1670 | } | ||
1671 | |||
1672 | ha->msixbase = ioremap(pci_resource_start(ha->pdev, 2), | ||
1673 | pci_resource_len(ha->pdev, 2)); | ||
1674 | if (ha->msixbase) { | ||
1675 | /* Read MSIX vector size of the board */ | ||
1676 | pci_read_config_word(ha->pdev, | ||
1677 | QLA_83XX_PCI_MSIX_CONTROL, &msix); | ||
1678 | ha->msix_count = msix; | ||
1679 | /* Max queues are bounded by available msix vectors */ | ||
1680 | /* queue 0 uses two msix vectors */ | ||
1681 | if (ql2xmultique_tag) { | ||
1682 | cpus = num_online_cpus(); | ||
1683 | ha->max_rsp_queues = (ha->msix_count - 1 > cpus) ? | ||
1684 | (cpus + 1) : (ha->msix_count - 1); | ||
1685 | ha->max_req_queues = 2; | ||
1686 | } else if (ql2xmaxqueues > 1) { | ||
1687 | ha->max_req_queues = ql2xmaxqueues > QLA_MQ_SIZE ? | ||
1688 | QLA_MQ_SIZE : ql2xmaxqueues; | ||
1689 | ql_dbg_pci(ql_dbg_multiq, ha->pdev, 0xc00c, | ||
1690 | "QoS mode set, max no of request queues:%d.\n", | ||
1691 | ha->max_req_queues); | ||
1692 | ql_dbg_pci(ql_dbg_init, ha->pdev, 0x011b, | ||
1693 | "QoS mode set, max no of request queues:%d.\n", | ||
1694 | ha->max_req_queues); | ||
1695 | } | ||
1696 | ql_log_pci(ql_log_info, ha->pdev, 0x011c, | ||
1697 | "MSI-X vector count: %d.\n", msix); | ||
1698 | } else | ||
1699 | ql_log_pci(ql_log_info, ha->pdev, 0x011e, | ||
1700 | "BAR 1 not enabled.\n"); | ||
1701 | |||
1702 | mqiobase_exit: | ||
1703 | ha->msix_count = ha->max_rsp_queues + 1; | ||
1704 | ql_dbg_pci(ql_dbg_init, ha->pdev, 0x011f, | ||
1705 | "MSIX Count:%d.\n", ha->msix_count); | ||
1706 | return 0; | ||
1707 | |||
1708 | iospace_error_exit: | ||
1709 | return -ENOMEM; | ||
1710 | } | ||
1711 | |||
1596 | static struct isp_operations qla2100_isp_ops = { | 1712 | static struct isp_operations qla2100_isp_ops = { |
1597 | .pci_config = qla2100_pci_config, | 1713 | .pci_config = qla2100_pci_config, |
1598 | .reset_chip = qla2x00_reset_chip, | 1714 | .reset_chip = qla2x00_reset_chip, |
@@ -1769,7 +1885,7 @@ static struct isp_operations qla81xx_isp_ops = { | |||
1769 | .fw_dump = qla81xx_fw_dump, | 1885 | .fw_dump = qla81xx_fw_dump, |
1770 | .beacon_on = qla24xx_beacon_on, | 1886 | .beacon_on = qla24xx_beacon_on, |
1771 | .beacon_off = qla24xx_beacon_off, | 1887 | .beacon_off = qla24xx_beacon_off, |
1772 | .beacon_blink = qla24xx_beacon_blink, | 1888 | .beacon_blink = qla83xx_beacon_blink, |
1773 | .read_optrom = qla25xx_read_optrom_data, | 1889 | .read_optrom = qla25xx_read_optrom_data, |
1774 | .write_optrom = qla24xx_write_optrom_data, | 1890 | .write_optrom = qla24xx_write_optrom_data, |
1775 | .get_flash_version = qla24xx_get_flash_version, | 1891 | .get_flash_version = qla24xx_get_flash_version, |
@@ -1815,6 +1931,43 @@ static struct isp_operations qla82xx_isp_ops = { | |||
1815 | .iospace_config = qla82xx_iospace_config, | 1931 | .iospace_config = qla82xx_iospace_config, |
1816 | }; | 1932 | }; |
1817 | 1933 | ||
1934 | static struct isp_operations qla83xx_isp_ops = { | ||
1935 | .pci_config = qla25xx_pci_config, | ||
1936 | .reset_chip = qla24xx_reset_chip, | ||
1937 | .chip_diag = qla24xx_chip_diag, | ||
1938 | .config_rings = qla24xx_config_rings, | ||
1939 | .reset_adapter = qla24xx_reset_adapter, | ||
1940 | .nvram_config = qla81xx_nvram_config, | ||
1941 | .update_fw_options = qla81xx_update_fw_options, | ||
1942 | .load_risc = qla81xx_load_risc, | ||
1943 | .pci_info_str = qla24xx_pci_info_str, | ||
1944 | .fw_version_str = qla24xx_fw_version_str, | ||
1945 | .intr_handler = qla24xx_intr_handler, | ||
1946 | .enable_intrs = qla24xx_enable_intrs, | ||
1947 | .disable_intrs = qla24xx_disable_intrs, | ||
1948 | .abort_command = qla24xx_abort_command, | ||
1949 | .target_reset = qla24xx_abort_target, | ||
1950 | .lun_reset = qla24xx_lun_reset, | ||
1951 | .fabric_login = qla24xx_login_fabric, | ||
1952 | .fabric_logout = qla24xx_fabric_logout, | ||
1953 | .calc_req_entries = NULL, | ||
1954 | .build_iocbs = NULL, | ||
1955 | .prep_ms_iocb = qla24xx_prep_ms_iocb, | ||
1956 | .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb, | ||
1957 | .read_nvram = NULL, | ||
1958 | .write_nvram = NULL, | ||
1959 | .fw_dump = qla83xx_fw_dump, | ||
1960 | .beacon_on = qla24xx_beacon_on, | ||
1961 | .beacon_off = qla24xx_beacon_off, | ||
1962 | .beacon_blink = qla83xx_beacon_blink, | ||
1963 | .read_optrom = qla25xx_read_optrom_data, | ||
1964 | .write_optrom = qla24xx_write_optrom_data, | ||
1965 | .get_flash_version = qla24xx_get_flash_version, | ||
1966 | .start_scsi = qla24xx_dif_start_scsi, | ||
1967 | .abort_isp = qla2x00_abort_isp, | ||
1968 | .iospace_config = qla83xx_iospace_config, | ||
1969 | }; | ||
1970 | |||
1818 | static inline void | 1971 | static inline void |
1819 | qla2x00_set_isp_flags(struct qla_hw_data *ha) | 1972 | qla2x00_set_isp_flags(struct qla_hw_data *ha) |
1820 | { | 1973 | { |
@@ -1909,6 +2062,22 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha) | |||
1909 | /* Initialize 82XX ISP flags */ | 2062 | /* Initialize 82XX ISP flags */ |
1910 | qla82xx_init_flags(ha); | 2063 | qla82xx_init_flags(ha); |
1911 | break; | 2064 | break; |
2065 | case PCI_DEVICE_ID_QLOGIC_ISP2031: | ||
2066 | ha->device_type |= DT_ISP2031; | ||
2067 | ha->device_type |= DT_ZIO_SUPPORTED; | ||
2068 | ha->device_type |= DT_FWI2; | ||
2069 | ha->device_type |= DT_IIDMA; | ||
2070 | ha->device_type |= DT_T10_PI; | ||
2071 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | ||
2072 | break; | ||
2073 | case PCI_DEVICE_ID_QLOGIC_ISP8031: | ||
2074 | ha->device_type |= DT_ISP8031; | ||
2075 | ha->device_type |= DT_ZIO_SUPPORTED; | ||
2076 | ha->device_type |= DT_FWI2; | ||
2077 | ha->device_type |= DT_IIDMA; | ||
2078 | ha->device_type |= DT_T10_PI; | ||
2079 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | ||
2080 | break; | ||
1912 | } | 2081 | } |
1913 | 2082 | ||
1914 | if (IS_QLA82XX(ha)) | 2083 | if (IS_QLA82XX(ha)) |
@@ -1966,7 +2135,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1966 | char pci_info[30]; | 2135 | char pci_info[30]; |
1967 | char fw_str[30]; | 2136 | char fw_str[30]; |
1968 | struct scsi_host_template *sht; | 2137 | struct scsi_host_template *sht; |
1969 | int bars, max_id, mem_only = 0; | 2138 | int bars, mem_only = 0; |
1970 | uint16_t req_length = 0, rsp_length = 0; | 2139 | uint16_t req_length = 0, rsp_length = 0; |
1971 | struct req_que *req = NULL; | 2140 | struct req_que *req = NULL; |
1972 | struct rsp_que *rsp = NULL; | 2141 | struct rsp_que *rsp = NULL; |
@@ -1980,7 +2149,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1980 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 || | 2149 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 || |
1981 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532 || | 2150 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532 || |
1982 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8001 || | 2151 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8001 || |
1983 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8021) { | 2152 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8021 || |
2153 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2031 || | ||
2154 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8031) { | ||
1984 | bars = pci_select_bars(pdev, IORESOURCE_MEM); | 2155 | bars = pci_select_bars(pdev, IORESOURCE_MEM); |
1985 | mem_only = 1; | 2156 | mem_only = 1; |
1986 | ql_dbg_pci(ql_dbg_init, pdev, 0x0007, | 2157 | ql_dbg_pci(ql_dbg_init, pdev, 0x0007, |
@@ -2020,9 +2191,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2020 | qla2x00_set_isp_flags(ha); | 2191 | qla2x00_set_isp_flags(ha); |
2021 | 2192 | ||
2022 | /* Set EEH reset type to fundamental if required by hba */ | 2193 | /* Set EEH reset type to fundamental if required by hba */ |
2023 | if ( IS_QLA24XX(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha)) { | 2194 | if (IS_QLA24XX(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha)) |
2024 | pdev->needs_freset = 1; | 2195 | pdev->needs_freset = 1; |
2025 | } | ||
2026 | 2196 | ||
2027 | ha->prev_topology = 0; | 2197 | ha->prev_topology = 0; |
2028 | ha->init_cb_size = sizeof(init_cb_t); | 2198 | ha->init_cb_size = sizeof(init_cb_t); |
@@ -2030,9 +2200,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2030 | ha->optrom_size = OPTROM_SIZE_2300; | 2200 | ha->optrom_size = OPTROM_SIZE_2300; |
2031 | 2201 | ||
2032 | /* Assign ISP specific operations. */ | 2202 | /* Assign ISP specific operations. */ |
2033 | max_id = MAX_TARGETS_2200; | ||
2034 | if (IS_QLA2100(ha)) { | 2203 | if (IS_QLA2100(ha)) { |
2035 | max_id = MAX_TARGETS_2100; | 2204 | ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100; |
2036 | ha->mbx_count = MAILBOX_REGISTER_COUNT_2100; | 2205 | ha->mbx_count = MAILBOX_REGISTER_COUNT_2100; |
2037 | req_length = REQUEST_ENTRY_CNT_2100; | 2206 | req_length = REQUEST_ENTRY_CNT_2100; |
2038 | rsp_length = RESPONSE_ENTRY_CNT_2100; | 2207 | rsp_length = RESPONSE_ENTRY_CNT_2100; |
@@ -2044,6 +2213,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2044 | ha->nvram_data_off = ~0; | 2213 | ha->nvram_data_off = ~0; |
2045 | ha->isp_ops = &qla2100_isp_ops; | 2214 | ha->isp_ops = &qla2100_isp_ops; |
2046 | } else if (IS_QLA2200(ha)) { | 2215 | } else if (IS_QLA2200(ha)) { |
2216 | ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100; | ||
2047 | ha->mbx_count = MAILBOX_REGISTER_COUNT_2200; | 2217 | ha->mbx_count = MAILBOX_REGISTER_COUNT_2200; |
2048 | req_length = REQUEST_ENTRY_CNT_2200; | 2218 | req_length = REQUEST_ENTRY_CNT_2200; |
2049 | rsp_length = RESPONSE_ENTRY_CNT_2100; | 2219 | rsp_length = RESPONSE_ENTRY_CNT_2100; |
@@ -2055,6 +2225,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2055 | ha->nvram_data_off = ~0; | 2225 | ha->nvram_data_off = ~0; |
2056 | ha->isp_ops = &qla2100_isp_ops; | 2226 | ha->isp_ops = &qla2100_isp_ops; |
2057 | } else if (IS_QLA23XX(ha)) { | 2227 | } else if (IS_QLA23XX(ha)) { |
2228 | ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100; | ||
2058 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 2229 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
2059 | req_length = REQUEST_ENTRY_CNT_2200; | 2230 | req_length = REQUEST_ENTRY_CNT_2200; |
2060 | rsp_length = RESPONSE_ENTRY_CNT_2300; | 2231 | rsp_length = RESPONSE_ENTRY_CNT_2300; |
@@ -2068,6 +2239,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2068 | ha->nvram_data_off = ~0; | 2239 | ha->nvram_data_off = ~0; |
2069 | ha->isp_ops = &qla2300_isp_ops; | 2240 | ha->isp_ops = &qla2300_isp_ops; |
2070 | } else if (IS_QLA24XX_TYPE(ha)) { | 2241 | } else if (IS_QLA24XX_TYPE(ha)) { |
2242 | ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400; | ||
2071 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 2243 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
2072 | req_length = REQUEST_ENTRY_CNT_24XX; | 2244 | req_length = REQUEST_ENTRY_CNT_24XX; |
2073 | rsp_length = RESPONSE_ENTRY_CNT_2300; | 2245 | rsp_length = RESPONSE_ENTRY_CNT_2300; |
@@ -2082,6 +2254,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2082 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; | 2254 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; |
2083 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; | 2255 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; |
2084 | } else if (IS_QLA25XX(ha)) { | 2256 | } else if (IS_QLA25XX(ha)) { |
2257 | ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400; | ||
2085 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 2258 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
2086 | req_length = REQUEST_ENTRY_CNT_24XX; | 2259 | req_length = REQUEST_ENTRY_CNT_24XX; |
2087 | rsp_length = RESPONSE_ENTRY_CNT_2300; | 2260 | rsp_length = RESPONSE_ENTRY_CNT_2300; |
@@ -2096,6 +2269,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2096 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; | 2269 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; |
2097 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; | 2270 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; |
2098 | } else if (IS_QLA81XX(ha)) { | 2271 | } else if (IS_QLA81XX(ha)) { |
2272 | ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400; | ||
2099 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 2273 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
2100 | req_length = REQUEST_ENTRY_CNT_24XX; | 2274 | req_length = REQUEST_ENTRY_CNT_24XX; |
2101 | rsp_length = RESPONSE_ENTRY_CNT_2300; | 2275 | rsp_length = RESPONSE_ENTRY_CNT_2300; |
@@ -2110,6 +2284,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2110 | ha->nvram_conf_off = ~0; | 2284 | ha->nvram_conf_off = ~0; |
2111 | ha->nvram_data_off = ~0; | 2285 | ha->nvram_data_off = ~0; |
2112 | } else if (IS_QLA82XX(ha)) { | 2286 | } else if (IS_QLA82XX(ha)) { |
2287 | ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400; | ||
2113 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 2288 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
2114 | req_length = REQUEST_ENTRY_CNT_82XX; | 2289 | req_length = REQUEST_ENTRY_CNT_82XX; |
2115 | rsp_length = RESPONSE_ENTRY_CNT_82XX; | 2290 | rsp_length = RESPONSE_ENTRY_CNT_82XX; |
@@ -2123,14 +2298,31 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2123 | ha->flash_data_off = FARX_ACCESS_FLASH_DATA; | 2298 | ha->flash_data_off = FARX_ACCESS_FLASH_DATA; |
2124 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; | 2299 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; |
2125 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; | 2300 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; |
2301 | } else if (IS_QLA83XX(ha)) { | ||
2302 | ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400; | ||
2303 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | ||
2304 | req_length = REQUEST_ENTRY_CNT_24XX; | ||
2305 | rsp_length = RESPONSE_ENTRY_CNT_2300; | ||
2306 | ha->max_loop_id = SNS_LAST_LOOP_ID_2300; | ||
2307 | ha->init_cb_size = sizeof(struct mid_init_cb_81xx); | ||
2308 | ha->gid_list_info_size = 8; | ||
2309 | ha->optrom_size = OPTROM_SIZE_83XX; | ||
2310 | ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX; | ||
2311 | ha->isp_ops = &qla83xx_isp_ops; | ||
2312 | ha->flash_conf_off = FARX_ACCESS_FLASH_CONF_81XX; | ||
2313 | ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX; | ||
2314 | ha->nvram_conf_off = ~0; | ||
2315 | ha->nvram_data_off = ~0; | ||
2126 | } | 2316 | } |
2317 | |||
2127 | ql_dbg_pci(ql_dbg_init, pdev, 0x001e, | 2318 | ql_dbg_pci(ql_dbg_init, pdev, 0x001e, |
2128 | "mbx_count=%d, req_length=%d, " | 2319 | "mbx_count=%d, req_length=%d, " |
2129 | "rsp_length=%d, max_loop_id=%d, init_cb_size=%d, " | 2320 | "rsp_length=%d, max_loop_id=%d, init_cb_size=%d, " |
2130 | "gid_list_info_size=%d, optrom_size=%d, nvram_npiv_size=%d, .\n", | 2321 | "gid_list_info_size=%d, optrom_size=%d, nvram_npiv_size=%d, " |
2322 | "max_fibre_devices=%d.\n", | ||
2131 | ha->mbx_count, req_length, rsp_length, ha->max_loop_id, | 2323 | ha->mbx_count, req_length, rsp_length, ha->max_loop_id, |
2132 | ha->init_cb_size, ha->gid_list_info_size, ha->optrom_size, | 2324 | ha->init_cb_size, ha->gid_list_info_size, ha->optrom_size, |
2133 | ha->nvram_npiv_size); | 2325 | ha->nvram_npiv_size, ha->max_fibre_devices); |
2134 | ql_dbg_pci(ql_dbg_init, pdev, 0x001f, | 2326 | ql_dbg_pci(ql_dbg_init, pdev, 0x001f, |
2135 | "isp_ops=%p, flash_conf_off=%d, " | 2327 | "isp_ops=%p, flash_conf_off=%d, " |
2136 | "flash_data_off=%d, nvram_conf_off=%d, nvram_data_off=%d.\n", | 2328 | "flash_data_off=%d, nvram_conf_off=%d, nvram_data_off=%d.\n", |
@@ -2204,7 +2396,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2204 | "mgmt_svr_loop_id=%d, sg_tablesize=%d.\n", | 2396 | "mgmt_svr_loop_id=%d, sg_tablesize=%d.\n", |
2205 | host->can_queue, base_vha->req, | 2397 | host->can_queue, base_vha->req, |
2206 | base_vha->mgmt_svr_loop_id, host->sg_tablesize); | 2398 | base_vha->mgmt_svr_loop_id, host->sg_tablesize); |
2207 | host->max_id = max_id; | 2399 | host->max_id = ha->max_fibre_devices; |
2208 | host->this_id = 255; | 2400 | host->this_id = 255; |
2209 | host->cmd_per_lun = 3; | 2401 | host->cmd_per_lun = 3; |
2210 | host->unique_id = host->host_no; | 2402 | host->unique_id = host->host_no; |
@@ -2251,7 +2443,7 @@ que_init: | |||
2251 | req->req_q_out = &ha->iobase->isp24.req_q_out; | 2443 | req->req_q_out = &ha->iobase->isp24.req_q_out; |
2252 | rsp->rsp_q_in = &ha->iobase->isp24.rsp_q_in; | 2444 | rsp->rsp_q_in = &ha->iobase->isp24.rsp_q_in; |
2253 | rsp->rsp_q_out = &ha->iobase->isp24.rsp_q_out; | 2445 | rsp->rsp_q_out = &ha->iobase->isp24.rsp_q_out; |
2254 | if (ha->mqenable) { | 2446 | if (ha->mqenable || IS_QLA83XX(ha)) { |
2255 | req->req_q_in = &ha->mqiobase->isp25mq.req_q_in; | 2447 | req->req_q_in = &ha->mqiobase->isp25mq.req_q_in; |
2256 | req->req_q_out = &ha->mqiobase->isp25mq.req_q_out; | 2448 | req->req_q_out = &ha->mqiobase->isp25mq.req_q_out; |
2257 | rsp->rsp_q_in = &ha->mqiobase->isp25mq.rsp_q_in; | 2449 | rsp->rsp_q_in = &ha->mqiobase->isp25mq.rsp_q_in; |
@@ -2552,6 +2744,9 @@ qla2x00_remove_one(struct pci_dev *pdev) | |||
2552 | 2744 | ||
2553 | if (ha->mqiobase) | 2745 | if (ha->mqiobase) |
2554 | iounmap(ha->mqiobase); | 2746 | iounmap(ha->mqiobase); |
2747 | |||
2748 | if (IS_QLA83XX(ha) && ha->msixbase) | ||
2749 | iounmap(ha->msixbase); | ||
2555 | } | 2750 | } |
2556 | 2751 | ||
2557 | pci_release_selected_regions(ha->pdev, ha->bars); | 2752 | pci_release_selected_regions(ha->pdev, ha->bars); |
@@ -2751,8 +2946,8 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, | |||
2751 | if (!ha->init_cb) | 2946 | if (!ha->init_cb) |
2752 | goto fail; | 2947 | goto fail; |
2753 | 2948 | ||
2754 | ha->gid_list = dma_alloc_coherent(&ha->pdev->dev, GID_LIST_SIZE, | 2949 | ha->gid_list = dma_alloc_coherent(&ha->pdev->dev, |
2755 | &ha->gid_list_dma, GFP_KERNEL); | 2950 | qla2x00_gid_list_size(ha), &ha->gid_list_dma, GFP_KERNEL); |
2756 | if (!ha->gid_list) | 2951 | if (!ha->gid_list) |
2757 | goto fail_free_init_cb; | 2952 | goto fail_free_init_cb; |
2758 | 2953 | ||
@@ -2893,7 +3088,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, | |||
2893 | ha->npiv_info = NULL; | 3088 | ha->npiv_info = NULL; |
2894 | 3089 | ||
2895 | /* Get consistent memory allocated for EX-INIT-CB. */ | 3090 | /* Get consistent memory allocated for EX-INIT-CB. */ |
2896 | if (IS_QLA8XXX_TYPE(ha)) { | 3091 | if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)) { |
2897 | ha->ex_init_cb = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, | 3092 | ha->ex_init_cb = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, |
2898 | &ha->ex_init_cb_dma); | 3093 | &ha->ex_init_cb_dma); |
2899 | if (!ha->ex_init_cb) | 3094 | if (!ha->ex_init_cb) |
@@ -2967,7 +3162,8 @@ fail_free_srb_mempool: | |||
2967 | mempool_destroy(ha->srb_mempool); | 3162 | mempool_destroy(ha->srb_mempool); |
2968 | ha->srb_mempool = NULL; | 3163 | ha->srb_mempool = NULL; |
2969 | fail_free_gid_list: | 3164 | fail_free_gid_list: |
2970 | dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list, | 3165 | dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha), |
3166 | ha->gid_list, | ||
2971 | ha->gid_list_dma); | 3167 | ha->gid_list_dma); |
2972 | ha->gid_list = NULL; | 3168 | ha->gid_list = NULL; |
2973 | ha->gid_list_dma = 0; | 3169 | ha->gid_list_dma = 0; |
@@ -3045,9 +3241,6 @@ qla2x00_mem_free(struct qla_hw_data *ha) | |||
3045 | if (ha->sfp_data) | 3241 | if (ha->sfp_data) |
3046 | dma_pool_free(ha->s_dma_pool, ha->sfp_data, ha->sfp_data_dma); | 3242 | dma_pool_free(ha->s_dma_pool, ha->sfp_data, ha->sfp_data_dma); |
3047 | 3243 | ||
3048 | if (ha->edc_data) | ||
3049 | dma_pool_free(ha->s_dma_pool, ha->edc_data, ha->edc_data_dma); | ||
3050 | |||
3051 | if (ha->ms_iocb) | 3244 | if (ha->ms_iocb) |
3052 | dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma); | 3245 | dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma); |
3053 | 3246 | ||
@@ -3062,8 +3255,8 @@ qla2x00_mem_free(struct qla_hw_data *ha) | |||
3062 | dma_pool_destroy(ha->s_dma_pool); | 3255 | dma_pool_destroy(ha->s_dma_pool); |
3063 | 3256 | ||
3064 | if (ha->gid_list) | 3257 | if (ha->gid_list) |
3065 | dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list, | 3258 | dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha), |
3066 | ha->gid_list_dma); | 3259 | ha->gid_list, ha->gid_list_dma); |
3067 | 3260 | ||
3068 | if (IS_QLA82XX(ha)) { | 3261 | if (IS_QLA82XX(ha)) { |
3069 | if (!list_empty(&ha->gbl_dsd_list)) { | 3262 | if (!list_empty(&ha->gbl_dsd_list)) { |
@@ -3095,6 +3288,7 @@ qla2x00_mem_free(struct qla_hw_data *ha) | |||
3095 | vfree(ha->optrom_buffer); | 3288 | vfree(ha->optrom_buffer); |
3096 | kfree(ha->nvram); | 3289 | kfree(ha->nvram); |
3097 | kfree(ha->npiv_info); | 3290 | kfree(ha->npiv_info); |
3291 | kfree(ha->swl); | ||
3098 | 3292 | ||
3099 | ha->srb_mempool = NULL; | 3293 | ha->srb_mempool = NULL; |
3100 | ha->ctx_mempool = NULL; | 3294 | ha->ctx_mempool = NULL; |
@@ -3661,75 +3855,6 @@ qla2x00_rst_aen(scsi_qla_host_t *vha) | |||
3661 | } | 3855 | } |
3662 | } | 3856 | } |
3663 | 3857 | ||
3664 | static void | ||
3665 | qla2x00_sp_free_dma(srb_t *sp) | ||
3666 | { | ||
3667 | struct scsi_cmnd *cmd = sp->cmd; | ||
3668 | struct qla_hw_data *ha = sp->fcport->vha->hw; | ||
3669 | |||
3670 | if (sp->flags & SRB_DMA_VALID) { | ||
3671 | scsi_dma_unmap(cmd); | ||
3672 | sp->flags &= ~SRB_DMA_VALID; | ||
3673 | } | ||
3674 | |||
3675 | if (sp->flags & SRB_CRC_PROT_DMA_VALID) { | ||
3676 | dma_unmap_sg(&ha->pdev->dev, scsi_prot_sglist(cmd), | ||
3677 | scsi_prot_sg_count(cmd), cmd->sc_data_direction); | ||
3678 | sp->flags &= ~SRB_CRC_PROT_DMA_VALID; | ||
3679 | } | ||
3680 | |||
3681 | if (sp->flags & SRB_CRC_CTX_DSD_VALID) { | ||
3682 | /* List assured to be having elements */ | ||
3683 | qla2x00_clean_dsd_pool(ha, sp); | ||
3684 | sp->flags &= ~SRB_CRC_CTX_DSD_VALID; | ||
3685 | } | ||
3686 | |||
3687 | if (sp->flags & SRB_CRC_CTX_DMA_VALID) { | ||
3688 | dma_pool_free(ha->dl_dma_pool, sp->ctx, | ||
3689 | ((struct crc_context *)sp->ctx)->crc_ctx_dma); | ||
3690 | sp->flags &= ~SRB_CRC_CTX_DMA_VALID; | ||
3691 | } | ||
3692 | |||
3693 | if (sp->flags & SRB_FCP_CMND_DMA_VALID) { | ||
3694 | struct ct6_dsd *ctx = sp->ctx; | ||
3695 | dma_pool_free(ha->fcp_cmnd_dma_pool, ctx->fcp_cmnd, | ||
3696 | ctx->fcp_cmnd_dma); | ||
3697 | list_splice(&ctx->dsd_list, &ha->gbl_dsd_list); | ||
3698 | ha->gbl_dsd_inuse -= ctx->dsd_use_cnt; | ||
3699 | ha->gbl_dsd_avail += ctx->dsd_use_cnt; | ||
3700 | mempool_free(sp->ctx, ha->ctx_mempool); | ||
3701 | sp->ctx = NULL; | ||
3702 | } | ||
3703 | |||
3704 | CMD_SP(cmd) = NULL; | ||
3705 | } | ||
3706 | |||
3707 | static void | ||
3708 | qla2x00_sp_final_compl(struct qla_hw_data *ha, srb_t *sp) | ||
3709 | { | ||
3710 | struct scsi_cmnd *cmd = sp->cmd; | ||
3711 | |||
3712 | qla2x00_sp_free_dma(sp); | ||
3713 | mempool_free(sp, ha->srb_mempool); | ||
3714 | cmd->scsi_done(cmd); | ||
3715 | } | ||
3716 | |||
3717 | void | ||
3718 | qla2x00_sp_compl(struct qla_hw_data *ha, srb_t *sp) | ||
3719 | { | ||
3720 | if (atomic_read(&sp->ref_count) == 0) { | ||
3721 | ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3015, | ||
3722 | "SP reference-count to ZERO -- sp=%p cmd=%p.\n", | ||
3723 | sp, sp->cmd); | ||
3724 | if (ql2xextended_error_logging & ql_dbg_io) | ||
3725 | BUG(); | ||
3726 | return; | ||
3727 | } | ||
3728 | if (!atomic_dec_and_test(&sp->ref_count)) | ||
3729 | return; | ||
3730 | qla2x00_sp_final_compl(ha, sp); | ||
3731 | } | ||
3732 | |||
3733 | /************************************************************************** | 3858 | /************************************************************************** |
3734 | * qla2x00_timer | 3859 | * qla2x00_timer |
3735 | * | 3860 | * |
@@ -3800,7 +3925,7 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
3800 | sp = req->outstanding_cmds[index]; | 3925 | sp = req->outstanding_cmds[index]; |
3801 | if (!sp) | 3926 | if (!sp) |
3802 | continue; | 3927 | continue; |
3803 | if (sp->ctx && !IS_PROT_IO(sp)) | 3928 | if (sp->type != SRB_SCSI_CMD) |
3804 | continue; | 3929 | continue; |
3805 | sfcp = sp->fcport; | 3930 | sfcp = sp->fcport; |
3806 | if (!(sfcp->flags & FCF_FCP2_DEVICE)) | 3931 | if (!(sfcp->flags & FCF_FCP2_DEVICE)) |
@@ -3889,7 +4014,7 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
3889 | 4014 | ||
3890 | /* Firmware interface routines. */ | 4015 | /* Firmware interface routines. */ |
3891 | 4016 | ||
3892 | #define FW_BLOBS 8 | 4017 | #define FW_BLOBS 10 |
3893 | #define FW_ISP21XX 0 | 4018 | #define FW_ISP21XX 0 |
3894 | #define FW_ISP22XX 1 | 4019 | #define FW_ISP22XX 1 |
3895 | #define FW_ISP2300 2 | 4020 | #define FW_ISP2300 2 |
@@ -3898,6 +4023,8 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
3898 | #define FW_ISP25XX 5 | 4023 | #define FW_ISP25XX 5 |
3899 | #define FW_ISP81XX 6 | 4024 | #define FW_ISP81XX 6 |
3900 | #define FW_ISP82XX 7 | 4025 | #define FW_ISP82XX 7 |
4026 | #define FW_ISP2031 8 | ||
4027 | #define FW_ISP8031 9 | ||
3901 | 4028 | ||
3902 | #define FW_FILE_ISP21XX "ql2100_fw.bin" | 4029 | #define FW_FILE_ISP21XX "ql2100_fw.bin" |
3903 | #define FW_FILE_ISP22XX "ql2200_fw.bin" | 4030 | #define FW_FILE_ISP22XX "ql2200_fw.bin" |
@@ -3907,6 +4034,8 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
3907 | #define FW_FILE_ISP25XX "ql2500_fw.bin" | 4034 | #define FW_FILE_ISP25XX "ql2500_fw.bin" |
3908 | #define FW_FILE_ISP81XX "ql8100_fw.bin" | 4035 | #define FW_FILE_ISP81XX "ql8100_fw.bin" |
3909 | #define FW_FILE_ISP82XX "ql8200_fw.bin" | 4036 | #define FW_FILE_ISP82XX "ql8200_fw.bin" |
4037 | #define FW_FILE_ISP2031 "ql2600_fw.bin" | ||
4038 | #define FW_FILE_ISP8031 "ql8300_fw.bin" | ||
3910 | 4039 | ||
3911 | static DEFINE_MUTEX(qla_fw_lock); | 4040 | static DEFINE_MUTEX(qla_fw_lock); |
3912 | 4041 | ||
@@ -3919,6 +4048,8 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = { | |||
3919 | { .name = FW_FILE_ISP25XX, }, | 4048 | { .name = FW_FILE_ISP25XX, }, |
3920 | { .name = FW_FILE_ISP81XX, }, | 4049 | { .name = FW_FILE_ISP81XX, }, |
3921 | { .name = FW_FILE_ISP82XX, }, | 4050 | { .name = FW_FILE_ISP82XX, }, |
4051 | { .name = FW_FILE_ISP2031, }, | ||
4052 | { .name = FW_FILE_ISP8031, }, | ||
3922 | }; | 4053 | }; |
3923 | 4054 | ||
3924 | struct fw_blob * | 4055 | struct fw_blob * |
@@ -3927,7 +4058,6 @@ qla2x00_request_firmware(scsi_qla_host_t *vha) | |||
3927 | struct qla_hw_data *ha = vha->hw; | 4058 | struct qla_hw_data *ha = vha->hw; |
3928 | struct fw_blob *blob; | 4059 | struct fw_blob *blob; |
3929 | 4060 | ||
3930 | blob = NULL; | ||
3931 | if (IS_QLA2100(ha)) { | 4061 | if (IS_QLA2100(ha)) { |
3932 | blob = &qla_fw_blobs[FW_ISP21XX]; | 4062 | blob = &qla_fw_blobs[FW_ISP21XX]; |
3933 | } else if (IS_QLA2200(ha)) { | 4063 | } else if (IS_QLA2200(ha)) { |
@@ -3944,6 +4074,12 @@ qla2x00_request_firmware(scsi_qla_host_t *vha) | |||
3944 | blob = &qla_fw_blobs[FW_ISP81XX]; | 4074 | blob = &qla_fw_blobs[FW_ISP81XX]; |
3945 | } else if (IS_QLA82XX(ha)) { | 4075 | } else if (IS_QLA82XX(ha)) { |
3946 | blob = &qla_fw_blobs[FW_ISP82XX]; | 4076 | blob = &qla_fw_blobs[FW_ISP82XX]; |
4077 | } else if (IS_QLA2031(ha)) { | ||
4078 | blob = &qla_fw_blobs[FW_ISP2031]; | ||
4079 | } else if (IS_QLA8031(ha)) { | ||
4080 | blob = &qla_fw_blobs[FW_ISP8031]; | ||
4081 | } else { | ||
4082 | return NULL; | ||
3947 | } | 4083 | } |
3948 | 4084 | ||
3949 | mutex_lock(&qla_fw_lock); | 4085 | mutex_lock(&qla_fw_lock); |
@@ -4265,6 +4401,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = { | |||
4265 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, | 4401 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, |
4266 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, | 4402 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, |
4267 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) }, | 4403 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) }, |
4404 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2031) }, | ||
4268 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8001) }, | 4405 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8001) }, |
4269 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8021) }, | 4406 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8021) }, |
4270 | { 0 }, | 4407 | { 0 }, |
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index 16bc72844a9..3c13c0a6be6 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
@@ -568,6 +568,9 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start) | |||
568 | else if (IS_QLA82XX(ha)) { | 568 | else if (IS_QLA82XX(ha)) { |
569 | *start = FA_FLASH_LAYOUT_ADDR_82; | 569 | *start = FA_FLASH_LAYOUT_ADDR_82; |
570 | goto end; | 570 | goto end; |
571 | } else if (IS_QLA83XX(ha)) { | ||
572 | *start = FA_FLASH_LAYOUT_ADDR_83; | ||
573 | goto end; | ||
571 | } | 574 | } |
572 | /* Begin with first PCI expansion ROM header. */ | 575 | /* Begin with first PCI expansion ROM header. */ |
573 | buf = (uint8_t *)req->ring; | 576 | buf = (uint8_t *)req->ring; |
@@ -721,13 +724,22 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) | |||
721 | le32_to_cpu(region->size)); | 724 | le32_to_cpu(region->size)); |
722 | 725 | ||
723 | switch (le32_to_cpu(region->code) & 0xff) { | 726 | switch (le32_to_cpu(region->code) & 0xff) { |
727 | case FLT_REG_FCOE_FW: | ||
728 | if (!IS_QLA8031(ha)) | ||
729 | break; | ||
730 | ha->flt_region_fw = start; | ||
731 | break; | ||
724 | case FLT_REG_FW: | 732 | case FLT_REG_FW: |
733 | if (IS_QLA8031(ha)) | ||
734 | break; | ||
725 | ha->flt_region_fw = start; | 735 | ha->flt_region_fw = start; |
726 | break; | 736 | break; |
727 | case FLT_REG_BOOT_CODE: | 737 | case FLT_REG_BOOT_CODE: |
728 | ha->flt_region_boot = start; | 738 | ha->flt_region_boot = start; |
729 | break; | 739 | break; |
730 | case FLT_REG_VPD_0: | 740 | case FLT_REG_VPD_0: |
741 | if (IS_QLA8031(ha)) | ||
742 | break; | ||
731 | ha->flt_region_vpd_nvram = start; | 743 | ha->flt_region_vpd_nvram = start; |
732 | if (IS_QLA82XX(ha)) | 744 | if (IS_QLA82XX(ha)) |
733 | break; | 745 | break; |
@@ -735,16 +747,20 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) | |||
735 | ha->flt_region_vpd = start; | 747 | ha->flt_region_vpd = start; |
736 | break; | 748 | break; |
737 | case FLT_REG_VPD_1: | 749 | case FLT_REG_VPD_1: |
738 | if (IS_QLA82XX(ha)) | 750 | if (IS_QLA82XX(ha) || IS_QLA8031(ha)) |
739 | break; | 751 | break; |
740 | if (!ha->flags.port0) | 752 | if (!ha->flags.port0) |
741 | ha->flt_region_vpd = start; | 753 | ha->flt_region_vpd = start; |
742 | break; | 754 | break; |
743 | case FLT_REG_NVRAM_0: | 755 | case FLT_REG_NVRAM_0: |
756 | if (IS_QLA8031(ha)) | ||
757 | break; | ||
744 | if (ha->flags.port0) | 758 | if (ha->flags.port0) |
745 | ha->flt_region_nvram = start; | 759 | ha->flt_region_nvram = start; |
746 | break; | 760 | break; |
747 | case FLT_REG_NVRAM_1: | 761 | case FLT_REG_NVRAM_1: |
762 | if (IS_QLA8031(ha)) | ||
763 | break; | ||
748 | if (!ha->flags.port0) | 764 | if (!ha->flags.port0) |
749 | ha->flt_region_nvram = start; | 765 | ha->flt_region_nvram = start; |
750 | break; | 766 | break; |
@@ -785,6 +801,31 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) | |||
785 | case FLT_REG_VPD_82XX: | 801 | case FLT_REG_VPD_82XX: |
786 | ha->flt_region_vpd = start; | 802 | ha->flt_region_vpd = start; |
787 | break; | 803 | break; |
804 | case FLT_REG_FCOE_VPD_0: | ||
805 | if (!IS_QLA8031(ha)) | ||
806 | break; | ||
807 | ha->flt_region_vpd_nvram = start; | ||
808 | if (ha->flags.port0) | ||
809 | ha->flt_region_vpd = start; | ||
810 | break; | ||
811 | case FLT_REG_FCOE_VPD_1: | ||
812 | if (!IS_QLA8031(ha)) | ||
813 | break; | ||
814 | if (!ha->flags.port0) | ||
815 | ha->flt_region_vpd = start; | ||
816 | break; | ||
817 | case FLT_REG_FCOE_NVRAM_0: | ||
818 | if (!IS_QLA8031(ha)) | ||
819 | break; | ||
820 | if (ha->flags.port0) | ||
821 | ha->flt_region_nvram = start; | ||
822 | break; | ||
823 | case FLT_REG_FCOE_NVRAM_1: | ||
824 | if (!IS_QLA8031(ha)) | ||
825 | break; | ||
826 | if (!ha->flags.port0) | ||
827 | ha->flt_region_nvram = start; | ||
828 | break; | ||
788 | } | 829 | } |
789 | } | 830 | } |
790 | goto done; | 831 | goto done; |
@@ -804,15 +845,12 @@ no_flash_data: | |||
804 | def_npiv_conf0[def] : def_npiv_conf1[def]; | 845 | def_npiv_conf0[def] : def_npiv_conf1[def]; |
805 | done: | 846 | done: |
806 | ql_dbg(ql_dbg_init, vha, 0x004a, | 847 | ql_dbg(ql_dbg_init, vha, 0x004a, |
807 | "FLT[%s]: boot=0x%x fw=0x%x vpd_nvram=0x%x vpd=0x%x.\n", | 848 | "FLT[%s]: boot=0x%x fw=0x%x vpd_nvram=0x%x vpd=0x%x nvram=0x%x " |
808 | loc, ha->flt_region_boot, | 849 | "fdt=0x%x flt=0x%x npiv=0x%x fcp_prif_cfg=0x%x.\n", |
809 | ha->flt_region_fw, ha->flt_region_vpd_nvram, | 850 | loc, ha->flt_region_boot, ha->flt_region_fw, |
810 | ha->flt_region_vpd); | 851 | ha->flt_region_vpd_nvram, ha->flt_region_vpd, ha->flt_region_nvram, |
811 | ql_dbg(ql_dbg_init, vha, 0x004b, | 852 | ha->flt_region_fdt, ha->flt_region_flt, ha->flt_region_npiv_conf, |
812 | "nvram=0x%x fdt=0x%x flt=0x%x npiv=0x%x fcp_prif_cfg=0x%x.\n", | 853 | ha->flt_region_fcp_prio); |
813 | ha->flt_region_nvram, | ||
814 | ha->flt_region_fdt, ha->flt_region_flt, | ||
815 | ha->flt_region_npiv_conf, ha->flt_region_fcp_prio); | ||
816 | } | 854 | } |
817 | 855 | ||
818 | static void | 856 | static void |
@@ -948,7 +986,8 @@ qla2xxx_get_flash_info(scsi_qla_host_t *vha) | |||
948 | uint32_t flt_addr; | 986 | uint32_t flt_addr; |
949 | struct qla_hw_data *ha = vha->hw; | 987 | struct qla_hw_data *ha = vha->hw; |
950 | 988 | ||
951 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA8XXX_TYPE(ha)) | 989 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && |
990 | !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha)) | ||
952 | return QLA_SUCCESS; | 991 | return QLA_SUCCESS; |
953 | 992 | ||
954 | ret = qla2xxx_find_flt_start(vha, &flt_addr); | 993 | ret = qla2xxx_find_flt_start(vha, &flt_addr); |
@@ -974,7 +1013,8 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) | |||
974 | struct qla_npiv_entry *entry; | 1013 | struct qla_npiv_entry *entry; |
975 | struct qla_hw_data *ha = vha->hw; | 1014 | struct qla_hw_data *ha = vha->hw; |
976 | 1015 | ||
977 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA8XXX_TYPE(ha)) | 1016 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && |
1017 | !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha)) | ||
978 | return; | 1018 | return; |
979 | 1019 | ||
980 | ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, | 1020 | ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, |
@@ -1144,8 +1184,8 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
1144 | struct qla_hw_data *ha = vha->hw; | 1184 | struct qla_hw_data *ha = vha->hw; |
1145 | 1185 | ||
1146 | /* Prepare burst-capable write on supported ISPs. */ | 1186 | /* Prepare burst-capable write on supported ISPs. */ |
1147 | if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && !(faddr & 0xfff) && | 1187 | if ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha)) && |
1148 | dwords > OPTROM_BURST_DWORDS) { | 1188 | !(faddr & 0xfff) && dwords > OPTROM_BURST_DWORDS) { |
1149 | optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, | 1189 | optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, |
1150 | &optrom_dma, GFP_KERNEL); | 1190 | &optrom_dma, GFP_KERNEL); |
1151 | if (!optrom) { | 1191 | if (!optrom) { |
@@ -1619,6 +1659,71 @@ qla24xx_beacon_blink(struct scsi_qla_host *vha) | |||
1619 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1659 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1620 | } | 1660 | } |
1621 | 1661 | ||
1662 | void | ||
1663 | qla83xx_beacon_blink(struct scsi_qla_host *vha) | ||
1664 | { | ||
1665 | uint32_t led_select_value; | ||
1666 | struct qla_hw_data *ha = vha->hw; | ||
1667 | uint16_t led_cfg[6]; | ||
1668 | uint16_t orig_led_cfg[6]; | ||
1669 | |||
1670 | if (!IS_QLA83XX(ha) && !IS_QLA81XX(ha)) | ||
1671 | return; | ||
1672 | |||
1673 | if (IS_QLA2031(ha) && ha->beacon_blink_led) { | ||
1674 | if (ha->flags.port0) | ||
1675 | led_select_value = 0x00201320; | ||
1676 | else | ||
1677 | led_select_value = 0x00201328; | ||
1678 | |||
1679 | qla83xx_write_remote_reg(vha, led_select_value, 0x40002000); | ||
1680 | qla83xx_write_remote_reg(vha, led_select_value + 4, 0x40002000); | ||
1681 | msleep(1000); | ||
1682 | qla83xx_write_remote_reg(vha, led_select_value, 0x40004000); | ||
1683 | qla83xx_write_remote_reg(vha, led_select_value + 4, 0x40004000); | ||
1684 | } else if ((IS_QLA8031(ha) || IS_QLA81XX(ha)) && ha->beacon_blink_led) { | ||
1685 | int rval; | ||
1686 | |||
1687 | /* Save Current */ | ||
1688 | rval = qla81xx_get_led_config(vha, orig_led_cfg); | ||
1689 | /* Do the blink */ | ||
1690 | if (rval == QLA_SUCCESS) { | ||
1691 | if (IS_QLA81XX(ha)) { | ||
1692 | led_cfg[0] = 0x4000; | ||
1693 | led_cfg[1] = 0x2000; | ||
1694 | led_cfg[2] = 0; | ||
1695 | led_cfg[3] = 0; | ||
1696 | led_cfg[4] = 0; | ||
1697 | led_cfg[5] = 0; | ||
1698 | } else { | ||
1699 | led_cfg[0] = 0x4000; | ||
1700 | led_cfg[1] = 0x4000; | ||
1701 | led_cfg[2] = 0x4000; | ||
1702 | led_cfg[3] = 0x2000; | ||
1703 | led_cfg[4] = 0; | ||
1704 | led_cfg[5] = 0x2000; | ||
1705 | } | ||
1706 | rval = qla81xx_set_led_config(vha, led_cfg); | ||
1707 | msleep(1000); | ||
1708 | if (IS_QLA81XX(ha)) { | ||
1709 | led_cfg[0] = 0x4000; | ||
1710 | led_cfg[1] = 0x2000; | ||
1711 | led_cfg[2] = 0; | ||
1712 | } else { | ||
1713 | led_cfg[0] = 0x4000; | ||
1714 | led_cfg[1] = 0x2000; | ||
1715 | led_cfg[2] = 0x4000; | ||
1716 | led_cfg[3] = 0x4000; | ||
1717 | led_cfg[4] = 0; | ||
1718 | led_cfg[5] = 0x2000; | ||
1719 | } | ||
1720 | rval = qla81xx_set_led_config(vha, led_cfg); | ||
1721 | } | ||
1722 | /* On exit, restore original (presumes no status change) */ | ||
1723 | qla81xx_set_led_config(vha, orig_led_cfg); | ||
1724 | } | ||
1725 | } | ||
1726 | |||
1622 | int | 1727 | int |
1623 | qla24xx_beacon_on(struct scsi_qla_host *vha) | 1728 | qla24xx_beacon_on(struct scsi_qla_host *vha) |
1624 | { | 1729 | { |
@@ -1630,6 +1735,9 @@ qla24xx_beacon_on(struct scsi_qla_host *vha) | |||
1630 | if (IS_QLA82XX(ha)) | 1735 | if (IS_QLA82XX(ha)) |
1631 | return QLA_SUCCESS; | 1736 | return QLA_SUCCESS; |
1632 | 1737 | ||
1738 | if (IS_QLA8031(ha) || IS_QLA81XX(ha)) | ||
1739 | goto skip_gpio; /* let blink handle it */ | ||
1740 | |||
1633 | if (ha->beacon_blink_led == 0) { | 1741 | if (ha->beacon_blink_led == 0) { |
1634 | /* Enable firmware for update */ | 1742 | /* Enable firmware for update */ |
1635 | ha->fw_options[1] |= ADD_FO1_DISABLE_GPIO_LED_CTRL; | 1743 | ha->fw_options[1] |= ADD_FO1_DISABLE_GPIO_LED_CTRL; |
@@ -1644,6 +1752,9 @@ qla24xx_beacon_on(struct scsi_qla_host *vha) | |||
1644 | return QLA_FUNCTION_FAILED; | 1752 | return QLA_FUNCTION_FAILED; |
1645 | } | 1753 | } |
1646 | 1754 | ||
1755 | if (IS_QLA2031(ha)) | ||
1756 | goto skip_gpio; | ||
1757 | |||
1647 | spin_lock_irqsave(&ha->hardware_lock, flags); | 1758 | spin_lock_irqsave(&ha->hardware_lock, flags); |
1648 | gpio_data = RD_REG_DWORD(®->gpiod); | 1759 | gpio_data = RD_REG_DWORD(®->gpiod); |
1649 | 1760 | ||
@@ -1658,6 +1769,7 @@ qla24xx_beacon_on(struct scsi_qla_host *vha) | |||
1658 | /* So all colors blink together. */ | 1769 | /* So all colors blink together. */ |
1659 | ha->beacon_color_state = 0; | 1770 | ha->beacon_color_state = 0; |
1660 | 1771 | ||
1772 | skip_gpio: | ||
1661 | /* Let the per HBA timer kick off the blinking process. */ | 1773 | /* Let the per HBA timer kick off the blinking process. */ |
1662 | ha->beacon_blink_led = 1; | 1774 | ha->beacon_blink_led = 1; |
1663 | 1775 | ||
@@ -1676,6 +1788,13 @@ qla24xx_beacon_off(struct scsi_qla_host *vha) | |||
1676 | return QLA_SUCCESS; | 1788 | return QLA_SUCCESS; |
1677 | 1789 | ||
1678 | ha->beacon_blink_led = 0; | 1790 | ha->beacon_blink_led = 0; |
1791 | |||
1792 | if (IS_QLA2031(ha)) | ||
1793 | goto set_fw_options; | ||
1794 | |||
1795 | if (IS_QLA8031(ha) || IS_QLA81XX(ha)) | ||
1796 | return QLA_SUCCESS; | ||
1797 | |||
1679 | ha->beacon_color_state = QLA_LED_ALL_ON; | 1798 | ha->beacon_color_state = QLA_LED_ALL_ON; |
1680 | 1799 | ||
1681 | ha->isp_ops->beacon_blink(vha); /* Will flip to all off. */ | 1800 | ha->isp_ops->beacon_blink(vha); /* Will flip to all off. */ |
@@ -1690,6 +1809,7 @@ qla24xx_beacon_off(struct scsi_qla_host *vha) | |||
1690 | RD_REG_DWORD(®->gpiod); | 1809 | RD_REG_DWORD(®->gpiod); |
1691 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1810 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1692 | 1811 | ||
1812 | set_fw_options: | ||
1693 | ha->fw_options[1] &= ~ADD_FO1_DISABLE_GPIO_LED_CTRL; | 1813 | ha->fw_options[1] &= ~ADD_FO1_DISABLE_GPIO_LED_CTRL; |
1694 | 1814 | ||
1695 | if (qla2x00_set_fw_options(vha, ha->fw_options) != QLA_SUCCESS) { | 1815 | if (qla2x00_set_fw_options(vha, ha->fw_options) != QLA_SUCCESS) { |