diff options
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/scsi_cmnd.h | 2 | ||||
-rw-r--r-- | include/scsi/scsi_device.h | 5 | ||||
-rw-r--r-- | include/scsi/scsi_host.h | 11 | ||||
-rw-r--r-- | include/scsi/scsi_request.h | 2 | ||||
-rw-r--r-- | include/scsi/scsi_transport_fc.h | 12 | ||||
-rw-r--r-- | include/scsi/scsi_transport_sas.h | 100 |
6 files changed, 124 insertions, 8 deletions
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index bed4b7c9be9..e6b61fab66d 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h | |||
@@ -146,7 +146,7 @@ struct scsi_cmnd { | |||
146 | #define SCSI_STATE_MLQUEUE 0x100b | 146 | #define SCSI_STATE_MLQUEUE 0x100b |
147 | 147 | ||
148 | 148 | ||
149 | extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, int); | 149 | extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t); |
150 | extern void scsi_put_command(struct scsi_cmnd *); | 150 | extern void scsi_put_command(struct scsi_cmnd *); |
151 | extern void scsi_io_completion(struct scsi_cmnd *, unsigned int, unsigned int); | 151 | extern void scsi_io_completion(struct scsi_cmnd *, unsigned int, unsigned int); |
152 | extern void scsi_finish_command(struct scsi_cmnd *cmd); | 152 | extern void scsi_finish_command(struct scsi_cmnd *cmd); |
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index da63722c012..7ece05666fe 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
@@ -163,6 +163,7 @@ struct scsi_target { | |||
163 | unsigned int id; /* target id ... replace | 163 | unsigned int id; /* target id ... replace |
164 | * scsi_device.id eventually */ | 164 | * scsi_device.id eventually */ |
165 | unsigned long create:1; /* signal that it needs to be added */ | 165 | unsigned long create:1; /* signal that it needs to be added */ |
166 | char scsi_level; | ||
166 | void *hostdata; /* available to low-level driver */ | 167 | void *hostdata; /* available to low-level driver */ |
167 | unsigned long starget_data[0]; /* for the transport */ | 168 | unsigned long starget_data[0]; /* for the transport */ |
168 | /* starget_data must be the last element!!!! */ | 169 | /* starget_data must be the last element!!!! */ |
@@ -178,8 +179,8 @@ static inline struct scsi_target *scsi_target(struct scsi_device *sdev) | |||
178 | 179 | ||
179 | extern struct scsi_device *__scsi_add_device(struct Scsi_Host *, | 180 | extern struct scsi_device *__scsi_add_device(struct Scsi_Host *, |
180 | uint, uint, uint, void *hostdata); | 181 | uint, uint, uint, void *hostdata); |
181 | #define scsi_add_device(host, channel, target, lun) \ | 182 | extern int scsi_add_device(struct Scsi_Host *host, uint channel, |
182 | __scsi_add_device(host, channel, target, lun, NULL) | 183 | uint target, uint lun); |
183 | extern void scsi_remove_device(struct scsi_device *); | 184 | extern void scsi_remove_device(struct scsi_device *); |
184 | extern int scsi_device_cancel(struct scsi_device *, int); | 185 | extern int scsi_device_cancel(struct scsi_device *, int); |
185 | 186 | ||
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 916144be208..69313ba7505 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
@@ -439,6 +439,8 @@ enum scsi_host_state { | |||
439 | SHOST_CANCEL, | 439 | SHOST_CANCEL, |
440 | SHOST_DEL, | 440 | SHOST_DEL, |
441 | SHOST_RECOVERY, | 441 | SHOST_RECOVERY, |
442 | SHOST_CANCEL_RECOVERY, | ||
443 | SHOST_DEL_RECOVERY, | ||
442 | }; | 444 | }; |
443 | 445 | ||
444 | struct Scsi_Host { | 446 | struct Scsi_Host { |
@@ -465,8 +467,6 @@ struct Scsi_Host { | |||
465 | 467 | ||
466 | struct list_head eh_cmd_q; | 468 | struct list_head eh_cmd_q; |
467 | struct task_struct * ehandler; /* Error recovery thread. */ | 469 | struct task_struct * ehandler; /* Error recovery thread. */ |
468 | struct semaphore * eh_wait; /* The error recovery thread waits | ||
469 | on this. */ | ||
470 | struct semaphore * eh_action; /* Wait for specific actions on the | 470 | struct semaphore * eh_action; /* Wait for specific actions on the |
471 | host. */ | 471 | host. */ |
472 | unsigned int eh_active:1; /* Indicates the eh thread is awake and active if | 472 | unsigned int eh_active:1; /* Indicates the eh thread is awake and active if |
@@ -621,6 +621,13 @@ static inline struct Scsi_Host *dev_to_shost(struct device *dev) | |||
621 | return container_of(dev, struct Scsi_Host, shost_gendev); | 621 | return container_of(dev, struct Scsi_Host, shost_gendev); |
622 | } | 622 | } |
623 | 623 | ||
624 | static inline int scsi_host_in_recovery(struct Scsi_Host *shost) | ||
625 | { | ||
626 | return shost->shost_state == SHOST_RECOVERY || | ||
627 | shost->shost_state == SHOST_CANCEL_RECOVERY || | ||
628 | shost->shost_state == SHOST_DEL_RECOVERY; | ||
629 | } | ||
630 | |||
624 | extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *); | 631 | extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *); |
625 | extern void scsi_flush_work(struct Scsi_Host *); | 632 | extern void scsi_flush_work(struct Scsi_Host *); |
626 | 633 | ||
diff --git a/include/scsi/scsi_request.h b/include/scsi/scsi_request.h index 6a140020d7c..2539debb799 100644 --- a/include/scsi/scsi_request.h +++ b/include/scsi/scsi_request.h | |||
@@ -45,7 +45,7 @@ struct scsi_request { | |||
45 | level driver) of this request */ | 45 | level driver) of this request */ |
46 | }; | 46 | }; |
47 | 47 | ||
48 | extern struct scsi_request *scsi_allocate_request(struct scsi_device *, int); | 48 | extern struct scsi_request *scsi_allocate_request(struct scsi_device *, gfp_t); |
49 | extern void scsi_release_request(struct scsi_request *); | 49 | extern void scsi_release_request(struct scsi_request *); |
50 | extern void scsi_wait_req(struct scsi_request *, const void *cmnd, | 50 | extern void scsi_wait_req(struct scsi_request *, const void *cmnd, |
51 | void *buffer, unsigned bufflen, | 51 | void *buffer, unsigned bufflen, |
diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h index 70ad16315a1..b0d44543737 100644 --- a/include/scsi/scsi_transport_fc.h +++ b/include/scsi/scsi_transport_fc.h | |||
@@ -103,8 +103,8 @@ enum fc_port_state { | |||
103 | incapable of reporting */ | 103 | incapable of reporting */ |
104 | #define FC_PORTSPEED_1GBIT 1 | 104 | #define FC_PORTSPEED_1GBIT 1 |
105 | #define FC_PORTSPEED_2GBIT 2 | 105 | #define FC_PORTSPEED_2GBIT 2 |
106 | #define FC_PORTSPEED_10GBIT 4 | 106 | #define FC_PORTSPEED_4GBIT 4 |
107 | #define FC_PORTSPEED_4GBIT 8 | 107 | #define FC_PORTSPEED_10GBIT 8 |
108 | #define FC_PORTSPEED_NOT_NEGOTIATED (1 << 15) /* Speed not established */ | 108 | #define FC_PORTSPEED_NOT_NEGOTIATED (1 << 15) /* Speed not established */ |
109 | 109 | ||
110 | /* | 110 | /* |
@@ -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 00000000000..bc4aeb660dd --- /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 */ | ||