X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=drivers%2Ffirewire%2Ffw-transaction.h;h=04d3854f65600924e53183b63f4001d048d047eb;hb=9426954277aa57e0417d89bfe3e0964d6901cfa3;hp=7942e914b8f173110528a27fe1ca0356b4d64f45;hpb=9b32d5f3074e9b1afaa39a360a59fd77a2214783;p=safe%2Fjmp%2Flinux-2.6 diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h index 7942e91..04d3854 100644 --- a/drivers/firewire/fw-transaction.h +++ b/drivers/firewire/fw-transaction.h @@ -1,7 +1,4 @@ -/* -*- c-basic-offset: 8 -*- - * - * fw-transaction.h - Header for IEEE1394 transaction logic - * +/* * Copyright (C) 2003-2006 Kristian Hoegsberg * * This program is free software; you can redistribute it and/or modify @@ -28,18 +25,8 @@ #include #include #include - -#define TCODE_WRITE_QUADLET_REQUEST 0 -#define TCODE_WRITE_BLOCK_REQUEST 1 -#define TCODE_WRITE_RESPONSE 2 -#define TCODE_READ_QUADLET_REQUEST 4 -#define TCODE_READ_BLOCK_REQUEST 5 -#define TCODE_READ_QUADLET_RESPONSE 6 -#define TCODE_READ_BLOCK_RESPONSE 7 -#define TCODE_CYCLE_START 8 -#define TCODE_LOCK_REQUEST 9 -#define TCODE_STREAM_DATA 10 -#define TCODE_LOCK_RESPONSE 11 +#include +#include #define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4) #define TCODE_IS_BLOCK_PACKET(tcode) (((tcode) & 1) != 0) @@ -48,54 +35,6 @@ #define TCODE_HAS_REQUEST_DATA(tcode) (((tcode) & 12) != 4) #define TCODE_HAS_RESPONSE_DATA(tcode) (((tcode) & 12) != 0) -/* Juju specific tcodes */ -#define TCODE_DEALLOCATE 0x10 -#define TCODE_LOCK_MASK_SWAP 0x11 -#define TCODE_LOCK_COMPARE_SWAP 0x12 -#define TCODE_LOCK_FETCH_ADD 0x13 -#define TCODE_LOCK_LITTLE_ADD 0x14 -#define TCODE_LOCK_BOUNDED_ADD 0x15 -#define TCODE_LOCK_WRAP_ADD 0x16 -#define TCODE_LOCK_VENDOR_SPECIFIC 0x17 - -#define SCODE_100 0x0 -#define SCODE_200 0x1 -#define SCODE_400 0x2 -#define SCODE_BETA 0x3 - -#define EXTCODE_MASK_SWAP 0x1 -#define EXTCODE_COMPARE_SWAP 0x2 -#define EXTCODE_FETCH_ADD 0x3 -#define EXTCODE_LITTLE_ADD 0x4 -#define EXTCODE_BOUNDED_ADD 0x5 -#define EXTCODE_WRAP_ADD 0x6 - -#define ACK_COMPLETE 0x1 -#define ACK_PENDING 0x2 -#define ACK_BUSY_X 0x4 -#define ACK_BUSY_A 0x5 -#define ACK_BUSY_B 0x6 -#define ACK_DATA_ERROR 0xd -#define ACK_TYPE_ERROR 0xe - -#define RCODE_COMPLETE 0x0 -#define RCODE_CONFLICT_ERROR 0x4 -#define RCODE_DATA_ERROR 0x5 -#define RCODE_TYPE_ERROR 0x6 -#define RCODE_ADDRESS_ERROR 0x7 - -/* Juju specific rcodes */ -#define RCODE_SEND_ERROR 0x10 -#define RCODE_CANCELLED 0x11 -#define RCODE_BUSY 0x12 -#define RCODE_GENERATION 0x13 -#define RCODE_NO_ACK 0x14 - -#define RETRY_1 0x00 -#define RETRY_X 0x01 -#define RETRY_A 0x02 -#define RETRY_B 0x03 - #define LOCAL_BUS 0xffc0 #define SELFID_PORT_CHILD 0x3 @@ -107,6 +46,12 @@ #define PHY_PACKET_LINK_ON 0x1 #define PHY_PACKET_SELF_ID 0x2 +/* Bit fields _within_ the PHY registers. */ +#define PHY_LINK_ACTIVE 0x80 +#define PHY_CONTENDER 0x40 +#define PHY_BUS_RESET 0x40 +#define PHY_BUS_SHORT_RESET 0x40 + #define CSR_REGISTER_BASE 0xfffff0000000ULL /* register offsets relative to CSR_REGISTER_BASE */ @@ -137,17 +82,16 @@ #define fw_notify(s, args...) printk(KERN_NOTICE KBUILD_MODNAME ": " s, ## args) #define fw_error(s, args...) printk(KERN_ERR KBUILD_MODNAME ": " s, ## args) -#define fw_debug(s, args...) printk(KERN_DEBUG KBUILD_MODNAME ": " s, ## args) static inline void fw_memcpy_from_be32(void *_dst, void *_src, size_t size) { - u32 *dst = _dst; - u32 *src = _src; + u32 *dst = _dst; + __be32 *src = _src; int i; for (i = 0; i < size / 4; i++) - dst[i] = cpu_to_be32(src[i]); + dst[i] = be32_to_cpu(src[i]); } static inline void @@ -164,21 +108,26 @@ struct fw_request; 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); +int fw_core_add_descriptor(struct fw_descriptor *desc); +void fw_core_remove_descriptor(struct fw_descriptor *desc); -typedef void (*fw_packet_callback_t) (struct fw_packet *packet, - struct fw_card *card, int status); +typedef void (*fw_packet_callback_t)(struct fw_packet *packet, + struct fw_card *card, int status); typedef void (*fw_transaction_callback_t)(struct fw_card *card, int rcode, void *data, size_t length, void *callback_data); +/* + * Important note: The callback must guarantee that either fw_send_response() + * or kfree() is called on the @request. + */ typedef void (*fw_address_callback_t)(struct fw_card *card, struct fw_request *request, int tcode, int destination, int source, @@ -202,9 +151,8 @@ struct fw_packet { size_t payload_length; u32 timestamp; - dma_addr_t payload_bus; - - /* This callback is called when the packet transmission has + /* + * This callback is called when the packet transmission has * completed; for successful transmission, the status code is * the ack received from the destination, otherwise it's a * negative errno: ENOMEM, ESTALE, ETIMEDOUT, ENODEV, EIO. @@ -214,6 +162,7 @@ struct fw_packet { fw_packet_callback_t callback; int ack; struct list_head link; + void *driver_data; }; struct fw_transaction { @@ -224,8 +173,10 @@ struct fw_transaction { struct fw_packet packet; - /* The data passed to the callback is valid only during the - * callback. */ + /* + * The data passed to the callback is valid only during the + * callback. + */ fw_transaction_callback_t callback; void *callback_data; }; @@ -233,7 +184,7 @@ struct fw_transaction { static inline struct fw_packet * fw_packet(struct list_head *l) { - return list_entry (l, struct fw_packet, link); + return list_entry(l, struct fw_packet, link); } struct fw_address_handler { @@ -250,11 +201,7 @@ struct fw_address_region { u64 end; }; -extern const struct fw_address_region fw_low_memory_region; extern const struct fw_address_region fw_high_memory_region; -extern const struct fw_address_region fw_private_region; -extern const struct fw_address_region fw_csr_region; -extern const struct fw_address_region fw_unit_space_region; int fw_core_add_address_handler(struct fw_address_handler *handler, const struct fw_address_region *region); @@ -269,24 +216,26 @@ extern struct bus_type fw_bus_type; struct fw_card { const struct fw_card_driver *driver; struct device *device; + atomic_t device_count; int node_id; int generation; - /* This is the generation used for timestamping incoming requests. */ - int request_generation; int current_tlabel, tlabel_mask; struct list_head transaction_list; struct timer_list flush_timer; unsigned long reset_jiffies; unsigned long long guid; - int max_receive; + unsigned max_receive; int link_speed; int config_rom_generation; - /* We need to store up to 4 self ID for a maximum of 63 devices. */ + /* + * We need to store up to 4 self ID for a maximum of 63 + * devices plus 3 words for the topology map header. + */ int self_id_count; - u32 self_ids[252]; + u32 topology_map[252 + 3]; spinlock_t lock; /* Take this lock when handling the lists in * this struct. */ @@ -295,12 +244,10 @@ struct fw_card { struct fw_node *irm_node; int color; int gap_count; - int topology_type; + bool beta_repeaters_present; int index; - struct device card_device; - struct list_head link; /* Work struct for BM duties. */ @@ -309,15 +256,14 @@ struct fw_card { int bm_generation; }; -struct fw_card *fw_card_get(struct fw_card *card); -void fw_card_put(struct fw_card *card); - -/* The iso packet format allows for an immediate header/payload part +/* + * 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). */ + * scatter-gather streaming (e.g. assembling video frame automatically). + */ struct fw_iso_packet { u16 payload_length; /* Length of indirect payload. */ @@ -332,19 +278,27 @@ struct fw_iso_packet { #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 + 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); +typedef void (*fw_iso_callback_t)(struct fw_iso_context *context, + u32 cycle, + size_t header_length, + void *header, + void *data); -/* An iso buffer is just a set of pages mapped for DMA in the +/* + * 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. */ + * fw_iso_buffer_map() will map the pages into a given vma. + */ struct fw_iso_buffer { enum dma_data_direction direction; @@ -373,7 +327,8 @@ 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, size_t header_size, +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); void @@ -387,7 +342,7 @@ fw_iso_context_queue(struct fw_iso_context *ctx, int fw_iso_context_start(struct fw_iso_context *ctx, - int channel, int speed, int cycle); + int cycle, int sync, int tags); int fw_iso_context_stop(struct fw_iso_context *ctx); @@ -395,40 +350,50 @@ fw_iso_context_stop(struct fw_iso_context *ctx); struct fw_card_driver { const char *name; - /* Enable the given card with the given initial config rom. + /* + * Enable the given card with the given initial config rom. * This function is expected to activate the card, and either * enable the PHY or set the link_on bit and initiate a bus - * reset. */ - int (*enable) (struct fw_card *card, u32 *config_rom, size_t length); + * reset. + */ + int (*enable)(struct fw_card *card, u32 *config_rom, size_t length); - int (*update_phy_reg) (struct fw_card *card, int address, - int clear_bits, int set_bits); + int (*update_phy_reg)(struct fw_card *card, int address, + int clear_bits, int set_bits); - /* Update the config rom for an enabled card. This function + /* + * Update the config rom for an enabled card. This function * should change the config rom that is presented on the bus - * an initiate a bus reset. */ - int (*set_config_rom) (struct fw_card *card, - u32 *config_rom, size_t length); + * an initiate a bus reset. + */ + int (*set_config_rom)(struct fw_card *card, + u32 *config_rom, size_t length); - void (*send_request) (struct fw_card *card, struct fw_packet *packet); - void (*send_response) (struct fw_card *card, struct fw_packet *packet); + void (*send_request)(struct fw_card *card, struct fw_packet *packet); + void (*send_response)(struct fw_card *card, struct fw_packet *packet); /* Calling cancel is valid once a packet has been submitted. */ - int (*cancel_packet) (struct fw_card *card, struct fw_packet *packet); + int (*cancel_packet)(struct fw_card *card, struct fw_packet *packet); - /* Allow the specified node ID to do direct DMA out and in of + /* + * Allow the specified node ID to do direct DMA out and in of * host memory. The card will disable this for all node when * a bus reset happens, so driver need to reenable this after * bus reset. Returns 0 on success, -ENODEV if the card * doesn't support this, -ESTALE if the generation doesn't - * match. */ - int (*enable_phys_dma) (struct fw_card *card, - int node_id, int generation); + * match. + */ + int (*enable_phys_dma)(struct fw_card *card, + int node_id, int generation); + + u64 (*get_bus_time)(struct fw_card *card); struct fw_iso_context * - (*allocate_iso_context)(struct fw_card *card, int type); + (*allocate_iso_context)(struct fw_card *card, + int type, size_t header_size); void (*free_iso_context)(struct fw_iso_context *ctx); - int (*start_iso)(struct fw_iso_context *ctx, s32 cycle); + int (*start_iso)(struct fw_iso_context *ctx, + s32 cycle, u32 sync, u32 tags); int (*queue_iso)(struct fw_iso_context *ctx, struct fw_iso_packet *packet, @@ -456,15 +421,15 @@ void fw_flush_transactions(struct fw_card *card); void fw_send_phy_config(struct fw_card *card, int node_id, int generation, int gap_count); -/* Called by the topology code to inform the device code of node - * activity; found, lost, or updated nodes */ +/* + * Called by the topology code to inform the device code of node + * activity; found, lost, or updated nodes. + */ void fw_node_event(struct fw_card *card, struct fw_node *node, int event); /* API used by card level drivers */ -/* Do we need phy speed here also? If we add more args, maybe we - should go back to struct fw_card_info. */ void fw_card_initialize(struct fw_card *card, const struct fw_card_driver *driver, struct device *device);