aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire
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
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')
-rw-r--r--drivers/firewire/core.h293
-rw-r--r--drivers/firewire/fw-card.c6
-rw-r--r--drivers/firewire/fw-cdev.c5
-rw-r--r--drivers/firewire/fw-device.c9
-rw-r--r--drivers/firewire/fw-device.h190
-rw-r--r--drivers/firewire/fw-iso.c4
-rw-r--r--drivers/firewire/fw-ohci.c5
-rw-r--r--drivers/firewire/fw-sbp2.c4
-rw-r--r--drivers/firewire/fw-topology.c10
-rw-r--r--drivers/firewire/fw-topology.h77
-rw-r--r--drivers/firewire/fw-transaction.c8
-rw-r--r--drivers/firewire/fw-transaction.h446
-rw-r--r--drivers/firewire/ohci.h (renamed from drivers/firewire/fw-ohci.h)6
13 files changed, 326 insertions, 737 deletions
diff --git a/drivers/firewire/core.h b/drivers/firewire/core.h
new file mode 100644
index 000000000000..273f0ab82928
--- /dev/null
+++ b/drivers/firewire/core.h
@@ -0,0 +1,293 @@
1#ifndef _FIREWIRE_CORE_H
2#define _FIREWIRE_CORE_H
3
4#include <linux/dma-mapping.h>
5#include <linux/fs.h>
6#include <linux/list.h>
7#include <linux/idr.h>
8#include <linux/mm_types.h>
9#include <linux/rwsem.h>
10#include <linux/slab.h>
11#include <linux/types.h>
12
13#include <asm/atomic.h>
14
15struct device;
16struct fw_card;
17struct fw_device;
18struct fw_iso_buffer;
19struct fw_iso_context;
20struct fw_iso_packet;
21struct fw_node;
22struct fw_packet;
23
24
25/* -card */
26
27/* bitfields within the PHY registers */
28#define PHY_LINK_ACTIVE 0x80
29#define PHY_CONTENDER 0x40
30#define PHY_BUS_RESET 0x40
31#define PHY_BUS_SHORT_RESET 0x40
32
33#define BANDWIDTH_AVAILABLE_INITIAL 4915
34#define BROADCAST_CHANNEL_INITIAL (1 << 31 | 31)
35#define BROADCAST_CHANNEL_VALID (1 << 30)
36
37struct fw_card_driver {
38 /*
39 * Enable the given card with the given initial config rom.
40 * This function is expected to activate the card, and either
41 * enable the PHY or set the link_on bit and initiate a bus
42 * reset.
43 */
44 int (*enable)(struct fw_card *card, u32 *config_rom, size_t length);
45
46 int (*update_phy_reg)(struct fw_card *card, int address,
47 int clear_bits, int set_bits);
48
49 /*
50 * Update the config rom for an enabled card. This function
51 * should change the config rom that is presented on the bus
52 * an initiate a bus reset.
53 */
54 int (*set_config_rom)(struct fw_card *card,
55 u32 *config_rom, size_t length);
56
57 void (*send_request)(struct fw_card *card, struct fw_packet *packet);
58 void (*send_response)(struct fw_card *card, struct fw_packet *packet);
59 /* Calling cancel is valid once a packet has been submitted. */
60 int (*cancel_packet)(struct fw_card *card, struct fw_packet *packet);
61
62 /*
63 * Allow the specified node ID to do direct DMA out and in of
64 * host memory. The card will disable this for all node when
65 * a bus reset happens, so driver need to reenable this after
66 * bus reset. Returns 0 on success, -ENODEV if the card
67 * doesn't support this, -ESTALE if the generation doesn't
68 * match.
69 */
70 int (*enable_phys_dma)(struct fw_card *card,
71 int node_id, int generation);
72
73 u64 (*get_bus_time)(struct fw_card *card);
74
75 struct fw_iso_context *
76 (*allocate_iso_context)(struct fw_card *card,
77 int type, int channel, size_t header_size);
78 void (*free_iso_context)(struct fw_iso_context *ctx);
79
80 int (*start_iso)(struct fw_iso_context *ctx,
81 s32 cycle, u32 sync, u32 tags);
82
83 int (*queue_iso)(struct fw_iso_context *ctx,
84 struct fw_iso_packet *packet,
85 struct fw_iso_buffer *buffer,
86 unsigned long payload);
87
88 int (*stop_iso)(struct fw_iso_context *ctx);
89};
90
91void fw_card_initialize(struct fw_card *card,
92 const struct fw_card_driver *driver, struct device *device);
93int fw_card_add(struct fw_card *card,
94 u32 max_receive, u32 link_speed, u64 guid);
95void fw_core_remove_card(struct fw_card *card);
96int fw_core_initiate_bus_reset(struct fw_card *card, int short_reset);
97int fw_compute_block_crc(u32 *block);
98void fw_schedule_bm_work(struct fw_card *card, unsigned long delay);
99
100struct fw_descriptor {
101 struct list_head link;
102 size_t length;
103 u32 immediate;
104 u32 key;
105 const u32 *data;
106};
107
108int fw_core_add_descriptor(struct fw_descriptor *desc);
109void fw_core_remove_descriptor(struct fw_descriptor *desc);
110
111
112/* -cdev */
113
114extern const struct file_operations fw_device_ops;
115
116void fw_device_cdev_update(struct fw_device *device);
117void fw_device_cdev_remove(struct fw_device *device);
118
119
120/* -device */
121
122extern struct rw_semaphore fw_device_rwsem;
123extern struct idr fw_device_idr;
124extern int fw_cdev_major;
125
126struct fw_device *fw_device_get_by_devt(dev_t devt);
127void fw_device_set_broadcast_channel(struct fw_device *device, int generation);
128void fw_node_event(struct fw_card *card, struct fw_node *node, int event);
129
130
131/* -iso */
132
133/*
134 * The iso packet format allows for an immediate header/payload part
135 * stored in 'header' immediately after the packet info plus an
136 * indirect payload part that is pointer to by the 'payload' field.
137 * Applications can use one or the other or both to implement simple
138 * low-bandwidth streaming (e.g. audio) or more advanced
139 * scatter-gather streaming (e.g. assembling video frame automatically).
140 */
141struct fw_iso_packet {
142 u16 payload_length; /* Length of indirect payload. */
143 u32 interrupt:1; /* Generate interrupt on this packet */
144 u32 skip:1; /* Set to not send packet at all. */
145 u32 tag:2;
146 u32 sy:4;
147 u32 header_length:8; /* Length of immediate header. */
148 u32 header[0];
149};
150
151#define FW_ISO_CONTEXT_TRANSMIT 0
152#define FW_ISO_CONTEXT_RECEIVE 1
153
154#define FW_ISO_CONTEXT_MATCH_TAG0 1
155#define FW_ISO_CONTEXT_MATCH_TAG1 2
156#define FW_ISO_CONTEXT_MATCH_TAG2 4
157#define FW_ISO_CONTEXT_MATCH_TAG3 8
158#define FW_ISO_CONTEXT_MATCH_ALL_TAGS 15
159
160/*
161 * An iso buffer is just a set of pages mapped for DMA in the
162 * specified direction. Since the pages are to be used for DMA, they
163 * are not mapped into the kernel virtual address space. We store the
164 * DMA address in the page private. The helper function
165 * fw_iso_buffer_map() will map the pages into a given vma.
166 */
167struct fw_iso_buffer {
168 enum dma_data_direction direction;
169 struct page **pages;
170 int page_count;
171};
172
173typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
174 u32 cycle, size_t header_length,
175 void *header, void *data);
176
177struct fw_iso_context {
178 struct fw_card *card;
179 int type;
180 int channel;
181 int speed;
182 size_t header_size;
183 fw_iso_callback_t callback;
184 void *callback_data;
185};
186
187int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
188 int page_count, enum dma_data_direction direction);
189int fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma);
190void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
191
192struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
193 int type, int channel, int speed, size_t header_size,
194 fw_iso_callback_t callback, void *callback_data);
195int fw_iso_context_queue(struct fw_iso_context *ctx,
196 struct fw_iso_packet *packet,
197 struct fw_iso_buffer *buffer,
198 unsigned long payload);
199int fw_iso_context_start(struct fw_iso_context *ctx,
200 int cycle, int sync, int tags);
201int fw_iso_context_stop(struct fw_iso_context *ctx);
202void fw_iso_context_destroy(struct fw_iso_context *ctx);
203
204void fw_iso_resource_manage(struct fw_card *card, int generation,
205 u64 channels_mask, int *channel, int *bandwidth, bool allocate);
206
207
208/* -topology */
209
210enum {
211 FW_NODE_CREATED,
212 FW_NODE_UPDATED,
213 FW_NODE_DESTROYED,
214 FW_NODE_LINK_ON,
215 FW_NODE_LINK_OFF,
216 FW_NODE_INITIATED_RESET,
217};
218
219struct fw_node {
220 u16 node_id;
221 u8 color;
222 u8 port_count;
223 u8 link_on:1;
224 u8 initiated_reset:1;
225 u8 b_path:1;
226 u8 phy_speed:2; /* As in the self ID packet. */
227 u8 max_speed:2; /* Minimum of all phy-speeds on the path from the
228 * local node to this node. */
229 u8 max_depth:4; /* Maximum depth to any leaf node */
230 u8 max_hops:4; /* Max hops in this sub tree */
231 atomic_t ref_count;
232
233 /* For serializing node topology into a list. */
234 struct list_head link;
235
236 /* Upper layer specific data. */
237 void *data;
238
239 struct fw_node *ports[0];
240};
241
242static inline struct fw_node *fw_node_get(struct fw_node *node)
243{
244 atomic_inc(&node->ref_count);
245
246 return node;
247}
248
249static inline void fw_node_put(struct fw_node *node)
250{
251 if (atomic_dec_and_test(&node->ref_count))
252 kfree(node);
253}
254
255void fw_core_handle_bus_reset(struct fw_card *card, int node_id,
256 int generation, int self_id_count, u32 *self_ids);
257void fw_destroy_nodes(struct fw_card *card);
258
259/*
260 * Check whether new_generation is the immediate successor of old_generation.
261 * Take counter roll-over at 255 (as per OHCI) into account.
262 */
263static inline bool is_next_generation(int new_generation, int old_generation)
264{
265 return (new_generation & 0xff) == ((old_generation + 1) & 0xff);
266}
267
268
269/* -transaction */
270
271#define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4)
272#define TCODE_IS_BLOCK_PACKET(tcode) (((tcode) & 1) != 0)
273#define TCODE_IS_REQUEST(tcode) (((tcode) & 2) == 0)
274#define TCODE_IS_RESPONSE(tcode) (((tcode) & 2) != 0)
275#define TCODE_HAS_REQUEST_DATA(tcode) (((tcode) & 12) != 4)
276#define TCODE_HAS_RESPONSE_DATA(tcode) (((tcode) & 12) != 0)
277
278#define LOCAL_BUS 0xffc0
279
280void fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
281void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
282void fw_fill_response(struct fw_packet *response, u32 *request_header,
283 int rcode, void *payload, size_t length);
284void fw_flush_transactions(struct fw_card *card);
285void fw_send_phy_config(struct fw_card *card,
286 int node_id, int generation, int gap_count);
287
288static inline int fw_stream_packet_destination_id(int tag, int channel, int sy)
289{
290 return tag << 14 | channel << 8 | sy;
291}
292
293#endif /* _FIREWIRE_CORE_H */
diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c
index b6f55e262e7f..ba6cd70b8518 100644
--- a/drivers/firewire/fw-card.c
+++ b/drivers/firewire/fw-card.c
@@ -21,6 +21,8 @@
21#include <linux/crc-itu-t.h> 21#include <linux/crc-itu-t.h>
22#include <linux/device.h> 22#include <linux/device.h>
23#include <linux/errno.h> 23#include <linux/errno.h>
24#include <linux/firewire.h>
25#include <linux/firewire-constants.h>
24#include <linux/jiffies.h> 26#include <linux/jiffies.h>
25#include <linux/kernel.h> 27#include <linux/kernel.h>
26#include <linux/kref.h> 28#include <linux/kref.h>
@@ -34,9 +36,7 @@
34#include <asm/atomic.h> 36#include <asm/atomic.h>
35#include <asm/byteorder.h> 37#include <asm/byteorder.h>
36 38
37#include "fw-device.h" 39#include "core.h"
38#include "fw-topology.h"
39#include "fw-transaction.h"
40 40
41int fw_compute_block_crc(u32 *block) 41int fw_compute_block_crc(u32 *block)
42{ 42{
diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c
index 8a5e6ae2552c..042c04540474 100644
--- a/drivers/firewire/fw-cdev.c
+++ b/drivers/firewire/fw-cdev.c
@@ -22,6 +22,7 @@
22#include <linux/delay.h> 22#include <linux/delay.h>
23#include <linux/device.h> 23#include <linux/device.h>
24#include <linux/errno.h> 24#include <linux/errno.h>
25#include <linux/firewire.h>
25#include <linux/firewire-cdev.h> 26#include <linux/firewire-cdev.h>
26#include <linux/idr.h> 27#include <linux/idr.h>
27#include <linux/jiffies.h> 28#include <linux/jiffies.h>
@@ -41,9 +42,7 @@
41#include <asm/system.h> 42#include <asm/system.h>
42#include <asm/uaccess.h> 43#include <asm/uaccess.h>
43 44
44#include "fw-device.h" 45#include "core.h"
45#include "fw-topology.h"
46#include "fw-transaction.h"
47 46
48struct client { 47struct client {
49 u32 version; 48 u32 version;
diff --git a/drivers/firewire/fw-device.c b/drivers/firewire/fw-device.c
index 238acac5badb..65d84dd6c1de 100644
--- a/drivers/firewire/fw-device.c
+++ b/drivers/firewire/fw-device.c
@@ -22,6 +22,8 @@
22#include <linux/delay.h> 22#include <linux/delay.h>
23#include <linux/device.h> 23#include <linux/device.h>
24#include <linux/errno.h> 24#include <linux/errno.h>
25#include <linux/firewire.h>
26#include <linux/firewire-constants.h>
25#include <linux/idr.h> 27#include <linux/idr.h>
26#include <linux/jiffies.h> 28#include <linux/jiffies.h>
27#include <linux/kobject.h> 29#include <linux/kobject.h>
@@ -39,9 +41,7 @@
39#include <asm/byteorder.h> 41#include <asm/byteorder.h>
40#include <asm/system.h> 42#include <asm/system.h>
41 43
42#include "fw-device.h" 44#include "core.h"
43#include "fw-topology.h"
44#include "fw-transaction.h"
45 45
46void fw_csr_iterator_init(struct fw_csr_iterator *ci, u32 * p) 46void fw_csr_iterator_init(struct fw_csr_iterator *ci, u32 * p)
47{ 47{
@@ -94,8 +94,9 @@ static int fw_unit_match(struct device *dev, struct device_driver *drv)
94 return 0; 94 return 0;
95 95
96 device = fw_device(unit->device.parent); 96 device = fw_device(unit->device.parent);
97 id = container_of(drv, struct fw_driver, driver)->id_table;
97 98
98 for (id = fw_driver(drv)->id_table; id->match_flags != 0; id++) { 99 for (; id->match_flags != 0; id++) {
99 if (match_unit_directory(unit->directory, id->match_flags, id)) 100 if (match_unit_directory(unit->directory, id->match_flags, id))
100 return 1; 101 return 1;
101 102
diff --git a/drivers/firewire/fw-device.h b/drivers/firewire/fw-device.h
deleted file mode 100644
index e973c4361f48..000000000000
--- a/drivers/firewire/fw-device.h
+++ /dev/null
@@ -1,190 +0,0 @@
1/*
2 * Copyright (C) 2005-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_device_h
20#define __fw_device_h
21
22#include <linux/device.h>
23#include <linux/fs.h>
24#include <linux/idr.h>
25#include <linux/kernel.h>
26#include <linux/list.h>
27#include <linux/mod_devicetable.h>
28#include <linux/mutex.h>
29#include <linux/rwsem.h>
30#include <linux/sysfs.h>
31#include <linux/types.h>
32#include <linux/workqueue.h>
33
34#include <asm/atomic.h>
35
36enum fw_device_state {
37 FW_DEVICE_INITIALIZING,
38 FW_DEVICE_RUNNING,
39 FW_DEVICE_GONE,
40 FW_DEVICE_SHUTDOWN,
41};
42
43struct fw_attribute_group {
44 struct attribute_group *groups[2];
45 struct attribute_group group;
46 struct attribute *attrs[12];
47};
48
49struct fw_node;
50struct fw_card;
51
52/*
53 * Note, fw_device.generation always has to be read before fw_device.node_id.
54 * Use SMP memory barriers to ensure this. Otherwise requests will be sent
55 * to an outdated node_id if the generation was updated in the meantime due
56 * to a bus reset.
57 *
58 * Likewise, fw-core will take care to update .node_id before .generation so
59 * that whenever fw_device.generation is current WRT the actual bus generation,
60 * fw_device.node_id is guaranteed to be current too.
61 *
62 * The same applies to fw_device.card->node_id vs. fw_device.generation.
63 *
64 * fw_device.config_rom and fw_device.config_rom_length may be accessed during
65 * the lifetime of any fw_unit belonging to the fw_device, before device_del()
66 * was called on the last fw_unit. Alternatively, they may be accessed while
67 * holding fw_device_rwsem.
68 */
69struct fw_device {
70 atomic_t state;
71 struct fw_node *node;
72 int node_id;
73 int generation;
74 unsigned max_speed;
75 struct fw_card *card;
76 struct device device;
77
78 struct mutex client_list_mutex;
79 struct list_head client_list;
80
81 u32 *config_rom;
82 size_t config_rom_length;
83 int config_rom_retries;
84 unsigned is_local:1;
85 unsigned cmc:1;
86 unsigned bc_implemented:2;
87
88 struct delayed_work work;
89 struct fw_attribute_group attribute_group;
90};
91
92static inline struct fw_device *fw_device(struct device *dev)
93{
94 return container_of(dev, struct fw_device, device);
95}
96
97static inline int fw_device_is_shutdown(struct fw_device *device)
98{
99 return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN;
100}
101
102static inline struct fw_device *fw_device_get(struct fw_device *device)
103{
104 get_device(&device->device);
105
106 return device;
107}
108
109static inline void fw_device_put(struct fw_device *device)
110{
111 put_device(&device->device);
112}
113
114struct fw_device *fw_device_get_by_devt(dev_t devt);
115int fw_device_enable_phys_dma(struct fw_device *device);
116void fw_device_set_broadcast_channel(struct fw_device *device, int generation);
117
118void fw_device_cdev_update(struct fw_device *device);
119void fw_device_cdev_remove(struct fw_device *device);
120
121extern struct rw_semaphore fw_device_rwsem;
122extern struct idr fw_device_idr;
123extern int fw_cdev_major;
124
125/*
126 * fw_unit.directory must not be accessed after device_del(&fw_unit.device).
127 */
128struct fw_unit {
129 struct device device;
130 u32 *directory;
131 struct fw_attribute_group attribute_group;
132};
133
134static inline struct fw_unit *fw_unit(struct device *dev)
135{
136 return container_of(dev, struct fw_unit, device);
137}
138
139static inline struct fw_unit *fw_unit_get(struct fw_unit *unit)
140{
141 get_device(&unit->device);
142
143 return unit;
144}
145
146static inline void fw_unit_put(struct fw_unit *unit)
147{
148 put_device(&unit->device);
149}
150
151#define CSR_OFFSET 0x40
152#define CSR_LEAF 0x80
153#define CSR_DIRECTORY 0xc0
154
155#define CSR_DESCRIPTOR 0x01
156#define CSR_VENDOR 0x03
157#define CSR_HARDWARE_VERSION 0x04
158#define CSR_NODE_CAPABILITIES 0x0c
159#define CSR_UNIT 0x11
160#define CSR_SPECIFIER_ID 0x12
161#define CSR_VERSION 0x13
162#define CSR_DEPENDENT_INFO 0x14
163#define CSR_MODEL 0x17
164#define CSR_INSTANCE 0x18
165#define CSR_DIRECTORY_ID 0x20
166
167struct fw_csr_iterator {
168 u32 *p;
169 u32 *end;
170};
171
172void fw_csr_iterator_init(struct fw_csr_iterator *ci, u32 *p);
173int fw_csr_iterator_next(struct fw_csr_iterator *ci,
174 int *key, int *value);
175
176struct fw_driver {
177 struct device_driver driver;
178 /* Called when the parent device sits through a bus reset. */
179 void (*update)(struct fw_unit *unit);
180 const struct ieee1394_device_id *id_table;
181};
182
183static inline struct fw_driver *fw_driver(struct device_driver *drv)
184{
185 return container_of(drv, struct fw_driver, driver);
186}
187
188extern const struct file_operations fw_device_ops;
189
190#endif /* __fw_device_h */
diff --git a/drivers/firewire/fw-iso.c b/drivers/firewire/fw-iso.c
index 0ff3e9c42eb1..28076c892d7e 100644
--- a/drivers/firewire/fw-iso.c
+++ b/drivers/firewire/fw-iso.c
@@ -22,6 +22,7 @@
22 22
23#include <linux/dma-mapping.h> 23#include <linux/dma-mapping.h>
24#include <linux/errno.h> 24#include <linux/errno.h>
25#include <linux/firewire.h>
25#include <linux/firewire-constants.h> 26#include <linux/firewire-constants.h>
26#include <linux/kernel.h> 27#include <linux/kernel.h>
27#include <linux/mm.h> 28#include <linux/mm.h>
@@ -30,8 +31,7 @@
30 31
31#include <asm/byteorder.h> 32#include <asm/byteorder.h>
32 33
33#include "fw-topology.h" 34#include "core.h"
34#include "fw-transaction.h"
35 35
36/* 36/*
37 * Isochronous DMA context management 37 * Isochronous DMA context management
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
index d296d12909d6..ecddd11b797a 100644
--- a/drivers/firewire/fw-ohci.c
+++ b/drivers/firewire/fw-ohci.c
@@ -22,6 +22,7 @@
22#include <linux/delay.h> 22#include <linux/delay.h>
23#include <linux/device.h> 23#include <linux/device.h>
24#include <linux/dma-mapping.h> 24#include <linux/dma-mapping.h>
25#include <linux/firewire.h>
25#include <linux/firewire-constants.h> 26#include <linux/firewire-constants.h>
26#include <linux/gfp.h> 27#include <linux/gfp.h>
27#include <linux/init.h> 28#include <linux/init.h>
@@ -45,8 +46,8 @@
45#include <asm/pmac_feature.h> 46#include <asm/pmac_feature.h>
46#endif 47#endif
47 48
48#include "fw-ohci.h" 49#include "core.h"
49#include "fw-transaction.h" 50#include "ohci.h"
50 51
51#define DESCRIPTOR_OUTPUT_MORE 0 52#define DESCRIPTOR_OUTPUT_MORE 0
52#define DESCRIPTOR_OUTPUT_LAST (1 << 12) 53#define DESCRIPTOR_OUTPUT_LAST (1 << 12)
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
index 027b91f4a6e7..d41cb6e455bc 100644
--- a/drivers/firewire/fw-sbp2.c
+++ b/drivers/firewire/fw-sbp2.c
@@ -34,6 +34,7 @@
34#include <linux/delay.h> 34#include <linux/delay.h>
35#include <linux/device.h> 35#include <linux/device.h>
36#include <linux/dma-mapping.h> 36#include <linux/dma-mapping.h>
37#include <linux/firewire.h>
37#include <linux/firewire-constants.h> 38#include <linux/firewire-constants.h>
38#include <linux/init.h> 39#include <linux/init.h>
39#include <linux/jiffies.h> 40#include <linux/jiffies.h>
@@ -58,9 +59,6 @@
58#include <scsi/scsi_device.h> 59#include <scsi/scsi_device.h>
59#include <scsi/scsi_host.h> 60#include <scsi/scsi_host.h>
60 61
61#include "fw-device.h"
62#include "fw-transaction.h"
63
64/* 62/*
65 * So far only bridges from Oxford Semiconductor are known to support 63 * So far only bridges from Oxford Semiconductor are known to support
66 * concurrent logins. Depending on firmware, four or two concurrent logins 64 * concurrent logins. Depending on firmware, four or two concurrent logins
diff --git a/drivers/firewire/fw-topology.c b/drivers/firewire/fw-topology.c
index 6d0ea1bb7e23..fddf2b358936 100644
--- a/drivers/firewire/fw-topology.c
+++ b/drivers/firewire/fw-topology.c
@@ -20,6 +20,8 @@
20 20
21#include <linux/bug.h> 21#include <linux/bug.h>
22#include <linux/errno.h> 22#include <linux/errno.h>
23#include <linux/firewire.h>
24#include <linux/firewire-constants.h>
23#include <linux/jiffies.h> 25#include <linux/jiffies.h>
24#include <linux/kernel.h> 26#include <linux/kernel.h>
25#include <linux/list.h> 27#include <linux/list.h>
@@ -31,8 +33,7 @@
31#include <asm/atomic.h> 33#include <asm/atomic.h>
32#include <asm/system.h> 34#include <asm/system.h>
33 35
34#include "fw-topology.h" 36#include "core.h"
35#include "fw-transaction.h"
36 37
37#define SELF_ID_PHY_ID(q) (((q) >> 24) & 0x3f) 38#define SELF_ID_PHY_ID(q) (((q) >> 24) & 0x3f)
38#define SELF_ID_EXTENDED(q) (((q) >> 23) & 0x01) 39#define SELF_ID_EXTENDED(q) (((q) >> 23) & 0x01)
@@ -45,6 +46,11 @@
45 46
46#define SELF_ID_EXT_SEQUENCE(q) (((q) >> 20) & 0x07) 47#define SELF_ID_EXT_SEQUENCE(q) (((q) >> 20) & 0x07)
47 48
49#define SELFID_PORT_CHILD 0x3
50#define SELFID_PORT_PARENT 0x2
51#define SELFID_PORT_NCONN 0x1
52#define SELFID_PORT_NONE 0x0
53
48static u32 *count_ports(u32 *sid, int *total_port_count, int *child_port_count) 54static u32 *count_ports(u32 *sid, int *total_port_count, int *child_port_count)
49{ 55{
50 u32 q; 56 u32 q;
diff --git a/drivers/firewire/fw-topology.h b/drivers/firewire/fw-topology.h
deleted file mode 100644
index 3c497bb4fae4..000000000000
--- a/drivers/firewire/fw-topology.h
+++ /dev/null
@@ -1,77 +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_topology_h
20#define __fw_topology_h
21
22#include <linux/list.h>
23#include <linux/slab.h>
24
25#include <asm/atomic.h>
26
27enum {
28 FW_NODE_CREATED,
29 FW_NODE_UPDATED,
30 FW_NODE_DESTROYED,
31 FW_NODE_LINK_ON,
32 FW_NODE_LINK_OFF,
33 FW_NODE_INITIATED_RESET,
34};
35
36struct fw_node {
37 u16 node_id;
38 u8 color;
39 u8 port_count;
40 u8 link_on : 1;
41 u8 initiated_reset : 1;
42 u8 b_path : 1;
43 u8 phy_speed : 2; /* As in the self ID packet. */
44 u8 max_speed : 2; /* Minimum of all phy-speeds on the path from the
45 * local node to this node. */
46 u8 max_depth : 4; /* Maximum depth to any leaf node */
47 u8 max_hops : 4; /* Max hops in this sub tree */
48 atomic_t ref_count;
49
50 /* For serializing node topology into a list. */
51 struct list_head link;
52
53 /* Upper layer specific data. */
54 void *data;
55
56 struct fw_node *ports[0];
57};
58
59static inline struct fw_node *fw_node_get(struct fw_node *node)
60{
61 atomic_inc(&node->ref_count);
62
63 return node;
64}
65
66static inline void fw_node_put(struct fw_node *node)
67{
68 if (atomic_dec_and_test(&node->ref_count))
69 kfree(node);
70}
71
72struct fw_card;
73void fw_destroy_nodes(struct fw_card *card);
74
75int fw_compute_block_crc(u32 *block);
76
77#endif /* __fw_topology_h */
diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c
index 7008214e3336..9a6ce9ab2a67 100644
--- a/drivers/firewire/fw-transaction.c
+++ b/drivers/firewire/fw-transaction.c
@@ -22,6 +22,7 @@
22#include <linux/completion.h> 22#include <linux/completion.h>
23#include <linux/device.h> 23#include <linux/device.h>
24#include <linux/errno.h> 24#include <linux/errno.h>
25#include <linux/firewire.h>
25#include <linux/firewire-constants.h> 26#include <linux/firewire-constants.h>
26#include <linux/fs.h> 27#include <linux/fs.h>
27#include <linux/init.h> 28#include <linux/init.h>
@@ -38,8 +39,7 @@
38 39
39#include <asm/byteorder.h> 40#include <asm/byteorder.h>
40 41
41#include "fw-device.h" /* for fw_device_ops */ 42#include "core.h"
42#include "fw-transaction.h"
43 43
44#define HEADER_PRI(pri) ((pri) << 0) 44#define HEADER_PRI(pri) ((pri) << 0)
45#define HEADER_TCODE(tcode) ((tcode) << 4) 45#define HEADER_TCODE(tcode) ((tcode) << 4)
@@ -64,6 +64,10 @@
64#define HEADER_DESTINATION_IS_BROADCAST(q) \ 64#define HEADER_DESTINATION_IS_BROADCAST(q) \
65 (((q) & HEADER_DESTINATION(0x3f)) == HEADER_DESTINATION(0x3f)) 65 (((q) & HEADER_DESTINATION(0x3f)) == HEADER_DESTINATION(0x3f))
66 66
67#define PHY_PACKET_CONFIG 0x0
68#define PHY_PACKET_LINK_ON 0x1
69#define PHY_PACKET_SELF_ID 0x2
70
67#define PHY_CONFIG_GAP_COUNT(gap_count) (((gap_count) << 16) | (1 << 22)) 71#define PHY_CONFIG_GAP_COUNT(gap_count) (((gap_count) << 16) | (1 << 22))
68#define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23)) 72#define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23))
69#define PHY_IDENTIFIER(id) ((id) << 30) 73#define PHY_IDENTIFIER(id) ((id) << 30)
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 */
diff --git a/drivers/firewire/fw-ohci.h b/drivers/firewire/ohci.h
index a2fbb6240ca7..ba492d85c516 100644
--- a/drivers/firewire/fw-ohci.h
+++ b/drivers/firewire/ohci.h
@@ -1,5 +1,5 @@
1#ifndef __fw_ohci_h 1#ifndef _FIREWIRE_OHCI_H
2#define __fw_ohci_h 2#define _FIREWIRE_OHCI_H
3 3
4/* OHCI register map */ 4/* OHCI register map */
5 5
@@ -154,4 +154,4 @@
154 154
155#define OHCI1394_phy_tcode 0xe 155#define OHCI1394_phy_tcode 0xe
156 156
157#endif /* __fw_ohci_h */ 157#endif /* _FIREWIRE_OHCI_H */