diff options
Diffstat (limited to 'drivers/message/fusion/mptspi.c')
| -rw-r--r-- | drivers/message/fusion/mptspi.c | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index 09c745b19cc8..f2a4d382ea19 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c | |||
| @@ -783,6 +783,70 @@ static struct pci_device_id mptspi_pci_table[] = { | |||
| 783 | }; | 783 | }; |
| 784 | MODULE_DEVICE_TABLE(pci, mptspi_pci_table); | 784 | MODULE_DEVICE_TABLE(pci, mptspi_pci_table); |
| 785 | 785 | ||
| 786 | |||
| 787 | /* | ||
| 788 | * renegotiate for a given target | ||
| 789 | */ | ||
| 790 | static void | ||
| 791 | mptspi_dv_renegotiate_work(void *data) | ||
| 792 | { | ||
| 793 | struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data; | ||
| 794 | struct _MPT_SCSI_HOST *hd = wqw->hd; | ||
| 795 | struct scsi_device *sdev; | ||
| 796 | |||
| 797 | kfree(wqw); | ||
| 798 | |||
| 799 | shost_for_each_device(sdev, hd->ioc->sh) | ||
| 800 | mptspi_dv_device(hd, sdev); | ||
| 801 | } | ||
| 802 | |||
| 803 | static void | ||
| 804 | mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd) | ||
| 805 | { | ||
| 806 | struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC); | ||
| 807 | |||
| 808 | if (!wqw) | ||
| 809 | return; | ||
| 810 | |||
| 811 | INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work, wqw); | ||
| 812 | wqw->hd = hd; | ||
| 813 | |||
| 814 | schedule_work(&wqw->work); | ||
| 815 | } | ||
| 816 | |||
| 817 | /* | ||
| 818 | * spi module reset handler | ||
| 819 | */ | ||
| 820 | static int | ||
| 821 | mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) | ||
| 822 | { | ||
| 823 | struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata; | ||
| 824 | int rc; | ||
| 825 | |||
| 826 | rc = mptscsih_ioc_reset(ioc, reset_phase); | ||
| 827 | |||
| 828 | if (reset_phase == MPT_IOC_POST_RESET) | ||
| 829 | mptspi_dv_renegotiate(hd); | ||
| 830 | |||
| 831 | return rc; | ||
| 832 | } | ||
| 833 | |||
| 834 | /* | ||
| 835 | * spi module resume handler | ||
| 836 | */ | ||
| 837 | static int | ||
| 838 | mptspi_resume(struct pci_dev *pdev) | ||
| 839 | { | ||
| 840 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | ||
| 841 | struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata; | ||
| 842 | int rc; | ||
| 843 | |||
| 844 | rc = mptscsih_resume(pdev); | ||
| 845 | mptspi_dv_renegotiate(hd); | ||
| 846 | |||
| 847 | return rc; | ||
| 848 | } | ||
| 849 | |||
| 786 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 850 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
| 787 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 851 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
| 788 | /* | 852 | /* |
| @@ -1032,7 +1096,7 @@ static struct pci_driver mptspi_driver = { | |||
| 1032 | .shutdown = mptscsih_shutdown, | 1096 | .shutdown = mptscsih_shutdown, |
| 1033 | #ifdef CONFIG_PM | 1097 | #ifdef CONFIG_PM |
| 1034 | .suspend = mptscsih_suspend, | 1098 | .suspend = mptscsih_suspend, |
| 1035 | .resume = mptscsih_resume, | 1099 | .resume = mptspi_resume, |
| 1036 | #endif | 1100 | #endif |
| 1037 | }; | 1101 | }; |
| 1038 | 1102 | ||
| @@ -1061,7 +1125,7 @@ mptspi_init(void) | |||
| 1061 | ": Registered for IOC event notifications\n")); | 1125 | ": Registered for IOC event notifications\n")); |
| 1062 | } | 1126 | } |
| 1063 | 1127 | ||
| 1064 | if (mpt_reset_register(mptspiDoneCtx, mptscsih_ioc_reset) == 0) { | 1128 | if (mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset) == 0) { |
| 1065 | dprintk((KERN_INFO MYNAM | 1129 | dprintk((KERN_INFO MYNAM |
| 1066 | ": Registered for IOC reset notifications\n")); | 1130 | ": Registered for IOC reset notifications\n")); |
| 1067 | } | 1131 | } |
