diff options
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/scsi_device.h | 4 | ||||
-rw-r--r-- | include/scsi/scsi_transport_fc.h | 8 | ||||
-rw-r--r-- | include/scsi/scsi_transport_sas.h | 100 |
3 files changed, 110 insertions, 2 deletions
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index da63722c0123..c0e4c67d836f 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
@@ -178,8 +178,8 @@ static inline struct scsi_target *scsi_target(struct scsi_device *sdev) | |||
178 | 178 | ||
179 | extern struct scsi_device *__scsi_add_device(struct Scsi_Host *, | 179 | extern struct scsi_device *__scsi_add_device(struct Scsi_Host *, |
180 | uint, uint, uint, void *hostdata); | 180 | uint, uint, uint, void *hostdata); |
181 | #define scsi_add_device(host, channel, target, lun) \ | 181 | extern int scsi_add_device(struct Scsi_Host *host, uint channel, |
182 | __scsi_add_device(host, channel, target, lun, NULL) | 182 | uint target, uint lun); |
183 | extern void scsi_remove_device(struct scsi_device *); | 183 | extern void scsi_remove_device(struct scsi_device *); |
184 | extern int scsi_device_cancel(struct scsi_device *, int); | 184 | extern int scsi_device_cancel(struct scsi_device *, int); |
185 | 185 | ||
diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h index 70ad16315a16..115db056dc6b 100644 --- a/include/scsi/scsi_transport_fc.h +++ b/include/scsi/scsi_transport_fc.h | |||
@@ -439,4 +439,12 @@ int fc_remote_port_block(struct fc_rport *rport); | |||
439 | void fc_remote_port_unblock(struct fc_rport *rport); | 439 | void fc_remote_port_unblock(struct fc_rport *rport); |
440 | int scsi_is_fc_rport(const struct device *); | 440 | int scsi_is_fc_rport(const struct device *); |
441 | 441 | ||
442 | static inline u64 wwn_to_u64(u8 *wwn) | ||
443 | { | ||
444 | return (u64)wwn[0] << 56 | (u64)wwn[1] << 48 | | ||
445 | (u64)wwn[2] << 40 | (u64)wwn[3] << 32 | | ||
446 | (u64)wwn[4] << 24 | (u64)wwn[5] << 16 | | ||
447 | (u64)wwn[6] << 8 | (u64)wwn[7]; | ||
448 | } | ||
449 | |||
442 | #endif /* SCSI_TRANSPORT_FC_H */ | 450 | #endif /* SCSI_TRANSPORT_FC_H */ |
diff --git a/include/scsi/scsi_transport_sas.h b/include/scsi/scsi_transport_sas.h new file mode 100644 index 000000000000..bc4aeb660dd3 --- /dev/null +++ b/include/scsi/scsi_transport_sas.h | |||
@@ -0,0 +1,100 @@ | |||
1 | #ifndef SCSI_TRANSPORT_SAS_H | ||
2 | #define SCSI_TRANSPORT_SAS_H | ||
3 | |||
4 | #include <linux/transport_class.h> | ||
5 | #include <linux/types.h> | ||
6 | |||
7 | struct scsi_transport_template; | ||
8 | struct sas_rphy; | ||
9 | |||
10 | |||
11 | enum sas_device_type { | ||
12 | SAS_PHY_UNUSED, | ||
13 | SAS_END_DEVICE, | ||
14 | SAS_EDGE_EXPANDER_DEVICE, | ||
15 | SAS_FANOUT_EXPANDER_DEVICE, | ||
16 | }; | ||
17 | |||
18 | enum sas_protocol { | ||
19 | SAS_PROTOCOL_SATA = 0x01, | ||
20 | SAS_PROTOCOL_SMP = 0x02, | ||
21 | SAS_PROTOCOL_STP = 0x04, | ||
22 | SAS_PROTOCOL_SSP = 0x08, | ||
23 | }; | ||
24 | |||
25 | enum sas_linkrate { | ||
26 | SAS_LINK_RATE_UNKNOWN, | ||
27 | SAS_PHY_DISABLED, | ||
28 | SAS_LINK_RATE_FAILED, | ||
29 | SAS_SATA_SPINUP_HOLD, | ||
30 | SAS_SATA_PORT_SELECTOR, | ||
31 | SAS_LINK_RATE_1_5_GBPS, | ||
32 | SAS_LINK_RATE_3_0_GBPS, | ||
33 | SAS_LINK_VIRTUAL, | ||
34 | }; | ||
35 | |||
36 | struct sas_identify { | ||
37 | enum sas_device_type device_type; | ||
38 | enum sas_protocol initiator_port_protocols; | ||
39 | enum sas_protocol target_port_protocols; | ||
40 | u64 sas_address; | ||
41 | u8 phy_identifier; | ||
42 | }; | ||
43 | |||
44 | /* The functions by which the transport class and the driver communicate */ | ||
45 | struct sas_function_template { | ||
46 | }; | ||
47 | |||
48 | struct sas_phy { | ||
49 | struct device dev; | ||
50 | int number; | ||
51 | struct sas_identify identify; | ||
52 | enum sas_linkrate negotiated_linkrate; | ||
53 | enum sas_linkrate minimum_linkrate_hw; | ||
54 | enum sas_linkrate minimum_linkrate; | ||
55 | enum sas_linkrate maximum_linkrate_hw; | ||
56 | enum sas_linkrate maximum_linkrate; | ||
57 | u8 port_identifier; | ||
58 | struct sas_rphy *rphy; | ||
59 | }; | ||
60 | |||
61 | #define dev_to_phy(d) \ | ||
62 | container_of((d), struct sas_phy, dev) | ||
63 | #define transport_class_to_phy(cdev) \ | ||
64 | dev_to_phy((cdev)->dev) | ||
65 | #define phy_to_shost(phy) \ | ||
66 | dev_to_shost((phy)->dev.parent) | ||
67 | |||
68 | struct sas_rphy { | ||
69 | struct device dev; | ||
70 | struct sas_identify identify; | ||
71 | struct list_head list; | ||
72 | u32 scsi_target_id; | ||
73 | }; | ||
74 | |||
75 | #define dev_to_rphy(d) \ | ||
76 | container_of((d), struct sas_rphy, dev) | ||
77 | #define transport_class_to_rphy(cdev) \ | ||
78 | dev_to_rphy((cdev)->dev) | ||
79 | #define rphy_to_shost(rphy) \ | ||
80 | dev_to_shost((rphy)->dev.parent) | ||
81 | |||
82 | extern void sas_remove_host(struct Scsi_Host *); | ||
83 | |||
84 | extern struct sas_phy *sas_phy_alloc(struct device *, int); | ||
85 | extern void sas_phy_free(struct sas_phy *); | ||
86 | extern int sas_phy_add(struct sas_phy *); | ||
87 | extern void sas_phy_delete(struct sas_phy *); | ||
88 | extern int scsi_is_sas_phy(const struct device *); | ||
89 | |||
90 | extern struct sas_rphy *sas_rphy_alloc(struct sas_phy *); | ||
91 | void sas_rphy_free(struct sas_rphy *); | ||
92 | extern int sas_rphy_add(struct sas_rphy *); | ||
93 | extern void sas_rphy_delete(struct sas_rphy *); | ||
94 | extern int scsi_is_sas_rphy(const struct device *); | ||
95 | |||
96 | extern struct scsi_transport_template * | ||
97 | sas_attach_transport(struct sas_function_template *); | ||
98 | extern void sas_release_transport(struct scsi_transport_template *); | ||
99 | |||
100 | #endif /* SCSI_TRANSPORT_SAS_H */ | ||