diff options
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/isci/host.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/isci/host.h | 2 | ||||
| -rw-r--r-- | drivers/scsi/isci/init.c | 58 |
3 files changed, 59 insertions, 3 deletions
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c index 45385f531649..bc8981ed02b3 100644 --- a/drivers/scsi/isci/host.c +++ b/drivers/scsi/isci/host.c | |||
| @@ -1044,7 +1044,7 @@ static enum sci_status sci_controller_start(struct isci_host *ihost, | |||
| 1044 | return SCI_SUCCESS; | 1044 | return SCI_SUCCESS; |
| 1045 | } | 1045 | } |
| 1046 | 1046 | ||
| 1047 | void isci_host_scan_start(struct Scsi_Host *shost) | 1047 | void isci_host_start(struct Scsi_Host *shost) |
| 1048 | { | 1048 | { |
| 1049 | struct isci_host *ihost = SHOST_TO_SAS_HA(shost)->lldd_ha; | 1049 | struct isci_host *ihost = SHOST_TO_SAS_HA(shost)->lldd_ha; |
| 1050 | unsigned long tmo = sci_controller_get_suggested_start_timeout(ihost); | 1050 | unsigned long tmo = sci_controller_get_suggested_start_timeout(ihost); |
diff --git a/drivers/scsi/isci/host.h b/drivers/scsi/isci/host.h index 9ab58e0540e7..4911310a38f5 100644 --- a/drivers/scsi/isci/host.h +++ b/drivers/scsi/isci/host.h | |||
| @@ -473,7 +473,7 @@ void sci_controller_remote_device_stopped(struct isci_host *ihost, | |||
| 473 | 473 | ||
| 474 | enum sci_status sci_controller_continue_io(struct isci_request *ireq); | 474 | enum sci_status sci_controller_continue_io(struct isci_request *ireq); |
| 475 | int isci_host_scan_finished(struct Scsi_Host *, unsigned long); | 475 | int isci_host_scan_finished(struct Scsi_Host *, unsigned long); |
| 476 | void isci_host_scan_start(struct Scsi_Host *); | 476 | void isci_host_start(struct Scsi_Host *); |
| 477 | u16 isci_alloc_tag(struct isci_host *ihost); | 477 | u16 isci_alloc_tag(struct isci_host *ihost); |
| 478 | enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag); | 478 | enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag); |
| 479 | void isci_tci_free(struct isci_host *ihost, u16 tci); | 479 | void isci_tci_free(struct isci_host *ihost, u16 tci); |
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c index 92c1d86d1fc6..da142a8726dc 100644 --- a/drivers/scsi/isci/init.c +++ b/drivers/scsi/isci/init.c | |||
| @@ -156,7 +156,7 @@ static struct scsi_host_template isci_sht = { | |||
| 156 | .target_alloc = sas_target_alloc, | 156 | .target_alloc = sas_target_alloc, |
| 157 | .slave_configure = sas_slave_configure, | 157 | .slave_configure = sas_slave_configure, |
| 158 | .scan_finished = isci_host_scan_finished, | 158 | .scan_finished = isci_host_scan_finished, |
| 159 | .scan_start = isci_host_scan_start, | 159 | .scan_start = isci_host_start, |
| 160 | .change_queue_depth = sas_change_queue_depth, | 160 | .change_queue_depth = sas_change_queue_depth, |
| 161 | .change_queue_type = sas_change_queue_type, | 161 | .change_queue_type = sas_change_queue_type, |
| 162 | .bios_param = sas_bios_param, | 162 | .bios_param = sas_bios_param, |
| @@ -722,11 +722,67 @@ static void __devexit isci_pci_remove(struct pci_dev *pdev) | |||
| 722 | } | 722 | } |
| 723 | } | 723 | } |
| 724 | 724 | ||
| 725 | #ifdef CONFIG_PM | ||
| 726 | static int isci_suspend(struct device *dev) | ||
| 727 | { | ||
| 728 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 729 | struct isci_host *ihost; | ||
| 730 | int i; | ||
| 731 | |||
| 732 | for_each_isci_host(i, ihost, pdev) { | ||
| 733 | sas_suspend_ha(&ihost->sas_ha); | ||
| 734 | isci_host_deinit(ihost); | ||
| 735 | } | ||
| 736 | |||
| 737 | pci_save_state(pdev); | ||
| 738 | pci_disable_device(pdev); | ||
| 739 | pci_set_power_state(pdev, PCI_D3hot); | ||
| 740 | |||
| 741 | return 0; | ||
| 742 | } | ||
| 743 | |||
| 744 | static int isci_resume(struct device *dev) | ||
| 745 | { | ||
| 746 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 747 | struct isci_host *ihost; | ||
| 748 | int rc, i; | ||
| 749 | |||
| 750 | pci_set_power_state(pdev, PCI_D0); | ||
| 751 | pci_restore_state(pdev); | ||
| 752 | |||
| 753 | rc = pcim_enable_device(pdev); | ||
| 754 | if (rc) { | ||
| 755 | dev_err(&pdev->dev, | ||
| 756 | "enabling device failure after resume(%d)\n", rc); | ||
| 757 | return rc; | ||
| 758 | } | ||
| 759 | |||
| 760 | pci_set_master(pdev); | ||
| 761 | |||
| 762 | for_each_isci_host(i, ihost, pdev) { | ||
| 763 | sas_prep_resume_ha(&ihost->sas_ha); | ||
| 764 | |||
| 765 | isci_host_init(ihost); | ||
| 766 | isci_host_start(ihost->sas_ha.core.shost); | ||
| 767 | wait_for_start(ihost); | ||
| 768 | |||
| 769 | sas_resume_ha(&ihost->sas_ha); | ||
| 770 | } | ||
| 771 | |||
| 772 | return 0; | ||
| 773 | } | ||
| 774 | |||
| 775 | static SIMPLE_DEV_PM_OPS(isci_pm_ops, isci_suspend, isci_resume); | ||
| 776 | #endif | ||
| 777 | |||
| 725 | static struct pci_driver isci_pci_driver = { | 778 | static struct pci_driver isci_pci_driver = { |
| 726 | .name = DRV_NAME, | 779 | .name = DRV_NAME, |
| 727 | .id_table = isci_id_table, | 780 | .id_table = isci_id_table, |
| 728 | .probe = isci_pci_probe, | 781 | .probe = isci_pci_probe, |
| 729 | .remove = __devexit_p(isci_pci_remove), | 782 | .remove = __devexit_p(isci_pci_remove), |
| 783 | #ifdef CONFIG_PM | ||
| 784 | .driver.pm = &isci_pm_ops, | ||
| 785 | #endif | ||
| 730 | }; | 786 | }; |
| 731 | 787 | ||
| 732 | static __init int isci_init(void) | 788 | static __init int isci_init(void) |
