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