diff options
Diffstat (limited to 'drivers/firewire')
-rw-r--r-- | drivers/firewire/core-cdev.c | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index 0cf86bcbeea2..9b8df2039155 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c | |||
@@ -49,7 +49,8 @@ | |||
49 | /* | 49 | /* |
50 | * ABI version history is documented in linux/firewire-cdev.h. | 50 | * ABI version history is documented in linux/firewire-cdev.h. |
51 | */ | 51 | */ |
52 | #define FW_CDEV_KERNEL_VERSION 3 | 52 | #define FW_CDEV_KERNEL_VERSION 4 |
53 | #define FW_CDEV_VERSION_EVENT_REQUEST2 4 | ||
53 | 54 | ||
54 | struct client { | 55 | struct client { |
55 | u32 version; | 56 | u32 version; |
@@ -176,7 +177,10 @@ struct outbound_transaction_event { | |||
176 | 177 | ||
177 | struct inbound_transaction_event { | 178 | struct inbound_transaction_event { |
178 | struct event event; | 179 | struct event event; |
179 | struct fw_cdev_event_request request; | 180 | union { |
181 | struct fw_cdev_event_request request; | ||
182 | struct fw_cdev_event_request2 request2; | ||
183 | } req; | ||
180 | }; | 184 | }; |
181 | 185 | ||
182 | struct iso_interrupt_event { | 186 | struct iso_interrupt_event { |
@@ -645,6 +649,7 @@ static void handle_request(struct fw_card *card, struct fw_request *request, | |||
645 | struct address_handler_resource *handler = callback_data; | 649 | struct address_handler_resource *handler = callback_data; |
646 | struct inbound_transaction_resource *r; | 650 | struct inbound_transaction_resource *r; |
647 | struct inbound_transaction_event *e; | 651 | struct inbound_transaction_event *e; |
652 | size_t event_size0; | ||
648 | void *fcp_frame = NULL; | 653 | void *fcp_frame = NULL; |
649 | int ret; | 654 | int ret; |
650 | 655 | ||
@@ -678,15 +683,37 @@ static void handle_request(struct fw_card *card, struct fw_request *request, | |||
678 | if (ret < 0) | 683 | if (ret < 0) |
679 | goto failed; | 684 | goto failed; |
680 | 685 | ||
681 | e->request.type = FW_CDEV_EVENT_REQUEST; | 686 | if (handler->client->version < FW_CDEV_VERSION_EVENT_REQUEST2) { |
682 | e->request.tcode = tcode; | 687 | struct fw_cdev_event_request *req = &e->req.request; |
683 | e->request.offset = offset; | 688 | |
684 | e->request.length = length; | 689 | if (tcode & 0x10) |
685 | e->request.handle = r->resource.handle; | 690 | tcode = TCODE_LOCK_REQUEST; |
686 | e->request.closure = handler->closure; | 691 | |
692 | req->type = FW_CDEV_EVENT_REQUEST; | ||
693 | req->tcode = tcode; | ||
694 | req->offset = offset; | ||
695 | req->length = length; | ||
696 | req->handle = r->resource.handle; | ||
697 | req->closure = handler->closure; | ||
698 | event_size0 = sizeof(*req); | ||
699 | } else { | ||
700 | struct fw_cdev_event_request2 *req = &e->req.request2; | ||
701 | |||
702 | req->type = FW_CDEV_EVENT_REQUEST2; | ||
703 | req->tcode = tcode; | ||
704 | req->offset = offset; | ||
705 | req->source_node_id = source; | ||
706 | req->destination_node_id = destination; | ||
707 | req->card = card->index; | ||
708 | req->generation = generation; | ||
709 | req->length = length; | ||
710 | req->handle = r->resource.handle; | ||
711 | req->closure = handler->closure; | ||
712 | event_size0 = sizeof(*req); | ||
713 | } | ||
687 | 714 | ||
688 | queue_event(handler->client, &e->event, | 715 | queue_event(handler->client, &e->event, |
689 | &e->request, sizeof(e->request), r->data, length); | 716 | &e->req, event_size0, r->data, length); |
690 | return; | 717 | return; |
691 | 718 | ||
692 | failed: | 719 | failed: |