aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ieee1394/sbp2.h
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2010-10-09 18:12:20 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2010-10-11 08:48:03 -0400
commit66fa12c571d35e3cd62574c65f1785a460105397 (patch)
treeb4f8de3d5ca827d2b134ed628628a7bff46967ca /drivers/ieee1394/sbp2.h
parent1ef5b816c0eaf84f91106cfc0893069c49e86113 (diff)
ieee1394: remove the old IEEE 1394 driver stack
The drivers - ohci1394 (controller driver) - ieee1394 (core) - dv1394, raw1394, video1394 (userspace ABI) - eth1394, sbp2 (protocol drivers) are replaced by - firewire-ohci (controller driver) - firewire-core (core and userspace ABI) - firewire-net, firewire-sbp2 (protocol drivers) which are more featureful, better performing, and more secure than the older drivers; all with a smaller and more modern code base. The driver firedtv in drivers/media/dvb/firewire/ contains backends to both ieee1394 and firewire-core. Its ieee1394 backend code can be removed in an independent commit; firedtv as-is builds and works fine without ieee1394. The driver pcilynx (an incomplete controller driver) is deleted without replacement since PCILynx cards are extremely rare. Owners of these cards use them with the stand-alone bus sniffer driver nosy instead. The drivers nosy and init_ohci1394_dma which do not interact with either of the two IEEE 1394 stacks are not affected by the ieee1394 subsystem removal. There are still some issues with the newer firewire subsystem compared to the older one: - The rare and quirky controllers ALi M52xx, Apple UniNorth v1, NVIDIA NForce2 are even less well supported by firewire-ohci than by ohci1394. I am looking into the M52xx issue. - The experimental firewire-net is reportedly less stable than its experimental cousin eth1394. - Audio playback of a certain group of audio devices (ones based on DICE chipset with EAP; supported by prerelease FFADO code) does not work yet. This issue is still under investigation. - There were some ieee1394 based out-of-the-mainline drivers. Of them, only lisight, an audio driver for iSight webcams, seems still useful. Work is underway to reimplement it on top of firewire-core. All these remainig issues are minor; they should not stand in the way of overall better user experience of IEEE 1394 on Linux, together with a reduction in support efforts and maintenance burden. The coexistence of two IEEE 1394 kernel driver stacks in the mainline since 2.6.22 shall end now, as announced earlier this year. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/ieee1394/sbp2.h')
-rw-r--r--drivers/ieee1394/sbp2.h346
1 files changed, 0 insertions, 346 deletions
diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h
deleted file mode 100644
index 64a3a66a8a39..000000000000
--- a/drivers/ieee1394/sbp2.h
+++ /dev/null
@@ -1,346 +0,0 @@
1/*
2 * sbp2.h - Defines and prototypes for sbp2.c
3 *
4 * Copyright (C) 2000 James Goodwin, Filanet Corporation (www.filanet.com)
5 * jamesg@filanet.com
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software Foundation,
19 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 */
21
22#ifndef SBP2_H
23#define SBP2_H
24
25#define SBP2_DEVICE_NAME "sbp2"
26
27/*
28 * There is no transport protocol limit to the CDB length, but we implement
29 * a fixed length only. 16 bytes is enough for disks larger than 2 TB.
30 */
31#define SBP2_MAX_CDB_SIZE 16
32
33/*
34 * SBP-2 specific definitions
35 */
36
37#define ORB_DIRECTION_WRITE_TO_MEDIA 0x0
38#define ORB_DIRECTION_READ_FROM_MEDIA 0x1
39#define ORB_DIRECTION_NO_DATA_TRANSFER 0x2
40
41#define ORB_SET_NULL_PTR(v) (((v) & 0x1) << 31)
42#define ORB_SET_NOTIFY(v) (((v) & 0x1) << 31)
43#define ORB_SET_RQ_FMT(v) (((v) & 0x3) << 29)
44#define ORB_SET_NODE_ID(v) (((v) & 0xffff) << 16)
45#define ORB_SET_STATUS_FIFO_HI(v, id) ((v) >> 32 | ORB_SET_NODE_ID(id))
46#define ORB_SET_STATUS_FIFO_LO(v) ((v) & 0xffffffff)
47#define ORB_SET_DATA_SIZE(v) ((v) & 0xffff)
48#define ORB_SET_PAGE_SIZE(v) (((v) & 0x7) << 16)
49#define ORB_SET_PAGE_TABLE_PRESENT(v) (((v) & 0x1) << 19)
50#define ORB_SET_MAX_PAYLOAD(v) (((v) & 0xf) << 20)
51#define ORB_SET_SPEED(v) (((v) & 0x7) << 24)
52#define ORB_SET_DIRECTION(v) (((v) & 0x1) << 27)
53
54struct sbp2_command_orb {
55 u32 next_ORB_hi;
56 u32 next_ORB_lo;
57 u32 data_descriptor_hi;
58 u32 data_descriptor_lo;
59 u32 misc;
60 u8 cdb[SBP2_MAX_CDB_SIZE];
61} __attribute__((packed));
62
63#define SBP2_LOGIN_REQUEST 0x0
64#define SBP2_QUERY_LOGINS_REQUEST 0x1
65#define SBP2_RECONNECT_REQUEST 0x3
66#define SBP2_SET_PASSWORD_REQUEST 0x4
67#define SBP2_LOGOUT_REQUEST 0x7
68#define SBP2_ABORT_TASK_REQUEST 0xb
69#define SBP2_ABORT_TASK_SET 0xc
70#define SBP2_LOGICAL_UNIT_RESET 0xe
71#define SBP2_TARGET_RESET_REQUEST 0xf
72
73#define ORB_SET_LUN(v) ((v) & 0xffff)
74#define ORB_SET_FUNCTION(v) (((v) & 0xf) << 16)
75#define ORB_SET_RECONNECT(v) (((v) & 0xf) << 20)
76#define ORB_SET_EXCLUSIVE(v) ((v) ? 1 << 28 : 0)
77#define ORB_SET_LOGIN_RESP_LENGTH(v) ((v) & 0xffff)
78#define ORB_SET_PASSWD_LENGTH(v) (((v) & 0xffff) << 16)
79
80struct sbp2_login_orb {
81 u32 password_hi;
82 u32 password_lo;
83 u32 login_response_hi;
84 u32 login_response_lo;
85 u32 lun_misc;
86 u32 passwd_resp_lengths;
87 u32 status_fifo_hi;
88 u32 status_fifo_lo;
89} __attribute__((packed));
90
91#define RESPONSE_GET_LOGIN_ID(v) ((v) & 0xffff)
92#define RESPONSE_GET_LENGTH(v) (((v) >> 16) & 0xffff)
93#define RESPONSE_GET_RECONNECT_HOLD(v) ((v) & 0xffff)
94
95struct sbp2_login_response {
96 u32 length_login_ID;
97 u32 command_block_agent_hi;
98 u32 command_block_agent_lo;
99 u32 reconnect_hold;
100} __attribute__((packed));
101
102#define ORB_SET_LOGIN_ID(v) ((v) & 0xffff)
103#define ORB_SET_QUERY_LOGINS_RESP_LENGTH(v) ((v) & 0xffff)
104
105struct sbp2_query_logins_orb {
106 u32 reserved1;
107 u32 reserved2;
108 u32 query_response_hi;
109 u32 query_response_lo;
110 u32 lun_misc;
111 u32 reserved_resp_length;
112 u32 status_fifo_hi;
113 u32 status_fifo_lo;
114} __attribute__((packed));
115
116#define RESPONSE_GET_MAX_LOGINS(v) ((v) & 0xffff)
117#define RESPONSE_GET_ACTIVE_LOGINS(v) ((RESPONSE_GET_LENGTH((v)) - 4) / 12)
118
119struct sbp2_query_logins_response {
120 u32 length_max_logins;
121 u32 misc_IDs;
122 u32 initiator_misc_hi;
123 u32 initiator_misc_lo;
124} __attribute__((packed));
125
126struct sbp2_reconnect_orb {
127 u32 reserved1;
128 u32 reserved2;
129 u32 reserved3;
130 u32 reserved4;
131 u32 login_ID_misc;
132 u32 reserved5;
133 u32 status_fifo_hi;
134 u32 status_fifo_lo;
135} __attribute__((packed));
136
137struct sbp2_logout_orb {
138 u32 reserved1;
139 u32 reserved2;
140 u32 reserved3;
141 u32 reserved4;
142 u32 login_ID_misc;
143 u32 reserved5;
144 u32 status_fifo_hi;
145 u32 status_fifo_lo;
146} __attribute__((packed));
147
148struct sbp2_unrestricted_page_table {
149 __be32 high;
150 __be32 low;
151};
152
153#define RESP_STATUS_REQUEST_COMPLETE 0x0
154#define RESP_STATUS_TRANSPORT_FAILURE 0x1
155#define RESP_STATUS_ILLEGAL_REQUEST 0x2
156#define RESP_STATUS_VENDOR_DEPENDENT 0x3
157
158#define SBP2_STATUS_NO_ADDITIONAL_INFO 0x0
159#define SBP2_STATUS_REQ_TYPE_NOT_SUPPORTED 0x1
160#define SBP2_STATUS_SPEED_NOT_SUPPORTED 0x2
161#define SBP2_STATUS_PAGE_SIZE_NOT_SUPPORTED 0x3
162#define SBP2_STATUS_ACCESS_DENIED 0x4
163#define SBP2_STATUS_LU_NOT_SUPPORTED 0x5
164#define SBP2_STATUS_MAX_PAYLOAD_TOO_SMALL 0x6
165#define SBP2_STATUS_RESOURCES_UNAVAILABLE 0x8
166#define SBP2_STATUS_FUNCTION_REJECTED 0x9
167#define SBP2_STATUS_LOGIN_ID_NOT_RECOGNIZED 0xa
168#define SBP2_STATUS_DUMMY_ORB_COMPLETED 0xb
169#define SBP2_STATUS_REQUEST_ABORTED 0xc
170#define SBP2_STATUS_UNSPECIFIED_ERROR 0xff
171
172#define SFMT_CURRENT_ERROR 0x0
173#define SFMT_DEFERRED_ERROR 0x1
174#define SFMT_VENDOR_DEPENDENT_STATUS 0x3
175
176#define STATUS_GET_SRC(v) (((v) >> 30) & 0x3)
177#define STATUS_GET_RESP(v) (((v) >> 28) & 0x3)
178#define STATUS_GET_LEN(v) (((v) >> 24) & 0x7)
179#define STATUS_GET_SBP_STATUS(v) (((v) >> 16) & 0xff)
180#define STATUS_GET_ORB_OFFSET_HI(v) ((v) & 0x0000ffff)
181#define STATUS_TEST_DEAD(v) ((v) & 0x08000000)
182/* test 'resp' | 'dead' | 'sbp2_status' */
183#define STATUS_TEST_RDS(v) ((v) & 0x38ff0000)
184
185struct sbp2_status_block {
186 u32 ORB_offset_hi_misc;
187 u32 ORB_offset_lo;
188 u8 command_set_dependent[24];
189} __attribute__((packed));
190
191
192/*
193 * SBP2 related configuration ROM definitions
194 */
195
196#define SBP2_UNIT_DIRECTORY_OFFSET_KEY 0xd1
197#define SBP2_CSR_OFFSET_KEY 0x54
198#define SBP2_UNIT_SPEC_ID_KEY 0x12
199#define SBP2_UNIT_SW_VERSION_KEY 0x13
200#define SBP2_COMMAND_SET_SPEC_ID_KEY 0x38
201#define SBP2_COMMAND_SET_KEY 0x39
202#define SBP2_UNIT_CHARACTERISTICS_KEY 0x3a
203#define SBP2_DEVICE_TYPE_AND_LUN_KEY 0x14
204#define SBP2_FIRMWARE_REVISION_KEY 0x3c
205
206#define SBP2_AGENT_STATE_OFFSET 0x00ULL
207#define SBP2_AGENT_RESET_OFFSET 0x04ULL
208#define SBP2_ORB_POINTER_OFFSET 0x08ULL
209#define SBP2_DOORBELL_OFFSET 0x10ULL
210#define SBP2_UNSOLICITED_STATUS_ENABLE_OFFSET 0x14ULL
211#define SBP2_UNSOLICITED_STATUS_VALUE 0xf
212
213#define SBP2_BUSY_TIMEOUT_ADDRESS 0xfffff0000210ULL
214/* biggest possible value for Single Phase Retry count is 0xf */
215#define SBP2_BUSY_TIMEOUT_VALUE 0xf
216
217#define SBP2_AGENT_RESET_DATA 0xf
218
219#define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e
220#define SBP2_SW_VERSION_ENTRY 0x00010483
221
222/*
223 * The default maximum s/g segment size of a FireWire controller is
224 * usually 0x10000, but SBP-2 only allows 0xffff. Since buffers have to
225 * be quadlet-aligned, we set the length limit to 0xffff & ~3.
226 */
227#define SBP2_MAX_SEG_SIZE 0xfffc
228
229/*
230 * There is no real limitation of the queue depth (i.e. length of the linked
231 * list of command ORBs) at the target. The chosen depth is merely an
232 * implementation detail of the sbp2 driver.
233 */
234#define SBP2_MAX_CMDS 8
235
236#define SBP2_SCSI_STATUS_GOOD 0x0
237#define SBP2_SCSI_STATUS_CHECK_CONDITION 0x2
238#define SBP2_SCSI_STATUS_CONDITION_MET 0x4
239#define SBP2_SCSI_STATUS_BUSY 0x8
240#define SBP2_SCSI_STATUS_RESERVATION_CONFLICT 0x18
241#define SBP2_SCSI_STATUS_COMMAND_TERMINATED 0x22
242#define SBP2_SCSI_STATUS_SELECTION_TIMEOUT 0xff
243
244
245/*
246 * Representations of commands and devices
247 */
248
249/* Per SCSI command */
250struct sbp2_command_info {
251 struct list_head list;
252 struct sbp2_command_orb command_orb;
253 dma_addr_t command_orb_dma;
254 struct scsi_cmnd *Current_SCpnt;
255 void (*Current_done)(struct scsi_cmnd *);
256
257 /* Also need s/g structure for each sbp2 command */
258 struct sbp2_unrestricted_page_table
259 scatter_gather_element[SG_ALL] __attribute__((aligned(8)));
260 dma_addr_t sge_dma;
261};
262
263/* Per FireWire host */
264struct sbp2_fwhost_info {
265 struct hpsb_host *host;
266 struct list_head logical_units;
267};
268
269/* Per logical unit */
270struct sbp2_lu {
271 /* Operation request blocks */
272 struct sbp2_command_orb *last_orb;
273 dma_addr_t last_orb_dma;
274 struct sbp2_login_orb *login_orb;
275 dma_addr_t login_orb_dma;
276 struct sbp2_login_response *login_response;
277 dma_addr_t login_response_dma;
278 struct sbp2_query_logins_orb *query_logins_orb;
279 dma_addr_t query_logins_orb_dma;
280 struct sbp2_query_logins_response *query_logins_response;
281 dma_addr_t query_logins_response_dma;
282 struct sbp2_reconnect_orb *reconnect_orb;
283 dma_addr_t reconnect_orb_dma;
284 struct sbp2_logout_orb *logout_orb;
285 dma_addr_t logout_orb_dma;
286 struct sbp2_status_block status_block;
287
288 /* How to talk to the unit */
289 u64 management_agent_addr;
290 u64 command_block_agent_addr;
291 u32 speed_code;
292 u32 max_payload_size;
293 u16 lun;
294
295 /* Address for the unit to write status blocks to */
296 u64 status_fifo_addr;
297
298 /* Waitqueue flag for logins, reconnects, logouts, query logins */
299 unsigned int access_complete:1;
300
301 /* Pool of command ORBs for this logical unit */
302 spinlock_t cmd_orb_lock;
303 struct list_head cmd_orb_inuse;
304 struct list_head cmd_orb_completed;
305
306 /* Backlink to FireWire host; list of units attached to the host */
307 struct sbp2_fwhost_info *hi;
308 struct list_head lu_list;
309
310 /* IEEE 1394 core's device representations */
311 struct node_entry *ne;
312 struct unit_directory *ud;
313
314 /* SCSI core's device representations */
315 struct scsi_device *sdev;
316 struct Scsi_Host *shost;
317
318 /* Device specific workarounds/brokeness */
319 unsigned workarounds;
320
321 /* Connection state */
322 atomic_t state;
323
324 /* For deferred requests to the fetch agent */
325 struct work_struct protocol_work;
326};
327
328/* For use in sbp2_lu.state */
329enum sbp2lu_state_types {
330 SBP2LU_STATE_RUNNING, /* all normal */
331 SBP2LU_STATE_IN_RESET, /* between bus reset and reconnect */
332 SBP2LU_STATE_IN_SHUTDOWN /* when sbp2_remove was called */
333};
334
335/* For use in sbp2_lu.workarounds and in the corresponding
336 * module load parameter */
337#define SBP2_WORKAROUND_128K_MAX_TRANS 0x1
338#define SBP2_WORKAROUND_INQUIRY_36 0x2
339#define SBP2_WORKAROUND_MODE_SENSE_8 0x4
340#define SBP2_WORKAROUND_FIX_CAPACITY 0x8
341#define SBP2_WORKAROUND_DELAY_INQUIRY 0x10
342#define SBP2_INQUIRY_DELAY 12
343#define SBP2_WORKAROUND_POWER_CONDITION 0x20
344#define SBP2_WORKAROUND_OVERRIDE 0x100
345
346#endif /* SBP2_H */