cdc-wdm.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  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. * Version Information
  29. */
  30. #define DRIVER_VERSION "v0.03"
  31. #define DRIVER_AUTHOR "Oliver Neukum"
  32. #define DRIVER_DESC "USB Abstract Control Model driver for USB WCM Device Management"
  33. static struct usb_device_id wdm_ids[] = {
  34. {
  35. .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
  36. USB_DEVICE_ID_MATCH_INT_SUBCLASS,
  37. .bInterfaceClass = USB_CLASS_COMM,
  38. .bInterfaceSubClass = USB_CDC_SUBCLASS_DMM
  39. },
  40. { }
  41. };
  42. #define WDM_MINOR_BASE 176
  43. #define WDM_IN_USE 1
  44. #define WDM_DISCONNECTING 2
  45. #define WDM_RESULT 3
  46. #define WDM_READ 4
  47. #define WDM_INT_STALL 5
  48. #define WDM_POLL_RUNNING 6
  49. #define WDM_MAX 16
  50. static DEFINE_MUTEX(wdm_mutex);
  51. /* --- method tables --- */
  52. struct wdm_device {
  53. u8 *inbuf; /* buffer for response */
  54. u8 *outbuf; /* buffer for command */
  55. u8 *sbuf; /* buffer for status */
  56. u8 *ubuf; /* buffer for copy to user space */
  57. struct urb *command;
  58. struct urb *response;
  59. struct urb *validity;
  60. struct usb_interface *intf;
  61. struct usb_ctrlrequest *orq;
  62. struct usb_ctrlrequest *irq;
  63. spinlock_t iuspin;
  64. unsigned long flags;
  65. u16 bufsize;
  66. u16 wMaxCommand;
  67. u16 wMaxPacketSize;
  68. u16 bMaxPacketSize0;
  69. __le16 inum;
  70. int reslength;
  71. int length;
  72. int read;
  73. int count;
  74. dma_addr_t shandle;
  75. dma_addr_t ihandle;
  76. struct mutex wlock;
  77. struct mutex rlock;
  78. wait_queue_head_t wait;
  79. struct work_struct rxwork;
  80. int werr;
  81. int rerr;
  82. };
  83. static struct usb_driver wdm_driver;
  84. /* --- callbacks --- */
  85. static void wdm_out_callback(struct urb *urb)
  86. {
  87. struct wdm_device *desc;
  88. desc = urb->context;
  89. spin_lock(&desc->iuspin);
  90. desc->werr = urb->status;
  91. spin_unlock(&desc->iuspin);
  92. clear_bit(WDM_IN_USE, &desc->flags);
  93. kfree(desc->outbuf);
  94. wake_up(&desc->wait);
  95. }
  96. static void wdm_in_callback(struct urb *urb)
  97. {
  98. struct wdm_device *desc = urb->context;
  99. int status = urb->status;
  100. spin_lock(&desc->iuspin);
  101. if (status) {
  102. switch (status) {
  103. case -ENOENT:
  104. dev_dbg(&desc->intf->dev,
  105. "nonzero urb status received: -ENOENT");
  106. break;
  107. case -ECONNRESET:
  108. dev_dbg(&desc->intf->dev,
  109. "nonzero urb status received: -ECONNRESET");
  110. break;
  111. case -ESHUTDOWN:
  112. dev_dbg(&desc->intf->dev,
  113. "nonzero urb status received: -ESHUTDOWN");
  114. break;
  115. case -EPIPE:
  116. err("nonzero urb status received: -EPIPE");
  117. break;
  118. default:
  119. err("Unexpected error %d", status);
  120. break;
  121. }
  122. }
  123. desc->rerr = status;
  124. desc->reslength = urb->actual_length;
  125. memmove(desc->ubuf + desc->length, desc->inbuf, desc->reslength);
  126. desc->length += desc->reslength;
  127. wake_up(&desc->wait);
  128. set_bit(WDM_READ, &desc->flags);
  129. spin_unlock(&desc->iuspin);
  130. }
  131. static void wdm_int_callback(struct urb *urb)
  132. {
  133. int rv = 0;
  134. int status = urb->status;
  135. struct wdm_device *desc;
  136. struct usb_ctrlrequest *req;
  137. struct usb_cdc_notification *dr;
  138. desc = urb->context;
  139. req = desc->irq;
  140. dr = (struct usb_cdc_notification *)desc->sbuf;
  141. if (status) {
  142. switch (status) {
  143. case -ESHUTDOWN:
  144. case -ENOENT:
  145. case -ECONNRESET:
  146. return; /* unplug */
  147. case -EPIPE:
  148. set_bit(WDM_INT_STALL, &desc->flags);
  149. err("Stall on int endpoint");
  150. goto sw; /* halt is cleared in work */
  151. default:
  152. err("nonzero urb status received: %d", status);
  153. break;
  154. }
  155. }
  156. if (urb->actual_length < sizeof(struct usb_cdc_notification)) {
  157. err("wdm_int_callback - %d bytes", urb->actual_length);
  158. goto exit;
  159. }
  160. switch (dr->bNotificationType) {
  161. case USB_CDC_NOTIFY_RESPONSE_AVAILABLE:
  162. dev_dbg(&desc->intf->dev,
  163. "NOTIFY_RESPONSE_AVAILABLE received: index %d len %d",
  164. dr->wIndex, dr->wLength);
  165. break;
  166. case USB_CDC_NOTIFY_NETWORK_CONNECTION:
  167. dev_dbg(&desc->intf->dev,
  168. "NOTIFY_NETWORK_CONNECTION %s network",
  169. dr->wValue ? "connected to" : "disconnected from");
  170. goto exit;
  171. default:
  172. clear_bit(WDM_POLL_RUNNING, &desc->flags);
  173. err("unknown notification %d received: index %d len %d",
  174. dr->bNotificationType, dr->wIndex, dr->wLength);
  175. goto exit;
  176. }
  177. req->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
  178. req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
  179. req->wValue = 0;
  180. req->wIndex = desc->inum;
  181. req->wLength = cpu_to_le16(desc->wMaxCommand);
  182. usb_fill_control_urb(
  183. desc->response,
  184. interface_to_usbdev(desc->intf),
  185. /* using common endpoint 0 */
  186. usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
  187. (unsigned char *)req,
  188. desc->inbuf,
  189. desc->wMaxCommand,
  190. wdm_in_callback,
  191. desc
  192. );
  193. desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  194. spin_lock(&desc->iuspin);
  195. clear_bit(WDM_READ, &desc->flags);
  196. if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
  197. rv = usb_submit_urb(desc->response, GFP_ATOMIC);
  198. dev_dbg(&desc->intf->dev, "%s: usb_submit_urb %d",
  199. __func__, rv);
  200. }
  201. spin_unlock(&desc->iuspin);
  202. if (rv < 0) {
  203. if (rv == -EPERM)
  204. return;
  205. if (rv == -ENOMEM) {
  206. sw:
  207. rv = schedule_work(&desc->rxwork);
  208. if (rv)
  209. err("Cannot schedule work");
  210. }
  211. }
  212. exit:
  213. rv = usb_submit_urb(urb, GFP_ATOMIC);
  214. if (rv)
  215. err("%s - usb_submit_urb failed with result %d",
  216. __func__, rv);
  217. }
  218. static void kill_urbs(struct wdm_device *desc)
  219. {
  220. usb_kill_urb(desc->command);
  221. usb_kill_urb(desc->validity);
  222. usb_kill_urb(desc->response);
  223. }
  224. static void free_urbs(struct wdm_device *desc)
  225. {
  226. usb_free_urb(desc->validity);
  227. usb_free_urb(desc->response);
  228. usb_free_urb(desc->command);
  229. }
  230. static void cleanup(struct wdm_device *desc)
  231. {
  232. usb_buffer_free(interface_to_usbdev(desc->intf),
  233. desc->wMaxPacketSize,
  234. desc->sbuf,
  235. desc->validity->transfer_dma);
  236. usb_buffer_free(interface_to_usbdev(desc->intf),
  237. desc->wMaxCommand,
  238. desc->inbuf,
  239. desc->response->transfer_dma);
  240. kfree(desc->orq);
  241. kfree(desc->irq);
  242. kfree(desc->ubuf);
  243. free_urbs(desc);
  244. kfree(desc);
  245. }
  246. static ssize_t wdm_write
  247. (struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
  248. {
  249. u8 *buf;
  250. int rv = -EMSGSIZE, r, we;
  251. struct wdm_device *desc = file->private_data;
  252. struct usb_ctrlrequest *req;
  253. if (count > desc->wMaxCommand)
  254. count = desc->wMaxCommand;
  255. spin_lock_irq(&desc->iuspin);
  256. we = desc->werr;
  257. desc->werr = 0;
  258. spin_unlock_irq(&desc->iuspin);
  259. if (we < 0)
  260. return -EIO;
  261. r = mutex_lock_interruptible(&desc->wlock); /* concurrent writes */
  262. rv = -ERESTARTSYS;
  263. if (r)
  264. goto outnl;
  265. r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE,
  266. &desc->flags));
  267. if (r < 0)
  268. goto out;
  269. if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
  270. rv = -ENODEV;
  271. goto out;
  272. }
  273. desc->outbuf = buf = kmalloc(count, GFP_KERNEL);
  274. if (!buf) {
  275. rv = -ENOMEM;
  276. goto out;
  277. }
  278. r = copy_from_user(buf, buffer, count);
  279. if (r > 0) {
  280. kfree(buf);
  281. rv = -EFAULT;
  282. goto out;
  283. }
  284. req = desc->orq;
  285. usb_fill_control_urb(
  286. desc->command,
  287. interface_to_usbdev(desc->intf),
  288. /* using common endpoint 0 */
  289. usb_sndctrlpipe(interface_to_usbdev(desc->intf), 0),
  290. (unsigned char *)req,
  291. buf,
  292. count,
  293. wdm_out_callback,
  294. desc
  295. );
  296. req->bRequestType = (USB_DIR_OUT | USB_TYPE_CLASS |
  297. USB_RECIP_INTERFACE);
  298. req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
  299. req->wValue = 0;
  300. req->wIndex = desc->inum;
  301. req->wLength = cpu_to_le16(count);
  302. set_bit(WDM_IN_USE, &desc->flags);
  303. rv = usb_submit_urb(desc->command, GFP_KERNEL);
  304. if (rv < 0) {
  305. kfree(buf);
  306. clear_bit(WDM_IN_USE, &desc->flags);
  307. err("Tx URB error: %d", rv);
  308. } else {
  309. dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
  310. req->wIndex);
  311. }
  312. out:
  313. mutex_unlock(&desc->wlock);
  314. outnl:
  315. return rv < 0 ? rv : count;
  316. }
  317. static ssize_t wdm_read
  318. (struct file *file, char __user *buffer, size_t count, loff_t *ppos)
  319. {
  320. int rv, cntr;
  321. int i = 0;
  322. struct wdm_device *desc = file->private_data;
  323. rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */
  324. if (rv < 0)
  325. return -ERESTARTSYS;
  326. if (desc->length == 0) {
  327. desc->read = 0;
  328. retry:
  329. i++;
  330. rv = wait_event_interruptible(desc->wait,
  331. test_bit(WDM_READ, &desc->flags));
  332. if (rv < 0) {
  333. rv = -ERESTARTSYS;
  334. goto err;
  335. }
  336. spin_lock_irq(&desc->iuspin);
  337. if (desc->rerr) { /* read completed, error happened */
  338. int t = desc->rerr;
  339. desc->rerr = 0;
  340. spin_unlock_irq(&desc->iuspin);
  341. err("reading had resulted in %d", t);
  342. rv = -EIO;
  343. goto err;
  344. }
  345. /*
  346. * recheck whether we've lost the race
  347. * against the completion handler
  348. */
  349. if (!test_bit(WDM_READ, &desc->flags)) { /* lost race */
  350. spin_unlock_irq(&desc->iuspin);
  351. goto retry;
  352. }
  353. if (!desc->reslength) { /* zero length read */
  354. spin_unlock_irq(&desc->iuspin);
  355. goto retry;
  356. }
  357. clear_bit(WDM_READ, &desc->flags);
  358. spin_unlock_irq(&desc->iuspin);
  359. }
  360. cntr = count > desc->length ? desc->length : count;
  361. rv = copy_to_user(buffer, desc->ubuf, cntr);
  362. if (rv > 0) {
  363. rv = -EFAULT;
  364. goto err;
  365. }
  366. for (i = 0; i < desc->length - cntr; i++)
  367. desc->ubuf[i] = desc->ubuf[i + cntr];
  368. desc->length -= cntr;
  369. /* in case we had outstanding data */
  370. if (!desc->length)
  371. clear_bit(WDM_READ, &desc->flags);
  372. rv = cntr;
  373. err:
  374. mutex_unlock(&desc->rlock);
  375. if (rv < 0)
  376. err("wdm_read: exit error");
  377. return rv;
  378. }
  379. static int wdm_flush(struct file *file, fl_owner_t id)
  380. {
  381. struct wdm_device *desc = file->private_data;
  382. wait_event(desc->wait, !test_bit(WDM_IN_USE, &desc->flags));
  383. if (desc->werr < 0)
  384. err("Error in flush path: %d", desc->werr);
  385. return desc->werr;
  386. }
  387. static unsigned int wdm_poll(struct file *file, struct poll_table_struct *wait)
  388. {
  389. struct wdm_device *desc = file->private_data;
  390. unsigned long flags;
  391. unsigned int mask = 0;
  392. spin_lock_irqsave(&desc->iuspin, flags);
  393. if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
  394. mask = POLLERR;
  395. spin_unlock_irqrestore(&desc->iuspin, flags);
  396. goto desc_out;
  397. }
  398. if (test_bit(WDM_READ, &desc->flags))
  399. mask = POLLIN | POLLRDNORM;
  400. if (desc->rerr || desc->werr)
  401. mask |= POLLERR;
  402. if (!test_bit(WDM_IN_USE, &desc->flags))
  403. mask |= POLLOUT | POLLWRNORM;
  404. spin_unlock_irqrestore(&desc->iuspin, flags);
  405. poll_wait(file, &desc->wait, wait);
  406. desc_out:
  407. return mask;
  408. }
  409. static int wdm_open(struct inode *inode, struct file *file)
  410. {
  411. int minor = iminor(inode);
  412. int rv = -ENODEV;
  413. struct usb_interface *intf;
  414. struct wdm_device *desc;
  415. mutex_lock(&wdm_mutex);
  416. intf = usb_find_interface(&wdm_driver, minor);
  417. if (!intf)
  418. goto out;
  419. desc = usb_get_intfdata(intf);
  420. if (test_bit(WDM_DISCONNECTING, &desc->flags))
  421. goto out;
  422. desc->count++;
  423. file->private_data = desc;
  424. rv = usb_submit_urb(desc->validity, GFP_KERNEL);
  425. if (rv < 0) {
  426. desc->count--;
  427. err("Error submitting int urb - %d", rv);
  428. goto out;
  429. }
  430. rv = 0;
  431. out:
  432. mutex_unlock(&wdm_mutex);
  433. return rv;
  434. }
  435. static int wdm_release(struct inode *inode, struct file *file)
  436. {
  437. struct wdm_device *desc = file->private_data;
  438. mutex_lock(&wdm_mutex);
  439. desc->count--;
  440. if (!desc->count) {
  441. dev_dbg(&desc->intf->dev, "wdm_release: cleanup");
  442. kill_urbs(desc);
  443. }
  444. mutex_unlock(&wdm_mutex);
  445. return 0;
  446. }
  447. static const struct file_operations wdm_fops = {
  448. .owner = THIS_MODULE,
  449. .read = wdm_read,
  450. .write = wdm_write,
  451. .open = wdm_open,
  452. .flush = wdm_flush,
  453. .release = wdm_release,
  454. .poll = wdm_poll
  455. };
  456. static struct usb_class_driver wdm_class = {
  457. .name = "cdc-wdm%d",
  458. .fops = &wdm_fops,
  459. .minor_base = WDM_MINOR_BASE,
  460. };
  461. /* --- error handling --- */
  462. static void wdm_rxwork(struct work_struct *work)
  463. {
  464. struct wdm_device *desc = container_of(work, struct wdm_device, rxwork);
  465. unsigned long flags;
  466. int rv;
  467. spin_lock_irqsave(&desc->iuspin, flags);
  468. if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
  469. spin_unlock_irqrestore(&desc->iuspin, flags);
  470. } else {
  471. spin_unlock_irqrestore(&desc->iuspin, flags);
  472. rv = usb_submit_urb(desc->response, GFP_KERNEL);
  473. if (rv < 0 && rv != -EPERM) {
  474. spin_lock_irqsave(&desc->iuspin, flags);
  475. if (!test_bit(WDM_DISCONNECTING, &desc->flags))
  476. schedule_work(&desc->rxwork);
  477. spin_unlock_irqrestore(&desc->iuspin, flags);
  478. }
  479. }
  480. }
  481. /* --- hotplug --- */
  482. static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
  483. {
  484. int rv = -EINVAL;
  485. struct usb_device *udev = interface_to_usbdev(intf);
  486. struct wdm_device *desc;
  487. struct usb_host_interface *iface;
  488. struct usb_endpoint_descriptor *ep;
  489. struct usb_cdc_dmm_desc *dmhd;
  490. u8 *buffer = intf->altsetting->extra;
  491. int buflen = intf->altsetting->extralen;
  492. u16 maxcom = 0;
  493. if (!buffer)
  494. goto out;
  495. while (buflen > 0) {
  496. if (buffer [1] != USB_DT_CS_INTERFACE) {
  497. err("skipping garbage");
  498. goto next_desc;
  499. }
  500. switch (buffer [2]) {
  501. case USB_CDC_HEADER_TYPE:
  502. break;
  503. case USB_CDC_DMM_TYPE:
  504. dmhd = (struct usb_cdc_dmm_desc *)buffer;
  505. maxcom = le16_to_cpu(dmhd->wMaxCommand);
  506. dev_dbg(&intf->dev,
  507. "Finding maximum buffer length: %d", maxcom);
  508. break;
  509. default:
  510. err("Ignoring extra header, type %d, length %d",
  511. buffer[2], buffer[0]);
  512. break;
  513. }
  514. next_desc:
  515. buflen -= buffer[0];
  516. buffer += buffer[0];
  517. }
  518. rv = -ENOMEM;
  519. desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL);
  520. if (!desc)
  521. goto out;
  522. mutex_init(&desc->wlock);
  523. mutex_init(&desc->rlock);
  524. spin_lock_init(&desc->iuspin);
  525. init_waitqueue_head(&desc->wait);
  526. desc->wMaxCommand = maxcom;
  527. desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber);
  528. desc->intf = intf;
  529. INIT_WORK(&desc->rxwork, wdm_rxwork);
  530. iface = &intf->altsetting[0];
  531. ep = &iface->endpoint[0].desc;
  532. if (!usb_endpoint_is_int_in(ep)) {
  533. rv = -EINVAL;
  534. goto err;
  535. }
  536. desc->wMaxPacketSize = le16_to_cpu(ep->wMaxPacketSize);
  537. desc->bMaxPacketSize0 = udev->descriptor.bMaxPacketSize0;
  538. desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
  539. if (!desc->orq)
  540. goto err;
  541. desc->irq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
  542. if (!desc->irq)
  543. goto err;
  544. desc->validity = usb_alloc_urb(0, GFP_KERNEL);
  545. if (!desc->validity)
  546. goto err;
  547. desc->response = usb_alloc_urb(0, GFP_KERNEL);
  548. if (!desc->response)
  549. goto err;
  550. desc->command = usb_alloc_urb(0, GFP_KERNEL);
  551. if (!desc->command)
  552. goto err;
  553. desc->ubuf = kmalloc(desc->wMaxCommand, GFP_KERNEL);
  554. if (!desc->ubuf)
  555. goto err;
  556. desc->sbuf = usb_buffer_alloc(interface_to_usbdev(intf),
  557. desc->wMaxPacketSize,
  558. GFP_KERNEL,
  559. &desc->validity->transfer_dma);
  560. if (!desc->sbuf)
  561. goto err;
  562. desc->inbuf = usb_buffer_alloc(interface_to_usbdev(intf),
  563. desc->bMaxPacketSize0,
  564. GFP_KERNEL,
  565. &desc->response->transfer_dma);
  566. if (!desc->inbuf)
  567. goto err2;
  568. usb_fill_int_urb(
  569. desc->validity,
  570. interface_to_usbdev(intf),
  571. usb_rcvintpipe(interface_to_usbdev(intf), ep->bEndpointAddress),
  572. desc->sbuf,
  573. desc->wMaxPacketSize,
  574. wdm_int_callback,
  575. desc,
  576. ep->bInterval
  577. );
  578. desc->validity->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  579. usb_set_intfdata(intf, desc);
  580. rv = usb_register_dev(intf, &wdm_class);
  581. dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n",
  582. intf->minor - WDM_MINOR_BASE);
  583. if (rv < 0)
  584. goto err;
  585. out:
  586. return rv;
  587. err2:
  588. usb_buffer_free(interface_to_usbdev(desc->intf),
  589. desc->wMaxPacketSize,
  590. desc->sbuf,
  591. desc->validity->transfer_dma);
  592. err:
  593. free_urbs(desc);
  594. kfree(desc->ubuf);
  595. kfree(desc->orq);
  596. kfree(desc->irq);
  597. kfree(desc);
  598. return rv;
  599. }
  600. static void wdm_disconnect(struct usb_interface *intf)
  601. {
  602. struct wdm_device *desc;
  603. unsigned long flags;
  604. usb_deregister_dev(intf, &wdm_class);
  605. mutex_lock(&wdm_mutex);
  606. desc = usb_get_intfdata(intf);
  607. /* the spinlock makes sure no new urbs are generated in the callbacks */
  608. spin_lock_irqsave(&desc->iuspin, flags);
  609. set_bit(WDM_DISCONNECTING, &desc->flags);
  610. set_bit(WDM_READ, &desc->flags);
  611. clear_bit(WDM_IN_USE, &desc->flags);
  612. spin_unlock_irqrestore(&desc->iuspin, flags);
  613. cancel_work_sync(&desc->rxwork);
  614. kill_urbs(desc);
  615. wake_up_all(&desc->wait);
  616. if (!desc->count)
  617. cleanup(desc);
  618. mutex_unlock(&wdm_mutex);
  619. }
  620. static struct usb_driver wdm_driver = {
  621. .name = "cdc_wdm",
  622. .probe = wdm_probe,
  623. .disconnect = wdm_disconnect,
  624. .id_table = wdm_ids,
  625. };
  626. /* --- low level module stuff --- */
  627. static int __init wdm_init(void)
  628. {
  629. int rv;
  630. rv = usb_register(&wdm_driver);
  631. return rv;
  632. }
  633. static void __exit wdm_exit(void)
  634. {
  635. usb_deregister(&wdm_driver);
  636. }
  637. module_init(wdm_init);
  638. module_exit(wdm_exit);
  639. MODULE_AUTHOR(DRIVER_AUTHOR);
  640. MODULE_DESCRIPTION(DRIVER_DESC);
  641. MODULE_LICENSE("GPL");