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.
This commit is contained in:
commit
2d9b57fbec
|
@ -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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
|
|
||||||
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 {
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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 {
|
||||||
#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 *);
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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(®->hccr, HCCRX_CLR_RISC_INT);
|
WRT_REG_DWORD(®->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)
|
||||||
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(®->host_status);
|
stat = RD_REG_DWORD(®->host_status);
|
||||||
if (stat & HSRX_RISC_PAUSED) {
|
if (stat & HSRX_RISC_PAUSED) {
|
||||||
|
@ -1716,7 +1681,7 @@ qla24xx_msix_default(int irq, void *dev_id)
|
||||||
}
|
}
|
||||||
WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
|
WRT_REG_DWORD(®->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)
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
||||||
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)
|
||||||
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 @@
|
||||||
#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)
|
||||||
/* 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
|
||||||
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
|
||||||
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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
#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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
up(&qla_fw_lock);
|
mutex_unlock(&qla_fw_lock);
|
||||||
return blob;
|
return blob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
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 @@
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue