diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-04-05 18:37:12 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-04-05 18:37:12 -0400 |
| commit | 7da23b86e14b77c094b11a9fa5ef5b3758fc9193 (patch) | |
| tree | 3da1b6c3c105daf61f1fe1c785821213ab6a9dde | |
| parent | 749d229761ff0135cc4e16b8a28b41ae2f6b2c35 (diff) | |
| parent | 421e33d0045ac0aa119c033b78742e0fbf4c3b21 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
[SCSI] qla1280: retain firmware for error recovery
[SCSI] attirbute_container: Initialize sysfs attributes with sysfs_attr_init
[SCSI] advansys: fix regression with request_firmware change
[SCSI] qla2xxx: Updated version number to 8.03.02-k2.
[SCSI] qla2xxx: Prevent sending mbx commands from sysfs during isp reset.
[SCSI] qla2xxx: Disable MSI on qla24xx chips other than QLA2432.
[SCSI] qla2xxx: Check to make sure multique and CPU affinity support is not enabled at the same time.
[SCSI] qla2xxx: Correct vp_idx checking during PORT_UPDATE processing.
[SCSI] qla2xxx: Honour "Extended BB credits" bit for CNAs.
[SCSI] scsi_transport_fc: Make sure commands are completed when rport is offline
[SCSI] libiscsi: Fix recovery slowdown regression
| -rw-r--r-- | drivers/base/attribute_container.c | 1 | ||||
| -rw-r--r-- | drivers/scsi/advansys.c | 8 | ||||
| -rw-r--r-- | drivers/scsi/libiscsi.c | 5 | ||||
| -rw-r--r-- | drivers/scsi/qla1280.c | 161 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_fw.h | 18 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 37 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 8 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_version.h | 4 | ||||
| -rw-r--r-- | drivers/scsi/scsi_transport_fc.c | 4 |
11 files changed, 172 insertions, 84 deletions
diff --git a/drivers/base/attribute_container.c b/drivers/base/attribute_container.c index b9cda053d3c0..8fc200b2e2c0 100644 --- a/drivers/base/attribute_container.c +++ b/drivers/base/attribute_container.c | |||
| @@ -328,6 +328,7 @@ attribute_container_add_attrs(struct device *classdev) | |||
| 328 | return sysfs_create_group(&classdev->kobj, cont->grp); | 328 | return sysfs_create_group(&classdev->kobj, cont->grp); |
| 329 | 329 | ||
| 330 | for (i = 0; attrs[i]; i++) { | 330 | for (i = 0; attrs[i]; i++) { |
| 331 | sysfs_attr_init(&attrs[i]->attr); | ||
| 331 | error = device_create_file(classdev, attrs[i]); | 332 | error = device_create_file(classdev, attrs[i]); |
| 332 | if (error) | 333 | if (error) |
| 333 | return error; | 334 | return error; |
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 22626abdb630..9201afe65609 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c | |||
| @@ -4781,12 +4781,14 @@ static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc) | |||
| 4781 | if (err) { | 4781 | if (err) { |
| 4782 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", | 4782 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", |
| 4783 | fwname, err); | 4783 | fwname, err); |
| 4784 | asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM; | ||
| 4784 | return err; | 4785 | return err; |
| 4785 | } | 4786 | } |
| 4786 | if (fw->size < 4) { | 4787 | if (fw->size < 4) { |
| 4787 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", | 4788 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", |
| 4788 | fw->size, fwname); | 4789 | fw->size, fwname); |
| 4789 | release_firmware(fw); | 4790 | release_firmware(fw); |
| 4791 | asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM; | ||
| 4790 | return -EINVAL; | 4792 | return -EINVAL; |
| 4791 | } | 4793 | } |
| 4792 | chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | | 4794 | chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | |
| @@ -5110,12 +5112,14 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc) | |||
| 5110 | if (err) { | 5112 | if (err) { |
| 5111 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", | 5113 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", |
| 5112 | fwname, err); | 5114 | fwname, err); |
| 5115 | asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; | ||
| 5113 | return err; | 5116 | return err; |
| 5114 | } | 5117 | } |
| 5115 | if (fw->size < 4) { | 5118 | if (fw->size < 4) { |
| 5116 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", | 5119 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", |
| 5117 | fw->size, fwname); | 5120 | fw->size, fwname); |
| 5118 | release_firmware(fw); | 5121 | release_firmware(fw); |
| 5122 | asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; | ||
| 5119 | return -EINVAL; | 5123 | return -EINVAL; |
| 5120 | } | 5124 | } |
| 5121 | chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | | 5125 | chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | |
| @@ -5624,12 +5628,14 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc) | |||
| 5624 | if (err) { | 5628 | if (err) { |
| 5625 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", | 5629 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", |
| 5626 | fwname, err); | 5630 | fwname, err); |
| 5631 | asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; | ||
| 5627 | return err; | 5632 | return err; |
| 5628 | } | 5633 | } |
| 5629 | if (fw->size < 4) { | 5634 | if (fw->size < 4) { |
| 5630 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", | 5635 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", |
| 5631 | fw->size, fwname); | 5636 | fw->size, fwname); |
| 5632 | release_firmware(fw); | 5637 | release_firmware(fw); |
| 5638 | asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; | ||
| 5633 | return -EINVAL; | 5639 | return -EINVAL; |
| 5634 | } | 5640 | } |
| 5635 | chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | | 5641 | chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | |
| @@ -6124,12 +6130,14 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc) | |||
| 6124 | if (err) { | 6130 | if (err) { |
| 6125 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", | 6131 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", |
| 6126 | fwname, err); | 6132 | fwname, err); |
| 6133 | asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; | ||
| 6127 | return err; | 6134 | return err; |
| 6128 | } | 6135 | } |
| 6129 | if (fw->size < 4) { | 6136 | if (fw->size < 4) { |
| 6130 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", | 6137 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", |
| 6131 | fw->size, fwname); | 6138 | fw->size, fwname); |
| 6132 | release_firmware(fw); | 6139 | release_firmware(fw); |
| 6140 | asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; | ||
| 6133 | return -EINVAL; | 6141 | return -EINVAL; |
| 6134 | } | 6142 | } |
| 6135 | chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | | 6143 | chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index abdb66d30eb6..6d5ae4474bb3 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
| @@ -3088,14 +3088,15 @@ static void iscsi_start_session_recovery(struct iscsi_session *session, | |||
| 3088 | session->state = ISCSI_STATE_TERMINATE; | 3088 | session->state = ISCSI_STATE_TERMINATE; |
| 3089 | else if (conn->stop_stage != STOP_CONN_RECOVER) | 3089 | else if (conn->stop_stage != STOP_CONN_RECOVER) |
| 3090 | session->state = ISCSI_STATE_IN_RECOVERY; | 3090 | session->state = ISCSI_STATE_IN_RECOVERY; |
| 3091 | |||
| 3092 | old_stop_stage = conn->stop_stage; | ||
| 3093 | conn->stop_stage = flag; | ||
| 3091 | spin_unlock_bh(&session->lock); | 3094 | spin_unlock_bh(&session->lock); |
| 3092 | 3095 | ||
| 3093 | del_timer_sync(&conn->transport_timer); | 3096 | del_timer_sync(&conn->transport_timer); |
| 3094 | iscsi_suspend_tx(conn); | 3097 | iscsi_suspend_tx(conn); |
| 3095 | 3098 | ||
| 3096 | spin_lock_bh(&session->lock); | 3099 | spin_lock_bh(&session->lock); |
| 3097 | old_stop_stage = conn->stop_stage; | ||
| 3098 | conn->stop_stage = flag; | ||
| 3099 | conn->c_stage = ISCSI_CONN_STOPPED; | 3100 | conn->c_stage = ISCSI_CONN_STOPPED; |
| 3100 | spin_unlock_bh(&session->lock); | 3101 | spin_unlock_bh(&session->lock); |
| 3101 | 3102 | ||
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index 8ef87781e51d..b8166ecfd0e3 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c | |||
| @@ -17,9 +17,11 @@ | |||
| 17 | * General Public License for more details. | 17 | * General Public License for more details. |
| 18 | * | 18 | * |
| 19 | ******************************************************************************/ | 19 | ******************************************************************************/ |
| 20 | #define QLA1280_VERSION "3.27" | 20 | #define QLA1280_VERSION "3.27.1" |
| 21 | /***************************************************************************** | 21 | /***************************************************************************** |
| 22 | Revision History: | 22 | Revision History: |
| 23 | Rev 3.27.1, February 8, 2010, Michael Reed | ||
| 24 | - Retain firmware image for error recovery. | ||
| 23 | Rev 3.27, February 10, 2009, Michael Reed | 25 | Rev 3.27, February 10, 2009, Michael Reed |
| 24 | - General code cleanup. | 26 | - General code cleanup. |
| 25 | - Improve error recovery. | 27 | - Improve error recovery. |
| @@ -537,9 +539,9 @@ __setup("qla1280=", qla1280_setup); | |||
| 537 | /*****************************************/ | 539 | /*****************************************/ |
| 538 | 540 | ||
| 539 | struct qla_boards { | 541 | struct qla_boards { |
| 540 | unsigned char name[9]; /* Board ID String */ | 542 | char *name; /* Board ID String */ |
| 541 | int numPorts; /* Number of SCSI ports */ | 543 | int numPorts; /* Number of SCSI ports */ |
| 542 | char *fwname; /* firmware name */ | 544 | int fw_index; /* index into qla1280_fw_tbl for firmware */ |
| 543 | }; | 545 | }; |
| 544 | 546 | ||
| 545 | /* NOTE: the last argument in each entry is used to index ql1280_board_tbl */ | 547 | /* NOTE: the last argument in each entry is used to index ql1280_board_tbl */ |
| @@ -560,15 +562,30 @@ static struct pci_device_id qla1280_pci_tbl[] = { | |||
| 560 | }; | 562 | }; |
| 561 | MODULE_DEVICE_TABLE(pci, qla1280_pci_tbl); | 563 | MODULE_DEVICE_TABLE(pci, qla1280_pci_tbl); |
| 562 | 564 | ||
| 565 | DEFINE_MUTEX(qla1280_firmware_mutex); | ||
| 566 | |||
| 567 | struct qla_fw { | ||
| 568 | char *fwname; | ||
| 569 | const struct firmware *fw; | ||
| 570 | }; | ||
| 571 | |||
| 572 | #define QL_NUM_FW_IMAGES 3 | ||
| 573 | |||
| 574 | struct qla_fw qla1280_fw_tbl[QL_NUM_FW_IMAGES] = { | ||
| 575 | {"qlogic/1040.bin", NULL}, /* image 0 */ | ||
| 576 | {"qlogic/1280.bin", NULL}, /* image 1 */ | ||
| 577 | {"qlogic/12160.bin", NULL}, /* image 2 */ | ||
| 578 | }; | ||
| 579 | |||
| 580 | /* NOTE: Order of boards in this table must match order in qla1280_pci_tbl */ | ||
| 563 | static struct qla_boards ql1280_board_tbl[] = { | 581 | static struct qla_boards ql1280_board_tbl[] = { |
| 564 | /* Name , Number of ports, FW details */ | 582 | {.name = "QLA12160", .numPorts = 2, .fw_index = 2}, |
| 565 | {"QLA12160", 2, "qlogic/12160.bin"}, | 583 | {.name = "QLA1040" , .numPorts = 1, .fw_index = 0}, |
| 566 | {"QLA1040", 1, "qlogic/1040.bin"}, | 584 | {.name = "QLA1080" , .numPorts = 1, .fw_index = 1}, |
| 567 | {"QLA1080", 1, "qlogic/1280.bin"}, | 585 | {.name = "QLA1240" , .numPorts = 2, .fw_index = 1}, |
| 568 | {"QLA1240", 2, "qlogic/1280.bin"}, | 586 | {.name = "QLA1280" , .numPorts = 2, .fw_index = 1}, |
| 569 | {"QLA1280", 2, "qlogic/1280.bin"}, | 587 | {.name = "QLA10160", .numPorts = 1, .fw_index = 2}, |
| 570 | {"QLA10160", 1, "qlogic/12160.bin"}, | 588 | {.name = " ", .numPorts = 0, .fw_index = -1}, |
| 571 | {" ", 0, " "}, | ||
| 572 | }; | 589 | }; |
| 573 | 590 | ||
| 574 | static int qla1280_verbose = 1; | 591 | static int qla1280_verbose = 1; |
| @@ -1511,6 +1528,63 @@ qla1280_initialize_adapter(struct scsi_qla_host *ha) | |||
| 1511 | } | 1528 | } |
| 1512 | 1529 | ||
| 1513 | /* | 1530 | /* |
| 1531 | * qla1280_request_firmware | ||
| 1532 | * Acquire firmware for chip. Retain in memory | ||
| 1533 | * for error recovery. | ||
| 1534 | * | ||
| 1535 | * Input: | ||
| 1536 | * ha = adapter block pointer. | ||
| 1537 | * | ||
| 1538 | * Returns: | ||
| 1539 | * Pointer to firmware image or an error code | ||
| 1540 | * cast to pointer via ERR_PTR(). | ||
| 1541 | */ | ||
| 1542 | static const struct firmware * | ||
| 1543 | qla1280_request_firmware(struct scsi_qla_host *ha) | ||
| 1544 | { | ||
| 1545 | const struct firmware *fw; | ||
| 1546 | int err; | ||
| 1547 | int index; | ||
| 1548 | char *fwname; | ||
| 1549 | |||
| 1550 | spin_unlock_irq(ha->host->host_lock); | ||
| 1551 | mutex_lock(&qla1280_firmware_mutex); | ||
| 1552 | |||
| 1553 | index = ql1280_board_tbl[ha->devnum].fw_index; | ||
| 1554 | fw = qla1280_fw_tbl[index].fw; | ||
| 1555 | if (fw) | ||
| 1556 | goto out; | ||
| 1557 | |||
| 1558 | fwname = qla1280_fw_tbl[index].fwname; | ||
| 1559 | err = request_firmware(&fw, fwname, &ha->pdev->dev); | ||
| 1560 | |||
| 1561 | if (err) { | ||
| 1562 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", | ||
| 1563 | fwname, err); | ||
| 1564 | fw = ERR_PTR(err); | ||
| 1565 | goto unlock; | ||
| 1566 | } | ||
| 1567 | if ((fw->size % 2) || (fw->size < 6)) { | ||
| 1568 | printk(KERN_ERR "Invalid firmware length %zu in image \"%s\"\n", | ||
| 1569 | fw->size, fwname); | ||
| 1570 | release_firmware(fw); | ||
| 1571 | fw = ERR_PTR(-EINVAL); | ||
| 1572 | goto unlock; | ||
| 1573 | } | ||
| 1574 | |||
| 1575 | qla1280_fw_tbl[index].fw = fw; | ||
| 1576 | |||
| 1577 | out: | ||
| 1578 | ha->fwver1 = fw->data[0]; | ||
| 1579 | ha->fwver2 = fw->data[1]; | ||
| 1580 | ha->fwver3 = fw->data[2]; | ||
| 1581 | unlock: | ||
| 1582 | mutex_unlock(&qla1280_firmware_mutex); | ||
| 1583 | spin_lock_irq(ha->host->host_lock); | ||
| 1584 | return fw; | ||
| 1585 | } | ||
| 1586 | |||
| 1587 | /* | ||
| 1514 | * Chip diagnostics | 1588 | * Chip diagnostics |
| 1515 | * Test chip for proper operation. | 1589 | * Test chip for proper operation. |
| 1516 | * | 1590 | * |
| @@ -1633,30 +1707,18 @@ qla1280_chip_diag(struct scsi_qla_host *ha) | |||
| 1633 | static int | 1707 | static int |
| 1634 | qla1280_load_firmware_pio(struct scsi_qla_host *ha) | 1708 | qla1280_load_firmware_pio(struct scsi_qla_host *ha) |
| 1635 | { | 1709 | { |
| 1710 | /* enter with host_lock acquired */ | ||
| 1711 | |||
| 1636 | const struct firmware *fw; | 1712 | const struct firmware *fw; |
| 1637 | const __le16 *fw_data; | 1713 | const __le16 *fw_data; |
| 1638 | uint16_t risc_address, risc_code_size; | 1714 | uint16_t risc_address, risc_code_size; |
| 1639 | uint16_t mb[MAILBOX_REGISTER_COUNT], i; | 1715 | uint16_t mb[MAILBOX_REGISTER_COUNT], i; |
| 1640 | int err; | 1716 | int err = 0; |
| 1717 | |||
| 1718 | fw = qla1280_request_firmware(ha); | ||
| 1719 | if (IS_ERR(fw)) | ||
| 1720 | return PTR_ERR(fw); | ||
| 1641 | 1721 | ||
| 1642 | spin_unlock_irq(ha->host->host_lock); | ||
| 1643 | err = request_firmware(&fw, ql1280_board_tbl[ha->devnum].fwname, | ||
| 1644 | &ha->pdev->dev); | ||
| 1645 | spin_lock_irq(ha->host->host_lock); | ||
| 1646 | if (err) { | ||
| 1647 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", | ||
| 1648 | ql1280_board_tbl[ha->devnum].fwname, err); | ||
| 1649 | return err; | ||
| 1650 | } | ||
| 1651 | if ((fw->size % 2) || (fw->size < 6)) { | ||
| 1652 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", | ||
| 1653 | fw->size, ql1280_board_tbl[ha->devnum].fwname); | ||
| 1654 | err = -EINVAL; | ||
| 1655 | goto out; | ||
| 1656 | } | ||
| 1657 | ha->fwver1 = fw->data[0]; | ||
| 1658 | ha->fwver2 = fw->data[1]; | ||
| 1659 | ha->fwver3 = fw->data[2]; | ||
| 1660 | fw_data = (const __le16 *)&fw->data[0]; | 1722 | fw_data = (const __le16 *)&fw->data[0]; |
| 1661 | ha->fwstart = __le16_to_cpu(fw_data[2]); | 1723 | ha->fwstart = __le16_to_cpu(fw_data[2]); |
| 1662 | 1724 | ||
| @@ -1674,11 +1736,10 @@ qla1280_load_firmware_pio(struct scsi_qla_host *ha) | |||
| 1674 | if (err) { | 1736 | if (err) { |
| 1675 | printk(KERN_ERR "scsi(%li): Failed to load firmware\n", | 1737 | printk(KERN_ERR "scsi(%li): Failed to load firmware\n", |
| 1676 | ha->host_no); | 1738 | ha->host_no); |
| 1677 | goto out; | 1739 | break; |
| 1678 | } | 1740 | } |
| 1679 | } | 1741 | } |
| 1680 | out: | 1742 | |
| 1681 | release_firmware(fw); | ||
| 1682 | return err; | 1743 | return err; |
| 1683 | } | 1744 | } |
| 1684 | 1745 | ||
| @@ -1686,6 +1747,7 @@ out: | |||
| 1686 | static int | 1747 | static int |
| 1687 | qla1280_load_firmware_dma(struct scsi_qla_host *ha) | 1748 | qla1280_load_firmware_dma(struct scsi_qla_host *ha) |
| 1688 | { | 1749 | { |
| 1750 | /* enter with host_lock acquired */ | ||
| 1689 | const struct firmware *fw; | 1751 | const struct firmware *fw; |
| 1690 | const __le16 *fw_data; | 1752 | const __le16 *fw_data; |
| 1691 | uint16_t risc_address, risc_code_size; | 1753 | uint16_t risc_address, risc_code_size; |
| @@ -1700,24 +1762,10 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha) | |||
| 1700 | return -ENOMEM; | 1762 | return -ENOMEM; |
| 1701 | #endif | 1763 | #endif |
| 1702 | 1764 | ||
| 1703 | spin_unlock_irq(ha->host->host_lock); | 1765 | fw = qla1280_request_firmware(ha); |
| 1704 | err = request_firmware(&fw, ql1280_board_tbl[ha->devnum].fwname, | 1766 | if (IS_ERR(fw)) |
| 1705 | &ha->pdev->dev); | 1767 | return PTR_ERR(fw); |
| 1706 | spin_lock_irq(ha->host->host_lock); | 1768 | |
| 1707 | if (err) { | ||
| 1708 | printk(KERN_ERR "Failed to load image \"%s\" err %d\n", | ||
| 1709 | ql1280_board_tbl[ha->devnum].fwname, err); | ||
| 1710 | return err; | ||
| 1711 | } | ||
| 1712 | if ((fw->size % 2) || (fw->size < 6)) { | ||
| 1713 | printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", | ||
| 1714 | fw->size, ql1280_board_tbl[ha->devnum].fwname); | ||
| 1715 | err = -EINVAL; | ||
| 1716 | goto out; | ||
| 1717 | } | ||
| 1718 | ha->fwver1 = fw->data[0]; | ||
| 1719 | ha->fwver2 = fw->data[1]; | ||
| 1720 | ha->fwver3 = fw->data[2]; | ||
| 1721 | fw_data = (const __le16 *)&fw->data[0]; | 1769 | fw_data = (const __le16 *)&fw->data[0]; |
| 1722 | ha->fwstart = __le16_to_cpu(fw_data[2]); | 1770 | ha->fwstart = __le16_to_cpu(fw_data[2]); |
| 1723 | 1771 | ||
| @@ -1802,7 +1850,6 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha) | |||
| 1802 | #if DUMP_IT_BACK | 1850 | #if DUMP_IT_BACK |
| 1803 | pci_free_consistent(ha->pdev, 8000, tbuf, p_tbuf); | 1851 | pci_free_consistent(ha->pdev, 8000, tbuf, p_tbuf); |
| 1804 | #endif | 1852 | #endif |
| 1805 | release_firmware(fw); | ||
| 1806 | return err; | 1853 | return err; |
| 1807 | } | 1854 | } |
| 1808 | 1855 | ||
| @@ -1841,6 +1888,7 @@ qla1280_start_firmware(struct scsi_qla_host *ha) | |||
| 1841 | static int | 1888 | static int |
| 1842 | qla1280_load_firmware(struct scsi_qla_host *ha) | 1889 | qla1280_load_firmware(struct scsi_qla_host *ha) |
| 1843 | { | 1890 | { |
| 1891 | /* enter with host_lock taken */ | ||
| 1844 | int err; | 1892 | int err; |
| 1845 | 1893 | ||
| 1846 | err = qla1280_chip_diag(ha); | 1894 | err = qla1280_chip_diag(ha); |
| @@ -4419,7 +4467,16 @@ qla1280_init(void) | |||
| 4419 | static void __exit | 4467 | static void __exit |
| 4420 | qla1280_exit(void) | 4468 | qla1280_exit(void) |
| 4421 | { | 4469 | { |
| 4470 | int i; | ||
| 4471 | |||
| 4422 | pci_unregister_driver(&qla1280_pci_driver); | 4472 | pci_unregister_driver(&qla1280_pci_driver); |
| 4473 | /* release any allocated firmware images */ | ||
| 4474 | for (i = 0; i < QL_NUM_FW_IMAGES; i++) { | ||
| 4475 | if (qla1280_fw_tbl[i].fw) { | ||
| 4476 | release_firmware(qla1280_fw_tbl[i].fw); | ||
| 4477 | qla1280_fw_tbl[i].fw = NULL; | ||
| 4478 | } | ||
| 4479 | } | ||
| 4423 | } | 4480 | } |
| 4424 | 4481 | ||
| 4425 | module_init(qla1280_init); | 4482 | module_init(qla1280_init); |
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 29414df87c3d..359e9a71a021 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
| @@ -1275,7 +1275,11 @@ qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr, | |||
| 1275 | int rval = QLA_FUNCTION_FAILED; | 1275 | int rval = QLA_FUNCTION_FAILED; |
| 1276 | uint16_t state[5]; | 1276 | uint16_t state[5]; |
| 1277 | 1277 | ||
| 1278 | if (!vha->hw->flags.eeh_busy) | 1278 | if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) || |
| 1279 | test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags)) | ||
| 1280 | DEBUG2_3_11(printk("%s(%ld): isp reset in progress.\n", | ||
| 1281 | __func__, vha->host_no)); | ||
| 1282 | else if (!vha->hw->flags.eeh_busy) | ||
| 1279 | rval = qla2x00_get_firmware_state(vha, state); | 1283 | rval = qla2x00_get_firmware_state(vha, state); |
| 1280 | if (rval != QLA_SUCCESS) | 1284 | if (rval != QLA_SUCCESS) |
| 1281 | memset(state, -1, sizeof(state)); | 1285 | memset(state, -1, sizeof(state)); |
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index cebf4f1bb7d9..42c5587cc50c 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h | |||
| @@ -1592,10 +1592,22 @@ struct nvram_81xx { | |||
| 1592 | 1592 | ||
| 1593 | /* Offset 384. */ | 1593 | /* Offset 384. */ |
| 1594 | uint8_t reserved_21[16]; | 1594 | uint8_t reserved_21[16]; |
| 1595 | uint16_t reserved_22[8]; | 1595 | uint16_t reserved_22[3]; |
| 1596 | |||
| 1597 | /* | ||
| 1598 | * BIT 0 = Extended BB credits for LR | ||
| 1599 | * BIT 1 = Virtual Fabric Enable | ||
| 1600 | * BIT 2 = Enhanced Features Unused | ||
| 1601 | * BIT 3-7 = Enhanced Features Reserved | ||
| 1602 | */ | ||
| 1603 | /* Enhanced Features */ | ||
| 1604 | uint8_t enhanced_features; | ||
| 1605 | |||
| 1606 | uint8_t reserved_23; | ||
| 1607 | uint16_t reserved_24[4]; | ||
| 1596 | 1608 | ||
| 1597 | /* Offset 416. */ | 1609 | /* Offset 416. */ |
| 1598 | uint16_t reserved_23[32]; | 1610 | uint16_t reserved_25[32]; |
| 1599 | 1611 | ||
| 1600 | /* Offset 480. */ | 1612 | /* Offset 480. */ |
| 1601 | uint8_t model_name[16]; | 1613 | uint8_t model_name[16]; |
| @@ -1603,7 +1615,7 @@ struct nvram_81xx { | |||
| 1603 | /* Offset 496. */ | 1615 | /* Offset 496. */ |
| 1604 | uint16_t feature_mask_l; | 1616 | uint16_t feature_mask_l; |
| 1605 | uint16_t feature_mask_h; | 1617 | uint16_t feature_mask_h; |
| 1606 | uint16_t reserved_24[2]; | 1618 | uint16_t reserved_26[2]; |
| 1607 | 1619 | ||
| 1608 | uint16_t subsystem_vendor_id; | 1620 | uint16_t subsystem_vendor_id; |
| 1609 | uint16_t subsystem_device_id; | 1621 | uint16_t subsystem_device_id; |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 875adb45e751..db539b0c3dae 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
| @@ -621,11 +621,10 @@ skip_rio: | |||
| 621 | * vp_idx does not match | 621 | * vp_idx does not match |
| 622 | * Event is not global, vp_idx does not match | 622 | * Event is not global, vp_idx does not match |
| 623 | */ | 623 | */ |
| 624 | if ((mb[1] == 0xffff && (mb[3] & 0xff) != 0xff) | 624 | if (IS_QLA2XXX_MIDTYPE(ha) && |
| 625 | || (mb[1] != 0xffff)) { | 625 | ((mb[1] == 0xffff && (mb[3] & 0xff) != 0xff) || |
| 626 | if (vha->vp_idx != (mb[3] & 0xff)) | 626 | (mb[1] != 0xffff)) && vha->vp_idx != (mb[3] & 0xff)) |
| 627 | break; | 627 | break; |
| 628 | } | ||
| 629 | 628 | ||
| 630 | /* Global event -- port logout or port unavailable. */ | 629 | /* Global event -- port logout or port unavailable. */ |
| 631 | if (mb[1] == 0xffff && mb[2] == 0x7) { | 630 | if (mb[1] == 0xffff && mb[2] == 0x7) { |
| @@ -2273,30 +2272,28 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp) | |||
| 2273 | 2272 | ||
| 2274 | /* If possible, enable MSI-X. */ | 2273 | /* If possible, enable MSI-X. */ |
| 2275 | if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && | 2274 | if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && |
| 2276 | !IS_QLA8432(ha) && !IS_QLA8001(ha)) | 2275 | !IS_QLA8432(ha) && !IS_QLA8001(ha)) |
| 2277 | goto skip_msix; | 2276 | goto skip_msi; |
| 2277 | |||
| 2278 | if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP && | ||
| 2279 | (ha->pdev->subsystem_device == 0x7040 || | ||
| 2280 | ha->pdev->subsystem_device == 0x7041 || | ||
| 2281 | ha->pdev->subsystem_device == 0x1705)) { | ||
| 2282 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
| 2283 | "MSI-X: Unsupported ISP2432 SSVID/SSDID (0x%X,0x%X).\n", | ||
| 2284 | ha->pdev->subsystem_vendor, | ||
| 2285 | ha->pdev->subsystem_device)); | ||
| 2286 | goto skip_msi; | ||
| 2287 | } | ||
| 2278 | 2288 | ||
| 2279 | if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX || | 2289 | if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX || |
| 2280 | !QLA_MSIX_FW_MODE_1(ha->fw_attributes))) { | 2290 | !QLA_MSIX_FW_MODE_1(ha->fw_attributes))) { |
| 2281 | DEBUG2(qla_printk(KERN_WARNING, ha, | 2291 | DEBUG2(qla_printk(KERN_WARNING, ha, |
| 2282 | "MSI-X: Unsupported ISP2432 (0x%X, 0x%X).\n", | 2292 | "MSI-X: Unsupported ISP2432 (0x%X, 0x%X).\n", |
| 2283 | ha->pdev->revision, ha->fw_attributes)); | 2293 | ha->pdev->revision, ha->fw_attributes)); |
| 2284 | |||
| 2285 | goto skip_msix; | 2294 | goto skip_msix; |
| 2286 | } | 2295 | } |
| 2287 | 2296 | ||
| 2288 | if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP && | ||
| 2289 | (ha->pdev->subsystem_device == 0x7040 || | ||
| 2290 | ha->pdev->subsystem_device == 0x7041 || | ||
| 2291 | ha->pdev->subsystem_device == 0x1705)) { | ||
| 2292 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
| 2293 | "MSI-X: Unsupported ISP2432 SSVID/SSDID (0x%X, 0x%X).\n", | ||
| 2294 | ha->pdev->subsystem_vendor, | ||
| 2295 | ha->pdev->subsystem_device)); | ||
| 2296 | |||
| 2297 | goto skip_msi; | ||
| 2298 | } | ||
| 2299 | |||
| 2300 | ret = qla24xx_enable_msix(ha, rsp); | 2297 | ret = qla24xx_enable_msix(ha, rsp); |
| 2301 | if (!ret) { | 2298 | if (!ret) { |
| 2302 | DEBUG2(qla_printk(KERN_INFO, ha, | 2299 | DEBUG2(qla_printk(KERN_INFO, ha, |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index e95ebab58679..42eb7ffd5942 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
| @@ -340,6 +340,7 @@ qla2x00_load_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t risc_addr, | |||
| 340 | return rval; | 340 | return rval; |
| 341 | } | 341 | } |
| 342 | 342 | ||
| 343 | #define EXTENDED_BB_CREDITS BIT_0 | ||
| 343 | /* | 344 | /* |
| 344 | * qla2x00_execute_fw | 345 | * qla2x00_execute_fw |
| 345 | * Start adapter firmware. | 346 | * Start adapter firmware. |
| @@ -372,7 +373,12 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) | |||
| 372 | mcp->mb[1] = MSW(risc_addr); | 373 | mcp->mb[1] = MSW(risc_addr); |
| 373 | mcp->mb[2] = LSW(risc_addr); | 374 | mcp->mb[2] = LSW(risc_addr); |
| 374 | mcp->mb[3] = 0; | 375 | mcp->mb[3] = 0; |
| 375 | mcp->mb[4] = 0; | 376 | if (IS_QLA81XX(ha)) { |
| 377 | struct nvram_81xx *nv = ha->nvram; | ||
| 378 | mcp->mb[4] = (nv->enhanced_features & | ||
| 379 | EXTENDED_BB_CREDITS); | ||
| 380 | } else | ||
| 381 | mcp->mb[4] = 0; | ||
| 376 | mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1; | 382 | mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1; |
| 377 | mcp->in_mb |= MBX_1; | 383 | mcp->in_mb |= MBX_1; |
| 378 | } else { | 384 | } else { |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index b696cffb82e0..48c37e38ed01 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -1677,9 +1677,11 @@ skip_pio: | |||
| 1677 | 1677 | ||
| 1678 | /* Determine queue resources */ | 1678 | /* Determine queue resources */ |
| 1679 | ha->max_req_queues = ha->max_rsp_queues = 1; | 1679 | ha->max_req_queues = ha->max_rsp_queues = 1; |
| 1680 | if ((ql2xmaxqueues <= 1 || ql2xmultique_tag < 1) && | 1680 | if ((ql2xmaxqueues <= 1 && !ql2xmultique_tag) || |
| 1681 | (ql2xmaxqueues > 1 && ql2xmultique_tag) || | ||
| 1681 | (!IS_QLA25XX(ha) && !IS_QLA81XX(ha))) | 1682 | (!IS_QLA25XX(ha) && !IS_QLA81XX(ha))) |
| 1682 | goto mqiobase_exit; | 1683 | goto mqiobase_exit; |
| 1684 | |||
| 1683 | ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 3), | 1685 | ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 3), |
| 1684 | pci_resource_len(ha->pdev, 3)); | 1686 | pci_resource_len(ha->pdev, 3)); |
| 1685 | if (ha->mqiobase) { | 1687 | if (ha->mqiobase) { |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index 8d2fc2fa7a6b..109068df933f 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
| @@ -7,9 +7,9 @@ | |||
| 7 | /* | 7 | /* |
| 8 | * Driver version | 8 | * Driver version |
| 9 | */ | 9 | */ |
| 10 | #define QLA2XXX_VERSION "8.03.02-k1" | 10 | #define QLA2XXX_VERSION "8.03.02-k2" |
| 11 | 11 | ||
| 12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
| 13 | #define QLA_DRIVER_MINOR_VER 3 | 13 | #define QLA_DRIVER_MINOR_VER 3 |
| 14 | #define QLA_DRIVER_PATCH_VER 2 | 14 | #define QLA_DRIVER_PATCH_VER 2 |
| 15 | #define QLA_DRIVER_BETA_VER 1 | 15 | #define QLA_DRIVER_BETA_VER 2 |
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index a895a0e76d13..6cfffc88022a 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
| @@ -3853,7 +3853,7 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost, | |||
| 3853 | if (rport && (rport->port_state != FC_PORTSTATE_ONLINE)) { | 3853 | if (rport && (rport->port_state != FC_PORTSTATE_ONLINE)) { |
| 3854 | req->errors = -ENXIO; | 3854 | req->errors = -ENXIO; |
| 3855 | spin_unlock_irq(q->queue_lock); | 3855 | spin_unlock_irq(q->queue_lock); |
| 3856 | blk_end_request(req, -ENXIO, blk_rq_bytes(req)); | 3856 | blk_end_request_all(req, -ENXIO); |
| 3857 | spin_lock_irq(q->queue_lock); | 3857 | spin_lock_irq(q->queue_lock); |
| 3858 | continue; | 3858 | continue; |
| 3859 | } | 3859 | } |
| @@ -3863,7 +3863,7 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost, | |||
| 3863 | ret = fc_req_to_bsgjob(shost, rport, req); | 3863 | ret = fc_req_to_bsgjob(shost, rport, req); |
| 3864 | if (ret) { | 3864 | if (ret) { |
| 3865 | req->errors = ret; | 3865 | req->errors = ret; |
| 3866 | blk_end_request(req, ret, blk_rq_bytes(req)); | 3866 | blk_end_request_all(req, ret); |
| 3867 | spin_lock_irq(q->queue_lock); | 3867 | spin_lock_irq(q->queue_lock); |
| 3868 | continue; | 3868 | continue; |
| 3869 | } | 3869 | } |
