提交 10534140 编写于 作者: L Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
  firewire: new stack is no longer experimental
  firewire: net: better FIFO address range check and rcodes
  firewire: net: fix card driver reloading
  firewire: core: fix iso context shutdown on card removal
  firewire: core: fix DMA unmapping in iso buffer removal
  firewire: net: adjust net_device ops
  firewire: net: remove unused code
  firewire: net: allow for unordered unit discovery
  firewire: net: style changes
  firewire: net: add Kconfig item, rename driver
  firewire: add IPv4 support
comment "A new alternative FireWire stack is available with EXPERIMENTAL=y" comment "You can enable one or both FireWire driver stacks."
depends on EXPERIMENTAL=n comment "See the help texts for more information."
comment "Enable only one of the two stacks, unless you know what you are doing"
depends on EXPERIMENTAL
config FIREWIRE config FIREWIRE
tristate "New FireWire stack, EXPERIMENTAL" tristate "FireWire driver stack"
depends on EXPERIMENTAL
select CRC_ITU_T select CRC_ITU_T
help help
This is the "Juju" FireWire stack, a new alternative implementation This is the new-generation IEEE 1394 (FireWire) driver stack
designed for robustness and simplicity. You can build either this a.k.a. Juju, a new implementation designed for robustness and
stack, or the old stack (the ieee1394 driver, ohci1394 etc.) or both. simplicity.
Please read http://ieee1394.wiki.kernel.org/index.php/Juju_Migration See http://ieee1394.wiki.kernel.org/index.php/Juju_Migration
before you enable the new stack. for information about migration from the older Linux 1394 stack
to the new driver stack.
To compile this driver as a module, say M here: the module will be To compile this driver as a module, say M here: the module will be
called firewire-core. called firewire-core.
This module functionally replaces ieee1394, raw1394, and video1394. This module functionally replaces ieee1394, raw1394, and video1394.
To access it from application programs, you generally need at least To access it from application programs, you generally need at least
libraw1394 version 2. IIDC/DCAM applications also need libdc1394 libraw1394 v2. IIDC/DCAM applications need libdc1394 v2.
version 2. No libraries are required to access storage devices No libraries are required to access storage devices through the
through the firewire-sbp2 driver. firewire-sbp2 driver.
NOTE:
FireWire audio devices currently require the old drivers (ieee1394,
ohci1394, raw1394).
config FIREWIRE_OHCI config FIREWIRE_OHCI
tristate "OHCI-1394 controllers" tristate "OHCI-1394 controllers"
...@@ -37,11 +38,9 @@ config FIREWIRE_OHCI ...@@ -37,11 +38,9 @@ config FIREWIRE_OHCI
stack. stack.
NOTE: NOTE:
If you want to install firewire-ohci and ohci1394 together, you
You should only build either firewire-ohci or the old ohci1394 driver, should configure them only as modules and blacklist the driver(s)
but not both. If you nevertheless want to install both, you should which you don't want to have auto-loaded. Add either
configure them only as modules and blacklist the driver(s) which you
don't want to have auto-loaded. Add either
blacklist firewire-ohci blacklist firewire-ohci
or or
...@@ -50,12 +49,7 @@ config FIREWIRE_OHCI ...@@ -50,12 +49,7 @@ config FIREWIRE_OHCI
blacklist dv1394 blacklist dv1394
to /etc/modprobe.conf or /etc/modprobe.d/* and update modprobe.conf to /etc/modprobe.conf or /etc/modprobe.d/* and update modprobe.conf
depending on your distribution. The latter two modules should be depending on your distribution.
blacklisted together with ohci1394 because they depend on ohci1394.
If you have an old modprobe which doesn't implement the blacklist
directive, use "install modulename /bin/true" for the modules to be
blacklisted.
config FIREWIRE_OHCI_DEBUG config FIREWIRE_OHCI_DEBUG
bool bool
...@@ -77,3 +71,17 @@ config FIREWIRE_SBP2 ...@@ -77,3 +71,17 @@ config FIREWIRE_SBP2
You should also enable support for disks, CD-ROMs, etc. in the SCSI You should also enable support for disks, CD-ROMs, etc. in the SCSI
configuration section. configuration section.
config FIREWIRE_NET
tristate "IP networking over 1394 (EXPERIMENTAL)"
depends on FIREWIRE && INET && EXPERIMENTAL
help
This enables IPv4 over IEEE 1394, providing IP connectivity with
other implementations of RFC 2734 as found on several operating
systems. Multicast support is currently limited.
NOTE, this driver is not stable yet!
To compile this driver as a module, say M here: The module will be
called firewire-net. It replaces eth1394 of the classic IEEE 1394
stack.
...@@ -6,7 +6,9 @@ firewire-core-y += core-card.o core-cdev.o core-device.o \ ...@@ -6,7 +6,9 @@ firewire-core-y += core-card.o core-cdev.o core-device.o \
core-iso.o core-topology.o core-transaction.o core-iso.o core-topology.o core-transaction.o
firewire-ohci-y += ohci.o firewire-ohci-y += ohci.o
firewire-sbp2-y += sbp2.o firewire-sbp2-y += sbp2.o
firewire-net-y += net.o
obj-$(CONFIG_FIREWIRE) += firewire-core.o obj-$(CONFIG_FIREWIRE) += firewire-core.o
obj-$(CONFIG_FIREWIRE_OHCI) += firewire-ohci.o obj-$(CONFIG_FIREWIRE_OHCI) += firewire-ohci.o
obj-$(CONFIG_FIREWIRE_SBP2) += firewire-sbp2.o obj-$(CONFIG_FIREWIRE_SBP2) += firewire-sbp2.o
obj-$(CONFIG_FIREWIRE_NET) += firewire-net.o
...@@ -176,6 +176,7 @@ int fw_core_add_descriptor(struct fw_descriptor *desc) ...@@ -176,6 +176,7 @@ int fw_core_add_descriptor(struct fw_descriptor *desc)
return 0; return 0;
} }
EXPORT_SYMBOL(fw_core_add_descriptor);
void fw_core_remove_descriptor(struct fw_descriptor *desc) void fw_core_remove_descriptor(struct fw_descriptor *desc)
{ {
...@@ -189,6 +190,7 @@ void fw_core_remove_descriptor(struct fw_descriptor *desc) ...@@ -189,6 +190,7 @@ void fw_core_remove_descriptor(struct fw_descriptor *desc)
mutex_unlock(&card_mutex); mutex_unlock(&card_mutex);
} }
EXPORT_SYMBOL(fw_core_remove_descriptor);
static void allocate_broadcast_channel(struct fw_card *card, int generation) static void allocate_broadcast_channel(struct fw_card *card, int generation)
{ {
...@@ -459,11 +461,11 @@ EXPORT_SYMBOL(fw_card_add); ...@@ -459,11 +461,11 @@ EXPORT_SYMBOL(fw_card_add);
/* /*
* The next few functions implements a dummy driver that use once a * The next few functions implement a dummy driver that is used once a card
* card driver shuts down an fw_card. This allows the driver to * driver shuts down an fw_card. This allows the driver to cleanly unload,
* cleanly unload, as all IO to the card will be handled by the dummy * as all IO to the card will be handled (and failed) by the dummy driver
* driver instead of calling into the (possibly) unloaded module. The * instead of calling into the module. Only functions for iso context
* dummy driver just fails all IO. * shutdown still need to be provided by the card driver.
*/ */
static int dummy_enable(struct fw_card *card, u32 *config_rom, size_t length) static int dummy_enable(struct fw_card *card, u32 *config_rom, size_t length)
...@@ -510,7 +512,7 @@ static int dummy_enable_phys_dma(struct fw_card *card, ...@@ -510,7 +512,7 @@ static int dummy_enable_phys_dma(struct fw_card *card,
return -ENODEV; return -ENODEV;
} }
static struct fw_card_driver dummy_driver = { static const struct fw_card_driver dummy_driver_template = {
.enable = dummy_enable, .enable = dummy_enable,
.update_phy_reg = dummy_update_phy_reg, .update_phy_reg = dummy_update_phy_reg,
.set_config_rom = dummy_set_config_rom, .set_config_rom = dummy_set_config_rom,
...@@ -529,6 +531,8 @@ void fw_card_release(struct kref *kref) ...@@ -529,6 +531,8 @@ void fw_card_release(struct kref *kref)
void fw_core_remove_card(struct fw_card *card) void fw_core_remove_card(struct fw_card *card)
{ {
struct fw_card_driver dummy_driver = dummy_driver_template;
card->driver->update_phy_reg(card, 4, card->driver->update_phy_reg(card, 4,
PHY_LINK_ACTIVE | PHY_CONTENDER, 0); PHY_LINK_ACTIVE | PHY_CONTENDER, 0);
fw_core_initiate_bus_reset(card, 1); fw_core_initiate_bus_reset(card, 1);
...@@ -537,7 +541,9 @@ void fw_core_remove_card(struct fw_card *card) ...@@ -537,7 +541,9 @@ void fw_core_remove_card(struct fw_card *card)
list_del_init(&card->link); list_del_init(&card->link);
mutex_unlock(&card_mutex); mutex_unlock(&card_mutex);
/* Set up the dummy driver. */ /* Switch off most of the card driver interface. */
dummy_driver.free_iso_context = card->driver->free_iso_context;
dummy_driver.stop_iso = card->driver->stop_iso;
card->driver = &dummy_driver; card->driver = &dummy_driver;
fw_destroy_nodes(card); fw_destroy_nodes(card);
......
...@@ -71,7 +71,7 @@ int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card, ...@@ -71,7 +71,7 @@ int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
for (j = 0; j < i; j++) { for (j = 0; j < i; j++) {
address = page_private(buffer->pages[j]); address = page_private(buffer->pages[j]);
dma_unmap_page(card->device, address, dma_unmap_page(card->device, address,
PAGE_SIZE, DMA_TO_DEVICE); PAGE_SIZE, direction);
__free_page(buffer->pages[j]); __free_page(buffer->pages[j]);
} }
kfree(buffer->pages); kfree(buffer->pages);
...@@ -80,6 +80,7 @@ int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card, ...@@ -80,6 +80,7 @@ int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
return -ENOMEM; return -ENOMEM;
} }
EXPORT_SYMBOL(fw_iso_buffer_init);
int fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma) int fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma)
{ {
...@@ -107,13 +108,14 @@ void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, ...@@ -107,13 +108,14 @@ void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer,
for (i = 0; i < buffer->page_count; i++) { for (i = 0; i < buffer->page_count; i++) {
address = page_private(buffer->pages[i]); address = page_private(buffer->pages[i]);
dma_unmap_page(card->device, address, dma_unmap_page(card->device, address,
PAGE_SIZE, DMA_TO_DEVICE); PAGE_SIZE, buffer->direction);
__free_page(buffer->pages[i]); __free_page(buffer->pages[i]);
} }
kfree(buffer->pages); kfree(buffer->pages);
buffer->pages = NULL; buffer->pages = NULL;
} }
EXPORT_SYMBOL(fw_iso_buffer_destroy);
struct fw_iso_context *fw_iso_context_create(struct fw_card *card, struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
int type, int channel, int speed, size_t header_size, int type, int channel, int speed, size_t header_size,
...@@ -136,6 +138,7 @@ struct fw_iso_context *fw_iso_context_create(struct fw_card *card, ...@@ -136,6 +138,7 @@ struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
return ctx; return ctx;
} }
EXPORT_SYMBOL(fw_iso_context_create);
void fw_iso_context_destroy(struct fw_iso_context *ctx) void fw_iso_context_destroy(struct fw_iso_context *ctx)
{ {
...@@ -143,12 +146,14 @@ void fw_iso_context_destroy(struct fw_iso_context *ctx) ...@@ -143,12 +146,14 @@ void fw_iso_context_destroy(struct fw_iso_context *ctx)
card->driver->free_iso_context(ctx); card->driver->free_iso_context(ctx);
} }
EXPORT_SYMBOL(fw_iso_context_destroy);
int fw_iso_context_start(struct fw_iso_context *ctx, int fw_iso_context_start(struct fw_iso_context *ctx,
int cycle, int sync, int tags) int cycle, int sync, int tags)
{ {
return ctx->card->driver->start_iso(ctx, cycle, sync, tags); return ctx->card->driver->start_iso(ctx, cycle, sync, tags);
} }
EXPORT_SYMBOL(fw_iso_context_start);
int fw_iso_context_queue(struct fw_iso_context *ctx, int fw_iso_context_queue(struct fw_iso_context *ctx,
struct fw_iso_packet *packet, struct fw_iso_packet *packet,
...@@ -159,11 +164,13 @@ int fw_iso_context_queue(struct fw_iso_context *ctx, ...@@ -159,11 +164,13 @@ int fw_iso_context_queue(struct fw_iso_context *ctx,
return card->driver->queue_iso(ctx, packet, buffer, payload); return card->driver->queue_iso(ctx, packet, buffer, payload);
} }
EXPORT_SYMBOL(fw_iso_context_queue);
int fw_iso_context_stop(struct fw_iso_context *ctx) int fw_iso_context_stop(struct fw_iso_context *ctx)
{ {
return ctx->card->driver->stop_iso(ctx); return ctx->card->driver->stop_iso(ctx);
} }
EXPORT_SYMBOL(fw_iso_context_stop);
/* /*
* Isochronous bus resource management (channels, bandwidth), client side * Isochronous bus resource management (channels, bandwidth), client side
......
#ifndef _FIREWIRE_CORE_H #ifndef _FIREWIRE_CORE_H
#define _FIREWIRE_CORE_H #define _FIREWIRE_CORE_H
#include <linux/dma-mapping.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/idr.h> #include <linux/idr.h>
...@@ -97,17 +96,6 @@ int fw_core_initiate_bus_reset(struct fw_card *card, int short_reset); ...@@ -97,17 +96,6 @@ int fw_core_initiate_bus_reset(struct fw_card *card, int short_reset);
int fw_compute_block_crc(u32 *block); int fw_compute_block_crc(u32 *block);
void fw_schedule_bm_work(struct fw_card *card, unsigned long delay); void fw_schedule_bm_work(struct fw_card *card, unsigned long delay);
struct fw_descriptor {
struct list_head link;
size_t length;
u32 immediate;
u32 key;
const u32 *data;
};
int fw_core_add_descriptor(struct fw_descriptor *desc);
void fw_core_remove_descriptor(struct fw_descriptor *desc);
/* -cdev */ /* -cdev */
...@@ -130,77 +118,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event); ...@@ -130,77 +118,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event);
/* -iso */ /* -iso */
/*
* The iso packet format allows for an immediate header/payload part
* stored in 'header' immediately after the packet info plus an
* indirect payload part that is pointer to by the 'payload' field.
* Applications can use one or the other or both to implement simple
* low-bandwidth streaming (e.g. audio) or more advanced
* scatter-gather streaming (e.g. assembling video frame automatically).
*/
struct fw_iso_packet {
u16 payload_length; /* Length of indirect payload. */
u32 interrupt:1; /* Generate interrupt on this packet */
u32 skip:1; /* Set to not send packet at all. */
u32 tag:2;
u32 sy:4;
u32 header_length:8; /* Length of immediate header. */
u32 header[0];
};
#define FW_ISO_CONTEXT_TRANSMIT 0
#define FW_ISO_CONTEXT_RECEIVE 1
#define FW_ISO_CONTEXT_MATCH_TAG0 1
#define FW_ISO_CONTEXT_MATCH_TAG1 2
#define FW_ISO_CONTEXT_MATCH_TAG2 4
#define FW_ISO_CONTEXT_MATCH_TAG3 8
#define FW_ISO_CONTEXT_MATCH_ALL_TAGS 15
/*
* An iso buffer is just a set of pages mapped for DMA in the
* specified direction. Since the pages are to be used for DMA, they
* are not mapped into the kernel virtual address space. We store the
* DMA address in the page private. The helper function
* fw_iso_buffer_map() will map the pages into a given vma.
*/
struct fw_iso_buffer {
enum dma_data_direction direction;
struct page **pages;
int page_count;
};
typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
u32 cycle, size_t header_length,
void *header, void *data);
struct fw_iso_context {
struct fw_card *card;
int type;
int channel;
int speed;
size_t header_size;
fw_iso_callback_t callback;
void *callback_data;
};
int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
int page_count, enum dma_data_direction direction);
int fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma); int fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma);
void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
int type, int channel, int speed, size_t header_size,
fw_iso_callback_t callback, void *callback_data);
int fw_iso_context_queue(struct fw_iso_context *ctx,
struct fw_iso_packet *packet,
struct fw_iso_buffer *buffer,
unsigned long payload);
int fw_iso_context_start(struct fw_iso_context *ctx,
int cycle, int sync, int tags);
int fw_iso_context_stop(struct fw_iso_context *ctx);
void fw_iso_context_destroy(struct fw_iso_context *ctx);
void fw_iso_resource_manage(struct fw_card *card, int generation, void fw_iso_resource_manage(struct fw_card *card, int generation,
u64 channels_mask, int *channel, int *bandwidth, bool allocate); u64 channels_mask, int *channel, int *bandwidth, bool allocate);
...@@ -285,9 +203,4 @@ void fw_flush_transactions(struct fw_card *card); ...@@ -285,9 +203,4 @@ void fw_flush_transactions(struct fw_card *card);
void fw_send_phy_config(struct fw_card *card, void fw_send_phy_config(struct fw_card *card,
int node_id, int generation, int gap_count); int node_id, int generation, int gap_count);
static inline int fw_stream_packet_destination_id(int tag, int channel, int sy)
{
return tag << 14 | channel << 8 | sy;
}
#endif /* _FIREWIRE_CORE_H */ #endif /* _FIREWIRE_CORE_H */
此差异已折叠。
...@@ -4,7 +4,7 @@ menu "IEEE 1394 (FireWire) support" ...@@ -4,7 +4,7 @@ menu "IEEE 1394 (FireWire) support"
source "drivers/firewire/Kconfig" source "drivers/firewire/Kconfig"
config IEEE1394 config IEEE1394
tristate "Stable FireWire stack" tristate "Legacy alternative FireWire driver stack"
depends on PCI || BROKEN depends on PCI || BROKEN
help help
IEEE 1394 describes a high performance serial bus, which is also IEEE 1394 describes a high performance serial bus, which is also
...@@ -33,11 +33,9 @@ config IEEE1394_OHCI1394 ...@@ -33,11 +33,9 @@ config IEEE1394_OHCI1394
module will be called ohci1394. module will be called ohci1394.
NOTE: NOTE:
If you want to install firewire-ohci and ohci1394 together, you
You should only build either ohci1394 or the new firewire-ohci driver, should configure them only as modules and blacklist the driver(s)
but not both. If you nevertheless want to install both, you should which you don't want to have auto-loaded. Add either
configure them only as modules and blacklist the driver(s) which you
don't want to have auto-loaded. Add either
blacklist firewire-ohci blacklist firewire-ohci
or or
...@@ -46,12 +44,7 @@ config IEEE1394_OHCI1394 ...@@ -46,12 +44,7 @@ config IEEE1394_OHCI1394
blacklist dv1394 blacklist dv1394
to /etc/modprobe.conf or /etc/modprobe.d/* and update modprobe.conf to /etc/modprobe.conf or /etc/modprobe.d/* and update modprobe.conf
depending on your distribution. The latter two modules should be depending on your distribution.
blacklisted together with ohci1394 because they depend on ohci1394.
If you have an old modprobe which doesn't implement the blacklist
directive, use "install modulename /bin/true" for the modules to be
blacklisted.
comment "PCILynx controller requires I2C" comment "PCILynx controller requires I2C"
depends on IEEE1394 && I2C=n depends on IEEE1394 && I2C=n
...@@ -105,7 +98,7 @@ config IEEE1394_ETH1394_ROM_ENTRY ...@@ -105,7 +98,7 @@ config IEEE1394_ETH1394_ROM_ENTRY
default n default n
config IEEE1394_ETH1394 config IEEE1394_ETH1394
tristate "IP over 1394" tristate "IP networking over 1394 (experimental)"
depends on IEEE1394 && EXPERIMENTAL && INET depends on IEEE1394 && EXPERIMENTAL && INET
select IEEE1394_ETH1394_ROM_ENTRY select IEEE1394_ETH1394_ROM_ENTRY
help help
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/kref.h> #include <linux/kref.h>
#include <linux/list.h> #include <linux/list.h>
...@@ -355,4 +356,90 @@ int fw_run_transaction(struct fw_card *card, int tcode, int destination_id, ...@@ -355,4 +356,90 @@ int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
int generation, int speed, unsigned long long offset, int generation, int speed, unsigned long long offset,
void *payload, size_t length); void *payload, size_t length);
static inline int fw_stream_packet_destination_id(int tag, int channel, int sy)
{
return tag << 14 | channel << 8 | sy;
}
struct fw_descriptor {
struct list_head link;
size_t length;
u32 immediate;
u32 key;
const u32 *data;
};
int fw_core_add_descriptor(struct fw_descriptor *desc);
void fw_core_remove_descriptor(struct fw_descriptor *desc);
/*
* The iso packet format allows for an immediate header/payload part
* stored in 'header' immediately after the packet info plus an
* indirect payload part that is pointer to by the 'payload' field.
* Applications can use one or the other or both to implement simple
* low-bandwidth streaming (e.g. audio) or more advanced
* scatter-gather streaming (e.g. assembling video frame automatically).
*/
struct fw_iso_packet {
u16 payload_length; /* Length of indirect payload. */
u32 interrupt:1; /* Generate interrupt on this packet */
u32 skip:1; /* Set to not send packet at all. */
u32 tag:2;
u32 sy:4;
u32 header_length:8; /* Length of immediate header. */
u32 header[0];
};
#define FW_ISO_CONTEXT_TRANSMIT 0
#define FW_ISO_CONTEXT_RECEIVE 1
#define FW_ISO_CONTEXT_MATCH_TAG0 1
#define FW_ISO_CONTEXT_MATCH_TAG1 2
#define FW_ISO_CONTEXT_MATCH_TAG2 4
#define FW_ISO_CONTEXT_MATCH_TAG3 8
#define FW_ISO_CONTEXT_MATCH_ALL_TAGS 15
/*
* An iso buffer is just a set of pages mapped for DMA in the
* specified direction. Since the pages are to be used for DMA, they
* are not mapped into the kernel virtual address space. We store the
* DMA address in the page private. The helper function
* fw_iso_buffer_map() will map the pages into a given vma.
*/
struct fw_iso_buffer {
enum dma_data_direction direction;
struct page **pages;
int page_count;
};
int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
int page_count, enum dma_data_direction direction);
void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
struct fw_iso_context;
typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
u32 cycle, size_t header_length,
void *header, void *data);
struct fw_iso_context {
struct fw_card *card;
int type;
int channel;
int speed;
size_t header_size;
fw_iso_callback_t callback;
void *callback_data;
};
struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
int type, int channel, int speed, size_t header_size,
fw_iso_callback_t callback, void *callback_data);
int fw_iso_context_queue(struct fw_iso_context *ctx,
struct fw_iso_packet *packet,
struct fw_iso_buffer *buffer,
unsigned long payload);
int fw_iso_context_start(struct fw_iso_context *ctx,
int cycle, int sync, int tags);
int fw_iso_context_stop(struct fw_iso_context *ctx);
void fw_iso_context_destroy(struct fw_iso_context *ctx);
#endif /* _LINUX_FIREWIRE_H */ #endif /* _LINUX_FIREWIRE_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册