SCSI fixes on 20130412
This is a set of ten bug fixes (and two consisting of copyright year update and version number change) pretty much all of which involve either a crash or a hang except the removal of the random sleep from the qla2xxx driver (which is a coding error so bad, we want it gone before anyone has a chance to copy it). Signed-off-by: James Bottomley <JBottomley@Parallels.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQEcBAABAgAGBQJRaE+2AAoJEDeqqVYsXL0MeuoH/2kwVhnqMrlzu+5ROY+0+MsY 7rqSJImGvEWYAU/MawV1ujV0rMpxupZ1qMJvRtcZapyiMtz/Ms9lVm4YIqdPWnIr HCxSIviC5RtAkRObFX6vQoYXhRL73TyyndV/1lM363sDyLgIKfb6F3F7jsPV04DI 28AqIzi7tVfhgLhI4whcbVGxocqldbwmJehZPVqzNskPbj/7l2S21IVezc9jwIhz LjP6kYr9l9NtSDI2XvjiQ0TMTpJs+F+9rR1cPuT8CcEIzOBSql2Vpi186qO97rdI owzzLKrm/jo7bjMkIuaf7FbGw+l5TjteR71KVRTaYgqotRRd7W1UT6A7xjqM4EI= =6vuV -----END PGP SIGNATURE----- Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI fixes from James Bottomley: "This is a set of ten bug fixes (and two consisting of copyright year update and version number change) pretty much all of which involve either a crash or a hang except the removal of the random sleep from the qla2xxx driver (which is a coding error so bad, we want it gone before anyone has a chance to copy it)." * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: [SCSI] lpfc: fix potential NULL pointer dereference in lpfc_sli4_rq_put() [SCSI] libsas: fix handling vacant phy in sas_set_ex_phy() [SCSI] ibmvscsi: Fix slave_configure deadlock [SCSI] qla2xxx: Update the driver version to 8.04.00.13-k. [SCSI] qla2xxx: Remove debug code that msleeps for random duration. [SCSI] qla2xxx: Update copyright dates information in LICENSE.qla2xxx file. [SCSI] qla2xxx: Fix crash during firmware dump procedure. [SCSI] Revert "qla2xxx: Add setting of driver version string for vendor application." [SCSI] ipr: dlpar failed when adding an adapter back [SCSI] ipr: fix addition of abort command to HRRQ free queue [SCSI] st: Take additional queue ref in st_probe [SCSI] libsas: use right function to alloc smp response [SCSI] ipr: ipr_test_msi() fails when running with msi-x enabled adapter
This commit is contained in:
commit
90f340e22c
@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2003-2012 QLogic Corporation
|
Copyright (c) 2003-2013 QLogic Corporation
|
||||||
QLogic Linux FC-FCoE Driver
|
QLogic Linux FC-FCoE Driver
|
||||||
|
|
||||||
This program includes a device driver for Linux 3.x.
|
This program includes a device driver for Linux 3.x.
|
||||||
|
@ -1899,8 +1899,8 @@ static int ibmvscsi_slave_configure(struct scsi_device *sdev)
|
|||||||
sdev->allow_restart = 1;
|
sdev->allow_restart = 1;
|
||||||
blk_queue_rq_timeout(sdev->request_queue, 120 * HZ);
|
blk_queue_rq_timeout(sdev->request_queue, 120 * HZ);
|
||||||
}
|
}
|
||||||
scsi_adjust_queue_depth(sdev, 0, shost->cmd_per_lun);
|
|
||||||
spin_unlock_irqrestore(shost->host_lock, lock_flags);
|
spin_unlock_irqrestore(shost->host_lock, lock_flags);
|
||||||
|
scsi_adjust_queue_depth(sdev, 0, shost->cmd_per_lun);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5148,7 +5148,7 @@ static int ipr_cancel_op(struct scsi_cmnd *scsi_cmd)
|
|||||||
ipr_trace;
|
ipr_trace;
|
||||||
}
|
}
|
||||||
|
|
||||||
list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q);
|
list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
|
||||||
if (!ipr_is_naca_model(res))
|
if (!ipr_is_naca_model(res))
|
||||||
res->needs_sync_complete = 1;
|
res->needs_sync_complete = 1;
|
||||||
|
|
||||||
@ -9349,7 +9349,10 @@ static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev)
|
|||||||
int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
|
int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
|
||||||
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
||||||
|
|
||||||
rc = request_irq(pdev->irq, ipr_test_intr, 0, IPR_NAME, ioa_cfg);
|
if (ioa_cfg->intr_flag == IPR_USE_MSIX)
|
||||||
|
rc = request_irq(ioa_cfg->vectors_info[0].vec, ipr_test_intr, 0, IPR_NAME, ioa_cfg);
|
||||||
|
else
|
||||||
|
rc = request_irq(pdev->irq, ipr_test_intr, 0, IPR_NAME, ioa_cfg);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
dev_err(&pdev->dev, "Can not assign irq %d\n", pdev->irq);
|
dev_err(&pdev->dev, "Can not assign irq %d\n", pdev->irq);
|
||||||
return rc;
|
return rc;
|
||||||
@ -9371,7 +9374,10 @@ static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev)
|
|||||||
|
|
||||||
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
||||||
|
|
||||||
free_irq(pdev->irq, ioa_cfg);
|
if (ioa_cfg->intr_flag == IPR_USE_MSIX)
|
||||||
|
free_irq(ioa_cfg->vectors_info[0].vec, ioa_cfg);
|
||||||
|
else
|
||||||
|
free_irq(pdev->irq, ioa_cfg);
|
||||||
|
|
||||||
LEAVE;
|
LEAVE;
|
||||||
|
|
||||||
@ -9722,6 +9728,7 @@ static void __ipr_remove(struct pci_dev *pdev)
|
|||||||
spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
|
spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
|
||||||
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
|
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
|
||||||
flush_work(&ioa_cfg->work_q);
|
flush_work(&ioa_cfg->work_q);
|
||||||
|
INIT_LIST_HEAD(&ioa_cfg->used_res_q);
|
||||||
spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
|
spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
|
||||||
|
|
||||||
spin_lock(&ipr_driver_lock);
|
spin_lock(&ipr_driver_lock);
|
||||||
|
@ -235,6 +235,17 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp)
|
|||||||
linkrate = phy->linkrate;
|
linkrate = phy->linkrate;
|
||||||
memcpy(sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
|
memcpy(sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
|
||||||
|
|
||||||
|
/* Handle vacant phy - rest of dr data is not valid so skip it */
|
||||||
|
if (phy->phy_state == PHY_VACANT) {
|
||||||
|
memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
|
||||||
|
phy->attached_dev_type = NO_DEVICE;
|
||||||
|
if (!test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) {
|
||||||
|
phy->phy_id = phy_id;
|
||||||
|
goto skip;
|
||||||
|
} else
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
phy->attached_dev_type = to_dev_type(dr);
|
phy->attached_dev_type = to_dev_type(dr);
|
||||||
if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state))
|
if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state))
|
||||||
goto out;
|
goto out;
|
||||||
@ -272,6 +283,7 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp)
|
|||||||
phy->phy->maximum_linkrate = dr->pmax_linkrate;
|
phy->phy->maximum_linkrate = dr->pmax_linkrate;
|
||||||
phy->phy->negotiated_linkrate = phy->linkrate;
|
phy->phy->negotiated_linkrate = phy->linkrate;
|
||||||
|
|
||||||
|
skip:
|
||||||
if (new_phy)
|
if (new_phy)
|
||||||
if (sas_phy_add(phy->phy)) {
|
if (sas_phy_add(phy->phy)) {
|
||||||
sas_phy_free(phy->phy);
|
sas_phy_free(phy->phy);
|
||||||
@ -388,7 +400,7 @@ int sas_ex_phy_discover(struct domain_device *dev, int single)
|
|||||||
if (!disc_req)
|
if (!disc_req)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
disc_resp = alloc_smp_req(DISCOVER_RESP_SIZE);
|
disc_resp = alloc_smp_resp(DISCOVER_RESP_SIZE);
|
||||||
if (!disc_resp) {
|
if (!disc_resp) {
|
||||||
kfree(disc_req);
|
kfree(disc_req);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -438,11 +438,12 @@ lpfc_sli4_rq_put(struct lpfc_queue *hq, struct lpfc_queue *dq,
|
|||||||
struct lpfc_rqe *temp_hrqe;
|
struct lpfc_rqe *temp_hrqe;
|
||||||
struct lpfc_rqe *temp_drqe;
|
struct lpfc_rqe *temp_drqe;
|
||||||
struct lpfc_register doorbell;
|
struct lpfc_register doorbell;
|
||||||
int put_index = hq->host_index;
|
int put_index;
|
||||||
|
|
||||||
/* sanity check on queue memory */
|
/* sanity check on queue memory */
|
||||||
if (unlikely(!hq) || unlikely(!dq))
|
if (unlikely(!hq) || unlikely(!dq))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
put_index = hq->host_index;
|
||||||
temp_hrqe = hq->qe[hq->host_index].rqe;
|
temp_hrqe = hq->qe[hq->host_index].rqe;
|
||||||
temp_drqe = dq->qe[dq->host_index].rqe;
|
temp_drqe = dq->qe[dq->host_index].rqe;
|
||||||
|
|
||||||
|
@ -1938,11 +1938,6 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
|
|||||||
"Timer for the VP[%d] has stopped\n", vha->vp_idx);
|
"Timer for the VP[%d] has stopped\n", vha->vp_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No pending activities shall be there on the vha now */
|
|
||||||
if (ql2xextended_error_logging & ql_dbg_user)
|
|
||||||
msleep(random32()%10); /* Just to see if something falls on
|
|
||||||
* the net we have placed below */
|
|
||||||
|
|
||||||
BUG_ON(atomic_read(&vha->vref_count));
|
BUG_ON(atomic_read(&vha->vref_count));
|
||||||
|
|
||||||
qla2x00_free_fcports(vha);
|
qla2x00_free_fcports(vha);
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
* | Mailbox commands | 0x115b | 0x111a-0x111b |
|
* | Mailbox commands | 0x115b | 0x111a-0x111b |
|
||||||
* | | | 0x112c-0x112e |
|
* | | | 0x112c-0x112e |
|
||||||
* | | | 0x113a |
|
* | | | 0x113a |
|
||||||
|
* | | | 0x1155-0x1158 |
|
||||||
* | Device Discovery | 0x2087 | 0x2020-0x2022, |
|
* | Device Discovery | 0x2087 | 0x2020-0x2022, |
|
||||||
* | | | 0x2016 |
|
* | | | 0x2016 |
|
||||||
* | Queue Command and IO tracing | 0x3031 | 0x3006-0x300b |
|
* | Queue Command and IO tracing | 0x3031 | 0x3006-0x300b |
|
||||||
@ -401,7 +402,7 @@ qla2xxx_copy_atioqueues(struct qla_hw_data *ha, void *ptr,
|
|||||||
void *ring;
|
void *ring;
|
||||||
} aq, *aqp;
|
} aq, *aqp;
|
||||||
|
|
||||||
if (!ha->tgt.atio_q_length)
|
if (!ha->tgt.atio_ring)
|
||||||
return ptr;
|
return ptr;
|
||||||
|
|
||||||
num_queues = 1;
|
num_queues = 1;
|
||||||
|
@ -863,7 +863,6 @@ typedef struct {
|
|||||||
#define MBX_1 BIT_1
|
#define MBX_1 BIT_1
|
||||||
#define MBX_0 BIT_0
|
#define MBX_0 BIT_0
|
||||||
|
|
||||||
#define RNID_TYPE_SET_VERSION 0x9
|
|
||||||
#define RNID_TYPE_ASIC_TEMP 0xC
|
#define RNID_TYPE_ASIC_TEMP 0xC
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -357,9 +357,6 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *, dma_addr_t, uint16_t , uint16_t *,
|
|||||||
extern int
|
extern int
|
||||||
qla2x00_disable_fce_trace(scsi_qla_host_t *, uint64_t *, uint64_t *);
|
qla2x00_disable_fce_trace(scsi_qla_host_t *, uint64_t *, uint64_t *);
|
||||||
|
|
||||||
extern int
|
|
||||||
qla2x00_set_driver_version(scsi_qla_host_t *, char *);
|
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
qla2x00_read_sfp(scsi_qla_host_t *, dma_addr_t, uint8_t *,
|
qla2x00_read_sfp(scsi_qla_host_t *, dma_addr_t, uint8_t *,
|
||||||
uint16_t, uint16_t, uint16_t, uint16_t);
|
uint16_t, uint16_t, uint16_t, uint16_t);
|
||||||
|
@ -619,8 +619,6 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha)
|
|||||||
if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha))
|
if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha))
|
||||||
qla24xx_read_fcp_prio_cfg(vha);
|
qla24xx_read_fcp_prio_cfg(vha);
|
||||||
|
|
||||||
qla2x00_set_driver_version(vha, QLA2XXX_VERSION);
|
|
||||||
|
|
||||||
return (rval);
|
return (rval);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1399,7 +1397,7 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
|
|||||||
mq_size += ha->max_rsp_queues *
|
mq_size += ha->max_rsp_queues *
|
||||||
(rsp->length * sizeof(response_t));
|
(rsp->length * sizeof(response_t));
|
||||||
}
|
}
|
||||||
if (ha->tgt.atio_q_length)
|
if (ha->tgt.atio_ring)
|
||||||
mq_size += ha->tgt.atio_q_length * sizeof(request_t);
|
mq_size += ha->tgt.atio_q_length * sizeof(request_t);
|
||||||
/* Allocate memory for Fibre Channel Event Buffer. */
|
/* Allocate memory for Fibre Channel Event Buffer. */
|
||||||
if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha))
|
if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha))
|
||||||
|
@ -3866,64 +3866,6 @@ qla81xx_restart_mpi_firmware(scsi_qla_host_t *vha)
|
|||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
qla2x00_set_driver_version(scsi_qla_host_t *vha, char *version)
|
|
||||||
{
|
|
||||||
int rval;
|
|
||||||
mbx_cmd_t mc;
|
|
||||||
mbx_cmd_t *mcp = &mc;
|
|
||||||
int len;
|
|
||||||
uint16_t dwlen;
|
|
||||||
uint8_t *str;
|
|
||||||
dma_addr_t str_dma;
|
|
||||||
struct qla_hw_data *ha = vha->hw;
|
|
||||||
|
|
||||||
if (!IS_FWI2_CAPABLE(ha) || IS_QLA82XX(ha))
|
|
||||||
return QLA_FUNCTION_FAILED;
|
|
||||||
|
|
||||||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1155,
|
|
||||||
"Entered %s.\n", __func__);
|
|
||||||
|
|
||||||
str = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &str_dma);
|
|
||||||
if (!str) {
|
|
||||||
ql_log(ql_log_warn, vha, 0x1156,
|
|
||||||
"Failed to allocate driver version param.\n");
|
|
||||||
return QLA_MEMORY_ALLOC_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(str, "\x7\x3\x11\x0", 4);
|
|
||||||
dwlen = str[0];
|
|
||||||
len = dwlen * sizeof(uint32_t) - 4;
|
|
||||||
memset(str + 4, 0, len);
|
|
||||||
if (len > strlen(version))
|
|
||||||
len = strlen(version);
|
|
||||||
memcpy(str + 4, version, len);
|
|
||||||
|
|
||||||
mcp->mb[0] = MBC_SET_RNID_PARAMS;
|
|
||||||
mcp->mb[1] = RNID_TYPE_SET_VERSION << 8 | dwlen;
|
|
||||||
mcp->mb[2] = MSW(LSD(str_dma));
|
|
||||||
mcp->mb[3] = LSW(LSD(str_dma));
|
|
||||||
mcp->mb[6] = MSW(MSD(str_dma));
|
|
||||||
mcp->mb[7] = LSW(MSD(str_dma));
|
|
||||||
mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
|
|
||||||
mcp->in_mb = MBX_0;
|
|
||||||
mcp->tov = MBX_TOV_SECONDS;
|
|
||||||
mcp->flags = 0;
|
|
||||||
rval = qla2x00_mailbox_command(vha, mcp);
|
|
||||||
|
|
||||||
if (rval != QLA_SUCCESS) {
|
|
||||||
ql_dbg(ql_dbg_mbx, vha, 0x1157,
|
|
||||||
"Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
|
|
||||||
} else {
|
|
||||||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1158,
|
|
||||||
"Done %s.\n", __func__);
|
|
||||||
}
|
|
||||||
|
|
||||||
dma_pool_free(ha->s_dma_pool, str, str_dma);
|
|
||||||
|
|
||||||
return rval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qla2x00_read_asic_temperature(scsi_qla_host_t *vha, uint16_t *temp)
|
qla2x00_read_asic_temperature(scsi_qla_host_t *vha, uint16_t *temp)
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
/*
|
/*
|
||||||
* Driver version
|
* Driver version
|
||||||
*/
|
*/
|
||||||
#define QLA2XXX_VERSION "8.04.00.08-k"
|
#define QLA2XXX_VERSION "8.04.00.13-k"
|
||||||
|
|
||||||
#define QLA_DRIVER_MAJOR_VER 8
|
#define QLA_DRIVER_MAJOR_VER 8
|
||||||
#define QLA_DRIVER_MINOR_VER 4
|
#define QLA_DRIVER_MINOR_VER 4
|
||||||
|
@ -4112,6 +4112,10 @@ static int st_probe(struct device *dev)
|
|||||||
tpnt->disk = disk;
|
tpnt->disk = disk;
|
||||||
disk->private_data = &tpnt->driver;
|
disk->private_data = &tpnt->driver;
|
||||||
disk->queue = SDp->request_queue;
|
disk->queue = SDp->request_queue;
|
||||||
|
/* SCSI tape doesn't register this gendisk via add_disk(). Manually
|
||||||
|
* take queue reference that release_disk() expects. */
|
||||||
|
if (!blk_get_queue(disk->queue))
|
||||||
|
goto out_put_disk;
|
||||||
tpnt->driver = &st_template;
|
tpnt->driver = &st_template;
|
||||||
|
|
||||||
tpnt->device = SDp;
|
tpnt->device = SDp;
|
||||||
@ -4185,7 +4189,7 @@ static int st_probe(struct device *dev)
|
|||||||
idr_preload_end();
|
idr_preload_end();
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
pr_warn("st: idr allocation failed: %d\n", error);
|
pr_warn("st: idr allocation failed: %d\n", error);
|
||||||
goto out_put_disk;
|
goto out_put_queue;
|
||||||
}
|
}
|
||||||
tpnt->index = error;
|
tpnt->index = error;
|
||||||
sprintf(disk->disk_name, "st%d", tpnt->index);
|
sprintf(disk->disk_name, "st%d", tpnt->index);
|
||||||
@ -4211,6 +4215,8 @@ out_remove_devs:
|
|||||||
spin_lock(&st_index_lock);
|
spin_lock(&st_index_lock);
|
||||||
idr_remove(&st_index_idr, tpnt->index);
|
idr_remove(&st_index_idr, tpnt->index);
|
||||||
spin_unlock(&st_index_lock);
|
spin_unlock(&st_index_lock);
|
||||||
|
out_put_queue:
|
||||||
|
blk_put_queue(disk->queue);
|
||||||
out_put_disk:
|
out_put_disk:
|
||||||
put_disk(disk);
|
put_disk(disk);
|
||||||
kfree(tpnt);
|
kfree(tpnt);
|
||||||
|
Loading…
Reference in New Issue
Block a user