firewire: Fix dualbuffer iso receive mode and drop buffer fill mode.
[pandora-kernel.git] / drivers / firewire / fw-device-cdev.c
1 /*                                              -*- c-basic-offset: 8 -*-
2  *
3  * fw-device-cdev.c - Char device for device raw access
4  *
5  * Copyright (C) 2005-2006  Kristian Hoegsberg <krh@bitplanet.net>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software Foundation,
19  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */
21
22 #include <linux/module.h>
23 #include <linux/kernel.h>
24 #include <linux/wait.h>
25 #include <linux/errno.h>
26 #include <linux/device.h>
27 #include <linux/vmalloc.h>
28 #include <linux/poll.h>
29 #include <linux/delay.h>
30 #include <linux/mm.h>
31 #include <linux/idr.h>
32 #include <linux/compat.h>
33 #include <asm/uaccess.h>
34 #include "fw-transaction.h"
35 #include "fw-topology.h"
36 #include "fw-device.h"
37 #include "fw-device-cdev.h"
38
39 /*
40  * todo
41  *
42  * - bus resets sends a new packet with new generation and node id
43  *
44  */
45
46 /* dequeue_event() just kfree()'s the event, so the event has to be
47  * the first field in the struct. */
48
49 struct event {
50         struct { void *data; size_t size; } v[2];
51         struct list_head link;
52 };
53
54 struct bus_reset {
55         struct event event;
56         struct fw_cdev_event_bus_reset reset;
57 };
58
59 struct response {
60         struct event event;
61         struct fw_transaction transaction;
62         struct client *client;
63         struct list_head link;
64         struct fw_cdev_event_response response;
65 };
66
67 struct iso_interrupt {
68         struct event event;
69         struct fw_cdev_event_iso_interrupt interrupt;
70 };
71
72 struct client {
73         u32 version;
74         struct fw_device *device;
75         spinlock_t lock;
76         struct list_head handler_list;
77         struct list_head request_list;
78         struct list_head transaction_list;
79         u32 request_serial;
80         struct list_head event_list;
81         wait_queue_head_t wait;
82
83         struct fw_iso_context *iso_context;
84         struct fw_iso_buffer buffer;
85         unsigned long vm_start;
86
87         struct list_head link;
88 };
89
90 static inline void __user *
91 u64_to_uptr(__u64 value)
92 {
93         return (void __user *)(unsigned long)value;
94 }
95
96 static inline __u64
97 uptr_to_u64(void __user *ptr)
98 {
99         return (__u64)(unsigned long)ptr;
100 }
101
102 static int fw_device_op_open(struct inode *inode, struct file *file)
103 {
104         struct fw_device *device;
105         struct client *client;
106         unsigned long flags;
107
108         device = fw_device_from_devt(inode->i_rdev);
109         if (device == NULL)
110                 return -ENODEV;
111
112         client = kzalloc(sizeof *client, GFP_KERNEL);
113         if (client == NULL)
114                 return -ENOMEM;
115
116         client->device = fw_device_get(device);
117         INIT_LIST_HEAD(&client->event_list);
118         INIT_LIST_HEAD(&client->handler_list);
119         INIT_LIST_HEAD(&client->request_list);
120         INIT_LIST_HEAD(&client->transaction_list);
121         spin_lock_init(&client->lock);
122         init_waitqueue_head(&client->wait);
123
124         file->private_data = client;
125
126         spin_lock_irqsave(&device->card->lock, flags);
127         list_add_tail(&client->link, &device->client_list);
128         spin_unlock_irqrestore(&device->card->lock, flags);
129
130         return 0;
131 }
132
133 static void queue_event(struct client *client, struct event *event,
134                         void *data0, size_t size0, void *data1, size_t size1)
135 {
136         unsigned long flags;
137
138         event->v[0].data = data0;
139         event->v[0].size = size0;
140         event->v[1].data = data1;
141         event->v[1].size = size1;
142
143         spin_lock_irqsave(&client->lock, flags);
144
145         list_add_tail(&event->link, &client->event_list);
146         wake_up_interruptible(&client->wait);
147
148         spin_unlock_irqrestore(&client->lock, flags);
149 }
150
151 static int
152 dequeue_event(struct client *client, char __user *buffer, size_t count)
153 {
154         unsigned long flags;
155         struct event *event;
156         size_t size, total;
157         int i, retval;
158
159         retval = wait_event_interruptible(client->wait,
160                                           !list_empty(&client->event_list) ||
161                                           fw_device_is_shutdown(client->device));
162         if (retval < 0)
163                 return retval;
164
165         if (list_empty(&client->event_list) &&
166                        fw_device_is_shutdown(client->device))
167                 return -ENODEV;
168
169         spin_lock_irqsave(&client->lock, flags);
170         event = container_of(client->event_list.next, struct event, link);
171         list_del(&event->link);
172         spin_unlock_irqrestore(&client->lock, flags);
173
174         total = 0;
175         for (i = 0; i < ARRAY_SIZE(event->v) && total < count; i++) {
176                 size = min(event->v[i].size, count - total);
177                 if (copy_to_user(buffer + total, event->v[i].data, size)) {
178                         retval = -EFAULT;
179                         goto out;
180                 }
181                 total += size;
182         }
183         retval = total;
184
185  out:
186         kfree(event);
187
188         return retval;
189 }
190
191 static ssize_t
192 fw_device_op_read(struct file *file,
193                   char __user *buffer, size_t count, loff_t *offset)
194 {
195         struct client *client = file->private_data;
196
197         return dequeue_event(client, buffer, count);
198 }
199
200 static void
201 fill_bus_reset_event(struct fw_cdev_event_bus_reset *event,
202                      struct fw_device *device)
203 {
204         struct fw_card *card = device->card;
205
206         event->type          = FW_CDEV_EVENT_BUS_RESET;
207         event->node_id       = device->node_id;
208         event->local_node_id = card->local_node->node_id;
209         event->bm_node_id    = 0; /* FIXME: We don't track the BM. */
210         event->irm_node_id   = card->irm_node->node_id;
211         event->root_node_id  = card->root_node->node_id;
212         event->generation    = card->generation;
213 }
214
215 static void
216 for_each_client(struct fw_device *device,
217                 void (*callback)(struct client *client))
218 {
219         struct fw_card *card = device->card;
220         struct client *c;
221         unsigned long flags;
222
223         spin_lock_irqsave(&card->lock, flags);
224
225         list_for_each_entry(c, &device->client_list, link)
226                 callback(c);
227
228         spin_unlock_irqrestore(&card->lock, flags);
229 }
230
231 static void
232 queue_bus_reset_event(struct client *client)
233 {
234         struct bus_reset *bus_reset;
235         struct fw_device *device = client->device;
236
237         bus_reset = kzalloc(sizeof *bus_reset, GFP_ATOMIC);
238         if (bus_reset == NULL) {
239                 fw_notify("Out of memory when allocating bus reset event\n");
240                 return;
241         }
242
243         fill_bus_reset_event(&bus_reset->reset, device);
244
245         queue_event(client, &bus_reset->event,
246                     &bus_reset->reset, sizeof bus_reset->reset, NULL, 0);
247 }
248
249 void fw_device_cdev_update(struct fw_device *device)
250 {
251         for_each_client(device, queue_bus_reset_event);
252 }
253
254 static void wake_up_client(struct client *client)
255 {
256         wake_up_interruptible(&client->wait);
257 }
258
259 void fw_device_cdev_remove(struct fw_device *device)
260 {
261         for_each_client(device, wake_up_client);
262 }
263
264 static int ioctl_get_info(struct client *client, void __user *arg)
265 {
266         struct fw_cdev_get_info get_info;
267         struct fw_cdev_event_bus_reset bus_reset;
268
269         if (copy_from_user(&get_info, arg, sizeof get_info))
270                 return -EFAULT;
271
272         client->version = get_info.version;
273         get_info.version = FW_CDEV_VERSION;
274
275         if (get_info.rom != 0) {
276                 void __user *uptr = u64_to_uptr(get_info.rom);
277                 size_t length = min(get_info.rom_length,
278                                     client->device->config_rom_length * 4);
279
280                 if (copy_to_user(uptr, client->device->config_rom, length))
281                         return -EFAULT;
282         }
283         get_info.rom_length = client->device->config_rom_length * 4;
284
285         if (get_info.bus_reset != 0) {
286                 void __user *uptr = u64_to_uptr(get_info.bus_reset);
287
288                 fill_bus_reset_event(&bus_reset, client->device);
289                 if (copy_to_user(uptr, &bus_reset, sizeof bus_reset))
290                         return -EFAULT;
291         }
292
293         get_info.card = client->device->card->index;
294
295         if (copy_to_user(arg, &get_info, sizeof get_info))
296                 return -EFAULT;
297
298         return 0;
299 }
300
301 static void
302 complete_transaction(struct fw_card *card, int rcode,
303                      void *payload, size_t length, void *data)
304 {
305         struct response *response = data;
306         struct client *client = response->client;
307         unsigned long flags;
308
309         if (length < response->response.length)
310                 response->response.length = length;
311         if (rcode == RCODE_COMPLETE)
312                 memcpy(response->response.data, payload,
313                        response->response.length);
314
315         spin_lock_irqsave(&client->lock, flags);
316         list_del(&response->link);
317         spin_unlock_irqrestore(&client->lock, flags);
318
319         response->response.type   = FW_CDEV_EVENT_RESPONSE;
320         response->response.rcode  = rcode;
321         queue_event(client, &response->event,
322                     &response->response, sizeof response->response,
323                     response->response.data, response->response.length);
324 }
325
326 static ssize_t ioctl_send_request(struct client *client, void __user *arg)
327 {
328         struct fw_device *device = client->device;
329         struct fw_cdev_send_request request;
330         struct response *response;
331         unsigned long flags;
332
333         if (copy_from_user(&request, arg, sizeof request))
334                 return -EFAULT;
335
336         /* What is the biggest size we'll accept, really? */
337         if (request.length > 4096)
338                 return -EINVAL;
339
340         response = kmalloc(sizeof *response + request.length, GFP_KERNEL);
341         if (response == NULL)
342                 return -ENOMEM;
343
344         response->client = client;
345         response->response.length = request.length;
346         response->response.closure = request.closure;
347
348         if (request.data &&
349             copy_from_user(response->response.data,
350                            u64_to_uptr(request.data), request.length)) {
351                 kfree(response);
352                 return -EFAULT;
353         }
354
355         spin_lock_irqsave(&client->lock, flags);
356         list_add_tail(&response->link, &client->transaction_list);
357         spin_unlock_irqrestore(&client->lock, flags);
358
359         fw_send_request(device->card, &response->transaction,
360                         request.tcode & 0x1f,
361                         device->node->node_id,
362                         request.generation,
363                         device->node->max_speed,
364                         request.offset,
365                         response->response.data, request.length,
366                         complete_transaction, response);
367
368         if (request.data)
369                 return sizeof request + request.length;
370         else
371                 return sizeof request;
372 }
373
374 struct address_handler {
375         struct fw_address_handler handler;
376         __u64 closure;
377         struct client *client;
378         struct list_head link;
379 };
380
381 struct request {
382         struct fw_request *request;
383         void *data;
384         size_t length;
385         u32 serial;
386         struct list_head link;
387 };
388
389 struct request_event {
390         struct event event;
391         struct fw_cdev_event_request request;
392 };
393
394 static void
395 handle_request(struct fw_card *card, struct fw_request *r,
396                int tcode, int destination, int source,
397                int generation, int speed,
398                unsigned long long offset,
399                void *payload, size_t length, void *callback_data)
400 {
401         struct address_handler *handler = callback_data;
402         struct request *request;
403         struct request_event *e;
404         unsigned long flags;
405         struct client *client = handler->client;
406
407         request = kmalloc(sizeof *request, GFP_ATOMIC);
408         e = kmalloc(sizeof *e, GFP_ATOMIC);
409         if (request == NULL || e == NULL) {
410                 kfree(request);
411                 kfree(e);
412                 fw_send_response(card, r, RCODE_CONFLICT_ERROR);
413                 return;
414         }
415
416         request->request = r;
417         request->data    = payload;
418         request->length  = length;
419
420         spin_lock_irqsave(&client->lock, flags);
421         request->serial = client->request_serial++;
422         list_add_tail(&request->link, &client->request_list);
423         spin_unlock_irqrestore(&client->lock, flags);
424
425         e->request.type    = FW_CDEV_EVENT_REQUEST;
426         e->request.tcode   = tcode;
427         e->request.offset  = offset;
428         e->request.length  = length;
429         e->request.serial  = request->serial;
430         e->request.closure = handler->closure;
431
432         queue_event(client, &e->event,
433                     &e->request, sizeof e->request, payload, length);
434 }
435
436 static int ioctl_allocate(struct client *client, void __user *arg)
437 {
438         struct fw_cdev_allocate request;
439         struct address_handler *handler;
440         unsigned long flags;
441         struct fw_address_region region;
442
443         if (copy_from_user(&request, arg, sizeof request))
444                 return -EFAULT;
445
446         handler = kmalloc(sizeof *handler, GFP_KERNEL);
447         if (handler == NULL)
448                 return -ENOMEM;
449
450         region.start = request.offset;
451         region.end = request.offset + request.length;
452         handler->handler.length = request.length;
453         handler->handler.address_callback = handle_request;
454         handler->handler.callback_data = handler;
455         handler->closure = request.closure;
456         handler->client = client;
457
458         if (fw_core_add_address_handler(&handler->handler, &region) < 0) {
459                 kfree(handler);
460                 return -EBUSY;
461         }
462
463         spin_lock_irqsave(&client->lock, flags);
464         list_add_tail(&handler->link, &client->handler_list);
465         spin_unlock_irqrestore(&client->lock, flags);
466
467         return 0;
468 }
469
470 static int ioctl_send_response(struct client *client, void __user *arg)
471 {
472         struct fw_cdev_send_response request;
473         struct request *r;
474         unsigned long flags;
475
476         if (copy_from_user(&request, arg, sizeof request))
477                 return -EFAULT;
478
479         spin_lock_irqsave(&client->lock, flags);
480         list_for_each_entry(r, &client->request_list, link) {
481                 if (r->serial == request.serial) {
482                         list_del(&r->link);
483                         break;
484                 }
485         }
486         spin_unlock_irqrestore(&client->lock, flags);
487
488         if (&r->link == &client->request_list)
489                 return -EINVAL;
490
491         if (request.length < r->length)
492                 r->length = request.length;
493         if (copy_from_user(r->data, u64_to_uptr(request.data), r->length))
494                 return -EFAULT;
495
496         fw_send_response(client->device->card, r->request, request.rcode);
497
498         kfree(r);
499
500         return 0;
501 }
502
503 static int ioctl_initiate_bus_reset(struct client *client, void __user *arg)
504 {
505         struct fw_cdev_initiate_bus_reset request;
506         int short_reset;
507
508         if (copy_from_user(&request, arg, sizeof request))
509                 return -EFAULT;
510
511         short_reset = (request.type == FW_CDEV_SHORT_RESET);
512
513         return fw_core_initiate_bus_reset(client->device->card, short_reset);
514 }
515
516 static void
517 iso_callback(struct fw_iso_context *context, u32 cycle,
518              size_t header_length, void *header, void *data)
519 {
520         struct client *client = data;
521         struct iso_interrupt *interrupt;
522
523         interrupt = kzalloc(sizeof *interrupt + header_length, GFP_ATOMIC);
524         if (interrupt == NULL)
525                 return;
526
527         interrupt->interrupt.type      = FW_CDEV_EVENT_ISO_INTERRUPT;
528         interrupt->interrupt.closure   = 0;
529         interrupt->interrupt.cycle     = cycle;
530         interrupt->interrupt.header_length = header_length;
531         memcpy(interrupt->interrupt.header, header, header_length);
532         queue_event(client, &interrupt->event,
533                     &interrupt->interrupt,
534                     sizeof interrupt->interrupt + header_length, NULL, 0);
535 }
536
537 static int ioctl_create_iso_context(struct client *client, void __user *arg)
538 {
539         struct fw_cdev_create_iso_context request;
540
541         if (copy_from_user(&request, arg, sizeof request))
542                 return -EFAULT;
543
544         if (request.channel > 63)
545                 return -EINVAL;
546
547         switch (request.type) {
548         case FW_ISO_CONTEXT_RECEIVE:
549                 if (request.sync > 15)
550                         return -EINVAL;
551
552                 if (request.tags == 0 || request.tags > 15)
553                         return -EINVAL;
554
555                 if (request.header_size < 4 || (request.header_size & 3))
556                         return -EINVAL;
557
558                 break;
559
560         case FW_ISO_CONTEXT_TRANSMIT:
561                 if (request.speed > SCODE_3200)
562                         return -EINVAL;
563
564                 break;
565
566         default:
567                 return -EINVAL;
568         }
569
570
571         client->iso_context = fw_iso_context_create(client->device->card,
572                                                     request.type,
573                                                     request.channel,
574                                                     request.speed,
575                                                     request.sync,
576                                                     request.tags,
577                                                     request.header_size,
578                                                     iso_callback, client);
579         if (IS_ERR(client->iso_context))
580                 return PTR_ERR(client->iso_context);
581
582         return 0;
583 }
584
585 static int ioctl_queue_iso(struct client *client, void __user *arg)
586 {
587         struct fw_cdev_queue_iso request;
588         struct fw_cdev_iso_packet __user *p, *end, *next;
589         struct fw_iso_context *ctx = client->iso_context;
590         unsigned long payload, payload_end, header_length;
591         int count;
592         struct {
593                 struct fw_iso_packet packet;
594                 u8 header[256];
595         } u;
596
597         if (ctx == NULL)
598                 return -EINVAL;
599         if (copy_from_user(&request, arg, sizeof request))
600                 return -EFAULT;
601
602         /* If the user passes a non-NULL data pointer, has mmap()'ed
603          * the iso buffer, and the pointer points inside the buffer,
604          * we setup the payload pointers accordingly.  Otherwise we
605          * set them both to 0, which will still let packets with
606          * payload_length == 0 through.  In other words, if no packets
607          * use the indirect payload, the iso buffer need not be mapped
608          * and the request.data pointer is ignored.*/
609
610         payload = (unsigned long)request.data - client->vm_start;
611         payload_end = payload + (client->buffer.page_count << PAGE_SHIFT);
612         if (request.data == 0 || client->buffer.pages == NULL ||
613             payload >= payload_end) {
614                 payload = 0;
615                 payload_end = 0;
616         }
617
618         if (!access_ok(VERIFY_READ, request.packets, request.size))
619                 return -EFAULT;
620
621         p = (struct fw_cdev_iso_packet __user *)u64_to_uptr(request.packets);
622         end = (void __user *)p + request.size;
623         count = 0;
624         while (p < end) {
625                 if (__copy_from_user(&u.packet, p, sizeof *p))
626                         return -EFAULT;
627
628                 if (ctx->type == FW_ISO_CONTEXT_TRANSMIT) {
629                         header_length = u.packet.header_length;
630                 } else {
631                         /* We require that header_length is a multiple of
632                          * the fixed header size, ctx->header_size */
633                         if (ctx->header_size == 0) {
634                                 if (u.packet.header_length > 0)
635                                         return -EINVAL;
636                         } else if (u.packet.header_length % ctx->header_size != 0) {
637                                 return -EINVAL;
638                         }
639                         header_length = 0;
640                 }
641
642                 next = (struct fw_cdev_iso_packet __user *)
643                         &p->header[header_length / 4];
644                 if (next > end)
645                         return -EINVAL;
646                 if (__copy_from_user
647                     (u.packet.header, p->header, header_length))
648                         return -EFAULT;
649                 if (u.packet.skip && ctx->type == FW_ISO_CONTEXT_TRANSMIT &&
650                     u.packet.header_length + u.packet.payload_length > 0)
651                         return -EINVAL;
652                 if (payload + u.packet.payload_length > payload_end)
653                         return -EINVAL;
654
655                 if (fw_iso_context_queue(ctx, &u.packet,
656                                          &client->buffer, payload))
657                         break;
658
659                 p = next;
660                 payload += u.packet.payload_length;
661                 count++;
662         }
663
664         request.size    -= uptr_to_u64(p) - request.packets;
665         request.packets  = uptr_to_u64(p);
666         request.data     = client->vm_start + payload;
667
668         if (copy_to_user(arg, &request, sizeof request))
669                 return -EFAULT;
670
671         return count;
672 }
673
674 static int ioctl_start_iso(struct client *client, void __user *arg)
675 {
676         struct fw_cdev_start_iso request;
677
678         if (copy_from_user(&request, arg, sizeof request))
679                 return -EFAULT;
680
681         return fw_iso_context_start(client->iso_context, request.cycle);
682 }
683
684 static int ioctl_stop_iso(struct client *client, void __user *arg)
685 {
686         return fw_iso_context_stop(client->iso_context);
687 }
688
689 static int
690 dispatch_ioctl(struct client *client, unsigned int cmd, void __user *arg)
691 {
692         switch (cmd) {
693         case FW_CDEV_IOC_GET_INFO:
694                 return ioctl_get_info(client, arg);
695         case FW_CDEV_IOC_SEND_REQUEST:
696                 return ioctl_send_request(client, arg);
697         case FW_CDEV_IOC_ALLOCATE:
698                 return ioctl_allocate(client, arg);
699         case FW_CDEV_IOC_SEND_RESPONSE:
700                 return ioctl_send_response(client, arg);
701         case FW_CDEV_IOC_INITIATE_BUS_RESET:
702                 return ioctl_initiate_bus_reset(client, arg);
703         case FW_CDEV_IOC_CREATE_ISO_CONTEXT:
704                 return ioctl_create_iso_context(client, arg);
705         case FW_CDEV_IOC_QUEUE_ISO:
706                 return ioctl_queue_iso(client, arg);
707         case FW_CDEV_IOC_START_ISO:
708                 return ioctl_start_iso(client, arg);
709         case FW_CDEV_IOC_STOP_ISO:
710                 return ioctl_stop_iso(client, arg);
711         default:
712                 return -EINVAL;
713         }
714 }
715
716 static long
717 fw_device_op_ioctl(struct file *file,
718                    unsigned int cmd, unsigned long arg)
719 {
720         struct client *client = file->private_data;
721
722         return dispatch_ioctl(client, cmd, (void __user *) arg);
723 }
724
725 #ifdef CONFIG_COMPAT
726 static long
727 fw_device_op_compat_ioctl(struct file *file,
728                           unsigned int cmd, unsigned long arg)
729 {
730         struct client *client = file->private_data;
731
732         return dispatch_ioctl(client, cmd, compat_ptr(arg));
733 }
734 #endif
735
736 static int fw_device_op_mmap(struct file *file, struct vm_area_struct *vma)
737 {
738         struct client *client = file->private_data;
739         enum dma_data_direction direction;
740         unsigned long size;
741         int page_count, retval;
742
743         /* FIXME: We could support multiple buffers, but we don't. */
744         if (client->buffer.pages != NULL)
745                 return -EBUSY;
746
747         if (!(vma->vm_flags & VM_SHARED))
748                 return -EINVAL;
749
750         if (vma->vm_start & ~PAGE_MASK)
751                 return -EINVAL;
752
753         client->vm_start = vma->vm_start;
754         size = vma->vm_end - vma->vm_start;
755         page_count = size >> PAGE_SHIFT;
756         if (size & ~PAGE_MASK)
757                 return -EINVAL;
758
759         if (vma->vm_flags & VM_WRITE)
760                 direction = DMA_TO_DEVICE;
761         else
762                 direction = DMA_FROM_DEVICE;
763
764         retval = fw_iso_buffer_init(&client->buffer, client->device->card,
765                                     page_count, direction);
766         if (retval < 0)
767                 return retval;
768
769         retval = fw_iso_buffer_map(&client->buffer, vma);
770         if (retval < 0)
771                 fw_iso_buffer_destroy(&client->buffer, client->device->card);
772
773         return retval;
774 }
775
776 static int fw_device_op_release(struct inode *inode, struct file *file)
777 {
778         struct client *client = file->private_data;
779         struct address_handler *h, *next_h;
780         struct request *r, *next_r;
781         struct event *e, *next_e;
782         struct response *t, *next_t;
783         unsigned long flags;
784
785         if (client->buffer.pages)
786                 fw_iso_buffer_destroy(&client->buffer, client->device->card);
787
788         if (client->iso_context)
789                 fw_iso_context_destroy(client->iso_context);
790
791         list_for_each_entry_safe(h, next_h, &client->handler_list, link) {
792                 fw_core_remove_address_handler(&h->handler);
793                 kfree(h);
794         }
795
796         list_for_each_entry_safe(r, next_r, &client->request_list, link) {
797                 fw_send_response(client->device->card, r->request,
798                                  RCODE_CONFLICT_ERROR);
799                 kfree(r);
800         }
801
802         list_for_each_entry_safe(t, next_t, &client->transaction_list, link)
803                 fw_cancel_transaction(client->device->card, &t->transaction);
804
805         /* FIXME: We should wait for the async tasklets to stop
806          * running before freeing the memory. */
807
808         list_for_each_entry_safe(e, next_e, &client->event_list, link)
809                 kfree(e);
810
811         spin_lock_irqsave(&client->device->card->lock, flags);
812         list_del(&client->link);
813         spin_unlock_irqrestore(&client->device->card->lock, flags);
814
815         fw_device_put(client->device);
816         kfree(client);
817
818         return 0;
819 }
820
821 static unsigned int fw_device_op_poll(struct file *file, poll_table * pt)
822 {
823         struct client *client = file->private_data;
824         unsigned int mask = 0;
825
826         poll_wait(file, &client->wait, pt);
827
828         if (fw_device_is_shutdown(client->device))
829                 mask |= POLLHUP | POLLERR;
830         if (!list_empty(&client->event_list))
831                 mask |= POLLIN | POLLRDNORM;
832
833         return mask;
834 }
835
836 const struct file_operations fw_device_ops = {
837         .owner          = THIS_MODULE,
838         .open           = fw_device_op_open,
839         .read           = fw_device_op_read,
840         .unlocked_ioctl = fw_device_op_ioctl,
841         .poll           = fw_device_op_poll,
842         .release        = fw_device_op_release,
843         .mmap           = fw_device_op_mmap,
844
845 #ifdef CONFIG_COMPAT
846         .compat_ioctl   = fw_device_op_compat_ioctl,
847 #endif
848 };