diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2009-01-05 14:18:11 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-01-07 16:51:44 -0500 |
commit | 3a03eb797ce76ae8868a1497e9e746ad0add1e3b (patch) | |
tree | 2dc17c39b7c1e35248b35f7433de8711f0b6656a /drivers/scsi/qla2xxx | |
parent | 444786d7fdd770f67e29a068ec8ee981d323f7a7 (diff) |
[SCSI] qla2xxx: Add ISP81XX support.
Codes to support new FCoE boards.
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 26 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 324 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.h | 40 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 21 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dfs.c | 3 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_fw.h | 294 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 5 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gs.c | 9 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 280 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 60 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 25 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 113 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_sup.c | 143 |
13 files changed, 1234 insertions, 109 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index cd53627cc761..c7acef50d5da 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -303,7 +303,7 @@ qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj, | |||
303 | else if (start == (ha->flt_region_boot * 4) || | 303 | else if (start == (ha->flt_region_boot * 4) || |
304 | start == (ha->flt_region_fw * 4)) | 304 | start == (ha->flt_region_fw * 4)) |
305 | valid = 1; | 305 | valid = 1; |
306 | else if (IS_QLA25XX(ha) && | 306 | else if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && |
307 | start == (ha->flt_region_vpd_nvram * 4)) | 307 | start == (ha->flt_region_vpd_nvram * 4)) |
308 | valid = 1; | 308 | valid = 1; |
309 | if (!valid) { | 309 | if (!valid) { |
@@ -815,6 +815,21 @@ qla2x00_total_isp_aborts_show(struct device *dev, | |||
815 | ha->qla_stats.total_isp_aborts); | 815 | ha->qla_stats.total_isp_aborts); |
816 | } | 816 | } |
817 | 817 | ||
818 | static ssize_t | ||
819 | qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr, | ||
820 | char *buf) | ||
821 | { | ||
822 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); | ||
823 | struct qla_hw_data *ha = vha->hw; | ||
824 | |||
825 | if (!IS_QLA81XX(ha)) | ||
826 | return snprintf(buf, PAGE_SIZE, "\n"); | ||
827 | |||
828 | return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x.%02x (%x)\n", | ||
829 | ha->mpi_version[0], ha->mpi_version[1], ha->mpi_version[2], | ||
830 | ha->mpi_version[3], ha->mpi_capabilities); | ||
831 | } | ||
832 | |||
818 | static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); | 833 | static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); |
819 | static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); | 834 | static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); |
820 | static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); | 835 | static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); |
@@ -839,6 +854,7 @@ static DEVICE_ATTR(optrom_fw_version, S_IRUGO, qla2x00_optrom_fw_version_show, | |||
839 | NULL); | 854 | NULL); |
840 | static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show, | 855 | static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show, |
841 | NULL); | 856 | NULL); |
857 | static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL); | ||
842 | 858 | ||
843 | struct device_attribute *qla2x00_host_attrs[] = { | 859 | struct device_attribute *qla2x00_host_attrs[] = { |
844 | &dev_attr_driver_version, | 860 | &dev_attr_driver_version, |
@@ -858,6 +874,7 @@ struct device_attribute *qla2x00_host_attrs[] = { | |||
858 | &dev_attr_optrom_fcode_version, | 874 | &dev_attr_optrom_fcode_version, |
859 | &dev_attr_optrom_fw_version, | 875 | &dev_attr_optrom_fw_version, |
860 | &dev_attr_total_isp_aborts, | 876 | &dev_attr_total_isp_aborts, |
877 | &dev_attr_mpi_version, | ||
861 | NULL, | 878 | NULL, |
862 | }; | 879 | }; |
863 | 880 | ||
@@ -892,6 +909,9 @@ qla2x00_get_host_speed(struct Scsi_Host *shost) | |||
892 | case PORT_SPEED_8GB: | 909 | case PORT_SPEED_8GB: |
893 | speed = FC_PORTSPEED_8GBIT; | 910 | speed = FC_PORTSPEED_8GBIT; |
894 | break; | 911 | break; |
912 | case PORT_SPEED_10GB: | ||
913 | speed = FC_PORTSPEED_10GBIT; | ||
914 | break; | ||
895 | } | 915 | } |
896 | fc_host_speed(shost) = speed; | 916 | fc_host_speed(shost) = speed; |
897 | } | 917 | } |
@@ -1382,7 +1402,9 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha) | |||
1382 | fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; | 1402 | fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; |
1383 | fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; | 1403 | fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; |
1384 | 1404 | ||
1385 | if (IS_QLA25XX(ha)) | 1405 | if (IS_QLA81XX(ha)) |
1406 | speed = FC_PORTSPEED_10GBIT; | ||
1407 | else if (IS_QLA25XX(ha)) | ||
1386 | speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | | 1408 | speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | |
1387 | FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; | 1409 | FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; |
1388 | else if (IS_QLA24XX_TYPE(ha)) | 1410 | else if (IS_QLA24XX_TYPE(ha)) |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 4f478364fa43..34760f8d4f17 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -1324,6 +1324,330 @@ qla25xx_fw_dump_failed: | |||
1324 | if (!hardware_locked) | 1324 | if (!hardware_locked) |
1325 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1325 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1326 | } | 1326 | } |
1327 | |||
1328 | void | ||
1329 | qla81xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | ||
1330 | { | ||
1331 | int rval; | ||
1332 | uint32_t cnt; | ||
1333 | uint32_t risc_address; | ||
1334 | struct qla_hw_data *ha = vha->hw; | ||
1335 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | ||
1336 | uint32_t __iomem *dmp_reg; | ||
1337 | uint32_t *iter_reg; | ||
1338 | uint16_t __iomem *mbx_reg; | ||
1339 | unsigned long flags; | ||
1340 | struct qla81xx_fw_dump *fw; | ||
1341 | uint32_t ext_mem_cnt; | ||
1342 | void *nxt, *nxt_chain; | ||
1343 | uint32_t *last_chain = NULL; | ||
1344 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); | ||
1345 | |||
1346 | risc_address = ext_mem_cnt = 0; | ||
1347 | flags = 0; | ||
1348 | |||
1349 | if (!hardware_locked) | ||
1350 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1351 | |||
1352 | if (!ha->fw_dump) { | ||
1353 | qla_printk(KERN_WARNING, ha, | ||
1354 | "No buffer available for dump!!!\n"); | ||
1355 | goto qla81xx_fw_dump_failed; | ||
1356 | } | ||
1357 | |||
1358 | if (ha->fw_dumped) { | ||
1359 | qla_printk(KERN_WARNING, ha, | ||
1360 | "Firmware has been previously dumped (%p) -- ignoring " | ||
1361 | "request...\n", ha->fw_dump); | ||
1362 | goto qla81xx_fw_dump_failed; | ||
1363 | } | ||
1364 | fw = &ha->fw_dump->isp.isp81; | ||
1365 | qla2xxx_prep_dump(ha, ha->fw_dump); | ||
1366 | |||
1367 | fw->host_status = htonl(RD_REG_DWORD(®->host_status)); | ||
1368 | |||
1369 | /* Pause RISC. */ | ||
1370 | rval = qla24xx_pause_risc(reg); | ||
1371 | if (rval != QLA_SUCCESS) | ||
1372 | goto qla81xx_fw_dump_failed_0; | ||
1373 | |||
1374 | /* Host/Risc registers. */ | ||
1375 | iter_reg = fw->host_risc_reg; | ||
1376 | iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg); | ||
1377 | qla24xx_read_window(reg, 0x7010, 16, iter_reg); | ||
1378 | |||
1379 | /* PCIe registers. */ | ||
1380 | WRT_REG_DWORD(®->iobase_addr, 0x7C00); | ||
1381 | RD_REG_DWORD(®->iobase_addr); | ||
1382 | WRT_REG_DWORD(®->iobase_window, 0x01); | ||
1383 | dmp_reg = ®->iobase_c4; | ||
1384 | fw->pcie_regs[0] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1385 | fw->pcie_regs[1] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1386 | fw->pcie_regs[2] = htonl(RD_REG_DWORD(dmp_reg)); | ||
1387 | fw->pcie_regs[3] = htonl(RD_REG_DWORD(®->iobase_window)); | ||
1388 | |||
1389 | WRT_REG_DWORD(®->iobase_window, 0x00); | ||
1390 | RD_REG_DWORD(®->iobase_window); | ||
1391 | |||
1392 | /* Host interface registers. */ | ||
1393 | dmp_reg = ®->flash_addr; | ||
1394 | for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) | ||
1395 | fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1396 | |||
1397 | /* Disable interrupts. */ | ||
1398 | WRT_REG_DWORD(®->ictrl, 0); | ||
1399 | RD_REG_DWORD(®->ictrl); | ||
1400 | |||
1401 | /* Shadow registers. */ | ||
1402 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); | ||
1403 | RD_REG_DWORD(®->iobase_addr); | ||
1404 | WRT_REG_DWORD(®->iobase_select, 0xB0000000); | ||
1405 | fw->shadow_reg[0] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1406 | |||
1407 | WRT_REG_DWORD(®->iobase_select, 0xB0100000); | ||
1408 | fw->shadow_reg[1] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1409 | |||
1410 | WRT_REG_DWORD(®->iobase_select, 0xB0200000); | ||
1411 | fw->shadow_reg[2] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1412 | |||
1413 | WRT_REG_DWORD(®->iobase_select, 0xB0300000); | ||
1414 | fw->shadow_reg[3] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1415 | |||
1416 | WRT_REG_DWORD(®->iobase_select, 0xB0400000); | ||
1417 | fw->shadow_reg[4] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1418 | |||
1419 | WRT_REG_DWORD(®->iobase_select, 0xB0500000); | ||
1420 | fw->shadow_reg[5] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1421 | |||
1422 | WRT_REG_DWORD(®->iobase_select, 0xB0600000); | ||
1423 | fw->shadow_reg[6] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1424 | |||
1425 | WRT_REG_DWORD(®->iobase_select, 0xB0700000); | ||
1426 | fw->shadow_reg[7] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1427 | |||
1428 | WRT_REG_DWORD(®->iobase_select, 0xB0800000); | ||
1429 | fw->shadow_reg[8] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1430 | |||
1431 | WRT_REG_DWORD(®->iobase_select, 0xB0900000); | ||
1432 | fw->shadow_reg[9] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1433 | |||
1434 | WRT_REG_DWORD(®->iobase_select, 0xB0A00000); | ||
1435 | fw->shadow_reg[10] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1436 | |||
1437 | /* RISC I/O register. */ | ||
1438 | WRT_REG_DWORD(®->iobase_addr, 0x0010); | ||
1439 | fw->risc_io_reg = htonl(RD_REG_DWORD(®->iobase_window)); | ||
1440 | |||
1441 | /* Mailbox registers. */ | ||
1442 | mbx_reg = ®->mailbox0; | ||
1443 | for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) | ||
1444 | fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++)); | ||
1445 | |||
1446 | /* Transfer sequence registers. */ | ||
1447 | iter_reg = fw->xseq_gp_reg; | ||
1448 | iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg); | ||
1449 | iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg); | ||
1450 | iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg); | ||
1451 | iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg); | ||
1452 | iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg); | ||
1453 | iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg); | ||
1454 | iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg); | ||
1455 | qla24xx_read_window(reg, 0xBF70, 16, iter_reg); | ||
1456 | |||
1457 | iter_reg = fw->xseq_0_reg; | ||
1458 | iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg); | ||
1459 | iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg); | ||
1460 | qla24xx_read_window(reg, 0xBFE0, 16, iter_reg); | ||
1461 | |||
1462 | qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg); | ||
1463 | |||
1464 | /* Receive sequence registers. */ | ||
1465 | iter_reg = fw->rseq_gp_reg; | ||
1466 | iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg); | ||
1467 | iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg); | ||
1468 | iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg); | ||
1469 | iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg); | ||
1470 | iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg); | ||
1471 | iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg); | ||
1472 | iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg); | ||
1473 | qla24xx_read_window(reg, 0xFF70, 16, iter_reg); | ||
1474 | |||
1475 | iter_reg = fw->rseq_0_reg; | ||
1476 | iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg); | ||
1477 | qla24xx_read_window(reg, 0xFFD0, 16, iter_reg); | ||
1478 | |||
1479 | qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg); | ||
1480 | qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg); | ||
1481 | |||
1482 | /* Auxiliary sequence registers. */ | ||
1483 | iter_reg = fw->aseq_gp_reg; | ||
1484 | iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg); | ||
1485 | iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg); | ||
1486 | iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg); | ||
1487 | iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg); | ||
1488 | iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg); | ||
1489 | iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg); | ||
1490 | iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg); | ||
1491 | qla24xx_read_window(reg, 0xB070, 16, iter_reg); | ||
1492 | |||
1493 | iter_reg = fw->aseq_0_reg; | ||
1494 | iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg); | ||
1495 | qla24xx_read_window(reg, 0xB0D0, 16, iter_reg); | ||
1496 | |||
1497 | qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg); | ||
1498 | qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg); | ||
1499 | |||
1500 | /* Command DMA registers. */ | ||
1501 | qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg); | ||
1502 | |||
1503 | /* Queues. */ | ||
1504 | iter_reg = fw->req0_dma_reg; | ||
1505 | iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg); | ||
1506 | dmp_reg = ®->iobase_q; | ||
1507 | for (cnt = 0; cnt < 7; cnt++) | ||
1508 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1509 | |||
1510 | iter_reg = fw->resp0_dma_reg; | ||
1511 | iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg); | ||
1512 | dmp_reg = ®->iobase_q; | ||
1513 | for (cnt = 0; cnt < 7; cnt++) | ||
1514 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1515 | |||
1516 | iter_reg = fw->req1_dma_reg; | ||
1517 | iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg); | ||
1518 | dmp_reg = ®->iobase_q; | ||
1519 | for (cnt = 0; cnt < 7; cnt++) | ||
1520 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1521 | |||
1522 | /* Transmit DMA registers. */ | ||
1523 | iter_reg = fw->xmt0_dma_reg; | ||
1524 | iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg); | ||
1525 | qla24xx_read_window(reg, 0x7610, 16, iter_reg); | ||
1526 | |||
1527 | iter_reg = fw->xmt1_dma_reg; | ||
1528 | iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg); | ||
1529 | qla24xx_read_window(reg, 0x7630, 16, iter_reg); | ||
1530 | |||
1531 | iter_reg = fw->xmt2_dma_reg; | ||
1532 | iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg); | ||
1533 | qla24xx_read_window(reg, 0x7650, 16, iter_reg); | ||
1534 | |||
1535 | iter_reg = fw->xmt3_dma_reg; | ||
1536 | iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg); | ||
1537 | qla24xx_read_window(reg, 0x7670, 16, iter_reg); | ||
1538 | |||
1539 | iter_reg = fw->xmt4_dma_reg; | ||
1540 | iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg); | ||
1541 | qla24xx_read_window(reg, 0x7690, 16, iter_reg); | ||
1542 | |||
1543 | qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg); | ||
1544 | |||
1545 | /* Receive DMA registers. */ | ||
1546 | iter_reg = fw->rcvt0_data_dma_reg; | ||
1547 | iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg); | ||
1548 | qla24xx_read_window(reg, 0x7710, 16, iter_reg); | ||
1549 | |||
1550 | iter_reg = fw->rcvt1_data_dma_reg; | ||
1551 | iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg); | ||
1552 | qla24xx_read_window(reg, 0x7730, 16, iter_reg); | ||
1553 | |||
1554 | /* RISC registers. */ | ||
1555 | iter_reg = fw->risc_gp_reg; | ||
1556 | iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg); | ||
1557 | iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg); | ||
1558 | iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg); | ||
1559 | iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg); | ||
1560 | iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg); | ||
1561 | iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg); | ||
1562 | iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg); | ||
1563 | qla24xx_read_window(reg, 0x0F70, 16, iter_reg); | ||
1564 | |||
1565 | /* Local memory controller registers. */ | ||
1566 | iter_reg = fw->lmc_reg; | ||
1567 | iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg); | ||
1568 | iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg); | ||
1569 | iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg); | ||
1570 | iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg); | ||
1571 | iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg); | ||
1572 | iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg); | ||
1573 | iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg); | ||
1574 | qla24xx_read_window(reg, 0x3070, 16, iter_reg); | ||
1575 | |||
1576 | /* Fibre Protocol Module registers. */ | ||
1577 | iter_reg = fw->fpm_hdw_reg; | ||
1578 | iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg); | ||
1579 | iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg); | ||
1580 | iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg); | ||
1581 | iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg); | ||
1582 | iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg); | ||
1583 | iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg); | ||
1584 | iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg); | ||
1585 | iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg); | ||
1586 | iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg); | ||
1587 | iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg); | ||
1588 | iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg); | ||
1589 | iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg); | ||
1590 | iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg); | ||
1591 | qla24xx_read_window(reg, 0x40D0, 16, iter_reg); | ||
1592 | |||
1593 | /* Frame Buffer registers. */ | ||
1594 | iter_reg = fw->fb_hdw_reg; | ||
1595 | iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg); | ||
1596 | iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg); | ||
1597 | iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg); | ||
1598 | iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg); | ||
1599 | iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg); | ||
1600 | iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg); | ||
1601 | iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg); | ||
1602 | iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg); | ||
1603 | iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg); | ||
1604 | iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg); | ||
1605 | iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg); | ||
1606 | iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg); | ||
1607 | qla24xx_read_window(reg, 0x6F00, 16, iter_reg); | ||
1608 | |||
1609 | /* Multi queue registers */ | ||
1610 | nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset, | ||
1611 | &last_chain); | ||
1612 | |||
1613 | rval = qla24xx_soft_reset(ha); | ||
1614 | if (rval != QLA_SUCCESS) | ||
1615 | goto qla81xx_fw_dump_failed_0; | ||
1616 | |||
1617 | rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram), | ||
1618 | &nxt); | ||
1619 | if (rval != QLA_SUCCESS) | ||
1620 | goto qla81xx_fw_dump_failed_0; | ||
1621 | |||
1622 | nxt = qla2xxx_copy_queues(ha, nxt); | ||
1623 | |||
1624 | nxt = qla24xx_copy_eft(ha, nxt); | ||
1625 | |||
1626 | /* Chain entries -- started with MQ. */ | ||
1627 | qla25xx_copy_fce(ha, nxt_chain, &last_chain); | ||
1628 | if (last_chain) { | ||
1629 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); | ||
1630 | *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); | ||
1631 | } | ||
1632 | |||
1633 | qla81xx_fw_dump_failed_0: | ||
1634 | if (rval != QLA_SUCCESS) { | ||
1635 | qla_printk(KERN_WARNING, ha, | ||
1636 | "Failed to dump firmware (%x)!!!\n", rval); | ||
1637 | ha->fw_dumped = 0; | ||
1638 | |||
1639 | } else { | ||
1640 | qla_printk(KERN_INFO, ha, | ||
1641 | "Firmware dump saved to temp buffer (%ld/%p).\n", | ||
1642 | base_vha->host_no, ha->fw_dump); | ||
1643 | ha->fw_dumped = 1; | ||
1644 | } | ||
1645 | |||
1646 | qla81xx_fw_dump_failed: | ||
1647 | if (!hardware_locked) | ||
1648 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
1649 | } | ||
1650 | |||
1327 | /****************************************************************************/ | 1651 | /****************************************************************************/ |
1328 | /* Driver Debug Functions. */ | 1652 | /* Driver Debug Functions. */ |
1329 | /****************************************************************************/ | 1653 | /****************************************************************************/ |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h index c1794a70a45f..f660dd70b72e 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.h +++ b/drivers/scsi/qla2xxx/qla_dbg.h | |||
@@ -251,6 +251,45 @@ struct qla25xx_fw_dump { | |||
251 | uint32_t ext_mem[1]; | 251 | uint32_t ext_mem[1]; |
252 | }; | 252 | }; |
253 | 253 | ||
254 | struct qla81xx_fw_dump { | ||
255 | uint32_t host_status; | ||
256 | uint32_t host_risc_reg[32]; | ||
257 | uint32_t pcie_regs[4]; | ||
258 | uint32_t host_reg[32]; | ||
259 | uint32_t shadow_reg[11]; | ||
260 | uint32_t risc_io_reg; | ||
261 | uint16_t mailbox_reg[32]; | ||
262 | uint32_t xseq_gp_reg[128]; | ||
263 | uint32_t xseq_0_reg[48]; | ||
264 | uint32_t xseq_1_reg[16]; | ||
265 | uint32_t rseq_gp_reg[128]; | ||
266 | uint32_t rseq_0_reg[32]; | ||
267 | uint32_t rseq_1_reg[16]; | ||
268 | uint32_t rseq_2_reg[16]; | ||
269 | uint32_t aseq_gp_reg[128]; | ||
270 | uint32_t aseq_0_reg[32]; | ||
271 | uint32_t aseq_1_reg[16]; | ||
272 | uint32_t aseq_2_reg[16]; | ||
273 | uint32_t cmd_dma_reg[16]; | ||
274 | uint32_t req0_dma_reg[15]; | ||
275 | uint32_t resp0_dma_reg[15]; | ||
276 | uint32_t req1_dma_reg[15]; | ||
277 | uint32_t xmt0_dma_reg[32]; | ||
278 | uint32_t xmt1_dma_reg[32]; | ||
279 | uint32_t xmt2_dma_reg[32]; | ||
280 | uint32_t xmt3_dma_reg[32]; | ||
281 | uint32_t xmt4_dma_reg[32]; | ||
282 | uint32_t xmt_data_dma_reg[16]; | ||
283 | uint32_t rcvt0_data_dma_reg[32]; | ||
284 | uint32_t rcvt1_data_dma_reg[32]; | ||
285 | uint32_t risc_gp_reg[128]; | ||
286 | uint32_t lmc_reg[128]; | ||
287 | uint32_t fpm_hdw_reg[224]; | ||
288 | uint32_t fb_hdw_reg[208]; | ||
289 | uint32_t code_ram[0x2000]; | ||
290 | uint32_t ext_mem[1]; | ||
291 | }; | ||
292 | |||
254 | #define EFT_NUM_BUFFERS 4 | 293 | #define EFT_NUM_BUFFERS 4 |
255 | #define EFT_BYTES_PER_BUFFER 0x4000 | 294 | #define EFT_BYTES_PER_BUFFER 0x4000 |
256 | #define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) | 295 | #define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) |
@@ -313,5 +352,6 @@ struct qla2xxx_fw_dump { | |||
313 | struct qla2300_fw_dump isp23; | 352 | struct qla2300_fw_dump isp23; |
314 | struct qla24xx_fw_dump isp24; | 353 | struct qla24xx_fw_dump isp24; |
315 | struct qla25xx_fw_dump isp25; | 354 | struct qla25xx_fw_dump isp25; |
355 | struct qla81xx_fw_dump isp81; | ||
316 | } isp; | 356 | } isp; |
317 | }; | 357 | }; |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 6b3762243689..023ee77fb027 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -2303,6 +2303,7 @@ struct qla_hw_data { | |||
2303 | #define PORT_SPEED_2GB 0x01 | 2303 | #define PORT_SPEED_2GB 0x01 |
2304 | #define PORT_SPEED_4GB 0x03 | 2304 | #define PORT_SPEED_4GB 0x03 |
2305 | #define PORT_SPEED_8GB 0x04 | 2305 | #define PORT_SPEED_8GB 0x04 |
2306 | #define PORT_SPEED_10GB 0x13 | ||
2306 | uint16_t link_data_rate; /* F/W operating speed */ | 2307 | uint16_t link_data_rate; /* F/W operating speed */ |
2307 | 2308 | ||
2308 | uint8_t current_topology; | 2309 | uint8_t current_topology; |
@@ -2322,6 +2323,7 @@ struct qla_hw_data { | |||
2322 | 2323 | ||
2323 | #define PCI_DEVICE_ID_QLOGIC_ISP2532 0x2532 | 2324 | #define PCI_DEVICE_ID_QLOGIC_ISP2532 0x2532 |
2324 | #define PCI_DEVICE_ID_QLOGIC_ISP8432 0x8432 | 2325 | #define PCI_DEVICE_ID_QLOGIC_ISP8432 0x8432 |
2326 | #define PCI_DEVICE_ID_QLOGIC_ISP8001 0x8001 | ||
2325 | uint32_t device_type; | 2327 | uint32_t device_type; |
2326 | #define DT_ISP2100 BIT_0 | 2328 | #define DT_ISP2100 BIT_0 |
2327 | #define DT_ISP2200 BIT_1 | 2329 | #define DT_ISP2200 BIT_1 |
@@ -2336,7 +2338,8 @@ struct qla_hw_data { | |||
2336 | #define DT_ISP5432 BIT_10 | 2338 | #define DT_ISP5432 BIT_10 |
2337 | #define DT_ISP2532 BIT_11 | 2339 | #define DT_ISP2532 BIT_11 |
2338 | #define DT_ISP8432 BIT_12 | 2340 | #define DT_ISP8432 BIT_12 |
2339 | #define DT_ISP_LAST (DT_ISP8432 << 1) | 2341 | #define DT_ISP8001 BIT_13 |
2342 | #define DT_ISP_LAST (DT_ISP8001 << 1) | ||
2340 | 2343 | ||
2341 | #define DT_IIDMA BIT_26 | 2344 | #define DT_IIDMA BIT_26 |
2342 | #define DT_FWI2 BIT_27 | 2345 | #define DT_FWI2 BIT_27 |
@@ -2358,6 +2361,7 @@ struct qla_hw_data { | |||
2358 | #define IS_QLA5432(ha) (DT_MASK(ha) & DT_ISP5432) | 2361 | #define IS_QLA5432(ha) (DT_MASK(ha) & DT_ISP5432) |
2359 | #define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532) | 2362 | #define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532) |
2360 | #define IS_QLA8432(ha) (DT_MASK(ha) & DT_ISP8432) | 2363 | #define IS_QLA8432(ha) (DT_MASK(ha) & DT_ISP8432) |
2364 | #define IS_QLA8001(ha) (DT_MASK(ha) & DT_ISP8001) | ||
2361 | 2365 | ||
2362 | #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ | 2366 | #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ |
2363 | IS_QLA6312(ha) || IS_QLA6322(ha)) | 2367 | IS_QLA6312(ha) || IS_QLA6322(ha)) |
@@ -2367,9 +2371,10 @@ struct qla_hw_data { | |||
2367 | #define IS_QLA84XX(ha) (IS_QLA8432(ha)) | 2371 | #define IS_QLA84XX(ha) (IS_QLA8432(ha)) |
2368 | #define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \ | 2372 | #define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \ |
2369 | IS_QLA84XX(ha)) | 2373 | IS_QLA84XX(ha)) |
2374 | #define IS_QLA81XX(ha) (IS_QLA8001(ha)) | ||
2370 | #define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \ | 2375 | #define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \ |
2371 | IS_QLA25XX(ha)) | 2376 | IS_QLA25XX(ha) || IS_QLA81XX(ha)) |
2372 | #define IS_NOPOLLING_TYPE(ha) (IS_QLA25XX(ha) && \ | 2377 | #define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && \ |
2373 | (ha)->flags.msix_enabled) | 2378 | (ha)->flags.msix_enabled) |
2374 | 2379 | ||
2375 | #define IS_IIDMA_CAPABLE(ha) ((ha)->device_type & DT_IIDMA) | 2380 | #define IS_IIDMA_CAPABLE(ha) ((ha)->device_type & DT_IIDMA) |
@@ -2468,6 +2473,9 @@ struct qla_hw_data { | |||
2468 | uint8_t fw_seriallink_options[4]; | 2473 | uint8_t fw_seriallink_options[4]; |
2469 | uint16_t fw_seriallink_options24[4]; | 2474 | uint16_t fw_seriallink_options24[4]; |
2470 | 2475 | ||
2476 | uint8_t mpi_version[4]; | ||
2477 | uint32_t mpi_capabilities; | ||
2478 | |||
2471 | /* Firmware dump information. */ | 2479 | /* Firmware dump information. */ |
2472 | struct qla2xxx_fw_dump *fw_dump; | 2480 | struct qla2xxx_fw_dump *fw_dump; |
2473 | uint32_t fw_dump_len; | 2481 | uint32_t fw_dump_len; |
@@ -2515,6 +2523,12 @@ struct qla_hw_data { | |||
2515 | uint8_t fcode_revision[16]; | 2523 | uint8_t fcode_revision[16]; |
2516 | uint32_t fw_revision[4]; | 2524 | uint32_t fw_revision[4]; |
2517 | 2525 | ||
2526 | /* Offsets for flash/nvram access (set to ~0 if not used). */ | ||
2527 | uint32_t flash_conf_off; | ||
2528 | uint32_t flash_data_off; | ||
2529 | uint32_t nvram_conf_off; | ||
2530 | uint32_t nvram_data_off; | ||
2531 | |||
2518 | uint32_t fdt_wrt_disable; | 2532 | uint32_t fdt_wrt_disable; |
2519 | uint32_t fdt_erase_cmd; | 2533 | uint32_t fdt_erase_cmd; |
2520 | uint32_t fdt_block_size; | 2534 | uint32_t fdt_block_size; |
@@ -2729,6 +2743,7 @@ typedef struct scsi_qla_host { | |||
2729 | #define OPTROM_SIZE_2322 0x100000 | 2743 | #define OPTROM_SIZE_2322 0x100000 |
2730 | #define OPTROM_SIZE_24XX 0x100000 | 2744 | #define OPTROM_SIZE_24XX 0x100000 |
2731 | #define OPTROM_SIZE_25XX 0x200000 | 2745 | #define OPTROM_SIZE_25XX 0x200000 |
2746 | #define OPTROM_SIZE_81XX 0x400000 | ||
2732 | 2747 | ||
2733 | #include "qla_gbl.h" | 2748 | #include "qla_gbl.h" |
2734 | #include "qla_dbg.h" | 2749 | #include "qla_dbg.h" |
diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c index 0e366a1b44b3..c66036da7d2b 100644 --- a/drivers/scsi/qla2xxx/qla_dfs.c +++ b/drivers/scsi/qla2xxx/qla_dfs.c | |||
@@ -113,7 +113,8 @@ int | |||
113 | qla2x00_dfs_setup(scsi_qla_host_t *vha) | 113 | 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 | if (!IS_QLA25XX(ha)) | 116 | |
117 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) | ||
117 | goto out; | 118 | goto out; |
118 | if (!ha->fce) | 119 | if (!ha->fce) |
119 | goto out; | 120 | goto out; |
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index ee1f1e794c2d..7abb045a0410 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h | |||
@@ -1215,9 +1215,10 @@ struct qla_fdt_layout { | |||
1215 | 1215 | ||
1216 | struct qla_flt_location { | 1216 | struct qla_flt_location { |
1217 | uint8_t sig[4]; | 1217 | uint8_t sig[4]; |
1218 | uint32_t start_lo; | 1218 | uint16_t start_lo; |
1219 | uint32_t start_hi; | 1219 | uint16_t start_hi; |
1220 | uint16_t unused; | 1220 | uint8_t version; |
1221 | uint8_t unused[5]; | ||
1221 | uint16_t checksum; | 1222 | uint16_t checksum; |
1222 | }; | 1223 | }; |
1223 | 1224 | ||
@@ -1390,4 +1391,291 @@ struct access_chip_rsp_84xx { | |||
1390 | 1391 | ||
1391 | uint32_t reserved[12]; | 1392 | uint32_t reserved[12]; |
1392 | }; | 1393 | }; |
1394 | |||
1395 | /* 81XX Support **************************************************************/ | ||
1396 | |||
1397 | #define MBA_DCBX_START 0x8016 | ||
1398 | #define MBA_DCBX_COMPLETE 0x8030 | ||
1399 | #define MBA_FCF_CONF_ERR 0x8031 | ||
1400 | #define MBA_DCBX_PARAM_UPDATE 0x8032 | ||
1401 | #define MBA_IDC_COMPLETE 0x8100 | ||
1402 | #define MBA_IDC_NOTIFY 0x8101 | ||
1403 | #define MBA_IDC_TIME_EXT 0x8102 | ||
1404 | |||
1405 | struct nvram_81xx { | ||
1406 | /* NVRAM header. */ | ||
1407 | uint8_t id[4]; | ||
1408 | uint16_t nvram_version; | ||
1409 | uint16_t reserved_0; | ||
1410 | |||
1411 | /* Firmware Initialization Control Block. */ | ||
1412 | uint16_t version; | ||
1413 | uint16_t reserved_1; | ||
1414 | uint16_t frame_payload_size; | ||
1415 | uint16_t execution_throttle; | ||
1416 | uint16_t exchange_count; | ||
1417 | uint16_t reserved_2; | ||
1418 | |||
1419 | uint8_t port_name[WWN_SIZE]; | ||
1420 | uint8_t node_name[WWN_SIZE]; | ||
1421 | |||
1422 | uint16_t login_retry_count; | ||
1423 | uint16_t reserved_3; | ||
1424 | uint16_t interrupt_delay_timer; | ||
1425 | uint16_t login_timeout; | ||
1426 | |||
1427 | uint32_t firmware_options_1; | ||
1428 | uint32_t firmware_options_2; | ||
1429 | uint32_t firmware_options_3; | ||
1430 | |||
1431 | uint16_t reserved_4[4]; | ||
1432 | |||
1433 | /* Offset 64. */ | ||
1434 | uint8_t enode_mac[6]; | ||
1435 | uint16_t reserved_5[5]; | ||
1436 | |||
1437 | /* Offset 80. */ | ||
1438 | uint16_t reserved_6[24]; | ||
1439 | |||
1440 | /* Offset 128. */ | ||
1441 | uint16_t reserved_7[64]; | ||
1442 | |||
1443 | /* | ||
1444 | * BIT 0 = Enable spinup delay | ||
1445 | * BIT 1 = Disable BIOS | ||
1446 | * BIT 2 = Enable Memory Map BIOS | ||
1447 | * BIT 3 = Enable Selectable Boot | ||
1448 | * BIT 4 = Disable RISC code load | ||
1449 | * BIT 5 = Disable Serdes | ||
1450 | * BIT 6 = Opt boot mode | ||
1451 | * BIT 7 = Interrupt enable | ||
1452 | * | ||
1453 | * BIT 8 = EV Control enable | ||
1454 | * BIT 9 = Enable lip reset | ||
1455 | * BIT 10 = Enable lip full login | ||
1456 | * BIT 11 = Enable target reset | ||
1457 | * BIT 12 = Stop firmware | ||
1458 | * BIT 13 = Enable nodename option | ||
1459 | * BIT 14 = Default WWPN valid | ||
1460 | * BIT 15 = Enable alternate WWN | ||
1461 | * | ||
1462 | * BIT 16 = CLP LUN string | ||
1463 | * BIT 17 = CLP Target string | ||
1464 | * BIT 18 = CLP BIOS enable string | ||
1465 | * BIT 19 = CLP Serdes string | ||
1466 | * BIT 20 = CLP WWPN string | ||
1467 | * BIT 21 = CLP WWNN string | ||
1468 | * BIT 22 = | ||
1469 | * BIT 23 = | ||
1470 | * BIT 24 = Keep WWPN | ||
1471 | * BIT 25 = Temp WWPN | ||
1472 | * BIT 26-31 = | ||
1473 | */ | ||
1474 | uint32_t host_p; | ||
1475 | |||
1476 | uint8_t alternate_port_name[WWN_SIZE]; | ||
1477 | uint8_t alternate_node_name[WWN_SIZE]; | ||
1478 | |||
1479 | uint8_t boot_port_name[WWN_SIZE]; | ||
1480 | uint16_t boot_lun_number; | ||
1481 | uint16_t reserved_8; | ||
1482 | |||
1483 | uint8_t alt1_boot_port_name[WWN_SIZE]; | ||
1484 | uint16_t alt1_boot_lun_number; | ||
1485 | uint16_t reserved_9; | ||
1486 | |||
1487 | uint8_t alt2_boot_port_name[WWN_SIZE]; | ||
1488 | uint16_t alt2_boot_lun_number; | ||
1489 | uint16_t reserved_10; | ||
1490 | |||
1491 | uint8_t alt3_boot_port_name[WWN_SIZE]; | ||
1492 | uint16_t alt3_boot_lun_number; | ||
1493 | uint16_t reserved_11; | ||
1494 | |||
1495 | /* | ||
1496 | * BIT 0 = Selective Login | ||
1497 | * BIT 1 = Alt-Boot Enable | ||
1498 | * BIT 2 = Reserved | ||
1499 | * BIT 3 = Boot Order List | ||
1500 | * BIT 4 = Reserved | ||
1501 | * BIT 5 = Selective LUN | ||
1502 | * BIT 6 = Reserved | ||
1503 | * BIT 7-31 = | ||
1504 | */ | ||
1505 | uint32_t efi_parameters; | ||
1506 | |||
1507 | uint8_t reset_delay; | ||
1508 | uint8_t reserved_12; | ||
1509 | uint16_t reserved_13; | ||
1510 | |||
1511 | uint16_t boot_id_number; | ||
1512 | uint16_t reserved_14; | ||
1513 | |||
1514 | uint16_t max_luns_per_target; | ||
1515 | uint16_t reserved_15; | ||
1516 | |||
1517 | uint16_t port_down_retry_count; | ||
1518 | uint16_t link_down_timeout; | ||
1519 | |||
1520 | /* FCode parameters. */ | ||
1521 | uint16_t fcode_parameter; | ||
1522 | |||
1523 | uint16_t reserved_16[3]; | ||
1524 | |||
1525 | /* Offset 352. */ | ||
1526 | uint8_t reserved_17[4]; | ||
1527 | uint16_t reserved_18[5]; | ||
1528 | uint8_t reserved_19[2]; | ||
1529 | uint16_t reserved_20[8]; | ||
1530 | |||
1531 | /* Offset 384. */ | ||
1532 | uint8_t reserved_21[16]; | ||
1533 | uint16_t reserved_22[8]; | ||
1534 | |||
1535 | /* Offset 416. */ | ||
1536 | uint16_t reserved_23[32]; | ||
1537 | |||
1538 | /* Offset 480. */ | ||
1539 | uint8_t model_name[16]; | ||
1540 | |||
1541 | /* Offset 496. */ | ||
1542 | uint16_t feature_mask_l; | ||
1543 | uint16_t feature_mask_h; | ||
1544 | uint16_t reserved_24[2]; | ||
1545 | |||
1546 | uint16_t subsystem_vendor_id; | ||
1547 | uint16_t subsystem_device_id; | ||
1548 | |||
1549 | uint32_t checksum; | ||
1550 | }; | ||
1551 | |||
1552 | /* | ||
1553 | * ISP Initialization Control Block. | ||
1554 | * Little endian except where noted. | ||
1555 | */ | ||
1556 | #define ICB_VERSION 1 | ||
1557 | struct init_cb_81xx { | ||
1558 | uint16_t version; | ||
1559 | uint16_t reserved_1; | ||
1560 | |||
1561 | uint16_t frame_payload_size; | ||
1562 | uint16_t execution_throttle; | ||
1563 | uint16_t exchange_count; | ||
1564 | |||
1565 | uint16_t reserved_2; | ||
1566 | |||
1567 | uint8_t port_name[WWN_SIZE]; /* Big endian. */ | ||
1568 | uint8_t node_name[WWN_SIZE]; /* Big endian. */ | ||
1569 | |||
1570 | uint16_t response_q_inpointer; | ||
1571 | uint16_t request_q_outpointer; | ||
1572 | |||
1573 | uint16_t login_retry_count; | ||
1574 | |||
1575 | uint16_t prio_request_q_outpointer; | ||
1576 | |||
1577 | uint16_t response_q_length; | ||
1578 | uint16_t request_q_length; | ||
1579 | |||
1580 | uint16_t reserved_3; | ||
1581 | |||
1582 | uint16_t prio_request_q_length; | ||
1583 | |||
1584 | uint32_t request_q_address[2]; | ||
1585 | uint32_t response_q_address[2]; | ||
1586 | uint32_t prio_request_q_address[2]; | ||
1587 | |||
1588 | uint8_t reserved_4[8]; | ||
1589 | |||
1590 | uint16_t atio_q_inpointer; | ||
1591 | uint16_t atio_q_length; | ||
1592 | uint32_t atio_q_address[2]; | ||
1593 | |||
1594 | uint16_t interrupt_delay_timer; /* 100us increments. */ | ||
1595 | uint16_t login_timeout; | ||
1596 | |||
1597 | /* | ||
1598 | * BIT 0-3 = Reserved | ||
1599 | * BIT 4 = Enable Target Mode | ||
1600 | * BIT 5 = Disable Initiator Mode | ||
1601 | * BIT 6 = Reserved | ||
1602 | * BIT 7 = Reserved | ||
1603 | * | ||
1604 | * BIT 8-13 = Reserved | ||
1605 | * BIT 14 = Node Name Option | ||
1606 | * BIT 15-31 = Reserved | ||
1607 | */ | ||
1608 | uint32_t firmware_options_1; | ||
1609 | |||
1610 | /* | ||
1611 | * BIT 0 = Operation Mode bit 0 | ||
1612 | * BIT 1 = Operation Mode bit 1 | ||
1613 | * BIT 2 = Operation Mode bit 2 | ||
1614 | * BIT 3 = Operation Mode bit 3 | ||
1615 | * BIT 4-7 = Reserved | ||
1616 | * | ||
1617 | * BIT 8 = Enable Class 2 | ||
1618 | * BIT 9 = Enable ACK0 | ||
1619 | * BIT 10 = Reserved | ||
1620 | * BIT 11 = Enable FC-SP Security | ||
1621 | * BIT 12 = FC Tape Enable | ||
1622 | * BIT 13 = Reserved | ||
1623 | * BIT 14 = Enable Target PRLI Control | ||
1624 | * BIT 15-31 = Reserved | ||
1625 | */ | ||
1626 | uint32_t firmware_options_2; | ||
1627 | |||
1628 | /* | ||
1629 | * BIT 0-3 = Reserved | ||
1630 | * BIT 4 = FCP RSP Payload bit 0 | ||
1631 | * BIT 5 = FCP RSP Payload bit 1 | ||
1632 | * BIT 6 = Enable Receive Out-of-Order data frame handling | ||
1633 | * BIT 7 = Reserved | ||
1634 | * | ||
1635 | * BIT 8 = Reserved | ||
1636 | * BIT 9 = Enable Out-of-Order FCP_XFER_RDY relative offset handling | ||
1637 | * BIT 10-16 = Reserved | ||
1638 | * BIT 17 = Enable multiple FCFs | ||
1639 | * BIT 18-20 = MAC addressing mode | ||
1640 | * BIT 21-25 = Ethernet data rate | ||
1641 | * BIT 26 = Enable ethernet header rx IOCB for ATIO q | ||
1642 | * BIT 27 = Enable ethernet header rx IOCB for response q | ||
1643 | * BIT 28 = SPMA selection bit 0 | ||
1644 | * BIT 28 = SPMA selection bit 1 | ||
1645 | * BIT 30-31 = Reserved | ||
1646 | */ | ||
1647 | uint32_t firmware_options_3; | ||
1648 | |||
1649 | uint8_t reserved_5[8]; | ||
1650 | |||
1651 | uint8_t enode_mac[6]; | ||
1652 | |||
1653 | uint8_t reserved_6[10]; | ||
1654 | }; | ||
1655 | |||
1656 | struct mid_init_cb_81xx { | ||
1657 | struct init_cb_81xx init_cb; | ||
1658 | |||
1659 | uint16_t count; | ||
1660 | uint16_t options; | ||
1661 | |||
1662 | struct mid_conf_entry_24xx entries[MAX_MULTI_ID_FABRIC]; | ||
1663 | }; | ||
1664 | |||
1665 | #define FARX_ACCESS_FLASH_CONF_81XX 0x7FFD0000 | ||
1666 | #define FARX_ACCESS_FLASH_DATA_81XX 0x7F800000 | ||
1667 | |||
1668 | /* 81XX Flash locations -- occupies second 2MB region. */ | ||
1669 | #define FA_BOOT_CODE_ADDR_81 0x80000 | ||
1670 | #define FA_RISC_CODE_ADDR_81 0xA0000 | ||
1671 | #define FA_FW_AREA_ADDR_81 0xC0000 | ||
1672 | #define FA_VPD_NVRAM_ADDR_81 0xD0000 | ||
1673 | #define FA_FEATURE_ADDR_81 0xD4000 | ||
1674 | #define FA_FLASH_DESCR_ADDR_81 0xD8000 | ||
1675 | #define FA_FLASH_LAYOUT_ADDR_81 0xD8400 | ||
1676 | #define FA_HW_EVENT0_ADDR_81 0xDC000 | ||
1677 | #define FA_HW_EVENT1_ADDR_81 0xDC400 | ||
1678 | #define FA_NPIV_CONF0_ADDR_81 0xD1000 | ||
1679 | #define FA_NPIV_CONF1_ADDR_81 0xD2000 | ||
1680 | |||
1393 | #endif | 1681 | #endif |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 450a05c5d33b..ba4913353752 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -28,8 +28,10 @@ extern void qla2x00_reset_adapter(struct scsi_qla_host *); | |||
28 | extern void qla24xx_reset_adapter(struct scsi_qla_host *); | 28 | extern void qla24xx_reset_adapter(struct scsi_qla_host *); |
29 | extern int qla2x00_nvram_config(struct scsi_qla_host *); | 29 | extern int qla2x00_nvram_config(struct scsi_qla_host *); |
30 | extern int qla24xx_nvram_config(struct scsi_qla_host *); | 30 | extern int qla24xx_nvram_config(struct scsi_qla_host *); |
31 | extern int qla81xx_nvram_config(struct scsi_qla_host *); | ||
31 | extern void qla2x00_update_fw_options(struct scsi_qla_host *); | 32 | extern void qla2x00_update_fw_options(struct scsi_qla_host *); |
32 | extern void qla24xx_update_fw_options(scsi_qla_host_t *); | 33 | extern void qla24xx_update_fw_options(scsi_qla_host_t *); |
34 | extern void qla81xx_update_fw_options(scsi_qla_host_t *); | ||
33 | extern int qla2x00_load_risc(struct scsi_qla_host *, uint32_t *); | 35 | extern int qla2x00_load_risc(struct scsi_qla_host *, uint32_t *); |
34 | extern int qla24xx_load_risc(scsi_qla_host_t *, uint32_t *); | 36 | extern int qla24xx_load_risc(scsi_qla_host_t *, uint32_t *); |
35 | 37 | ||
@@ -141,7 +143,7 @@ qla2x00_execute_fw(scsi_qla_host_t *, uint32_t); | |||
141 | 143 | ||
142 | extern void | 144 | extern void |
143 | qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, | 145 | qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, |
144 | uint16_t *, uint16_t *, uint16_t *, uint32_t *); | 146 | uint16_t *, uint16_t *, uint16_t *, uint32_t *, uint8_t *, uint32_t *); |
145 | 147 | ||
146 | extern int | 148 | extern int |
147 | qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *); | 149 | qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *); |
@@ -327,6 +329,7 @@ extern void qla2100_fw_dump(scsi_qla_host_t *, int); | |||
327 | extern void qla2300_fw_dump(scsi_qla_host_t *, int); | 329 | extern void qla2300_fw_dump(scsi_qla_host_t *, int); |
328 | extern void qla24xx_fw_dump(scsi_qla_host_t *, int); | 330 | extern void qla24xx_fw_dump(scsi_qla_host_t *, int); |
329 | extern void qla25xx_fw_dump(scsi_qla_host_t *, int); | 331 | extern void qla25xx_fw_dump(scsi_qla_host_t *, int); |
332 | extern void qla81xx_fw_dump(scsi_qla_host_t *, int); | ||
330 | extern void qla2x00_dump_regs(scsi_qla_host_t *); | 333 | extern void qla2x00_dump_regs(scsi_qla_host_t *); |
331 | extern void qla2x00_dump_buffer(uint8_t *, uint32_t); | 334 | extern void qla2x00_dump_buffer(uint8_t *, uint32_t); |
332 | 335 | ||
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 0a6f72973996..557f58d5bf88 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c | |||
@@ -1535,7 +1535,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha) | |||
1535 | eiter = (struct ct_fdmi_port_attr *) (entries + size); | 1535 | eiter = (struct ct_fdmi_port_attr *) (entries + size); |
1536 | eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); | 1536 | eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); |
1537 | eiter->len = __constant_cpu_to_be16(4 + 4); | 1537 | eiter->len = __constant_cpu_to_be16(4 + 4); |
1538 | if (IS_QLA25XX(ha)) | 1538 | if (IS_QLA81XX(ha)) |
1539 | eiter->a.sup_speed = __constant_cpu_to_be32( | ||
1540 | FDMI_PORT_SPEED_10GB); | ||
1541 | else if (IS_QLA25XX(ha)) | ||
1539 | eiter->a.sup_speed = __constant_cpu_to_be32( | 1542 | eiter->a.sup_speed = __constant_cpu_to_be32( |
1540 | FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| | 1543 | FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| |
1541 | FDMI_PORT_SPEED_4GB|FDMI_PORT_SPEED_8GB); | 1544 | FDMI_PORT_SPEED_4GB|FDMI_PORT_SPEED_8GB); |
@@ -1575,6 +1578,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha) | |||
1575 | eiter->a.cur_speed = | 1578 | eiter->a.cur_speed = |
1576 | __constant_cpu_to_be32(FDMI_PORT_SPEED_8GB); | 1579 | __constant_cpu_to_be32(FDMI_PORT_SPEED_8GB); |
1577 | break; | 1580 | break; |
1581 | case PORT_SPEED_10GB: | ||
1582 | eiter->a.cur_speed = | ||
1583 | __constant_cpu_to_be32(FDMI_PORT_SPEED_10GB); | ||
1584 | break; | ||
1578 | default: | 1585 | default: |
1579 | eiter->a.cur_speed = | 1586 | eiter->a.cur_speed = |
1580 | __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); | 1587 | __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 6038aedc1239..2d4f32b4df5c 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -778,16 +778,19 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha) | |||
778 | mem_size = (ha->fw_memory_size - 0x11000 + 1) * | 778 | mem_size = (ha->fw_memory_size - 0x11000 + 1) * |
779 | sizeof(uint16_t); | 779 | sizeof(uint16_t); |
780 | } else if (IS_FWI2_CAPABLE(ha)) { | 780 | } else if (IS_FWI2_CAPABLE(ha)) { |
781 | fixed_size = IS_QLA25XX(ha) ? | 781 | if (IS_QLA81XX(ha)) |
782 | offsetof(struct qla25xx_fw_dump, ext_mem) : | 782 | fixed_size = offsetof(struct qla81xx_fw_dump, ext_mem); |
783 | offsetof(struct qla24xx_fw_dump, ext_mem); | 783 | else if (IS_QLA25XX(ha)) |
784 | fixed_size = offsetof(struct qla25xx_fw_dump, ext_mem); | ||
785 | else | ||
786 | fixed_size = offsetof(struct qla24xx_fw_dump, ext_mem); | ||
784 | mem_size = (ha->fw_memory_size - 0x100000 + 1) * | 787 | mem_size = (ha->fw_memory_size - 0x100000 + 1) * |
785 | sizeof(uint32_t); | 788 | sizeof(uint32_t); |
786 | if (ha->mqenable) | 789 | if (ha->mqenable) |
787 | mq_size = sizeof(struct qla2xxx_mq_chain); | 790 | mq_size = sizeof(struct qla2xxx_mq_chain); |
788 | 791 | ||
789 | /* Allocate memory for Fibre Channel Event Buffer. */ | 792 | /* Allocate memory for Fibre Channel Event Buffer. */ |
790 | if (!IS_QLA25XX(ha)) | 793 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) |
791 | goto try_eft; | 794 | goto try_eft; |
792 | 795 | ||
793 | tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma, | 796 | tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma, |
@@ -988,7 +991,8 @@ qla2x00_setup_chip(scsi_qla_host_t *vha) | |||
988 | &ha->fw_major_version, | 991 | &ha->fw_major_version, |
989 | &ha->fw_minor_version, | 992 | &ha->fw_minor_version, |
990 | &ha->fw_subminor_version, | 993 | &ha->fw_subminor_version, |
991 | &ha->fw_attributes, &ha->fw_memory_size); | 994 | &ha->fw_attributes, &ha->fw_memory_size, |
995 | ha->mpi_version, &ha->mpi_capabilities); | ||
992 | ha->flags.npiv_supported = 0; | 996 | ha->flags.npiv_supported = 0; |
993 | if (IS_QLA2XXX_MIDTYPE(ha) && | 997 | if (IS_QLA2XXX_MIDTYPE(ha) && |
994 | (ha->fw_attributes & BIT_2)) { | 998 | (ha->fw_attributes & BIT_2)) { |
@@ -4252,3 +4256,269 @@ qla84xx_init_chip(scsi_qla_host_t *vha) | |||
4252 | return rval != QLA_SUCCESS || status[0] ? QLA_FUNCTION_FAILED: | 4256 | return rval != QLA_SUCCESS || status[0] ? QLA_FUNCTION_FAILED: |
4253 | QLA_SUCCESS; | 4257 | QLA_SUCCESS; |
4254 | } | 4258 | } |
4259 | |||
4260 | /* 81XX Support **************************************************************/ | ||
4261 | |||
4262 | int | ||
4263 | qla81xx_nvram_config(scsi_qla_host_t *vha) | ||
4264 | { | ||
4265 | int rval; | ||
4266 | struct init_cb_81xx *icb; | ||
4267 | struct nvram_81xx *nv; | ||
4268 | uint32_t *dptr; | ||
4269 | uint8_t *dptr1, *dptr2; | ||
4270 | uint32_t chksum; | ||
4271 | uint16_t cnt; | ||
4272 | struct qla_hw_data *ha = vha->hw; | ||
4273 | |||
4274 | rval = QLA_SUCCESS; | ||
4275 | icb = (struct init_cb_81xx *)ha->init_cb; | ||
4276 | nv = ha->nvram; | ||
4277 | |||
4278 | /* Determine NVRAM starting address. */ | ||
4279 | ha->nvram_size = sizeof(struct nvram_81xx); | ||
4280 | ha->nvram_base = FA_NVRAM_FUNC0_ADDR; | ||
4281 | ha->vpd_size = FA_NVRAM_VPD_SIZE; | ||
4282 | ha->vpd_base = FA_NVRAM_VPD0_ADDR; | ||
4283 | if (PCI_FUNC(ha->pdev->devfn) & 1) { | ||
4284 | ha->nvram_base = FA_NVRAM_FUNC1_ADDR; | ||
4285 | ha->vpd_base = FA_NVRAM_VPD1_ADDR; | ||
4286 | } | ||
4287 | |||
4288 | /* Get VPD data into cache */ | ||
4289 | ha->vpd = ha->nvram + VPD_OFFSET; | ||
4290 | ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd, | ||
4291 | ha->nvram_base - FA_NVRAM_FUNC0_ADDR, FA_NVRAM_VPD_SIZE * 4); | ||
4292 | |||
4293 | /* Get NVRAM data into cache and calculate checksum. */ | ||
4294 | dptr = (uint32_t *)nv; | ||
4295 | ha->isp_ops->read_nvram(vha, (uint8_t *)dptr, ha->nvram_base, | ||
4296 | ha->nvram_size); | ||
4297 | for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++) | ||
4298 | chksum += le32_to_cpu(*dptr++); | ||
4299 | |||
4300 | DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no)); | ||
4301 | DEBUG5(qla2x00_dump_buffer((uint8_t *)nv, ha->nvram_size)); | ||
4302 | |||
4303 | /* Bad NVRAM data, set defaults parameters. */ | ||
4304 | if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P' | ||
4305 | || nv->id[3] != ' ' || | ||
4306 | nv->nvram_version < __constant_cpu_to_le16(ICB_VERSION)) { | ||
4307 | /* Reset NVRAM data. */ | ||
4308 | qla_printk(KERN_WARNING, ha, "Inconsistent NVRAM detected: " | ||
4309 | "checksum=0x%x id=%c version=0x%x.\n", chksum, nv->id[0], | ||
4310 | le16_to_cpu(nv->nvram_version)); | ||
4311 | qla_printk(KERN_WARNING, ha, "Falling back to functioning (yet " | ||
4312 | "invalid -- WWPN) defaults.\n"); | ||
4313 | |||
4314 | /* | ||
4315 | * Set default initialization control block. | ||
4316 | */ | ||
4317 | memset(nv, 0, ha->nvram_size); | ||
4318 | nv->nvram_version = __constant_cpu_to_le16(ICB_VERSION); | ||
4319 | nv->version = __constant_cpu_to_le16(ICB_VERSION); | ||
4320 | nv->frame_payload_size = __constant_cpu_to_le16(2048); | ||
4321 | nv->execution_throttle = __constant_cpu_to_le16(0xFFFF); | ||
4322 | nv->exchange_count = __constant_cpu_to_le16(0); | ||
4323 | nv->port_name[0] = 0x21; | ||
4324 | nv->port_name[1] = 0x00 + PCI_FUNC(ha->pdev->devfn); | ||
4325 | nv->port_name[2] = 0x00; | ||
4326 | nv->port_name[3] = 0xe0; | ||
4327 | nv->port_name[4] = 0x8b; | ||
4328 | nv->port_name[5] = 0x1c; | ||
4329 | nv->port_name[6] = 0x55; | ||
4330 | nv->port_name[7] = 0x86; | ||
4331 | nv->node_name[0] = 0x20; | ||
4332 | nv->node_name[1] = 0x00; | ||
4333 | nv->node_name[2] = 0x00; | ||
4334 | nv->node_name[3] = 0xe0; | ||
4335 | nv->node_name[4] = 0x8b; | ||
4336 | nv->node_name[5] = 0x1c; | ||
4337 | nv->node_name[6] = 0x55; | ||
4338 | nv->node_name[7] = 0x86; | ||
4339 | nv->login_retry_count = __constant_cpu_to_le16(8); | ||
4340 | nv->interrupt_delay_timer = __constant_cpu_to_le16(0); | ||
4341 | nv->login_timeout = __constant_cpu_to_le16(0); | ||
4342 | nv->firmware_options_1 = | ||
4343 | __constant_cpu_to_le32(BIT_14|BIT_13|BIT_2|BIT_1); | ||
4344 | nv->firmware_options_2 = __constant_cpu_to_le32(2 << 4); | ||
4345 | nv->firmware_options_2 |= __constant_cpu_to_le32(BIT_12); | ||
4346 | nv->firmware_options_3 = __constant_cpu_to_le32(2 << 13); | ||
4347 | nv->host_p = __constant_cpu_to_le32(BIT_11|BIT_10); | ||
4348 | nv->efi_parameters = __constant_cpu_to_le32(0); | ||
4349 | nv->reset_delay = 5; | ||
4350 | nv->max_luns_per_target = __constant_cpu_to_le16(128); | ||
4351 | nv->port_down_retry_count = __constant_cpu_to_le16(30); | ||
4352 | nv->link_down_timeout = __constant_cpu_to_le16(30); | ||
4353 | nv->enode_mac[0] = 0x01; | ||
4354 | nv->enode_mac[1] = 0x02; | ||
4355 | nv->enode_mac[2] = 0x03; | ||
4356 | nv->enode_mac[3] = 0x04; | ||
4357 | nv->enode_mac[4] = 0x05; | ||
4358 | nv->enode_mac[5] = 0x06 + PCI_FUNC(ha->pdev->devfn); | ||
4359 | |||
4360 | rval = 1; | ||
4361 | } | ||
4362 | |||
4363 | /* Reset Initialization control block */ | ||
4364 | memset(icb, 0, sizeof(struct init_cb_81xx)); | ||
4365 | |||
4366 | /* Copy 1st segment. */ | ||
4367 | dptr1 = (uint8_t *)icb; | ||
4368 | dptr2 = (uint8_t *)&nv->version; | ||
4369 | cnt = (uint8_t *)&icb->response_q_inpointer - (uint8_t *)&icb->version; | ||
4370 | while (cnt--) | ||
4371 | *dptr1++ = *dptr2++; | ||
4372 | |||
4373 | icb->login_retry_count = nv->login_retry_count; | ||
4374 | |||
4375 | /* Copy 2nd segment. */ | ||
4376 | dptr1 = (uint8_t *)&icb->interrupt_delay_timer; | ||
4377 | dptr2 = (uint8_t *)&nv->interrupt_delay_timer; | ||
4378 | cnt = (uint8_t *)&icb->reserved_5 - | ||
4379 | (uint8_t *)&icb->interrupt_delay_timer; | ||
4380 | while (cnt--) | ||
4381 | *dptr1++ = *dptr2++; | ||
4382 | |||
4383 | memcpy(icb->enode_mac, nv->enode_mac, sizeof(icb->enode_mac)); | ||
4384 | /* Some boards (with valid NVRAMs) still have NULL enode_mac!! */ | ||
4385 | if (!memcmp(icb->enode_mac, "\0\0\0\0\0\0", sizeof(icb->enode_mac))) { | ||
4386 | icb->enode_mac[0] = 0x01; | ||
4387 | icb->enode_mac[1] = 0x02; | ||
4388 | icb->enode_mac[2] = 0x03; | ||
4389 | icb->enode_mac[3] = 0x04; | ||
4390 | icb->enode_mac[4] = 0x05; | ||
4391 | icb->enode_mac[5] = 0x06 + PCI_FUNC(ha->pdev->devfn); | ||
4392 | } | ||
4393 | |||
4394 | /* | ||
4395 | * Setup driver NVRAM options. | ||
4396 | */ | ||
4397 | qla2x00_set_model_info(vha, nv->model_name, sizeof(nv->model_name), | ||
4398 | "QLE81XX"); | ||
4399 | |||
4400 | /* Use alternate WWN? */ | ||
4401 | if (nv->host_p & __constant_cpu_to_le32(BIT_15)) { | ||
4402 | memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE); | ||
4403 | memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE); | ||
4404 | } | ||
4405 | |||
4406 | /* Prepare nodename */ | ||
4407 | if ((icb->firmware_options_1 & __constant_cpu_to_le32(BIT_14)) == 0) { | ||
4408 | /* | ||
4409 | * Firmware will apply the following mask if the nodename was | ||
4410 | * not provided. | ||
4411 | */ | ||
4412 | memcpy(icb->node_name, icb->port_name, WWN_SIZE); | ||
4413 | icb->node_name[0] &= 0xF0; | ||
4414 | } | ||
4415 | |||
4416 | /* Set host adapter parameters. */ | ||
4417 | ha->flags.disable_risc_code_load = 0; | ||
4418 | ha->flags.enable_lip_reset = 0; | ||
4419 | ha->flags.enable_lip_full_login = | ||
4420 | le32_to_cpu(nv->host_p) & BIT_10 ? 1: 0; | ||
4421 | ha->flags.enable_target_reset = | ||
4422 | le32_to_cpu(nv->host_p) & BIT_11 ? 1: 0; | ||
4423 | ha->flags.enable_led_scheme = 0; | ||
4424 | ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1: 0; | ||
4425 | |||
4426 | ha->operating_mode = (le32_to_cpu(icb->firmware_options_2) & | ||
4427 | (BIT_6 | BIT_5 | BIT_4)) >> 4; | ||
4428 | |||
4429 | /* save HBA serial number */ | ||
4430 | ha->serial0 = icb->port_name[5]; | ||
4431 | ha->serial1 = icb->port_name[6]; | ||
4432 | ha->serial2 = icb->port_name[7]; | ||
4433 | memcpy(vha->node_name, icb->node_name, WWN_SIZE); | ||
4434 | memcpy(vha->port_name, icb->port_name, WWN_SIZE); | ||
4435 | |||
4436 | icb->execution_throttle = __constant_cpu_to_le16(0xFFFF); | ||
4437 | |||
4438 | ha->retry_count = le16_to_cpu(nv->login_retry_count); | ||
4439 | |||
4440 | /* Set minimum login_timeout to 4 seconds. */ | ||
4441 | if (le16_to_cpu(nv->login_timeout) < ql2xlogintimeout) | ||
4442 | nv->login_timeout = cpu_to_le16(ql2xlogintimeout); | ||
4443 | if (le16_to_cpu(nv->login_timeout) < 4) | ||
4444 | nv->login_timeout = __constant_cpu_to_le16(4); | ||
4445 | ha->login_timeout = le16_to_cpu(nv->login_timeout); | ||
4446 | icb->login_timeout = nv->login_timeout; | ||
4447 | |||
4448 | /* Set minimum RATOV to 100 tenths of a second. */ | ||
4449 | ha->r_a_tov = 100; | ||
4450 | |||
4451 | ha->loop_reset_delay = nv->reset_delay; | ||
4452 | |||
4453 | /* Link Down Timeout = 0: | ||
4454 | * | ||
4455 | * When Port Down timer expires we will start returning | ||
4456 | * I/O's to OS with "DID_NO_CONNECT". | ||
4457 | * | ||
4458 | * Link Down Timeout != 0: | ||
4459 | * | ||
4460 | * The driver waits for the link to come up after link down | ||
4461 | * before returning I/Os to OS with "DID_NO_CONNECT". | ||
4462 | */ | ||
4463 | if (le16_to_cpu(nv->link_down_timeout) == 0) { | ||
4464 | ha->loop_down_abort_time = | ||
4465 | (LOOP_DOWN_TIME - LOOP_DOWN_TIMEOUT); | ||
4466 | } else { | ||
4467 | ha->link_down_timeout = le16_to_cpu(nv->link_down_timeout); | ||
4468 | ha->loop_down_abort_time = | ||
4469 | (LOOP_DOWN_TIME - ha->link_down_timeout); | ||
4470 | } | ||
4471 | |||
4472 | /* Need enough time to try and get the port back. */ | ||
4473 | ha->port_down_retry_count = le16_to_cpu(nv->port_down_retry_count); | ||
4474 | if (qlport_down_retry) | ||
4475 | ha->port_down_retry_count = qlport_down_retry; | ||
4476 | |||
4477 | /* Set login_retry_count */ | ||
4478 | ha->login_retry_count = le16_to_cpu(nv->login_retry_count); | ||
4479 | if (ha->port_down_retry_count == | ||
4480 | le16_to_cpu(nv->port_down_retry_count) && | ||
4481 | ha->port_down_retry_count > 3) | ||
4482 | ha->login_retry_count = ha->port_down_retry_count; | ||
4483 | else if (ha->port_down_retry_count > (int)ha->login_retry_count) | ||
4484 | ha->login_retry_count = ha->port_down_retry_count; | ||
4485 | if (ql2xloginretrycount) | ||
4486 | ha->login_retry_count = ql2xloginretrycount; | ||
4487 | |||
4488 | /* Enable ZIO. */ | ||
4489 | if (!vha->flags.init_done) { | ||
4490 | ha->zio_mode = le32_to_cpu(icb->firmware_options_2) & | ||
4491 | (BIT_3 | BIT_2 | BIT_1 | BIT_0); | ||
4492 | ha->zio_timer = le16_to_cpu(icb->interrupt_delay_timer) ? | ||
4493 | le16_to_cpu(icb->interrupt_delay_timer): 2; | ||
4494 | } | ||
4495 | icb->firmware_options_2 &= __constant_cpu_to_le32( | ||
4496 | ~(BIT_3 | BIT_2 | BIT_1 | BIT_0)); | ||
4497 | vha->flags.process_response_queue = 0; | ||
4498 | if (ha->zio_mode != QLA_ZIO_DISABLED) { | ||
4499 | ha->zio_mode = QLA_ZIO_MODE_6; | ||
4500 | |||
4501 | DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer delay " | ||
4502 | "(%d us).\n", vha->host_no, ha->zio_mode, | ||
4503 | ha->zio_timer * 100)); | ||
4504 | qla_printk(KERN_INFO, ha, | ||
4505 | "ZIO mode %d enabled; timer delay (%d us).\n", | ||
4506 | ha->zio_mode, ha->zio_timer * 100); | ||
4507 | |||
4508 | icb->firmware_options_2 |= cpu_to_le32( | ||
4509 | (uint32_t)ha->zio_mode); | ||
4510 | icb->interrupt_delay_timer = cpu_to_le16(ha->zio_timer); | ||
4511 | vha->flags.process_response_queue = 1; | ||
4512 | } | ||
4513 | |||
4514 | if (rval) { | ||
4515 | DEBUG2_3(printk(KERN_WARNING | ||
4516 | "scsi(%ld): NVRAM configuration failed!\n", vha->host_no)); | ||
4517 | } | ||
4518 | return (rval); | ||
4519 | } | ||
4520 | |||
4521 | void | ||
4522 | qla81xx_update_fw_options(scsi_qla_host_t *ha) | ||
4523 | { | ||
4524 | } | ||
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index dcfec7429cc7..789fc576f222 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -275,7 +275,7 @@ void | |||
275 | qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | 275 | qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) |
276 | { | 276 | { |
277 | #define LS_UNKNOWN 2 | 277 | #define LS_UNKNOWN 2 |
278 | static char *link_speeds[5] = { "1", "2", "?", "4", "8" }; | 278 | static char *link_speeds[] = { "1", "2", "?", "4", "8", "10" }; |
279 | char *link_speed; | 279 | char *link_speed; |
280 | uint16_t handle_cnt; | 280 | uint16_t handle_cnt; |
281 | uint16_t cnt; | 281 | uint16_t cnt; |
@@ -288,6 +288,8 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
288 | 288 | ||
289 | /* Setup to process RIO completion. */ | 289 | /* Setup to process RIO completion. */ |
290 | handle_cnt = 0; | 290 | handle_cnt = 0; |
291 | if (IS_QLA81XX(ha)) | ||
292 | goto skip_rio; | ||
291 | switch (mb[0]) { | 293 | switch (mb[0]) { |
292 | case MBA_SCSI_COMPLETION: | 294 | case MBA_SCSI_COMPLETION: |
293 | handles[0] = le32_to_cpu((uint32_t)((mb[2] << 16) | mb[1])); | 295 | handles[0] = le32_to_cpu((uint32_t)((mb[2] << 16) | mb[1])); |
@@ -339,7 +341,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
339 | default: | 341 | default: |
340 | break; | 342 | break; |
341 | } | 343 | } |
342 | 344 | skip_rio: | |
343 | switch (mb[0]) { | 345 | switch (mb[0]) { |
344 | case MBA_SCSI_COMPLETION: /* Fast Post */ | 346 | case MBA_SCSI_COMPLETION: /* Fast Post */ |
345 | if (!vha->flags.online) | 347 | if (!vha->flags.online) |
@@ -433,6 +435,8 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
433 | link_speed = link_speeds[LS_UNKNOWN]; | 435 | link_speed = link_speeds[LS_UNKNOWN]; |
434 | if (mb[1] < 5) | 436 | if (mb[1] < 5) |
435 | link_speed = link_speeds[mb[1]]; | 437 | link_speed = link_speeds[mb[1]]; |
438 | else if (mb[1] == 0x13) | ||
439 | link_speed = link_speeds[5]; | ||
436 | ha->link_data_rate = mb[1]; | 440 | ha->link_data_rate = mb[1]; |
437 | } | 441 | } |
438 | 442 | ||
@@ -492,12 +496,17 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
492 | qla2x00_post_aen_work(vha, FCH_EVT_LIPRESET, mb[1]); | 496 | qla2x00_post_aen_work(vha, FCH_EVT_LIPRESET, mb[1]); |
493 | break; | 497 | break; |
494 | 498 | ||
499 | /* case MBA_DCBX_COMPLETE: */ | ||
495 | case MBA_POINT_TO_POINT: /* Point-to-Point */ | 500 | case MBA_POINT_TO_POINT: /* Point-to-Point */ |
496 | if (IS_QLA2100(ha)) | 501 | if (IS_QLA2100(ha)) |
497 | break; | 502 | break; |
498 | 503 | ||
499 | DEBUG2(printk("scsi(%ld): Asynchronous P2P MODE received.\n", | 504 | if (IS_QLA81XX(ha)) |
500 | vha->host_no)); | 505 | DEBUG2(printk("scsi(%ld): DCBX Completed -- %04x %04x " |
506 | "%04x\n", vha->host_no, mb[1], mb[2], mb[3])); | ||
507 | else | ||
508 | DEBUG2(printk("scsi(%ld): Asynchronous P2P MODE " | ||
509 | "received.\n", vha->host_no)); | ||
501 | 510 | ||
502 | /* | 511 | /* |
503 | * Until there's a transition from loop down to loop up, treat | 512 | * Until there's a transition from loop down to loop up, treat |
@@ -692,6 +701,35 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
692 | } | 701 | } |
693 | spin_unlock_irqrestore(&ha->cs84xx->access_lock, flags); | 702 | spin_unlock_irqrestore(&ha->cs84xx->access_lock, flags); |
694 | break; | 703 | break; |
704 | case MBA_DCBX_START: | ||
705 | DEBUG2(printk("scsi(%ld): DCBX Started -- %04x %04x %04x\n", | ||
706 | vha->host_no, mb[1], mb[2], mb[3])); | ||
707 | break; | ||
708 | case MBA_DCBX_PARAM_UPDATE: | ||
709 | DEBUG2(printk("scsi(%ld): DCBX Parameters Updated -- " | ||
710 | "%04x %04x %04x\n", vha->host_no, mb[1], mb[2], mb[3])); | ||
711 | break; | ||
712 | case MBA_FCF_CONF_ERR: | ||
713 | DEBUG2(printk("scsi(%ld): FCF Configuration Error -- " | ||
714 | "%04x %04x %04x\n", vha->host_no, mb[1], mb[2], mb[3])); | ||
715 | break; | ||
716 | case MBA_IDC_COMPLETE: | ||
717 | DEBUG2(printk("scsi(%ld): Inter-Driver Commucation " | ||
718 | "Complete -- %04x %04x %04x\n", vha->host_no, mb[1], mb[2], | ||
719 | mb[3])); | ||
720 | break; | ||
721 | case MBA_IDC_NOTIFY: | ||
722 | DEBUG2(printk("scsi(%ld): Inter-Driver Commucation " | ||
723 | "Request Notification -- %04x %04x %04x\n", vha->host_no, | ||
724 | mb[1], mb[2], mb[3])); | ||
725 | /**** Mailbox registers 4 - 7 valid!!! */ | ||
726 | break; | ||
727 | case MBA_IDC_TIME_EXT: | ||
728 | DEBUG2(printk("scsi(%ld): Inter-Driver Commucation " | ||
729 | "Time Extension -- %04x %04x %04x\n", vha->host_no, mb[1], | ||
730 | mb[2], mb[3])); | ||
731 | /**** Mailbox registers 4 - 7 valid!!! */ | ||
732 | break; | ||
695 | } | 733 | } |
696 | 734 | ||
697 | if (!vha->vp_idx && ha->num_vhosts) | 735 | if (!vha->vp_idx && ha->num_vhosts) |
@@ -1504,7 +1542,7 @@ qla2xxx_check_risc_status(scsi_qla_host_t *vha) | |||
1504 | struct qla_hw_data *ha = vha->hw; | 1542 | struct qla_hw_data *ha = vha->hw; |
1505 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | 1543 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
1506 | 1544 | ||
1507 | if (!IS_QLA25XX(ha)) | 1545 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) |
1508 | return; | 1546 | return; |
1509 | 1547 | ||
1510 | rval = QLA_SUCCESS; | 1548 | rval = QLA_SUCCESS; |
@@ -1926,7 +1964,8 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp) | |||
1926 | device_reg_t __iomem *reg = ha->iobase; | 1964 | device_reg_t __iomem *reg = ha->iobase; |
1927 | 1965 | ||
1928 | /* If possible, enable MSI-X. */ | 1966 | /* If possible, enable MSI-X. */ |
1929 | if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha)) | 1967 | if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && |
1968 | !IS_QLA8432(ha) && !IS_QLA8001(ha)) | ||
1930 | goto skip_msix; | 1969 | goto skip_msix; |
1931 | 1970 | ||
1932 | if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX || | 1971 | if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX || |
@@ -1961,7 +2000,8 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp) | |||
1961 | "MSI-X: Falling back-to INTa mode -- %d.\n", ret); | 2000 | "MSI-X: Falling back-to INTa mode -- %d.\n", ret); |
1962 | skip_msix: | 2001 | skip_msix: |
1963 | 2002 | ||
1964 | if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha)) | 2003 | if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) && |
2004 | !IS_QLA8001(ha)) | ||
1965 | goto skip_msi; | 2005 | goto skip_msi; |
1966 | 2006 | ||
1967 | ret = pci_enable_msi(ha->pdev); | 2007 | ret = pci_enable_msi(ha->pdev); |
@@ -1982,6 +2022,12 @@ skip_msi: | |||
1982 | ha->flags.inta_enabled = 1; | 2022 | ha->flags.inta_enabled = 1; |
1983 | clear_risc_ints: | 2023 | clear_risc_ints: |
1984 | 2024 | ||
2025 | /* | ||
2026 | * FIXME: Noted that 8014s were being dropped during NK testing. | ||
2027 | * Timing deltas during MSI-X/INTa transitions? | ||
2028 | */ | ||
2029 | if (IS_QLA81XX(ha)) | ||
2030 | goto fail; | ||
1985 | spin_lock_irq(&ha->hardware_lock); | 2031 | spin_lock_irq(&ha->hardware_lock); |
1986 | if (IS_FWI2_CAPABLE(ha)) { | 2032 | if (IS_FWI2_CAPABLE(ha)) { |
1987 | WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_HOST_INT); | 2033 | WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_HOST_INT); |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 4cb679146126..db4df45234a5 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -411,7 +411,8 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) | |||
411 | */ | 411 | */ |
412 | void | 412 | void |
413 | qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | 413 | qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, |
414 | uint16_t *subminor, uint16_t *attributes, uint32_t *memory) | 414 | uint16_t *subminor, uint16_t *attributes, uint32_t *memory, uint8_t *mpi, |
415 | uint32_t *mpi_caps) | ||
415 | { | 416 | { |
416 | int rval; | 417 | int rval; |
417 | mbx_cmd_t mc; | 418 | mbx_cmd_t mc; |
@@ -422,6 +423,8 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
422 | mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; | 423 | mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; |
423 | mcp->out_mb = MBX_0; | 424 | mcp->out_mb = MBX_0; |
424 | mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; | 425 | mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; |
426 | if (IS_QLA81XX(vha->hw)) | ||
427 | mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10; | ||
425 | mcp->flags = 0; | 428 | mcp->flags = 0; |
426 | mcp->tov = MBX_TOV_SECONDS; | 429 | mcp->tov = MBX_TOV_SECONDS; |
427 | rval = qla2x00_mailbox_command(vha, mcp); | 430 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -435,6 +438,13 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
435 | *memory = 0x1FFFF; /* Defaults to 128KB. */ | 438 | *memory = 0x1FFFF; /* Defaults to 128KB. */ |
436 | else | 439 | else |
437 | *memory = (mcp->mb[5] << 16) | mcp->mb[4]; | 440 | *memory = (mcp->mb[5] << 16) | mcp->mb[4]; |
441 | if (IS_QLA81XX(vha->hw)) { | ||
442 | mpi[0] = mcp->mb[10] >> 8; | ||
443 | mpi[1] = mcp->mb[10] & 0xff; | ||
444 | mpi[2] = mcp->mb[11] >> 8; | ||
445 | mpi[3] = mcp->mb[11] & 0xff; | ||
446 | *mpi_caps = (mcp->mb[12] << 16) | mcp->mb[13]; | ||
447 | } | ||
438 | 448 | ||
439 | if (rval != QLA_SUCCESS) { | 449 | if (rval != QLA_SUCCESS) { |
440 | /*EMPTY*/ | 450 | /*EMPTY*/ |
@@ -1353,7 +1363,13 @@ qla2x00_lip_reset(scsi_qla_host_t *vha) | |||
1353 | 1363 | ||
1354 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 1364 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
1355 | 1365 | ||
1356 | if (IS_FWI2_CAPABLE(vha->hw)) { | 1366 | if (IS_QLA81XX(vha->hw)) { |
1367 | /* Logout across all FCFs. */ | ||
1368 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; | ||
1369 | mcp->mb[1] = BIT_1; | ||
1370 | mcp->mb[2] = 0; | ||
1371 | mcp->out_mb = MBX_2|MBX_1|MBX_0; | ||
1372 | } else if (IS_FWI2_CAPABLE(vha->hw)) { | ||
1357 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; | 1373 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; |
1358 | mcp->mb[1] = BIT_6; | 1374 | mcp->mb[1] = BIT_6; |
1359 | mcp->mb[2] = 0; | 1375 | mcp->mb[2] = 0; |
@@ -1843,6 +1859,9 @@ qla2x00_full_login_lip(scsi_qla_host_t *vha) | |||
1843 | mbx_cmd_t mc; | 1859 | mbx_cmd_t mc; |
1844 | mbx_cmd_t *mcp = &mc; | 1860 | mbx_cmd_t *mcp = &mc; |
1845 | 1861 | ||
1862 | if (IS_QLA81XX(vha->hw)) | ||
1863 | return QLA_SUCCESS; | ||
1864 | |||
1846 | DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", | 1865 | DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", |
1847 | vha->host_no)); | 1866 | vha->host_no)); |
1848 | 1867 | ||
@@ -2502,7 +2521,7 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma, | |||
2502 | mbx_cmd_t mc; | 2521 | mbx_cmd_t mc; |
2503 | mbx_cmd_t *mcp = &mc; | 2522 | mbx_cmd_t *mcp = &mc; |
2504 | 2523 | ||
2505 | if (!IS_QLA25XX(vha->hw)) | 2524 | if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw)) |
2506 | return QLA_FUNCTION_FAILED; | 2525 | return QLA_FUNCTION_FAILED; |
2507 | 2526 | ||
2508 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 2527 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 1b475c5fa6f4..4a71f522f925 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -404,26 +404,9 @@ static char * | |||
404 | qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str) | 404 | qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str) |
405 | { | 405 | { |
406 | struct qla_hw_data *ha = vha->hw; | 406 | struct qla_hw_data *ha = vha->hw; |
407 | sprintf(str, "%d.%02d.%02d ", ha->fw_major_version, | ||
408 | ha->fw_minor_version, | ||
409 | ha->fw_subminor_version); | ||
410 | 407 | ||
411 | if (ha->fw_attributes & BIT_0) | 408 | sprintf(str, "%d.%02d.%02d (%x)", ha->fw_major_version, |
412 | strcat(str, "[Class 2] "); | 409 | ha->fw_minor_version, ha->fw_subminor_version, ha->fw_attributes); |
413 | if (ha->fw_attributes & BIT_1) | ||
414 | strcat(str, "[IP] "); | ||
415 | if (ha->fw_attributes & BIT_2) | ||
416 | strcat(str, "[Multi-ID] "); | ||
417 | if (ha->fw_attributes & BIT_3) | ||
418 | strcat(str, "[SB-2] "); | ||
419 | if (ha->fw_attributes & BIT_4) | ||
420 | strcat(str, "[T10 CRC] "); | ||
421 | if (ha->fw_attributes & BIT_5) | ||
422 | strcat(str, "[VI] "); | ||
423 | if (ha->fw_attributes & BIT_10) | ||
424 | strcat(str, "[84XX] "); | ||
425 | if (ha->fw_attributes & BIT_13) | ||
426 | strcat(str, "[Experimental]"); | ||
427 | return str; | 410 | return str; |
428 | } | 411 | } |
429 | 412 | ||
@@ -1489,6 +1472,44 @@ static struct isp_operations qla25xx_isp_ops = { | |||
1489 | .rd_req_reg = qla24xx_rd_req_reg, | 1472 | .rd_req_reg = qla24xx_rd_req_reg, |
1490 | }; | 1473 | }; |
1491 | 1474 | ||
1475 | static struct isp_operations qla81xx_isp_ops = { | ||
1476 | .pci_config = qla25xx_pci_config, | ||
1477 | .reset_chip = qla24xx_reset_chip, | ||
1478 | .chip_diag = qla24xx_chip_diag, | ||
1479 | .config_rings = qla24xx_config_rings, | ||
1480 | .reset_adapter = qla24xx_reset_adapter, | ||
1481 | .nvram_config = qla81xx_nvram_config, | ||
1482 | .update_fw_options = qla81xx_update_fw_options, | ||
1483 | .load_risc = qla24xx_load_risc, | ||
1484 | .pci_info_str = qla24xx_pci_info_str, | ||
1485 | .fw_version_str = qla24xx_fw_version_str, | ||
1486 | .intr_handler = qla24xx_intr_handler, | ||
1487 | .enable_intrs = qla24xx_enable_intrs, | ||
1488 | .disable_intrs = qla24xx_disable_intrs, | ||
1489 | .abort_command = qla24xx_abort_command, | ||
1490 | .target_reset = qla24xx_abort_target, | ||
1491 | .lun_reset = qla24xx_lun_reset, | ||
1492 | .fabric_login = qla24xx_login_fabric, | ||
1493 | .fabric_logout = qla24xx_fabric_logout, | ||
1494 | .calc_req_entries = NULL, | ||
1495 | .build_iocbs = NULL, | ||
1496 | .prep_ms_iocb = qla24xx_prep_ms_iocb, | ||
1497 | .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb, | ||
1498 | .read_nvram = qla25xx_read_nvram_data, | ||
1499 | .write_nvram = qla25xx_write_nvram_data, | ||
1500 | .fw_dump = qla81xx_fw_dump, | ||
1501 | .beacon_on = qla24xx_beacon_on, | ||
1502 | .beacon_off = qla24xx_beacon_off, | ||
1503 | .beacon_blink = qla24xx_beacon_blink, | ||
1504 | .read_optrom = qla25xx_read_optrom_data, | ||
1505 | .write_optrom = qla24xx_write_optrom_data, | ||
1506 | .get_flash_version = qla24xx_get_flash_version, | ||
1507 | .start_scsi = qla24xx_start_scsi, | ||
1508 | .wrt_req_reg = qla24xx_wrt_req_reg, | ||
1509 | .wrt_rsp_reg = qla24xx_wrt_rsp_reg, | ||
1510 | .rd_req_reg = qla24xx_rd_req_reg, | ||
1511 | }; | ||
1512 | |||
1492 | static inline void | 1513 | static inline void |
1493 | qla2x00_set_isp_flags(struct qla_hw_data *ha) | 1514 | qla2x00_set_isp_flags(struct qla_hw_data *ha) |
1494 | { | 1515 | { |
@@ -1568,6 +1589,13 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha) | |||
1568 | ha->device_type |= DT_IIDMA; | 1589 | ha->device_type |= DT_IIDMA; |
1569 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | 1590 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; |
1570 | break; | 1591 | break; |
1592 | case PCI_DEVICE_ID_QLOGIC_ISP8001: | ||
1593 | ha->device_type |= DT_ISP8001; | ||
1594 | ha->device_type |= DT_ZIO_SUPPORTED; | ||
1595 | ha->device_type |= DT_FWI2; | ||
1596 | ha->device_type |= DT_IIDMA; | ||
1597 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | ||
1598 | break; | ||
1571 | } | 1599 | } |
1572 | } | 1600 | } |
1573 | 1601 | ||
@@ -1630,7 +1658,7 @@ skip_pio: | |||
1630 | 1658 | ||
1631 | /* Determine queue resources */ | 1659 | /* Determine queue resources */ |
1632 | ha->max_queues = 1; | 1660 | ha->max_queues = 1; |
1633 | if (ql2xmaxqueues <= 1 || !IS_QLA25XX(ha)) | 1661 | if (ql2xmaxqueues <= 1 || (!IS_QLA25XX(ha) && !IS_QLA81XX(ha))) |
1634 | goto mqiobase_exit; | 1662 | goto mqiobase_exit; |
1635 | ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 3), | 1663 | ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 3), |
1636 | pci_resource_len(ha->pdev, 3)); | 1664 | pci_resource_len(ha->pdev, 3)); |
@@ -1707,7 +1735,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1707 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8432 || | 1735 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8432 || |
1708 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5422 || | 1736 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5422 || |
1709 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 || | 1737 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 || |
1710 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532) { | 1738 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532 || |
1739 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8001) { | ||
1711 | bars = pci_select_bars(pdev, IORESOURCE_MEM); | 1740 | bars = pci_select_bars(pdev, IORESOURCE_MEM); |
1712 | sht = &qla24xx_driver_template; | 1741 | sht = &qla24xx_driver_template; |
1713 | mem_only = 1; | 1742 | mem_only = 1; |
@@ -1761,6 +1790,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1761 | rsp_length = RESPONSE_ENTRY_CNT_2100; | 1790 | rsp_length = RESPONSE_ENTRY_CNT_2100; |
1762 | ha->max_loop_id = SNS_LAST_LOOP_ID_2100; | 1791 | ha->max_loop_id = SNS_LAST_LOOP_ID_2100; |
1763 | ha->gid_list_info_size = 4; | 1792 | ha->gid_list_info_size = 4; |
1793 | ha->flash_conf_off = ~0; | ||
1794 | ha->flash_data_off = ~0; | ||
1795 | ha->nvram_conf_off = ~0; | ||
1796 | ha->nvram_data_off = ~0; | ||
1764 | ha->isp_ops = &qla2100_isp_ops; | 1797 | ha->isp_ops = &qla2100_isp_ops; |
1765 | } else if (IS_QLA2200(ha)) { | 1798 | } else if (IS_QLA2200(ha)) { |
1766 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1799 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
@@ -1768,6 +1801,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1768 | rsp_length = RESPONSE_ENTRY_CNT_2100; | 1801 | rsp_length = RESPONSE_ENTRY_CNT_2100; |
1769 | ha->max_loop_id = SNS_LAST_LOOP_ID_2100; | 1802 | ha->max_loop_id = SNS_LAST_LOOP_ID_2100; |
1770 | ha->gid_list_info_size = 4; | 1803 | ha->gid_list_info_size = 4; |
1804 | ha->flash_conf_off = ~0; | ||
1805 | ha->flash_data_off = ~0; | ||
1806 | ha->nvram_conf_off = ~0; | ||
1807 | ha->nvram_data_off = ~0; | ||
1771 | ha->isp_ops = &qla2100_isp_ops; | 1808 | ha->isp_ops = &qla2100_isp_ops; |
1772 | } else if (IS_QLA23XX(ha)) { | 1809 | } else if (IS_QLA23XX(ha)) { |
1773 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1810 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
@@ -1777,6 +1814,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1777 | ha->gid_list_info_size = 6; | 1814 | ha->gid_list_info_size = 6; |
1778 | if (IS_QLA2322(ha) || IS_QLA6322(ha)) | 1815 | if (IS_QLA2322(ha) || IS_QLA6322(ha)) |
1779 | ha->optrom_size = OPTROM_SIZE_2322; | 1816 | ha->optrom_size = OPTROM_SIZE_2322; |
1817 | ha->flash_conf_off = ~0; | ||
1818 | ha->flash_data_off = ~0; | ||
1819 | ha->nvram_conf_off = ~0; | ||
1820 | ha->nvram_data_off = ~0; | ||
1780 | ha->isp_ops = &qla2300_isp_ops; | 1821 | ha->isp_ops = &qla2300_isp_ops; |
1781 | } else if (IS_QLA24XX_TYPE(ha)) { | 1822 | } else if (IS_QLA24XX_TYPE(ha)) { |
1782 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1823 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
@@ -1788,6 +1829,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1788 | ha->optrom_size = OPTROM_SIZE_24XX; | 1829 | ha->optrom_size = OPTROM_SIZE_24XX; |
1789 | ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA24XX; | 1830 | ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA24XX; |
1790 | ha->isp_ops = &qla24xx_isp_ops; | 1831 | ha->isp_ops = &qla24xx_isp_ops; |
1832 | ha->flash_conf_off = FARX_ACCESS_FLASH_CONF; | ||
1833 | ha->flash_data_off = FARX_ACCESS_FLASH_DATA; | ||
1834 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; | ||
1835 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; | ||
1791 | } else if (IS_QLA25XX(ha)) { | 1836 | } else if (IS_QLA25XX(ha)) { |
1792 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1837 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
1793 | req_length = REQUEST_ENTRY_CNT_24XX; | 1838 | req_length = REQUEST_ENTRY_CNT_24XX; |
@@ -1798,6 +1843,23 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1798 | ha->optrom_size = OPTROM_SIZE_25XX; | 1843 | ha->optrom_size = OPTROM_SIZE_25XX; |
1799 | ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX; | 1844 | ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX; |
1800 | ha->isp_ops = &qla25xx_isp_ops; | 1845 | ha->isp_ops = &qla25xx_isp_ops; |
1846 | ha->flash_conf_off = FARX_ACCESS_FLASH_CONF; | ||
1847 | ha->flash_data_off = FARX_ACCESS_FLASH_DATA; | ||
1848 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; | ||
1849 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; | ||
1850 | } else if (IS_QLA81XX(ha)) { | ||
1851 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | ||
1852 | req_length = REQUEST_ENTRY_CNT_24XX; | ||
1853 | rsp_length = RESPONSE_ENTRY_CNT_2300; | ||
1854 | ha->max_loop_id = SNS_LAST_LOOP_ID_2300; | ||
1855 | ha->init_cb_size = sizeof(struct mid_init_cb_81xx); | ||
1856 | ha->gid_list_info_size = 8; | ||
1857 | ha->optrom_size = OPTROM_SIZE_81XX; | ||
1858 | ha->isp_ops = &qla81xx_isp_ops; | ||
1859 | ha->flash_conf_off = FARX_ACCESS_FLASH_CONF_81XX; | ||
1860 | ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX; | ||
1861 | ha->nvram_conf_off = ~0; | ||
1862 | ha->nvram_data_off = ~0; | ||
1801 | } | 1863 | } |
1802 | 1864 | ||
1803 | mutex_init(&ha->vport_lock); | 1865 | mutex_init(&ha->vport_lock); |
@@ -2894,13 +2956,14 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
2894 | 2956 | ||
2895 | /* Firmware interface routines. */ | 2957 | /* Firmware interface routines. */ |
2896 | 2958 | ||
2897 | #define FW_BLOBS 6 | 2959 | #define FW_BLOBS 7 |
2898 | #define FW_ISP21XX 0 | 2960 | #define FW_ISP21XX 0 |
2899 | #define FW_ISP22XX 1 | 2961 | #define FW_ISP22XX 1 |
2900 | #define FW_ISP2300 2 | 2962 | #define FW_ISP2300 2 |
2901 | #define FW_ISP2322 3 | 2963 | #define FW_ISP2322 3 |
2902 | #define FW_ISP24XX 4 | 2964 | #define FW_ISP24XX 4 |
2903 | #define FW_ISP25XX 5 | 2965 | #define FW_ISP25XX 5 |
2966 | #define FW_ISP81XX 6 | ||
2904 | 2967 | ||
2905 | #define FW_FILE_ISP21XX "ql2100_fw.bin" | 2968 | #define FW_FILE_ISP21XX "ql2100_fw.bin" |
2906 | #define FW_FILE_ISP22XX "ql2200_fw.bin" | 2969 | #define FW_FILE_ISP22XX "ql2200_fw.bin" |
@@ -2908,6 +2971,7 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
2908 | #define FW_FILE_ISP2322 "ql2322_fw.bin" | 2971 | #define FW_FILE_ISP2322 "ql2322_fw.bin" |
2909 | #define FW_FILE_ISP24XX "ql2400_fw.bin" | 2972 | #define FW_FILE_ISP24XX "ql2400_fw.bin" |
2910 | #define FW_FILE_ISP25XX "ql2500_fw.bin" | 2973 | #define FW_FILE_ISP25XX "ql2500_fw.bin" |
2974 | #define FW_FILE_ISP81XX "ql8100_fw.bin" | ||
2911 | 2975 | ||
2912 | static DEFINE_MUTEX(qla_fw_lock); | 2976 | static DEFINE_MUTEX(qla_fw_lock); |
2913 | 2977 | ||
@@ -2918,6 +2982,7 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = { | |||
2918 | { .name = FW_FILE_ISP2322, .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, | 2982 | { .name = FW_FILE_ISP2322, .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, |
2919 | { .name = FW_FILE_ISP24XX, }, | 2983 | { .name = FW_FILE_ISP24XX, }, |
2920 | { .name = FW_FILE_ISP25XX, }, | 2984 | { .name = FW_FILE_ISP25XX, }, |
2985 | { .name = FW_FILE_ISP81XX, }, | ||
2921 | }; | 2986 | }; |
2922 | 2987 | ||
2923 | struct fw_blob * | 2988 | struct fw_blob * |
@@ -2939,6 +3004,8 @@ qla2x00_request_firmware(scsi_qla_host_t *vha) | |||
2939 | blob = &qla_fw_blobs[FW_ISP24XX]; | 3004 | blob = &qla_fw_blobs[FW_ISP24XX]; |
2940 | } else if (IS_QLA25XX(ha)) { | 3005 | } else if (IS_QLA25XX(ha)) { |
2941 | blob = &qla_fw_blobs[FW_ISP25XX]; | 3006 | blob = &qla_fw_blobs[FW_ISP25XX]; |
3007 | } else if (IS_QLA81XX(ha)) { | ||
3008 | blob = &qla_fw_blobs[FW_ISP81XX]; | ||
2942 | } | 3009 | } |
2943 | 3010 | ||
2944 | mutex_lock(&qla_fw_lock); | 3011 | mutex_lock(&qla_fw_lock); |
@@ -3092,6 +3159,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = { | |||
3092 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, | 3159 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, |
3093 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, | 3160 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, |
3094 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) }, | 3161 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) }, |
3162 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8001) }, | ||
3095 | { 0 }, | 3163 | { 0 }, |
3096 | }; | 3164 | }; |
3097 | MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); | 3165 | MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); |
@@ -3180,3 +3248,4 @@ MODULE_FIRMWARE(FW_FILE_ISP2300); | |||
3180 | MODULE_FIRMWARE(FW_FILE_ISP2322); | 3248 | MODULE_FIRMWARE(FW_FILE_ISP2322); |
3181 | MODULE_FIRMWARE(FW_FILE_ISP24XX); | 3249 | MODULE_FIRMWARE(FW_FILE_ISP24XX); |
3182 | MODULE_FIRMWARE(FW_FILE_ISP25XX); | 3250 | MODULE_FIRMWARE(FW_FILE_ISP25XX); |
3251 | MODULE_FIRMWARE(FW_FILE_ISP81XX); | ||
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index 628d79c09733..303f8ee11f25 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
@@ -425,27 +425,27 @@ qla2x00_set_nvram_protection(struct qla_hw_data *ha, int stat) | |||
425 | #define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4) | 425 | #define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4) |
426 | 426 | ||
427 | static inline uint32_t | 427 | static inline uint32_t |
428 | flash_conf_to_access_addr(uint32_t faddr) | 428 | flash_conf_addr(struct qla_hw_data *ha, uint32_t faddr) |
429 | { | 429 | { |
430 | return FARX_ACCESS_FLASH_CONF | faddr; | 430 | return ha->flash_conf_off | faddr; |
431 | } | 431 | } |
432 | 432 | ||
433 | static inline uint32_t | 433 | static inline uint32_t |
434 | flash_data_to_access_addr(uint32_t faddr) | 434 | flash_data_addr(struct qla_hw_data *ha, uint32_t faddr) |
435 | { | 435 | { |
436 | return FARX_ACCESS_FLASH_DATA | faddr; | 436 | return ha->flash_data_off | faddr; |
437 | } | 437 | } |
438 | 438 | ||
439 | static inline uint32_t | 439 | static inline uint32_t |
440 | nvram_conf_to_access_addr(uint32_t naddr) | 440 | nvram_conf_addr(struct qla_hw_data *ha, uint32_t naddr) |
441 | { | 441 | { |
442 | return FARX_ACCESS_NVRAM_CONF | naddr; | 442 | return ha->nvram_conf_off | naddr; |
443 | } | 443 | } |
444 | 444 | ||
445 | static inline uint32_t | 445 | static inline uint32_t |
446 | nvram_data_to_access_addr(uint32_t naddr) | 446 | nvram_data_addr(struct qla_hw_data *ha, uint32_t naddr) |
447 | { | 447 | { |
448 | return FARX_ACCESS_NVRAM_DATA | naddr; | 448 | return ha->nvram_data_off | naddr; |
449 | } | 449 | } |
450 | 450 | ||
451 | static uint32_t | 451 | static uint32_t |
@@ -481,10 +481,12 @@ qla24xx_read_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
481 | uint32_t dwords) | 481 | uint32_t dwords) |
482 | { | 482 | { |
483 | uint32_t i; | 483 | uint32_t i; |
484 | struct qla_hw_data *ha = vha->hw; | ||
485 | |||
484 | /* Dword reads to flash. */ | 486 | /* Dword reads to flash. */ |
485 | for (i = 0; i < dwords; i++, faddr++) | 487 | for (i = 0; i < dwords; i++, faddr++) |
486 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(vha->hw, | 488 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, |
487 | flash_data_to_access_addr(faddr))); | 489 | flash_data_addr(ha, faddr))); |
488 | 490 | ||
489 | return dwptr; | 491 | return dwptr; |
490 | } | 492 | } |
@@ -518,7 +520,7 @@ qla24xx_get_flash_manufacturer(struct qla_hw_data *ha, uint8_t *man_id, | |||
518 | { | 520 | { |
519 | uint32_t ids; | 521 | uint32_t ids; |
520 | 522 | ||
521 | ids = qla24xx_read_flash_dword(ha, flash_data_to_access_addr(0xd03ab)); | 523 | ids = qla24xx_read_flash_dword(ha, flash_conf_addr(ha, 0x03ab)); |
522 | *man_id = LSB(ids); | 524 | *man_id = LSB(ids); |
523 | *flash_id = MSB(ids); | 525 | *flash_id = MSB(ids); |
524 | 526 | ||
@@ -530,8 +532,7 @@ qla24xx_get_flash_manufacturer(struct qla_hw_data *ha, uint8_t *man_id, | |||
530 | * Example: ATMEL 0x00 01 45 1F | 532 | * Example: ATMEL 0x00 01 45 1F |
531 | * Extract MFG and Dev ID from last two bytes. | 533 | * Extract MFG and Dev ID from last two bytes. |
532 | */ | 534 | */ |
533 | ids = qla24xx_read_flash_dword(ha, | 535 | ids = qla24xx_read_flash_dword(ha, flash_conf_addr(ha, 0x009f)); |
534 | flash_data_to_access_addr(0xd009f)); | ||
535 | *man_id = LSB(ids); | 536 | *man_id = LSB(ids); |
536 | *flash_id = MSB(ids); | 537 | *flash_id = MSB(ids); |
537 | } | 538 | } |
@@ -555,9 +556,13 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start) | |||
555 | 556 | ||
556 | /* Begin with sane defaults. */ | 557 | /* Begin with sane defaults. */ |
557 | loc = locations[0]; | 558 | loc = locations[0]; |
558 | *start = IS_QLA24XX_TYPE(ha) ? FA_FLASH_LAYOUT_ADDR_24: | 559 | *start = 0; |
559 | FA_FLASH_LAYOUT_ADDR; | 560 | if (IS_QLA24XX_TYPE(ha)) |
560 | 561 | *start = FA_FLASH_LAYOUT_ADDR_24; | |
562 | else if (IS_QLA25XX(ha)) | ||
563 | *start = FA_FLASH_LAYOUT_ADDR; | ||
564 | else if (IS_QLA81XX(ha)) | ||
565 | *start = FA_FLASH_LAYOUT_ADDR_81; | ||
561 | /* Begin with first PCI expansion ROM header. */ | 566 | /* Begin with first PCI expansion ROM header. */ |
562 | buf = (uint8_t *)req->ring; | 567 | buf = (uint8_t *)req->ring; |
563 | dcode = (uint32_t *)req->ring; | 568 | dcode = (uint32_t *)req->ring; |
@@ -618,6 +623,22 @@ static void | |||
618 | qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) | 623 | qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) |
619 | { | 624 | { |
620 | const char *loc, *locations[] = { "DEF", "FLT" }; | 625 | const char *loc, *locations[] = { "DEF", "FLT" }; |
626 | const uint32_t def_fw[] = | ||
627 | { FA_RISC_CODE_ADDR, FA_RISC_CODE_ADDR, FA_RISC_CODE_ADDR_81 }; | ||
628 | const uint32_t def_boot[] = | ||
629 | { FA_BOOT_CODE_ADDR, FA_BOOT_CODE_ADDR, FA_BOOT_CODE_ADDR_81 }; | ||
630 | const uint32_t def_vpd_nvram[] = | ||
631 | { FA_VPD_NVRAM_ADDR, FA_VPD_NVRAM_ADDR, FA_VPD_NVRAM_ADDR_81 }; | ||
632 | const uint32_t def_fdt[] = | ||
633 | { FA_FLASH_DESCR_ADDR_24, FA_FLASH_DESCR_ADDR, | ||
634 | FA_FLASH_DESCR_ADDR_81 }; | ||
635 | const uint32_t def_npiv_conf0[] = | ||
636 | { FA_NPIV_CONF0_ADDR_24, FA_NPIV_CONF0_ADDR, | ||
637 | FA_NPIV_CONF0_ADDR_81 }; | ||
638 | const uint32_t def_npiv_conf1[] = | ||
639 | { FA_NPIV_CONF1_ADDR_24, FA_NPIV_CONF1_ADDR, | ||
640 | FA_NPIV_CONF1_ADDR_81 }; | ||
641 | uint32_t def; | ||
621 | uint16_t *wptr; | 642 | uint16_t *wptr; |
622 | uint16_t cnt, chksum; | 643 | uint16_t cnt, chksum; |
623 | uint32_t start; | 644 | uint32_t start; |
@@ -677,11 +698,11 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) | |||
677 | ha->flt_region_fdt = start; | 698 | ha->flt_region_fdt = start; |
678 | break; | 699 | break; |
679 | case FLT_REG_NPIV_CONF_0: | 700 | case FLT_REG_NPIV_CONF_0: |
680 | if (!PCI_FUNC(ha->pdev->devfn)) | 701 | if (!(PCI_FUNC(ha->pdev->devfn) & 1)) |
681 | ha->flt_region_npiv_conf = start; | 702 | ha->flt_region_npiv_conf = start; |
682 | break; | 703 | break; |
683 | case FLT_REG_NPIV_CONF_1: | 704 | case FLT_REG_NPIV_CONF_1: |
684 | if (PCI_FUNC(ha->pdev->devfn)) | 705 | if (PCI_FUNC(ha->pdev->devfn) & 1) |
685 | ha->flt_region_npiv_conf = start; | 706 | ha->flt_region_npiv_conf = start; |
686 | break; | 707 | break; |
687 | } | 708 | } |
@@ -691,14 +712,19 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) | |||
691 | no_flash_data: | 712 | no_flash_data: |
692 | /* Use hardcoded defaults. */ | 713 | /* Use hardcoded defaults. */ |
693 | loc = locations[0]; | 714 | loc = locations[0]; |
694 | ha->flt_region_fw = FA_RISC_CODE_ADDR; | 715 | def = 0; |
695 | ha->flt_region_boot = FA_BOOT_CODE_ADDR; | 716 | if (IS_QLA24XX_TYPE(ha)) |
696 | ha->flt_region_vpd_nvram = FA_VPD_NVRAM_ADDR; | 717 | def = 0; |
697 | ha->flt_region_fdt = IS_QLA24XX_TYPE(ha) ? FA_FLASH_DESCR_ADDR_24: | 718 | else if (IS_QLA25XX(ha)) |
698 | FA_FLASH_DESCR_ADDR; | 719 | def = 1; |
699 | ha->flt_region_npiv_conf = !PCI_FUNC(ha->pdev->devfn) ? | 720 | else if (IS_QLA81XX(ha)) |
700 | (IS_QLA24XX_TYPE(ha) ? FA_NPIV_CONF0_ADDR_24: FA_NPIV_CONF0_ADDR): | 721 | def = 2; |
701 | (IS_QLA24XX_TYPE(ha) ? FA_NPIV_CONF1_ADDR_24: FA_NPIV_CONF1_ADDR); | 722 | ha->flt_region_fw = def_fw[def]; |
723 | ha->flt_region_boot = def_boot[def]; | ||
724 | ha->flt_region_vpd_nvram = def_vpd_nvram[def]; | ||
725 | ha->flt_region_fdt = def_fdt[def]; | ||
726 | ha->flt_region_npiv_conf = !(PCI_FUNC(ha->pdev->devfn) & 1) ? | ||
727 | def_npiv_conf0[def]: def_npiv_conf1[def]; | ||
702 | done: | 728 | done: |
703 | DEBUG2(qla_printk(KERN_DEBUG, ha, "FLT[%s]: boot=0x%x fw=0x%x " | 729 | DEBUG2(qla_printk(KERN_DEBUG, ha, "FLT[%s]: boot=0x%x fw=0x%x " |
704 | "vpd_nvram=0x%x fdt=0x%x flt=0x%x npiv=0x%x.\n", loc, | 730 | "vpd_nvram=0x%x fdt=0x%x flt=0x%x npiv=0x%x.\n", loc, |
@@ -746,14 +772,14 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha) | |||
746 | mid = le16_to_cpu(fdt->man_id); | 772 | mid = le16_to_cpu(fdt->man_id); |
747 | fid = le16_to_cpu(fdt->id); | 773 | fid = le16_to_cpu(fdt->id); |
748 | ha->fdt_wrt_disable = fdt->wrt_disable_bits; | 774 | ha->fdt_wrt_disable = fdt->wrt_disable_bits; |
749 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0300 | fdt->erase_cmd); | 775 | ha->fdt_erase_cmd = flash_conf_addr(ha, 0x0300 | fdt->erase_cmd); |
750 | ha->fdt_block_size = le32_to_cpu(fdt->block_size); | 776 | ha->fdt_block_size = le32_to_cpu(fdt->block_size); |
751 | if (fdt->unprotect_sec_cmd) { | 777 | if (fdt->unprotect_sec_cmd) { |
752 | ha->fdt_unprotect_sec_cmd = flash_conf_to_access_addr(0x0300 | | 778 | ha->fdt_unprotect_sec_cmd = flash_conf_addr(ha, 0x0300 | |
753 | fdt->unprotect_sec_cmd); | 779 | fdt->unprotect_sec_cmd); |
754 | ha->fdt_protect_sec_cmd = fdt->protect_sec_cmd ? | 780 | ha->fdt_protect_sec_cmd = fdt->protect_sec_cmd ? |
755 | flash_conf_to_access_addr(0x0300 | fdt->protect_sec_cmd): | 781 | flash_conf_addr(ha, 0x0300 | fdt->protect_sec_cmd): |
756 | flash_conf_to_access_addr(0x0336); | 782 | flash_conf_addr(ha, 0x0336); |
757 | } | 783 | } |
758 | goto done; | 784 | goto done; |
759 | no_flash_data: | 785 | no_flash_data: |
@@ -762,7 +788,7 @@ no_flash_data: | |||
762 | mid = man_id; | 788 | mid = man_id; |
763 | fid = flash_id; | 789 | fid = flash_id; |
764 | ha->fdt_wrt_disable = 0x9c; | 790 | ha->fdt_wrt_disable = 0x9c; |
765 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x03d8); | 791 | ha->fdt_erase_cmd = flash_conf_addr(ha, 0x03d8); |
766 | switch (man_id) { | 792 | switch (man_id) { |
767 | case 0xbf: /* STT flash. */ | 793 | case 0xbf: /* STT flash. */ |
768 | if (flash_id == 0x8e) | 794 | if (flash_id == 0x8e) |
@@ -771,16 +797,16 @@ no_flash_data: | |||
771 | ha->fdt_block_size = FLASH_BLK_SIZE_32K; | 797 | ha->fdt_block_size = FLASH_BLK_SIZE_32K; |
772 | 798 | ||
773 | if (flash_id == 0x80) | 799 | if (flash_id == 0x80) |
774 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0352); | 800 | ha->fdt_erase_cmd = flash_conf_addr(ha, 0x0352); |
775 | break; | 801 | break; |
776 | case 0x13: /* ST M25P80. */ | 802 | case 0x13: /* ST M25P80. */ |
777 | ha->fdt_block_size = FLASH_BLK_SIZE_64K; | 803 | ha->fdt_block_size = FLASH_BLK_SIZE_64K; |
778 | break; | 804 | break; |
779 | case 0x1f: /* Atmel 26DF081A. */ | 805 | case 0x1f: /* Atmel 26DF081A. */ |
780 | ha->fdt_block_size = FLASH_BLK_SIZE_4K; | 806 | ha->fdt_block_size = FLASH_BLK_SIZE_4K; |
781 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0320); | 807 | ha->fdt_erase_cmd = flash_conf_addr(ha, 0x0320); |
782 | ha->fdt_unprotect_sec_cmd = flash_conf_to_access_addr(0x0339); | 808 | ha->fdt_unprotect_sec_cmd = flash_conf_addr(ha, 0x0339); |
783 | ha->fdt_protect_sec_cmd = flash_conf_to_access_addr(0x0336); | 809 | ha->fdt_protect_sec_cmd = flash_conf_addr(ha, 0x0336); |
784 | break; | 810 | break; |
785 | default: | 811 | default: |
786 | /* Default to 64 kb sector size. */ | 812 | /* Default to 64 kb sector size. */ |
@@ -802,7 +828,7 @@ qla2xxx_get_flash_info(scsi_qla_host_t *vha) | |||
802 | uint32_t flt_addr; | 828 | uint32_t flt_addr; |
803 | struct qla_hw_data *ha = vha->hw; | 829 | struct qla_hw_data *ha = vha->hw; |
804 | 830 | ||
805 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha)) | 831 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA81XX(ha)) |
806 | return QLA_SUCCESS; | 832 | return QLA_SUCCESS; |
807 | 833 | ||
808 | ret = qla2xxx_find_flt_start(vha, &flt_addr); | 834 | ret = qla2xxx_find_flt_start(vha, &flt_addr); |
@@ -827,7 +853,7 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) | |||
827 | struct qla_npiv_entry *entry; | 853 | struct qla_npiv_entry *entry; |
828 | struct qla_hw_data *ha = vha->hw; | 854 | struct qla_hw_data *ha = vha->hw; |
829 | 855 | ||
830 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha)) | 856 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA81XX(ha)) |
831 | return; | 857 | return; |
832 | 858 | ||
833 | ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, | 859 | ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, |
@@ -919,9 +945,9 @@ qla24xx_unprotect_flash(struct qla_hw_data *ha) | |||
919 | return; | 945 | return; |
920 | 946 | ||
921 | /* Disable flash write-protection. */ | 947 | /* Disable flash write-protection. */ |
922 | qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), 0); | 948 | qla24xx_write_flash_dword(ha, flash_conf_addr(ha, 0x101), 0); |
923 | /* Some flash parts need an additional zero-write to clear bits.*/ | 949 | /* Some flash parts need an additional zero-write to clear bits.*/ |
924 | qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), 0); | 950 | qla24xx_write_flash_dword(ha, flash_conf_addr(ha, 0x101), 0); |
925 | } | 951 | } |
926 | 952 | ||
927 | static void | 953 | static void |
@@ -934,11 +960,10 @@ qla24xx_protect_flash(struct qla_hw_data *ha) | |||
934 | goto skip_wrt_protect; | 960 | goto skip_wrt_protect; |
935 | 961 | ||
936 | /* Enable flash write-protection and wait for completion. */ | 962 | /* Enable flash write-protection and wait for completion. */ |
937 | qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), | 963 | qla24xx_write_flash_dword(ha, flash_conf_addr(ha, 0x101), |
938 | ha->fdt_wrt_disable); | 964 | ha->fdt_wrt_disable); |
939 | for (cnt = 300; cnt && | 965 | for (cnt = 300; cnt && |
940 | qla24xx_read_flash_dword(ha, | 966 | qla24xx_read_flash_dword(ha, flash_conf_addr(ha, 0x005)) & BIT_0; |
941 | flash_conf_to_access_addr(0x005)) & BIT_0; | ||
942 | cnt--) { | 967 | cnt--) { |
943 | udelay(10); | 968 | udelay(10); |
944 | } | 969 | } |
@@ -966,7 +991,7 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
966 | ret = QLA_SUCCESS; | 991 | ret = QLA_SUCCESS; |
967 | 992 | ||
968 | /* Prepare burst-capable write on supported ISPs. */ | 993 | /* Prepare burst-capable write on supported ISPs. */ |
969 | if (IS_QLA25XX(ha) && !(faddr & 0xfff) && | 994 | if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && !(faddr & 0xfff) && |
970 | dwords > OPTROM_BURST_DWORDS) { | 995 | dwords > OPTROM_BURST_DWORDS) { |
971 | optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, | 996 | optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, |
972 | &optrom_dma, GFP_KERNEL); | 997 | &optrom_dma, GFP_KERNEL); |
@@ -978,7 +1003,7 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
978 | } | 1003 | } |
979 | 1004 | ||
980 | rest_addr = (ha->fdt_block_size >> 2) - 1; | 1005 | rest_addr = (ha->fdt_block_size >> 2) - 1; |
981 | sec_mask = 0x80000 - (ha->fdt_block_size >> 2); | 1006 | sec_mask = (ha->optrom_size >> 2) - (ha->fdt_block_size >> 2); |
982 | 1007 | ||
983 | qla24xx_unprotect_flash(ha); | 1008 | qla24xx_unprotect_flash(ha); |
984 | 1009 | ||
@@ -1013,13 +1038,13 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
1013 | *s = cpu_to_le32(*d); | 1038 | *s = cpu_to_le32(*d); |
1014 | 1039 | ||
1015 | ret = qla2x00_load_ram(vha, optrom_dma, | 1040 | ret = qla2x00_load_ram(vha, optrom_dma, |
1016 | flash_data_to_access_addr(faddr), | 1041 | flash_data_addr(ha, faddr), |
1017 | OPTROM_BURST_DWORDS); | 1042 | OPTROM_BURST_DWORDS); |
1018 | if (ret != QLA_SUCCESS) { | 1043 | if (ret != QLA_SUCCESS) { |
1019 | qla_printk(KERN_WARNING, ha, | 1044 | qla_printk(KERN_WARNING, ha, |
1020 | "Unable to burst-write optrom segment " | 1045 | "Unable to burst-write optrom segment " |
1021 | "(%x/%x/%llx).\n", ret, | 1046 | "(%x/%x/%llx).\n", ret, |
1022 | flash_data_to_access_addr(faddr), | 1047 | flash_data_addr(ha, faddr), |
1023 | (unsigned long long)optrom_dma); | 1048 | (unsigned long long)optrom_dma); |
1024 | qla_printk(KERN_WARNING, ha, | 1049 | qla_printk(KERN_WARNING, ha, |
1025 | "Reverting to slow-write.\n"); | 1050 | "Reverting to slow-write.\n"); |
@@ -1036,7 +1061,7 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
1036 | } | 1061 | } |
1037 | 1062 | ||
1038 | ret = qla24xx_write_flash_dword(ha, | 1063 | ret = qla24xx_write_flash_dword(ha, |
1039 | flash_data_to_access_addr(faddr), cpu_to_le32(*dwptr)); | 1064 | flash_data_addr(ha, faddr), cpu_to_le32(*dwptr)); |
1040 | if (ret != QLA_SUCCESS) { | 1065 | if (ret != QLA_SUCCESS) { |
1041 | DEBUG9(printk("%s(%ld) Unable to program flash " | 1066 | DEBUG9(printk("%s(%ld) Unable to program flash " |
1042 | "address=%x data=%x.\n", __func__, | 1067 | "address=%x data=%x.\n", __func__, |
@@ -1087,12 +1112,13 @@ qla24xx_read_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, | |||
1087 | { | 1112 | { |
1088 | uint32_t i; | 1113 | uint32_t i; |
1089 | uint32_t *dwptr; | 1114 | uint32_t *dwptr; |
1115 | struct qla_hw_data *ha = vha->hw; | ||
1090 | 1116 | ||
1091 | /* Dword reads to flash. */ | 1117 | /* Dword reads to flash. */ |
1092 | dwptr = (uint32_t *)buf; | 1118 | dwptr = (uint32_t *)buf; |
1093 | for (i = 0; i < bytes >> 2; i++, naddr++) | 1119 | for (i = 0; i < bytes >> 2; i++, naddr++) |
1094 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(vha->hw, | 1120 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, |
1095 | nvram_data_to_access_addr(naddr))); | 1121 | nvram_data_addr(ha, naddr))); |
1096 | 1122 | ||
1097 | return buf; | 1123 | return buf; |
1098 | } | 1124 | } |
@@ -1149,17 +1175,14 @@ qla24xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, | |||
1149 | RD_REG_DWORD(®->ctrl_status); /* PCI Posting. */ | 1175 | RD_REG_DWORD(®->ctrl_status); /* PCI Posting. */ |
1150 | 1176 | ||
1151 | /* Disable NVRAM write-protection. */ | 1177 | /* Disable NVRAM write-protection. */ |
1152 | qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101), | 1178 | qla24xx_write_flash_dword(ha, nvram_conf_addr(ha, 0x101), 0); |
1153 | 0); | 1179 | qla24xx_write_flash_dword(ha, nvram_conf_addr(ha, 0x101), 0); |
1154 | qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101), | ||
1155 | 0); | ||
1156 | 1180 | ||
1157 | /* Dword writes to flash. */ | 1181 | /* Dword writes to flash. */ |
1158 | dwptr = (uint32_t *)buf; | 1182 | dwptr = (uint32_t *)buf; |
1159 | for (i = 0; i < bytes >> 2; i++, naddr++, dwptr++) { | 1183 | for (i = 0; i < bytes >> 2; i++, naddr++, dwptr++) { |
1160 | ret = qla24xx_write_flash_dword(ha, | 1184 | ret = qla24xx_write_flash_dword(ha, |
1161 | nvram_data_to_access_addr(naddr), | 1185 | nvram_data_addr(ha, naddr), cpu_to_le32(*dwptr)); |
1162 | cpu_to_le32(*dwptr)); | ||
1163 | if (ret != QLA_SUCCESS) { | 1186 | if (ret != QLA_SUCCESS) { |
1164 | DEBUG9(qla_printk("Unable to program nvram address=%x " | 1187 | DEBUG9(qla_printk("Unable to program nvram address=%x " |
1165 | "data=%x.\n", naddr, *dwptr)); | 1188 | "data=%x.\n", naddr, *dwptr)); |
@@ -1168,8 +1191,7 @@ qla24xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, | |||
1168 | } | 1191 | } |
1169 | 1192 | ||
1170 | /* Enable NVRAM write-protection. */ | 1193 | /* Enable NVRAM write-protection. */ |
1171 | qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101), | 1194 | qla24xx_write_flash_dword(ha, nvram_conf_addr(ha, 0x101), 0x8c); |
1172 | 0x8c); | ||
1173 | 1195 | ||
1174 | /* Disable flash write. */ | 1196 | /* Disable flash write. */ |
1175 | WRT_REG_DWORD(®->ctrl_status, | 1197 | WRT_REG_DWORD(®->ctrl_status, |
@@ -1191,8 +1213,7 @@ qla25xx_read_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, | |||
1191 | dwptr = (uint32_t *)buf; | 1213 | dwptr = (uint32_t *)buf; |
1192 | for (i = 0; i < bytes >> 2; i++, naddr++) | 1214 | for (i = 0; i < bytes >> 2; i++, naddr++) |
1193 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, | 1215 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, |
1194 | flash_data_to_access_addr(ha->flt_region_vpd_nvram | | 1216 | flash_data_addr(ha, ha->flt_region_vpd_nvram | naddr))); |
1195 | naddr))); | ||
1196 | 1217 | ||
1197 | return buf; | 1218 | return buf; |
1198 | } | 1219 | } |
@@ -2235,12 +2256,12 @@ qla25xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, | |||
2235 | burst = left; | 2256 | burst = left; |
2236 | 2257 | ||
2237 | rval = qla2x00_dump_ram(vha, optrom_dma, | 2258 | rval = qla2x00_dump_ram(vha, optrom_dma, |
2238 | flash_data_to_access_addr(faddr), burst); | 2259 | flash_data_addr(ha, faddr), burst); |
2239 | if (rval) { | 2260 | if (rval) { |
2240 | qla_printk(KERN_WARNING, ha, | 2261 | qla_printk(KERN_WARNING, ha, |
2241 | "Unable to burst-read optrom segment " | 2262 | "Unable to burst-read optrom segment " |
2242 | "(%x/%x/%llx).\n", rval, | 2263 | "(%x/%x/%llx).\n", rval, |
2243 | flash_data_to_access_addr(faddr), | 2264 | flash_data_addr(ha, faddr), |
2244 | (unsigned long long)optrom_dma); | 2265 | (unsigned long long)optrom_dma); |
2245 | qla_printk(KERN_WARNING, ha, | 2266 | qla_printk(KERN_WARNING, ha, |
2246 | "Reverting to slow-read.\n"); | 2267 | "Reverting to slow-read.\n"); |