Linux Audio

Check our new training course

Loading...
v5.9
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _LINUX_FIREWIRE_H
  3#define _LINUX_FIREWIRE_H
  4
  5#include <linux/completion.h>
  6#include <linux/device.h>
  7#include <linux/dma-mapping.h>
  8#include <linux/kernel.h>
  9#include <linux/kref.h>
 10#include <linux/list.h>
 11#include <linux/mutex.h>
 12#include <linux/spinlock.h>
 13#include <linux/sysfs.h>
 14#include <linux/timer.h>
 15#include <linux/types.h>
 16#include <linux/workqueue.h>
 17
 18#include <linux/atomic.h>
 19#include <asm/byteorder.h>
 20
 21#define CSR_REGISTER_BASE		0xfffff0000000ULL
 22
 23/* register offsets are relative to CSR_REGISTER_BASE */
 24#define CSR_STATE_CLEAR			0x0
 25#define CSR_STATE_SET			0x4
 26#define CSR_NODE_IDS			0x8
 27#define CSR_RESET_START			0xc
 28#define CSR_SPLIT_TIMEOUT_HI		0x18
 29#define CSR_SPLIT_TIMEOUT_LO		0x1c
 30#define CSR_CYCLE_TIME			0x200
 31#define CSR_BUS_TIME			0x204
 32#define CSR_BUSY_TIMEOUT		0x210
 33#define CSR_PRIORITY_BUDGET		0x218
 34#define CSR_BUS_MANAGER_ID		0x21c
 35#define CSR_BANDWIDTH_AVAILABLE		0x220
 36#define CSR_CHANNELS_AVAILABLE		0x224
 37#define CSR_CHANNELS_AVAILABLE_HI	0x224
 38#define CSR_CHANNELS_AVAILABLE_LO	0x228
 39#define CSR_MAINT_UTILITY		0x230
 40#define CSR_BROADCAST_CHANNEL		0x234
 41#define CSR_CONFIG_ROM			0x400
 42#define CSR_CONFIG_ROM_END		0x800
 43#define CSR_OMPR			0x900
 44#define CSR_OPCR(i)			(0x904 + (i) * 4)
 45#define CSR_IMPR			0x980
 46#define CSR_IPCR(i)			(0x984 + (i) * 4)
 47#define CSR_FCP_COMMAND			0xB00
 48#define CSR_FCP_RESPONSE		0xD00
 49#define CSR_FCP_END			0xF00
 50#define CSR_TOPOLOGY_MAP		0x1000
 51#define CSR_TOPOLOGY_MAP_END		0x1400
 52#define CSR_SPEED_MAP			0x2000
 53#define CSR_SPEED_MAP_END		0x3000
 54
 55#define CSR_OFFSET		0x40
 56#define CSR_LEAF		0x80
 57#define CSR_DIRECTORY		0xc0
 58
 59#define CSR_DESCRIPTOR		0x01
 60#define CSR_VENDOR		0x03
 61#define CSR_HARDWARE_VERSION	0x04
 62#define CSR_UNIT		0x11
 63#define CSR_SPECIFIER_ID	0x12
 64#define CSR_VERSION		0x13
 65#define CSR_DEPENDENT_INFO	0x14
 66#define CSR_MODEL		0x17
 67#define CSR_DIRECTORY_ID	0x20
 68
 69struct fw_csr_iterator {
 70	const u32 *p;
 71	const u32 *end;
 72};
 73
 74void fw_csr_iterator_init(struct fw_csr_iterator *ci, const u32 *p);
 75int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value);
 76int fw_csr_string(const u32 *directory, int key, char *buf, size_t size);
 77
 78extern struct bus_type fw_bus_type;
 79
 80struct fw_card_driver;
 81struct fw_node;
 82
 83struct fw_card {
 84	const struct fw_card_driver *driver;
 85	struct device *device;
 86	struct kref kref;
 87	struct completion done;
 88
 89	int node_id;
 90	int generation;
 91	int current_tlabel;
 92	u64 tlabel_mask;
 93	struct list_head transaction_list;
 94	u64 reset_jiffies;
 95
 96	u32 split_timeout_hi;
 97	u32 split_timeout_lo;
 98	unsigned int split_timeout_cycles;
 99	unsigned int split_timeout_jiffies;
100
101	unsigned long long guid;
102	unsigned max_receive;
103	int link_speed;
104	int config_rom_generation;
105
106	spinlock_t lock; /* Take this lock when handling the lists in
107			  * this struct. */
108	struct fw_node *local_node;
109	struct fw_node *root_node;
110	struct fw_node *irm_node;
111	u8 color; /* must be u8 to match the definition in struct fw_node */
112	int gap_count;
113	bool beta_repeaters_present;
114
115	int index;
116	struct list_head link;
117
118	struct list_head phy_receiver_list;
119
120	struct delayed_work br_work; /* bus reset job */
121	bool br_short;
122
123	struct delayed_work bm_work; /* bus manager job */
124	int bm_retries;
125	int bm_generation;
126	int bm_node_id;
127	bool bm_abdicate;
128
129	bool priority_budget_implemented;	/* controller feature */
130	bool broadcast_channel_auto_allocated;	/* controller feature */
131
132	bool broadcast_channel_allocated;
133	u32 broadcast_channel;
134	__be32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4];
135
136	__be32 maint_utility_register;
137};
138
139static inline struct fw_card *fw_card_get(struct fw_card *card)
140{
141	kref_get(&card->kref);
142
143	return card;
144}
145
146void fw_card_release(struct kref *kref);
147
148static inline void fw_card_put(struct fw_card *card)
149{
150	kref_put(&card->kref, fw_card_release);
151}
152
153struct fw_attribute_group {
154	struct attribute_group *groups[2];
155	struct attribute_group group;
156	struct attribute *attrs[13];
157};
158
159enum fw_device_state {
160	FW_DEVICE_INITIALIZING,
161	FW_DEVICE_RUNNING,
162	FW_DEVICE_GONE,
163	FW_DEVICE_SHUTDOWN,
164};
165
166/*
167 * Note, fw_device.generation always has to be read before fw_device.node_id.
168 * Use SMP memory barriers to ensure this.  Otherwise requests will be sent
169 * to an outdated node_id if the generation was updated in the meantime due
170 * to a bus reset.
171 *
172 * Likewise, fw-core will take care to update .node_id before .generation so
173 * that whenever fw_device.generation is current WRT the actual bus generation,
174 * fw_device.node_id is guaranteed to be current too.
175 *
176 * The same applies to fw_device.card->node_id vs. fw_device.generation.
177 *
178 * fw_device.config_rom and fw_device.config_rom_length may be accessed during
179 * the lifetime of any fw_unit belonging to the fw_device, before device_del()
180 * was called on the last fw_unit.  Alternatively, they may be accessed while
181 * holding fw_device_rwsem.
182 */
183struct fw_device {
184	atomic_t state;
185	struct fw_node *node;
186	int node_id;
187	int generation;
188	unsigned max_speed;
189	struct fw_card *card;
190	struct device device;
191
192	struct mutex client_list_mutex;
193	struct list_head client_list;
194
195	const u32 *config_rom;
196	size_t config_rom_length;
197	int config_rom_retries;
198	unsigned is_local:1;
199	unsigned max_rec:4;
200	unsigned cmc:1;
201	unsigned irmc:1;
202	unsigned bc_implemented:2;
203
204	work_func_t workfn;
205	struct delayed_work work;
206	struct fw_attribute_group attribute_group;
207};
208
209static inline struct fw_device *fw_device(struct device *dev)
210{
211	return container_of(dev, struct fw_device, device);
212}
213
214static inline int fw_device_is_shutdown(struct fw_device *device)
215{
216	return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN;
217}
218
219int fw_device_enable_phys_dma(struct fw_device *device);
220
221/*
222 * fw_unit.directory must not be accessed after device_del(&fw_unit.device).
223 */
224struct fw_unit {
225	struct device device;
226	const u32 *directory;
227	struct fw_attribute_group attribute_group;
228};
229
230static inline struct fw_unit *fw_unit(struct device *dev)
231{
232	return container_of(dev, struct fw_unit, device);
233}
234
235static inline struct fw_unit *fw_unit_get(struct fw_unit *unit)
236{
237	get_device(&unit->device);
238
239	return unit;
240}
241
242static inline void fw_unit_put(struct fw_unit *unit)
243{
244	put_device(&unit->device);
245}
246
247static inline struct fw_device *fw_parent_device(struct fw_unit *unit)
248{
249	return fw_device(unit->device.parent);
250}
251
252struct ieee1394_device_id;
253
254struct fw_driver {
255	struct device_driver driver;
256	int (*probe)(struct fw_unit *unit, const struct ieee1394_device_id *id);
257	/* Called when the parent device sits through a bus reset. */
258	void (*update)(struct fw_unit *unit);
259	void (*remove)(struct fw_unit *unit);
260	const struct ieee1394_device_id *id_table;
261};
262
263struct fw_packet;
264struct fw_request;
265
266typedef void (*fw_packet_callback_t)(struct fw_packet *packet,
267				     struct fw_card *card, int status);
268typedef void (*fw_transaction_callback_t)(struct fw_card *card, int rcode,
269					  void *data, size_t length,
270					  void *callback_data);
271/*
272 * This callback handles an inbound request subaction.  It is called in
273 * RCU read-side context, therefore must not sleep.
274 *
275 * The callback should not initiate outbound request subactions directly.
276 * Otherwise there is a danger of recursion of inbound and outbound
277 * transactions from and to the local node.
278 *
279 * The callback is responsible that either fw_send_response() or kfree()
280 * is called on the @request, except for FCP registers for which the core
281 * takes care of that.
282 */
283typedef void (*fw_address_callback_t)(struct fw_card *card,
284				      struct fw_request *request,
285				      int tcode, int destination, int source,
286				      int generation,
287				      unsigned long long offset,
288				      void *data, size_t length,
289				      void *callback_data);
290
291struct fw_packet {
292	int speed;
293	int generation;
294	u32 header[4];
295	size_t header_length;
296	void *payload;
297	size_t payload_length;
298	dma_addr_t payload_bus;
299	bool payload_mapped;
300	u32 timestamp;
301
302	/*
303	 * This callback is called when the packet transmission has completed.
304	 * For successful transmission, the status code is the ack received
305	 * from the destination.  Otherwise it is one of the juju-specific
306	 * rcodes:  RCODE_SEND_ERROR, _CANCELLED, _BUSY, _GENERATION, _NO_ACK.
307	 * The callback can be called from tasklet context and thus
308	 * must never block.
309	 */
310	fw_packet_callback_t callback;
311	int ack;
312	struct list_head link;
313	void *driver_data;
314};
315
316struct fw_transaction {
317	int node_id; /* The generation is implied; it is always the current. */
318	int tlabel;
319	struct list_head link;
320	struct fw_card *card;
321	bool is_split_transaction;
322	struct timer_list split_timeout_timer;
323
324	struct fw_packet packet;
325
326	/*
327	 * The data passed to the callback is valid only during the
328	 * callback.
329	 */
330	fw_transaction_callback_t callback;
331	void *callback_data;
332};
333
334struct fw_address_handler {
335	u64 offset;
336	u64 length;
337	fw_address_callback_t address_callback;
338	void *callback_data;
339	struct list_head link;
340};
341
342struct fw_address_region {
343	u64 start;
344	u64 end;
345};
346
347extern const struct fw_address_region fw_high_memory_region;
348
349int fw_core_add_address_handler(struct fw_address_handler *handler,
350				const struct fw_address_region *region);
351void fw_core_remove_address_handler(struct fw_address_handler *handler);
352void fw_send_response(struct fw_card *card,
353		      struct fw_request *request, int rcode);
354int fw_get_request_speed(struct fw_request *request);
355void fw_send_request(struct fw_card *card, struct fw_transaction *t,
356		     int tcode, int destination_id, int generation, int speed,
357		     unsigned long long offset, void *payload, size_t length,
358		     fw_transaction_callback_t callback, void *callback_data);
359int fw_cancel_transaction(struct fw_card *card,
360			  struct fw_transaction *transaction);
361int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
362		       int generation, int speed, unsigned long long offset,
363		       void *payload, size_t length);
364const char *fw_rcode_string(int rcode);
365
366static inline int fw_stream_packet_destination_id(int tag, int channel, int sy)
367{
368	return tag << 14 | channel << 8 | sy;
369}
370
371void fw_schedule_bus_reset(struct fw_card *card, bool delayed,
372			   bool short_reset);
373
374struct fw_descriptor {
375	struct list_head link;
376	size_t length;
377	u32 immediate;
378	u32 key;
379	const u32 *data;
380};
381
382int fw_core_add_descriptor(struct fw_descriptor *desc);
383void fw_core_remove_descriptor(struct fw_descriptor *desc);
384
385/*
386 * The iso packet format allows for an immediate header/payload part
387 * stored in 'header' immediately after the packet info plus an
388 * indirect payload part that is pointer to by the 'payload' field.
389 * Applications can use one or the other or both to implement simple
390 * low-bandwidth streaming (e.g. audio) or more advanced
391 * scatter-gather streaming (e.g. assembling video frame automatically).
392 */
393struct fw_iso_packet {
394	u16 payload_length;	/* Length of indirect payload		*/
395	u32 interrupt:1;	/* Generate interrupt on this packet	*/
396	u32 skip:1;		/* tx: Set to not send packet at all	*/
397				/* rx: Sync bit, wait for matching sy	*/
398	u32 tag:2;		/* tx: Tag in packet header		*/
399	u32 sy:4;		/* tx: Sy in packet header		*/
400	u32 header_length:8;	/* Length of immediate header		*/
401	u32 header[0];		/* tx: Top of 1394 isoch. data_block	*/
402};
403
404#define FW_ISO_CONTEXT_TRANSMIT			0
405#define FW_ISO_CONTEXT_RECEIVE			1
406#define FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL	2
407
408#define FW_ISO_CONTEXT_MATCH_TAG0	 1
409#define FW_ISO_CONTEXT_MATCH_TAG1	 2
410#define FW_ISO_CONTEXT_MATCH_TAG2	 4
411#define FW_ISO_CONTEXT_MATCH_TAG3	 8
412#define FW_ISO_CONTEXT_MATCH_ALL_TAGS	15
413
414/*
415 * An iso buffer is just a set of pages mapped for DMA in the
416 * specified direction.  Since the pages are to be used for DMA, they
417 * are not mapped into the kernel virtual address space.  We store the
418 * DMA address in the page private. The helper function
419 * fw_iso_buffer_map() will map the pages into a given vma.
420 */
421struct fw_iso_buffer {
422	enum dma_data_direction direction;
423	struct page **pages;
424	int page_count;
425	int page_count_mapped;
426};
427
428int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
429		       int page_count, enum dma_data_direction direction);
430void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
431size_t fw_iso_buffer_lookup(struct fw_iso_buffer *buffer, dma_addr_t completed);
432
433struct fw_iso_context;
434typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
435				  u32 cycle, size_t header_length,
436				  void *header, void *data);
437typedef void (*fw_iso_mc_callback_t)(struct fw_iso_context *context,
438				     dma_addr_t completed, void *data);
439struct fw_iso_context {
440	struct fw_card *card;
441	int type;
442	int channel;
443	int speed;
444	bool drop_overflow_headers;
445	size_t header_size;
446	union {
447		fw_iso_callback_t sc;
448		fw_iso_mc_callback_t mc;
449	} callback;
450	void *callback_data;
451};
452
453struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
454		int type, int channel, int speed, size_t header_size,
455		fw_iso_callback_t callback, void *callback_data);
456int fw_iso_context_set_channels(struct fw_iso_context *ctx, u64 *channels);
457int fw_iso_context_queue(struct fw_iso_context *ctx,
458			 struct fw_iso_packet *packet,
459			 struct fw_iso_buffer *buffer,
460			 unsigned long payload);
461void fw_iso_context_queue_flush(struct fw_iso_context *ctx);
462int fw_iso_context_flush_completions(struct fw_iso_context *ctx);
463int fw_iso_context_start(struct fw_iso_context *ctx,
464			 int cycle, int sync, int tags);
465int fw_iso_context_stop(struct fw_iso_context *ctx);
466void fw_iso_context_destroy(struct fw_iso_context *ctx);
467void fw_iso_resource_manage(struct fw_card *card, int generation,
468			    u64 channels_mask, int *channel, int *bandwidth,
469			    bool allocate);
470
471extern struct workqueue_struct *fw_workqueue;
472
473#endif /* _LINUX_FIREWIRE_H */
v3.5.6
 
  1#ifndef _LINUX_FIREWIRE_H
  2#define _LINUX_FIREWIRE_H
  3
  4#include <linux/completion.h>
  5#include <linux/device.h>
  6#include <linux/dma-mapping.h>
  7#include <linux/kernel.h>
  8#include <linux/kref.h>
  9#include <linux/list.h>
 10#include <linux/mutex.h>
 11#include <linux/spinlock.h>
 12#include <linux/sysfs.h>
 13#include <linux/timer.h>
 14#include <linux/types.h>
 15#include <linux/workqueue.h>
 16
 17#include <linux/atomic.h>
 18#include <asm/byteorder.h>
 19
 20#define CSR_REGISTER_BASE		0xfffff0000000ULL
 21
 22/* register offsets are relative to CSR_REGISTER_BASE */
 23#define CSR_STATE_CLEAR			0x0
 24#define CSR_STATE_SET			0x4
 25#define CSR_NODE_IDS			0x8
 26#define CSR_RESET_START			0xc
 27#define CSR_SPLIT_TIMEOUT_HI		0x18
 28#define CSR_SPLIT_TIMEOUT_LO		0x1c
 29#define CSR_CYCLE_TIME			0x200
 30#define CSR_BUS_TIME			0x204
 31#define CSR_BUSY_TIMEOUT		0x210
 32#define CSR_PRIORITY_BUDGET		0x218
 33#define CSR_BUS_MANAGER_ID		0x21c
 34#define CSR_BANDWIDTH_AVAILABLE		0x220
 35#define CSR_CHANNELS_AVAILABLE		0x224
 36#define CSR_CHANNELS_AVAILABLE_HI	0x224
 37#define CSR_CHANNELS_AVAILABLE_LO	0x228
 38#define CSR_MAINT_UTILITY		0x230
 39#define CSR_BROADCAST_CHANNEL		0x234
 40#define CSR_CONFIG_ROM			0x400
 41#define CSR_CONFIG_ROM_END		0x800
 42#define CSR_OMPR			0x900
 43#define CSR_OPCR(i)			(0x904 + (i) * 4)
 44#define CSR_IMPR			0x980
 45#define CSR_IPCR(i)			(0x984 + (i) * 4)
 46#define CSR_FCP_COMMAND			0xB00
 47#define CSR_FCP_RESPONSE		0xD00
 48#define CSR_FCP_END			0xF00
 49#define CSR_TOPOLOGY_MAP		0x1000
 50#define CSR_TOPOLOGY_MAP_END		0x1400
 51#define CSR_SPEED_MAP			0x2000
 52#define CSR_SPEED_MAP_END		0x3000
 53
 54#define CSR_OFFSET		0x40
 55#define CSR_LEAF		0x80
 56#define CSR_DIRECTORY		0xc0
 57
 58#define CSR_DESCRIPTOR		0x01
 59#define CSR_VENDOR		0x03
 60#define CSR_HARDWARE_VERSION	0x04
 61#define CSR_UNIT		0x11
 62#define CSR_SPECIFIER_ID	0x12
 63#define CSR_VERSION		0x13
 64#define CSR_DEPENDENT_INFO	0x14
 65#define CSR_MODEL		0x17
 66#define CSR_DIRECTORY_ID	0x20
 67
 68struct fw_csr_iterator {
 69	const u32 *p;
 70	const u32 *end;
 71};
 72
 73void fw_csr_iterator_init(struct fw_csr_iterator *ci, const u32 *p);
 74int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value);
 75int fw_csr_string(const u32 *directory, int key, char *buf, size_t size);
 76
 77extern struct bus_type fw_bus_type;
 78
 79struct fw_card_driver;
 80struct fw_node;
 81
 82struct fw_card {
 83	const struct fw_card_driver *driver;
 84	struct device *device;
 85	struct kref kref;
 86	struct completion done;
 87
 88	int node_id;
 89	int generation;
 90	int current_tlabel;
 91	u64 tlabel_mask;
 92	struct list_head transaction_list;
 93	u64 reset_jiffies;
 94
 95	u32 split_timeout_hi;
 96	u32 split_timeout_lo;
 97	unsigned int split_timeout_cycles;
 98	unsigned int split_timeout_jiffies;
 99
100	unsigned long long guid;
101	unsigned max_receive;
102	int link_speed;
103	int config_rom_generation;
104
105	spinlock_t lock; /* Take this lock when handling the lists in
106			  * this struct. */
107	struct fw_node *local_node;
108	struct fw_node *root_node;
109	struct fw_node *irm_node;
110	u8 color; /* must be u8 to match the definition in struct fw_node */
111	int gap_count;
112	bool beta_repeaters_present;
113
114	int index;
115	struct list_head link;
116
117	struct list_head phy_receiver_list;
118
119	struct delayed_work br_work; /* bus reset job */
120	bool br_short;
121
122	struct delayed_work bm_work; /* bus manager job */
123	int bm_retries;
124	int bm_generation;
125	int bm_node_id;
126	bool bm_abdicate;
127
128	bool priority_budget_implemented;	/* controller feature */
129	bool broadcast_channel_auto_allocated;	/* controller feature */
130
131	bool broadcast_channel_allocated;
132	u32 broadcast_channel;
133	__be32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4];
134
135	__be32 maint_utility_register;
136};
137
138static inline struct fw_card *fw_card_get(struct fw_card *card)
139{
140	kref_get(&card->kref);
141
142	return card;
143}
144
145void fw_card_release(struct kref *kref);
146
147static inline void fw_card_put(struct fw_card *card)
148{
149	kref_put(&card->kref, fw_card_release);
150}
151
152struct fw_attribute_group {
153	struct attribute_group *groups[2];
154	struct attribute_group group;
155	struct attribute *attrs[12];
156};
157
158enum fw_device_state {
159	FW_DEVICE_INITIALIZING,
160	FW_DEVICE_RUNNING,
161	FW_DEVICE_GONE,
162	FW_DEVICE_SHUTDOWN,
163};
164
165/*
166 * Note, fw_device.generation always has to be read before fw_device.node_id.
167 * Use SMP memory barriers to ensure this.  Otherwise requests will be sent
168 * to an outdated node_id if the generation was updated in the meantime due
169 * to a bus reset.
170 *
171 * Likewise, fw-core will take care to update .node_id before .generation so
172 * that whenever fw_device.generation is current WRT the actual bus generation,
173 * fw_device.node_id is guaranteed to be current too.
174 *
175 * The same applies to fw_device.card->node_id vs. fw_device.generation.
176 *
177 * fw_device.config_rom and fw_device.config_rom_length may be accessed during
178 * the lifetime of any fw_unit belonging to the fw_device, before device_del()
179 * was called on the last fw_unit.  Alternatively, they may be accessed while
180 * holding fw_device_rwsem.
181 */
182struct fw_device {
183	atomic_t state;
184	struct fw_node *node;
185	int node_id;
186	int generation;
187	unsigned max_speed;
188	struct fw_card *card;
189	struct device device;
190
191	struct mutex client_list_mutex;
192	struct list_head client_list;
193
194	const u32 *config_rom;
195	size_t config_rom_length;
196	int config_rom_retries;
197	unsigned is_local:1;
198	unsigned max_rec:4;
199	unsigned cmc:1;
200	unsigned irmc:1;
201	unsigned bc_implemented:2;
202
 
203	struct delayed_work work;
204	struct fw_attribute_group attribute_group;
205};
206
207static inline struct fw_device *fw_device(struct device *dev)
208{
209	return container_of(dev, struct fw_device, device);
210}
211
212static inline int fw_device_is_shutdown(struct fw_device *device)
213{
214	return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN;
215}
216
217int fw_device_enable_phys_dma(struct fw_device *device);
218
219/*
220 * fw_unit.directory must not be accessed after device_del(&fw_unit.device).
221 */
222struct fw_unit {
223	struct device device;
224	const u32 *directory;
225	struct fw_attribute_group attribute_group;
226};
227
228static inline struct fw_unit *fw_unit(struct device *dev)
229{
230	return container_of(dev, struct fw_unit, device);
231}
232
233static inline struct fw_unit *fw_unit_get(struct fw_unit *unit)
234{
235	get_device(&unit->device);
236
237	return unit;
238}
239
240static inline void fw_unit_put(struct fw_unit *unit)
241{
242	put_device(&unit->device);
243}
244
245static inline struct fw_device *fw_parent_device(struct fw_unit *unit)
246{
247	return fw_device(unit->device.parent);
248}
249
250struct ieee1394_device_id;
251
252struct fw_driver {
253	struct device_driver driver;
 
254	/* Called when the parent device sits through a bus reset. */
255	void (*update)(struct fw_unit *unit);
 
256	const struct ieee1394_device_id *id_table;
257};
258
259struct fw_packet;
260struct fw_request;
261
262typedef void (*fw_packet_callback_t)(struct fw_packet *packet,
263				     struct fw_card *card, int status);
264typedef void (*fw_transaction_callback_t)(struct fw_card *card, int rcode,
265					  void *data, size_t length,
266					  void *callback_data);
267/*
268 * Important note:  Except for the FCP registers, the callback must guarantee
269 * that either fw_send_response() or kfree() is called on the @request.
 
 
 
 
 
 
 
 
270 */
271typedef void (*fw_address_callback_t)(struct fw_card *card,
272				      struct fw_request *request,
273				      int tcode, int destination, int source,
274				      int generation,
275				      unsigned long long offset,
276				      void *data, size_t length,
277				      void *callback_data);
278
279struct fw_packet {
280	int speed;
281	int generation;
282	u32 header[4];
283	size_t header_length;
284	void *payload;
285	size_t payload_length;
286	dma_addr_t payload_bus;
287	bool payload_mapped;
288	u32 timestamp;
289
290	/*
291	 * This callback is called when the packet transmission has completed.
292	 * For successful transmission, the status code is the ack received
293	 * from the destination.  Otherwise it is one of the juju-specific
294	 * rcodes:  RCODE_SEND_ERROR, _CANCELLED, _BUSY, _GENERATION, _NO_ACK.
295	 * The callback can be called from tasklet context and thus
296	 * must never block.
297	 */
298	fw_packet_callback_t callback;
299	int ack;
300	struct list_head link;
301	void *driver_data;
302};
303
304struct fw_transaction {
305	int node_id; /* The generation is implied; it is always the current. */
306	int tlabel;
307	struct list_head link;
308	struct fw_card *card;
309	bool is_split_transaction;
310	struct timer_list split_timeout_timer;
311
312	struct fw_packet packet;
313
314	/*
315	 * The data passed to the callback is valid only during the
316	 * callback.
317	 */
318	fw_transaction_callback_t callback;
319	void *callback_data;
320};
321
322struct fw_address_handler {
323	u64 offset;
324	size_t length;
325	fw_address_callback_t address_callback;
326	void *callback_data;
327	struct list_head link;
328};
329
330struct fw_address_region {
331	u64 start;
332	u64 end;
333};
334
335extern const struct fw_address_region fw_high_memory_region;
336
337int fw_core_add_address_handler(struct fw_address_handler *handler,
338				const struct fw_address_region *region);
339void fw_core_remove_address_handler(struct fw_address_handler *handler);
340void fw_send_response(struct fw_card *card,
341		      struct fw_request *request, int rcode);
342int fw_get_request_speed(struct fw_request *request);
343void fw_send_request(struct fw_card *card, struct fw_transaction *t,
344		     int tcode, int destination_id, int generation, int speed,
345		     unsigned long long offset, void *payload, size_t length,
346		     fw_transaction_callback_t callback, void *callback_data);
347int fw_cancel_transaction(struct fw_card *card,
348			  struct fw_transaction *transaction);
349int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
350		       int generation, int speed, unsigned long long offset,
351		       void *payload, size_t length);
352const char *fw_rcode_string(int rcode);
353
354static inline int fw_stream_packet_destination_id(int tag, int channel, int sy)
355{
356	return tag << 14 | channel << 8 | sy;
357}
358
 
 
 
