diff options
| -rw-r--r-- | drivers/firewire/fw-device-cdev.c | 23 | ||||
| -rw-r--r-- | drivers/firewire/fw-device-cdev.h | 5 | ||||
| -rw-r--r-- | drivers/firewire/fw-iso.c | 7 | ||||
| -rw-r--r-- | drivers/firewire/fw-ohci.c | 168 | ||||
| -rw-r--r-- | drivers/firewire/fw-ohci.h | 1 | ||||
| -rw-r--r-- | drivers/firewire/fw-transaction.h | 7 |
6 files changed, 181 insertions, 30 deletions
diff --git a/drivers/firewire/fw-device-cdev.c b/drivers/firewire/fw-device-cdev.c index 6284375c6390..1101ccd9b9c1 100644 --- a/drivers/firewire/fw-device-cdev.c +++ b/drivers/firewire/fw-device-cdev.c | |||
| @@ -406,8 +406,12 @@ static int ioctl_create_iso_context(struct client *client, void __user *arg) | |||
| 406 | if (copy_from_user(&request, arg, sizeof request)) | 406 | if (copy_from_user(&request, arg, sizeof request)) |
| 407 | return -EFAULT; | 407 | return -EFAULT; |
| 408 | 408 | ||
| 409 | if (request.type > FW_ISO_CONTEXT_RECEIVE) | ||
| 410 | return -EINVAL; | ||
| 411 | |||
| 409 | client->iso_context = fw_iso_context_create(client->device->card, | 412 | client->iso_context = fw_iso_context_create(client->device->card, |
| 410 | FW_ISO_CONTEXT_TRANSMIT, | 413 | request.type, |
| 414 | request.header_size, | ||
| 411 | iso_callback, client); | 415 | iso_callback, client); |
| 412 | if (IS_ERR(client->iso_context)) | 416 | if (IS_ERR(client->iso_context)) |
| 413 | return PTR_ERR(client->iso_context); | 417 | return PTR_ERR(client->iso_context); |
| @@ -419,7 +423,7 @@ static int ioctl_queue_iso(struct client *client, void __user *arg) | |||
| 419 | { | 423 | { |
| 420 | struct fw_cdev_queue_iso request; | 424 | struct fw_cdev_queue_iso request; |
| 421 | struct fw_cdev_iso_packet __user *p, *end, *next; | 425 | struct fw_cdev_iso_packet __user *p, *end, *next; |
| 422 | unsigned long payload, payload_end; | 426 | unsigned long payload, payload_end, header_length; |
| 423 | int count; | 427 | int count; |
| 424 | struct { | 428 | struct { |
| 425 | struct fw_iso_packet packet; | 429 | struct fw_iso_packet packet; |
| @@ -456,12 +460,23 @@ static int ioctl_queue_iso(struct client *client, void __user *arg) | |||
| 456 | while (p < end) { | 460 | while (p < end) { |
| 457 | if (__copy_from_user(&u.packet, p, sizeof *p)) | 461 | if (__copy_from_user(&u.packet, p, sizeof *p)) |
| 458 | return -EFAULT; | 462 | return -EFAULT; |
| 463 | |||
| 464 | if (client->iso_context->type == FW_ISO_CONTEXT_TRANSMIT) { | ||
| 465 | header_length = u.packet.header_length; | ||
| 466 | } else { | ||
| 467 | /* We require that header_length is a multiple of | ||
| 468 | * the fixed header size, ctx->header_size */ | ||
| 469 | if (u.packet.header_length % client->iso_context->header_size != 0) | ||
| 470 | return -EINVAL; | ||
| 471 | header_length = 0; | ||
| 472 | } | ||
| 473 | |||
| 459 | next = (struct fw_cdev_iso_packet __user *) | 474 | next = (struct fw_cdev_iso_packet __user *) |
| 460 | &p->header[u.packet.header_length / 4]; | 475 | &p->header[header_length / 4]; |
| 461 | if (next > end) | 476 | if (next > end) |
| 462 | return -EINVAL; | 477 | return -EINVAL; |
| 463 | if (__copy_from_user | 478 | if (__copy_from_user |
| 464 | (u.packet.header, p->header, u.packet.header_length)) | 479 | (u.packet.header, p->header, header_length)) |
| 465 | return -EFAULT; | 480 | return -EFAULT; |
| 466 | if (u.packet.skip && | 481 | if (u.packet.skip && |
| 467 | u.packet.header_length + u.packet.payload_length > 0) | 482 | u.packet.header_length + u.packet.payload_length > 0) |
diff --git a/drivers/firewire/fw-device-cdev.h b/drivers/firewire/fw-device-cdev.h index 003cc669551b..4e766ec6cd38 100644 --- a/drivers/firewire/fw-device-cdev.h +++ b/drivers/firewire/fw-device-cdev.h | |||
| @@ -125,7 +125,12 @@ struct fw_cdev_allocate { | |||
| 125 | __u32 length; | 125 | __u32 length; |
| 126 | }; | 126 | }; |
| 127 | 127 | ||
| 128 | #define FW_CDEV_ISO_CONTEXT_TRANSMIT 0 | ||
| 129 | #define FW_CDEV_ISO_CONTEXT_RECEIVE 1 | ||
| 130 | |||
| 128 | struct fw_cdev_create_iso_context { | 131 | struct fw_cdev_create_iso_context { |
| 132 | __u32 type; | ||
| 133 | __u32 header_size; | ||
| 129 | __u32 handle; | 134 | __u32 handle; |
| 130 | }; | 135 | }; |
| 131 | 136 | ||
diff --git a/drivers/firewire/fw-iso.c b/drivers/firewire/fw-iso.c index 4e7ba8672929..4c6dc99a1ff8 100644 --- a/drivers/firewire/fw-iso.c +++ b/drivers/firewire/fw-iso.c | |||
| @@ -105,9 +105,9 @@ void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, | |||
| 105 | buffer->pages = NULL; | 105 | buffer->pages = NULL; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | struct fw_iso_context *fw_iso_context_create(struct fw_card *card, int type, | 108 | struct fw_iso_context * |
| 109 | fw_iso_callback_t callback, | 109 | fw_iso_context_create(struct fw_card *card, int type, size_t header_size, |
| 110 | void *callback_data) | 110 | fw_iso_callback_t callback, void *callback_data) |
| 111 | { | 111 | { |
| 112 | struct fw_iso_context *ctx; | 112 | struct fw_iso_context *ctx; |
| 113 | 113 | ||
| @@ -117,6 +117,7 @@ struct fw_iso_context *fw_iso_context_create(struct fw_card *card, int type, | |||
| 117 | 117 | ||
| 118 | ctx->card = card; | 118 | ctx->card = card; |
| 119 | ctx->type = type; | 119 | ctx->type = type; |
| 120 | ctx->header_size = header_size; | ||
| 120 | ctx->callback = callback; | 121 | ctx->callback = callback; |
| 121 | ctx->callback_data = callback_data; | 122 | ctx->callback_data = callback_data; |
| 122 | 123 | ||
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c index 86fe55cff28a..90db5a4f3aee 100644 --- a/drivers/firewire/fw-ohci.c +++ b/drivers/firewire/fw-ohci.c | |||
| @@ -45,6 +45,7 @@ | |||
| 45 | #define descriptor_irq_error (1 << 4) | 45 | #define descriptor_irq_error (1 << 4) |
| 46 | #define descriptor_irq_always (3 << 4) | 46 | #define descriptor_irq_always (3 << 4) |
| 47 | #define descriptor_branch_always (3 << 2) | 47 | #define descriptor_branch_always (3 << 2) |
| 48 | #define descriptor_wait (3 << 0) | ||
| 48 | 49 | ||
| 49 | struct descriptor { | 50 | struct descriptor { |
| 50 | __le16 req_count; | 51 | __le16 req_count; |
| @@ -55,6 +56,20 @@ struct descriptor { | |||
| 55 | __le16 transfer_status; | 56 | __le16 transfer_status; |
| 56 | } __attribute__((aligned(16))); | 57 | } __attribute__((aligned(16))); |
| 57 | 58 | ||
| 59 | struct db_descriptor { | ||
| 60 | __le16 first_size; | ||
| 61 | __le16 control; | ||
| 62 | __le16 second_req_count; | ||
| 63 | __le16 first_req_count; | ||
| 64 | __le32 branch_address; | ||
| 65 | __le16 second_res_count; | ||
| 66 | __le16 first_res_count; | ||
| 67 | __le32 reserved0; | ||
| 68 | __le32 first_buffer; | ||
| 69 | __le32 second_buffer; | ||
| 70 | __le32 reserved1; | ||
| 71 | } __attribute__((aligned(16))); | ||
| 72 | |||
| 58 | #define control_set(regs) (regs) | 73 | #define control_set(regs) (regs) |
| 59 | #define control_clear(regs) ((regs) + 4) | 74 | #define control_clear(regs) ((regs) + 4) |
| 60 | #define command_ptr(regs) ((regs) + 12) | 75 | #define command_ptr(regs) ((regs) + 12) |
| @@ -171,7 +186,12 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card) | |||
| 171 | return container_of(card, struct fw_ohci, card); | 186 | return container_of(card, struct fw_ohci, card); |
| 172 | } | 187 | } |
| 173 | 188 | ||
| 174 | #define CONTEXT_CYCLE_MATCH_ENABLE 0x80000000 | 189 | #define IT_CONTEXT_CYCLE_MATCH_ENABLE 0x80000000 |
| 190 | #define IR_CONTEXT_BUFFER_FILL 0x80000000 | ||
| 191 | #define IR_CONTEXT_ISOCH_HEADER 0x40000000 | ||
| 192 | #define IR_CONTEXT_CYCLE_MATCH_ENABLE 0x20000000 | ||
| 193 | #define IR_CONTEXT_MULTI_CHANNEL_MODE 0x10000000 | ||
| 194 | #define IR_CONTEXT_DUAL_BUFFER_MODE 0x08000000 | ||
| 175 | 195 | ||
| 176 | #define CONTEXT_RUN 0x8000 | 196 | #define CONTEXT_RUN 0x8000 |
| 177 | #define CONTEXT_WAKE 0x1000 | 197 | #define CONTEXT_WAKE 0x1000 |
| @@ -518,14 +538,14 @@ context_get_descriptors(struct context *ctx, int z, dma_addr_t *d_bus) | |||
| 518 | return d; | 538 | return d; |
| 519 | } | 539 | } |
| 520 | 540 | ||
| 521 | static void context_run(struct context *ctx, u32 cycle_match) | 541 | static void context_run(struct context *ctx, u32 extra) |
| 522 | { | 542 | { |
| 523 | struct fw_ohci *ohci = ctx->ohci; | 543 | struct fw_ohci *ohci = ctx->ohci; |
| 524 | 544 | ||
| 525 | reg_write(ohci, command_ptr(ctx->regs), | 545 | reg_write(ohci, command_ptr(ctx->regs), |
| 526 | le32_to_cpu(ctx->tail_descriptor_last->branch_address)); | 546 | le32_to_cpu(ctx->tail_descriptor_last->branch_address)); |
| 527 | reg_write(ohci, control_clear(ctx->regs), ~0); | 547 | reg_write(ohci, control_clear(ctx->regs), ~0); |
| 528 | reg_write(ohci, control_set(ctx->regs), CONTEXT_RUN | cycle_match); | 548 | reg_write(ohci, control_set(ctx->regs), CONTEXT_RUN | extra); |
| 529 | flush_writes(ohci); | 549 | flush_writes(ohci); |
| 530 | } | 550 | } |
| 531 | 551 | ||
| @@ -1240,11 +1260,25 @@ ohci_enable_phys_dma(struct fw_card *card, int node_id, int generation) | |||
| 1240 | return retval; | 1260 | return retval; |
| 1241 | } | 1261 | } |
| 1242 | 1262 | ||
| 1243 | static void ir_context_tasklet(unsigned long data) | 1263 | static int handle_ir_packet(struct context *context, |
| 1264 | struct descriptor *d, | ||
| 1265 | struct descriptor *last) | ||
| 1244 | { | 1266 | { |
| 1245 | struct iso_context *ctx = (struct iso_context *)data; | 1267 | struct iso_context *ctx = |
| 1268 | container_of(context, struct iso_context, context); | ||
| 1269 | struct db_descriptor *db = (struct db_descriptor *) d; | ||
| 1270 | |||
| 1271 | if (db->first_res_count > 0 && db->second_res_count > 0) | ||
| 1272 | /* This descriptor isn't done yet, stop iteration. */ | ||
| 1273 | return 0; | ||
| 1274 | |||
| 1275 | if (le16_to_cpu(db->control) & descriptor_irq_always) | ||
| 1276 | /* FIXME: we should pass payload address here. */ | ||
| 1277 | ctx->base.callback(&ctx->base, | ||
| 1278 | 0, 0, | ||
| 1279 | ctx->base.callback_data); | ||
| 1246 | 1280 | ||
| 1247 | (void)ctx; | 1281 | return 1; |
| 1248 | } | 1282 | } |
| 1249 | 1283 | ||
| 1250 | #define ISO_BUFFER_SIZE (64 * 1024) | 1284 | #define ISO_BUFFER_SIZE (64 * 1024) |
| @@ -1274,7 +1308,7 @@ ohci_allocate_iso_context(struct fw_card *card, int type) | |||
| 1274 | struct fw_ohci *ohci = fw_ohci(card); | 1308 | struct fw_ohci *ohci = fw_ohci(card); |
| 1275 | struct iso_context *ctx, *list; | 1309 | struct iso_context *ctx, *list; |
| 1276 | descriptor_callback_t callback; | 1310 | descriptor_callback_t callback; |
| 1277 | u32 *mask; | 1311 | u32 *mask, regs; |
| 1278 | unsigned long flags; | 1312 | unsigned long flags; |
| 1279 | int index, retval; | 1313 | int index, retval; |
| 1280 | 1314 | ||
| @@ -1283,7 +1317,9 @@ ohci_allocate_iso_context(struct fw_card *card, int type) | |||
| 1283 | list = ohci->it_context_list; | 1317 | list = ohci->it_context_list; |
| 1284 | callback = handle_it_packet; | 1318 | callback = handle_it_packet; |
| 1285 | } else { | 1319 | } else { |
| 1286 | return ERR_PTR(-EINVAL); | 1320 | mask = &ohci->ir_context_mask; |
| 1321 | list = ohci->ir_context_list; | ||
| 1322 | callback = handle_ir_packet; | ||
| 1287 | } | 1323 | } |
| 1288 | 1324 | ||
| 1289 | spin_lock_irqsave(&ohci->lock, flags); | 1325 | spin_lock_irqsave(&ohci->lock, flags); |
| @@ -1295,10 +1331,15 @@ ohci_allocate_iso_context(struct fw_card *card, int type) | |||
| 1295 | if (index < 0) | 1331 | if (index < 0) |
| 1296 | return ERR_PTR(-EBUSY); | 1332 | return ERR_PTR(-EBUSY); |
| 1297 | 1333 | ||
| 1334 | if (type == FW_ISO_CONTEXT_TRANSMIT) | ||
| 1335 | regs = OHCI1394_IsoXmitContextBase(index); | ||
| 1336 | else | ||
| 1337 | regs = OHCI1394_IsoRcvContextBase(index); | ||
| 1338 | |||
| 1298 | ctx = &list[index]; | 1339 | ctx = &list[index]; |
| 1299 | memset(ctx, 0, sizeof *ctx); | 1340 | memset(ctx, 0, sizeof *ctx); |
| 1300 | retval = context_init(&ctx->context, ohci, ISO_BUFFER_SIZE, | 1341 | retval = context_init(&ctx->context, ohci, ISO_BUFFER_SIZE, |
| 1301 | OHCI1394_IsoXmitContextBase(index), callback); | 1342 | regs, callback); |
| 1302 | if (retval < 0) { | 1343 | if (retval < 0) { |
| 1303 | spin_lock_irqsave(&ohci->lock, flags); | 1344 | spin_lock_irqsave(&ohci->lock, flags); |
| 1304 | *mask |= 1 << index; | 1345 | *mask |= 1 << index; |
| @@ -1316,13 +1357,24 @@ static int ohci_send_iso(struct fw_iso_context *base, s32 cycle) | |||
| 1316 | u32 cycle_match = 0; | 1357 | u32 cycle_match = 0; |
| 1317 | int index; | 1358 | int index; |
| 1318 | 1359 | ||
| 1319 | index = ctx - ohci->it_context_list; | 1360 | if (ctx->base.type == FW_ISO_CONTEXT_TRANSMIT) { |
| 1320 | if (cycle > 0) | 1361 | index = ctx - ohci->it_context_list; |
| 1321 | cycle_match = CONTEXT_CYCLE_MATCH_ENABLE | | 1362 | if (cycle > 0) |
| 1322 | (cycle & 0x7fff) << 16; | 1363 | cycle_match = IT_CONTEXT_CYCLE_MATCH_ENABLE | |
| 1364 | (cycle & 0x7fff) << 16; | ||
| 1365 | |||
| 1366 | reg_write(ohci, OHCI1394_IsoXmitIntEventClear, 1 << index); | ||
| 1367 | reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, 1 << index); | ||
| 1368 | context_run(&ctx->context, cycle_match); | ||
| 1369 | } else { | ||
| 1370 | index = ctx - ohci->ir_context_list; | ||
| 1323 | 1371 | ||
| 1324 | reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, 1 << index); | 1372 | reg_write(ohci, OHCI1394_IsoRecvIntEventClear, 1 << index); |
| 1325 | context_run(&ctx->context, cycle_match); | 1373 | reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, 1 << index); |
| 1374 | reg_write(ohci, context_match(ctx->context.regs), | ||
| 1375 | 0xf0000000 | ctx->base.channel); | ||
| 1376 | context_run(&ctx->context, IR_CONTEXT_DUAL_BUFFER_MODE); | ||
| 1377 | } | ||
| 1326 | 1378 | ||
| 1327 | return 0; | 1379 | return 0; |
| 1328 | } | 1380 | } |
| @@ -1355,10 +1407,10 @@ static void ohci_free_iso_context(struct fw_iso_context *base) | |||
| 1355 | } | 1407 | } |
| 1356 | 1408 | ||
| 1357 | static int | 1409 | static int |
| 1358 | ohci_queue_iso(struct fw_iso_context *base, | 1410 | ohci_queue_iso_transmit(struct fw_iso_context *base, |
| 1359 | struct fw_iso_packet *packet, | 1411 | struct fw_iso_packet *packet, |
| 1360 | struct fw_iso_buffer *buffer, | 1412 | struct fw_iso_buffer *buffer, |
| 1361 | unsigned long payload) | 1413 | unsigned long payload) |
| 1362 | { | 1414 | { |
| 1363 | struct iso_context *ctx = container_of(base, struct iso_context, base); | 1415 | struct iso_context *ctx = container_of(base, struct iso_context, base); |
| 1364 | struct descriptor *d, *last, *pd; | 1416 | struct descriptor *d, *last, *pd; |
| @@ -1451,6 +1503,84 @@ ohci_queue_iso(struct fw_iso_context *base, | |||
| 1451 | return 0; | 1503 | return 0; |
| 1452 | } | 1504 | } |
| 1453 | 1505 | ||
| 1506 | static int | ||
| 1507 | ohci_queue_iso_receive(struct fw_iso_context *base, | ||
| 1508 | struct fw_iso_packet *packet, | ||
| 1509 | struct fw_iso_buffer *buffer, | ||
| 1510 | unsigned long payload) | ||
| 1511 | { | ||
| 1512 | struct iso_context *ctx = container_of(base, struct iso_context, base); | ||
| 1513 | struct db_descriptor *db = NULL; | ||
| 1514 | struct descriptor *d; | ||
| 1515 | struct fw_iso_packet *p; | ||
| 1516 | dma_addr_t d_bus, page_bus; | ||
| 1517 | u32 z, header_z, length, rest; | ||
| 1518 | int page, offset; | ||
| 1519 | |||
| 1520 | /* FIXME: Cycle lost behavior should be configurable: lose | ||
| 1521 | * packet, retransmit or terminate.. */ | ||
| 1522 | |||
| 1523 | p = packet; | ||
| 1524 | z = 2; | ||
| 1525 | |||
| 1526 | /* Get header size in number of descriptors. */ | ||
| 1527 | header_z = DIV_ROUND_UP(p->header_length, sizeof *d); | ||
| 1528 | page = payload >> PAGE_SHIFT; | ||
| 1529 | offset = payload & ~PAGE_MASK; | ||
| 1530 | rest = p->payload_length; | ||
| 1531 | |||
| 1532 | /* FIXME: OHCI 1.0 doesn't support dual buffer receive */ | ||
| 1533 | /* FIXME: handle descriptor_wait */ | ||
| 1534 | /* FIXME: make packet-per-buffer/dual-buffer a context option */ | ||
| 1535 | while (rest > 0) { | ||
| 1536 | d = context_get_descriptors(&ctx->context, | ||
| 1537 | z + header_z, &d_bus); | ||
| 1538 | if (d == NULL) | ||
| 1539 | return -ENOMEM; | ||
| 1540 | |||
| 1541 | db = (struct db_descriptor *) d; | ||
| 1542 | db->control = cpu_to_le16(descriptor_status | | ||
| 1543 | descriptor_branch_always); | ||
| 1544 | db->first_size = cpu_to_le16(ctx->base.header_size); | ||
| 1545 | db->first_req_count = cpu_to_le16(p->header_length); | ||
| 1546 | db->second_req_count = cpu_to_le16(p->payload_length); | ||
| 1547 | db->first_res_count = cpu_to_le16(db->first_req_count); | ||
| 1548 | db->second_res_count = cpu_to_le16(db->second_req_count); | ||
| 1549 | |||
| 1550 | db->first_buffer = cpu_to_le32(d_bus + sizeof *db); | ||
| 1551 | |||
| 1552 | if (offset + rest < PAGE_SIZE) | ||
| 1553 | length = rest; | ||
| 1554 | else | ||
| 1555 | length = PAGE_SIZE - offset; | ||
| 1556 | |||
| 1557 | page_bus = page_private(buffer->pages[page]); | ||
| 1558 | db->second_buffer = cpu_to_le32(page_bus + offset); | ||
| 1559 | |||
| 1560 | context_append(&ctx->context, d, z, header_z); | ||
| 1561 | offset = (offset + length) & ~PAGE_MASK; | ||
| 1562 | rest -= length; | ||
| 1563 | page++; | ||
| 1564 | } | ||
| 1565 | |||
| 1566 | if (p->interrupt) | ||
| 1567 | db->control |= cpu_to_le16(descriptor_irq_always); | ||
| 1568 | |||
| 1569 | return 0; | ||
| 1570 | } | ||
| 1571 | |||
| 1572 | static int | ||
| 1573 | ohci_queue_iso(struct fw_iso_context *base, | ||
| 1574 | struct fw_iso_packet *packet, | ||
| 1575 | struct fw_iso_buffer *buffer, | ||
| 1576 | unsigned long payload) | ||
| 1577 | { | ||
| 1578 | if (base->type == FW_ISO_CONTEXT_TRANSMIT) | ||
| 1579 | return ohci_queue_iso_transmit(base, packet, buffer, payload); | ||
| 1580 | else | ||
| 1581 | return ohci_queue_iso_receive(base, packet, buffer, payload); | ||
| 1582 | } | ||
| 1583 | |||
| 1454 | static const struct fw_card_driver ohci_driver = { | 1584 | static const struct fw_card_driver ohci_driver = { |
| 1455 | .name = ohci_driver_name, | 1585 | .name = ohci_driver_name, |
| 1456 | .enable = ohci_enable, | 1586 | .enable = ohci_enable, |
diff --git a/drivers/firewire/fw-ohci.h b/drivers/firewire/fw-ohci.h index a562305078bb..fa15706397d7 100644 --- a/drivers/firewire/fw-ohci.h +++ b/drivers/firewire/fw-ohci.h | |||
| @@ -103,6 +103,7 @@ | |||
| 103 | #define OHCI1394_IsoXmitCommandPtr(n) (0x20C + 16 * (n)) | 103 | #define OHCI1394_IsoXmitCommandPtr(n) (0x20C + 16 * (n)) |
| 104 | 104 | ||
| 105 | /* Isochronous receive registers */ | 105 | /* Isochronous receive registers */ |
| 106 | #define OHCI1394_IsoRcvContextBase(n) (0x400 + 32 * (n)) | ||
| 106 | #define OHCI1394_IsoRcvContextControlSet(n) (0x400 + 32 * (n)) | 107 | #define OHCI1394_IsoRcvContextControlSet(n) (0x400 + 32 * (n)) |
| 107 | #define OHCI1394_IsoRcvContextControlClear(n) (0x404 + 32 * (n)) | 108 | #define OHCI1394_IsoRcvContextControlClear(n) (0x404 + 32 * (n)) |
| 108 | #define OHCI1394_IsoRcvCommandPtr(n) (0x40C + 32 * (n)) | 109 | #define OHCI1394_IsoRcvCommandPtr(n) (0x40C + 32 * (n)) |
diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h index 89c6dda27936..9e92edad68d7 100644 --- a/drivers/firewire/fw-transaction.h +++ b/drivers/firewire/fw-transaction.h | |||
| @@ -354,6 +354,7 @@ struct fw_iso_context { | |||
| 354 | int type; | 354 | int type; |
| 355 | int channel; | 355 | int channel; |
| 356 | int speed; | 356 | int speed; |
| 357 | size_t header_size; | ||
| 357 | fw_iso_callback_t callback; | 358 | fw_iso_callback_t callback; |
| 358 | void *callback_data; | 359 | void *callback_data; |
| 359 | }; | 360 | }; |
| @@ -369,10 +370,8 @@ void | |||
| 369 | fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card); | 370 | fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card); |
| 370 | 371 | ||
| 371 | struct fw_iso_context * | 372 | struct fw_iso_context * |
| 372 | fw_iso_context_create(struct fw_card *card, int type, | 373 | fw_iso_context_create(struct fw_card *card, int type, size_t header_size, |
| 373 | fw_iso_callback_t callback, | 374 | fw_iso_callback_t callback, void *callback_data); |
| 374 | void *callback_data); | ||
| 375 | |||
| 376 | 375 | ||
| 377 | void | 376 | void |
| 378 | fw_iso_context_destroy(struct fw_iso_context *ctx); | 377 | fw_iso_context_destroy(struct fw_iso_context *ctx); |
