diff options
author | Dan Williams <dan.j.williams@intel.com> | 2012-01-12 20:57:35 -0500 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2012-02-29 16:33:02 -0500 |
commit | 354cf82980e2449e71fdaa3c6f170357ebd65467 (patch) | |
tree | 8300579ebb51e19e503437d5c1f5ce2fd5186f18 /include/scsi | |
parent | a692b0eec5efae382dfa800e8b4b083f172921a7 (diff) |
[SCSI] libsas: let libata recover links that fail to transmit initial sig-fis
libsas fails to discover all sata devices in the domain. If a device fails
negotiation and does not transmit a signature fis the link needs recovery.
libata already understands how to manage slow to come up links, so treat these
conditions as ata device attach events for the purposes of creating an
ata_port. This allows libata to manage retrying link bring up.
Rediscovery is modified to be careful about checking changes in dev_type. It
looks like libsas leaks old devices if the sas address changes, but that's a
fix for another patch.
Acked-by: Jack Wang <jack_wang@usish.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/sas.h | 4 | ||||
-rw-r--r-- | include/scsi/sas_ata.h | 8 |
2 files changed, 9 insertions, 3 deletions
diff --git a/include/scsi/sas.h b/include/scsi/sas.h index 3673d685e6ad..a577a833603d 100644 --- a/include/scsi/sas.h +++ b/include/scsi/sas.h | |||
@@ -89,8 +89,7 @@ enum sas_oob_mode { | |||
89 | SAS_OOB_MODE | 89 | SAS_OOB_MODE |
90 | }; | 90 | }; |
91 | 91 | ||
92 | /* See sas_discover.c if you plan on changing these. | 92 | /* See sas_discover.c if you plan on changing these */ |
93 | */ | ||
94 | enum sas_dev_type { | 93 | enum sas_dev_type { |
95 | NO_DEVICE = 0, /* protocol */ | 94 | NO_DEVICE = 0, /* protocol */ |
96 | SAS_END_DEV = 1, /* protocol */ | 95 | SAS_END_DEV = 1, /* protocol */ |
@@ -100,6 +99,7 @@ enum sas_dev_type { | |||
100 | SATA_DEV = 5, | 99 | SATA_DEV = 5, |
101 | SATA_PM = 7, | 100 | SATA_PM = 7, |
102 | SATA_PM_PORT= 8, | 101 | SATA_PM_PORT= 8, |
102 | SATA_PENDING = 9, | ||
103 | }; | 103 | }; |
104 | 104 | ||
105 | enum sas_protocol { | 105 | enum sas_protocol { |
diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h index cb724fd010f6..0ca2f8a6bc60 100644 --- a/include/scsi/sas_ata.h +++ b/include/scsi/sas_ata.h | |||
@@ -33,9 +33,10 @@ | |||
33 | static inline int dev_is_sata(struct domain_device *dev) | 33 | static inline int dev_is_sata(struct domain_device *dev) |
34 | { | 34 | { |
35 | return dev->dev_type == SATA_DEV || dev->dev_type == SATA_PM || | 35 | return dev->dev_type == SATA_DEV || dev->dev_type == SATA_PM || |
36 | dev->dev_type == SATA_PM_PORT; | 36 | dev->dev_type == SATA_PM_PORT || dev->dev_type == SATA_PENDING; |
37 | } | 37 | } |
38 | 38 | ||
39 | int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy); | ||
39 | int sas_ata_init_host_and_port(struct domain_device *found_dev, | 40 | int sas_ata_init_host_and_port(struct domain_device *found_dev, |
40 | struct scsi_target *starget); | 41 | struct scsi_target *starget); |
41 | 42 | ||
@@ -82,6 +83,11 @@ static inline void sas_ata_schedule_reset(struct domain_device *dev) | |||
82 | static inline void sas_ata_wait_eh(struct domain_device *dev) | 83 | static inline void sas_ata_wait_eh(struct domain_device *dev) |
83 | { | 84 | { |
84 | } | 85 | } |
86 | |||
87 | static inline int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy) | ||
88 | { | ||
89 | return 0; | ||
90 | } | ||
85 | #endif | 91 | #endif |
86 | 92 | ||
87 | #endif /* _SAS_ATA_H_ */ | 93 | #endif /* _SAS_ATA_H_ */ |