aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/fw-transaction.h
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2009-06-05 10:26:18 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2009-06-05 10:26:18 -0400
commit77c9a5daa9c4d9b37812c9c69c7bcbb3f9399c3c (patch)
tree54ea3c48e0663ef1b9f227ffff7710f0ea03f9a1 /drivers/firewire/fw-transaction.h
parente8ca97021c8eb127bb04aec4e2420e1d66be371d (diff)
firewire: reorganize header files
The three header files of firewire-core, i.e. "drivers/firewire/fw-device.h", "drivers/firewire/fw-topology.h", "drivers/firewire/fw-transaction.h", are replaced by "drivers/firewire/core.h", "include/linux/firewire.h". The latter includes everything which a firewire high-level driver (like firewire-sbp2) needs besides linux/firewire-constants.h, while core.h contains the rest which is needed by firewire-core itself and by low- level drivers (card drivers) like firewire-ohci. High-level drivers can now also reside outside of drivers/firewire without having to add drivers/firewire to the header file search path in makefiles. At least the firedtv driver will be such a driver. I also considered to spread the contents of core.h over several files, one for each .c file where the respective implementation resides. But it turned out that most core .c files will end up including most of the core .h files. Also, the combined core.h isn't unreasonably big, and it will lose more of its contents to linux/firewire.h anyway soon when more firewire drivers are added. (IP-over-1394, firedtv, and there are plans for one or two more.) Furthermore, fw-ohci.h is renamed to ohci.h. The name of core.h and ohci.h is chosen with regard to name changes of the .c files in a follow-up change. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/fw-transaction.h')
-rw-r--r--drivers/firewire/fw-transaction.h446
1 files changed, 0 insertions, 446 deletions
diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h
deleted file mode 100644
index dfa799068f89..000000000000
--- a/drivers/firewire/fw-transaction.h
+++ /dev/null
@@ -1,446 +0,0 @@
1/*
2 * Copyright (C) 2003-2006 Kristian Hoegsberg <krh@bitplanet.net>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19#ifndef __fw_transaction_h
20#define __fw_transaction_h
21
22#include <linux/completion.h>
23#include <linux/device.h>
24#include <linux/dma-mapping.h>
25#include <linux/firewire-constants.h>
26#include <linux/kref.h>
27#include <linux/list.h>
28#include <linux/spinlock_types.h>
29#include <linux/timer.h>
30#include <linux/types.h>
31#include <linux/workqueue.h>
32
33#define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4)
34#define TCODE_IS_BLOCK_PACKET(tcode) (((tcode) & 1) != 0)
35#define TCODE_IS_REQUEST(tcode) (((tcode) & 2) == 0)
36#define TCODE_IS_RESPONSE(tcode) (((tcode) & 2) != 0)
37#define TCODE_HAS_REQUEST_DATA(tcode) (((tcode) & 12) != 4)
38#define TCODE_HAS_RESPONSE_DATA(tcode) (((tcode) & 12) != 0)
39
40#define LOCAL_BUS 0xffc0
41
42#define SELFID_PORT_CHILD 0x3
43#define SELFID_PORT_PARENT 0x2
44#define SELFID_PORT_NCONN 0x1
45#define SELFID_PORT_NONE 0x0
46
47#define PHY_PACKET_CONFIG 0x0
48#define PHY_PACKET_LINK_ON 0x1
49#define PHY_PACKET_SELF_ID 0x2
50
51/* Bit fields _within_ the PHY registers. */
52#define PHY_LINK_ACTIVE 0x80
53#define PHY_CONTENDER 0x40
54#define PHY_BUS_RESET 0x40
55#define PHY_BUS_SHORT_RESET 0x40
56
57#define CSR_REGISTER_BASE 0xfffff0000000ULL
58
59/* register offsets relative to CSR_REGISTER_BASE */
60#define CSR_STATE_CLEAR 0x0
61#define CSR_STATE_SET 0x4
62#define CSR_NODE_IDS 0x8
63#define CSR_RESET_START 0xc
64#define CSR_SPLIT_TIMEOUT_HI 0x18
65#define CSR_SPLIT_TIMEOUT_LO 0x1c
66#define CSR_CYCLE_TIME 0x200
67#define CSR_BUS_TIME 0x204
68#define CSR_BUSY_TIMEOUT 0x210
69#define CSR_BUS_MANAGER_ID 0x21c
70#define CSR_BANDWIDTH_AVAILABLE 0x220
71#define CSR_CHANNELS_AVAILABLE 0x224
72#define CSR_CHANNELS_AVAILABLE_HI 0x224
73#define CSR_CHANNELS_AVAILABLE_LO 0x228
74#define CSR_BROADCAST_CHANNEL 0x234
75#define CSR_CONFIG_ROM 0x400
76#define CSR_CONFIG_ROM_END 0x800
77#define CSR_FCP_COMMAND 0xB00
78#define CSR_FCP_RESPONSE 0xD00
79#define CSR_FCP_END 0xF00
80#define CSR_TOPOLOGY_MAP 0x1000
81#define CSR_TOPOLOGY_MAP_END 0x1400
82#define CSR_SPEED_MAP 0x2000
83#define CSR_SPEED_MAP_END 0x3000
84
85#define BANDWIDTH_AVAILABLE_INITIAL 4915
86#define BROADCAST_CHANNEL_INITIAL (1 << 31 | 31)
87#define BROADCAST_CHANNEL_VALID (1 << 30)
88
89#define fw_notify(s, args...) printk(KERN_NOTICE KBUILD_MODNAME ": " s, ## args)
90#define fw_error(s, args...) printk(KERN_ERR KBUILD_MODNAME ": " s, ## args)
91
92static inline void fw_memcpy_from_be32(void *_dst, void *_src, size_t size)
93{
94 u32 *dst = _dst;
95 __be32 *src = _src;
96 int i;
97
98 for (i = 0; i < size / 4; i++)
99 dst[i] = be32_to_cpu(src[i]);
100}
101
102static inline void fw_memcpy_to_be32(void *_dst, void *_src, size_t size)
103{
104 fw_memcpy_from_be32(_dst, _src, size);
105}
106
107struct fw_card;
108struct fw_packet;
109struct fw_node;
110struct fw_request;
111
112struct fw_descriptor {
113 struct list_head link;
114 size_t length;
115 u32 immediate;
116 u32 key;
117 const u32 *data;
118};
119
120int fw_core_add_descriptor(struct fw_descriptor *desc);
121void fw_core_remove_descriptor(struct fw_descriptor *desc);
122
123typedef void (*fw_packet_callback_t)(struct fw_packet *packet,
124 struct fw_card *card, int status);
125
126typedef void (*fw_transaction_callback_t)(struct fw_card *card, int rcode,
127 void *data, size_t length,
128 void *callback_data);
129
130/*
131 * Important note: The callback must guarantee that either fw_send_response()
132 * or kfree() is called on the @request.
133 */
134typedef void (*fw_address_callback_t)(struct fw_card *card,
135 struct fw_request *request,
136 int tcode, int destination, int source,
137 int generation, int speed,
138 unsigned long long offset,
139 void *data, size_t length,
140 void *callback_data);
141
142struct fw_packet {
143 int speed;
144 int generation;
145 u32 header[4];
146 size_t header_length;
147 void *payload;
148 size_t payload_length;
149 dma_addr_t payload_bus;
150 u32 timestamp;
151
152 /*
153 * This callback is called when the packet transmission has
154 * completed; for successful transmission, the status code is
155 * the ack received from the destination, otherwise it's a
156 * negative errno: ENOMEM, ESTALE, ETIMEDOUT, ENODEV, EIO.
157 * The callback can be called from tasklet context and thus
158 * must never block.
159 */
160 fw_packet_callback_t callback;
161 int ack;
162 struct list_head link;
163 void *driver_data;
164};
165
166struct fw_transaction {
167 int node_id; /* The generation is implied; it is always the current. */
168 int tlabel;
169 int timestamp;
170 struct list_head link;
171
172 struct fw_packet packet;
173
174 /*
175 * The data passed to the callback is valid only during the
176 * callback.
177 */
178 fw_transaction_callback_t callback;
179 void *callback_data;
180};
181
182struct fw_address_handler {
183 u64 offset;
184 size_t length;
185 fw_address_callback_t address_callback;
186 void *callback_data;
187 struct list_head link;
188};
189
190struct fw_address_region {
191 u64 start;
192 u64 end;
193};
194
195extern const struct fw_address_region fw_high_memory_region;
196
197int fw_core_add_address_handler(struct fw_address_handler *handler,
198 const struct fw_address_region *region);
199void fw_core_remove_address_handler(struct fw_address_handler *handler);
200void fw_fill_response(struct fw_packet *response, u32 *request_header,
201 int rcode, void *payload, size_t length);
202void fw_send_response(struct fw_card *card,
203 struct fw_request *request, int rcode);
204
205extern struct bus_type fw_bus_type;
206
207struct fw_card {
208 const struct fw_card_driver *driver;
209 struct device *device;
210 struct kref kref;
211 struct completion done;
212
213 int node_id;
214 int generation;
215 int current_tlabel, tlabel_mask;
216 struct list_head transaction_list;
217 struct timer_list flush_timer;
218 unsigned long reset_jiffies;
219
220 unsigned long long guid;
221 unsigned max_receive;
222 int link_speed;
223 int config_rom_generation;
224
225 spinlock_t lock; /* Take this lock when handling the lists in
226 * this struct. */
227 struct fw_node *local_node;
228 struct fw_node *root_node;
229 struct fw_node *irm_node;
230 u8 color; /* must be u8 to match the definition in struct fw_node */
231 int gap_count;
232 bool beta_repeaters_present;
233
234 int index;
235
236 struct list_head link;
237
238 /* Work struct for BM duties. */
239 struct delayed_work work;
240 int bm_retries;
241 int bm_generation;
242
243 bool broadcast_channel_allocated;
244 u32 broadcast_channel;
245 u32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4];
246};
247
248static inline struct fw_card *fw_card_get(struct fw_card *card)
249{
250 kref_get(&card->kref);
251
252 return card;
253}
254
255void fw_card_release(struct kref *kref);
256
257static inline void fw_card_put(struct fw_card *card)
258{
259 kref_put(&card->kref, fw_card_release);
260}
261
262extern void fw_schedule_bm_work(struct fw_card *card, unsigned long delay);
263
264/*
265 * Check whether new_generation is the immediate successor of old_generation.
266 * Take counter roll-over at 255 (as per to OHCI) into account.
267 */
268static inline bool is_next_generation(int new_generation, int old_generation)
269{
270 return (new_generation & 0xff) == ((old_generation + 1) & 0xff);
271}
272
273/*
274 * The iso packet format allows for an immediate header/payload part
275 * stored in 'header' immediately after the packet info plus an
276 * indirect payload part that is pointer to by the 'payload' field.
277 * Applications can use one or the other or both to implement simple
278 * low-bandwidth streaming (e.g. audio) or more advanced
279 * scatter-gather streaming (e.g. assembling video frame automatically).
280 */
281
282struct fw_iso_packet {
283 u16 payload_length; /* Length of indirect payload. */
284 u32 interrupt : 1; /* Generate interrupt on this packet */
285 u32 skip : 1; /* Set to not send packet at all. */
286 u32 tag : 2;
287 u32 sy : 4;
288 u32 header_length : 8; /* Length of immediate header. */
289 u32 header[0];
290};
291
292#define FW_ISO_CONTEXT_TRANSMIT 0
293#define FW_ISO_CONTEXT_RECEIVE 1
294
295#define FW_ISO_CONTEXT_MATCH_TAG0 1
296#define FW_ISO_CONTEXT_MATCH_TAG1 2
297#define FW_ISO_CONTEXT_MATCH_TAG2 4
298#define FW_ISO_CONTEXT_MATCH_TAG3 8
299#define FW_ISO_CONTEXT_MATCH_ALL_TAGS 15
300
301struct fw_iso_context;
302
303typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
304 u32 cycle, size_t header_length,
305 void *header, void *data);
306
307/*
308 * An iso buffer is just a set of pages mapped for DMA in the
309 * specified direction. Since the pages are to be used for DMA, they
310 * are not mapped into the kernel virtual address space. We store the
311 * DMA address in the page private. The helper function
312 * fw_iso_buffer_map() will map the pages into a given vma.
313 */
314
315struct fw_iso_buffer {
316 enum dma_data_direction direction;
317 struct page **pages;
318 int page_count;
319};
320
321struct fw_iso_context {
322 struct fw_card *card;
323 int type;
324 int channel;
325 int speed;
326 size_t header_size;
327 fw_iso_callback_t callback;
328 void *callback_data;
329};
330
331int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
332 int page_count, enum dma_data_direction direction);
333int fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma);
334void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
335
336struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
337 int type, int channel, int speed, size_t header_size,
338 fw_iso_callback_t callback, void *callback_data);
339int fw_iso_context_queue(struct fw_iso_context *ctx,
340 struct fw_iso_packet *packet,
341 struct fw_iso_buffer *buffer,
342 unsigned long payload);
343int fw_iso_context_start(struct fw_iso_context *ctx,
344 int cycle, int sync, int tags);
345int fw_iso_context_stop(struct fw_iso_context *ctx);
346void fw_iso_context_destroy(struct fw_iso_context *ctx);
347
348void fw_iso_resource_manage(struct fw_card *card, int generation,
349 u64 channels_mask, int *channel, int *bandwidth, bool allocate);
350
351struct fw_card_driver {
352 /*
353 * Enable the given card with the given initial config rom.
354 * This function is expected to activate the card, and either
355 * enable the PHY or set the link_on bit and initiate a bus
356 * reset.
357 */
358 int (*enable)(struct fw_card *card, u32 *config_rom, size_t length);
359
360 int (*update_phy_reg)(struct fw_card *card, int address,
361 int clear_bits, int set_bits);
362
363 /*
364 * Update the config rom for an enabled card. This function
365 * should change the config rom that is presented on the bus
366 * an initiate a bus reset.
367 */
368 int (*set_config_rom)(struct fw_card *card,
369 u32 *config_rom, size_t length);
370
371 void (*send_request)(struct fw_card *card, struct fw_packet *packet);
372 void (*send_response)(struct fw_card *card, struct fw_packet *packet);
373 /* Calling cancel is valid once a packet has been submitted. */
374 int (*cancel_packet)(struct fw_card *card, struct fw_packet *packet);
375
376 /*
377 * Allow the specified node ID to do direct DMA out and in of
378 * host memory. The card will disable this for all node when
379 * a bus reset happens, so driver need to reenable this after
380 * bus reset. Returns 0 on success, -ENODEV if the card
381 * doesn't support this, -ESTALE if the generation doesn't
382 * match.
383 */
384 int (*enable_phys_dma)(struct fw_card *card,
385 int node_id, int generation);
386
387 u64 (*get_bus_time)(struct fw_card *card);
388
389 struct fw_iso_context *
390 (*allocate_iso_context)(struct fw_card *card,
391 int type, int channel, size_t header_size);
392 void (*free_iso_context)(struct fw_iso_context *ctx);
393
394 int (*start_iso)(struct fw_iso_context *ctx,
395 s32 cycle, u32 sync, u32 tags);
396
397 int (*queue_iso)(struct fw_iso_context *ctx,
398 struct fw_iso_packet *packet,
399 struct fw_iso_buffer *buffer,
400 unsigned long payload);
401
402 int (*stop_iso)(struct fw_iso_context *ctx);
403};
404
405int fw_core_initiate_bus_reset(struct fw_card *card, int short_reset);
406
407void fw_send_request(struct fw_card *card, struct fw_transaction *t,
408 int tcode, int destination_id, int generation, int speed,
409 unsigned long long offset, void *payload, size_t length,
410 fw_transaction_callback_t callback, void *callback_data);
411int fw_cancel_transaction(struct fw_card *card,
412 struct fw_transaction *transaction);
413void fw_flush_transactions(struct fw_card *card);
414int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
415 int generation, int speed, unsigned long long offset,
416 void *payload, size_t length);
417void fw_send_phy_config(struct fw_card *card,
418 int node_id, int generation, int gap_count);
419
420static inline int fw_stream_packet_destination_id(int tag, int channel, int sy)
421{
422 return tag << 14 | channel << 8 | sy;
423}
424
425/*
426 * Called by the topology code to inform the device code of node
427 * activity; found, lost, or updated nodes.
428 */
429void fw_node_event(struct fw_card *card, struct fw_node *node, int event);
430
431/* API used by card level drivers */
432
433void fw_card_initialize(struct fw_card *card,
434 const struct fw_card_driver *driver, struct device *device);
435int fw_card_add(struct fw_card *card,
436 u32 max_receive, u32 link_speed, u64 guid);
437void fw_core_remove_card(struct fw_card *card);
438void fw_core_handle_bus_reset(struct fw_card *card, int node_id,
439 int generation, int self_id_count, u32 *self_ids);
440void fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
441void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
442
443extern int fw_irm_set_broadcast_channel_register(struct device *dev,
444 void *data);
445
446#endif /* __fw_transaction_h */