aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 15:55:29 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 15:55:29 -0400
commit424a6f6ef990b7e9f56f6627bfc6c46b493faeb4 (patch)
tree0028356ed8003495fbbe1f716f359e3c8ebc35b6 /drivers/scsi/qla2xxx
parent1ab142d499294b844ecc81e8004db4ce029b0b61 (diff)
parentcd8df932d894f3128c884e3ae1b2b484540513db (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.c177
-rw-r--r--drivers/scsi/qla2xxx/qla_bsg.c120
-rw-r--r--drivers/scsi/qla2xxx/qla_dbg.c630
-rw-r--r--drivers/scsi/qla2xxx/qla_dbg.h63
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h117
-rw-r--r--drivers/scsi/qla2xxx/qla_dfs.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_fw.h13
-rw-r--r--drivers/scsi/qla2xxx/qla_gbl.h22
-rw-r--r--drivers/scsi/qla2xxx/qla_gs.c86
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c540
-rw-r--r--drivers/scsi/qla2xxx/qla_inline.h51
-rw-r--r--drivers/scsi/qla2xxx/qla_iocb.c167
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c445
-rw-r--r--drivers/scsi/qla2xxx/qla_mbx.c410
-rw-r--r--drivers/scsi/qla2xxx/qla_mid.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_nx.c90
-rw-r--r--drivers/scsi/qla2xxx/qla_nx.h3
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c435
-rw-r--r--drivers/scsi/qla2xxx/qla_sup.c148
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
629static ssize_t 630static ssize_t
630qla2x00_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
678static 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
687static ssize_t
688qla2x00_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
737static ssize_t
738qla2x00_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
757static 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
767static ssize_t
768qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj, 631qla2x00_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
1652static int 1520static 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 */
14inline srb_t * 14void
15qla2x00_get_ctx_bsg_sp(scsi_qla_host_t *vha, fc_port_t *fcport, size_t size) 15qla2x00_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
26void
27qla2x00_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 ||
35done: 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
39int 46int
@@ -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
220static int 226static int
221qla2x00_process_els(struct fc_bsg_job *bsg_job) 227qla2x00_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(&reg->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED); 89 WRT_REG_WORD(&reg->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
377static inline void * 381static inline void *
382qla25xx_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
452static inline void *
378qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) 453qla25xx_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
1331qla25xx_fw_dump_failed_0: 1410qla25xx_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
1645qla81xx_fw_dump_failed_0: 1728qla81xx_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
1736void
1737qla83xx_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(&reg->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(&reg->iobase_addr, 0x6000);
1783 dmp_reg = &reg->iobase_window;
1784 reg_data = RD_REG_DWORD(dmp_reg);
1785 WRT_REG_DWORD(dmp_reg, 0);
1786
1787 dmp_reg = &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(&reg->iobase_addr, 0x6010);
1792 dmp_reg = &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(&reg->iobase_addr, 0x0F70);
1798 RD_REG_DWORD(&reg->iobase_addr);
1799 WRT_REG_DWORD(&reg->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(&reg->iobase_addr, 0x7C00);
1809 RD_REG_DWORD(&reg->iobase_addr);
1810 WRT_REG_DWORD(&reg->iobase_window, 0x01);
1811 dmp_reg = &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(&reg->iobase_window));
1816
1817 WRT_REG_DWORD(&reg->iobase_window, 0x00);
1818 RD_REG_DWORD(&reg->iobase_window);
1819
1820 /* Host interface registers. */
1821 dmp_reg = &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(&reg->ictrl, 0);
1827 RD_REG_DWORD(&reg->ictrl);
1828
1829 /* Shadow registers. */
1830 WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
1831 RD_REG_DWORD(&reg->iobase_addr);
1832 WRT_REG_DWORD(&reg->iobase_select, 0xB0000000);
1833 fw->shadow_reg[0] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1834
1835 WRT_REG_DWORD(&reg->iobase_select, 0xB0100000);
1836 fw->shadow_reg[1] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1837
1838 WRT_REG_DWORD(&reg->iobase_select, 0xB0200000);
1839 fw->shadow_reg[2] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1840
1841 WRT_REG_DWORD(&reg->iobase_select, 0xB0300000);
1842 fw->shadow_reg[3] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1843
1844 WRT_REG_DWORD(&reg->iobase_select, 0xB0400000);
1845 fw->shadow_reg[4] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1846
1847 WRT_REG_DWORD(&reg->iobase_select, 0xB0500000);
1848 fw->shadow_reg[5] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1849
1850 WRT_REG_DWORD(&reg->iobase_select, 0xB0600000);
1851 fw->shadow_reg[6] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1852
1853 WRT_REG_DWORD(&reg->iobase_select, 0xB0700000);
1854 fw->shadow_reg[7] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1855
1856 WRT_REG_DWORD(&reg->iobase_select, 0xB0800000);
1857 fw->shadow_reg[8] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1858
1859 WRT_REG_DWORD(&reg->iobase_select, 0xB0900000);
1860 fw->shadow_reg[9] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1861
1862 WRT_REG_DWORD(&reg->iobase_select, 0xB0A00000);
1863 fw->shadow_reg[10] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1864
1865 /* RISC I/O register. */
1866 WRT_REG_DWORD(&reg->iobase_addr, 0x0010);
1867 fw->risc_io_reg = htonl(RD_REG_DWORD(&reg->iobase_window));
1868
1869 /* Mailbox registers. */
1870 mbx_reg = &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 = &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 = &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 = &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(&reg->hccr, HCCRX_SET_RISC_RESET);
2187 RD_REG_DWORD(&reg->hccr);
2188
2189 WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
2190 RD_REG_DWORD(&reg->hccr);
2191
2192 WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_RESET);
2193 RD_REG_DWORD(&reg->hccr);
2194
2195 for (cnt = 30000; cnt && (RD_REG_WORD(&reg->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
2213copy_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
2229qla83xx_fw_dump_failed_0:
2230 qla2xxx_dump_post_process(base_vha, rval);
2231
2232qla83xx_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
168struct 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
243struct 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
251struct 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
200struct qla2xxx_fw_dump { 262struct 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 */
205typedef struct srb { 205struct 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
272struct srb_ctx { 262typedef 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
282struct msg_echo_lb { 292struct 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 */
2166typedef struct vport_info { 2183typedef 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
2265struct scsi_qla_host; 2283struct 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
1331struct qla_flt_region { 1336struct 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 *);
72extern void qla2x00_async_adisc_done(struct scsi_qla_host *, fc_port_t *, 72extern void qla2x00_async_adisc_done(struct scsi_qla_host *, fc_port_t *,
73 uint16_t *); 73 uint16_t *);
74extern void qla2x00_async_tm_cmd_done(struct scsi_qla_host *, fc_port_t *,
75 struct srb_iocb *);
76extern void *qla2x00_alloc_iocbs(struct scsi_qla_host *, srb_t *); 74extern void *qla2x00_alloc_iocbs(struct scsi_qla_host *, srb_t *);
77extern int qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *, fc_port_t *); 75extern 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 *);
156extern int qla24xx_vport_create_req_sanity_check(struct fc_vport *); 154extern int qla24xx_vport_create_req_sanity_check(struct fc_vport *);
157extern scsi_qla_host_t * qla24xx_create_vhost(struct fc_vport *); 155extern scsi_qla_host_t * qla24xx_create_vhost(struct fc_vport *);
158 156
159extern void qla2x00_sp_compl(struct qla_hw_data *, srb_t *); 157extern void qla2x00_sp_free_dma(void *, void *);
160
161extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *); 158extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *);
162 159
163extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int); 160extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int);
@@ -205,8 +202,7 @@ extern int
205qla2x00_execute_fw(scsi_qla_host_t *, uint32_t); 202qla2x00_execute_fw(scsi_qla_host_t *, uint32_t);
206 203
207extern int 204extern int
208qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, uint16_t *, uint16_t *, 205qla2x00_get_fw_version(scsi_qla_host_t *);
209 uint16_t *, uint32_t *, uint8_t *, uint32_t *, uint8_t *);
210 206
211extern int 207extern int
212qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *); 208qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *);
@@ -371,6 +367,9 @@ qla81xx_get_port_config(scsi_qla_host_t *, uint16_t *);
371extern int 367extern int
372qla81xx_set_port_config(scsi_qla_host_t *, uint16_t *); 368qla81xx_set_port_config(scsi_qla_host_t *, uint16_t *);
373 369
370extern int
371qla2x00_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 *);
409extern int qla24xx_beacon_on(struct scsi_qla_host *); 408extern int qla24xx_beacon_on(struct scsi_qla_host *);
410extern int qla24xx_beacon_off(struct scsi_qla_host *); 409extern int qla24xx_beacon_off(struct scsi_qla_host *);
411extern void qla24xx_beacon_blink(struct scsi_qla_host *); 410extern void qla24xx_beacon_blink(struct scsi_qla_host *);
411extern void qla83xx_beacon_blink(struct scsi_qla_host *);
412extern int qla82xx_beacon_on(struct scsi_qla_host *); 412extern int qla82xx_beacon_on(struct scsi_qla_host *);
413extern int qla82xx_beacon_off(struct scsi_qla_host *); 413extern int qla82xx_beacon_off(struct scsi_qla_host *);
414extern int qla83xx_write_remote_reg(struct scsi_qla_host *, uint32_t, uint32_t);
414 415
415extern uint8_t *qla2x00_read_optrom_data(struct scsi_qla_host *, uint8_t *, 416extern 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 */
543extern int qla82xx_start_scsi(srb_t *); 544extern int qla82xx_start_scsi(srb_t *);
545extern void qla2x00_sp_free(void *, void *);
546extern void qla2x00_sp_timeout(unsigned long);
547extern void qla2x00_bsg_job_done(void *, void *, int);
548extern void qla2x00_bsg_sp_free(void *, void *);
544 549
545/* Interrupt related */ 550/* Interrupt related */
546extern irqreturn_t qla82xx_intr_handler(int, void *); 551extern irqreturn_t qla82xx_intr_handler(int, void *);
@@ -576,6 +581,8 @@ extern void qla82xx_start_iocbs(scsi_qla_host_t *);
576extern int qla82xx_fcoe_ctx_reset(scsi_qla_host_t *); 581extern int qla82xx_fcoe_ctx_reset(scsi_qla_host_t *);
577extern int qla82xx_check_md_needed(scsi_qla_host_t *); 582extern int qla82xx_check_md_needed(scsi_qla_host_t *);
578extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *); 583extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *);
584extern int qla81xx_set_led_config(scsi_qla_host_t *, uint16_t *);
585extern int qla81xx_get_led_config(scsi_qla_host_t *, uint16_t *);
579extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int); 586extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int);
580extern char *qdev_state(uint32_t); 587extern char *qdev_state(uint32_t);
581extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *); 588extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *);
@@ -589,6 +596,9 @@ extern int qla2x00_issue_iocb_timeout(scsi_qla_host_t *, void *,
589extern int qla2x00_get_idma_speed(scsi_qla_host_t *, uint16_t, 596extern 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 */
600extern void qla83xx_fw_dump(scsi_qla_host_t *, int);
601
592/* Minidump related functions */ 602/* Minidump related functions */
593extern int qla82xx_md_get_template_size(scsi_qla_host_t *); 603extern int qla82xx_md_get_template_size(scsi_qla_host_t *);
594extern int qla82xx_md_get_template(scsi_qla_host_t *); 604extern 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
243static inline int
244qla2x00_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)
330int 337int
331qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) 338qla2x00_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)
391int 400int
392qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) 401qla2x00_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,
735static int 746static int
736qla2x00_sns_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) 747qla2x00_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)
877static int 891static int
878qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) 892qla2x00_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)
933static int 947static int
934qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) 948qla2x00_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)
1107static int 1121static int
1108qla2x00_mgmt_svr_login(scsi_qla_host_t *vha) 1122qla2x00_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)
1724int 1748int
1725qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) 1749qla2x00_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 *);
29static int qla2x00_configure_local_loop(scsi_qla_host_t *); 29static int qla2x00_configure_local_loop(scsi_qla_host_t *);
30static int qla2x00_configure_fabric(scsi_qla_host_t *); 30static int qla2x00_configure_fabric(scsi_qla_host_t *);
31static int qla2x00_find_all_fabric_devs(scsi_qla_host_t *, struct list_head *); 31static int qla2x00_find_all_fabric_devs(scsi_qla_host_t *, struct list_head *);
32static int qla2x00_device_resync(scsi_qla_host_t *);
33static int qla2x00_fabric_dev_login(scsi_qla_host_t *, fc_port_t *, 32static 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
44static void 43void
45qla2x00_ctx_sp_timeout(unsigned long __data) 44qla2x00_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
65static void 62void
66qla2x00_ctx_sp_free(srb_t *sp) 63qla2x00_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
80inline srb_t *
81qla2x00_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);
125done:
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
133static inline unsigned long 77static inline unsigned long
@@ -149,19 +93,19 @@ qla2x00_get_async_timeout(struct scsi_qla_host *vha)
149} 93}
150 94
151static void 95static void
152qla2x00_async_iocb_timeout(srb_t *sp) 96qla2x00_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
175static void 119static void
176qla2x00_async_login_ctx_done(srb_t *sp) 120qla2x00_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
186int 132int
@@ -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
221done_free_sp: 166done_free_sp:
222 lio->free(sp); 167 sp->free(fcport->vha, sp);
223done: 168done:
224 return rval; 169 return rval;
225} 170}
226 171
227static void 172static void
228qla2x00_async_logout_ctx_done(srb_t *sp) 173qla2x00_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
238int 185int
239qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport) 186qla2x00_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
268done_free_sp: 214done_free_sp:
269 lio->free(sp); 215 sp->free(fcport->vha, sp);
270done: 216done:
271 return rval; 217 return rval;
272} 218}
273 219
274static void 220static void
275qla2x00_async_adisc_ctx_done(srb_t *sp) 221qla2x00_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
285int 233int
@@ -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
318done_free_sp: 265done_free_sp:
319 lio->free(sp); 266 sp->free(fcport->vha, sp);
320done: 267done:
321 return rval; 268 return rval;
322} 269}
323 270
324static void 271static void
325qla2x00_async_tm_cmd_ctx_done(srb_t *sp) 272qla2x00_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
334int 298int
335qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun, 299qla2x00_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
370done_free_sp: 333done_free_sp:
371 tcf->free(sp); 334 sp->free(fcport->vha, sp);
372done: 335done:
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
455void
456qla2x00_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);
1505skip_fac_check:
1506 if (IS_QLA83XX(ha)) {
1507 ha->flags.fac_supported = 0;
1508 rval = QLA_SUCCESS;
1509 }
1550 } 1510 }
1551 } 1511 }
1552failed: 1512failed:
@@ -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)
2971static int 2920static int
2972qla2x00_configure_fabric(scsi_qla_host_t *vha) 2921qla2x00_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 */
3500static int
3501qla2x00_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
5009qla24xx_configure_vhba(scsi_qla_host_t *vha) 4862qla24xx_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
72qla2x00_clean_dsd_pool(struct qla_hw_data *ha, srb_t *sp) 72qla2x00_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
87static inline void 90static 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
150static inline srb_t *
151qla2x00_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;
168done:
169 if (!sp)
170 QLA_VHA_MARK_NOT_BUSY(vha);
171 return sp;
172}
173
174static inline void
175qla2x00_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
185static inline int
186qla2x00_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
22qla2x00_get_cmd_direction(srb_t *sp) 22qla2x00_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)
143static inline int 144static inline int
144qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts) 145qla24xx_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(&reg->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(&reg->isp24.req_q_in, req->ring_index); 495 WRT_REG_DWORD(&reg->isp24.req_q_in, req->ring_index);
495 RD_REG_DWORD_RELAXED(&reg->isp24.req_q_in); 496 RD_REG_DWORD_RELAXED(&reg->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
797qla24xx_set_t10dif_tags(srb_t *sp, struct fw_dif_context *pkt, 798qla24xx_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
1798static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp) 1798static 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
1856skip_cmd_array: 1853skip_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(&reg->isp25mq.req_q_out); 1857 cnt = RD_REG_DWORD(&reg->isp25mq.req_q_out);
1861 else if (IS_QLA82XX(ha)) 1858 else if (IS_QLA82XX(ha))
1862 cnt = RD_REG_DWORD(&reg->isp82.req_q_out); 1859 cnt = RD_REG_DWORD(&reg->isp82.req_q_out);
@@ -1889,8 +1886,7 @@ queuing_error:
1889static void 1886static void
1890qla24xx_login_iocb(srb_t *sp, struct logio_entry_24xx *logio) 1887qla24xx_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
1909qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx) 1905qla2x00_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)
2027static void 2021static void
2028qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb) 2022qla24xx_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
318qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) 318qla2x00_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(&reg24->mailbox7) : 0; 407 mbx = (IS_QLA81XX(ha) || IS_QLA83XX(ha)) ?
408 RD_REG_WORD(&reg24->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(&reg24->mailbox4) : 0; 502 mbx = (IS_QLA81XX(ha) || IS_QLA8031(ha))
503 ? RD_REG_WORD(&reg24->mailbox4) : 0;
501 mbx = IS_QLA82XX(ha) ? RD_REG_WORD(&reg82->mailbox_out[4]) : mbx; 504 mbx = IS_QLA82XX(ha) ? RD_REG_WORD(&reg82->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
981logio_done: 974logio_done:
982 lio->done(sp); 975 sp->done(vha, sp, 0);
983} 976}
984 977
985static void 978static 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
1064static void 1035static 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
1161static void 1119static 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
1250logio_done: 1206logio_done:
1251 lio->done(sp); 1207 sp->done(vha, sp, 0);
1252} 1208}
1253 1209
1254static void 1210static 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
1391static inline void 1345static inline void
1392qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len, 1346qla2x00_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
1436qla2x00_handle_dif_error(srb_t *sp, struct sts_entry_24xx *sts24) 1397qla2x00_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
1768check_scsi_status: 1730check_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
1835out: 1797out:
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:
1861static void 1823static void
1862qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt) 1824qla2x00_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
1905static int 1849 if (sense_len > sizeof(pkt->data))
1906qla2x00_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 }
1905fatal:
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, &reg->isp, 0); 269 mb0 = RD_MAILBOX_REG(ha, &reg->isp, 0);
269 ictrl = RD_REG_WORD(&reg->isp.ictrl); 270 ictrl = RD_REG_WORD(&reg->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:
364mbx_done: 372mbx_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 */
510int 518int
511qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, 519qla2x00_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
550failed: 573failed:
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(&reg->req_q_in, 0); 3378 WRT_REG_DWORD(&reg->req_q_in, 0);
3319 WRT_REG_DWORD(&reg->req_q_out, 0); 3379 if (!IS_QLA83XX(ha))
3380 WRT_REG_DWORD(&reg->req_q_out, 0);
3320 } 3381 }
3321 req->req_q_in = &reg->req_q_in; 3382 req->req_q_in = &reg->req_q_in;
3322 req->req_q_out = &reg->req_q_out; 3383 req->req_q_out = &reg->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(&reg->rsp_q_out, 0); 3447 WRT_REG_DWORD(&reg->rsp_q_out, 0);
3375 WRT_REG_DWORD(&reg->rsp_q_in, 0); 3448 if (!IS_QLA83XX(ha))
3449 WRT_REG_DWORD(&reg->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
3979int 4055int
3980qla2x00_get_data_rate(scsi_qla_host_t *vha) 4056qla2x00_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
4301int 4379int
4380qla81xx_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
4421int
4422qla81xx_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
4463int
4302qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable) 4464qla82xx_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
4501int
4502qla83xx_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
4537int
4538qla2x00_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
911int
912qla82xx_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
911static int 934static int
912qla82xx_do_rom_fast_read(struct qla_hw_data *ha, int addr, int *valp) 935qla82xx_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 */
3648int
3649qla82xx_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
3671static int 3652static int
3672qla82xx_minidump_process_control(scsi_qla_host_t *vha, 3653qla82xx_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 **);
305static void qla2x00_free_fw_dump(struct qla_hw_data *); 305static void qla2x00_free_fw_dump(struct qla_hw_data *);
306static void qla2x00_mem_free(struct qla_hw_data *); 306static void qla2x00_mem_free(struct qla_hw_data *);
307static void qla2x00_sp_free_dma(srb_t *);
308 307
309/* -------------------------------------------------------------------------- */ 308/* -------------------------------------------------------------------------- */
310static int qla2x00_alloc_queues(struct qla_hw_data *ha) 309static 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
562static inline srb_t * 561void
563qla2x00_get_new_sp(scsi_qla_host_t *vha, fc_port_t *fcport, 562qla2x00_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
608static void
609qla2x00_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
586static int 632static 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
660qc24_host_busy_free_sp: 713qc24_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
664qc24_host_busy: 716qc24_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
1622static int
1623qla83xx_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
1702mqiobase_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
1708iospace_error_exit:
1709 return -ENOMEM;
1710}
1711
1596static struct isp_operations qla2100_isp_ops = { 1712static 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
1934static 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
1818static inline void 1971static inline void
1819qla2x00_set_isp_flags(struct qla_hw_data *ha) 1972qla2x00_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;
2969fail_free_gid_list: 3164fail_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
3664static void
3665qla2x00_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
3707static void
3708qla2x00_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
3717void
3718qla2x00_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
3911static DEFINE_MUTEX(qla_fw_lock); 4040static 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
3924struct fw_blob * 4055struct 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];
805done: 846done:
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
818static void 856static 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
1662void
1663qla83xx_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
1622int 1727int
1623qla24xx_beacon_on(struct scsi_qla_host *vha) 1728qla24xx_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(&reg->gpiod); 1759 gpio_data = RD_REG_DWORD(&reg->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
1772skip_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(&reg->gpiod); 1809 RD_REG_DWORD(&reg->gpiod);
1691 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1810 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1692 1811
1812set_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) {