Loading MAINTAINERS +9 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading drivers/message/fusion/mptbase.c +62 −2 Original line number Original line Diff line number Diff line Loading @@ -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. Loading Loading @@ -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. */ */ Loading Loading @@ -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); Loading Loading @@ -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); /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ Loading drivers/message/fusion/mptbase.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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... Loading drivers/message/fusion/mptscsih.c +10 −0 Original line number Original line Diff line number Diff line Loading @@ -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 */ */ Loading @@ -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)) { Loading drivers/s390/scsi/zfcp_aux.c +14 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
MAINTAINERS +9 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
drivers/message/fusion/mptbase.c +62 −2 Original line number Original line Diff line number Diff line Loading @@ -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. Loading Loading @@ -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. */ */ Loading Loading @@ -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); Loading Loading @@ -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); /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ Loading
drivers/message/fusion/mptbase.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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... Loading
drivers/message/fusion/mptscsih.c +10 −0 Original line number Original line Diff line number Diff line Loading @@ -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 */ */ Loading @@ -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)) { Loading
drivers/s390/scsi/zfcp_aux.c +14 −0 Original line number Original line Diff line number Diff line Loading @@ -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