Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.27-rc5 471 lines 13 kB view raw
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/workqueue.h> 31 32#define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4) 33#define TCODE_IS_BLOCK_PACKET(tcode) (((tcode) & 1) != 0) 34#define TCODE_IS_REQUEST(tcode) (((tcode) & 2) == 0) 35#define TCODE_IS_RESPONSE(tcode) (((tcode) & 2) != 0) 36#define TCODE_HAS_REQUEST_DATA(tcode) (((tcode) & 12) != 4) 37#define TCODE_HAS_RESPONSE_DATA(tcode) (((tcode) & 12) != 0) 38 39#define LOCAL_BUS 0xffc0 40 41#define SELFID_PORT_CHILD 0x3 42#define SELFID_PORT_PARENT 0x2 43#define SELFID_PORT_NCONN 0x1 44#define SELFID_PORT_NONE 0x0 45 46#define PHY_PACKET_CONFIG 0x0 47#define PHY_PACKET_LINK_ON 0x1 48#define PHY_PACKET_SELF_ID 0x2 49 50/* Bit fields _within_ the PHY registers. */ 51#define PHY_LINK_ACTIVE 0x80 52#define PHY_CONTENDER 0x40 53#define PHY_BUS_RESET 0x40 54#define PHY_BUS_SHORT_RESET 0x40 55 56#define CSR_REGISTER_BASE 0xfffff0000000ULL 57 58/* register offsets relative to CSR_REGISTER_BASE */ 59#define CSR_STATE_CLEAR 0x0 60#define CSR_STATE_SET 0x4 61#define CSR_NODE_IDS 0x8 62#define CSR_RESET_START 0xc 63#define CSR_SPLIT_TIMEOUT_HI 0x18 64#define CSR_SPLIT_TIMEOUT_LO 0x1c 65#define CSR_CYCLE_TIME 0x200 66#define CSR_BUS_TIME 0x204 67#define CSR_BUSY_TIMEOUT 0x210 68#define CSR_BUS_MANAGER_ID 0x21c 69#define CSR_BANDWIDTH_AVAILABLE 0x220 70#define CSR_CHANNELS_AVAILABLE 0x224 71#define CSR_CHANNELS_AVAILABLE_HI 0x224 72#define CSR_CHANNELS_AVAILABLE_LO 0x228 73#define CSR_BROADCAST_CHANNEL 0x234 74#define CSR_CONFIG_ROM 0x400 75#define CSR_CONFIG_ROM_END 0x800 76#define CSR_FCP_COMMAND 0xB00 77#define CSR_FCP_RESPONSE 0xD00 78#define CSR_FCP_END 0xF00 79#define CSR_TOPOLOGY_MAP 0x1000 80#define CSR_TOPOLOGY_MAP_END 0x1400 81#define CSR_SPEED_MAP 0x2000 82#define CSR_SPEED_MAP_END 0x3000 83 84#define BROADCAST_CHANNEL_INITIAL (1 << 31 | 31) 85#define BROADCAST_CHANNEL_VALID (1 << 30) 86 87#define fw_notify(s, args...) printk(KERN_NOTICE KBUILD_MODNAME ": " s, ## args) 88#define fw_error(s, args...) printk(KERN_ERR KBUILD_MODNAME ": " s, ## args) 89 90static inline void 91fw_memcpy_from_be32(void *_dst, void *_src, size_t size) 92{ 93 u32 *dst = _dst; 94 __be32 *src = _src; 95 int i; 96 97 for (i = 0; i < size / 4; i++) 98 dst[i] = be32_to_cpu(src[i]); 99} 100 101static inline void 102fw_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, 128 size_t length, 129 void *callback_data); 130 131/* 132 * Important note: The callback must guarantee that either fw_send_response() 133 * or kfree() is called on the @request. 134 */ 135typedef void (*fw_address_callback_t)(struct fw_card *card, 136 struct fw_request *request, 137 int tcode, int destination, int source, 138 int generation, int speed, 139 unsigned long long offset, 140 void *data, size_t length, 141 void *callback_data); 142 143typedef void (*fw_bus_reset_callback_t)(struct fw_card *handle, 144 int node_id, int generation, 145 u32 *self_ids, 146 int self_id_count, 147 void *callback_data); 148 149struct fw_packet { 150 int speed; 151 int generation; 152 u32 header[4]; 153 size_t header_length; 154 void *payload; 155 size_t payload_length; 156 u32 timestamp; 157 158 /* 159 * This callback is called when the packet transmission has 160 * completed; for successful transmission, the status code is 161 * the ack received from the destination, otherwise it's a 162 * negative errno: ENOMEM, ESTALE, ETIMEDOUT, ENODEV, EIO. 163 * The callback can be called from tasklet context and thus 164 * must never block. 165 */ 166 fw_packet_callback_t callback; 167 int ack; 168 struct list_head link; 169 void *driver_data; 170}; 171 172struct fw_transaction { 173 int node_id; /* The generation is implied; it is always the current. */ 174 int tlabel; 175 int timestamp; 176 struct list_head link; 177 178 struct fw_packet packet; 179 180 /* 181 * The data passed to the callback is valid only during the 182 * callback. 183 */ 184 fw_transaction_callback_t callback; 185 void *callback_data; 186}; 187 188static inline struct fw_packet * 189fw_packet(struct list_head *l) 190{ 191 return list_entry(l, struct fw_packet, link); 192} 193 194struct fw_address_handler { 195 u64 offset; 196 size_t length; 197 fw_address_callback_t address_callback; 198 void *callback_data; 199 struct list_head link; 200}; 201 202 203struct fw_address_region { 204 u64 start; 205 u64 end; 206}; 207 208extern const struct fw_address_region fw_high_memory_region; 209 210int fw_core_add_address_handler(struct fw_address_handler *handler, 211 const struct fw_address_region *region); 212void fw_core_remove_address_handler(struct fw_address_handler *handler); 213void fw_fill_response(struct fw_packet *response, u32 *request_header, 214 int rcode, void *payload, size_t length); 215void fw_send_response(struct fw_card *card, 216 struct fw_request *request, int rcode); 217 218extern struct bus_type fw_bus_type; 219 220struct fw_card { 221 const struct fw_card_driver *driver; 222 struct device *device; 223 struct kref kref; 224 struct completion done; 225 226 int node_id; 227 int generation; 228 int current_tlabel, tlabel_mask; 229 struct list_head transaction_list; 230 struct timer_list flush_timer; 231 unsigned long reset_jiffies; 232 233 unsigned long long guid; 234 unsigned max_receive; 235 int link_speed; 236 int config_rom_generation; 237 238 /* 239 * We need to store up to 4 self ID for a maximum of 63 240 * devices plus 3 words for the topology map header. 241 */ 242 int self_id_count; 243 u32 topology_map[252 + 3]; 244 u32 broadcast_channel; 245 246 spinlock_t lock; /* Take this lock when handling the lists in 247 * this struct. */ 248 struct fw_node *local_node; 249 struct fw_node *root_node; 250 struct fw_node *irm_node; 251 int color; 252 int gap_count; 253 bool beta_repeaters_present; 254 255 int index; 256 257 struct list_head link; 258 259 /* Work struct for BM duties. */ 260 struct delayed_work work; 261 int bm_retries; 262 int bm_generation; 263}; 264 265static inline struct fw_card *fw_card_get(struct fw_card *card) 266{ 267 kref_get(&card->kref); 268 269 return card; 270} 271 272void fw_card_release(struct kref *kref); 273 274static inline void fw_card_put(struct fw_card *card) 275{ 276 kref_put(&card->kref, fw_card_release); 277} 278 279/* 280 * The iso packet format allows for an immediate header/payload part 281 * stored in 'header' immediately after the packet info plus an 282 * indirect payload part that is pointer to by the 'payload' field. 283 * Applications can use one or the other or both to implement simple 284 * low-bandwidth streaming (e.g. audio) or more advanced 285 * scatter-gather streaming (e.g. assembling video frame automatically). 286 */ 287 288struct fw_iso_packet { 289 u16 payload_length; /* Length of indirect payload. */ 290 u32 interrupt : 1; /* Generate interrupt on this packet */ 291 u32 skip : 1; /* Set to not send packet at all. */ 292 u32 tag : 2; 293 u32 sy : 4; 294 u32 header_length : 8; /* Length of immediate header. */ 295 u32 header[0]; 296}; 297 298#define FW_ISO_CONTEXT_TRANSMIT 0 299#define FW_ISO_CONTEXT_RECEIVE 1 300 301#define FW_ISO_CONTEXT_MATCH_TAG0 1 302#define FW_ISO_CONTEXT_MATCH_TAG1 2 303#define FW_ISO_CONTEXT_MATCH_TAG2 4 304#define FW_ISO_CONTEXT_MATCH_TAG3 8 305#define FW_ISO_CONTEXT_MATCH_ALL_TAGS 15 306 307struct fw_iso_context; 308 309typedef void (*fw_iso_callback_t)(struct fw_iso_context *context, 310 u32 cycle, 311 size_t header_length, 312 void *header, 313 void *data); 314 315/* 316 * An iso buffer is just a set of pages mapped for DMA in the 317 * specified direction. Since the pages are to be used for DMA, they 318 * are not mapped into the kernel virtual address space. We store the 319 * DMA address in the page private. The helper function 320 * fw_iso_buffer_map() will map the pages into a given vma. 321 */ 322 323struct fw_iso_buffer { 324 enum dma_data_direction direction; 325 struct page **pages; 326 int page_count; 327}; 328 329struct fw_iso_context { 330 struct fw_card *card; 331 int type; 332 int channel; 333 int speed; 334 size_t header_size; 335 fw_iso_callback_t callback; 336 void *callback_data; 337}; 338 339int 340fw_iso_buffer_init(struct fw_iso_buffer *buffer, 341 struct fw_card *card, 342 int page_count, 343 enum dma_data_direction direction); 344int 345fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma); 346void 347fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card); 348 349struct fw_iso_context * 350fw_iso_context_create(struct fw_card *card, int type, 351 int channel, int speed, size_t header_size, 352 fw_iso_callback_t callback, void *callback_data); 353 354void 355fw_iso_context_destroy(struct fw_iso_context *ctx); 356 357int 358fw_iso_context_queue(struct fw_iso_context *ctx, 359 struct fw_iso_packet *packet, 360 struct fw_iso_buffer *buffer, 361 unsigned long payload); 362 363int 364fw_iso_context_start(struct fw_iso_context *ctx, 365 int cycle, int sync, int tags); 366 367int 368fw_iso_context_stop(struct fw_iso_context *ctx); 369 370struct fw_card_driver { 371 /* 372 * Enable the given card with the given initial config rom. 373 * This function is expected to activate the card, and either 374 * enable the PHY or set the link_on bit and initiate a bus 375 * reset. 376 */ 377 int (*enable)(struct fw_card *card, u32 *config_rom, size_t length); 378 379 int (*update_phy_reg)(struct fw_card *card, int address, 380 int clear_bits, int set_bits); 381 382 /* 383 * Update the config rom for an enabled card. This function 384 * should change the config rom that is presented on the bus 385 * an initiate a bus reset. 386 */ 387 int (*set_config_rom)(struct fw_card *card, 388 u32 *config_rom, size_t length); 389 390 void (*send_request)(struct fw_card *card, struct fw_packet *packet); 391 void (*send_response)(struct fw_card *card, struct fw_packet *packet); 392 /* Calling cancel is valid once a packet has been submitted. */ 393 int (*cancel_packet)(struct fw_card *card, struct fw_packet *packet); 394 395 /* 396 * Allow the specified node ID to do direct DMA out and in of 397 * host memory. The card will disable this for all node when 398 * a bus reset happens, so driver need to reenable this after 399 * bus reset. Returns 0 on success, -ENODEV if the card 400 * doesn't support this, -ESTALE if the generation doesn't 401 * match. 402 */ 403 int (*enable_phys_dma)(struct fw_card *card, 404 int node_id, int generation); 405 406 u64 (*get_bus_time)(struct fw_card *card); 407 408 struct fw_iso_context * 409 (*allocate_iso_context)(struct fw_card *card, 410 int type, size_t header_size); 411 void (*free_iso_context)(struct fw_iso_context *ctx); 412 413 int (*start_iso)(struct fw_iso_context *ctx, 414 s32 cycle, u32 sync, u32 tags); 415 416 int (*queue_iso)(struct fw_iso_context *ctx, 417 struct fw_iso_packet *packet, 418 struct fw_iso_buffer *buffer, 419 unsigned long payload); 420 421 int (*stop_iso)(struct fw_iso_context *ctx); 422}; 423 424int 425fw_core_initiate_bus_reset(struct fw_card *card, int short_reset); 426 427void 428fw_send_request(struct fw_card *card, struct fw_transaction *t, 429 int tcode, int node_id, int generation, int speed, 430 unsigned long long offset, 431 void *data, size_t length, 432 fw_transaction_callback_t callback, void *callback_data); 433 434int fw_cancel_transaction(struct fw_card *card, 435 struct fw_transaction *transaction); 436 437void fw_flush_transactions(struct fw_card *card); 438 439void fw_send_phy_config(struct fw_card *card, 440 int node_id, int generation, int gap_count); 441 442/* 443 * Called by the topology code to inform the device code of node 444 * activity; found, lost, or updated nodes. 445 */ 446void 447fw_node_event(struct fw_card *card, struct fw_node *node, int event); 448 449/* API used by card level drivers */ 450 451void 452fw_card_initialize(struct fw_card *card, const struct fw_card_driver *driver, 453 struct device *device); 454int 455fw_card_add(struct fw_card *card, 456 u32 max_receive, u32 link_speed, u64 guid); 457 458void 459fw_core_remove_card(struct fw_card *card); 460 461void 462fw_core_handle_bus_reset(struct fw_card *card, 463 int node_id, int generation, 464 int self_id_count, u32 *self_ids); 465void 466fw_core_handle_request(struct fw_card *card, struct fw_packet *request); 467 468void 469fw_core_handle_response(struct fw_card *card, struct fw_packet *packet); 470 471#endif /* __fw_transaction_h */