aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/scsi/scsi_transport_sas.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/include/scsi/scsi_transport_sas.h b/include/scsi/scsi_transport_sas.h
index 8fded431cf46..2943ccc22a43 100644
--- a/include/scsi/scsi_transport_sas.h
+++ b/include/scsi/scsi_transport_sas.h
@@ -108,6 +108,25 @@ struct sas_end_device {
108#define rphy_to_end_device(r) \ 108#define rphy_to_end_device(r) \
109 container_of((r), struct sas_end_device, rphy) 109 container_of((r), struct sas_end_device, rphy)
110 110
111struct sas_expander_device {
112 int level;
113
114 #define SAS_EXPANDER_VENDOR_ID_LEN 8
115 char vendor_id[SAS_EXPANDER_VENDOR_ID_LEN+1];
116 #define SAS_EXPANDER_PRODUCT_ID_LEN 16
117 char product_id[SAS_EXPANDER_PRODUCT_ID_LEN+1];
118 #define SAS_EXPANDER_PRODUCT_REV_LEN 4
119 char product_rev[SAS_EXPANDER_PRODUCT_REV_LEN+1];
120 #define SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN 8
121 char component_vendor_id[SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN+1];
122 u16 component_id;
123 u8 component_revision_id;
124
125 struct sas_rphy rphy;
126
127};
128#define rphy_to_expander_device(r) \
129 container_of((r), struct sas_expander_device, rphy)
111 130
112/* The functions by which the transport class and the driver communicate */ 131/* The functions by which the transport class and the driver communicate */
113struct sas_function_template { 132struct sas_function_template {
@@ -128,6 +147,7 @@ extern int scsi_is_sas_phy(const struct device *);
128 147
129extern struct sas_rphy *sas_rphy_alloc(struct sas_phy *); 148extern struct sas_rphy *sas_rphy_alloc(struct sas_phy *);
130extern struct sas_rphy *sas_end_device_alloc(struct sas_phy *); 149extern struct sas_rphy *sas_end_device_alloc(struct sas_phy *);
150extern struct sas_rphy *sas_expander_alloc(struct sas_phy *, enum sas_device_type);
131void sas_rphy_free(struct sas_rphy *); 151void sas_rphy_free(struct sas_rphy *);
132extern int sas_rphy_add(struct sas_rphy *); 152extern int sas_rphy_add(struct sas_rphy *);
133extern void sas_rphy_delete(struct sas_rphy *); 153extern void sas_rphy_delete(struct sas_rphy *);
@@ -138,4 +158,15 @@ sas_attach_transport(struct sas_function_template *);
138extern void sas_release_transport(struct scsi_transport_template *); 158extern void sas_release_transport(struct scsi_transport_template *);
139int sas_read_port_mode_page(struct scsi_device *); 159int sas_read_port_mode_page(struct scsi_device *);
140 160
161static inline int
162scsi_is_sas_expander_device(struct device *dev)
163{
164 struct sas_rphy *rphy;
165 if (!scsi_is_sas_rphy(dev))
166 return 0;
167 rphy = dev_to_rphy(dev);
168 return rphy->identify.device_type == SAS_FANOUT_EXPANDER_DEVICE ||
169 rphy->identify.device_type == SAS_EDGE_EXPANDER_DEVICE;
170}
171
141#endif /* SCSI_TRANSPORT_SAS_H */ 172#endif /* SCSI_TRANSPORT_SAS_H */