]> Pileus Git - ~andy/linux/blob - drivers/usb/class/cdc-wdm.c
smpboot: Remove leftover declaration
[~andy/linux] / 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-2009 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/mutex.h>
19 #include <linux/uaccess.h>
20 #include <linux/bitops.h>
21 #include <linux/poll.h>
22 #include <linux/usb.h>
23 #include <linux/usb/cdc.h>
24 #include <asm/byteorder.h>
25 #include <asm/unaligned.h>
26 #include <linux/usb/cdc-wdm.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 #define HUAWEI_VENDOR_ID        0x12D1
36
37 static const struct usb_device_id wdm_ids[] = {
38         {
39                 .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
40                                  USB_DEVICE_ID_MATCH_INT_SUBCLASS,
41                 .bInterfaceClass = USB_CLASS_COMM,
42                 .bInterfaceSubClass = USB_CDC_SUBCLASS_DMM
43         },
44         {
45                 /* 
46                  * Huawei E392, E398 and possibly other Qualcomm based modems
47                  * embed the Qualcomm QMI protocol inside CDC on CDC ECM like
48                  * control interfaces.  Userspace access to this is required
49                  * to configure the accompanying data interface
50                  */
51                 .match_flags        = USB_DEVICE_ID_MATCH_VENDOR |
52                                         USB_DEVICE_ID_MATCH_INT_INFO,
53                 .idVendor           = HUAWEI_VENDOR_ID,
54                 .bInterfaceClass    = USB_CLASS_VENDOR_SPEC,
55                 .bInterfaceSubClass = 1,
56                 .bInterfaceProtocol = 9, /* NOTE: CDC ECM control interface! */
57         },
58         { }
59 };
60
61 MODULE_DEVICE_TABLE (usb, wdm_ids);
62
63 #define WDM_MINOR_BASE  176
64
65
66 #define WDM_IN_USE              1
67 #define WDM_DISCONNECTING       2
68 #define WDM_RESULT              3
69 #define WDM_READ                4
70 #define WDM_INT_STALL           5
71 #define WDM_POLL_RUNNING        6
72 #define WDM_RESPONDING          7
73 #define WDM_SUSPENDING          8
74 #define WDM_RESETTING           9
75
76 #define WDM_MAX                 16
77
78 /* CDC-WMC r1.1 requires wMaxCommand to be "at least 256 decimal (0x100)" */
79 #define WDM_DEFAULT_BUFSIZE     256
80
81 static DEFINE_MUTEX(wdm_mutex);
82 static DEFINE_SPINLOCK(wdm_device_list_lock);
83 static LIST_HEAD(wdm_device_list);
84
85 /* --- method tables --- */
86
87 struct wdm_device {
88         u8                      *inbuf; /* buffer for response */
89         u8                      *outbuf; /* buffer for command */
90         u8                      *sbuf; /* buffer for status */
91         u8                      *ubuf; /* buffer for copy to user space */
92
93         struct urb              *command;
94         struct urb              *response;
95         struct urb              *validity;
96         struct usb_interface    *intf;
97         struct usb_ctrlrequest  *orq;
98         struct usb_ctrlrequest  *irq;
99         spinlock_t              iuspin;
100
101         unsigned long           flags;
102         u16                     bufsize;
103         u16                     wMaxCommand;
104         u16                     wMaxPacketSize;
105         __le16                  inum;
106         int                     reslength;
107         int                     length;
108         int                     read;
109         int                     count;
110         dma_addr_t              shandle;
111         dma_addr_t              ihandle;
112         struct mutex            wlock;
113         struct mutex            rlock;
114         wait_queue_head_t       wait;
115         struct work_struct      rxwork;
116         int                     werr;
117         int                     rerr;
118
119         struct list_head        device_list;
120         int                     (*manage_power)(struct usb_interface *, int);
121 };
122
123 static struct usb_driver wdm_driver;
124
125 /* return intfdata if we own the interface, else look up intf in the list */
126 static struct wdm_device *wdm_find_device(struct usb_interface *intf)
127 {
128         struct wdm_device *desc = NULL;
129
130         spin_lock(&wdm_device_list_lock);
131         list_for_each_entry(desc, &wdm_device_list, device_list)
132                 if (desc->intf == intf)
133                         break;
134         spin_unlock(&wdm_device_list_lock);
135
136         return desc;
137 }
138
139 static struct wdm_device *wdm_find_device_by_minor(int minor)
140 {
141         struct wdm_device *desc = NULL;
142
143         spin_lock(&wdm_device_list_lock);
144         list_for_each_entry(desc, &wdm_device_list, device_list)
145                 if (desc->intf->minor == minor)
146                         break;
147         spin_unlock(&wdm_device_list_lock);
148
149         return desc;
150 }
151
152 /* --- callbacks --- */
153 static void wdm_out_callback(struct urb *urb)
154 {
155         struct wdm_device *desc;
156         desc = urb->context;
157         spin_lock(&desc->iuspin);
158         desc->werr = urb->status;
159         spin_unlock(&desc->iuspin);
160         kfree(desc->outbuf);
161         desc->outbuf = NULL;
162         clear_bit(WDM_IN_USE, &desc->flags);
163         wake_up(&desc->wait);
164 }
165
166 static void wdm_in_callback(struct urb *urb)
167 {
168         struct wdm_device *desc = urb->context;
169         int status = urb->status;
170
171         spin_lock(&desc->iuspin);
172         clear_bit(WDM_RESPONDING, &desc->flags);
173
174         if (status) {
175                 switch (status) {
176                 case -ENOENT:
177                         dev_dbg(&desc->intf->dev,
178                                 "nonzero urb status received: -ENOENT");
179                         goto skip_error;
180                 case -ECONNRESET:
181                         dev_dbg(&desc->intf->dev,
182                                 "nonzero urb status received: -ECONNRESET");
183                         goto skip_error;
184                 case -ESHUTDOWN:
185                         dev_dbg(&desc->intf->dev,
186                                 "nonzero urb status received: -ESHUTDOWN");
187                         goto skip_error;
188                 case -EPIPE:
189                         dev_err(&desc->intf->dev,
190                                 "nonzero urb status received: -EPIPE\n");
191                         break;
192                 default:
193                         dev_err(&desc->intf->dev,
194                                 "Unexpected error %d\n", status);
195                         break;
196                 }
197         }
198
199         desc->rerr = status;
200         desc->reslength = urb->actual_length;
201         memmove(desc->ubuf + desc->length, desc->inbuf, desc->reslength);
202         desc->length += desc->reslength;
203 skip_error:
204         wake_up(&desc->wait);
205
206         set_bit(WDM_READ, &desc->flags);
207         spin_unlock(&desc->iuspin);
208 }
209
210 static void wdm_int_callback(struct urb *urb)
211 {
212         int rv = 0;
213         int status = urb->status;
214         struct wdm_device *desc;
215         struct usb_cdc_notification *dr;
216
217         desc = urb->context;
218         dr = (struct usb_cdc_notification *)desc->sbuf;
219
220         if (status) {
221                 switch (status) {
222                 case -ESHUTDOWN:
223                 case -ENOENT:
224                 case -ECONNRESET:
225                         return; /* unplug */
226                 case -EPIPE:
227                         set_bit(WDM_INT_STALL, &desc->flags);
228                         dev_err(&desc->intf->dev, "Stall on int endpoint\n");
229                         goto sw; /* halt is cleared in work */
230                 default:
231                         dev_err(&desc->intf->dev,
232                                 "nonzero urb status received: %d\n", status);
233                         break;
234                 }
235         }
236
237         if (urb->actual_length < sizeof(struct usb_cdc_notification)) {
238                 dev_err(&desc->intf->dev, "wdm_int_callback - %d bytes\n",
239                         urb->actual_length);
240                 goto exit;
241         }
242
243         switch (dr->bNotificationType) {
244         case USB_CDC_NOTIFY_RESPONSE_AVAILABLE:
245                 dev_dbg(&desc->intf->dev,
246                         "NOTIFY_RESPONSE_AVAILABLE received: index %d len %d",
247                         dr->wIndex, dr->wLength);
248                 break;
249
250         case USB_CDC_NOTIFY_NETWORK_CONNECTION:
251
252                 dev_dbg(&desc->intf->dev,
253                         "NOTIFY_NETWORK_CONNECTION %s network",
254                         dr->wValue ? "connected to" : "disconnected from");
255                 goto exit;
256         default:
257                 clear_bit(WDM_POLL_RUNNING, &desc->flags);
258                 dev_err(&desc->intf->dev,
259                         "unknown notification %d received: index %d len %d\n",
260                         dr->bNotificationType, dr->wIndex, dr->wLength);
261                 goto exit;
262         }
263
264         spin_lock(&desc->iuspin);
265         clear_bit(WDM_READ, &desc->flags);
266         set_bit(WDM_RESPONDING, &desc->flags);
267         if (!test_bit(WDM_DISCONNECTING, &desc->flags)
268                 && !test_bit(WDM_SUSPENDING, &desc->flags)) {
269                 rv = usb_submit_urb(desc->response, GFP_ATOMIC);
270                 dev_dbg(&desc->intf->dev, "%s: usb_submit_urb %d",
271                         __func__, rv);
272         }
273         spin_unlock(&desc->iuspin);
274         if (rv < 0) {
275                 clear_bit(WDM_RESPONDING, &desc->flags);
276                 if (rv == -EPERM)
277                         return;
278                 if (rv == -ENOMEM) {
279 sw:
280                         rv = schedule_work(&desc->rxwork);
281                         if (rv)
282                                 dev_err(&desc->intf->dev,
283                                         "Cannot schedule work\n");
284                 }
285         }
286 exit:
287         rv = usb_submit_urb(urb, GFP_ATOMIC);
288         if (rv)
289                 dev_err(&desc->intf->dev,
290                         "%s - usb_submit_urb failed with result %d\n",
291                         __func__, rv);
292
293 }
294
295 static void kill_urbs(struct wdm_device *desc)
296 {
297         /* the order here is essential */
298         usb_kill_urb(desc->command);
299         usb_kill_urb(desc->validity);
300         usb_kill_urb(desc->response);
301 }
302
303 static void free_urbs(struct wdm_device *desc)
304 {
305         usb_free_urb(desc->validity);
306         usb_free_urb(desc->response);
307         usb_free_urb(desc->command);
308 }
309
310 static void cleanup(struct wdm_device *desc)
311 {
312         kfree(desc->sbuf);
313         kfree(desc->inbuf);
314         kfree(desc->orq);
315         kfree(desc->irq);
316         kfree(desc->ubuf);
317         free_urbs(desc);
318         kfree(desc);
319 }
320
321 static ssize_t wdm_write
322 (struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
323 {
324         u8 *buf;
325         int rv = -EMSGSIZE, r, we;
326         struct wdm_device *desc = file->private_data;
327         struct usb_ctrlrequest *req;
328
329         if (count > desc->wMaxCommand)
330                 count = desc->wMaxCommand;
331
332         spin_lock_irq(&desc->iuspin);
333         we = desc->werr;
334         desc->werr = 0;
335         spin_unlock_irq(&desc->iuspin);
336         if (we < 0)
337                 return -EIO;
338
339         buf = kmalloc(count, GFP_KERNEL);
340         if (!buf) {
341                 rv = -ENOMEM;
342                 goto outnl;
343         }
344
345         r = copy_from_user(buf, buffer, count);
346         if (r > 0) {
347                 kfree(buf);
348                 rv = -EFAULT;
349                 goto outnl;
350         }
351
352         /* concurrent writes and disconnect */
353         r = mutex_lock_interruptible(&desc->wlock);
354         rv = -ERESTARTSYS;
355         if (r) {
356                 kfree(buf);
357                 goto outnl;
358         }
359
360         if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
361                 kfree(buf);
362                 rv = -ENODEV;
363                 goto outnp;
364         }
365
366         r = usb_autopm_get_interface(desc->intf);
367         if (r < 0) {
368                 kfree(buf);
369                 rv = usb_translate_errors(r);
370                 goto outnp;
371         }
372
373         if (!(file->f_flags & O_NONBLOCK))
374                 r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE,
375                                                                 &desc->flags));
376         else
377                 if (test_bit(WDM_IN_USE, &desc->flags))
378                         r = -EAGAIN;
379
380         if (test_bit(WDM_RESETTING, &desc->flags))
381                 r = -EIO;
382
383         if (r < 0) {
384                 kfree(buf);
385                 rv = r;
386                 goto out;
387         }
388
389         req = desc->orq;
390         usb_fill_control_urb(
391                 desc->command,
392                 interface_to_usbdev(desc->intf),
393                 /* using common endpoint 0 */
394                 usb_sndctrlpipe(interface_to_usbdev(desc->intf), 0),
395                 (unsigned char *)req,
396                 buf,
397                 count,
398                 wdm_out_callback,
399                 desc
400         );
401
402         req->bRequestType = (USB_DIR_OUT | USB_TYPE_CLASS |
403                              USB_RECIP_INTERFACE);
404         req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
405         req->wValue = 0;
406         req->wIndex = desc->inum;
407         req->wLength = cpu_to_le16(count);
408         set_bit(WDM_IN_USE, &desc->flags);
409         desc->outbuf = buf;
410
411         rv = usb_submit_urb(desc->command, GFP_KERNEL);
412         if (rv < 0) {
413                 kfree(buf);
414                 desc->outbuf = NULL;
415                 clear_bit(WDM_IN_USE, &desc->flags);
416                 dev_err(&desc->intf->dev, "Tx URB error: %d\n", rv);
417                 rv = usb_translate_errors(rv);
418         } else {
419                 dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
420                         req->wIndex);
421         }
422 out:
423         usb_autopm_put_interface(desc->intf);
424 outnp:
425         mutex_unlock(&desc->wlock);
426 outnl:
427         return rv < 0 ? rv : count;
428 }
429
430 static ssize_t wdm_read
431 (struct file *file, char __user *buffer, size_t count, loff_t *ppos)
432 {
433         int rv, cntr;
434         int i = 0;
435         struct wdm_device *desc = file->private_data;
436
437
438         rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */
439         if (rv < 0)
440                 return -ERESTARTSYS;
441
442         cntr = ACCESS_ONCE(desc->length);
443         if (cntr == 0) {
444                 desc->read = 0;
445 retry:
446                 if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
447                         rv = -ENODEV;
448                         goto err;
449                 }
450                 i++;
451                 if (file->f_flags & O_NONBLOCK) {
452                         if (!test_bit(WDM_READ, &desc->flags)) {
453                                 rv = cntr ? cntr : -EAGAIN;
454                                 goto err;
455                         }
456                         rv = 0;
457                 } else {
458                         rv = wait_event_interruptible(desc->wait,
459                                 test_bit(WDM_READ, &desc->flags));
460                 }
461
462                 /* may have happened while we slept */
463                 if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
464                         rv = -ENODEV;
465                         goto err;
466                 }
467                 if (test_bit(WDM_RESETTING, &desc->flags)) {
468                         rv = -EIO;
469                         goto err;
470                 }
471                 usb_mark_last_busy(interface_to_usbdev(desc->intf));
472                 if (rv < 0) {
473                         rv = -ERESTARTSYS;
474                         goto err;
475                 }
476
477                 spin_lock_irq(&desc->iuspin);
478
479                 if (desc->rerr) { /* read completed, error happened */
480                         desc->rerr = 0;
481                         spin_unlock_irq(&desc->iuspin);
482                         rv = -EIO;
483                         goto err;
484                 }
485                 /*
486                  * recheck whether we've lost the race
487                  * against the completion handler
488                  */
489                 if (!test_bit(WDM_READ, &desc->flags)) { /* lost race */
490                         spin_unlock_irq(&desc->iuspin);
491                         goto retry;
492                 }
493                 if (!desc->reslength) { /* zero length read */
494                         spin_unlock_irq(&desc->iuspin);
495                         goto retry;
496                 }
497                 cntr = desc->length;
498                 spin_unlock_irq(&desc->iuspin);
499         }
500
501         if (cntr > count)
502                 cntr = count;
503         rv = copy_to_user(buffer, desc->ubuf, cntr);
504         if (rv > 0) {
505                 rv = -EFAULT;
506                 goto err;
507         }
508
509         spin_lock_irq(&desc->iuspin);
510
511         for (i = 0; i < desc->length - cntr; i++)
512                 desc->ubuf[i] = desc->ubuf[i + cntr];
513
514         desc->length -= cntr;
515         /* in case we had outstanding data */
516         if (!desc->length)
517                 clear_bit(WDM_READ, &desc->flags);
518
519         spin_unlock_irq(&desc->iuspin);
520
521         rv = cntr;
522
523 err:
524         mutex_unlock(&desc->rlock);
525         return rv;
526 }
527
528 static int wdm_flush(struct file *file, fl_owner_t id)
529 {
530         struct wdm_device *desc = file->private_data;
531
532         wait_event(desc->wait, !test_bit(WDM_IN_USE, &desc->flags));
533
534         /* cannot dereference desc->intf if WDM_DISCONNECTING */
535         if (desc->werr < 0 && !test_bit(WDM_DISCONNECTING, &desc->flags))
536                 dev_err(&desc->intf->dev, "Error in flush path: %d\n",
537                         desc->werr);
538
539         return usb_translate_errors(desc->werr);
540 }
541
542 static unsigned int wdm_poll(struct file *file, struct poll_table_struct *wait)
543 {
544         struct wdm_device *desc = file->private_data;
545         unsigned long flags;
546         unsigned int mask = 0;
547
548         spin_lock_irqsave(&desc->iuspin, flags);
549         if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
550                 mask = POLLHUP | POLLERR;
551                 spin_unlock_irqrestore(&desc->iuspin, flags);
552                 goto desc_out;
553         }
554         if (test_bit(WDM_READ, &desc->flags))
555                 mask = POLLIN | POLLRDNORM;
556         if (desc->rerr || desc->werr)
557                 mask |= POLLERR;
558         if (!test_bit(WDM_IN_USE, &desc->flags))
559                 mask |= POLLOUT | POLLWRNORM;
560         spin_unlock_irqrestore(&desc->iuspin, flags);
561
562         poll_wait(file, &desc->wait, wait);
563
564 desc_out:
565         return mask;
566 }
567
568 static int wdm_open(struct inode *inode, struct file *file)
569 {
570         int minor = iminor(inode);
571         int rv = -ENODEV;
572         struct usb_interface *intf;
573         struct wdm_device *desc;
574
575         mutex_lock(&wdm_mutex);
576         desc = wdm_find_device_by_minor(minor);
577         if (!desc)
578                 goto out;
579
580         intf = desc->intf;
581         if (test_bit(WDM_DISCONNECTING, &desc->flags))
582                 goto out;
583         file->private_data = desc;
584
585         rv = usb_autopm_get_interface(desc->intf);
586         if (rv < 0) {
587                 dev_err(&desc->intf->dev, "Error autopm - %d\n", rv);
588                 goto out;
589         }
590
591         /* using write lock to protect desc->count */
592         mutex_lock(&desc->wlock);
593         if (!desc->count++) {
594                 desc->werr = 0;
595                 desc->rerr = 0;
596                 rv = usb_submit_urb(desc->validity, GFP_KERNEL);
597                 if (rv < 0) {
598                         desc->count--;
599                         dev_err(&desc->intf->dev,
600                                 "Error submitting int urb - %d\n", rv);
601                         rv = usb_translate_errors(rv);
602                 }
603         } else {
604                 rv = 0;
605         }
606         mutex_unlock(&desc->wlock);
607         if (desc->count == 1)
608                 desc->manage_power(intf, 1);
609         usb_autopm_put_interface(desc->intf);
610 out:
611         mutex_unlock(&wdm_mutex);
612         return rv;
613 }
614
615 static int wdm_release(struct inode *inode, struct file *file)
616 {
617         struct wdm_device *desc = file->private_data;
618
619         mutex_lock(&wdm_mutex);
620
621         /* using write lock to protect desc->count */
622         mutex_lock(&desc->wlock);
623         desc->count--;
624         mutex_unlock(&desc->wlock);
625
626         if (!desc->count) {
627                 if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
628                         dev_dbg(&desc->intf->dev, "wdm_release: cleanup");
629                         kill_urbs(desc);
630                         desc->manage_power(desc->intf, 0);
631                 } else {
632                         /* must avoid dev_printk here as desc->intf is invalid */
633                         pr_debug(KBUILD_MODNAME " %s: device gone - cleaning up\n", __func__);
634                         cleanup(desc);
635                 }
636         }
637         mutex_unlock(&wdm_mutex);
638         return 0;
639 }
640
641 static const struct file_operations wdm_fops = {
642         .owner =        THIS_MODULE,
643         .read =         wdm_read,
644         .write =        wdm_write,
645         .open =         wdm_open,
646         .flush =        wdm_flush,
647         .release =      wdm_release,
648         .poll =         wdm_poll,
649         .llseek =       noop_llseek,
650 };
651
652 static struct usb_class_driver wdm_class = {
653         .name =         "cdc-wdm%d",
654         .fops =         &wdm_fops,
655         .minor_base =   WDM_MINOR_BASE,
656 };
657
658 /* --- error handling --- */
659 static void wdm_rxwork(struct work_struct *work)
660 {
661         struct wdm_device *desc = container_of(work, struct wdm_device, rxwork);
662         unsigned long flags;
663         int rv;
664
665         spin_lock_irqsave(&desc->iuspin, flags);
666         if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
667                 spin_unlock_irqrestore(&desc->iuspin, flags);
668         } else {
669                 spin_unlock_irqrestore(&desc->iuspin, flags);
670                 rv = usb_submit_urb(desc->response, GFP_KERNEL);
671                 if (rv < 0 && rv != -EPERM) {
672                         spin_lock_irqsave(&desc->iuspin, flags);
673                         if (!test_bit(WDM_DISCONNECTING, &desc->flags))
674                                 schedule_work(&desc->rxwork);
675                         spin_unlock_irqrestore(&desc->iuspin, flags);
676                 }
677         }
678 }
679
680 /* --- hotplug --- */
681
682 static int wdm_create(struct usb_interface *intf, struct usb_endpoint_descriptor *ep,
683                 u16 bufsize, int (*manage_power)(struct usb_interface *, int))
684 {
685         int rv = -ENOMEM;
686         struct wdm_device *desc;
687
688         desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL);
689         if (!desc)
690                 goto out;
691         INIT_LIST_HEAD(&desc->device_list);
692         mutex_init(&desc->rlock);
693         mutex_init(&desc->wlock);
694         spin_lock_init(&desc->iuspin);
695         init_waitqueue_head(&desc->wait);
696         desc->wMaxCommand = bufsize;
697         /* this will be expanded and needed in hardware endianness */
698         desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber);
699         desc->intf = intf;
700         INIT_WORK(&desc->rxwork, wdm_rxwork);
701
702         rv = -EINVAL;
703         if (!usb_endpoint_is_int_in(ep))
704                 goto err;
705
706         desc->wMaxPacketSize = usb_endpoint_maxp(ep);
707
708         desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
709         if (!desc->orq)
710                 goto err;
711         desc->irq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
712         if (!desc->irq)
713                 goto err;
714
715         desc->validity = usb_alloc_urb(0, GFP_KERNEL);
716         if (!desc->validity)
717                 goto err;
718
719         desc->response = usb_alloc_urb(0, GFP_KERNEL);
720         if (!desc->response)
721                 goto err;
722
723         desc->command = usb_alloc_urb(0, GFP_KERNEL);
724         if (!desc->command)
725                 goto err;
726
727         desc->ubuf = kmalloc(desc->wMaxCommand, GFP_KERNEL);
728         if (!desc->ubuf)
729                 goto err;
730
731         desc->sbuf = kmalloc(desc->wMaxPacketSize, GFP_KERNEL);
732         if (!desc->sbuf)
733                 goto err;
734
735         desc->inbuf = kmalloc(desc->wMaxCommand, GFP_KERNEL);
736         if (!desc->inbuf)
737                 goto err;
738
739         usb_fill_int_urb(
740                 desc->validity,
741                 interface_to_usbdev(intf),
742                 usb_rcvintpipe(interface_to_usbdev(intf), ep->bEndpointAddress),
743                 desc->sbuf,
744                 desc->wMaxPacketSize,
745                 wdm_int_callback,
746                 desc,
747                 ep->bInterval
748         );
749
750         desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
751         desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
752         desc->irq->wValue = 0;
753         desc->irq->wIndex = desc->inum;
754         desc->irq->wLength = cpu_to_le16(desc->wMaxCommand);
755
756         usb_fill_control_urb(
757                 desc->response,
758                 interface_to_usbdev(intf),
759                 /* using common endpoint 0 */
760                 usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
761                 (unsigned char *)desc->irq,
762                 desc->inbuf,
763                 desc->wMaxCommand,
764                 wdm_in_callback,
765                 desc
766         );
767
768         desc->manage_power = manage_power;
769
770         spin_lock(&wdm_device_list_lock);
771         list_add(&desc->device_list, &wdm_device_list);
772         spin_unlock(&wdm_device_list_lock);
773
774         rv = usb_register_dev(intf, &wdm_class);
775         if (rv < 0)
776                 goto err;
777         else
778                 dev_info(&intf->dev, "%s: USB WDM device\n", dev_name(intf->usb_dev));
779 out:
780         return rv;
781 err:
782         spin_lock(&wdm_device_list_lock);
783         list_del(&desc->device_list);
784         spin_unlock(&wdm_device_list_lock);
785         cleanup(desc);
786         return rv;
787 }
788
789 static int wdm_manage_power(struct usb_interface *intf, int on)
790 {
791         /* need autopm_get/put here to ensure the usbcore sees the new value */
792         int rv = usb_autopm_get_interface(intf);
793         if (rv < 0)
794                 goto err;
795
796         intf->needs_remote_wakeup = on;
797         usb_autopm_put_interface(intf);
798 err:
799         return rv;
800 }
801
802 static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
803 {
804         int rv = -EINVAL;
805         struct usb_host_interface *iface;
806         struct usb_endpoint_descriptor *ep;
807         struct usb_cdc_dmm_desc *dmhd;
808         u8 *buffer = intf->altsetting->extra;
809         int buflen = intf->altsetting->extralen;
810         u16 maxcom = WDM_DEFAULT_BUFSIZE;
811
812         if (!buffer)
813                 goto err;
814         while (buflen > 2) {
815                 if (buffer[1] != USB_DT_CS_INTERFACE) {
816                         dev_err(&intf->dev, "skipping garbage\n");
817                         goto next_desc;
818                 }
819
820                 switch (buffer[2]) {
821                 case USB_CDC_HEADER_TYPE:
822                         break;
823                 case USB_CDC_DMM_TYPE:
824                         dmhd = (struct usb_cdc_dmm_desc *)buffer;
825                         maxcom = le16_to_cpu(dmhd->wMaxCommand);
826                         dev_dbg(&intf->dev,
827                                 "Finding maximum buffer length: %d", maxcom);
828                         break;
829                 default:
830                         dev_err(&intf->dev,
831                                 "Ignoring extra header, type %d, length %d\n",
832                                 buffer[2], buffer[0]);
833                         break;
834                 }
835 next_desc:
836                 buflen -= buffer[0];
837                 buffer += buffer[0];
838         }
839
840         iface = intf->cur_altsetting;
841         if (iface->desc.bNumEndpoints != 1)
842                 goto err;
843         ep = &iface->endpoint[0].desc;
844
845         rv = wdm_create(intf, ep, maxcom, &wdm_manage_power);
846
847 err:
848         return rv;
849 }
850
851 /**
852  * usb_cdc_wdm_register - register a WDM subdriver
853  * @intf: usb interface the subdriver will associate with
854  * @ep: interrupt endpoint to monitor for notifications
855  * @bufsize: maximum message size to support for read/write
856  *
857  * Create WDM usb class character device and associate it with intf
858  * without binding, allowing another driver to manage the interface.
859  *
860  * The subdriver will manage the given interrupt endpoint exclusively
861  * and will issue control requests referring to the given intf. It
862  * will otherwise avoid interferring, and in particular not do
863  * usb_set_intfdata/usb_get_intfdata on intf.
864  *
865  * The return value is a pointer to the subdriver's struct usb_driver.
866  * The registering driver is responsible for calling this subdriver's
867  * disconnect, suspend, resume, pre_reset and post_reset methods from
868  * its own.
869  */
870 struct usb_driver *usb_cdc_wdm_register(struct usb_interface *intf,
871                                         struct usb_endpoint_descriptor *ep,
872                                         int bufsize,
873                                         int (*manage_power)(struct usb_interface *, int))
874 {
875         int rv = -EINVAL;
876
877         rv = wdm_create(intf, ep, bufsize, manage_power);
878         if (rv < 0)
879                 goto err;
880
881         return &wdm_driver;
882 err:
883         return ERR_PTR(rv);
884 }
885 EXPORT_SYMBOL(usb_cdc_wdm_register);
886
887 static void wdm_disconnect(struct usb_interface *intf)
888 {
889         struct wdm_device *desc;
890         unsigned long flags;
891
892         usb_deregister_dev(intf, &wdm_class);
893         desc = wdm_find_device(intf);
894         mutex_lock(&wdm_mutex);
895
896         /* the spinlock makes sure no new urbs are generated in the callbacks */
897         spin_lock_irqsave(&desc->iuspin, flags);
898         set_bit(WDM_DISCONNECTING, &desc->flags);
899         set_bit(WDM_READ, &desc->flags);
900         /* to terminate pending flushes */
901         clear_bit(WDM_IN_USE, &desc->flags);
902         spin_unlock_irqrestore(&desc->iuspin, flags);
903         wake_up_all(&desc->wait);
904         mutex_lock(&desc->rlock);
905         mutex_lock(&desc->wlock);
906         kill_urbs(desc);
907         cancel_work_sync(&desc->rxwork);
908         mutex_unlock(&desc->wlock);
909         mutex_unlock(&desc->rlock);
910
911         /* the desc->intf pointer used as list key is now invalid */
912         spin_lock(&wdm_device_list_lock);
913         list_del(&desc->device_list);
914         spin_unlock(&wdm_device_list_lock);
915
916         if (!desc->count)
917                 cleanup(desc);
918         else
919                 dev_dbg(&intf->dev, "%s: %d open files - postponing cleanup\n", __func__, desc->count);
920         mutex_unlock(&wdm_mutex);
921 }
922
923 #ifdef CONFIG_PM
924 static int wdm_suspend(struct usb_interface *intf, pm_message_t message)
925 {
926         struct wdm_device *desc = wdm_find_device(intf);
927         int rv = 0;
928
929         dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor);
930
931         /* if this is an autosuspend the caller does the locking */
932         if (!PMSG_IS_AUTO(message)) {
933                 mutex_lock(&desc->rlock);
934                 mutex_lock(&desc->wlock);
935         }
936         spin_lock_irq(&desc->iuspin);
937
938         if (PMSG_IS_AUTO(message) &&
939                         (test_bit(WDM_IN_USE, &desc->flags)
940                         || test_bit(WDM_RESPONDING, &desc->flags))) {
941                 spin_unlock_irq(&desc->iuspin);
942                 rv = -EBUSY;
943         } else {
944
945                 set_bit(WDM_SUSPENDING, &desc->flags);
946                 spin_unlock_irq(&desc->iuspin);
947                 /* callback submits work - order is essential */
948                 kill_urbs(desc);
949                 cancel_work_sync(&desc->rxwork);
950         }
951         if (!PMSG_IS_AUTO(message)) {
952                 mutex_unlock(&desc->wlock);
953                 mutex_unlock(&desc->rlock);
954         }
955
956         return rv;
957 }
958 #endif
959
960 static int recover_from_urb_loss(struct wdm_device *desc)
961 {
962         int rv = 0;
963
964         if (desc->count) {
965                 rv = usb_submit_urb(desc->validity, GFP_NOIO);
966                 if (rv < 0)
967                         dev_err(&desc->intf->dev,
968                                 "Error resume submitting int urb - %d\n", rv);
969         }
970         return rv;
971 }
972
973 #ifdef CONFIG_PM
974 static int wdm_resume(struct usb_interface *intf)
975 {
976         struct wdm_device *desc = wdm_find_device(intf);
977         int rv;
978
979         dev_dbg(&desc->intf->dev, "wdm%d_resume\n", intf->minor);
980
981         clear_bit(WDM_SUSPENDING, &desc->flags);
982         rv = recover_from_urb_loss(desc);
983
984         return rv;
985 }
986 #endif
987
988 static int wdm_pre_reset(struct usb_interface *intf)
989 {
990         struct wdm_device *desc = wdm_find_device(intf);
991
992         /*
993          * we notify everybody using poll of
994          * an exceptional situation
995          * must be done before recovery lest a spontaneous
996          * message from the device is lost
997          */
998         spin_lock_irq(&desc->iuspin);
999         set_bit(WDM_RESETTING, &desc->flags);   /* inform read/write */
1000         set_bit(WDM_READ, &desc->flags);        /* unblock read */
1001         clear_bit(WDM_IN_USE, &desc->flags);    /* unblock write */
1002         desc->rerr = -EINTR;
1003         spin_unlock_irq(&desc->iuspin);
1004         wake_up_all(&desc->wait);
1005         mutex_lock(&desc->rlock);
1006         mutex_lock(&desc->wlock);
1007         kill_urbs(desc);
1008         cancel_work_sync(&desc->rxwork);
1009         return 0;
1010 }
1011
1012 static int wdm_post_reset(struct usb_interface *intf)
1013 {
1014         struct wdm_device *desc = wdm_find_device(intf);
1015         int rv;
1016
1017         clear_bit(WDM_RESETTING, &desc->flags);
1018         rv = recover_from_urb_loss(desc);
1019         mutex_unlock(&desc->wlock);
1020         mutex_unlock(&desc->rlock);
1021         return 0;
1022 }
1023
1024 static struct usb_driver wdm_driver = {
1025         .name =         "cdc_wdm",
1026         .probe =        wdm_probe,
1027         .disconnect =   wdm_disconnect,
1028 #ifdef CONFIG_PM
1029         .suspend =      wdm_suspend,
1030         .resume =       wdm_resume,
1031         .reset_resume = wdm_resume,
1032 #endif
1033         .pre_reset =    wdm_pre_reset,
1034         .post_reset =   wdm_post_reset,
1035         .id_table =     wdm_ids,
1036         .supports_autosuspend = 1,
1037         .disable_hub_initiated_lpm = 1,
1038 };
1039
1040 module_usb_driver(wdm_driver);
1041
1042 MODULE_AUTHOR(DRIVER_AUTHOR);
1043 MODULE_DESCRIPTION(DRIVER_DESC);
1044 MODULE_LICENSE("GPL");