359struct fw_descriptor {
360	struct list_head link;
361	size_t length;
362	u32 immediate;
363	u32 key;
364	const u32 *data;
365};
366
367int fw_core_add_descriptor(struct fw_descriptor *desc);
368void fw_core_remove_descriptor(struct fw_descriptor *desc);
369
370/*
371 * The iso packet format allows for an immediate header/payload part
372 * stored in 'header' immediately after the packet info plus an
373 * indirect payload part that is pointer to by the 'payload' field.
374 * Applications can use one or the other or both to implement simple
375 * low-bandwidth streaming (e.g. audio) or more advanced
376 * scatter-gather streaming (e.g. assembling video frame automatically).
377 */
378struct fw_iso_packet {
379	u16 payload_length;	/* Length of indirect payload		*/
380	u32 interrupt:1;	/* Generate interrupt on this packet	*/
381	u32 skip:1;		/* tx: Set to not send packet at all	*/
382				/* rx: Sync bit, wait for matching sy	*/
383	u32 tag:2;		/* tx: Tag in packet header		*/
384	u32 sy:4;		/* tx: Sy in packet header		*/
385	u32 header_length:8;	/* Length of immediate header		*/
386	u32 header[0];		/* tx: Top of 1394 isoch. data_block	*/
387};
388
389#define FW_ISO_CONTEXT_TRANSMIT			0
390#define FW_ISO_CONTEXT_RECEIVE			1
391#define FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL	2
392
393#define FW_ISO_CONTEXT_MATCH_TAG0	 1
394#define FW_ISO_CONTEXT_MATCH_TAG1	 2
395#define FW_ISO_CONTEXT_MATCH_TAG2	 4
396#define FW_ISO_CONTEXT_MATCH_TAG3	 8
397#define FW_ISO_CONTEXT_MATCH_ALL_TAGS	15
398
399/*
400 * An iso buffer is just a set of pages mapped for DMA in the
401 * specified direction.  Since the pages are to be used for DMA, they
402 * are not mapped into the kernel virtual address space.  We store the
403 * DMA address in the page private. The helper function
404 * fw_iso_buffer_map() will map the pages into a given vma.
405 */
406struct fw_iso_buffer {
407	enum dma_data_direction direction;
408	struct page **pages;
409	int page_count;
410	int page_count_mapped;
411};
412
413int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
414		       int page_count, enum dma_data_direction direction);
415void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
416size_t fw_iso_buffer_lookup(struct fw_iso_buffer *buffer, dma_addr_t completed);
417
418struct fw_iso_context;
419typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
420				  u32 cycle, size_t header_length,
421				  void *header, void *data);
422typedef void (*fw_iso_mc_callback_t)(struct fw_iso_context *context,
423				     dma_addr_t completed, void *data);
424struct fw_iso_context {
425	struct fw_card *card;
426	int type;
427	int channel;
428	int speed;
 
429	size_t header_size;
430	union {
431		fw_iso_callback_t sc;
432		fw_iso_mc_callback_t mc;
433	} callback;
434	void *callback_data;
435};
436
437struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
438		int type, int channel, int speed, size_t header_size,
439		fw_iso_callback_t callback, void *callback_data);
440int fw_iso_context_set_channels(struct fw_iso_context *ctx, u64 *channels);
441int fw_iso_context_queue(struct fw_iso_context *ctx,
442			 struct fw_iso_packet *packet,
443			 struct fw_iso_buffer *buffer,
444			 unsigned long payload);
445void fw_iso_context_queue_flush(struct fw_iso_context *ctx);
446int fw_iso_context_flush_completions(struct fw_iso_context *ctx);
447int fw_iso_context_start(struct fw_iso_context *ctx,
448			 int cycle, int sync, int tags);
449int fw_iso_context_stop(struct fw_iso_context *ctx);
450void fw_iso_context_destroy(struct fw_iso_context *ctx);
451void fw_iso_resource_manage(struct fw_card *card, int generation,
452			    u64 channels_mask, int *channel, int *bandwidth,
453			    bool allocate);
454
455extern struct workqueue_struct *fw_workqueue;
456
457#endif /* _LINUX_FIREWIRE_H */