Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (85 commits) [SCSI] 53c700: remove reliance on deprecated cmnd fields [SCSI] hptiop: don't use cmnd->bufflen [SCSI] hptiop: HighPoint RocketRAID 3xxx controller driver [SCSI] aacraid: small misc. cleanups [SCSI] aacraid: Update supported product information [SCSI] aacraid: Fix return code interpretation [SCSI] scsi_transport_sas: fix panic in sas_free_rphy [SCSI] remove RQ_SCSI_* flags [SCSI] remove scsi_request infrastructure [SCSI] mptfusion: change driver revision to 3.03.10 [SCSI] mptfc: abort of board reset leaves port dead requiring reboot [SCSI] mptfc: fix fibre channel infinite request/response loop [SCSI] mptfc: set fibre channel fw target missing timers to one second [SCSI] mptfusion: move fc event/reset handling to mptfc [SCSI] spi transport: don't allow dt to be set on SE or HVD buses [SCSI] aic7xxx: expose the bus setting to sysfs [SCSI] scsi: remove Documentation/scsi/cpqfc.txt [SCSI] drivers/scsi: Use ARRAY_SIZE macro [SCSI] Remove last page_address from dc395x.c [SCSI] hptiop: HighPoint RocketRAID 3xxx controller driver ... Fixed up conflicts in drivers/message/fusion/mptbase.c manually (due to the sparc interrupt cleanups)
This commit is contained in:
@@ -1185,7 +1185,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
ioc->pcidev = pdev;
|
||||
ioc->diagPending = 0;
|
||||
spin_lock_init(&ioc->diagLock);
|
||||
spin_lock_init(&ioc->fc_rescan_work_lock);
|
||||
spin_lock_init(&ioc->initializing_hba_lock);
|
||||
|
||||
/* Initialize the event logging.
|
||||
@@ -1383,30 +1382,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
/* Set lookup ptr. */
|
||||
list_add_tail(&ioc->list, &ioc_list);
|
||||
|
||||
ioc->pci_irq = -1;
|
||||
if (pdev->irq) {
|
||||
if (mpt_msi_enable && !pci_enable_msi(pdev))
|
||||
printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", ioc->name);
|
||||
|
||||
r = request_irq(pdev->irq, mpt_interrupt, SA_SHIRQ, ioc->name, ioc);
|
||||
|
||||
if (r < 0) {
|
||||
printk(MYIOC_s_ERR_FMT "Unable to allocate interrupt %d!\n",
|
||||
ioc->name, pdev->irq);
|
||||
list_del(&ioc->list);
|
||||
iounmap(mem);
|
||||
kfree(ioc);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
ioc->pci_irq = pdev->irq;
|
||||
|
||||
pci_set_master(pdev); /* ?? */
|
||||
pci_set_drvdata(pdev, ioc);
|
||||
|
||||
dprintk((KERN_INFO MYNAM ": %s installed at interrupt %d\n", ioc->name, pdev->irq));
|
||||
}
|
||||
|
||||
/* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets.
|
||||
*/
|
||||
mpt_detect_bound_ports(ioc, pdev);
|
||||
@@ -1416,11 +1391,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
printk(KERN_WARNING MYNAM
|
||||
": WARNING - %s did not initialize properly! (%d)\n",
|
||||
ioc->name, r);
|
||||
|
||||
list_del(&ioc->list);
|
||||
free_irq(ioc->pci_irq, ioc);
|
||||
if (mpt_msi_enable)
|
||||
pci_disable_msi(pdev);
|
||||
if (ioc->alt_ioc)
|
||||
ioc->alt_ioc->alt_ioc = NULL;
|
||||
iounmap(mem);
|
||||
@@ -1639,6 +1610,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
||||
int handlers;
|
||||
int ret = 0;
|
||||
int reset_alt_ioc_active = 0;
|
||||
int irq_allocated = 0;
|
||||
|
||||
printk(KERN_INFO MYNAM ": Initiating %s %s\n",
|
||||
ioc->name, reason==MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery");
|
||||
@@ -1722,6 +1694,36 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Device is reset now. It must have de-asserted the interrupt line
|
||||
* (if it was asserted) and it should be safe to register for the
|
||||
* interrupt now.
|
||||
*/
|
||||
if ((ret == 0) && (reason == MPT_HOSTEVENT_IOC_BRINGUP)) {
|
||||
ioc->pci_irq = -1;
|
||||
if (ioc->pcidev->irq) {
|
||||
if (mpt_msi_enable && !pci_enable_msi(ioc->pcidev))
|
||||
printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n",
|
||||
ioc->name);
|
||||
rc = request_irq(ioc->pcidev->irq, mpt_interrupt,
|
||||
SA_SHIRQ, ioc->name, ioc);
|
||||
if (rc < 0) {
|
||||
printk(MYIOC_s_ERR_FMT "Unable to allocate "
|
||||
"interrupt %d!\n", ioc->name,
|
||||
ioc->pcidev->irq);
|
||||
if (mpt_msi_enable)
|
||||
pci_disable_msi(ioc->pcidev);
|
||||
return -EBUSY;
|
||||
}
|
||||
irq_allocated = 1;
|
||||
ioc->pci_irq = ioc->pcidev->irq;
|
||||
pci_set_master(ioc->pcidev); /* ?? */
|
||||
pci_set_drvdata(ioc->pcidev, ioc);
|
||||
dprintk((KERN_INFO MYNAM ": %s installed at interrupt "
|
||||
"%d\n", ioc->name, ioc->pcidev->irq));
|
||||
}
|
||||
}
|
||||
|
||||
/* Prime reply & request queues!
|
||||
* (mucho alloc's) Must be done prior to
|
||||
* init as upper addresses are needed for init.
|
||||
@@ -1821,7 +1823,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
||||
ret = mptbase_sas_persist_operation(ioc,
|
||||
MPI_SAS_OP_CLEAR_NOT_PRESENT);
|
||||
if(ret != 0)
|
||||
return -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Find IM volumes
|
||||
@@ -1829,14 +1831,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
||||
mpt_findImVolumes(ioc);
|
||||
|
||||
} else if (ioc->bus_type == FC) {
|
||||
/*
|
||||
* Pre-fetch FC port WWN and stuff...
|
||||
* (FCPortPage0_t stuff)
|
||||
*/
|
||||
for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
|
||||
(void) mptbase_GetFcPortPage0(ioc, ii);
|
||||
}
|
||||
|
||||
if ((ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) &&
|
||||
(ioc->lan_cnfg_page0.Header.PageLength == 0)) {
|
||||
/*
|
||||
@@ -1902,6 +1896,12 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
||||
/* FIXME? Examine results here? */
|
||||
}
|
||||
|
||||
out:
|
||||
if ((ret != 0) && irq_allocated) {
|
||||
free_irq(ioc->pci_irq, ioc);
|
||||
if (mpt_msi_enable)
|
||||
pci_disable_msi(ioc->pcidev);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2276,7 +2276,7 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag)
|
||||
}
|
||||
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible(1);
|
||||
msleep(1);
|
||||
} else {
|
||||
mdelay (1); /* 1 msec delay */
|
||||
}
|
||||
@@ -2664,7 +2664,7 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)
|
||||
state = mpt_GetIocState(ioc, 1);
|
||||
while (state != MPI_IOC_STATE_OPERATIONAL && --cntdn) {
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible(1);
|
||||
msleep(1);
|
||||
} else {
|
||||
mdelay(1);
|
||||
}
|
||||
@@ -2916,7 +2916,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
|
||||
|
||||
/* wait 1 msec */
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible(1);
|
||||
msleep(1);
|
||||
} else {
|
||||
mdelay (1);
|
||||
}
|
||||
@@ -2933,7 +2933,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
|
||||
}
|
||||
/* wait .1 sec */
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible (100);
|
||||
msleep (100);
|
||||
} else {
|
||||
mdelay (100);
|
||||
}
|
||||
@@ -3023,7 +3023,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
|
||||
|
||||
/* wait 1 msec */
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible (1);
|
||||
msleep (1);
|
||||
} else {
|
||||
mdelay (1);
|
||||
}
|
||||
@@ -3071,7 +3071,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
|
||||
return 0;
|
||||
}
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible (10);
|
||||
msleep (10);
|
||||
} else {
|
||||
mdelay (10);
|
||||
}
|
||||
@@ -3122,7 +3122,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)
|
||||
SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag);
|
||||
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible (1000);
|
||||
msleep (1000);
|
||||
} else {
|
||||
mdelay (1000);
|
||||
}
|
||||
@@ -3144,7 +3144,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)
|
||||
return hard_reset_done;
|
||||
}
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible (10);
|
||||
msleep (10);
|
||||
} else {
|
||||
mdelay (10);
|
||||
}
|
||||
@@ -3215,7 +3215,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
||||
|
||||
/* wait 100 msec */
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible (100);
|
||||
msleep (100);
|
||||
} else {
|
||||
mdelay (100);
|
||||
}
|
||||
@@ -3294,7 +3294,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
||||
|
||||
/* wait 1 sec */
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible (1000);
|
||||
msleep (1000);
|
||||
} else {
|
||||
mdelay (1000);
|
||||
}
|
||||
@@ -3322,7 +3322,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
||||
|
||||
/* wait 1 sec */
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible (1000);
|
||||
msleep (1000);
|
||||
} else {
|
||||
mdelay (1000);
|
||||
}
|
||||
@@ -3356,7 +3356,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
||||
|
||||
/* wait 100 msec */
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible (100);
|
||||
msleep (100);
|
||||
} else {
|
||||
mdelay (100);
|
||||
}
|
||||
@@ -3450,7 +3450,7 @@ SendIocReset(MPT_ADAPTER *ioc, u8 reset_type, int sleepFlag)
|
||||
}
|
||||
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep_interruptible(1);
|
||||
msleep(1);
|
||||
} else {
|
||||
mdelay (1); /* 1 msec delay */
|
||||
}
|
||||
@@ -3890,7 +3890,7 @@ WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
|
||||
intstat = CHIPREG_READ32(&ioc->chip->IntStatus);
|
||||
if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS))
|
||||
break;
|
||||
msleep_interruptible (1);
|
||||
msleep (1);
|
||||
count++;
|
||||
}
|
||||
} else {
|
||||
@@ -3939,7 +3939,7 @@ WaitForDoorbellInt(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
|
||||
intstat = CHIPREG_READ32(&ioc->chip->IntStatus);
|
||||
if (intstat & MPI_HIS_DOORBELL_INTERRUPT)
|
||||
break;
|
||||
msleep_interruptible(1);
|
||||
msleep(1);
|
||||
count++;
|
||||
}
|
||||
} else {
|
||||
@@ -4160,108 +4160,6 @@ GetLanConfigPages(MPT_ADAPTER *ioc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* mptbase_GetFcPortPage0 - Fetch FCPort config Page0.
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @portnum: IOC Port number
|
||||
*
|
||||
* Return: 0 for success
|
||||
* -ENOMEM if no memory available
|
||||
* -EPERM if not allowed due to ISR context
|
||||
* -EAGAIN if no msg frames currently available
|
||||
* -EFAULT for non-successful reply or no reply (timeout)
|
||||
*/
|
||||
int
|
||||
mptbase_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum)
|
||||
{
|
||||
ConfigPageHeader_t hdr;
|
||||
CONFIGPARMS cfg;
|
||||
FCPortPage0_t *ppage0_alloc;
|
||||
FCPortPage0_t *pp0dest;
|
||||
dma_addr_t page0_dma;
|
||||
int data_sz;
|
||||
int copy_sz;
|
||||
int rc;
|
||||
int count = 400;
|
||||
|
||||
|
||||
/* Get FCPort Page 0 header */
|
||||
hdr.PageVersion = 0;
|
||||
hdr.PageLength = 0;
|
||||
hdr.PageNumber = 0;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0;
|
||||
cfg.pageAddr = portnum;
|
||||
cfg.timeout = 0;
|
||||
|
||||
if ((rc = mpt_config(ioc, &cfg)) != 0)
|
||||
return rc;
|
||||
|
||||
if (hdr.PageLength == 0)
|
||||
return 0;
|
||||
|
||||
data_sz = hdr.PageLength * 4;
|
||||
rc = -ENOMEM;
|
||||
ppage0_alloc = (FCPortPage0_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page0_dma);
|
||||
if (ppage0_alloc) {
|
||||
|
||||
try_again:
|
||||
memset((u8 *)ppage0_alloc, 0, data_sz);
|
||||
cfg.physAddr = page0_dma;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||
|
||||
if ((rc = mpt_config(ioc, &cfg)) == 0) {
|
||||
/* save the data */
|
||||
pp0dest = &ioc->fc_port_page0[portnum];
|
||||
copy_sz = min_t(int, sizeof(FCPortPage0_t), data_sz);
|
||||
memcpy(pp0dest, ppage0_alloc, copy_sz);
|
||||
|
||||
/*
|
||||
* Normalize endianness of structure data,
|
||||
* by byte-swapping all > 1 byte fields!
|
||||
*/
|
||||
pp0dest->Flags = le32_to_cpu(pp0dest->Flags);
|
||||
pp0dest->PortIdentifier = le32_to_cpu(pp0dest->PortIdentifier);
|
||||
pp0dest->WWNN.Low = le32_to_cpu(pp0dest->WWNN.Low);
|
||||
pp0dest->WWNN.High = le32_to_cpu(pp0dest->WWNN.High);
|
||||
pp0dest->WWPN.Low = le32_to_cpu(pp0dest->WWPN.Low);
|
||||
pp0dest->WWPN.High = le32_to_cpu(pp0dest->WWPN.High);
|
||||
pp0dest->SupportedServiceClass = le32_to_cpu(pp0dest->SupportedServiceClass);
|
||||
pp0dest->SupportedSpeeds = le32_to_cpu(pp0dest->SupportedSpeeds);
|
||||
pp0dest->CurrentSpeed = le32_to_cpu(pp0dest->CurrentSpeed);
|
||||
pp0dest->MaxFrameSize = le32_to_cpu(pp0dest->MaxFrameSize);
|
||||
pp0dest->FabricWWNN.Low = le32_to_cpu(pp0dest->FabricWWNN.Low);
|
||||
pp0dest->FabricWWNN.High = le32_to_cpu(pp0dest->FabricWWNN.High);
|
||||
pp0dest->FabricWWPN.Low = le32_to_cpu(pp0dest->FabricWWPN.Low);
|
||||
pp0dest->FabricWWPN.High = le32_to_cpu(pp0dest->FabricWWPN.High);
|
||||
pp0dest->DiscoveredPortsCount = le32_to_cpu(pp0dest->DiscoveredPortsCount);
|
||||
pp0dest->MaxInitiators = le32_to_cpu(pp0dest->MaxInitiators);
|
||||
|
||||
/*
|
||||
* if still doing discovery,
|
||||
* hang loose a while until finished
|
||||
*/
|
||||
if (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) {
|
||||
if (count-- > 0) {
|
||||
msleep_interruptible(100);
|
||||
goto try_again;
|
||||
}
|
||||
printk(MYIOC_s_INFO_FMT "Firmware discovery not"
|
||||
" complete.\n",
|
||||
ioc->name);
|
||||
}
|
||||
}
|
||||
|
||||
pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* mptbase_sas_persist_operation - Perform operation on SAS Persitent Table
|
||||
@@ -6467,7 +6365,6 @@ EXPORT_SYMBOL(mpt_findImVolumes);
|
||||
EXPORT_SYMBOL(mpt_alloc_fw_memory);
|
||||
EXPORT_SYMBOL(mpt_free_fw_memory);
|
||||
EXPORT_SYMBOL(mptbase_sas_persist_operation);
|
||||
EXPORT_SYMBOL(mptbase_GetFcPortPage0);
|
||||
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
|
@@ -76,8 +76,8 @@
|
||||
#define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR
|
||||
#endif
|
||||
|
||||
#define MPT_LINUX_VERSION_COMMON "3.03.09"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.03.09"
|
||||
#define MPT_LINUX_VERSION_COMMON "3.03.10"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.03.10"
|
||||
#define WHAT_MAGIC_STRING "@" "(" "#" ")"
|
||||
|
||||
#define show_mptmod_ver(s,ver) \
|
||||
@@ -487,6 +487,15 @@ typedef struct _RaidCfgData {
|
||||
int isRaid; /* bit field, 1 if RAID */
|
||||
}RaidCfgData;
|
||||
|
||||
typedef struct _FcCfgData {
|
||||
/* will ultimately hold fc_port_page0 also */
|
||||
struct {
|
||||
FCPortPage1_t *data;
|
||||
dma_addr_t dma;
|
||||
int pg_sz;
|
||||
} fc_port_page1[2];
|
||||
} FcCfgData;
|
||||
|
||||
#define MPT_RPORT_INFO_FLAGS_REGISTERED 0x01 /* rport registered */
|
||||
#define MPT_RPORT_INFO_FLAGS_MISSING 0x02 /* missing from DevPage0 scan */
|
||||
|
||||
@@ -565,6 +574,7 @@ typedef struct _MPT_ADAPTER
|
||||
SpiCfgData spi_data; /* Scsi config. data */
|
||||
RaidCfgData raid_data; /* Raid config. data */
|
||||
SasCfgData sas_data; /* Sas config. data */
|
||||
FcCfgData fc_data; /* Fc config. data */
|
||||
MPT_IOCTL *ioctl; /* ioctl data pointer */
|
||||
struct proc_dir_entry *ioc_dentry;
|
||||
struct _MPT_ADAPTER *alt_ioc; /* ptr to 929 bound adapter port */
|
||||
@@ -625,6 +635,7 @@ typedef struct _MPT_ADAPTER
|
||||
int num_ports;
|
||||
struct work_struct mptscsih_persistTask;
|
||||
|
||||
struct work_struct fc_setup_reset_work;
|
||||
struct list_head fc_rports;
|
||||
spinlock_t fc_rescan_work_lock;
|
||||
int fc_rescan_work_count;
|
||||
@@ -1027,7 +1038,6 @@ extern void mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size);
|
||||
extern void mpt_free_fw_memory(MPT_ADAPTER *ioc);
|
||||
extern int mpt_findImVolumes(MPT_ADAPTER *ioc);
|
||||
extern int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
|
||||
extern int mptbase_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum);
|
||||
|
||||
/*
|
||||
* Public data decl's...
|
||||
|
@@ -169,13 +169,6 @@ static struct fc_function_template mptfc_transport_functions = {
|
||||
|
||||
};
|
||||
|
||||
/* FIXME! values controlling firmware RESCAN event
|
||||
* need to be set low to allow dev_loss_tmo to
|
||||
* work as expected. Currently, firmware doesn't
|
||||
* notify driver of RESCAN event until some number
|
||||
* of seconds elapse. This value can be set via
|
||||
* lsiutil.
|
||||
*/
|
||||
static void
|
||||
mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
|
||||
{
|
||||
@@ -587,15 +580,266 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
|
||||
#ifdef DMPT_DEBUG_FC
|
||||
if (unlikely(err)) {
|
||||
dfcprintk ((MYIOC_s_INFO_FMT
|
||||
"mptfc_qcmd.%d: %d:%d, mptscsih_qcmd returns non-zero.\n",
|
||||
"mptfc_qcmd.%d: %d:%d, mptscsih_qcmd returns non-zero, (%x).\n",
|
||||
((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name,
|
||||
((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no,
|
||||
SCpnt->device->id,SCpnt->device->lun));
|
||||
SCpnt->device->id,SCpnt->device->lun,err));
|
||||
}
|
||||
#endif
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* mptfc_GetFcPortPage0 - Fetch FCPort config Page0.
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @portnum: IOC Port number
|
||||
*
|
||||
* Return: 0 for success
|
||||
* -ENOMEM if no memory available
|
||||
* -EPERM if not allowed due to ISR context
|
||||
* -EAGAIN if no msg frames currently available
|
||||
* -EFAULT for non-successful reply or no reply (timeout)
|
||||
* -EINVAL portnum arg out of range (hardwired to two elements)
|
||||
*/
|
||||
static int
|
||||
mptfc_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum)
|
||||
{
|
||||
ConfigPageHeader_t hdr;
|
||||
CONFIGPARMS cfg;
|
||||
FCPortPage0_t *ppage0_alloc;
|
||||
FCPortPage0_t *pp0dest;
|
||||
dma_addr_t page0_dma;
|
||||
int data_sz;
|
||||
int copy_sz;
|
||||
int rc;
|
||||
int count = 400;
|
||||
|
||||
if (portnum > 1)
|
||||
return -EINVAL;
|
||||
|
||||
/* Get FCPort Page 0 header */
|
||||
hdr.PageVersion = 0;
|
||||
hdr.PageLength = 0;
|
||||
hdr.PageNumber = 0;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0;
|
||||
cfg.pageAddr = portnum;
|
||||
cfg.timeout = 0;
|
||||
|
||||
if ((rc = mpt_config(ioc, &cfg)) != 0)
|
||||
return rc;
|
||||
|
||||
if (hdr.PageLength == 0)
|
||||
return 0;
|
||||
|
||||
data_sz = hdr.PageLength * 4;
|
||||
rc = -ENOMEM;
|
||||
ppage0_alloc = (FCPortPage0_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page0_dma);
|
||||
if (ppage0_alloc) {
|
||||
|
||||
try_again:
|
||||
memset((u8 *)ppage0_alloc, 0, data_sz);
|
||||
cfg.physAddr = page0_dma;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||
|
||||
if ((rc = mpt_config(ioc, &cfg)) == 0) {
|
||||
/* save the data */
|
||||
pp0dest = &ioc->fc_port_page0[portnum];
|
||||
copy_sz = min_t(int, sizeof(FCPortPage0_t), data_sz);
|
||||
memcpy(pp0dest, ppage0_alloc, copy_sz);
|
||||
|
||||
/*
|
||||
* Normalize endianness of structure data,
|
||||
* by byte-swapping all > 1 byte fields!
|
||||
*/
|
||||
pp0dest->Flags = le32_to_cpu(pp0dest->Flags);
|
||||
pp0dest->PortIdentifier = le32_to_cpu(pp0dest->PortIdentifier);
|
||||
pp0dest->WWNN.Low = le32_to_cpu(pp0dest->WWNN.Low);
|
||||
pp0dest->WWNN.High = le32_to_cpu(pp0dest->WWNN.High);
|
||||
pp0dest->WWPN.Low = le32_to_cpu(pp0dest->WWPN.Low);
|
||||
pp0dest->WWPN.High = le32_to_cpu(pp0dest->WWPN.High);
|
||||
pp0dest->SupportedServiceClass = le32_to_cpu(pp0dest->SupportedServiceClass);
|
||||
pp0dest->SupportedSpeeds = le32_to_cpu(pp0dest->SupportedSpeeds);
|
||||
pp0dest->CurrentSpeed = le32_to_cpu(pp0dest->CurrentSpeed);
|
||||
pp0dest->MaxFrameSize = le32_to_cpu(pp0dest->MaxFrameSize);
|
||||
pp0dest->FabricWWNN.Low = le32_to_cpu(pp0dest->FabricWWNN.Low);
|
||||
pp0dest->FabricWWNN.High = le32_to_cpu(pp0dest->FabricWWNN.High);
|
||||
pp0dest->FabricWWPN.Low = le32_to_cpu(pp0dest->FabricWWPN.Low);
|
||||
pp0dest->FabricWWPN.High = le32_to_cpu(pp0dest->FabricWWPN.High);
|
||||
pp0dest->DiscoveredPortsCount = le32_to_cpu(pp0dest->DiscoveredPortsCount);
|
||||
pp0dest->MaxInitiators = le32_to_cpu(pp0dest->MaxInitiators);
|
||||
|
||||
/*
|
||||
* if still doing discovery,
|
||||
* hang loose a while until finished
|
||||
*/
|
||||
if (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) {
|
||||
if (count-- > 0) {
|
||||
msleep(100);
|
||||
goto try_again;
|
||||
}
|
||||
printk(MYIOC_s_INFO_FMT "Firmware discovery not"
|
||||
" complete.\n",
|
||||
ioc->name);
|
||||
}
|
||||
}
|
||||
|
||||
pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_WriteFcPortPage1(MPT_ADAPTER *ioc, int portnum)
|
||||
{
|
||||
ConfigPageHeader_t hdr;
|
||||
CONFIGPARMS cfg;
|
||||
int rc;
|
||||
|
||||
if (portnum > 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (!(ioc->fc_data.fc_port_page1[portnum].data))
|
||||
return -EINVAL;
|
||||
|
||||
/* get fcport page 1 header */
|
||||
hdr.PageVersion = 0;
|
||||
hdr.PageLength = 0;
|
||||
hdr.PageNumber = 1;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0;
|
||||
cfg.pageAddr = portnum;
|
||||
cfg.timeout = 0;
|
||||
|
||||
if ((rc = mpt_config(ioc, &cfg)) != 0)
|
||||
return rc;
|
||||
|
||||
if (hdr.PageLength == 0)
|
||||
return -ENODEV;
|
||||
|
||||
if (hdr.PageLength*4 != ioc->fc_data.fc_port_page1[portnum].pg_sz)
|
||||
return -EINVAL;
|
||||
|
||||
cfg.physAddr = ioc->fc_data.fc_port_page1[portnum].dma;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
|
||||
cfg.dir = 1;
|
||||
|
||||
rc = mpt_config(ioc, &cfg);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_GetFcPortPage1(MPT_ADAPTER *ioc, int portnum)
|
||||
{
|
||||
ConfigPageHeader_t hdr;
|
||||
CONFIGPARMS cfg;
|
||||
FCPortPage1_t *page1_alloc;
|
||||
dma_addr_t page1_dma;
|
||||
int data_sz;
|
||||
int rc;
|
||||
|
||||
if (portnum > 1)
|
||||
return -EINVAL;
|
||||
|
||||
/* get fcport page 1 header */
|
||||
hdr.PageVersion = 0;
|
||||
hdr.PageLength = 0;
|
||||
hdr.PageNumber = 1;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0;
|
||||
cfg.pageAddr = portnum;
|
||||
cfg.timeout = 0;
|
||||
|
||||
if ((rc = mpt_config(ioc, &cfg)) != 0)
|
||||
return rc;
|
||||
|
||||
if (hdr.PageLength == 0)
|
||||
return -ENODEV;
|
||||
|
||||
start_over:
|
||||
|
||||
if (ioc->fc_data.fc_port_page1[portnum].data == NULL) {
|
||||
data_sz = hdr.PageLength * 4;
|
||||
if (data_sz < sizeof(FCPortPage1_t))
|
||||
data_sz = sizeof(FCPortPage1_t);
|
||||
|
||||
page1_alloc = (FCPortPage1_t *) pci_alloc_consistent(ioc->pcidev,
|
||||
data_sz,
|
||||
&page1_dma);
|
||||
if (!page1_alloc)
|
||||
return -ENOMEM;
|
||||
}
|
||||
else {
|
||||
page1_alloc = ioc->fc_data.fc_port_page1[portnum].data;
|
||||
page1_dma = ioc->fc_data.fc_port_page1[portnum].dma;
|
||||
data_sz = ioc->fc_data.fc_port_page1[portnum].pg_sz;
|
||||
if (hdr.PageLength * 4 > data_sz) {
|
||||
ioc->fc_data.fc_port_page1[portnum].data = NULL;
|
||||
pci_free_consistent(ioc->pcidev, data_sz, (u8 *)
|
||||
page1_alloc, page1_dma);
|
||||
goto start_over;
|
||||
}
|
||||
}
|
||||
|
||||
memset(page1_alloc,0,data_sz);
|
||||
|
||||
cfg.physAddr = page1_dma;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||
|
||||
if ((rc = mpt_config(ioc, &cfg)) == 0) {
|
||||
ioc->fc_data.fc_port_page1[portnum].data = page1_alloc;
|
||||
ioc->fc_data.fc_port_page1[portnum].pg_sz = data_sz;
|
||||
ioc->fc_data.fc_port_page1[portnum].dma = page1_dma;
|
||||
}
|
||||
else {
|
||||
ioc->fc_data.fc_port_page1[portnum].data = NULL;
|
||||
pci_free_consistent(ioc->pcidev, data_sz, (u8 *)
|
||||
page1_alloc, page1_dma);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void
|
||||
mptfc_SetFcPortPage1_defaults(MPT_ADAPTER *ioc)
|
||||
{
|
||||
int ii;
|
||||
FCPortPage1_t *pp1;
|
||||
|
||||
#define MPTFC_FW_DEVICE_TIMEOUT (1)
|
||||
#define MPTFC_FW_IO_PEND_TIMEOUT (1)
|
||||
#define ON_FLAGS (MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY)
|
||||
#define OFF_FLAGS (MPI_FCPORTPAGE1_FLAGS_VERBOSE_RESCAN_EVENTS)
|
||||
|
||||
for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) {
|
||||
if (mptfc_GetFcPortPage1(ioc, ii) != 0)
|
||||
continue;
|
||||
pp1 = ioc->fc_data.fc_port_page1[ii].data;
|
||||
if ((pp1->InitiatorDeviceTimeout == MPTFC_FW_DEVICE_TIMEOUT)
|
||||
&& (pp1->InitiatorIoPendTimeout == MPTFC_FW_IO_PEND_TIMEOUT)
|
||||
&& ((pp1->Flags & ON_FLAGS) == ON_FLAGS)
|
||||
&& ((pp1->Flags & OFF_FLAGS) == 0))
|
||||
continue;
|
||||
pp1->InitiatorDeviceTimeout = MPTFC_FW_DEVICE_TIMEOUT;
|
||||
pp1->InitiatorIoPendTimeout = MPTFC_FW_IO_PEND_TIMEOUT;
|
||||
pp1->Flags &= ~OFF_FLAGS;
|
||||
pp1->Flags |= ON_FLAGS;
|
||||
mptfc_WriteFcPortPage1(ioc, ii);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
mptfc_init_host_attr(MPT_ADAPTER *ioc,int portnum)
|
||||
{
|
||||
@@ -628,6 +872,31 @@ mptfc_init_host_attr(MPT_ADAPTER *ioc,int portnum)
|
||||
fc_host_tgtid_bind_type(ioc->sh) = FC_TGTID_BIND_BY_WWPN;
|
||||
}
|
||||
|
||||
static void
|
||||
mptfc_setup_reset(void *arg)
|
||||
{
|
||||
MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg;
|
||||
u64 pn;
|
||||
struct mptfc_rport_info *ri;
|
||||
|
||||
/* reset about to happen, delete (block) all rports */
|
||||
list_for_each_entry(ri, &ioc->fc_rports, list) {
|
||||
if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) {
|
||||
ri->flags &= ~MPT_RPORT_INFO_FLAGS_REGISTERED;
|
||||
fc_remote_port_delete(ri->rport); /* won't sleep */
|
||||
ri->rport = NULL;
|
||||
|
||||
pn = (u64)ri->pg0.WWPN.High << 32 |
|
||||
(u64)ri->pg0.WWPN.Low;
|
||||
dfcprintk ((MYIOC_s_INFO_FMT
|
||||
"mptfc_setup_reset.%d: %llx deleted\n",
|
||||
ioc->name,
|
||||
ioc->sh->host_no,
|
||||
(unsigned long long)pn));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mptfc_rescan_devices(void *arg)
|
||||
{
|
||||
@@ -651,7 +920,7 @@ mptfc_rescan_devices(void *arg)
|
||||
* will reregister existing rports
|
||||
*/
|
||||
for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
|
||||
(void) mptbase_GetFcPortPage0(ioc, ii);
|
||||
(void) mptfc_GetFcPortPage0(ioc, ii);
|
||||
mptfc_init_host_attr(ioc,ii); /* refresh */
|
||||
mptfc_GetFcDevPage0(ioc,ii,mptfc_register_dev);
|
||||
}
|
||||
@@ -753,7 +1022,9 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
goto out_mptfc_probe;
|
||||
}
|
||||
|
||||
spin_lock_init(&ioc->fc_rescan_work_lock);
|
||||
INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices,(void *)ioc);
|
||||
INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset, (void *)ioc);
|
||||
|
||||
spin_lock_irqsave(&ioc->FreeQlock, flags);
|
||||
|
||||
@@ -888,6 +1159,15 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
if (!ioc->fc_rescan_work_q)
|
||||
goto out_mptfc_probe;
|
||||
|
||||
/*
|
||||
* Pre-fetch FC port WWN and stuff...
|
||||
* (FCPortPage0_t stuff)
|
||||
*/
|
||||
for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
|
||||
(void) mptfc_GetFcPortPage0(ioc, ii);
|
||||
}
|
||||
mptfc_SetFcPortPage1_defaults(ioc);
|
||||
|
||||
/*
|
||||
* scan for rports -
|
||||
* by doing it via the workqueue, some locking is eliminated
|
||||
@@ -917,6 +1197,81 @@ static struct pci_driver mptfc_driver = {
|
||||
#endif
|
||||
};
|
||||
|
||||
static int
|
||||
mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
|
||||
{
|
||||
MPT_SCSI_HOST *hd;
|
||||
u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
|
||||
unsigned long flags;
|
||||
int rc=1;
|
||||
|
||||
devtverboseprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n",
|
||||
ioc->name, event));
|
||||
|
||||
if (ioc->sh == NULL ||
|
||||
((hd = (MPT_SCSI_HOST *)ioc->sh->hostdata) == NULL))
|
||||
return 1;
|
||||
|
||||
switch (event) {
|
||||
case MPI_EVENT_RESCAN:
|
||||
spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
|
||||
if (ioc->fc_rescan_work_q) {
|
||||
if (ioc->fc_rescan_work_count++ == 0) {
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_rescan_work);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
break;
|
||||
default:
|
||||
rc = mptscsih_event_process(ioc,pEvReply);
|
||||
break;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
||||
{
|
||||
int rc;
|
||||
unsigned long flags;
|
||||
|
||||
rc = mptscsih_ioc_reset(ioc,reset_phase);
|
||||
if (rc == 0)
|
||||
return rc;
|
||||
|
||||
|
||||
dtmprintk((KERN_WARNING MYNAM
|
||||
": IOC %s_reset routed to FC host driver!\n",
|
||||
reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
|
||||
reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
|
||||
|
||||
if (reset_phase == MPT_IOC_SETUP_RESET) {
|
||||
spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
|
||||
if (ioc->fc_rescan_work_q) {
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_setup_reset_work);
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
}
|
||||
|
||||
else if (reset_phase == MPT_IOC_PRE_RESET) {
|
||||
}
|
||||
|
||||
else { /* MPT_IOC_POST_RESET */
|
||||
mptfc_SetFcPortPage1_defaults(ioc);
|
||||
spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
|
||||
if (ioc->fc_rescan_work_q) {
|
||||
if (ioc->fc_rescan_work_count++ == 0) {
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_rescan_work);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/**
|
||||
* mptfc_init - Register MPT adapter(s) as SCSI host(s) with
|
||||
@@ -931,8 +1286,8 @@ mptfc_init(void)
|
||||
|
||||
show_mptmod_ver(my_NAME, my_VERSION);
|
||||
|
||||
/* sanity check module parameter */
|
||||
if (mptfc_dev_loss_tmo == 0)
|
||||
/* sanity check module parameters */
|
||||
if (mptfc_dev_loss_tmo <= 0)
|
||||
mptfc_dev_loss_tmo = MPTFC_DEV_LOSS_TMO;
|
||||
|
||||
mptfc_transport_template =
|
||||
@@ -945,12 +1300,12 @@ mptfc_init(void)
|
||||
mptfcTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTFC_DRIVER);
|
||||
mptfcInternalCtx = mpt_register(mptscsih_scandv_complete, MPTFC_DRIVER);
|
||||
|
||||
if (mpt_event_register(mptfcDoneCtx, mptscsih_event_process) == 0) {
|
||||
if (mpt_event_register(mptfcDoneCtx, mptfc_event_process) == 0) {
|
||||
devtverboseprintk((KERN_INFO MYNAM
|
||||
": Registered for IOC event notifications\n"));
|
||||
}
|
||||
|
||||
if (mpt_reset_register(mptfcDoneCtx, mptscsih_ioc_reset) == 0) {
|
||||
if (mpt_reset_register(mptfcDoneCtx, mptfc_ioc_reset) == 0) {
|
||||
dprintk((KERN_INFO MYNAM
|
||||
": Registered for IOC reset notifications\n"));
|
||||
}
|
||||
@@ -975,6 +1330,7 @@ mptfc_remove(struct pci_dev *pdev)
|
||||
struct mptfc_rport_info *p, *n;
|
||||
struct workqueue_struct *work_q;
|
||||
unsigned long flags;
|
||||
int ii;
|
||||
|
||||
/* destroy workqueue */
|
||||
if ((work_q=ioc->fc_rescan_work_q)) {
|
||||
@@ -991,6 +1347,16 @@ mptfc_remove(struct pci_dev *pdev)
|
||||
kfree(p);
|
||||
}
|
||||
|
||||
for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) {
|
||||
if (ioc->fc_data.fc_port_page1[ii].data) {
|
||||
pci_free_consistent(ioc->pcidev,
|
||||
ioc->fc_data.fc_port_page1[ii].pg_sz,
|
||||
(u8 *) ioc->fc_data.fc_port_page1[ii].data,
|
||||
ioc->fc_data.fc_port_page1[ii].dma);
|
||||
ioc->fc_data.fc_port_page1[ii].data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
mptscsih_remove(pdev);
|
||||
}
|
||||
|
||||
|
@@ -1922,7 +1922,7 @@ mptscsih_tm_wait_for_completion(MPT_SCSI_HOST * hd, ulong timeout )
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags);
|
||||
msleep_interruptible(250);
|
||||
msleep(250);
|
||||
} while (--loop_count);
|
||||
|
||||
return status;
|
||||
@@ -2521,18 +2521,6 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
||||
hd->cmdPtr = NULL;
|
||||
}
|
||||
|
||||
/* 7. FC: Rescan for blocked rports which might have returned.
|
||||
*/
|
||||
if (ioc->bus_type == FC) {
|
||||
spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
|
||||
if (ioc->fc_rescan_work_q) {
|
||||
if (ioc->fc_rescan_work_count++ == 0) {
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_rescan_work);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
}
|
||||
dtmprintk((MYIOC_s_WARN_FMT "Post-Reset complete.\n", ioc->name));
|
||||
|
||||
}
|
||||
@@ -2546,7 +2534,6 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
|
||||
{
|
||||
MPT_SCSI_HOST *hd;
|
||||
u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
|
||||
unsigned long flags;
|
||||
|
||||
devtverboseprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n",
|
||||
ioc->name, event));
|
||||
@@ -2569,14 +2556,6 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
|
||||
break;
|
||||
|
||||
case MPI_EVENT_RESCAN: /* 06 */
|
||||
spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
|
||||
if (ioc->fc_rescan_work_q) {
|
||||
if (ioc->fc_rescan_work_count++ == 0) {
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_rescan_work);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
break;
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user