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
This commit is contained in:
commit
7da23b86e1
|
@ -328,6 +328,7 @@ attribute_container_add_attrs(struct device *classdev)
|
||||||
return sysfs_create_group(&classdev->kobj, cont->grp);
|
return sysfs_create_group(&classdev->kobj, cont->grp);
|
||||||
|
|
||||||
for (i = 0; attrs[i]; i++) {
|
for (i = 0; attrs[i]; i++) {
|
||||||
|
sysfs_attr_init(&attrs[i]->attr);
|
||||||
error = device_create_file(classdev, attrs[i]);
|
error = device_create_file(classdev, attrs[i]);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -4781,12 +4781,14 @@ static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||||
fwname, err);
|
fwname, err);
|
||||||
|
asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
if (fw->size < 4) {
|
if (fw->size < 4) {
|
||||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
||||||
fw->size, fwname);
|
fw->size, fwname);
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
||||||
|
@ -5110,12 +5112,14 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||||
fwname, err);
|
fwname, err);
|
||||||
|
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
if (fw->size < 4) {
|
if (fw->size < 4) {
|
||||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
||||||
fw->size, fwname);
|
fw->size, fwname);
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
||||||
|
@ -5624,12 +5628,14 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||||
fwname, err);
|
fwname, err);
|
||||||
|
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
if (fw->size < 4) {
|
if (fw->size < 4) {
|
||||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
||||||
fw->size, fwname);
|
fw->size, fwname);
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
||||||
|
@ -6124,12 +6130,14 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||||
fwname, err);
|
fwname, err);
|
||||||
|
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
if (fw->size < 4) {
|
if (fw->size < 4) {
|
||||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
||||||
fw->size, fwname);
|
fw->size, fwname);
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
||||||
|
|
|
@ -3088,14 +3088,15 @@ static void iscsi_start_session_recovery(struct iscsi_session *session,
|
||||||
session->state = ISCSI_STATE_TERMINATE;
|
session->state = ISCSI_STATE_TERMINATE;
|
||||||
else if (conn->stop_stage != STOP_CONN_RECOVER)
|
else if (conn->stop_stage != STOP_CONN_RECOVER)
|
||||||
session->state = ISCSI_STATE_IN_RECOVERY;
|
session->state = ISCSI_STATE_IN_RECOVERY;
|
||||||
|
|
||||||
|
old_stop_stage = conn->stop_stage;
|
||||||
|
conn->stop_stage = flag;
|
||||||
spin_unlock_bh(&session->lock);
|
spin_unlock_bh(&session->lock);
|
||||||
|
|
||||||
del_timer_sync(&conn->transport_timer);
|
del_timer_sync(&conn->transport_timer);
|
||||||
iscsi_suspend_tx(conn);
|
iscsi_suspend_tx(conn);
|
||||||
|
|
||||||
spin_lock_bh(&session->lock);
|
spin_lock_bh(&session->lock);
|
||||||
old_stop_stage = conn->stop_stage;
|
|
||||||
conn->stop_stage = flag;
|
|
||||||
conn->c_stage = ISCSI_CONN_STOPPED;
|
conn->c_stage = ISCSI_CONN_STOPPED;
|
||||||
spin_unlock_bh(&session->lock);
|
spin_unlock_bh(&session->lock);
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,11 @@
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
#define QLA1280_VERSION "3.27"
|
#define QLA1280_VERSION "3.27.1"
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
Revision History:
|
Revision History:
|
||||||
|
Rev 3.27.1, February 8, 2010, Michael Reed
|
||||||
|
- Retain firmware image for error recovery.
|
||||||
Rev 3.27, February 10, 2009, Michael Reed
|
Rev 3.27, February 10, 2009, Michael Reed
|
||||||
- General code cleanup.
|
- General code cleanup.
|
||||||
- Improve error recovery.
|
- Improve error recovery.
|
||||||
|
@ -537,9 +539,9 @@ __setup("qla1280=", qla1280_setup);
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
|
|
||||||
struct qla_boards {
|
struct qla_boards {
|
||||||
unsigned char name[9]; /* Board ID String */
|
char *name; /* Board ID String */
|
||||||
int numPorts; /* Number of SCSI ports */
|
int numPorts; /* Number of SCSI ports */
|
||||||
char *fwname; /* firmware name */
|
int fw_index; /* index into qla1280_fw_tbl for firmware */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* NOTE: the last argument in each entry is used to index ql1280_board_tbl */
|
/* 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[] = {
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(pci, qla1280_pci_tbl);
|
MODULE_DEVICE_TABLE(pci, qla1280_pci_tbl);
|
||||||
|
|
||||||
|
DEFINE_MUTEX(qla1280_firmware_mutex);
|
||||||
|
|
||||||
|
struct qla_fw {
|
||||||
|
char *fwname;
|
||||||
|
const struct firmware *fw;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define QL_NUM_FW_IMAGES 3
|
||||||
|
|
||||||
|
struct qla_fw qla1280_fw_tbl[QL_NUM_FW_IMAGES] = {
|
||||||
|
{"qlogic/1040.bin", NULL}, /* image 0 */
|
||||||
|
{"qlogic/1280.bin", NULL}, /* image 1 */
|
||||||
|
{"qlogic/12160.bin", NULL}, /* image 2 */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* NOTE: Order of boards in this table must match order in qla1280_pci_tbl */
|
||||||
static struct qla_boards ql1280_board_tbl[] = {
|
static struct qla_boards ql1280_board_tbl[] = {
|
||||||
/* Name , Number of ports, FW details */
|
{.name = "QLA12160", .numPorts = 2, .fw_index = 2},
|
||||||
{"QLA12160", 2, "qlogic/12160.bin"},
|
{.name = "QLA1040" , .numPorts = 1, .fw_index = 0},
|
||||||
{"QLA1040", 1, "qlogic/1040.bin"},
|
{.name = "QLA1080" , .numPorts = 1, .fw_index = 1},
|
||||||
{"QLA1080", 1, "qlogic/1280.bin"},
|
{.name = "QLA1240" , .numPorts = 2, .fw_index = 1},
|
||||||
{"QLA1240", 2, "qlogic/1280.bin"},
|
{.name = "QLA1280" , .numPorts = 2, .fw_index = 1},
|
||||||
{"QLA1280", 2, "qlogic/1280.bin"},
|
{.name = "QLA10160", .numPorts = 1, .fw_index = 2},
|
||||||
{"QLA10160", 1, "qlogic/12160.bin"},
|
{.name = " ", .numPorts = 0, .fw_index = -1},
|
||||||
{" ", 0, " "},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int qla1280_verbose = 1;
|
static int qla1280_verbose = 1;
|
||||||
|
@ -1510,6 +1527,63 @@ qla1280_initialize_adapter(struct scsi_qla_host *ha)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* qla1280_request_firmware
|
||||||
|
* Acquire firmware for chip. Retain in memory
|
||||||
|
* for error recovery.
|
||||||
|
*
|
||||||
|
* Input:
|
||||||
|
* ha = adapter block pointer.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* Pointer to firmware image or an error code
|
||||||
|
* cast to pointer via ERR_PTR().
|
||||||
|
*/
|
||||||
|
static const struct firmware *
|
||||||
|
qla1280_request_firmware(struct scsi_qla_host *ha)
|
||||||
|
{
|
||||||
|
const struct firmware *fw;
|
||||||
|
int err;
|
||||||
|
int index;
|
||||||
|
char *fwname;
|
||||||
|
|
||||||
|
spin_unlock_irq(ha->host->host_lock);
|
||||||
|
mutex_lock(&qla1280_firmware_mutex);
|
||||||
|
|
||||||
|
index = ql1280_board_tbl[ha->devnum].fw_index;
|
||||||
|
fw = qla1280_fw_tbl[index].fw;
|
||||||
|
if (fw)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
fwname = qla1280_fw_tbl[index].fwname;
|
||||||
|
err = request_firmware(&fw, fwname, &ha->pdev->dev);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||||
|
fwname, err);
|
||||||
|
fw = ERR_PTR(err);
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
if ((fw->size % 2) || (fw->size < 6)) {
|
||||||
|
printk(KERN_ERR "Invalid firmware length %zu in image \"%s\"\n",
|
||||||
|
fw->size, fwname);
|
||||||
|
release_firmware(fw);
|
||||||
|
fw = ERR_PTR(-EINVAL);
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
qla1280_fw_tbl[index].fw = fw;
|
||||||
|
|
||||||
|
out:
|
||||||
|
ha->fwver1 = fw->data[0];
|
||||||
|
ha->fwver2 = fw->data[1];
|
||||||
|
ha->fwver3 = fw->data[2];
|
||||||
|
unlock:
|
||||||
|
mutex_unlock(&qla1280_firmware_mutex);
|
||||||
|
spin_lock_irq(ha->host->host_lock);
|
||||||
|
return fw;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Chip diagnostics
|
* Chip diagnostics
|
||||||
* Test chip for proper operation.
|
* Test chip for proper operation.
|
||||||
|
@ -1633,30 +1707,18 @@ qla1280_chip_diag(struct scsi_qla_host *ha)
|
||||||
static int
|
static int
|
||||||
qla1280_load_firmware_pio(struct scsi_qla_host *ha)
|
qla1280_load_firmware_pio(struct scsi_qla_host *ha)
|
||||||
{
|
{
|
||||||
|
/* enter with host_lock acquired */
|
||||||
|
|
||||||
const struct firmware *fw;
|
const struct firmware *fw;
|
||||||
const __le16 *fw_data;
|
const __le16 *fw_data;
|
||||||
uint16_t risc_address, risc_code_size;
|
uint16_t risc_address, risc_code_size;
|
||||||
uint16_t mb[MAILBOX_REGISTER_COUNT], i;
|
uint16_t mb[MAILBOX_REGISTER_COUNT], i;
|
||||||
int err;
|
int err = 0;
|
||||||
|
|
||||||
|
fw = qla1280_request_firmware(ha);
|
||||||
|
if (IS_ERR(fw))
|
||||||
|
return PTR_ERR(fw);
|
||||||
|
|
||||||
spin_unlock_irq(ha->host->host_lock);
|
|
||||||
err = request_firmware(&fw, ql1280_board_tbl[ha->devnum].fwname,
|
|
||||||
&ha->pdev->dev);
|
|
||||||
spin_lock_irq(ha->host->host_lock);
|
|
||||||
if (err) {
|
|
||||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
|
||||||
ql1280_board_tbl[ha->devnum].fwname, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if ((fw->size % 2) || (fw->size < 6)) {
|
|
||||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
|
||||||
fw->size, ql1280_board_tbl[ha->devnum].fwname);
|
|
||||||
err = -EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ha->fwver1 = fw->data[0];
|
|
||||||
ha->fwver2 = fw->data[1];
|
|
||||||
ha->fwver3 = fw->data[2];
|
|
||||||
fw_data = (const __le16 *)&fw->data[0];
|
fw_data = (const __le16 *)&fw->data[0];
|
||||||
ha->fwstart = __le16_to_cpu(fw_data[2]);
|
ha->fwstart = __le16_to_cpu(fw_data[2]);
|
||||||
|
|
||||||
|
@ -1674,11 +1736,10 @@ qla1280_load_firmware_pio(struct scsi_qla_host *ha)
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "scsi(%li): Failed to load firmware\n",
|
printk(KERN_ERR "scsi(%li): Failed to load firmware\n",
|
||||||
ha->host_no);
|
ha->host_no);
|
||||||
goto out;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out:
|
|
||||||
release_firmware(fw);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1686,6 +1747,7 @@ out:
|
||||||
static int
|
static int
|
||||||
qla1280_load_firmware_dma(struct scsi_qla_host *ha)
|
qla1280_load_firmware_dma(struct scsi_qla_host *ha)
|
||||||
{
|
{
|
||||||
|
/* enter with host_lock acquired */
|
||||||
const struct firmware *fw;
|
const struct firmware *fw;
|
||||||
const __le16 *fw_data;
|
const __le16 *fw_data;
|
||||||
uint16_t risc_address, risc_code_size;
|
uint16_t risc_address, risc_code_size;
|
||||||
|
@ -1700,24 +1762,10 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
spin_unlock_irq(ha->host->host_lock);
|
fw = qla1280_request_firmware(ha);
|
||||||
err = request_firmware(&fw, ql1280_board_tbl[ha->devnum].fwname,
|
if (IS_ERR(fw))
|
||||||
&ha->pdev->dev);
|
return PTR_ERR(fw);
|
||||||
spin_lock_irq(ha->host->host_lock);
|
|
||||||
if (err) {
|
|
||||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
|
||||||
ql1280_board_tbl[ha->devnum].fwname, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if ((fw->size % 2) || (fw->size < 6)) {
|
|
||||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
|
||||||
fw->size, ql1280_board_tbl[ha->devnum].fwname);
|
|
||||||
err = -EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ha->fwver1 = fw->data[0];
|
|
||||||
ha->fwver2 = fw->data[1];
|
|
||||||
ha->fwver3 = fw->data[2];
|
|
||||||
fw_data = (const __le16 *)&fw->data[0];
|
fw_data = (const __le16 *)&fw->data[0];
|
||||||
ha->fwstart = __le16_to_cpu(fw_data[2]);
|
ha->fwstart = __le16_to_cpu(fw_data[2]);
|
||||||
|
|
||||||
|
@ -1802,7 +1850,6 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
|
||||||
#if DUMP_IT_BACK
|
#if DUMP_IT_BACK
|
||||||
pci_free_consistent(ha->pdev, 8000, tbuf, p_tbuf);
|
pci_free_consistent(ha->pdev, 8000, tbuf, p_tbuf);
|
||||||
#endif
|
#endif
|
||||||
release_firmware(fw);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1841,6 +1888,7 @@ qla1280_start_firmware(struct scsi_qla_host *ha)
|
||||||
static int
|
static int
|
||||||
qla1280_load_firmware(struct scsi_qla_host *ha)
|
qla1280_load_firmware(struct scsi_qla_host *ha)
|
||||||
{
|
{
|
||||||
|
/* enter with host_lock taken */
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = qla1280_chip_diag(ha);
|
err = qla1280_chip_diag(ha);
|
||||||
|
@ -4419,7 +4467,16 @@ qla1280_init(void)
|
||||||
static void __exit
|
static void __exit
|
||||||
qla1280_exit(void)
|
qla1280_exit(void)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
pci_unregister_driver(&qla1280_pci_driver);
|
pci_unregister_driver(&qla1280_pci_driver);
|
||||||
|
/* release any allocated firmware images */
|
||||||
|
for (i = 0; i < QL_NUM_FW_IMAGES; i++) {
|
||||||
|
if (qla1280_fw_tbl[i].fw) {
|
||||||
|
release_firmware(qla1280_fw_tbl[i].fw);
|
||||||
|
qla1280_fw_tbl[i].fw = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(qla1280_init);
|
module_init(qla1280_init);
|
||||||
|
|
|
@ -1275,7 +1275,11 @@ qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr,
|
||||||
int rval = QLA_FUNCTION_FAILED;
|
int rval = QLA_FUNCTION_FAILED;
|
||||||
uint16_t state[5];
|
uint16_t state[5];
|
||||||
|
|
||||||
if (!vha->hw->flags.eeh_busy)
|
if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) ||
|
||||||
|
test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags))
|
||||||
|
DEBUG2_3_11(printk("%s(%ld): isp reset in progress.\n",
|
||||||
|
__func__, vha->host_no));
|
||||||
|
else if (!vha->hw->flags.eeh_busy)
|
||||||
rval = qla2x00_get_firmware_state(vha, state);
|
rval = qla2x00_get_firmware_state(vha, state);
|
||||||
if (rval != QLA_SUCCESS)
|
if (rval != QLA_SUCCESS)
|
||||||
memset(state, -1, sizeof(state));
|
memset(state, -1, sizeof(state));
|
||||||
|
|
|
@ -1592,10 +1592,22 @@ struct nvram_81xx {
|
||||||
|
|
||||||
/* Offset 384. */
|
/* Offset 384. */
|
||||||
uint8_t reserved_21[16];
|
uint8_t reserved_21[16];
|
||||||
uint16_t reserved_22[8];
|
uint16_t reserved_22[3];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BIT 0 = Extended BB credits for LR
|
||||||
|
* BIT 1 = Virtual Fabric Enable
|
||||||
|
* BIT 2 = Enhanced Features Unused
|
||||||
|
* BIT 3-7 = Enhanced Features Reserved
|
||||||
|
*/
|
||||||
|
/* Enhanced Features */
|
||||||
|
uint8_t enhanced_features;
|
||||||
|
|
||||||
|
uint8_t reserved_23;
|
||||||
|
uint16_t reserved_24[4];
|
||||||
|
|
||||||
/* Offset 416. */
|
/* Offset 416. */
|
||||||
uint16_t reserved_23[32];
|
uint16_t reserved_25[32];
|
||||||
|
|
||||||
/* Offset 480. */
|
/* Offset 480. */
|
||||||
uint8_t model_name[16];
|
uint8_t model_name[16];
|
||||||
|
@ -1603,7 +1615,7 @@ struct nvram_81xx {
|
||||||
/* Offset 496. */
|
/* Offset 496. */
|
||||||
uint16_t feature_mask_l;
|
uint16_t feature_mask_l;
|
||||||
uint16_t feature_mask_h;
|
uint16_t feature_mask_h;
|
||||||
uint16_t reserved_24[2];
|
uint16_t reserved_26[2];
|
||||||
|
|
||||||
uint16_t subsystem_vendor_id;
|
uint16_t subsystem_vendor_id;
|
||||||
uint16_t subsystem_device_id;
|
uint16_t subsystem_device_id;
|
||||||
|
|
|
@ -621,11 +621,10 @@ skip_rio:
|
||||||
* vp_idx does not match
|
* vp_idx does not match
|
||||||
* Event is not global, vp_idx does not match
|
* Event is not global, vp_idx does not match
|
||||||
*/
|
*/
|
||||||
if ((mb[1] == 0xffff && (mb[3] & 0xff) != 0xff)
|
if (IS_QLA2XXX_MIDTYPE(ha) &&
|
||||||
|| (mb[1] != 0xffff)) {
|
((mb[1] == 0xffff && (mb[3] & 0xff) != 0xff) ||
|
||||||
if (vha->vp_idx != (mb[3] & 0xff))
|
(mb[1] != 0xffff)) && vha->vp_idx != (mb[3] & 0xff))
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
/* Global event -- port logout or port unavailable. */
|
/* Global event -- port logout or port unavailable. */
|
||||||
if (mb[1] == 0xffff && mb[2] == 0x7) {
|
if (mb[1] == 0xffff && mb[2] == 0x7) {
|
||||||
|
@ -2273,30 +2272,28 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
|
||||||
|
|
||||||
/* If possible, enable MSI-X. */
|
/* If possible, enable MSI-X. */
|
||||||
if (!IS_QLA2432(ha) && !IS_QLA2532(ha) &&
|
if (!IS_QLA2432(ha) && !IS_QLA2532(ha) &&
|
||||||
!IS_QLA8432(ha) && !IS_QLA8001(ha))
|
!IS_QLA8432(ha) && !IS_QLA8001(ha))
|
||||||
goto skip_msix;
|
goto skip_msi;
|
||||||
|
|
||||||
|
if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
|
||||||
|
(ha->pdev->subsystem_device == 0x7040 ||
|
||||||
|
ha->pdev->subsystem_device == 0x7041 ||
|
||||||
|
ha->pdev->subsystem_device == 0x1705)) {
|
||||||
|
DEBUG2(qla_printk(KERN_WARNING, ha,
|
||||||
|
"MSI-X: Unsupported ISP2432 SSVID/SSDID (0x%X,0x%X).\n",
|
||||||
|
ha->pdev->subsystem_vendor,
|
||||||
|
ha->pdev->subsystem_device));
|
||||||
|
goto skip_msi;
|
||||||
|
}
|
||||||
|
|
||||||
if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX ||
|
if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX ||
|
||||||
!QLA_MSIX_FW_MODE_1(ha->fw_attributes))) {
|
!QLA_MSIX_FW_MODE_1(ha->fw_attributes))) {
|
||||||
DEBUG2(qla_printk(KERN_WARNING, ha,
|
DEBUG2(qla_printk(KERN_WARNING, ha,
|
||||||
"MSI-X: Unsupported ISP2432 (0x%X, 0x%X).\n",
|
"MSI-X: Unsupported ISP2432 (0x%X, 0x%X).\n",
|
||||||
ha->pdev->revision, ha->fw_attributes));
|
ha->pdev->revision, ha->fw_attributes));
|
||||||
|
|
||||||
goto skip_msix;
|
goto skip_msix;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
|
|
||||||
(ha->pdev->subsystem_device == 0x7040 ||
|
|
||||||
ha->pdev->subsystem_device == 0x7041 ||
|
|
||||||
ha->pdev->subsystem_device == 0x1705)) {
|
|
||||||
DEBUG2(qla_printk(KERN_WARNING, ha,
|
|
||||||
"MSI-X: Unsupported ISP2432 SSVID/SSDID (0x%X, 0x%X).\n",
|
|
||||||
ha->pdev->subsystem_vendor,
|
|
||||||
ha->pdev->subsystem_device));
|
|
||||||
|
|
||||||
goto skip_msi;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = qla24xx_enable_msix(ha, rsp);
|
ret = qla24xx_enable_msix(ha, rsp);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
DEBUG2(qla_printk(KERN_INFO, ha,
|
DEBUG2(qla_printk(KERN_INFO, ha,
|
||||||
|
|
|
@ -340,6 +340,7 @@ qla2x00_load_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t risc_addr,
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define EXTENDED_BB_CREDITS BIT_0
|
||||||
/*
|
/*
|
||||||
* qla2x00_execute_fw
|
* qla2x00_execute_fw
|
||||||
* Start adapter firmware.
|
* Start adapter firmware.
|
||||||
|
@ -372,7 +373,12 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)
|
||||||
mcp->mb[1] = MSW(risc_addr);
|
mcp->mb[1] = MSW(risc_addr);
|
||||||
mcp->mb[2] = LSW(risc_addr);
|
mcp->mb[2] = LSW(risc_addr);
|
||||||
mcp->mb[3] = 0;
|
mcp->mb[3] = 0;
|
||||||
mcp->mb[4] = 0;
|
if (IS_QLA81XX(ha)) {
|
||||||
|
struct nvram_81xx *nv = ha->nvram;
|
||||||
|
mcp->mb[4] = (nv->enhanced_features &
|
||||||
|
EXTENDED_BB_CREDITS);
|
||||||
|
} else
|
||||||
|
mcp->mb[4] = 0;
|
||||||
mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1;
|
mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1;
|
||||||
mcp->in_mb |= MBX_1;
|
mcp->in_mb |= MBX_1;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1677,9 +1677,11 @@ skip_pio:
|
||||||
|
|
||||||
/* Determine queue resources */
|
/* Determine queue resources */
|
||||||
ha->max_req_queues = ha->max_rsp_queues = 1;
|
ha->max_req_queues = ha->max_rsp_queues = 1;
|
||||||
if ((ql2xmaxqueues <= 1 || ql2xmultique_tag < 1) &&
|
if ((ql2xmaxqueues <= 1 && !ql2xmultique_tag) ||
|
||||||
|
(ql2xmaxqueues > 1 && ql2xmultique_tag) ||
|
||||||
(!IS_QLA25XX(ha) && !IS_QLA81XX(ha)))
|
(!IS_QLA25XX(ha) && !IS_QLA81XX(ha)))
|
||||||
goto mqiobase_exit;
|
goto mqiobase_exit;
|
||||||
|
|
||||||
ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 3),
|
ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 3),
|
||||||
pci_resource_len(ha->pdev, 3));
|
pci_resource_len(ha->pdev, 3));
|
||||||
if (ha->mqiobase) {
|
if (ha->mqiobase) {
|
||||||
|
|
|
@ -7,9 +7,9 @@
|
||||||
/*
|
/*
|
||||||
* Driver version
|
* Driver version
|
||||||
*/
|
*/
|
||||||
#define QLA2XXX_VERSION "8.03.02-k1"
|
#define QLA2XXX_VERSION "8.03.02-k2"
|
||||||
|
|
||||||
#define QLA_DRIVER_MAJOR_VER 8
|
#define QLA_DRIVER_MAJOR_VER 8
|
||||||
#define QLA_DRIVER_MINOR_VER 3
|
#define QLA_DRIVER_MINOR_VER 3
|
||||||
#define QLA_DRIVER_PATCH_VER 2
|
#define QLA_DRIVER_PATCH_VER 2
|
||||||
#define QLA_DRIVER_BETA_VER 1
|
#define QLA_DRIVER_BETA_VER 2
|
||||||
|
|
|
@ -3853,7 +3853,7 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost,
|
||||||
if (rport && (rport->port_state != FC_PORTSTATE_ONLINE)) {
|
if (rport && (rport->port_state != FC_PORTSTATE_ONLINE)) {
|
||||||
req->errors = -ENXIO;
|
req->errors = -ENXIO;
|
||||||
spin_unlock_irq(q->queue_lock);
|
spin_unlock_irq(q->queue_lock);
|
||||||
blk_end_request(req, -ENXIO, blk_rq_bytes(req));
|
blk_end_request_all(req, -ENXIO);
|
||||||
spin_lock_irq(q->queue_lock);
|
spin_lock_irq(q->queue_lock);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -3863,7 +3863,7 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost,
|
||||||
ret = fc_req_to_bsgjob(shost, rport, req);
|
ret = fc_req_to_bsgjob(shost, rport, req);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
req->errors = ret;
|
req->errors = ret;
|
||||||
blk_end_request(req, ret, blk_rq_bytes(req));
|
blk_end_request_all(req, ret);
|
||||||
spin_lock_irq(q->queue_lock);
|
spin_lock_irq(q->queue_lock);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue