aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firewire')
-rw-r--r--drivers/firewire/core-cdev.c45
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
54struct client { 55struct client {
55 u32 version; 56 u32 version;
@@ -176,7 +177,10 @@ struct outbound_transaction_event {
176 177
177struct inbound_transaction_event { 178struct 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
182struct iso_interrupt_event { 186struct 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: