]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/usb/class/cdc-wdm.c
sh: asm/gpio.h needs linux/kernel.h for might_sleep()/WARN_ON().
[linux-2.6-omap-h63xx.git] / drivers / usb / class / cdc-wdm.c
1 /*
2  * cdc-wdm.c
3  *
4  * This driver supports USB CDC WCM Device Management.
5  *
6  * Copyright (c) 2007-2008 Oliver Neukum
7  *
8  * Some code taken from cdc-acm.c
9  *
10  * Released under the GPLv2.
11  *
12  * Many thanks to Carl Nordbeck
13  */
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/slab.h>
17 #include <linux/module.h>
18 #include <linux/smp_lock.h>
19 #include <linux/mutex.h>
20 #include <linux/uaccess.h>
21 #include <linux/bitops.h>
22 #include <linux/poll.h>
23 #include <linux/usb.h>
24 #include <linux/usb/cdc.h>
25 #include <asm/byteorder.h>
26 #include <asm/unaligned.h>
27
28 /*
29  * Version Information
30  */
31 #define DRIVER_VERSION "v0.03"
32 #define DRIVER_AUTHOR "Oliver Neukum"
33 #define DRIVER_DESC "USB Abstract Control Model driver for USB WCM Device Management"
34
35 static struct usb_device_id wdm_ids[] = {
36         {
37                 .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
38                                  USB_DEVICE_ID_MATCH_INT_SUBCLASS,
39                 .bInterfaceClass = USB_CLASS_COMM,
40                 .bInterfaceSubClass = USB_CDC_SUBCLASS_DMM
41         },
42         { }
43 };
44
45 #define WDM_MINOR_BASE  176
46
47
48 #define WDM_IN_USE              1
49 #define WDM_DISCONNECTING       2
50 #define WDM_RESULT              3
51 #define WDM_READ                4
52 #define WDM_INT_STALL           5
53 #define WDM_POLL_RUNNING        6
54
55
56 #define WDM_MAX                 16
57
58
59 static DEFINE_MUTEX(wdm_mutex);
60
61 /* --- method tables --- */
62
63 struct wdm_device {
64         u8                      *inbuf; /* buffer for response */
65         u8                      *outbuf; /* buffer for command */
66         u8                      *sbuf; /* buffer for status */
67         u8                      *ubuf; /* buffer for copy to user space */
68
69         struct urb              *command;
70         struct urb              *response;
71         struct urb              *validity;
72         struct usb_interface    *intf;
73         struct usb_ctrlrequest  *orq;
74         struct usb_ctrlrequest  *irq;
75         spinlock_t              iuspin;
76
77         unsigned long           flags;
78         u16                     bufsize;
79         u16                     wMaxCommand;
80         u16                     wMaxPacketSize;
81         u16                     bMaxPacketSize0;
82         __le16                  inum;
83         int                     reslength;
84         int                     length;
85         int                     read;
86         int                     count;
87         dma_addr_t              shandle;
88         dma_addr_t              ihandle;
89         struct mutex            wlock;
90         struct mutex            rlock;
91         struct mutex            plock;
92         wait_queue_head_t       wait;
93         struct work_struct      rxwork;
94         int                     werr;
95         int                     rerr;
96 };
97
98 static struct usb_driver wdm_driver;
99
100 /* --- callbacks --- */
101 static void wdm_out_callback(struct urb *urb)
102 {
103         struct wdm_device *desc;
104         desc = urb->context;
105         spin_lock(&desc->iuspin);
106         desc->werr = urb->status;
107         spin_unlock(&desc->iuspin);
108         clear_bit(WDM_IN_USE, &desc->flags);
109         kfree(desc->outbuf);
110         wake_up(&desc->wait);
111 }
112
113 static void wdm_in_callback(struct urb *urb)
114 {
115         struct wdm_device *desc = urb->context;
116         int status = urb->status;
117
118         spin_lock(&desc->iuspin);
119
120         if (status) {
121                 switch (status) {
122                 case -ENOENT:
123                         dev_dbg(&desc->intf->dev,
124                                 "nonzero urb status received: -ENOENT");
125                         break;
126                 case -ECONNRESET:
127                         dev_dbg(&desc->intf->dev,
128                                 "nonzero urb status received: -ECONNRESET");
129                         break;
130                 case -ESHUTDOWN:
131                         dev_dbg(&desc->intf->dev,
132                                 "nonzero urb status received: -ESHUTDOWN");
133                         break;
134                 case -EPIPE:
135                         dev_err(&desc->intf->dev,
136                                 "nonzero urb status received: -EPIPE\n");
137                         break;
138                 default:
139                         dev_err(&desc->intf->dev,
140                                 "Unexpected error %d\n", status);
141                         break;
142                 }
143         }
144
145         desc->rerr = status;
146         desc->reslength = urb->actual_length;
147         memmove(desc->ubuf + desc->length, desc->inbuf, desc->reslength);
148         desc->length += desc->reslength;
149         wake_up(&desc->wait);
150
151         set_bit(WDM_READ, &desc->flags);
152         spin_unlock(&desc->iuspin);
153 }
154
155 static void wdm_int_callback(struct urb *urb)
156 {
157         int rv = 0;
158         int status = urb->status;
159         struct wdm_device *desc;
160         struct usb_ctrlrequest *req;
161         struct usb_cdc_notification *dr;
162
163         desc = urb->context;
164         req = desc->irq;
165         dr = (struct usb_cdc_notification *)desc->sbuf;
166
167         if (status) {
168                 switch (status) {
169                 case -ESHUTDOWN:
170                 case -ENOENT:
171                 case -ECONNRESET:
172                         return; /* unplug */
173                 case -EPIPE:
174                         set_bit(WDM_INT_STALL, &desc->flags);
175                         dev_err(&desc->intf->dev, "Stall on int endpoint\n");
176                         goto sw; /* halt is cleared in work */
177                 default:
178                         dev_err(&desc->intf->dev,
179                                 "nonzero urb status received: %d\n", status);
180                         break;
181                 }
182         }
183
184         if (urb->actual_length < sizeof(struct usb_cdc_notification)) {
185                 dev_err(&desc->intf->dev, "wdm_int_callback - %d bytes\n",
186                         urb->actual_length);
187                 goto exit;
188         }
189
190         switch (dr->bNotificationType) {
191         case USB_CDC_NOTIFY_RESPONSE_AVAILABLE:
192                 dev_dbg(&desc->intf->dev,
193                         "NOTIFY_RESPONSE_AVAILABLE received: index %d len %d",
194                         dr->wIndex, dr->wLength);
195                 break;
196
197         case USB_CDC_NOTIFY_NETWORK_CONNECTION:
198
199                 dev_dbg(&desc->intf->dev,
200                         "NOTIFY_NETWORK_CONNECTION %s network",
201                         dr->wValue ? "connected to" : "disconnected from");
202                 goto exit;
203         default:
204                 clear_bit(WDM_POLL_RUNNING, &desc->flags);
205                 dev_err(&desc->intf->dev,
206                         "unknown notification %d received: index %d len %d\n",
207                         dr->bNotificationType, dr->wIndex, dr->wLength);
208                 goto exit;
209         }
210
211         req->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
212         req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
213         req->wValue = 0;
214         req->wIndex = desc->inum;
215         req->wLength = cpu_to_le16(desc->wMaxCommand);
216
217         usb_fill_control_urb(
218                 desc->response,
219                 interface_to_usbdev(desc->intf),
220                 /* using common endpoint 0 */
221                 usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
222                 (unsigned char *)req,
223                 desc->inbuf,
224                 desc->wMaxCommand,
225                 wdm_in_callback,
226                 desc
227         );
228         desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
229         spin_lock(&desc->iuspin);
230         clear_bit(WDM_READ, &desc->flags);
231         if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
232                 rv = usb_submit_urb(desc->response, GFP_ATOMIC);
233                 dev_dbg(&desc->intf->dev, "%s: usb_submit_urb %d",
234                         __func__, rv);
235         }
236         spin_unlock(&desc->iuspin);
237         if (rv < 0) {
238                 if (rv == -EPERM)
239                         return;
240                 if (rv == -ENOMEM) {
241 sw:
242                         rv = schedule_work(&desc->rxwork);
243                         if (rv)
244                                 dev_err(&desc->intf->dev,
245                                         "Cannot schedule work\n");
246                 }
247         }
248 exit:
249         rv = usb_submit_urb(urb, GFP_ATOMIC);
250         if (rv)
251                 dev_err(&desc->intf->dev,
252                         "%s - usb_submit_urb failed with result %d\n",
253                         __func__, rv);
254
255 }
256
257 static void kill_urbs(struct wdm_device *desc)
258 {
259         /* the order here is essential */
260         usb_kill_urb(desc->command);
261         usb_kill_urb(desc->validity);
262         usb_kill_urb(desc->response);
263 }
264
265 static void free_urbs(struct wdm_device *desc)
266 {
267         usb_free_urb(desc->validity);
268         usb_free_urb(desc->response);
269         usb_free_urb(desc->command);
270 }
271
272 static void cleanup(struct wdm_device *desc)
273 {
274         usb_buffer_free(interface_to_usbdev(desc->intf),
275                         desc->wMaxPacketSize,
276                         desc->sbuf,
277                         desc->validity->transfer_dma);
278         usb_buffer_free(interface_to_usbdev(desc->intf),
279                         desc->wMaxCommand,
280                         desc->inbuf,
281                         desc->response->transfer_dma);
282         kfree(desc->orq);
283         kfree(desc->irq);
284         kfree(desc->ubuf);
285         free_urbs(desc);
286         kfree(desc);
287 }
288
289 static ssize_t wdm_write
290 (struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
291 {
292         u8 *buf;
293         int rv = -EMSGSIZE, r, we;
294         struct wdm_device *desc = file->private_data;
295         struct usb_ctrlrequest *req;
296
297         if (count > desc->wMaxCommand)
298                 count = desc->wMaxCommand;
299
300         spin_lock_irq(&desc->iuspin);
301         we = desc->werr;
302         desc->werr = 0;
303         spin_unlock_irq(&desc->iuspin);
304         if (we < 0)
305                 return -EIO;
306
307         r = mutex_lock_interruptible(&desc->wlock); /* concurrent writes */
308         rv = -ERESTARTSYS;
309         if (r)
310                 goto outnl;
311
312         r = usb_autopm_get_interface(desc->intf);
313         if (r < 0)
314                 goto outnp;
315         r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE,
316                                                            &desc->flags));
317         if (r < 0)
318                 goto out;
319
320         if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
321                 rv = -ENODEV;
322                 goto out;
323         }
324
325         desc->outbuf = buf = kmalloc(count, GFP_KERNEL);
326         if (!buf) {
327                 rv = -ENOMEM;
328                 goto out;
329         }
330
331         r = copy_from_user(buf, buffer, count);
332         if (r > 0) {
333                 kfree(buf);
334                 rv = -EFAULT;
335                 goto out;
336         }
337
338         req = desc->orq;
339         usb_fill_control_urb(
340                 desc->command,
341                 interface_to_usbdev(desc->intf),
342                 /* using common endpoint 0 */
343                 usb_sndctrlpipe(interface_to_usbdev(desc->intf), 0),
344                 (unsigned char *)req,
345                 buf,
346                 count,
347                 wdm_out_callback,
348                 desc
349         );
350
351         req->bRequestType = (USB_DIR_OUT | USB_TYPE_CLASS |
352                              USB_RECIP_INTERFACE);
353         req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
354         req->wValue = 0;
355         req->wIndex = desc->inum;
356         req->wLength = cpu_to_le16(count);
357         set_bit(WDM_IN_USE, &desc->flags);
358
359         rv = usb_submit_urb(desc->command, GFP_KERNEL);
360         if (rv < 0) {
361                 kfree(buf);
362                 clear_bit(WDM_IN_USE, &desc->flags);
363                 dev_err(&desc->intf->dev, "Tx URB error: %d\n", rv);
364         } else {
365                 dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
366                         req->wIndex);
367         }
368 out:
369         usb_autopm_put_interface(desc->intf);
370 outnp:
371         mutex_unlock(&desc->wlock);
372 outnl:
373         return rv < 0 ? rv : count;
374 }
375
376 static ssize_t wdm_read
377 (struct file *file, char __user *buffer, size_t count, loff_t *ppos)
378 {
379         int rv, cntr;
380         int i = 0;
381         struct wdm_device *desc = file->private_data;
382
383
384         rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */
385         if (rv < 0)
386                 return -ERESTARTSYS;
387
388         if (desc->length == 0) {
389                 desc->read = 0;
390 retry:
391                 i++;
392                 rv = wait_event_interruptible(desc->wait,
393                                               test_bit(WDM_READ, &desc->flags));
394
395                 if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
396                         rv = -ENODEV;
397                         goto err;
398                 }
399                 usb_mark_last_busy(interface_to_usbdev(desc->intf));
400                 if (rv < 0) {
401                         rv = -ERESTARTSYS;
402                         goto err;
403                 }
404
405                 spin_lock_irq(&desc->iuspin);
406
407                 if (desc->rerr) { /* read completed, error happened */
408                         int t = desc->rerr;
409                         desc->rerr = 0;
410                         spin_unlock_irq(&desc->iuspin);
411                         dev_err(&desc->intf->dev,
412                                 "reading had resulted in %d\n", t);
413                         rv = -EIO;
414                         goto err;
415                 }
416                 /*
417                  * recheck whether we've lost the race
418                  * against the completion handler
419                  */
420                 if (!test_bit(WDM_READ, &desc->flags)) { /* lost race */
421                         spin_unlock_irq(&desc->iuspin);
422                         goto retry;
423                 }
424                 if (!desc->reslength) { /* zero length read */
425                         spin_unlock_irq(&desc->iuspin);
426                         goto retry;
427                 }
428                 clear_bit(WDM_READ, &desc->flags);
429                 spin_unlock_irq(&desc->iuspin);
430         }
431
432         cntr = count > desc->length ? desc->length : count;
433         rv = copy_to_user(buffer, desc->ubuf, cntr);
434         if (rv > 0) {
435                 rv = -EFAULT;
436                 goto err;
437         }
438
439         for (i = 0; i < desc->length - cntr; i++)
440                 desc->ubuf[i] = desc->ubuf[i + cntr];
441
442         desc->length -= cntr;
443         /* in case we had outstanding data */
444         if (!desc->length)
445                 clear_bit(WDM_READ, &desc->flags);
446         rv = cntr;
447
448 err:
449         mutex_unlock(&desc->rlock);
450         if (rv < 0)
451                 dev_err(&desc->intf->dev, "wdm_read: exit error\n");
452         return rv;
453 }
454
455 static int wdm_flush(struct file *file, fl_owner_t id)
456 {
457         struct wdm_device *desc = file->private_data;
458
459         wait_event(desc->wait, !test_bit(WDM_IN_USE, &desc->flags));
460         if (desc->werr < 0)
461                 dev_err(&desc->intf->dev, "Error in flush path: %d\n",
462                         desc->werr);
463
464         return desc->werr;
465 }
466
467 static unsigned int wdm_poll(struct file *file, struct poll_table_struct *wait)
468 {
469         struct wdm_device *desc = file->private_data;
470         unsigned long flags;
471         unsigned int mask = 0;
472
473         spin_lock_irqsave(&desc->iuspin, flags);
474         if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
475                 mask = POLLERR;
476                 spin_unlock_irqrestore(&desc->iuspin, flags);
477                 goto desc_out;
478         }
479         if (test_bit(WDM_READ, &desc->flags))
480                 mask = POLLIN | POLLRDNORM;
481         if (desc->rerr || desc->werr)
482                 mask |= POLLERR;
483         if (!test_bit(WDM_IN_USE, &desc->flags))
484                 mask |= POLLOUT | POLLWRNORM;
485         spin_unlock_irqrestore(&desc->iuspin, flags);
486
487         poll_wait(file, &desc->wait, wait);
488
489 desc_out:
490         return mask;
491 }
492
493 static int wdm_open(struct inode *inode, struct file *file)
494 {
495         int minor = iminor(inode);
496         int rv = -ENODEV;
497         struct usb_interface *intf;
498         struct wdm_device *desc;
499
500         mutex_lock(&wdm_mutex);
501         intf = usb_find_interface(&wdm_driver, minor);
502         if (!intf)
503                 goto out;
504
505         desc = usb_get_intfdata(intf);
506         if (test_bit(WDM_DISCONNECTING, &desc->flags))
507                 goto out;
508
509         ;
510         file->private_data = desc;
511
512         rv = usb_autopm_get_interface(desc->intf);
513         if (rv < 0) {
514                 dev_err(&desc->intf->dev, "Error autopm - %d\n", rv);
515                 goto out;
516         }
517         intf->needs_remote_wakeup = 1;
518
519         mutex_lock(&desc->plock);
520         if (!desc->count++) {
521                 rv = usb_submit_urb(desc->validity, GFP_KERNEL);
522                 if (rv < 0) {
523                         desc->count--;
524                         dev_err(&desc->intf->dev,
525                                 "Error submitting int urb - %d\n", rv);
526                 }
527         } else {
528                 rv = 0;
529         }
530         mutex_unlock(&desc->plock);
531         usb_autopm_put_interface(desc->intf);
532 out:
533         mutex_unlock(&wdm_mutex);
534         return rv;
535 }
536
537 static int wdm_release(struct inode *inode, struct file *file)
538 {
539         struct wdm_device *desc = file->private_data;
540
541         mutex_lock(&wdm_mutex);
542         mutex_lock(&desc->plock);
543         desc->count--;
544         mutex_unlock(&desc->plock);
545
546         if (!desc->count) {
547                 dev_dbg(&desc->intf->dev, "wdm_release: cleanup");
548                 kill_urbs(desc);
549                 if (!test_bit(WDM_DISCONNECTING, &desc->flags))
550                         desc->intf->needs_remote_wakeup = 0;
551         }
552         mutex_unlock(&wdm_mutex);
553         return 0;
554 }
555
556 static const struct file_operations wdm_fops = {
557         .owner =        THIS_MODULE,
558         .read =         wdm_read,
559         .write =        wdm_write,
560         .open =         wdm_open,
561         .flush =        wdm_flush,
562         .release =      wdm_release,
563         .poll =         wdm_poll
564 };
565
566 static struct usb_class_driver wdm_class = {
567         .name =         "cdc-wdm%d",
568         .fops =         &wdm_fops,
569         .minor_base =   WDM_MINOR_BASE,
570 };
571
572 /* --- error handling --- */
573 static void wdm_rxwork(struct work_struct *work)
574 {
575         struct wdm_device *desc = container_of(work, struct wdm_device, rxwork);
576         unsigned long flags;
577         int rv;
578
579         spin_lock_irqsave(&desc->iuspin, flags);
580         if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
581                 spin_unlock_irqrestore(&desc->iuspin, flags);
582         } else {
583                 spin_unlock_irqrestore(&desc->iuspin, flags);
584                 rv = usb_submit_urb(desc->response, GFP_KERNEL);
585                 if (rv < 0 && rv != -EPERM) {
586                         spin_lock_irqsave(&desc->iuspin, flags);
587                         if (!test_bit(WDM_DISCONNECTING, &desc->flags))
588                                 schedule_work(&desc->rxwork);
589                         spin_unlock_irqrestore(&desc->iuspin, flags);
590                 }
591         }
592 }
593
594 /* --- hotplug --- */
595
596 static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
597 {
598         int rv = -EINVAL;
599         struct usb_device *udev = interface_to_usbdev(intf);
600         struct wdm_device *desc;
601         struct usb_host_interface *iface;
602         struct usb_endpoint_descriptor *ep;
603         struct usb_cdc_dmm_desc *dmhd;
604         u8 *buffer = intf->altsetting->extra;
605         int buflen = intf->altsetting->extralen;
606         u16 maxcom = 0;
607
608         if (!buffer)
609                 goto out;
610
611         while (buflen > 0) {
612                 if (buffer [1] != USB_DT_CS_INTERFACE) {
613                         dev_err(&intf->dev, "skipping garbage\n");
614                         goto next_desc;
615                 }
616
617                 switch (buffer [2]) {
618                 case USB_CDC_HEADER_TYPE:
619                         break;
620                 case USB_CDC_DMM_TYPE:
621                         dmhd = (struct usb_cdc_dmm_desc *)buffer;
622                         maxcom = le16_to_cpu(dmhd->wMaxCommand);
623                         dev_dbg(&intf->dev,
624                                 "Finding maximum buffer length: %d", maxcom);
625                         break;
626                 default:
627                         dev_err(&intf->dev,
628                                 "Ignoring extra header, type %d, length %d\n",
629                                 buffer[2], buffer[0]);
630                         break;
631                 }
632 next_desc:
633                 buflen -= buffer[0];
634                 buffer += buffer[0];
635         }
636
637         rv = -ENOMEM;
638         desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL);
639         if (!desc)
640                 goto out;
641         mutex_init(&desc->wlock);
642         mutex_init(&desc->rlock);
643         mutex_init(&desc->plock);
644         spin_lock_init(&desc->iuspin);
645         init_waitqueue_head(&desc->wait);
646         desc->wMaxCommand = maxcom;
647         desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber);
648         desc->intf = intf;
649         INIT_WORK(&desc->rxwork, wdm_rxwork);
650
651         iface = &intf->altsetting[0];
652         ep = &iface->endpoint[0].desc;
653         if (!usb_endpoint_is_int_in(ep)) {
654                 rv = -EINVAL;
655                 goto err;
656         }
657
658         desc->wMaxPacketSize = le16_to_cpu(ep->wMaxPacketSize);
659         desc->bMaxPacketSize0 = udev->descriptor.bMaxPacketSize0;
660
661         desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
662         if (!desc->orq)
663                 goto err;
664         desc->irq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
665         if (!desc->irq)
666                 goto err;
667
668         desc->validity = usb_alloc_urb(0, GFP_KERNEL);
669         if (!desc->validity)
670                 goto err;
671
672         desc->response = usb_alloc_urb(0, GFP_KERNEL);
673         if (!desc->response)
674                 goto err;
675
676         desc->command = usb_alloc_urb(0, GFP_KERNEL);
677         if (!desc->command)
678                 goto err;
679
680         desc->ubuf = kmalloc(desc->wMaxCommand, GFP_KERNEL);
681         if (!desc->ubuf)
682                 goto err;
683
684         desc->sbuf = usb_buffer_alloc(interface_to_usbdev(intf),
685                                         desc->wMaxPacketSize,
686                                         GFP_KERNEL,
687                                         &desc->validity->transfer_dma);
688         if (!desc->sbuf)
689                 goto err;
690
691         desc->inbuf = usb_buffer_alloc(interface_to_usbdev(intf),
692                                         desc->bMaxPacketSize0,
693                                         GFP_KERNEL,
694                                         &desc->response->transfer_dma);
695         if (!desc->inbuf)
696                 goto err2;
697
698         usb_fill_int_urb(
699                 desc->validity,
700                 interface_to_usbdev(intf),
701                 usb_rcvintpipe(interface_to_usbdev(intf), ep->bEndpointAddress),
702                 desc->sbuf,
703                 desc->wMaxPacketSize,
704                 wdm_int_callback,
705                 desc,
706                 ep->bInterval
707         );
708         desc->validity->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
709
710         usb_set_intfdata(intf, desc);
711         rv = usb_register_dev(intf, &wdm_class);
712         dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n",
713                  intf->minor - WDM_MINOR_BASE);
714         if (rv < 0)
715                 goto err;
716 out:
717         return rv;
718 err2:
719         usb_buffer_free(interface_to_usbdev(desc->intf),
720                         desc->wMaxPacketSize,
721                         desc->sbuf,
722                         desc->validity->transfer_dma);
723 err:
724         free_urbs(desc);
725         kfree(desc->ubuf);
726         kfree(desc->orq);
727         kfree(desc->irq);
728         kfree(desc);
729         return rv;
730 }
731
732 static void wdm_disconnect(struct usb_interface *intf)
733 {
734         struct wdm_device *desc;
735         unsigned long flags;
736
737         usb_deregister_dev(intf, &wdm_class);
738         mutex_lock(&wdm_mutex);
739         desc = usb_get_intfdata(intf);
740
741         /* the spinlock makes sure no new urbs are generated in the callbacks */
742         spin_lock_irqsave(&desc->iuspin, flags);
743         set_bit(WDM_DISCONNECTING, &desc->flags);
744         set_bit(WDM_READ, &desc->flags);
745         /* to terminate pending flushes */
746         clear_bit(WDM_IN_USE, &desc->flags);
747         spin_unlock_irqrestore(&desc->iuspin, flags);
748         cancel_work_sync(&desc->rxwork);
749         kill_urbs(desc);
750         wake_up_all(&desc->wait);
751         if (!desc->count)
752                 cleanup(desc);
753         mutex_unlock(&wdm_mutex);
754 }
755
756 static int wdm_suspend(struct usb_interface *intf, pm_message_t message)
757 {
758         struct wdm_device *desc = usb_get_intfdata(intf);
759         int rv = 0;
760
761         dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor);
762
763         mutex_lock(&desc->plock);
764 #ifdef CONFIG_PM
765         if (interface_to_usbdev(desc->intf)->auto_pm && test_bit(WDM_IN_USE, &desc->flags)) {
766                 rv = -EBUSY;
767         } else {
768 #endif
769                 cancel_work_sync(&desc->rxwork);
770                 kill_urbs(desc);
771 #ifdef CONFIG_PM
772         }
773 #endif
774         mutex_unlock(&desc->plock);
775
776         return rv;
777 }
778
779 static int recover_from_urb_loss(struct wdm_device *desc)
780 {
781         int rv = 0;
782
783         if (desc->count) {
784                 rv = usb_submit_urb(desc->validity, GFP_NOIO);
785                 if (rv < 0)
786                         dev_err(&desc->intf->dev,
787                                 "Error resume submitting int urb - %d\n", rv);
788         }
789         return rv;
790 }
791 static int wdm_resume(struct usb_interface *intf)
792 {
793         struct wdm_device *desc = usb_get_intfdata(intf);
794         int rv;
795
796         dev_dbg(&desc->intf->dev, "wdm%d_resume\n", intf->minor);
797         mutex_lock(&desc->plock);
798         rv = recover_from_urb_loss(desc);
799         mutex_unlock(&desc->plock);
800         return rv;
801 }
802
803 static int wdm_pre_reset(struct usb_interface *intf)
804 {
805         struct wdm_device *desc = usb_get_intfdata(intf);
806
807         mutex_lock(&desc->plock);
808         return 0;
809 }
810
811 static int wdm_post_reset(struct usb_interface *intf)
812 {
813         struct wdm_device *desc = usb_get_intfdata(intf);
814         int rv;
815
816         rv = recover_from_urb_loss(desc);
817         mutex_unlock(&desc->plock);
818         return 0;
819 }
820
821 static struct usb_driver wdm_driver = {
822         .name =         "cdc_wdm",
823         .probe =        wdm_probe,
824         .disconnect =   wdm_disconnect,
825         .suspend =      wdm_suspend,
826         .resume =       wdm_resume,
827         .reset_resume = wdm_resume,
828         .pre_reset =    wdm_pre_reset,
829         .post_reset =   wdm_post_reset,
830         .id_table =     wdm_ids,
831         .supports_autosuspend = 1,
832 };
833
834 /* --- low level module stuff --- */
835
836 static int __init wdm_init(void)
837 {
838         int rv;
839
840         rv = usb_register(&wdm_driver);
841
842         return rv;
843 }
844
845 static void __exit wdm_exit(void)
846 {
847         usb_deregister(&wdm_driver);
848 }
849
850 module_init(wdm_init);
851 module_exit(wdm_exit);
852
853 MODULE_AUTHOR(DRIVER_AUTHOR);
854 MODULE_DESCRIPTION(DRIVER_DESC);
855 MODULE_LICENSE("GPL");