cdc-wdm.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * cdc-wdm.c
  4. *
  5. * This driver supports USB CDC WCM Device Management.
  6. *
  7. * Copyright (c) 2007-2009 Oliver Neukum
  8. *
  9. * Some code taken from cdc-acm.c
  10. *
  11. * Released under the GPLv2.
  12. *
  13. * Many thanks to Carl Nordbeck
  14. */
  15. #include <linux/kernel.h>
  16. #include <linux/errno.h>
  17. #include <linux/ioctl.h>
  18. #include <linux/slab.h>
  19. #include <linux/module.h>
  20. #include <linux/mutex.h>
  21. #include <linux/uaccess.h>
  22. #include <linux/bitops.h>
  23. #include <linux/poll.h>
  24. #include <linux/skbuff.h>
  25. #include <linux/usb.h>
  26. #include <linux/usb/cdc.h>
  27. #include <linux/wwan.h>
  28. #include <asm/byteorder.h>
  29. #include <asm/unaligned.h>
  30. #include <linux/usb/cdc-wdm.h>
  31. #define DRIVER_AUTHOR "Oliver Neukum"
  32. #define DRIVER_DESC "USB Abstract Control Model driver for USB WCM Device Management"
  33. static const 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. MODULE_DEVICE_TABLE (usb, wdm_ids);
  43. #define WDM_MINOR_BASE 176
  44. #define WDM_IN_USE 1
  45. #define WDM_DISCONNECTING 2
  46. #define WDM_RESULT 3
  47. #define WDM_READ 4
  48. #define WDM_INT_STALL 5
  49. #define WDM_POLL_RUNNING 6
  50. #define WDM_RESPONDING 7
  51. #define WDM_SUSPENDING 8
  52. #define WDM_RESETTING 9
  53. #define WDM_OVERFLOW 10
  54. #define WDM_WWAN_IN_USE 11
  55. #define WDM_MAX 16
  56. /* we cannot wait forever at flush() */
  57. #define WDM_FLUSH_TIMEOUT (30 * HZ)
  58. /* CDC-WMC r1.1 requires wMaxCommand to be "at least 256 decimal (0x100)" */
  59. #define WDM_DEFAULT_BUFSIZE 256
  60. static DEFINE_MUTEX(wdm_mutex);
  61. static DEFINE_SPINLOCK(wdm_device_list_lock);
  62. static LIST_HEAD(wdm_device_list);
  63. /* --- method tables --- */
  64. struct wdm_device {
  65. u8 *inbuf; /* buffer for response */
  66. u8 *outbuf; /* buffer for command */
  67. u8 *sbuf; /* buffer for status */
  68. u8 *ubuf; /* buffer for copy to user space */
  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. unsigned long flags;
  77. u16 bufsize;
  78. u16 wMaxCommand;
  79. u16 wMaxPacketSize;
  80. __le16 inum;
  81. int reslength;
  82. int length;
  83. int read;
  84. int count;
  85. dma_addr_t shandle;
  86. dma_addr_t ihandle;
  87. struct mutex wlock;
  88. struct mutex rlock;
  89. wait_queue_head_t wait;
  90. struct work_struct rxwork;
  91. struct work_struct service_outs_intr;
  92. int werr;
  93. int rerr;
  94. int resp_count;
  95. struct list_head device_list;
  96. int (*manage_power)(struct usb_interface *, int);
  97. enum wwan_port_type wwanp_type;
  98. struct wwan_port *wwanp;
  99. };
  100. static struct usb_driver wdm_driver;
  101. /* return intfdata if we own the interface, else look up intf in the list */
  102. static struct wdm_device *wdm_find_device(struct usb_interface *intf)
  103. {
  104. struct wdm_device *desc;
  105. spin_lock(&wdm_device_list_lock);
  106. list_for_each_entry(desc, &wdm_device_list, device_list)
  107. if (desc->intf == intf)
  108. goto found;
  109. desc = NULL;
  110. found:
  111. spin_unlock(&wdm_device_list_lock);
  112. return desc;
  113. }
  114. static struct wdm_device *wdm_find_device_by_minor(int minor)
  115. {
  116. struct wdm_device *desc;
  117. spin_lock(&wdm_device_list_lock);
  118. list_for_each_entry(desc, &wdm_device_list, device_list)
  119. if (desc->intf->minor == minor)
  120. goto found;
  121. desc = NULL;
  122. found:
  123. spin_unlock(&wdm_device_list_lock);
  124. return desc;
  125. }
  126. /* --- callbacks --- */
  127. static void wdm_out_callback(struct urb *urb)
  128. {
  129. struct wdm_device *desc;
  130. unsigned long flags;
  131. desc = urb->context;
  132. spin_lock_irqsave(&desc->iuspin, flags);
  133. desc->werr = urb->status;
  134. spin_unlock_irqrestore(&desc->iuspin, flags);
  135. kfree(desc->outbuf);
  136. desc->outbuf = NULL;
  137. clear_bit(WDM_IN_USE, &desc->flags);
  138. wake_up_all(&desc->wait);
  139. }
  140. static void wdm_wwan_rx(struct wdm_device *desc, int length);
  141. static void wdm_in_callback(struct urb *urb)
  142. {
  143. unsigned long flags;
  144. struct wdm_device *desc = urb->context;
  145. int status = urb->status;
  146. int length = urb->actual_length;
  147. spin_lock_irqsave(&desc->iuspin, flags);
  148. clear_bit(WDM_RESPONDING, &desc->flags);
  149. if (status) {
  150. switch (status) {
  151. case -ENOENT:
  152. dev_dbg(&desc->intf->dev,
  153. "nonzero urb status received: -ENOENT\n");
  154. goto skip_error;
  155. case -ECONNRESET:
  156. dev_dbg(&desc->intf->dev,
  157. "nonzero urb status received: -ECONNRESET\n");
  158. goto skip_error;
  159. case -ESHUTDOWN:
  160. dev_dbg(&desc->intf->dev,
  161. "nonzero urb status received: -ESHUTDOWN\n");
  162. goto skip_error;
  163. case -EPIPE:
  164. dev_err(&desc->intf->dev,
  165. "nonzero urb status received: -EPIPE\n");
  166. break;
  167. default:
  168. dev_err(&desc->intf->dev,
  169. "Unexpected error %d\n", status);
  170. break;
  171. }
  172. }
  173. if (test_bit(WDM_WWAN_IN_USE, &desc->flags)) {
  174. wdm_wwan_rx(desc, length);
  175. goto out;
  176. }
  177. /*
  178. * only set a new error if there is no previous error.
  179. * Errors are only cleared during read/open
  180. * Avoid propagating -EPIPE (stall) to userspace since it is
  181. * better handled as an empty read
  182. */
  183. if (desc->rerr == 0 && status != -EPIPE)
  184. desc->rerr = status;
  185. if (length + desc->length > desc->wMaxCommand) {
  186. /* The buffer would overflow */
  187. set_bit(WDM_OVERFLOW, &desc->flags);
  188. } else {
  189. /* we may already be in overflow */
  190. if (!test_bit(WDM_OVERFLOW, &desc->flags)) {
  191. memmove(desc->ubuf + desc->length, desc->inbuf, length);
  192. desc->length += length;
  193. desc->reslength = length;
  194. }
  195. }
  196. skip_error:
  197. if (desc->rerr) {
  198. /*
  199. * Since there was an error, userspace may decide to not read
  200. * any data after poll'ing.
  201. * We should respond to further attempts from the device to send
  202. * data, so that we can get unstuck.
  203. */
  204. schedule_work(&desc->service_outs_intr);
  205. } else {
  206. set_bit(WDM_READ, &desc->flags);
  207. wake_up(&desc->wait);
  208. }
  209. out:
  210. spin_unlock_irqrestore(&desc->iuspin, flags);
  211. }
  212. static void wdm_int_callback(struct urb *urb)
  213. {
  214. unsigned long flags;
  215. int rv = 0;
  216. int responding;
  217. int status = urb->status;
  218. struct wdm_device *desc;
  219. struct usb_cdc_notification *dr;
  220. desc = urb->context;
  221. dr = (struct usb_cdc_notification *)desc->sbuf;
  222. if (status) {
  223. switch (status) {
  224. case -ESHUTDOWN:
  225. case -ENOENT:
  226. case -ECONNRESET:
  227. return; /* unplug */
  228. case -EPIPE:
  229. set_bit(WDM_INT_STALL, &desc->flags);
  230. dev_err(&desc->intf->dev, "Stall on int endpoint\n");
  231. goto sw; /* halt is cleared in work */
  232. default:
  233. dev_err(&desc->intf->dev,
  234. "nonzero urb status received: %d\n", status);
  235. break;
  236. }
  237. }
  238. if (urb->actual_length < sizeof(struct usb_cdc_notification)) {
  239. dev_err(&desc->intf->dev, "wdm_int_callback - %d bytes\n",
  240. urb->actual_length);
  241. goto exit;
  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\n",
  247. le16_to_cpu(dr->wIndex), le16_to_cpu(dr->wLength));
  248. break;
  249. case USB_CDC_NOTIFY_NETWORK_CONNECTION:
  250. dev_dbg(&desc->intf->dev,
  251. "NOTIFY_NETWORK_CONNECTION %s network\n",
  252. dr->wValue ? "connected to" : "disconnected from");
  253. goto exit;
  254. case USB_CDC_NOTIFY_SPEED_CHANGE:
  255. dev_dbg(&desc->intf->dev, "SPEED_CHANGE received (len %u)\n",
  256. urb->actual_length);
  257. goto exit;
  258. default:
  259. clear_bit(WDM_POLL_RUNNING, &desc->flags);
  260. dev_err(&desc->intf->dev,
  261. "unknown notification %d received: index %d len %d\n",
  262. dr->bNotificationType,
  263. le16_to_cpu(dr->wIndex),
  264. le16_to_cpu(dr->wLength));
  265. goto exit;
  266. }
  267. spin_lock_irqsave(&desc->iuspin, flags);
  268. responding = test_and_set_bit(WDM_RESPONDING, &desc->flags);
  269. if (!desc->resp_count++ && !responding
  270. && !test_bit(WDM_DISCONNECTING, &desc->flags)
  271. && !test_bit(WDM_SUSPENDING, &desc->flags)) {
  272. rv = usb_submit_urb(desc->response, GFP_ATOMIC);
  273. dev_dbg(&desc->intf->dev, "submit response URB %d\n", rv);
  274. }
  275. spin_unlock_irqrestore(&desc->iuspin, flags);
  276. if (rv < 0) {
  277. clear_bit(WDM_RESPONDING, &desc->flags);
  278. if (rv == -EPERM)
  279. return;
  280. if (rv == -ENOMEM) {
  281. sw:
  282. rv = schedule_work(&desc->rxwork);
  283. if (rv)
  284. dev_err(&desc->intf->dev,
  285. "Cannot schedule work\n");
  286. }
  287. }
  288. exit:
  289. rv = usb_submit_urb(urb, GFP_ATOMIC);
  290. if (rv)
  291. dev_err(&desc->intf->dev,
  292. "%s - usb_submit_urb failed with result %d\n",
  293. __func__, rv);
  294. }
  295. static void poison_urbs(struct wdm_device *desc)
  296. {
  297. /* the order here is essential */
  298. usb_poison_urb(desc->command);
  299. usb_poison_urb(desc->validity);
  300. usb_poison_urb(desc->response);
  301. }
  302. static void unpoison_urbs(struct wdm_device *desc)
  303. {
  304. /*
  305. * the order here is not essential
  306. * it is symmetrical just to be nice
  307. */
  308. usb_unpoison_urb(desc->response);
  309. usb_unpoison_urb(desc->validity);
  310. usb_unpoison_urb(desc->command);
  311. }
  312. static void free_urbs(struct wdm_device *desc)
  313. {
  314. usb_free_urb(desc->validity);
  315. usb_free_urb(desc->response);
  316. usb_free_urb(desc->command);
  317. }
  318. static void cleanup(struct wdm_device *desc)
  319. {
  320. kfree(desc->sbuf);
  321. kfree(desc->inbuf);
  322. kfree(desc->orq);
  323. kfree(desc->irq);
  324. kfree(desc->ubuf);
  325. free_urbs(desc);
  326. kfree(desc);
  327. }
  328. static ssize_t wdm_write
  329. (struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
  330. {
  331. u8 *buf;
  332. int rv = -EMSGSIZE, r, we;
  333. struct wdm_device *desc = file->private_data;
  334. struct usb_ctrlrequest *req;
  335. if (count > desc->wMaxCommand)
  336. count = desc->wMaxCommand;
  337. spin_lock_irq(&desc->iuspin);
  338. we = desc->werr;
  339. desc->werr = 0;
  340. spin_unlock_irq(&desc->iuspin);
  341. if (we < 0)
  342. return usb_translate_errors(we);
  343. buf = memdup_user(buffer, count);
  344. if (IS_ERR(buf))
  345. return PTR_ERR(buf);
  346. /* concurrent writes and disconnect */
  347. r = mutex_lock_interruptible(&desc->wlock);
  348. rv = -ERESTARTSYS;
  349. if (r)
  350. goto out_free_mem;
  351. if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
  352. rv = -ENODEV;
  353. goto out_free_mem_lock;
  354. }
  355. r = usb_autopm_get_interface(desc->intf);
  356. if (r < 0) {
  357. rv = usb_translate_errors(r);
  358. goto out_free_mem_lock;
  359. }
  360. if (!(file->f_flags & O_NONBLOCK))
  361. r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE,
  362. &desc->flags));
  363. else
  364. if (test_bit(WDM_IN_USE, &desc->flags))
  365. r = -EAGAIN;
  366. if (test_bit(WDM_RESETTING, &desc->flags))
  367. r = -EIO;
  368. if (test_bit(WDM_DISCONNECTING, &desc->flags))
  369. r = -ENODEV;
  370. if (r < 0) {
  371. rv = r;
  372. goto out_free_mem_pm;
  373. }
  374. req = desc->orq;
  375. usb_fill_control_urb(
  376. desc->command,
  377. interface_to_usbdev(desc->intf),
  378. /* using common endpoint 0 */
  379. usb_sndctrlpipe(interface_to_usbdev(desc->intf), 0),
  380. (unsigned char *)req,
  381. buf,
  382. count,
  383. wdm_out_callback,
  384. desc
  385. );
  386. req->bRequestType = (USB_DIR_OUT | USB_TYPE_CLASS |
  387. USB_RECIP_INTERFACE);
  388. req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
  389. req->wValue = 0;
  390. req->wIndex = desc->inum; /* already converted */
  391. req->wLength = cpu_to_le16(count);
  392. set_bit(WDM_IN_USE, &desc->flags);
  393. desc->outbuf = buf;
  394. rv = usb_submit_urb(desc->command, GFP_KERNEL);
  395. if (rv < 0) {
  396. desc->outbuf = NULL;
  397. clear_bit(WDM_IN_USE, &desc->flags);
  398. wake_up_all(&desc->wait); /* for wdm_wait_for_response() */
  399. dev_err(&desc->intf->dev, "Tx URB error: %d\n", rv);
  400. rv = usb_translate_errors(rv);
  401. goto out_free_mem_pm;
  402. } else {
  403. dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d\n",
  404. le16_to_cpu(req->wIndex));
  405. }
  406. usb_autopm_put_interface(desc->intf);
  407. mutex_unlock(&desc->wlock);
  408. return count;
  409. out_free_mem_pm:
  410. usb_autopm_put_interface(desc->intf);
  411. out_free_mem_lock:
  412. mutex_unlock(&desc->wlock);
  413. out_free_mem:
  414. kfree(buf);
  415. return rv;
  416. }
  417. /*
  418. * Submit the read urb if resp_count is non-zero.
  419. *
  420. * Called with desc->iuspin locked
  421. */
  422. static int service_outstanding_interrupt(struct wdm_device *desc)
  423. {
  424. int rv = 0;
  425. /* submit read urb only if the device is waiting for it */
  426. if (!desc->resp_count || !--desc->resp_count)
  427. goto out;
  428. if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
  429. rv = -ENODEV;
  430. goto out;
  431. }
  432. if (test_bit(WDM_RESETTING, &desc->flags)) {
  433. rv = -EIO;
  434. goto out;
  435. }
  436. set_bit(WDM_RESPONDING, &desc->flags);
  437. spin_unlock_irq(&desc->iuspin);
  438. rv = usb_submit_urb(desc->response, GFP_KERNEL);
  439. spin_lock_irq(&desc->iuspin);
  440. if (rv) {
  441. if (!test_bit(WDM_DISCONNECTING, &desc->flags))
  442. dev_err(&desc->intf->dev,
  443. "usb_submit_urb failed with result %d\n", rv);
  444. /* make sure the next notification trigger a submit */
  445. clear_bit(WDM_RESPONDING, &desc->flags);
  446. desc->resp_count = 0;
  447. }
  448. out:
  449. return rv;
  450. }
  451. static ssize_t wdm_read
  452. (struct file *file, char __user *buffer, size_t count, loff_t *ppos)
  453. {
  454. int rv, cntr;
  455. int i = 0;
  456. struct wdm_device *desc = file->private_data;
  457. rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */
  458. if (rv < 0)
  459. return -ERESTARTSYS;
  460. cntr = READ_ONCE(desc->length);
  461. if (cntr == 0) {
  462. desc->read = 0;
  463. retry:
  464. if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
  465. rv = -ENODEV;
  466. goto err;
  467. }
  468. if (test_bit(WDM_OVERFLOW, &desc->flags)) {
  469. clear_bit(WDM_OVERFLOW, &desc->flags);
  470. rv = -ENOBUFS;
  471. goto err;
  472. }
  473. i++;
  474. if (file->f_flags & O_NONBLOCK) {
  475. if (!test_bit(WDM_READ, &desc->flags)) {
  476. rv = -EAGAIN;
  477. goto err;
  478. }
  479. rv = 0;
  480. } else {
  481. rv = wait_event_interruptible(desc->wait,
  482. test_bit(WDM_READ, &desc->flags));
  483. }
  484. /* may have happened while we slept */
  485. if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
  486. rv = -ENODEV;
  487. goto err;
  488. }
  489. if (test_bit(WDM_RESETTING, &desc->flags)) {
  490. rv = -EIO;
  491. goto err;
  492. }
  493. usb_mark_last_busy(interface_to_usbdev(desc->intf));
  494. if (rv < 0) {
  495. rv = -ERESTARTSYS;
  496. goto err;
  497. }
  498. spin_lock_irq(&desc->iuspin);
  499. if (desc->rerr) { /* read completed, error happened */
  500. rv = usb_translate_errors(desc->rerr);
  501. desc->rerr = 0;
  502. spin_unlock_irq(&desc->iuspin);
  503. goto err;
  504. }
  505. /*
  506. * recheck whether we've lost the race
  507. * against the completion handler
  508. */
  509. if (!test_bit(WDM_READ, &desc->flags)) { /* lost race */
  510. spin_unlock_irq(&desc->iuspin);
  511. goto retry;
  512. }
  513. if (!desc->reslength) { /* zero length read */
  514. dev_dbg(&desc->intf->dev, "zero length - clearing WDM_READ\n");
  515. clear_bit(WDM_READ, &desc->flags);
  516. rv = service_outstanding_interrupt(desc);
  517. spin_unlock_irq(&desc->iuspin);
  518. if (rv < 0)
  519. goto err;
  520. goto retry;
  521. }
  522. cntr = desc->length;
  523. spin_unlock_irq(&desc->iuspin);
  524. }
  525. if (cntr > count)
  526. cntr = count;
  527. rv = copy_to_user(buffer, desc->ubuf, cntr);
  528. if (rv > 0) {
  529. rv = -EFAULT;
  530. goto err;
  531. }
  532. spin_lock_irq(&desc->iuspin);
  533. for (i = 0; i < desc->length - cntr; i++)
  534. desc->ubuf[i] = desc->ubuf[i + cntr];
  535. desc->length -= cntr;
  536. /* in case we had outstanding data */
  537. if (!desc->length) {
  538. clear_bit(WDM_READ, &desc->flags);
  539. service_outstanding_interrupt(desc);
  540. }
  541. spin_unlock_irq(&desc->iuspin);
  542. rv = cntr;
  543. err:
  544. mutex_unlock(&desc->rlock);
  545. return rv;
  546. }
  547. static int wdm_wait_for_response(struct file *file, long timeout)
  548. {
  549. struct wdm_device *desc = file->private_data;
  550. long rv; /* Use long here because (int) MAX_SCHEDULE_TIMEOUT < 0. */
  551. /*
  552. * Needs both flags. We cannot do with one because resetting it would
  553. * cause a race with write() yet we need to signal a disconnect.
  554. */
  555. rv = wait_event_interruptible_timeout(desc->wait,
  556. !test_bit(WDM_IN_USE, &desc->flags) ||
  557. test_bit(WDM_DISCONNECTING, &desc->flags),
  558. timeout);
  559. /*
  560. * To report the correct error. This is best effort.
  561. * We are inevitably racing with the hardware.
  562. */
  563. if (test_bit(WDM_DISCONNECTING, &desc->flags))
  564. return -ENODEV;
  565. if (!rv)
  566. return -EIO;
  567. if (rv < 0)
  568. return -EINTR;
  569. spin_lock_irq(&desc->iuspin);
  570. rv = desc->werr;
  571. desc->werr = 0;
  572. spin_unlock_irq(&desc->iuspin);
  573. return usb_translate_errors(rv);
  574. }
  575. /*
  576. * You need to send a signal when you react to malicious or defective hardware.
  577. * Also, don't abort when fsync() returned -EINVAL, for older kernels which do
  578. * not implement wdm_flush() will return -EINVAL.
  579. */
  580. static int wdm_fsync(struct file *file, loff_t start, loff_t end, int datasync)
  581. {
  582. return wdm_wait_for_response(file, MAX_SCHEDULE_TIMEOUT);
  583. }
  584. /*
  585. * Same with wdm_fsync(), except it uses finite timeout in order to react to
  586. * malicious or defective hardware which ceased communication after close() was
  587. * implicitly called due to process termination.
  588. */
  589. static int wdm_flush(struct file *file, fl_owner_t id)
  590. {
  591. return wdm_wait_for_response(file, WDM_FLUSH_TIMEOUT);
  592. }
  593. static __poll_t wdm_poll(struct file *file, struct poll_table_struct *wait)
  594. {
  595. struct wdm_device *desc = file->private_data;
  596. unsigned long flags;
  597. __poll_t mask = 0;
  598. spin_lock_irqsave(&desc->iuspin, flags);
  599. if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
  600. mask = EPOLLHUP | EPOLLERR;
  601. spin_unlock_irqrestore(&desc->iuspin, flags);
  602. goto desc_out;
  603. }
  604. if (test_bit(WDM_READ, &desc->flags))
  605. mask = EPOLLIN | EPOLLRDNORM;
  606. if (desc->rerr || desc->werr)
  607. mask |= EPOLLERR;
  608. if (!test_bit(WDM_IN_USE, &desc->flags))
  609. mask |= EPOLLOUT | EPOLLWRNORM;
  610. spin_unlock_irqrestore(&desc->iuspin, flags);
  611. poll_wait(file, &desc->wait, wait);
  612. desc_out:
  613. return mask;
  614. }
  615. static int wdm_open(struct inode *inode, struct file *file)
  616. {
  617. int minor = iminor(inode);
  618. int rv = -ENODEV;
  619. struct usb_interface *intf;
  620. struct wdm_device *desc;
  621. mutex_lock(&wdm_mutex);
  622. desc = wdm_find_device_by_minor(minor);
  623. if (!desc)
  624. goto out;
  625. intf = desc->intf;
  626. if (test_bit(WDM_DISCONNECTING, &desc->flags))
  627. goto out;
  628. file->private_data = desc;
  629. if (test_bit(WDM_WWAN_IN_USE, &desc->flags)) {
  630. rv = -EBUSY;
  631. goto out;
  632. }
  633. rv = usb_autopm_get_interface(desc->intf);
  634. if (rv < 0) {
  635. dev_err(&desc->intf->dev, "Error autopm - %d\n", rv);
  636. goto out;
  637. }
  638. /* using write lock to protect desc->count */
  639. mutex_lock(&desc->wlock);
  640. if (!desc->count++) {
  641. desc->werr = 0;
  642. desc->rerr = 0;
  643. rv = usb_submit_urb(desc->validity, GFP_KERNEL);
  644. if (rv < 0) {
  645. desc->count--;
  646. dev_err(&desc->intf->dev,
  647. "Error submitting int urb - %d\n", rv);
  648. rv = usb_translate_errors(rv);
  649. }
  650. } else {
  651. rv = 0;
  652. }
  653. mutex_unlock(&desc->wlock);
  654. if (desc->count == 1)
  655. desc->manage_power(intf, 1);
  656. usb_autopm_put_interface(desc->intf);
  657. out:
  658. mutex_unlock(&wdm_mutex);
  659. return rv;
  660. }
  661. static int wdm_release(struct inode *inode, struct file *file)
  662. {
  663. struct wdm_device *desc = file->private_data;
  664. mutex_lock(&wdm_mutex);
  665. /* using write lock to protect desc->count */
  666. mutex_lock(&desc->wlock);
  667. desc->count--;
  668. mutex_unlock(&desc->wlock);
  669. if (!desc->count) {
  670. if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
  671. dev_dbg(&desc->intf->dev, "wdm_release: cleanup\n");
  672. poison_urbs(desc);
  673. spin_lock_irq(&desc->iuspin);
  674. desc->resp_count = 0;
  675. clear_bit(WDM_RESPONDING, &desc->flags);
  676. spin_unlock_irq(&desc->iuspin);
  677. desc->manage_power(desc->intf, 0);
  678. unpoison_urbs(desc);
  679. } else {
  680. /* must avoid dev_printk here as desc->intf is invalid */
  681. pr_debug(KBUILD_MODNAME " %s: device gone - cleaning up\n", __func__);
  682. cleanup(desc);
  683. }
  684. }
  685. mutex_unlock(&wdm_mutex);
  686. return 0;
  687. }
  688. static long wdm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  689. {
  690. struct wdm_device *desc = file->private_data;
  691. int rv = 0;
  692. switch (cmd) {
  693. case IOCTL_WDM_MAX_COMMAND:
  694. if (copy_to_user((void __user *)arg, &desc->wMaxCommand, sizeof(desc->wMaxCommand)))
  695. rv = -EFAULT;
  696. break;
  697. default:
  698. rv = -ENOTTY;
  699. }
  700. return rv;
  701. }
  702. static const struct file_operations wdm_fops = {
  703. .owner = THIS_MODULE,
  704. .read = wdm_read,
  705. .write = wdm_write,
  706. .fsync = wdm_fsync,
  707. .open = wdm_open,
  708. .flush = wdm_flush,
  709. .release = wdm_release,
  710. .poll = wdm_poll,
  711. .unlocked_ioctl = wdm_ioctl,
  712. .compat_ioctl = compat_ptr_ioctl,
  713. .llseek = noop_llseek,
  714. };
  715. static struct usb_class_driver wdm_class = {
  716. .name = "cdc-wdm%d",
  717. .fops = &wdm_fops,
  718. .minor_base = WDM_MINOR_BASE,
  719. };
  720. /* --- WWAN framework integration --- */
  721. #ifdef CONFIG_WWAN
  722. static int wdm_wwan_port_start(struct wwan_port *port)
  723. {
  724. struct wdm_device *desc = wwan_port_get_drvdata(port);
  725. /* The interface is both exposed via the WWAN framework and as a
  726. * legacy usbmisc chardev. If chardev is already open, just fail
  727. * to prevent concurrent usage. Otherwise, switch to WWAN mode.
  728. */
  729. mutex_lock(&wdm_mutex);
  730. if (desc->count) {
  731. mutex_unlock(&wdm_mutex);
  732. return -EBUSY;
  733. }
  734. set_bit(WDM_WWAN_IN_USE, &desc->flags);
  735. mutex_unlock(&wdm_mutex);
  736. desc->manage_power(desc->intf, 1);
  737. /* tx is allowed */
  738. wwan_port_txon(port);
  739. /* Start getting events */
  740. return usb_submit_urb(desc->validity, GFP_KERNEL);
  741. }
  742. static void wdm_wwan_port_stop(struct wwan_port *port)
  743. {
  744. struct wdm_device *desc = wwan_port_get_drvdata(port);
  745. /* Stop all transfers and disable WWAN mode */
  746. poison_urbs(desc);
  747. desc->manage_power(desc->intf, 0);
  748. clear_bit(WDM_READ, &desc->flags);
  749. clear_bit(WDM_WWAN_IN_USE, &desc->flags);
  750. unpoison_urbs(desc);
  751. }
  752. static void wdm_wwan_port_tx_complete(struct urb *urb)
  753. {
  754. struct sk_buff *skb = urb->context;
  755. struct wdm_device *desc = skb_shinfo(skb)->destructor_arg;
  756. usb_autopm_put_interface(desc->intf);
  757. wwan_port_txon(desc->wwanp);
  758. kfree_skb(skb);
  759. }
  760. static int wdm_wwan_port_tx(struct wwan_port *port, struct sk_buff *skb)
  761. {
  762. struct wdm_device *desc = wwan_port_get_drvdata(port);
  763. struct usb_interface *intf = desc->intf;
  764. struct usb_ctrlrequest *req = desc->orq;
  765. int rv;
  766. rv = usb_autopm_get_interface(intf);
  767. if (rv)
  768. return rv;
  769. usb_fill_control_urb(
  770. desc->command,
  771. interface_to_usbdev(intf),
  772. usb_sndctrlpipe(interface_to_usbdev(intf), 0),
  773. (unsigned char *)req,
  774. skb->data,
  775. skb->len,
  776. wdm_wwan_port_tx_complete,
  777. skb
  778. );
  779. req->bRequestType = (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
  780. req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
  781. req->wValue = 0;
  782. req->wIndex = desc->inum;
  783. req->wLength = cpu_to_le16(skb->len);
  784. skb_shinfo(skb)->destructor_arg = desc;
  785. rv = usb_submit_urb(desc->command, GFP_KERNEL);
  786. if (rv)
  787. usb_autopm_put_interface(intf);
  788. else /* One transfer at a time, stop TX until URB completion */
  789. wwan_port_txoff(port);
  790. return rv;
  791. }
  792. static const struct wwan_port_ops wdm_wwan_port_ops = {
  793. .start = wdm_wwan_port_start,
  794. .stop = wdm_wwan_port_stop,
  795. .tx = wdm_wwan_port_tx,
  796. };
  797. static void wdm_wwan_init(struct wdm_device *desc)
  798. {
  799. struct usb_interface *intf = desc->intf;
  800. struct wwan_port *port;
  801. /* Only register to WWAN core if protocol/type is known */
  802. if (desc->wwanp_type == WWAN_PORT_UNKNOWN) {
  803. dev_info(&intf->dev, "Unknown control protocol\n");
  804. return;
  805. }
  806. port = wwan_create_port(&intf->dev, desc->wwanp_type, &wdm_wwan_port_ops, desc);
  807. if (IS_ERR(port)) {
  808. dev_err(&intf->dev, "%s: Unable to create WWAN port\n",
  809. dev_name(intf->usb_dev));
  810. return;
  811. }
  812. desc->wwanp = port;
  813. }
  814. static void wdm_wwan_deinit(struct wdm_device *desc)
  815. {
  816. if (!desc->wwanp)
  817. return;
  818. wwan_remove_port(desc->wwanp);
  819. desc->wwanp = NULL;
  820. }
  821. static void wdm_wwan_rx(struct wdm_device *desc, int length)
  822. {
  823. struct wwan_port *port = desc->wwanp;
  824. struct sk_buff *skb;
  825. /* Forward data to WWAN port */
  826. skb = alloc_skb(length, GFP_ATOMIC);
  827. if (!skb)
  828. return;
  829. skb_put_data(skb, desc->inbuf, length);
  830. wwan_port_rx(port, skb);
  831. /* inbuf has been copied, it is safe to check for outstanding data */
  832. schedule_work(&desc->service_outs_intr);
  833. }
  834. #else /* CONFIG_WWAN */
  835. static void wdm_wwan_init(struct wdm_device *desc) {}
  836. static void wdm_wwan_deinit(struct wdm_device *desc) {}
  837. static void wdm_wwan_rx(struct wdm_device *desc, int length) {}
  838. #endif /* CONFIG_WWAN */
  839. /* --- error handling --- */
  840. static void wdm_rxwork(struct work_struct *work)
  841. {
  842. struct wdm_device *desc = container_of(work, struct wdm_device, rxwork);
  843. unsigned long flags;
  844. int rv = 0;
  845. int responding;
  846. spin_lock_irqsave(&desc->iuspin, flags);
  847. if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
  848. spin_unlock_irqrestore(&desc->iuspin, flags);
  849. } else {
  850. responding = test_and_set_bit(WDM_RESPONDING, &desc->flags);
  851. spin_unlock_irqrestore(&desc->iuspin, flags);
  852. if (!responding)
  853. rv = usb_submit_urb(desc->response, GFP_KERNEL);
  854. if (rv < 0 && rv != -EPERM) {
  855. spin_lock_irqsave(&desc->iuspin, flags);
  856. clear_bit(WDM_RESPONDING, &desc->flags);
  857. if (!test_bit(WDM_DISCONNECTING, &desc->flags))
  858. schedule_work(&desc->rxwork);
  859. spin_unlock_irqrestore(&desc->iuspin, flags);
  860. }
  861. }
  862. }
  863. static void service_interrupt_work(struct work_struct *work)
  864. {
  865. struct wdm_device *desc;
  866. desc = container_of(work, struct wdm_device, service_outs_intr);
  867. spin_lock_irq(&desc->iuspin);
  868. service_outstanding_interrupt(desc);
  869. if (!desc->resp_count) {
  870. set_bit(WDM_READ, &desc->flags);
  871. wake_up(&desc->wait);
  872. }
  873. spin_unlock_irq(&desc->iuspin);
  874. }
  875. /* --- hotplug --- */
  876. static int wdm_create(struct usb_interface *intf, struct usb_endpoint_descriptor *ep,
  877. u16 bufsize, enum wwan_port_type type,
  878. int (*manage_power)(struct usb_interface *, int))
  879. {
  880. int rv = -ENOMEM;
  881. struct wdm_device *desc;
  882. desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL);
  883. if (!desc)
  884. goto out;
  885. INIT_LIST_HEAD(&desc->device_list);
  886. mutex_init(&desc->rlock);
  887. mutex_init(&desc->wlock);
  888. spin_lock_init(&desc->iuspin);
  889. init_waitqueue_head(&desc->wait);
  890. desc->wMaxCommand = bufsize;
  891. /* this will be expanded and needed in hardware endianness */
  892. desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber);
  893. desc->intf = intf;
  894. desc->wwanp_type = type;
  895. INIT_WORK(&desc->rxwork, wdm_rxwork);
  896. INIT_WORK(&desc->service_outs_intr, service_interrupt_work);
  897. if (!usb_endpoint_is_int_in(ep)) {
  898. rv = -EINVAL;
  899. goto err;
  900. }
  901. desc->wMaxPacketSize = usb_endpoint_maxp(ep);
  902. desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
  903. if (!desc->orq)
  904. goto err;
  905. desc->irq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
  906. if (!desc->irq)
  907. goto err;
  908. desc->validity = usb_alloc_urb(0, GFP_KERNEL);
  909. if (!desc->validity)
  910. goto err;
  911. desc->response = usb_alloc_urb(0, GFP_KERNEL);
  912. if (!desc->response)
  913. goto err;
  914. desc->command = usb_alloc_urb(0, GFP_KERNEL);
  915. if (!desc->command)
  916. goto err;
  917. desc->ubuf = kmalloc(desc->wMaxCommand, GFP_KERNEL);
  918. if (!desc->ubuf)
  919. goto err;
  920. desc->sbuf = kmalloc(desc->wMaxPacketSize, GFP_KERNEL);
  921. if (!desc->sbuf)
  922. goto err;
  923. desc->inbuf = kmalloc(desc->wMaxCommand, GFP_KERNEL);
  924. if (!desc->inbuf)
  925. goto err;
  926. usb_fill_int_urb(
  927. desc->validity,
  928. interface_to_usbdev(intf),
  929. usb_rcvintpipe(interface_to_usbdev(intf), ep->bEndpointAddress),
  930. desc->sbuf,
  931. desc->wMaxPacketSize,
  932. wdm_int_callback,
  933. desc,
  934. ep->bInterval
  935. );
  936. desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
  937. desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
  938. desc->irq->wValue = 0;
  939. desc->irq->wIndex = desc->inum; /* already converted */
  940. desc->irq->wLength = cpu_to_le16(desc->wMaxCommand);
  941. usb_fill_control_urb(
  942. desc->response,
  943. interface_to_usbdev(intf),
  944. /* using common endpoint 0 */
  945. usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
  946. (unsigned char *)desc->irq,
  947. desc->inbuf,
  948. desc->wMaxCommand,
  949. wdm_in_callback,
  950. desc
  951. );
  952. desc->manage_power = manage_power;
  953. spin_lock(&wdm_device_list_lock);
  954. list_add(&desc->device_list, &wdm_device_list);
  955. spin_unlock(&wdm_device_list_lock);
  956. rv = usb_register_dev(intf, &wdm_class);
  957. if (rv < 0)
  958. goto err;
  959. else
  960. dev_info(&intf->dev, "%s: USB WDM device\n", dev_name(intf->usb_dev));
  961. wdm_wwan_init(desc);
  962. out:
  963. return rv;
  964. err:
  965. spin_lock(&wdm_device_list_lock);
  966. list_del(&desc->device_list);
  967. spin_unlock(&wdm_device_list_lock);
  968. cleanup(desc);
  969. return rv;
  970. }
  971. static int wdm_manage_power(struct usb_interface *intf, int on)
  972. {
  973. /* need autopm_get/put here to ensure the usbcore sees the new value */
  974. int rv = usb_autopm_get_interface(intf);
  975. intf->needs_remote_wakeup = on;
  976. if (!rv)
  977. usb_autopm_put_interface(intf);
  978. return 0;
  979. }
  980. static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
  981. {
  982. int rv = -EINVAL;
  983. struct usb_host_interface *iface;
  984. struct usb_endpoint_descriptor *ep;
  985. struct usb_cdc_parsed_header hdr;
  986. u8 *buffer = intf->altsetting->extra;
  987. int buflen = intf->altsetting->extralen;
  988. u16 maxcom = WDM_DEFAULT_BUFSIZE;
  989. if (!buffer)
  990. goto err;
  991. cdc_parse_cdc_header(&hdr, intf, buffer, buflen);
  992. if (hdr.usb_cdc_dmm_desc)
  993. maxcom = le16_to_cpu(hdr.usb_cdc_dmm_desc->wMaxCommand);
  994. iface = intf->cur_altsetting;
  995. if (iface->desc.bNumEndpoints != 1)
  996. goto err;
  997. ep = &iface->endpoint[0].desc;
  998. rv = wdm_create(intf, ep, maxcom, WWAN_PORT_UNKNOWN, &wdm_manage_power);
  999. err:
  1000. return rv;
  1001. }
  1002. /**
  1003. * usb_cdc_wdm_register - register a WDM subdriver
  1004. * @intf: usb interface the subdriver will associate with
  1005. * @ep: interrupt endpoint to monitor for notifications
  1006. * @bufsize: maximum message size to support for read/write
  1007. * @type: Type/protocol of the transported data (MBIM, QMI...)
  1008. * @manage_power: call-back invoked during open and release to
  1009. * manage the device's power
  1010. * Create WDM usb class character device and associate it with intf
  1011. * without binding, allowing another driver to manage the interface.
  1012. *
  1013. * The subdriver will manage the given interrupt endpoint exclusively
  1014. * and will issue control requests referring to the given intf. It
  1015. * will otherwise avoid interferring, and in particular not do
  1016. * usb_set_intfdata/usb_get_intfdata on intf.
  1017. *
  1018. * The return value is a pointer to the subdriver's struct usb_driver.
  1019. * The registering driver is responsible for calling this subdriver's
  1020. * disconnect, suspend, resume, pre_reset and post_reset methods from
  1021. * its own.
  1022. */
  1023. struct usb_driver *usb_cdc_wdm_register(struct usb_interface *intf,
  1024. struct usb_endpoint_descriptor *ep,
  1025. int bufsize, enum wwan_port_type type,
  1026. int (*manage_power)(struct usb_interface *, int))
  1027. {
  1028. int rv;
  1029. rv = wdm_create(intf, ep, bufsize, type, manage_power);
  1030. if (rv < 0)
  1031. goto err;
  1032. return &wdm_driver;
  1033. err:
  1034. return ERR_PTR(rv);
  1035. }
  1036. EXPORT_SYMBOL(usb_cdc_wdm_register);
  1037. static void wdm_disconnect(struct usb_interface *intf)
  1038. {
  1039. struct wdm_device *desc;
  1040. unsigned long flags;
  1041. usb_deregister_dev(intf, &wdm_class);
  1042. desc = wdm_find_device(intf);
  1043. mutex_lock(&wdm_mutex);
  1044. wdm_wwan_deinit(desc);
  1045. /* the spinlock makes sure no new urbs are generated in the callbacks */
  1046. spin_lock_irqsave(&desc->iuspin, flags);
  1047. set_bit(WDM_DISCONNECTING, &desc->flags);
  1048. set_bit(WDM_READ, &desc->flags);
  1049. spin_unlock_irqrestore(&desc->iuspin, flags);
  1050. wake_up_all(&desc->wait);
  1051. mutex_lock(&desc->rlock);
  1052. mutex_lock(&desc->wlock);
  1053. poison_urbs(desc);
  1054. cancel_work_sync(&desc->rxwork);
  1055. cancel_work_sync(&desc->service_outs_intr);
  1056. mutex_unlock(&desc->wlock);
  1057. mutex_unlock(&desc->rlock);
  1058. /* the desc->intf pointer used as list key is now invalid */
  1059. spin_lock(&wdm_device_list_lock);
  1060. list_del(&desc->device_list);
  1061. spin_unlock(&wdm_device_list_lock);
  1062. if (!desc->count)
  1063. cleanup(desc);
  1064. else
  1065. dev_dbg(&intf->dev, "%d open files - postponing cleanup\n", desc->count);
  1066. mutex_unlock(&wdm_mutex);
  1067. }
  1068. #ifdef CONFIG_PM
  1069. static int wdm_suspend(struct usb_interface *intf, pm_message_t message)
  1070. {
  1071. struct wdm_device *desc = wdm_find_device(intf);
  1072. int rv = 0;
  1073. dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor);
  1074. /* if this is an autosuspend the caller does the locking */
  1075. if (!PMSG_IS_AUTO(message)) {
  1076. mutex_lock(&desc->rlock);
  1077. mutex_lock(&desc->wlock);
  1078. }
  1079. spin_lock_irq(&desc->iuspin);
  1080. if (PMSG_IS_AUTO(message) &&
  1081. (test_bit(WDM_IN_USE, &desc->flags)
  1082. || test_bit(WDM_RESPONDING, &desc->flags))) {
  1083. spin_unlock_irq(&desc->iuspin);
  1084. rv = -EBUSY;
  1085. } else {
  1086. set_bit(WDM_SUSPENDING, &desc->flags);
  1087. spin_unlock_irq(&desc->iuspin);
  1088. /* callback submits work - order is essential */
  1089. poison_urbs(desc);
  1090. cancel_work_sync(&desc->rxwork);
  1091. cancel_work_sync(&desc->service_outs_intr);
  1092. unpoison_urbs(desc);
  1093. }
  1094. if (!PMSG_IS_AUTO(message)) {
  1095. mutex_unlock(&desc->wlock);
  1096. mutex_unlock(&desc->rlock);
  1097. }
  1098. return rv;
  1099. }
  1100. #endif
  1101. static int recover_from_urb_loss(struct wdm_device *desc)
  1102. {
  1103. int rv = 0;
  1104. if (desc->count) {
  1105. rv = usb_submit_urb(desc->validity, GFP_NOIO);
  1106. if (rv < 0)
  1107. dev_err(&desc->intf->dev,
  1108. "Error resume submitting int urb - %d\n", rv);
  1109. }
  1110. return rv;
  1111. }
  1112. #ifdef CONFIG_PM
  1113. static int wdm_resume(struct usb_interface *intf)
  1114. {
  1115. struct wdm_device *desc = wdm_find_device(intf);
  1116. int rv;
  1117. dev_dbg(&desc->intf->dev, "wdm%d_resume\n", intf->minor);
  1118. clear_bit(WDM_SUSPENDING, &desc->flags);
  1119. rv = recover_from_urb_loss(desc);
  1120. return rv;
  1121. }
  1122. #endif
  1123. static int wdm_pre_reset(struct usb_interface *intf)
  1124. {
  1125. struct wdm_device *desc = wdm_find_device(intf);
  1126. /*
  1127. * we notify everybody using poll of
  1128. * an exceptional situation
  1129. * must be done before recovery lest a spontaneous
  1130. * message from the device is lost
  1131. */
  1132. spin_lock_irq(&desc->iuspin);
  1133. set_bit(WDM_RESETTING, &desc->flags); /* inform read/write */
  1134. set_bit(WDM_READ, &desc->flags); /* unblock read */
  1135. clear_bit(WDM_IN_USE, &desc->flags); /* unblock write */
  1136. desc->rerr = -EINTR;
  1137. spin_unlock_irq(&desc->iuspin);
  1138. wake_up_all(&desc->wait);
  1139. mutex_lock(&desc->rlock);
  1140. mutex_lock(&desc->wlock);
  1141. poison_urbs(desc);
  1142. cancel_work_sync(&desc->rxwork);
  1143. cancel_work_sync(&desc->service_outs_intr);
  1144. return 0;
  1145. }
  1146. static int wdm_post_reset(struct usb_interface *intf)
  1147. {
  1148. struct wdm_device *desc = wdm_find_device(intf);
  1149. int rv;
  1150. unpoison_urbs(desc);
  1151. clear_bit(WDM_OVERFLOW, &desc->flags);
  1152. clear_bit(WDM_RESETTING, &desc->flags);
  1153. rv = recover_from_urb_loss(desc);
  1154. mutex_unlock(&desc->wlock);
  1155. mutex_unlock(&desc->rlock);
  1156. return rv;
  1157. }
  1158. static struct usb_driver wdm_driver = {
  1159. .name = "cdc_wdm",
  1160. .probe = wdm_probe,
  1161. .disconnect = wdm_disconnect,
  1162. #ifdef CONFIG_PM
  1163. .suspend = wdm_suspend,
  1164. .resume = wdm_resume,
  1165. .reset_resume = wdm_resume,
  1166. #endif
  1167. .pre_reset = wdm_pre_reset,
  1168. .post_reset = wdm_post_reset,
  1169. .id_table = wdm_ids,
  1170. .supports_autosuspend = 1,
  1171. .disable_hub_initiated_lpm = 1,
  1172. };
  1173. module_usb_driver(wdm_driver);
  1174. MODULE_AUTHOR(DRIVER_AUTHOR);
  1175. MODULE_DESCRIPTION(DRIVER_DESC);
  1176. MODULE_LICENSE("GPL");