Commit 2d9b57fb authored by Linus Torvalds's avatar Linus Torvalds

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] qla2xxx: Update version number to 8.02.01-k4.
  [SCSI] qla2xxx: Correct handling of AENs postings for vports.
  [SCSI] qla2xxx: Revert "qla2xxx: Use proper HA during asynchronous event handling."
  [SCSI] ibmvscsi: Non SCSI error status fixup
  [SCSI] fusion mpt: fix target missing after resetting external raid
  [SCSI] fix intermittent oops in scsi_bus_uevent
  [SCSI] qla2xxx: Update version number to 8.02.01-k3.
  [SCSI] qla2xxx: Revert "qla2xxx: Validate mid-layer 'underflow' during check-condition handling."
  [SCSI] qla2xxx: Disable local-interrupts while polling for RISC status.
  [SCSI] qla2xxx: Extend the 'fw_dump' SYSFS node the ability to initiate a firmware dump.
  [SCSI] qla2xxx: Don't depend on mailbox return values while enabling FCE tracing.
  [SCSI] qla2xxx: Convert vport_sem to a mutex
  [SCSI] qla2xxx: firmware semaphore to mutex
  [SCSI] qla2xxx: Correct locking within MSI-X interrupt handlers.
  [SCSI] qla2xxx: Display driver version at module init-time.
  [SCSI] qla2xxx: Return correct port_type to FC-transport for Vports.
