u_sdio.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161
  1. /*
  2. * u_sdio.c - utilities for USB gadget serial over sdio
  3. *
  4. * This code also borrows from drivers/usb/gadget/u_serial.c, which is
  5. * Copyright (C) 2003 Al Borchers (alborchers@steinerpoint.com)
  6. * Copyright (C) 2008 David Brownell
  7. * Copyright (C) 2008 by Nokia Corporation
  8. * Copyright (c) 2011, The Linux Foundation. All rights reserved.
  9. *
  10. * This program from The Linux Foundation is free software; you can
  11. * redistribute it and/or modify it under the GNU General Public License
  12. * version 2 and only version 2 as published by the Free Software Foundation.
  13. * The original work available from [kernel.org] is subject to the notice below.
  14. *
  15. * This software is distributed under the terms of the GNU General
  16. * Public License ("GPL") as published by the Free Software Foundation,
  17. * either version 2 of that License or (at your option) any later version.
  18. *
  19. */
  20. #include <linux/kernel.h>
  21. #include <linux/interrupt.h>
  22. #include <linux/device.h>
  23. #include <linux/delay.h>
  24. #include <linux/slab.h>
  25. #include <linux/termios.h>
  26. #include <linux/debugfs.h>
  27. #include <mach/sdio_al.h>
  28. #include <mach/sdio_cmux.h>
  29. #include "u_serial.h"
  30. #define SDIO_RX_QUEUE_SIZE 8
  31. #define SDIO_RX_BUF_SIZE 2048
  32. #define SDIO_TX_QUEUE_SIZE 8
  33. #define SDIO_TX_BUF_SIZE 2048
  34. /* 1 - DUN, 2-NMEA/GPS */
  35. #define SDIO_N_PORTS 2
  36. static struct sdio_portmaster {
  37. struct mutex lock;
  38. struct gsdio_port *port;
  39. struct platform_driver gsdio_ch;
  40. } sdio_ports[SDIO_N_PORTS];
  41. static unsigned n_sdio_ports;
  42. struct sdio_port_info {
  43. /* data channel info */
  44. char *data_ch_name;
  45. struct sdio_channel *ch;
  46. /* control channel info */
  47. int ctrl_ch_id;
  48. };
  49. struct sdio_port_info sport_info[SDIO_N_PORTS] = {
  50. {
  51. .data_ch_name = "SDIO_DUN",
  52. .ctrl_ch_id = 9,
  53. },
  54. {
  55. .data_ch_name = "SDIO_NMEA",
  56. .ctrl_ch_id = 10,
  57. },
  58. };
  59. static struct workqueue_struct *gsdio_wq;
  60. struct gsdio_port {
  61. unsigned port_num;
  62. spinlock_t port_lock;
  63. unsigned n_read;
  64. struct list_head read_pool;
  65. struct list_head read_queue;
  66. struct work_struct push;
  67. unsigned long rp_len;
  68. unsigned long rq_len;
  69. struct list_head write_pool;
  70. struct work_struct pull;
  71. unsigned long wp_len;
  72. struct work_struct notify_modem;
  73. struct gserial *port_usb;
  74. struct usb_cdc_line_coding line_coding;
  75. int sdio_open;
  76. int sdio_probe;
  77. int ctrl_ch_err;
  78. struct sdio_port_info *sport_info;
  79. struct delayed_work sdio_open_work;
  80. #define SDIO_ACM_CTRL_RI (1 << 3)
  81. #define SDIO_ACM_CTRL_DSR (1 << 1)
  82. #define SDIO_ACM_CTRL_DCD (1 << 0)
  83. int cbits_to_laptop;
  84. #define SDIO_ACM_CTRL_RTS (1 << 1) /* unused with full duplex */
  85. #define SDIO_ACM_CTRL_DTR (1 << 0) /* host is ready for data r/w */
  86. int cbits_to_modem;
  87. /* pkt logging */
  88. unsigned long nbytes_tolaptop;
  89. unsigned long nbytes_tomodem;
  90. };
  91. void gsdio_free_req(struct usb_ep *ep, struct usb_request *req)
  92. {
  93. kfree(req->buf);
  94. usb_ep_free_request(ep, req);
  95. }
  96. struct usb_request *
  97. gsdio_alloc_req(struct usb_ep *ep, unsigned len, gfp_t flags)
  98. {
  99. struct usb_request *req;
  100. req = usb_ep_alloc_request(ep, flags);
  101. if (!req) {
  102. pr_err("%s: usb alloc request failed\n", __func__);
  103. return NULL;
  104. }
  105. req->length = len;
  106. req->buf = kmalloc(len, flags);
  107. if (!req->buf) {
  108. pr_err("%s: request buf allocation failed\n", __func__);
  109. usb_ep_free_request(ep, req);
  110. return NULL;
  111. }
  112. return req;
  113. }
  114. void gsdio_free_requests(struct usb_ep *ep, struct list_head *head)
  115. {
  116. struct usb_request *req;
  117. while (!list_empty(head)) {
  118. req = list_entry(head->next, struct usb_request, list);
  119. list_del(&req->list);
  120. gsdio_free_req(ep, req);
  121. }
  122. }
  123. int gsdio_alloc_requests(struct usb_ep *ep, struct list_head *head,
  124. int num, int size,
  125. void (*cb)(struct usb_ep *ep, struct usb_request *))
  126. {
  127. int i;
  128. struct usb_request *req;
  129. pr_debug("%s: ep:%pK head:%pK num:%d size:%d cb:%pK", __func__,
  130. ep, head, num, size, cb);
  131. for (i = 0; i < num; i++) {
  132. req = gsdio_alloc_req(ep, size, GFP_ATOMIC);
  133. if (!req) {
  134. pr_debug("%s: req allocated:%d\n", __func__, i);
  135. return list_empty(head) ? -ENOMEM : 0;
  136. }
  137. req->complete = cb;
  138. list_add(&req->list, head);
  139. }
  140. return 0;
  141. }
  142. void gsdio_start_rx(struct gsdio_port *port)
  143. {
  144. struct list_head *pool;
  145. struct usb_ep *out;
  146. int ret;
  147. if (!port) {
  148. pr_err("%s: port is null\n", __func__);
  149. return;
  150. }
  151. pr_debug("%s: port:%pK port#%d\n", __func__, port, port->port_num);
  152. spin_lock_irq(&port->port_lock);
  153. if (!port->port_usb) {
  154. pr_debug("%s: usb is disconnected\n", __func__);
  155. goto start_rx_end;
  156. }
  157. if (!port->sdio_open) {
  158. pr_debug("%s: sdio is not open\n", __func__);
  159. goto start_rx_end;
  160. }
  161. pool = &port->read_pool;
  162. out = port->port_usb->out;
  163. while (!list_empty(pool)) {
  164. struct usb_request *req;
  165. req = list_entry(pool->next, struct usb_request, list);
  166. list_del(&req->list);
  167. req->length = SDIO_RX_BUF_SIZE;
  168. port->rp_len--;
  169. spin_unlock_irq(&port->port_lock);
  170. ret = usb_ep_queue(out, req, GFP_ATOMIC);
  171. spin_lock_irq(&port->port_lock);
  172. if (ret) {
  173. pr_err("%s: usb ep out queue failed"
  174. "port:%pK, port#%d\n",
  175. __func__, port, port->port_num);
  176. list_add_tail(&req->list, pool);
  177. port->rp_len++;
  178. break;
  179. }
  180. /* usb could have disconnected while we released spin lock */
  181. if (!port->port_usb) {
  182. pr_debug("%s: usb is disconnected\n", __func__);
  183. goto start_rx_end;
  184. }
  185. }
  186. start_rx_end:
  187. spin_unlock_irq(&port->port_lock);
  188. }
  189. int gsdio_write(struct gsdio_port *port, struct usb_request *req)
  190. {
  191. unsigned avail;
  192. char *packet;
  193. unsigned size;
  194. unsigned n;
  195. int ret = 0;
  196. if (!port) {
  197. pr_err("%s: port is null\n", __func__);
  198. return -ENODEV;
  199. }
  200. if (!req) {
  201. pr_err("%s: usb request is null port#%d\n",
  202. __func__, port->port_num);
  203. return -ENODEV;
  204. }
  205. pr_debug("%s: port:%pK port#%d req:%pK actual:%d n_read:%d\n",
  206. __func__, port, port->port_num, req,
  207. req->actual, port->n_read);
  208. if (!port->sdio_open) {
  209. pr_debug("%s: SDIO IO is not supported\n", __func__);
  210. return -ENODEV;
  211. }
  212. avail = sdio_write_avail(port->sport_info->ch);
  213. pr_debug("%s: sdio_write_avail:%d", __func__, avail);
  214. if (!avail)
  215. return -EBUSY;
  216. if (!req->actual) {
  217. pr_debug("%s: req->actual is already zero,update bytes read\n",
  218. __func__);
  219. port->n_read = 0;
  220. return -ENODEV;
  221. }
  222. size = req->actual;
  223. packet = req->buf;
  224. n = port->n_read;
  225. if (n) {
  226. packet += n;
  227. size -= n;
  228. }
  229. if (size > avail)
  230. size = avail;
  231. spin_unlock_irq(&port->port_lock);
  232. ret = sdio_write(port->sport_info->ch, packet, size);
  233. spin_lock_irq(&port->port_lock);
  234. if (ret) {
  235. pr_err("%s: port#%d sdio write failed err:%d",
  236. __func__, port->port_num, ret);
  237. /* try again later */
  238. return ret;
  239. }
  240. port->nbytes_tomodem += size;
  241. if (size + n == req->actual)
  242. port->n_read = 0;
  243. else
  244. port->n_read += size;
  245. return ret;
  246. }
  247. void gsdio_rx_push(struct work_struct *w)
  248. {
  249. struct gsdio_port *port = container_of(w, struct gsdio_port, push);
  250. struct list_head *q = &port->read_queue;
  251. struct usb_ep *out;
  252. int ret;
  253. pr_debug("%s: port:%pK port#%d read_queue:%pK", __func__,
  254. port, port->port_num, q);
  255. spin_lock_irq(&port->port_lock);
  256. if (!port->port_usb) {
  257. pr_debug("%s: usb cable is disconencted\n", __func__);
  258. spin_unlock_irq(&port->port_lock);
  259. return;
  260. }
  261. out = port->port_usb->out;
  262. while (!list_empty(q)) {
  263. struct usb_request *req;
  264. req = list_first_entry(q, struct usb_request, list);
  265. switch (req->status) {
  266. case -ESHUTDOWN:
  267. pr_debug("%s: req status shutdown portno#%d port:%pK",
  268. __func__, port->port_num, port);
  269. goto rx_push_end;
  270. default:
  271. pr_warning("%s: port:%pK port#%d"
  272. " Unexpected Rx Status:%d\n", __func__,
  273. port, port->port_num, req->status);
  274. /* FALL THROUGH */
  275. case 0:
  276. /* normal completion */
  277. break;
  278. }
  279. if (!port->sdio_open) {
  280. pr_err("%s: sio channel is not open\n", __func__);
  281. list_move(&req->list, &port->read_pool);
  282. port->rp_len++;
  283. port->rq_len--;
  284. goto rx_push_end;
  285. }
  286. list_del(&req->list);
  287. port->rq_len--;
  288. ret = gsdio_write(port, req);
  289. /* as gsdio_write drops spin_lock while writing data
  290. * to sdio usb cable may have been disconnected
  291. */
  292. if (!port->port_usb) {
  293. port->n_read = 0;
  294. gsdio_free_req(out, req);
  295. spin_unlock_irq(&port->port_lock);
  296. return;
  297. }
  298. if (ret || port->n_read) {
  299. list_add(&req->list, &port->read_queue);
  300. port->rq_len++;
  301. goto rx_push_end;
  302. }
  303. list_add(&req->list, &port->read_pool);
  304. port->rp_len++;
  305. }
  306. if (port->sdio_open && !list_empty(q)) {
  307. if (sdio_write_avail(port->sport_info->ch))
  308. queue_work(gsdio_wq, &port->push);
  309. }
  310. rx_push_end:
  311. spin_unlock_irq(&port->port_lock);
  312. /* start queuing out requests again to host */
  313. gsdio_start_rx(port);
  314. }
  315. void gsdio_read_complete(struct usb_ep *ep, struct usb_request *req)
  316. {
  317. struct gsdio_port *port = ep->driver_data;
  318. unsigned long flags;
  319. pr_debug("%s: ep:%pK port:%pK\n", __func__, ep, port);
  320. if (!port) {
  321. pr_err("%s: port is null\n", __func__);
  322. return;
  323. }
  324. spin_lock_irqsave(&port->port_lock, flags);
  325. list_add_tail(&req->list, &port->read_queue);
  326. port->rq_len++;
  327. queue_work(gsdio_wq, &port->push);
  328. spin_unlock_irqrestore(&port->port_lock, flags);
  329. return;
  330. }
  331. void gsdio_write_complete(struct usb_ep *ep, struct usb_request *req)
  332. {
  333. struct gsdio_port *port = ep->driver_data;
  334. unsigned long flags;
  335. pr_debug("%s: ep:%pK port:%pK\n", __func__, ep, port);
  336. if (!port) {
  337. pr_err("%s: port is null\n", __func__);
  338. return;
  339. }
  340. spin_lock_irqsave(&port->port_lock, flags);
  341. list_add(&req->list, &port->write_pool);
  342. port->wp_len++;
  343. switch (req->status) {
  344. default:
  345. pr_warning("%s: port:%pK port#%d unexpected %s status %d\n",
  346. __func__, port, port->port_num,
  347. ep->name, req->status);
  348. /* FALL THROUGH */
  349. case 0:
  350. queue_work(gsdio_wq, &port->pull);
  351. break;
  352. case -ESHUTDOWN:
  353. /* disconnect */
  354. pr_debug("%s: %s shutdown\n", __func__, ep->name);
  355. break;
  356. }
  357. spin_unlock_irqrestore(&port->port_lock, flags);
  358. return;
  359. }
  360. void gsdio_read_pending(struct gsdio_port *port)
  361. {
  362. struct sdio_channel *ch;
  363. char buf[1024];
  364. int avail;
  365. if (!port) {
  366. pr_err("%s: port is null\n", __func__);
  367. return;
  368. }
  369. ch = port->sport_info->ch;
  370. if (!ch)
  371. return;
  372. while ((avail = sdio_read_avail(ch))) {
  373. if (avail > 1024)
  374. avail = 1024;
  375. sdio_read(ch, buf, avail);
  376. pr_debug("%s: flushed out %d bytes\n", __func__, avail);
  377. }
  378. }
  379. void gsdio_tx_pull(struct work_struct *w)
  380. {
  381. struct gsdio_port *port = container_of(w, struct gsdio_port, pull);
  382. struct list_head *pool = &port->write_pool;
  383. pr_debug("%s: port:%pK port#%d pool:%pK\n", __func__,
  384. port, port->port_num, pool);
  385. if (!port->port_usb) {
  386. pr_err("%s: usb disconnected\n", __func__);
  387. /* take out all the pending data from sdio */
  388. gsdio_read_pending(port);
  389. return;
  390. }
  391. spin_lock_irq(&port->port_lock);
  392. while (!list_empty(pool)) {
  393. int avail;
  394. struct usb_ep *in = port->port_usb->in;
  395. struct sdio_channel *ch = port->sport_info->ch;
  396. struct usb_request *req;
  397. unsigned len = SDIO_TX_BUF_SIZE;
  398. int ret;
  399. req = list_entry(pool->next, struct usb_request, list);
  400. if (!port->sdio_open) {
  401. pr_debug("%s: SDIO channel is not open\n", __func__);
  402. goto tx_pull_end;
  403. }
  404. avail = sdio_read_avail(ch);
  405. if (!avail) {
  406. /* REVISIT: for ZLP */
  407. pr_debug("%s: read_avail:%d port:%pK port#%d\n",
  408. __func__, avail, port, port->port_num);
  409. goto tx_pull_end;
  410. }
  411. if (avail > len)
  412. avail = len;
  413. list_del(&req->list);
  414. port->wp_len--;
  415. spin_unlock_irq(&port->port_lock);
  416. ret = sdio_read(ch, req->buf, avail);
  417. spin_lock_irq(&port->port_lock);
  418. if (ret) {
  419. pr_err("%s: port:%pK port#%d sdio read failed err:%d",
  420. __func__, port, port->port_num, ret);
  421. /* check if usb is still active */
  422. if (!port->port_usb) {
  423. gsdio_free_req(in, req);
  424. } else {
  425. list_add(&req->list, pool);
  426. port->wp_len++;
  427. }
  428. goto tx_pull_end;
  429. }
  430. req->length = avail;
  431. spin_unlock_irq(&port->port_lock);
  432. ret = usb_ep_queue(in, req, GFP_KERNEL);
  433. spin_lock_irq(&port->port_lock);
  434. if (ret) {
  435. pr_err("%s: usb ep out queue failed"
  436. "port:%pK, port#%d err:%d\n",
  437. __func__, port, port->port_num, ret);
  438. /* could be usb disconnected */
  439. if (!port->port_usb) {
  440. gsdio_free_req(in, req);
  441. } else {
  442. list_add(&req->list, pool);
  443. port->wp_len++;
  444. }
  445. goto tx_pull_end;
  446. }
  447. port->nbytes_tolaptop += avail;
  448. }
  449. tx_pull_end:
  450. spin_unlock_irq(&port->port_lock);
  451. }
  452. int gsdio_start_io(struct gsdio_port *port)
  453. {
  454. int ret;
  455. unsigned long flags;
  456. pr_debug("%s:\n", __func__);
  457. spin_lock_irqsave(&port->port_lock, flags);
  458. if (!port->port_usb) {
  459. spin_unlock_irqrestore(&port->port_lock, flags);
  460. return -ENODEV;
  461. }
  462. /* start usb out queue */
  463. ret = gsdio_alloc_requests(port->port_usb->out,
  464. &port->read_pool,
  465. SDIO_RX_QUEUE_SIZE, SDIO_RX_BUF_SIZE,
  466. gsdio_read_complete);
  467. if (ret) {
  468. spin_unlock_irqrestore(&port->port_lock, flags);
  469. pr_err("%s: unable to allocate out reqs\n", __func__);
  470. return ret;
  471. }
  472. port->rp_len = SDIO_RX_QUEUE_SIZE;
  473. ret = gsdio_alloc_requests(port->port_usb->in,
  474. &port->write_pool,
  475. SDIO_TX_QUEUE_SIZE, SDIO_TX_BUF_SIZE,
  476. gsdio_write_complete);
  477. if (ret) {
  478. gsdio_free_requests(port->port_usb->out, &port->read_pool);
  479. port->rp_len = 0;
  480. spin_unlock_irqrestore(&port->port_lock, flags);
  481. pr_err("%s: unable to allocate in reqs\n", __func__);
  482. return ret;
  483. }
  484. port->wp_len = SDIO_TX_QUEUE_SIZE;
  485. spin_unlock_irqrestore(&port->port_lock, flags);
  486. gsdio_start_rx(port);
  487. queue_work(gsdio_wq, &port->pull);
  488. return 0;
  489. }
  490. void gsdio_port_free(unsigned portno)
  491. {
  492. struct gsdio_port *port = sdio_ports[portno].port;
  493. struct platform_driver *pdriver = &sdio_ports[portno].gsdio_ch;
  494. if (!port) {
  495. pr_err("%s: invalid portno#%d\n", __func__, portno);
  496. return;
  497. }
  498. platform_driver_unregister(pdriver);
  499. kfree(port);
  500. }
  501. void gsdio_ctrl_wq(struct work_struct *w)
  502. {
  503. struct gsdio_port *port;
  504. port = container_of(w, struct gsdio_port, notify_modem);
  505. if (!port) {
  506. pr_err("%s: port is null\n", __func__);
  507. return;
  508. }
  509. if (!port->sdio_open || port->ctrl_ch_err)
  510. return;
  511. sdio_cmux_tiocmset(port->sport_info->ctrl_ch_id,
  512. port->cbits_to_modem, ~(port->cbits_to_modem));
  513. }
  514. void gsdio_ctrl_notify_modem(void *gptr, u8 portno, int ctrl_bits)
  515. {
  516. struct gsdio_port *port;
  517. int temp;
  518. struct gserial *gser = gptr;
  519. if (portno >= n_sdio_ports) {
  520. pr_err("%s: invalid portno#%d\n", __func__, portno);
  521. return;
  522. }
  523. if (!gser) {
  524. pr_err("%s: gser is null\n", __func__);
  525. return;
  526. }
  527. port = sdio_ports[portno].port;
  528. temp = ctrl_bits & SDIO_ACM_CTRL_DTR ? TIOCM_DTR : 0;
  529. if (port->cbits_to_modem == temp)
  530. return;
  531. port->cbits_to_modem = temp;
  532. /* TIOCM_DTR - 0x002 - bit(1) */
  533. pr_debug("%s: port:%pK port#%d ctrl_bits:%08x\n", __func__,
  534. port, port->port_num, ctrl_bits);
  535. if (!port->sdio_open) {
  536. pr_err("%s: port:%pK port#%d sdio not connected\n",
  537. __func__, port, port->port_num);
  538. return;
  539. }
  540. /* whenever DTR is high let laptop know that modem status */
  541. if (port->cbits_to_modem && gser->send_modem_ctrl_bits)
  542. gser->send_modem_ctrl_bits(gser, port->cbits_to_laptop);
  543. queue_work(gsdio_wq, &port->notify_modem);
  544. }
  545. void gsdio_ctrl_modem_status(int ctrl_bits, void *_dev)
  546. {
  547. struct gsdio_port *port = _dev;
  548. /* TIOCM_CD - 0x040 - bit(6)
  549. * TIOCM_RI - 0x080 - bit(7)
  550. * TIOCM_DSR- 0x100 - bit(8)
  551. */
  552. pr_debug("%s: port:%pK port#%d event:%08x\n", __func__,
  553. port, port->port_num, ctrl_bits);
  554. port->cbits_to_laptop = 0;
  555. ctrl_bits &= TIOCM_RI | TIOCM_CD | TIOCM_DSR;
  556. if (ctrl_bits & TIOCM_RI)
  557. port->cbits_to_laptop |= SDIO_ACM_CTRL_RI;
  558. if (ctrl_bits & TIOCM_CD)
  559. port->cbits_to_laptop |= SDIO_ACM_CTRL_DCD;
  560. if (ctrl_bits & TIOCM_DSR)
  561. port->cbits_to_laptop |= SDIO_ACM_CTRL_DSR;
  562. if (port->port_usb && port->port_usb->send_modem_ctrl_bits)
  563. port->port_usb->send_modem_ctrl_bits(port->port_usb,
  564. port->cbits_to_laptop);
  565. }
  566. void gsdio_ch_notify(void *_dev, unsigned event)
  567. {
  568. struct gsdio_port *port = _dev;
  569. pr_debug("%s: port:%pK port#%d event:%s\n", __func__,
  570. port, port->port_num,
  571. event == 1 ? "READ AVAIL" : "WRITE_AVAIL");
  572. if (event == SDIO_EVENT_DATA_WRITE_AVAIL)
  573. queue_work(gsdio_wq, &port->push);
  574. if (event == SDIO_EVENT_DATA_READ_AVAIL)
  575. queue_work(gsdio_wq, &port->pull);
  576. }
  577. static void gsdio_open_work(struct work_struct *w)
  578. {
  579. struct gsdio_port *port =
  580. container_of(w, struct gsdio_port, sdio_open_work.work);
  581. struct sdio_port_info *pi = port->sport_info;
  582. struct gserial *gser;
  583. int ret;
  584. int ctrl_bits;
  585. int startio;
  586. ret = sdio_open(pi->data_ch_name, &pi->ch, port, gsdio_ch_notify);
  587. if (ret) {
  588. pr_err("%s: port:%pK port#%d unable to open sdio ch:%s\n",
  589. __func__, port, port->port_num,
  590. pi->data_ch_name);
  591. return;
  592. }
  593. port->ctrl_ch_err = 0;
  594. ret = sdio_cmux_open(pi->ctrl_ch_id, 0, 0,
  595. gsdio_ctrl_modem_status, port);
  596. if (ret) {
  597. pr_err("%s: port:%pK port#%d unable to open ctrl ch:%d\n",
  598. __func__, port, port->port_num, pi->ctrl_ch_id);
  599. port->ctrl_ch_err = 1;
  600. }
  601. /* check for latest status update from modem */
  602. if (!port->ctrl_ch_err) {
  603. ctrl_bits = sdio_cmux_tiocmget(pi->ctrl_ch_id);
  604. gsdio_ctrl_modem_status(ctrl_bits, port);
  605. }
  606. pr_debug("%s: SDIO data:%s ctrl:%d are open\n", __func__,
  607. pi->data_ch_name,
  608. pi->ctrl_ch_id);
  609. port->sdio_open = 1;
  610. /* start tx if usb is open already */
  611. spin_lock_irq(&port->port_lock);
  612. startio = port->port_usb ? 1 : 0;
  613. gser = port->port_usb;
  614. spin_unlock_irq(&port->port_lock);
  615. if (startio) {
  616. pr_debug("%s: USB is already open, start io\n", __func__);
  617. gsdio_start_io(port);
  618. if (gser->send_modem_ctrl_bits)
  619. gser->send_modem_ctrl_bits(gser, port->cbits_to_laptop);
  620. }
  621. }
  622. #define SDIO_CH_NAME_MAX_LEN 9
  623. #define SDIO_OPEN_DELAY msecs_to_jiffies(10000)
  624. static int gsdio_ch_remove(struct platform_device *dev)
  625. {
  626. struct gsdio_port *port;
  627. struct sdio_port_info *pi;
  628. int i;
  629. unsigned long flags;
  630. pr_debug("%s: name:%s\n", __func__, dev->name);
  631. for (i = 0; i < n_sdio_ports; i++) {
  632. port = sdio_ports[i].port;
  633. pi = port->sport_info;
  634. if (!strncmp(pi->data_ch_name, dev->name,
  635. SDIO_CH_NAME_MAX_LEN)) {
  636. struct gserial *gser = port->port_usb;
  637. port->sdio_open = 0;
  638. port->sdio_probe = 0;
  639. port->ctrl_ch_err = 1;
  640. /* check if usb cable is connected */
  641. if (!gser)
  642. continue;
  643. /* indicated call status to usb host */
  644. gsdio_ctrl_modem_status(0, port);
  645. usb_ep_fifo_flush(gser->in);
  646. usb_ep_fifo_flush(gser->out);
  647. cancel_work_sync(&port->push);
  648. cancel_work_sync(&port->pull);
  649. spin_lock_irqsave(&port->port_lock, flags);
  650. gsdio_free_requests(gser->out, &port->read_pool);
  651. gsdio_free_requests(gser->out, &port->read_queue);
  652. gsdio_free_requests(gser->in, &port->write_pool);
  653. port->rp_len = 0;
  654. port->rq_len = 0;
  655. port->wp_len = 0;
  656. port->n_read = 0;
  657. spin_unlock_irqrestore(&port->port_lock, flags);
  658. }
  659. }
  660. return 0;
  661. }
  662. static int gsdio_ch_probe(struct platform_device *dev)
  663. {
  664. struct gsdio_port *port;
  665. struct sdio_port_info *pi;
  666. int i;
  667. pr_debug("%s: name:%s\n", __func__, dev->name);
  668. for (i = 0; i < n_sdio_ports; i++) {
  669. port = sdio_ports[i].port;
  670. pi = port->sport_info;
  671. pr_debug("%s: sdio_ch_name:%s dev_name:%s\n", __func__,
  672. pi->data_ch_name, dev->name);
  673. /* unfortunately cmux channle might not be ready even if
  674. * sdio channel is ready. as we dont have good notification
  675. * mechanism schedule a delayed work
  676. */
  677. if (!strncmp(pi->data_ch_name, dev->name,
  678. SDIO_CH_NAME_MAX_LEN)) {
  679. port->sdio_probe = 1;
  680. queue_delayed_work(gsdio_wq,
  681. &port->sdio_open_work, SDIO_OPEN_DELAY);
  682. return 0;
  683. }
  684. }
  685. pr_info("%s: name:%s is not found\n", __func__, dev->name);
  686. return -ENODEV;
  687. }
  688. int gsdio_port_alloc(unsigned portno,
  689. struct usb_cdc_line_coding *coding,
  690. struct sdio_port_info *pi)
  691. {
  692. struct gsdio_port *port;
  693. struct platform_driver *pdriver;
  694. port = kzalloc(sizeof(struct gsdio_port), GFP_KERNEL);
  695. if (!port) {
  696. pr_err("%s: port allocation failed\n", __func__);
  697. return -ENOMEM;
  698. }
  699. port->port_num = portno;
  700. spin_lock_init(&port->port_lock);
  701. port->line_coding = *coding;
  702. /* READ: read from usb and write into sdio */
  703. INIT_LIST_HEAD(&port->read_pool);
  704. INIT_LIST_HEAD(&port->read_queue);
  705. INIT_WORK(&port->push, gsdio_rx_push);
  706. INIT_LIST_HEAD(&port->write_pool);
  707. INIT_WORK(&port->pull, gsdio_tx_pull);
  708. INIT_WORK(&port->notify_modem, gsdio_ctrl_wq);
  709. INIT_DELAYED_WORK(&port->sdio_open_work, gsdio_open_work);
  710. sdio_ports[portno].port = port;
  711. port->sport_info = pi;
  712. pdriver = &sdio_ports[portno].gsdio_ch;
  713. pdriver->probe = gsdio_ch_probe;
  714. pdriver->remove = gsdio_ch_remove;
  715. pdriver->driver.name = pi->data_ch_name;
  716. pdriver->driver.owner = THIS_MODULE;
  717. pr_debug("%s: port:%pK port#%d sdio_name: %s\n", __func__,
  718. port, port->port_num, pi->data_ch_name);
  719. platform_driver_register(pdriver);
  720. pr_debug("%s: port:%pK port#%d\n", __func__, port, port->port_num);
  721. return 0;
  722. }
  723. int gsdio_connect(struct gserial *gser, u8 portno)
  724. {
  725. struct gsdio_port *port;
  726. int ret = 0;
  727. unsigned long flags;
  728. if (portno >= n_sdio_ports) {
  729. pr_err("%s: invalid portno#%d\n", __func__, portno);
  730. return -EINVAL;
  731. }
  732. if (!gser) {
  733. pr_err("%s: gser is null\n", __func__);
  734. return -EINVAL;
  735. }
  736. port = sdio_ports[portno].port;
  737. spin_lock_irqsave(&port->port_lock, flags);
  738. port->port_usb = gser;
  739. gser->notify_modem = gsdio_ctrl_notify_modem;
  740. spin_unlock_irqrestore(&port->port_lock, flags);
  741. ret = usb_ep_enable(gser->in);
  742. if (ret) {
  743. pr_err("%s: failed to enable in ep w/ err:%d\n",
  744. __func__, ret);
  745. port->port_usb = 0;
  746. return ret;
  747. }
  748. gser->in->driver_data = port;
  749. ret = usb_ep_enable(gser->out);
  750. if (ret) {
  751. pr_err("%s: failed to enable in ep w/ err:%d\n",
  752. __func__, ret);
  753. usb_ep_disable(gser->in);
  754. port->port_usb = 0;
  755. gser->in->driver_data = 0;
  756. return ret;
  757. }
  758. gser->out->driver_data = port;
  759. if (port->sdio_open) {
  760. pr_debug("%s: sdio is already open, start io\n", __func__);
  761. gsdio_start_io(port);
  762. if (gser->send_modem_ctrl_bits)
  763. gser->send_modem_ctrl_bits(gser, port->cbits_to_laptop);
  764. }
  765. return 0;
  766. }
  767. void gsdio_disconnect(struct gserial *gser, u8 portno)
  768. {
  769. unsigned long flags;
  770. struct gsdio_port *port;
  771. if (portno >= n_sdio_ports) {
  772. pr_err("%s: invalid portno#%d\n", __func__, portno);
  773. return;
  774. }
  775. if (!gser) {
  776. pr_err("%s: gser is null\n", __func__);
  777. return;
  778. }
  779. port = sdio_ports[portno].port;
  780. /* send dtr zero to modem to notify disconnect */
  781. port->cbits_to_modem = 0;
  782. queue_work(gsdio_wq, &port->notify_modem);
  783. spin_lock_irqsave(&port->port_lock, flags);
  784. port->port_usb = 0;
  785. port->nbytes_tomodem = 0;
  786. port->nbytes_tolaptop = 0;
  787. spin_unlock_irqrestore(&port->port_lock, flags);
  788. /* disable endpoints, aborting down any active I/O */
  789. usb_ep_disable(gser->out);
  790. gser->out->driver_data = NULL;
  791. usb_ep_disable(gser->in);
  792. gser->in->driver_data = NULL;
  793. spin_lock_irqsave(&port->port_lock, flags);
  794. gsdio_free_requests(gser->out, &port->read_pool);
  795. gsdio_free_requests(gser->out, &port->read_queue);
  796. gsdio_free_requests(gser->in, &port->write_pool);
  797. port->rp_len = 0;
  798. port->rq_len = 0;
  799. port->wp_len = 0;
  800. port->n_read = 0;
  801. spin_unlock_irqrestore(&port->port_lock, flags);
  802. }
  803. #if defined(CONFIG_DEBUG_FS)
  804. static char debug_buffer[PAGE_SIZE];
  805. static ssize_t debug_sdio_read_stats(struct file *file, char __user *ubuf,
  806. size_t count, loff_t *ppos)
  807. {
  808. struct gsdio_port *port;
  809. char *buf;
  810. unsigned long flags;
  811. int i = 0;
  812. int temp = 0;
  813. int ret;
  814. buf = kzalloc(sizeof(char) * 1024, GFP_KERNEL);
  815. if (!buf)
  816. return -ENOMEM;
  817. while (i < n_sdio_ports) {
  818. port = sdio_ports[i].port;
  819. spin_lock_irqsave(&port->port_lock, flags);
  820. temp += scnprintf(buf + temp, PAGE_SIZE - temp,
  821. "###PORT:%d port:%pK###\n"
  822. "nbytes_tolaptop: %lu\n"
  823. "nbytes_tomodem: %lu\n"
  824. "cbits_to_modem: %u\n"
  825. "cbits_to_laptop: %u\n"
  826. "read_pool_len: %lu\n"
  827. "read_queue_len: %lu\n"
  828. "write_pool_len: %lu\n"
  829. "n_read: %u\n"
  830. "sdio_open: %d\n"
  831. "sdio_probe: %d\n",
  832. i, port,
  833. port->nbytes_tolaptop, port->nbytes_tomodem,
  834. port->cbits_to_modem, port->cbits_to_laptop,
  835. port->rp_len, port->rq_len, port->wp_len,
  836. port->n_read,
  837. port->sdio_open, port->sdio_probe);
  838. spin_unlock_irqrestore(&port->port_lock, flags);
  839. i++;
  840. }
  841. ret = simple_read_from_buffer(ubuf, count, ppos, buf, temp);
  842. kfree(buf);
  843. return ret;
  844. }
  845. static ssize_t debug_sdio_reset_stats(struct file *file, const char __user *buf,
  846. size_t count, loff_t *ppos)
  847. {
  848. struct gsdio_port *port;
  849. unsigned long flags;
  850. int i = 0;
  851. while (i < n_sdio_ports) {
  852. port = sdio_ports[i].port;
  853. spin_lock_irqsave(&port->port_lock, flags);
  854. port->nbytes_tolaptop = 0;
  855. port->nbytes_tomodem = 0;
  856. spin_unlock_irqrestore(&port->port_lock, flags);
  857. i++;
  858. }
  859. return count;
  860. }
  861. static int debug_sdio_open(struct inode *inode, struct file *file)
  862. {
  863. return 0;
  864. }
  865. static const struct file_operations debug_gsdio_ops = {
  866. .open = debug_sdio_open,
  867. .read = debug_sdio_read_stats,
  868. .write = debug_sdio_reset_stats,
  869. };
  870. static void gsdio_debugfs_init(void)
  871. {
  872. struct dentry *dent;
  873. dent = debugfs_create_dir("usb_gsdio", 0);
  874. if (IS_ERR(dent))
  875. return;
  876. debugfs_create_file("status", 0444, dent, 0, &debug_gsdio_ops);
  877. }
  878. #else
  879. static void gsdio_debugfs_init(void)
  880. {
  881. return;
  882. }
  883. #endif
  884. /* connect, disconnect, alloc_requests, free_requests */
  885. int gsdio_setup(struct usb_gadget *g, unsigned count)
  886. {
  887. struct usb_cdc_line_coding coding;
  888. int i;
  889. int ret = 0;
  890. pr_debug("%s: gadget:(%pK) count:%d\n", __func__, g, count);
  891. if (count == 0 || count > SDIO_N_PORTS) {
  892. pr_err("%s: invalid number of ports count:%d max_ports:%d\n",
  893. __func__, count, SDIO_N_PORTS);
  894. return -EINVAL;
  895. }
  896. coding.dwDTERate = cpu_to_le32(9600);
  897. coding.bCharFormat = 8;
  898. coding.bParityType = USB_CDC_NO_PARITY;
  899. coding.bDataBits = USB_CDC_1_STOP_BITS;
  900. gsdio_wq = create_singlethread_workqueue("k_gserial");
  901. if (!gsdio_wq) {
  902. pr_err("%s: unable to create workqueue gsdio_wq\n",
  903. __func__);
  904. return -ENOMEM;
  905. }
  906. for (i = 0; i < count; i++) {
  907. mutex_init(&sdio_ports[i].lock);
  908. ret = gsdio_port_alloc(i, &coding, sport_info + i);
  909. n_sdio_ports++;
  910. if (ret) {
  911. n_sdio_ports--;
  912. pr_err("%s: sdio logical port allocation failed\n",
  913. __func__);
  914. goto free_sdio_ports;
  915. }
  916. }
  917. gsdio_debugfs_init();
  918. return 0;
  919. free_sdio_ports:
  920. for (i = 0; i < n_sdio_ports; i++)
  921. gsdio_port_free(i);
  922. destroy_workqueue(gsdio_wq);
  923. return ret;
  924. }
  925. /* TODO: Add gserial_cleanup */