Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
scsi_transport_sas.h
Go to the documentation of this file.
1 #ifndef SCSI_TRANSPORT_SAS_H
2 #define SCSI_TRANSPORT_SAS_H
3 
5 #include <linux/types.h>
6 #include <linux/mutex.h>
7 #include <scsi/sas.h>
8 
10 struct sas_rphy;
11 struct request;
12 
18 };
19 
20 static inline int sas_protocol_ata(enum sas_protocol proto)
21 {
22  return ((proto & SAS_PROTOCOL_SATA) ||
23  (proto & SAS_PROTOCOL_STP))? 1 : 0;
24 }
25 
27  /* These Values are defined in the SAS standard */
39  /* These are virtual to the transport class and may never
40  * be signalled normally since the standard defined field
41  * is only 4 bits */
44 };
45 
46 struct sas_identify {
52 };
53 
54 struct sas_phy {
55  struct device dev;
56  int number;
57  int enabled;
58 
59  /* phy identification */
61 
62  /* phy attributes */
68 
69  /* link error statistics */
74 
75  /* for the list of phys belonging to a port */
77 
78  /* available to the lldd */
79  void *hostdata;
80 };
81 
82 #define dev_to_phy(d) \
83  container_of((d), struct sas_phy, dev)
84 #define transport_class_to_phy(dev) \
85  dev_to_phy((dev)->parent)
86 #define phy_to_shost(phy) \
87  dev_to_shost((phy)->dev.parent)
88 
89 struct request_queue;
90 struct sas_rphy {
91  struct device dev;
93  struct list_head list;
94  struct request_queue *q;
96 };
97 
98 #define dev_to_rphy(d) \
99  container_of((d), struct sas_rphy, dev)
100 #define transport_class_to_rphy(dev) \
101  dev_to_rphy((dev)->parent)
102 #define rphy_to_shost(rphy) \
103  dev_to_shost((rphy)->dev.parent)
104 #define target_to_rphy(targ) \
105  dev_to_rphy((targ)->dev.parent)
106 
108  struct sas_rphy rphy;
109  /* flags */
110  unsigned ready_led_meaning:1;
111  unsigned tlr_supported:1;
112  unsigned tlr_enabled:1;
113  /* parameters */
116 };
117 #define rphy_to_end_device(r) \
118  container_of((r), struct sas_end_device, rphy)
119 
121  int level;
123 
124  #define SAS_EXPANDER_VENDOR_ID_LEN 8
126  #define SAS_EXPANDER_PRODUCT_ID_LEN 16
128  #define SAS_EXPANDER_PRODUCT_REV_LEN 4
130  #define SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN 8
134 
135  struct sas_rphy rphy;
136 
137 };
138 #define rphy_to_expander_device(r) \
139  container_of((r), struct sas_expander_device, rphy)
140 
141 struct sas_port {
142  struct device dev;
143 
145  int num_phys;
146  /* port flags */
147  unsigned int is_backlink:1;
148 
149  /* the other end of the link */
150  struct sas_rphy *rphy;
151 
154 };
155 
156 #define dev_to_sas_port(d) \
157  container_of((d), struct sas_port, dev)
158 #define transport_class_to_sas_port(dev) \
159  dev_to_sas_port((dev)->parent)
160 
164 };
165 
166 /* The functions by which the transport class and the driver communicate */
168  int (*get_linkerrors)(struct sas_phy *);
171  int (*phy_reset)(struct sas_phy *, int);
172  int (*phy_enable)(struct sas_phy *, int);
173  int (*phy_setup)(struct sas_phy *);
174  void (*phy_release)(struct sas_phy *);
175  int (*set_phy_speed)(struct sas_phy *, struct sas_phy_linkrates *);
176  int (*smp_handler)(struct Scsi_Host *, struct sas_rphy *, struct request *);
177 };
178 
179 
180 void sas_remove_children(struct device *);
181 extern void sas_remove_host(struct Scsi_Host *);
182 
183 extern struct sas_phy *sas_phy_alloc(struct device *, int);
184 extern void sas_phy_free(struct sas_phy *);
185 extern int sas_phy_add(struct sas_phy *);
186 extern void sas_phy_delete(struct sas_phy *);
187 extern int scsi_is_sas_phy(const struct device *);
188 
189 unsigned int sas_tlr_supported(struct scsi_device *);
190 unsigned int sas_is_tlr_enabled(struct scsi_device *);
191 void sas_disable_tlr(struct scsi_device *);
192 void sas_enable_tlr(struct scsi_device *);
193 
194 extern struct sas_rphy *sas_end_device_alloc(struct sas_port *);
195 extern struct sas_rphy *sas_expander_alloc(struct sas_port *, enum sas_device_type);
196 void sas_rphy_free(struct sas_rphy *);
197 extern int sas_rphy_add(struct sas_rphy *);
198 extern void sas_rphy_remove(struct sas_rphy *);
199 extern void sas_rphy_delete(struct sas_rphy *);
200 extern void sas_rphy_unlink(struct sas_rphy *);
201 extern int scsi_is_sas_rphy(const struct device *);
202 
203 struct sas_port *sas_port_alloc(struct device *, int);
204 struct sas_port *sas_port_alloc_num(struct device *);
205 int sas_port_add(struct sas_port *);
206 void sas_port_free(struct sas_port *);
207 void sas_port_delete(struct sas_port *);
208 void sas_port_add_phy(struct sas_port *, struct sas_phy *);
209 void sas_port_delete_phy(struct sas_port *, struct sas_phy *);
210 void sas_port_mark_backlink(struct sas_port *);
211 int scsi_is_sas_port(const struct device *);
212 struct sas_phy *sas_port_get_phy(struct sas_port *port);
213 static inline void sas_port_put_phy(struct sas_phy *phy)
214 {
215  if (phy)
216  put_device(&phy->dev);
217 }
218 
219 extern struct scsi_transport_template *
221 extern void sas_release_transport(struct scsi_transport_template *);
223 
224 static inline int
225 scsi_is_sas_expander_device(struct device *dev)
226 {
227  struct sas_rphy *rphy;
228  if (!scsi_is_sas_rphy(dev))
229  return 0;
230  rphy = dev_to_rphy(dev);
231  return rphy->identify.device_type == SAS_FANOUT_EXPANDER_DEVICE ||
232  rphy->identify.device_type == SAS_EDGE_EXPANDER_DEVICE;
233 }
234 
235 #define scsi_is_sas_phy_local(phy) scsi_is_host_device((phy)->dev.parent)
236 
237 #endif /* SCSI_TRANSPORT_SAS_H */