parents df6ab559 28d7647d
...@@ -1238,8 +1238,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1238,8 +1238,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
sh->max_id = ioc->pfacts->MaxDevices; sh->max_id = ioc->pfacts->MaxDevices;
sh->max_lun = max_lun; sh->max_lun = max_lun;
sh->this_id = ioc->pfacts[0].PortSCSIID;
/* Required entry. /* Required entry.
*/ */
sh->unique_id = ioc->id; sh->unique_id = ioc->id;
......
...@@ -3193,8 +3193,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -3193,8 +3193,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
sh->transportt = mptsas_transport_template; sh->transportt = mptsas_transport_template;
sh->this_id = ioc->pfacts[0].PortSCSIID;
/* Required entry. /* Required entry.
*/ */
sh->unique_id = ioc->id; sh->unique_id = ioc->id;
......
...@@ -2451,12 +2451,6 @@ mptscsih_slave_configure(struct scsi_device *sdev) ...@@ -2451,12 +2451,6 @@ mptscsih_slave_configure(struct scsi_device *sdev)
ioc->name, sdev->sdtr, sdev->wdtr, ioc->name, sdev->sdtr, sdev->wdtr,
sdev->ppr, sdev->inquiry_len)); sdev->ppr, sdev->inquiry_len));
if (sdev->id > sh->max_id) {
/* error case, should never happen */
scsi_adjust_queue_depth(sdev, 0, 1);
goto slave_configure_exit;
}
vdevice->configured_lun = 1; vdevice->configured_lun = 1;
mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH); mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH);
...@@ -2470,8 +2464,6 @@ mptscsih_slave_configure(struct scsi_device *sdev) ...@@ -2470,8 +2464,6 @@ mptscsih_slave_configure(struct scsi_device *sdev)
ioc->name, vtarget->negoFlags, vtarget->maxOffset, ioc->name, vtarget->negoFlags, vtarget->maxOffset,
vtarget->minSyncFactor)); vtarget->minSyncFactor));
slave_configure_exit:
dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"tagged %d, simple %d, ordered %d\n", "tagged %d, simple %d, ordered %d\n",
ioc->name,sdev->tagged_supported, sdev->simple_tags, ioc->name,sdev->tagged_supported, sdev->simple_tags,
......
...@@ -1348,7 +1348,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq, ...@@ -1348,7 +1348,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq,
del_timer(&evt_struct->timer); del_timer(&evt_struct->timer);
if (crq->status != VIOSRP_OK && evt_struct->cmnd) if ((crq->status != VIOSRP_OK && crq->status != VIOSRP_OK2) && evt_struct->cmnd)
evt_struct->cmnd->result = DID_ERROR << 16; evt_struct->cmnd->result = DID_ERROR << 16;
if (evt_struct->done) if (evt_struct->done)
evt_struct->done(evt_struct); evt_struct->done(evt_struct);
......
...@@ -65,7 +65,8 @@ enum viosrp_crq_status { ...@@ -65,7 +65,8 @@ enum viosrp_crq_status {
VIOSRP_VIOLATES_MAX_XFER = 0x2, VIOSRP_VIOLATES_MAX_XFER = 0x2,
VIOSRP_PARTNER_PANIC = 0x3, VIOSRP_PARTNER_PANIC = 0x3,
VIOSRP_DEVICE_BUSY = 0x8, VIOSRP_DEVICE_BUSY = 0x8,
VIOSRP_ADAPTER_FAIL = 0x10 VIOSRP_ADAPTER_FAIL = 0x10,
VIOSRP_OK2 = 0x99,
}; };
struct viosrp_crq { struct viosrp_crq {
......
...@@ -70,6 +70,9 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj, ...@@ -70,6 +70,9 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj,
case 2: case 2:
qla2x00_alloc_fw_dump(ha); qla2x00_alloc_fw_dump(ha);
break; break;
case 3:
qla2x00_system_error(ha);
break;
} }
return (count); return (count);
} }
...@@ -886,9 +889,13 @@ qla2x00_get_host_speed(struct Scsi_Host *shost) ...@@ -886,9 +889,13 @@ qla2x00_get_host_speed(struct Scsi_Host *shost)
static void static void
qla2x00_get_host_port_type(struct Scsi_Host *shost) qla2x00_get_host_port_type(struct Scsi_Host *shost)
{ {
scsi_qla_host_t *ha = to_qla_parent(shost_priv(shost)); scsi_qla_host_t *ha = shost_priv(shost);
uint32_t port_type = FC_PORTTYPE_UNKNOWN; uint32_t port_type = FC_PORTTYPE_UNKNOWN;
if (ha->parent) {
fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
return;
}
switch (ha->current_topology) { switch (ha->current_topology) {
case ISP_CFG_NL: case ISP_CFG_NL:
port_type = FC_PORTTYPE_LPORT; port_type = FC_PORTTYPE_LPORT;
...@@ -1172,10 +1179,10 @@ qla24xx_vport_delete(struct fc_vport *fc_vport) ...@@ -1172,10 +1179,10 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
qla24xx_disable_vp(vha); qla24xx_disable_vp(vha);
qla24xx_deallocate_vp_id(vha); qla24xx_deallocate_vp_id(vha);
down(&ha->vport_sem); mutex_lock(&ha->vport_lock);
ha->cur_vport_count--; ha->cur_vport_count--;
clear_bit(vha->vp_idx, ha->vp_idx_map); clear_bit(vha->vp_idx, ha->vp_idx_map);
up(&ha->vport_sem); mutex_unlock(&ha->vport_lock);
kfree(vha->node_name); kfree(vha->node_name);
kfree(vha->port_name); kfree(vha->port_name);
......
...@@ -2457,7 +2457,7 @@ typedef struct scsi_qla_host { ...@@ -2457,7 +2457,7 @@ typedef struct scsi_qla_host {
#define MBX_INTR_WAIT 2 #define MBX_INTR_WAIT 2
#define MBX_UPDATE_FLASH_ACTIVE 3 #define MBX_UPDATE_FLASH_ACTIVE 3
struct semaphore vport_sem; /* Virtual port synchronization */ struct mutex vport_lock; /* Virtual port synchronization */
struct completion mbx_cmd_comp; /* Serialize mbx access */ struct completion mbx_cmd_comp; /* Serialize mbx access */
struct completion mbx_intr_comp; /* Used for completion notification */ struct completion mbx_intr_comp; /* Used for completion notification */
......
...@@ -227,6 +227,9 @@ extern int qla24xx_abort_command(scsi_qla_host_t *, srb_t *); ...@@ -227,6 +227,9 @@ extern int qla24xx_abort_command(scsi_qla_host_t *, srb_t *);
extern int qla24xx_abort_target(struct fc_port *, unsigned int); extern int qla24xx_abort_target(struct fc_port *, unsigned int);
extern int qla24xx_lun_reset(struct fc_port *, unsigned int); extern int qla24xx_lun_reset(struct fc_port *, unsigned int);
extern int
qla2x00_system_error(scsi_qla_host_t *);
extern int extern int
qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t); qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t);
......
...@@ -34,7 +34,11 @@ qla2x00_debounce_register(volatile uint16_t __iomem *addr) ...@@ -34,7 +34,11 @@ qla2x00_debounce_register(volatile uint16_t __iomem *addr)
static inline void static inline void
qla2x00_poll(scsi_qla_host_t *ha) qla2x00_poll(scsi_qla_host_t *ha)
{ {
unsigned long flags;
local_irq_save(flags);
ha->isp_ops->intr_handler(0, ha); ha->isp_ops->intr_handler(0, ha);
local_irq_restore(flags);
} }
static __inline__ scsi_qla_host_t * static __inline__ scsi_qla_host_t *
......
...@@ -272,8 +272,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) ...@@ -272,8 +272,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
uint32_t rscn_entry, host_pid; uint32_t rscn_entry, host_pid;
uint8_t rscn_queue_index; uint8_t rscn_queue_index;
unsigned long flags; unsigned long flags;
scsi_qla_host_t *vha;
int i;
/* Setup to process RIO completion. */ /* Setup to process RIO completion. */
handle_cnt = 0; handle_cnt = 0;
...@@ -544,18 +542,10 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) ...@@ -544,18 +542,10 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
break; break;
case MBA_PORT_UPDATE: /* Port database update */ case MBA_PORT_UPDATE: /* Port database update */
if ((ha->flags.npiv_supported) && (ha->num_vhosts)) { /* Only handle SCNs for our Vport index. */
for_each_mapped_vp_idx(ha, i) { if (ha->parent && ha->vp_idx != (mb[3] & 0xff))
list_for_each_entry(vha, &ha->vp_list, break;
vp_list) {
if ((mb[3] & 0xff)
== vha->vp_idx) {
ha = vha;
break;
}
}
}
}
/* /*
* If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET * If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET
* event etc. earlier indicating loop is down) then process * event etc. earlier indicating loop is down) then process
...@@ -590,18 +580,12 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) ...@@ -590,18 +580,12 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
break; break;
case MBA_RSCN_UPDATE: /* State Change Registration */ case MBA_RSCN_UPDATE: /* State Change Registration */
if ((ha->flags.npiv_supported) && (ha->num_vhosts)) { /* Check if the Vport has issued a SCR */
for_each_mapped_vp_idx(ha, i) { if (ha->parent && test_bit(VP_SCR_NEEDED, &ha->vp_flags))
list_for_each_entry(vha, &ha->vp_list, break;
vp_list) { /* Only handle SCNs for our Vport index. */
if ((mb[3] & 0xff) if (ha->parent && ha->vp_idx != (mb[3] & 0xff))
== vha->vp_idx) { break;
ha = vha;
break;
}
}
}
}
DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n", DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n",
ha->host_no)); ha->host_no));
...@@ -1132,25 +1116,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) ...@@ -1132,25 +1116,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
break; break;
qla2x00_handle_sense(sp, sense_data, sense_len); qla2x00_handle_sense(sp, sense_data, sense_len);
/*
* In case of a Underrun condition, set both the lscsi
* status and the completion status to appropriate
* values.
*/
if (resid &&
((unsigned)(scsi_bufflen(cp) - resid) <
cp->underflow)) {
DEBUG2(qla_printk(KERN_INFO, ha,
"scsi(%ld:%d:%d:%d): Mid-layer underflow "
"detected (%x of %x bytes)...returning "
"error status.\n", ha->host_no,
cp->device->channel, cp->device->id,
cp->device->lun, resid,
scsi_bufflen(cp)));
cp->result = DID_ERROR << 16 | lscsi_status;
}
} else { } else {
/* /*
* If RISC reports underrun and target does not report * If RISC reports underrun and target does not report
...@@ -1639,12 +1604,12 @@ qla24xx_msix_rsp_q(int irq, void *dev_id) ...@@ -1639,12 +1604,12 @@ qla24xx_msix_rsp_q(int irq, void *dev_id)
ha = dev_id; ha = dev_id;
reg = &ha->iobase->isp24; reg = &ha->iobase->isp24;
spin_lock(&ha->hardware_lock); spin_lock_irq(&ha->hardware_lock);
qla24xx_process_response_queue(ha); qla24xx_process_response_queue(ha);
WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT); WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
spin_unlock(&ha->hardware_lock); spin_unlock_irq(&ha->hardware_lock);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -1663,7 +1628,7 @@ qla24xx_msix_default(int irq, void *dev_id) ...@@ -1663,7 +1628,7 @@ qla24xx_msix_default(int irq, void *dev_id)
reg = &ha->iobase->isp24; reg = &ha->iobase->isp24;
status = 0; status = 0;
spin_lock(&ha->hardware_lock); spin_lock_irq(&ha->hardware_lock);
do { do {
stat = RD_REG_DWORD(&reg->host_status); stat = RD_REG_DWORD(&reg->host_status);
if (stat & HSRX_RISC_PAUSED) { if (stat & HSRX_RISC_PAUSED) {
...@@ -1716,7 +1681,7 @@ qla24xx_msix_default(int irq, void *dev_id) ...@@ -1716,7 +1681,7 @@ qla24xx_msix_default(int irq, void *dev_id)
} }
WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT); WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
} while (0); } while (0);
spin_unlock(&ha->hardware_lock); spin_unlock_irq(&ha->hardware_lock);
if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
(status & MBX_INTERRUPT) && ha->flags.mbox_int) { (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
......
...@@ -2303,8 +2303,6 @@ qla24xx_lun_reset(struct fc_port *fcport, unsigned int l) ...@@ -2303,8 +2303,6 @@ qla24xx_lun_reset(struct fc_port *fcport, unsigned int l)
return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l); return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l);
} }
#if 0
int int
qla2x00_system_error(scsi_qla_host_t *ha) qla2x00_system_error(scsi_qla_host_t *ha)
{ {
...@@ -2312,7 +2310,7 @@ qla2x00_system_error(scsi_qla_host_t *ha) ...@@ -2312,7 +2310,7 @@ qla2x00_system_error(scsi_qla_host_t *ha)
mbx_cmd_t mc; mbx_cmd_t mc;
mbx_cmd_t *mcp = &mc; mbx_cmd_t *mcp = &mc;
if (!IS_FWI2_CAPABLE(ha)) if (!IS_QLA23XX(ha) && !IS_FWI2_CAPABLE(ha))
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
...@@ -2334,8 +2332,6 @@ qla2x00_system_error(scsi_qla_host_t *ha) ...@@ -2334,8 +2332,6 @@ qla2x00_system_error(scsi_qla_host_t *ha)
return rval; return rval;
} }
#endif /* 0 */
/** /**
* qla2x00_set_serdes_params() - * qla2x00_set_serdes_params() -
* @ha: HA context * @ha: HA context
...@@ -2508,7 +2504,7 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *ha, dma_addr_t fce_dma, ...@@ -2508,7 +2504,7 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *ha, dma_addr_t fce_dma,
if (mb) if (mb)
memcpy(mb, mcp->mb, 8 * sizeof(*mb)); memcpy(mb, mcp->mb, 8 * sizeof(*mb));
if (dwords) if (dwords)
*dwords = mcp->mb[6]; *dwords = buffers;
} }
return rval; return rval;
...@@ -2807,9 +2803,9 @@ qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) ...@@ -2807,9 +2803,9 @@ qla24xx_control_vp(scsi_qla_host_t *vha, int cmd)
*/ */
map = (vp_index - 1) / 8; map = (vp_index - 1) / 8;
pos = (vp_index - 1) & 7; pos = (vp_index - 1) & 7;
down(&ha->vport_sem); mutex_lock(&ha->vport_lock);
vce->vp_idx_map[map] |= 1 << pos; vce->vp_idx_map[map] |= 1 << pos;
up(&ha->vport_sem); mutex_unlock(&ha->vport_lock);
rval = qla2x00_issue_iocb(ha, vce, vce_dma, 0); rval = qla2x00_issue_iocb(ha, vce, vce_dma, 0);
if (rval != QLA_SUCCESS) { if (rval != QLA_SUCCESS) {
......
...@@ -32,12 +32,12 @@ qla24xx_allocate_vp_id(scsi_qla_host_t *vha) ...@@ -32,12 +32,12 @@ qla24xx_allocate_vp_id(scsi_qla_host_t *vha)
scsi_qla_host_t *ha = vha->parent; scsi_qla_host_t *ha = vha->parent;
/* Find an empty slot and assign an vp_id */ /* Find an empty slot and assign an vp_id */
down(&ha->vport_sem); mutex_lock(&ha->vport_lock);
vp_id = find_first_zero_bit(ha->vp_idx_map, ha->max_npiv_vports + 1); vp_id = find_first_zero_bit(ha->vp_idx_map, ha->max_npiv_vports + 1);
if (vp_id > ha->max_npiv_vports) { if (vp_id > ha->max_npiv_vports) {
DEBUG15(printk ("vp_id %d is bigger than max-supported %d.\n", DEBUG15(printk ("vp_id %d is bigger than max-supported %d.\n",
vp_id, ha->max_npiv_vports)); vp_id, ha->max_npiv_vports));
up(&ha->vport_sem); mutex_unlock(&ha->vport_lock);
return vp_id; return vp_id;
} }
...@@ -45,7 +45,7 @@ qla24xx_allocate_vp_id(scsi_qla_host_t *vha) ...@@ -45,7 +45,7 @@ qla24xx_allocate_vp_id(scsi_qla_host_t *vha)
ha->num_vhosts++; ha->num_vhosts++;
vha->vp_idx = vp_id; vha->vp_idx = vp_id;
list_add_tail(&vha->vp_list, &ha->vp_list); list_add_tail(&vha->vp_list, &ha->vp_list);
up(&ha->vport_sem); mutex_unlock(&ha->vport_lock);
return vp_id; return vp_id;
} }
...@@ -55,12 +55,12 @@ qla24xx_deallocate_vp_id(scsi_qla_host_t *vha) ...@@ -55,12 +55,12 @@ qla24xx_deallocate_vp_id(scsi_qla_host_t *vha)
uint16_t vp_id; uint16_t vp_id;
scsi_qla_host_t *ha = vha->parent; scsi_qla_host_t *ha = vha->parent;
down(&ha->vport_sem); mutex_lock(&ha->vport_lock);
vp_id = vha->vp_idx; vp_id = vha->vp_idx;
ha->num_vhosts--; ha->num_vhosts--;
clear_bit(vp_id, ha->vp_idx_map); clear_bit(vp_id, ha->vp_idx_map);
list_del(&vha->vp_list); list_del(&vha->vp_list);
up(&ha->vport_sem); mutex_unlock(&ha->vport_lock);
} }
static scsi_qla_host_t * static scsi_qla_host_t *
...@@ -145,9 +145,9 @@ qla24xx_enable_vp(scsi_qla_host_t *vha) ...@@ -145,9 +145,9 @@ qla24xx_enable_vp(scsi_qla_host_t *vha)
} }
/* Initialize the new vport unless it is a persistent port */ /* Initialize the new vport unless it is a persistent port */
down(&ha->vport_sem); mutex_lock(&ha->vport_lock);
ret = qla24xx_modify_vp_config(vha); ret = qla24xx_modify_vp_config(vha);
up(&ha->vport_sem); mutex_unlock(&ha->vport_lock);
if (ret != QLA_SUCCESS) { if (ret != QLA_SUCCESS) {
fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED); fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED);
...@@ -406,6 +406,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport) ...@@ -406,6 +406,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
INIT_LIST_HEAD(&vha->list); INIT_LIST_HEAD(&vha->list);
INIT_LIST_HEAD(&vha->fcports); INIT_LIST_HEAD(&vha->fcports);
INIT_LIST_HEAD(&vha->vp_fcports); INIT_LIST_HEAD(&vha->vp_fcports);
INIT_LIST_HEAD(&vha->work_list);
vha->dpc_flags = 0L; vha->dpc_flags = 0L;
set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags); set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);
...@@ -437,10 +438,10 @@ qla24xx_create_vhost(struct fc_vport *fc_vport) ...@@ -437,10 +438,10 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
vha->flags.init_done = 1; vha->flags.init_done = 1;
num_hosts++; num_hosts++;
down(&ha->vport_sem); mutex_lock(&ha->vport_lock);
set_bit(vha->vp_idx, ha->vp_idx_map); set_bit(vha->vp_idx, ha->vp_idx_map);
ha->cur_vport_count++; ha->cur_vport_count++;
up(&ha->vport_sem); mutex_unlock(&ha->vport_lock);
return vha; return vha;
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/mutex.h>
#include <scsi/scsi_tcq.h> #include <scsi/scsi_tcq.h>
#include <scsi/scsicam.h> #include <scsi/scsicam.h>
...@@ -1631,7 +1632,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1631,7 +1632,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
/* load the F/W, read paramaters, and init the H/W */ /* load the F/W, read paramaters, and init the H/W */
ha->instance = num_hosts; ha->instance = num_hosts;
init_MUTEX(&ha->vport_sem); mutex_init(&ha->vport_lock);
init_completion(&ha->mbx_cmd_comp); init_completion(&ha->mbx_cmd_comp);
complete(&ha->mbx_cmd_comp); complete(&ha->mbx_cmd_comp);
init_completion(&ha->mbx_intr_comp); init_completion(&ha->mbx_intr_comp);
...@@ -2156,13 +2157,14 @@ static int ...@@ -2156,13 +2157,14 @@ static int
qla2x00_post_work(struct scsi_qla_host *ha, struct qla_work_evt *e, int locked) qla2x00_post_work(struct scsi_qla_host *ha, struct qla_work_evt *e, int locked)
{ {
unsigned long flags; unsigned long flags;
scsi_qla_host_t *pha = to_qla_parent(ha);
if (!locked) if (!locked)
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&pha->hardware_lock, flags);
list_add_tail(&e->list, &ha->work_list); list_add_tail(&e->list, &ha->work_list);
qla2xxx_wake_dpc(ha); qla2xxx_wake_dpc(ha);
if (!locked) if (!locked)
spin_unlock_irqrestore(&ha->hardware_lock, flags); spin_unlock_irqrestore(&pha->hardware_lock, flags);
return QLA_SUCCESS; return QLA_SUCCESS;
} }
...@@ -2202,12 +2204,13 @@ static void ...@@ -2202,12 +2204,13 @@ static void
qla2x00_do_work(struct scsi_qla_host *ha) qla2x00_do_work(struct scsi_qla_host *ha)
{ {
struct qla_work_evt *e; struct qla_work_evt *e;
scsi_qla_host_t *pha = to_qla_parent(ha);
spin_lock_irq(&ha->hardware_lock); spin_lock_irq(&pha->hardware_lock);
while (!list_empty(&ha->work_list)) { while (!list_empty(&ha->work_list)) {
e = list_entry(ha->work_list.next, struct qla_work_evt, list); e = list_entry(ha->work_list.next, struct qla_work_evt, list);
list_del_init(&e->list); list_del_init(&e->list);
spin_unlock_irq(&ha->hardware_lock); spin_unlock_irq(&pha->hardware_lock);
switch (e->type) { switch (e->type) {
case QLA_EVT_AEN: case QLA_EVT_AEN:
...@@ -2221,9 +2224,9 @@ qla2x00_do_work(struct scsi_qla_host *ha) ...@@ -2221,9 +2224,9 @@ qla2x00_do_work(struct scsi_qla_host *ha)
} }
if (e->flags & QLA_EVT_FLAG_FREE) if (e->flags & QLA_EVT_FLAG_FREE)
kfree(e); kfree(e);
spin_lock_irq(&ha->hardware_lock); spin_lock_irq(&pha->hardware_lock);
} }
spin_unlock_irq(&ha->hardware_lock); spin_unlock_irq(&pha->hardware_lock);
} }
/************************************************************************** /**************************************************************************
...@@ -2634,7 +2637,7 @@ qla2x00_timer(scsi_qla_host_t *ha) ...@@ -2634,7 +2637,7 @@ qla2x00_timer(scsi_qla_host_t *ha)
#define FW_FILE_ISP24XX "ql2400_fw.bin" #define FW_FILE_ISP24XX "ql2400_fw.bin"
#define FW_FILE_ISP25XX "ql2500_fw.bin" #define FW_FILE_ISP25XX "ql2500_fw.bin"
static DECLARE_MUTEX(qla_fw_lock); static DEFINE_MUTEX(qla_fw_lock);
static struct fw_blob qla_fw_blobs[FW_BLOBS] = { static struct fw_blob qla_fw_blobs[FW_BLOBS] = {
{ .name = FW_FILE_ISP21XX, .segs = { 0x1000, 0 }, }, { .name = FW_FILE_ISP21XX, .segs = { 0x1000, 0 }, },
...@@ -2665,7 +2668,7 @@ qla2x00_request_firmware(scsi_qla_host_t *ha) ...@@ -2665,7 +2668,7 @@ qla2x00_request_firmware(scsi_qla_host_t *ha)
blob = &qla_fw_blobs[FW_ISP25XX]; blob = &qla_fw_blobs[FW_ISP25XX];
} }
down(&qla_fw_lock); mutex_lock(&qla_fw_lock);
if (blob->fw) if (blob->fw)
goto out; goto out;
...@@ -2678,7 +2681,7 @@ qla2x00_request_firmware(scsi_qla_host_t *ha) ...@@ -2678,7 +2681,7 @@ qla2x00_request_firmware(scsi_qla_host_t *ha)
} }
out: out:
up(&qla_fw_lock); mutex_unlock(&qla_fw_lock);
return blob; return blob;
} }
...@@ -2687,11 +2690,11 @@ qla2x00_release_firmware(void) ...@@ -2687,11 +2690,11 @@ qla2x00_release_firmware(void)
{ {
int idx; int idx;
down(&qla_fw_lock); mutex_lock(&qla_fw_lock);
for (idx = 0; idx < FW_BLOBS; idx++) for (idx = 0; idx < FW_BLOBS; idx++)
if (qla_fw_blobs[idx].fw) if (qla_fw_blobs[idx].fw)
release_firmware(qla_fw_blobs[idx].fw); release_firmware(qla_fw_blobs[idx].fw);
up(&qla_fw_lock); mutex_unlock(&qla_fw_lock);
} }
static pci_ers_result_t static pci_ers_result_t
...@@ -2864,7 +2867,8 @@ qla2x00_module_init(void) ...@@ -2864,7 +2867,8 @@ qla2x00_module_init(void)
return -ENODEV; return -ENODEV;
} }
printk(KERN_INFO "QLogic Fibre Channel HBA Driver\n"); printk(KERN_INFO "QLogic Fibre Channel HBA Driver: %s\n",
qla2x00_version_str);
ret = pci_register_driver(&qla2xxx_pci_driver); ret = pci_register_driver(&qla2xxx_pci_driver);
if (ret) { if (ret) {
kmem_cache_destroy(srb_cachep); kmem_cache_destroy(srb_cachep);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
/* /*
* Driver version * Driver version
*/ */
#define QLA2XXX_VERSION "8.02.01-k2" #define QLA2XXX_VERSION "8.02.01-k4"
#define QLA_DRIVER_MAJOR_VER 8 #define QLA_DRIVER_MAJOR_VER 8
#define QLA_DRIVER_MINOR_VER 2 #define QLA_DRIVER_MINOR_VER 2
......
...@@ -359,7 +359,12 @@ static int scsi_bus_match(struct device *dev, struct device_driver *gendrv) ...@@ -359,7 +359,12 @@ static int scsi_bus_match(struct device *dev, struct device_driver *gendrv)
static int scsi_bus_uevent(struct device *dev, struct kobj_uevent_env *env) static int scsi_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
{ {
struct scsi_device *sdev = to_scsi_device(dev); struct scsi_device *sdev;
if (dev->type != &scsi_dev_type)
return 0;
sdev = to_scsi_device(dev);
add_uevent_var(env, "MODALIAS=" SCSI_DEVICE_MODALIAS_FMT, sdev->type); add_uevent_var(env, "MODALIAS=" SCSI_DEVICE_MODALIAS_FMT, sdev->type);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment