Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
This commit is contained in:
@@ -1118,6 +1118,65 @@ mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
mpt_alt_ioc_wait(MPT_ADAPTER *ioc)
|
||||
{
|
||||
int loop_count = 30 * 4; /* Wait 30 seconds */
|
||||
int status = -1; /* -1 means failed to get board READY */
|
||||
|
||||
do {
|
||||
spin_lock(&ioc->initializing_hba_lock);
|
||||
if (ioc->initializing_hba_lock_flag == 0) {
|
||||
ioc->initializing_hba_lock_flag=1;
|
||||
spin_unlock(&ioc->initializing_hba_lock);
|
||||
status = 0;
|
||||
break;
|
||||
}
|
||||
spin_unlock(&ioc->initializing_hba_lock);
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout(HZ/4);
|
||||
} while (--loop_count);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* mpt_bringup_adapter - This is a wrapper function for mpt_do_ioc_recovery
|
||||
* @ioc: Pointer to MPT adapter structure
|
||||
* @sleepFlag: Use schedule if CAN_SLEEP else use udelay.
|
||||
*
|
||||
* This routine performs all the steps necessary to bring the IOC
|
||||
* to a OPERATIONAL state.
|
||||
*
|
||||
* Special Note: This function was added with spin lock's so as to allow
|
||||
* the dv(domain validation) work thread to succeed on the other channel
|
||||
* that maybe occuring at the same time when this function is called.
|
||||
* Without this lock, the dv would fail when message frames were
|
||||
* requested during hba bringup on the alternate ioc.
|
||||
*/
|
||||
static int
|
||||
mpt_bringup_adapter(MPT_ADAPTER *ioc, int sleepFlag)
|
||||
{
|
||||
int r;
|
||||
|
||||
if(ioc->alt_ioc) {
|
||||
if((r=mpt_alt_ioc_wait(ioc->alt_ioc)!=0))
|
||||
return r;
|
||||
}
|
||||
|
||||
r = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP,
|
||||
CAN_SLEEP);
|
||||
|
||||
if(ioc->alt_ioc) {
|
||||
spin_lock(&ioc->alt_ioc->initializing_hba_lock);
|
||||
ioc->alt_ioc->initializing_hba_lock_flag=0;
|
||||
spin_unlock(&ioc->alt_ioc->initializing_hba_lock);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* mpt_attach - Install a PCI intelligent MPT adapter.
|
||||
@@ -1186,6 +1245,7 @@ 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->initializing_hba_lock);
|
||||
|
||||
/* Initialize the event logging.
|
||||
*/
|
||||
@@ -1408,8 +1468,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
*/
|
||||
mpt_detect_bound_ports(ioc, pdev);
|
||||
|
||||
if ((r = mpt_do_ioc_recovery(ioc,
|
||||
MPT_HOSTEVENT_IOC_BRINGUP, CAN_SLEEP)) != 0) {
|
||||
if ((r = mpt_bringup_adapter(ioc, CAN_SLEEP)) != 0){
|
||||
printk(KERN_WARNING MYNAM
|
||||
": WARNING - %s did not initialize properly! (%d)\n",
|
||||
ioc->name, r);
|
||||
@@ -6298,6 +6357,7 @@ EXPORT_SYMBOL(mpt_read_ioc_pg_3);
|
||||
EXPORT_SYMBOL(mpt_alloc_fw_memory);
|
||||
EXPORT_SYMBOL(mpt_free_fw_memory);
|
||||
EXPORT_SYMBOL(mptbase_sas_persist_operation);
|
||||
EXPORT_SYMBOL(mpt_alt_ioc_wait);
|
||||
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
|
@@ -611,6 +611,8 @@ typedef struct _MPT_ADAPTER
|
||||
int DoneCtx;
|
||||
int TaskCtx;
|
||||
int InternalCtx;
|
||||
spinlock_t initializing_hba_lock;
|
||||
int initializing_hba_lock_flag;
|
||||
struct list_head list;
|
||||
struct net_device *netdev;
|
||||
struct list_head sas_topology;
|
||||
@@ -1001,6 +1003,7 @@ extern void mpt_free_fw_memory(MPT_ADAPTER *ioc);
|
||||
extern int mpt_findImVolumes(MPT_ADAPTER *ioc);
|
||||
extern int mpt_read_ioc_pg_3(MPT_ADAPTER *ioc);
|
||||
extern int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
|
||||
extern int mpt_alt_ioc_wait(MPT_ADAPTER *ioc);
|
||||
|
||||
/*
|
||||
* Public data decl's...
|
||||
|
@@ -4162,6 +4162,12 @@ mptscsih_domainValidation(void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
if(mpt_alt_ioc_wait(hd->ioc)!=0) {
|
||||
ddvprintk((MYIOC_s_WARN_FMT "alt_ioc busy!\n",
|
||||
hd->ioc->name));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mptscsih_doDv(hd, 0, id) == 1) {
|
||||
/* Untagged device was busy, try again
|
||||
*/
|
||||
@@ -4173,6 +4179,10 @@ mptscsih_domainValidation(void *arg)
|
||||
hd->ioc->spi_data.dvStatus[id] &= ~(MPT_SCSICFG_DV_NOT_DONE | MPT_SCSICFG_DV_PENDING);
|
||||
}
|
||||
|
||||
spin_lock(&hd->ioc->initializing_hba_lock);
|
||||
hd->ioc->initializing_hba_lock_flag=0;
|
||||
spin_unlock(&hd->ioc->initializing_hba_lock);
|
||||
|
||||
if (isPhysDisk) {
|
||||
for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) {
|
||||
if (hd->ioc->raid_data.isRaid & (1 << ii)) {
|
||||
|
Reference in New Issue
Block a user