Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2741049e authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6

parents 2a298a35 4d5cda06
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -1636,6 +1636,15 @@ L: ldm-devel@lists.sourceforge.net
W:	http://ldm.sourceforge.net
W:	http://ldm.sourceforge.net
S:	Maintained
S:	Maintained


LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
P:	Eric Moore
M:	Eric.Moore@lsil.com
M:	support@lsil.com
L:	mpt_linux_developer@lsil.com
L:	linux-scsi@vger.kernel.org
W:	http://www.lsilogic.com/support
S:	Supported

LSILOGIC/SYMBIOS/NCR 53C8XX and 53C1010 PCI-SCSI drivers
LSILOGIC/SYMBIOS/NCR 53C8XX and 53C1010 PCI-SCSI drivers
P:	Matthew Wilcox
P:	Matthew Wilcox
M:	matthew@wil.cx
M:	matthew@wil.cx
+62 −2
Original line number Original line Diff line number Diff line
@@ -1118,6 +1118,65 @@ mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp)
	return -1;
	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.
 *	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->pcidev = pdev;
	ioc->diagPending = 0;
	ioc->diagPending = 0;
	spin_lock_init(&ioc->diagLock);
	spin_lock_init(&ioc->diagLock);
	spin_lock_init(&ioc->initializing_hba_lock);


	/* Initialize the event logging.
	/* 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);
	mpt_detect_bound_ports(ioc, pdev);


	if ((r = mpt_do_ioc_recovery(ioc,
	if ((r = mpt_bringup_adapter(ioc, CAN_SLEEP)) != 0){
	  MPT_HOSTEVENT_IOC_BRINGUP, CAN_SLEEP)) != 0) {
		printk(KERN_WARNING MYNAM
		printk(KERN_WARNING MYNAM
		  ": WARNING - %s did not initialize properly! (%d)\n",
		  ": WARNING - %s did not initialize properly! (%d)\n",
		  ioc->name, r);
		  ioc->name, r);
@@ -6298,6 +6357,7 @@ EXPORT_SYMBOL(mpt_read_ioc_pg_3);
EXPORT_SYMBOL(mpt_alloc_fw_memory);
EXPORT_SYMBOL(mpt_alloc_fw_memory);
EXPORT_SYMBOL(mpt_free_fw_memory);
EXPORT_SYMBOL(mpt_free_fw_memory);
EXPORT_SYMBOL(mptbase_sas_persist_operation);
EXPORT_SYMBOL(mptbase_sas_persist_operation);
EXPORT_SYMBOL(mpt_alt_ioc_wait);




/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+3 −0
Original line number Original line Diff line number Diff line
@@ -611,6 +611,8 @@ typedef struct _MPT_ADAPTER
	int			 DoneCtx;
	int			 DoneCtx;
	int			 TaskCtx;
	int			 TaskCtx;
	int			 InternalCtx;
	int			 InternalCtx;
	spinlock_t		 initializing_hba_lock;
	int 	 		 initializing_hba_lock_flag;
	struct list_head	 list;
	struct list_head	 list;
	struct net_device	*netdev;
	struct net_device	*netdev;
	struct list_head	 sas_topology;
	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_findImVolumes(MPT_ADAPTER *ioc);
extern int	 mpt_read_ioc_pg_3(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	 mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
extern int	 mpt_alt_ioc_wait(MPT_ADAPTER *ioc);


/*
/*
 *  Public data decl's...
 *  Public data decl's...
+10 −0
Original line number Original line Diff line number Diff line
@@ -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) {
					if (mptscsih_doDv(hd, 0, id) == 1) {
						/* Untagged device was busy, try again
						/* 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);
						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) {
					if (isPhysDisk) {
						for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) {
						for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) {
							if (hd->ioc->raid_data.isRaid & (1 << ii)) {
							if (hd->ioc->raid_data.isRaid & (1 << ii)) {
+14 −0
Original line number Original line Diff line number Diff line
@@ -996,6 +996,20 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device)
	spin_lock_init(&adapter->fsf_req_list_lock);
	spin_lock_init(&adapter->fsf_req_list_lock);
	INIT_LIST_HEAD(&adapter->fsf_req_list_head);
	INIT_LIST_HEAD(&adapter->fsf_req_list_head);


	/* initialize debug locks */

	spin_lock_init(&adapter->erp_dbf_lock);
	spin_lock_init(&adapter->hba_dbf_lock);
	spin_lock_init(&adapter->san_dbf_lock);
	spin_lock_init(&adapter->scsi_dbf_lock);

	/* initialize error recovery stuff */

	rwlock_init(&adapter->erp_lock);
	sema_init(&adapter->erp_ready_sem, 0);
	INIT_LIST_HEAD(&adapter->erp_ready_head);
	INIT_LIST_HEAD(&adapter->erp_running_head);

	/* initialize abort lock */
	/* initialize abort lock */
	rwlock_init(&adapter->abort_lock);
	rwlock_init(&adapter->abort_lock);


Loading