aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/firewire.h
diff options
context:
space:
mode:
authorJay Fenlason <fenlason@redhat.com>2009-05-18 13:08:06 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2009-06-14 08:26:28 -0400
commitc76acec6d55107b652a37c90b36c00bc8b04dabb (patch)
treef51f4cea0bd006352bc636586717d009e24ef3c3 /include/linux/firewire.h
parent1e626fdcef61460dc75fe7377f38bb019722b848 (diff)
firewire: add IPv4 support
Implement IPv4 over IEEE 1394 as per RFC 2734 for the newer firewire stack. This feature has only been present in the older ieee1394 stack via the eth1394 driver. Still to do: - fix ipv4_priv and ipv4_node lifetime logic - fix determination of speeds and max payloads - fix bus reset handling - fix unaligned memory accesses - fix coding style - further testing/ improvement of fragment reassembly - perhaps multicast support Signed-off-by: Jay Fenlason <fenlason@redhat.com> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> (rebased, copyright note, changelog)
Diffstat (limited to 'include/linux/firewire.h')
-rw-r--r--include/linux/firewire.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/include/linux/firewire.h b/include/linux/firewire.h
index e584b7215e8b..d44f47d3b2d9 100644
--- a/include/linux/firewire.h
+++ b/include/linux/firewire.h
@@ -3,6 +3,7 @@
3 3
4#include <linux/completion.h> 4#include <linux/completion.h>
5#include <linux/device.h> 5#include <linux/device.h>
6#include <linux/dma-mapping.h>
6#include <linux/kernel.h> 7#include <linux/kernel.h>
7#include <linux/kref.h> 8#include <linux/kref.h>
8#include <linux/list.h> 9#include <linux/list.h>
@@ -130,6 +131,13 @@ struct fw_card {
130 bool broadcast_channel_allocated; 131 bool broadcast_channel_allocated;
131 u32 broadcast_channel; 132 u32 broadcast_channel;
132 u32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4]; 133 u32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4];
134 /* Only non-NULL if firewire-ipv4 is active on this card. */
135 void *netdev;
136 /*
137 * The nodes get probed before the card, so we need a place to store
138 * them independent of card->netdev
139 */
140 struct list_head ipv4_nodes;
133}; 141};
134 142
135static inline struct fw_card *fw_card_get(struct fw_card *card) 143static inline struct fw_card *fw_card_get(struct fw_card *card)
@@ -355,4 +363,90 @@ int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
355 int generation, int speed, unsigned long long offset, 363 int generation, int speed, unsigned long long offset,
356 void *payload, size_t length); 364 void *payload, size_t length);
357 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
371struct fw_descriptor {
372 struct list_head link;
373 size_t length;
374 u32 immediate;
375 u32 key;
376 const u32 *data;
377};
378
379int fw_core_add_descriptor(struct fw_descriptor *desc);
380void fw_core_remove_descriptor(struct fw_descriptor *desc);
381
382/*
383 * The iso packet format allows for an immediate header/payload part
384 * stored in 'header' immediately after the packet info plus an
385 * indirect payload part that is pointer to by the 'payload' field.
386 * Applications can use one or the other or both to implement simple
387 * low-bandwidth streaming (e.g. audio) or more advanced
388 * scatter-gather streaming (e.g. assembling video frame automatically).
389 */
390struct fw_iso_packet {
391 u16 payload_length; /* Length of indirect payload. */
392 u32 interrupt:1; /* Generate interrupt on this packet */
393 u32 skip:1; /* Set to not send packet at all. */
394 u32 tag:2;
395 u32 sy:4;
396 u32 header_length:8; /* Length of immediate header. */
397 u32 header[0];
398};
399
400#define FW_ISO_CONTEXT_TRANSMIT 0
401#define FW_ISO_CONTEXT_RECEIVE 1
402
403#define FW_ISO_CONTEXT_MATCH_TAG0 1
404#define FW_ISO_CONTEXT_MATCH_TAG1 2
405#define FW_ISO_CONTEXT_MATCH_TAG2 4
406#define FW_ISO_CONTEXT_MATCH_TAG3 8
407#define FW_ISO_CONTEXT_MATCH_ALL_TAGS 15
408
409/*
410 * An iso buffer is just a set of pages mapped for DMA in the
411 * specified direction. Since the pages are to be used for DMA, they
412 * are not mapped into the kernel virtual address space. We store the
413 * DMA address in the page private. The helper function
414 * fw_iso_buffer_map() will map the pages into a given vma.
415 */
416struct fw_iso_buffer {
417 enum dma_data_direction direction;
418 struct page **pages;
419 int page_count;
420};
421
422int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
423 int page_count, enum dma_data_direction direction);
424void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
425
426struct fw_iso_context;
427typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
428 u32 cycle, size_t header_length,
429 void *header, void *data);
430struct fw_iso_context {
431 struct fw_card *card;
432 int type;
433 int channel;
434 int speed;
435 size_t header_size;
436 fw_iso_callback_t callback;
437 void *callback_data;
438};
439
440struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
441 int type, int channel, int speed, size_t header_size,
442 fw_iso_callback_t callback, void *callback_data);
443int fw_iso_context_queue(struct fw_iso_context *ctx,
444 struct fw_iso_packet *packet,
445 struct fw_iso_buffer *buffer,
446 unsigned long payload);
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);
451
358#endif /* _LINUX_FIREWIRE_H */ 452#endif /* _LINUX_FIREWIRE_H */