sierra.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  1. /*
  2. USB Driver for Sierra Wireless
  3. Copyright (C) 2006 Kevin Lloyd <linux@sierrawireless.com>
  4. IMPORTANT DISCLAIMER: This driver is not commercially supported by
  5. Sierra Wireless. Use at your own risk.
  6. This driver is free software; you can redistribute it and/or modify
  7. it under the terms of Version 2 of the GNU General Public License as
  8. published by the Free Software Foundation.
  9. Portions based on the option driver by Matthias Urlichs <smurf@smurf.noris.de>
  10. Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org>
  11. */
  12. #define DRIVER_VERSION "v.1.0.6"
  13. #define DRIVER_AUTHOR "Kevin Lloyd <linux@sierrawireless.com>"
  14. #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems"
  15. #include <linux/kernel.h>
  16. #include <linux/jiffies.h>
  17. #include <linux/errno.h>
  18. #include <linux/tty.h>
  19. #include <linux/tty_flip.h>
  20. #include <linux/module.h>
  21. #include <linux/usb.h>
  22. #include <linux/usb/serial.h>
  23. static struct usb_device_id id_table [] = {
  24. { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */
  25. { USB_DEVICE(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */
  26. { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */
  27. { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
  28. { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
  29. { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless AirCard 595U */
  30. { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */
  31. { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */
  32. { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */
  33. { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
  34. { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 */
  35. { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
  36. { USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless AirCard 580 */
  37. { USB_DEVICE(0x0F3D, 0x0112) }, /* AirPrime/Sierra PC 5220 */
  38. { }
  39. };
  40. MODULE_DEVICE_TABLE(usb, id_table);
  41. static struct usb_device_id id_table_1port [] = {
  42. { USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless AirCard 580 */
  43. { USB_DEVICE(0x0F3D, 0x0112) }, /* AirPrime/Sierra PC 5220 */
  44. { }
  45. };
  46. static struct usb_device_id id_table_3port [] = {
  47. { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */
  48. { USB_DEVICE(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */
  49. { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */
  50. { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
  51. { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
  52. { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless AirCard 595U */
  53. { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */
  54. { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */
  55. { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */
  56. { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
  57. { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 */
  58. { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
  59. { }
  60. };
  61. static struct usb_driver sierra_driver = {
  62. .name = "sierra",
  63. .probe = usb_serial_probe,
  64. .disconnect = usb_serial_disconnect,
  65. .id_table = id_table,
  66. .no_dynamic_id = 1,
  67. };
  68. static int debug;
  69. /* per port private data */
  70. #define N_IN_URB 4
  71. #define N_OUT_URB 4
  72. #define IN_BUFLEN 4096
  73. #define OUT_BUFLEN 128
  74. struct sierra_port_private {
  75. /* Input endpoints and buffer for this port */
  76. struct urb *in_urbs[N_IN_URB];
  77. char in_buffer[N_IN_URB][IN_BUFLEN];
  78. /* Output endpoints and buffer for this port */
  79. struct urb *out_urbs[N_OUT_URB];
  80. char out_buffer[N_OUT_URB][OUT_BUFLEN];
  81. /* Settings for the port */
  82. int rts_state; /* Handshaking pins (outputs) */
  83. int dtr_state;
  84. int cts_state; /* Handshaking pins (inputs) */
  85. int dsr_state;
  86. int dcd_state;
  87. int ri_state;
  88. unsigned long tx_start_time[N_OUT_URB];
  89. };
  90. static int sierra_send_setup(struct usb_serial_port *port)
  91. {
  92. struct usb_serial *serial = port->serial;
  93. struct sierra_port_private *portdata;
  94. dbg("%s", __FUNCTION__);
  95. portdata = usb_get_serial_port_data(port);
  96. if (port->tty) {
  97. int val = 0;
  98. if (portdata->dtr_state)
  99. val |= 0x01;
  100. if (portdata->rts_state)
  101. val |= 0x02;
  102. return usb_control_msg(serial->dev,
  103. usb_rcvctrlpipe(serial->dev, 0),
  104. 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
  105. }
  106. return 0;
  107. }
  108. static void sierra_rx_throttle(struct usb_serial_port *port)
  109. {
  110. dbg("%s", __FUNCTION__);
  111. }
  112. static void sierra_rx_unthrottle(struct usb_serial_port *port)
  113. {
  114. dbg("%s", __FUNCTION__);
  115. }
  116. static void sierra_break_ctl(struct usb_serial_port *port, int break_state)
  117. {
  118. /* Unfortunately, I don't know how to send a break */
  119. dbg("%s", __FUNCTION__);
  120. }
  121. static void sierra_set_termios(struct usb_serial_port *port,
  122. struct ktermios *old_termios)
  123. {
  124. dbg("%s", __FUNCTION__);
  125. sierra_send_setup(port);
  126. }
  127. static int sierra_tiocmget(struct usb_serial_port *port, struct file *file)
  128. {
  129. unsigned int value;
  130. struct sierra_port_private *portdata;
  131. portdata = usb_get_serial_port_data(port);
  132. value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
  133. ((portdata->dtr_state) ? TIOCM_DTR : 0) |
  134. ((portdata->cts_state) ? TIOCM_CTS : 0) |
  135. ((portdata->dsr_state) ? TIOCM_DSR : 0) |
  136. ((portdata->dcd_state) ? TIOCM_CAR : 0) |
  137. ((portdata->ri_state) ? TIOCM_RNG : 0);
  138. return value;
  139. }
  140. static int sierra_tiocmset(struct usb_serial_port *port, struct file *file,
  141. unsigned int set, unsigned int clear)
  142. {
  143. struct sierra_port_private *portdata;
  144. portdata = usb_get_serial_port_data(port);
  145. if (set & TIOCM_RTS)
  146. portdata->rts_state = 1;
  147. if (set & TIOCM_DTR)
  148. portdata->dtr_state = 1;
  149. if (clear & TIOCM_RTS)
  150. portdata->rts_state = 0;
  151. if (clear & TIOCM_DTR)
  152. portdata->dtr_state = 0;
  153. return sierra_send_setup(port);
  154. }
  155. static int sierra_ioctl(struct usb_serial_port *port, struct file *file,
  156. unsigned int cmd, unsigned long arg)
  157. {
  158. return -ENOIOCTLCMD;
  159. }
  160. /* Write */
  161. static int sierra_write(struct usb_serial_port *port,
  162. const unsigned char *buf, int count)
  163. {
  164. struct sierra_port_private *portdata;
  165. int i;
  166. int left, todo;
  167. struct urb *this_urb = NULL; /* spurious */
  168. int err;
  169. portdata = usb_get_serial_port_data(port);
  170. dbg("%s: write (%d chars)", __FUNCTION__, count);
  171. i = 0;
  172. left = count;
  173. for (i=0; left > 0 && i < N_OUT_URB; i++) {
  174. todo = left;
  175. if (todo > OUT_BUFLEN)
  176. todo = OUT_BUFLEN;
  177. this_urb = portdata->out_urbs[i];
  178. if (this_urb->status == -EINPROGRESS) {
  179. if (time_before(jiffies,
  180. portdata->tx_start_time[i] + 10 * HZ))
  181. continue;
  182. usb_unlink_urb(this_urb);
  183. continue;
  184. }
  185. if (this_urb->status != 0)
  186. dbg("usb_write %p failed (err=%d)",
  187. this_urb, this_urb->status);
  188. dbg("%s: endpoint %d buf %d", __FUNCTION__,
  189. usb_pipeendpoint(this_urb->pipe), i);
  190. /* send the data */
  191. memcpy (this_urb->transfer_buffer, buf, todo);
  192. this_urb->transfer_buffer_length = todo;
  193. this_urb->dev = port->serial->dev;
  194. err = usb_submit_urb(this_urb, GFP_ATOMIC);
  195. if (err) {
  196. dbg("usb_submit_urb %p (write bulk) failed "
  197. "(%d, has %d)", this_urb,
  198. err, this_urb->status);
  199. continue;
  200. }
  201. portdata->tx_start_time[i] = jiffies;
  202. buf += todo;
  203. left -= todo;
  204. }
  205. count -= left;
  206. dbg("%s: wrote (did %d)", __FUNCTION__, count);
  207. return count;
  208. }
  209. static void sierra_indat_callback(struct urb *urb)
  210. {
  211. int err;
  212. int endpoint;
  213. struct usb_serial_port *port;
  214. struct tty_struct *tty;
  215. unsigned char *data = urb->transfer_buffer;
  216. dbg("%s: %p", __FUNCTION__, urb);
  217. endpoint = usb_pipeendpoint(urb->pipe);
  218. port = (struct usb_serial_port *) urb->context;
  219. if (urb->status) {
  220. dbg("%s: nonzero status: %d on endpoint %02x.",
  221. __FUNCTION__, urb->status, endpoint);
  222. } else {
  223. tty = port->tty;
  224. if (urb->actual_length) {
  225. tty_buffer_request_room(tty, urb->actual_length);
  226. tty_insert_flip_string(tty, data, urb->actual_length);
  227. tty_flip_buffer_push(tty);
  228. } else {
  229. dbg("%s: empty read urb received", __FUNCTION__);
  230. }
  231. /* Resubmit urb so we continue receiving */
  232. if (port->open_count && urb->status != -ESHUTDOWN) {
  233. err = usb_submit_urb(urb, GFP_ATOMIC);
  234. if (err)
  235. printk(KERN_ERR "%s: resubmit read urb failed. "
  236. "(%d)", __FUNCTION__, err);
  237. }
  238. }
  239. return;
  240. }
  241. static void sierra_outdat_callback(struct urb *urb)
  242. {
  243. struct usb_serial_port *port;
  244. dbg("%s", __FUNCTION__);
  245. port = (struct usb_serial_port *) urb->context;
  246. usb_serial_port_softint(port);
  247. }
  248. static void sierra_instat_callback(struct urb *urb)
  249. {
  250. int err;
  251. struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
  252. struct sierra_port_private *portdata = usb_get_serial_port_data(port);
  253. struct usb_serial *serial = port->serial;
  254. dbg("%s", __FUNCTION__);
  255. dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
  256. if (urb->status == 0) {
  257. struct usb_ctrlrequest *req_pkt =
  258. (struct usb_ctrlrequest *)urb->transfer_buffer;
  259. if (!req_pkt) {
  260. dbg("%s: NULL req_pkt\n", __FUNCTION__);
  261. return;
  262. }
  263. if ((req_pkt->bRequestType == 0xA1) &&
  264. (req_pkt->bRequest == 0x20)) {
  265. int old_dcd_state;
  266. unsigned char signals = *((unsigned char *)
  267. urb->transfer_buffer +
  268. sizeof(struct usb_ctrlrequest));
  269. dbg("%s: signal x%x", __FUNCTION__, signals);
  270. old_dcd_state = portdata->dcd_state;
  271. portdata->cts_state = 1;
  272. portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
  273. portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
  274. portdata->ri_state = ((signals & 0x08) ? 1 : 0);
  275. if (port->tty && !C_CLOCAL(port->tty) &&
  276. old_dcd_state && !portdata->dcd_state)
  277. tty_hangup(port->tty);
  278. } else {
  279. dbg("%s: type %x req %x", __FUNCTION__,
  280. req_pkt->bRequestType,req_pkt->bRequest);
  281. }
  282. } else
  283. dbg("%s: error %d", __FUNCTION__, urb->status);
  284. /* Resubmit urb so we continue receiving IRQ data */
  285. if (urb->status != -ESHUTDOWN) {
  286. urb->dev = serial->dev;
  287. err = usb_submit_urb(urb, GFP_ATOMIC);
  288. if (err)
  289. dbg("%s: resubmit intr urb failed. (%d)",
  290. __FUNCTION__, err);
  291. }
  292. }
  293. static int sierra_write_room(struct usb_serial_port *port)
  294. {
  295. struct sierra_port_private *portdata;
  296. int i;
  297. int data_len = 0;
  298. struct urb *this_urb;
  299. portdata = usb_get_serial_port_data(port);
  300. for (i=0; i < N_OUT_URB; i++) {
  301. this_urb = portdata->out_urbs[i];
  302. if (this_urb && this_urb->status != -EINPROGRESS)
  303. data_len += OUT_BUFLEN;
  304. }
  305. dbg("%s: %d", __FUNCTION__, data_len);
  306. return data_len;
  307. }
  308. static int sierra_chars_in_buffer(struct usb_serial_port *port)
  309. {
  310. struct sierra_port_private *portdata;
  311. int i;
  312. int data_len = 0;
  313. struct urb *this_urb;
  314. portdata = usb_get_serial_port_data(port);
  315. for (i=0; i < N_OUT_URB; i++) {
  316. this_urb = portdata->out_urbs[i];
  317. if (this_urb && this_urb->status == -EINPROGRESS)
  318. data_len += this_urb->transfer_buffer_length;
  319. }
  320. dbg("%s: %d", __FUNCTION__, data_len);
  321. return data_len;
  322. }
  323. static int sierra_open(struct usb_serial_port *port, struct file *filp)
  324. {
  325. struct sierra_port_private *portdata;
  326. struct usb_serial *serial = port->serial;
  327. int i, err;
  328. struct urb *urb;
  329. int result;
  330. __u16 set_mode_dzero = 0x0000;
  331. portdata = usb_get_serial_port_data(port);
  332. dbg("%s", __FUNCTION__);
  333. /* Set some sane defaults */
  334. portdata->rts_state = 1;
  335. portdata->dtr_state = 1;
  336. /* Reset low level data toggle and start reading from endpoints */
  337. for (i = 0; i < N_IN_URB; i++) {
  338. urb = portdata->in_urbs[i];
  339. if (! urb)
  340. continue;
  341. if (urb->dev != serial->dev) {
  342. dbg("%s: dev %p != %p", __FUNCTION__,
  343. urb->dev, serial->dev);
  344. continue;
  345. }
  346. /*
  347. * make sure endpoint data toggle is synchronized with the
  348. * device
  349. */
  350. usb_clear_halt(urb->dev, urb->pipe);
  351. err = usb_submit_urb(urb, GFP_KERNEL);
  352. if (err) {
  353. dbg("%s: submit urb %d failed (%d) %d",
  354. __FUNCTION__, i, err,
  355. urb->transfer_buffer_length);
  356. }
  357. }
  358. /* Reset low level data toggle on out endpoints */
  359. for (i = 0; i < N_OUT_URB; i++) {
  360. urb = portdata->out_urbs[i];
  361. if (! urb)
  362. continue;
  363. urb->dev = serial->dev;
  364. /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
  365. usb_pipeout(urb->pipe), 0); */
  366. }
  367. port->tty->low_latency = 1;
  368. /* set mode to D0 */
  369. result = usb_control_msg(serial->dev,
  370. usb_rcvctrlpipe(serial->dev, 0),
  371. 0x00, 0x40, set_mode_dzero, 0, NULL,
  372. 0, USB_CTRL_SET_TIMEOUT);
  373. sierra_send_setup(port);
  374. return (0);
  375. }
  376. static void sierra_close(struct usb_serial_port *port, struct file *filp)
  377. {
  378. int i;
  379. struct usb_serial *serial = port->serial;
  380. struct sierra_port_private *portdata;
  381. dbg("%s", __FUNCTION__);
  382. portdata = usb_get_serial_port_data(port);
  383. portdata->rts_state = 0;
  384. portdata->dtr_state = 0;
  385. if (serial->dev) {
  386. sierra_send_setup(port);
  387. /* Stop reading/writing urbs */
  388. for (i = 0; i < N_IN_URB; i++)
  389. usb_unlink_urb(portdata->in_urbs[i]);
  390. for (i = 0; i < N_OUT_URB; i++)
  391. usb_unlink_urb(portdata->out_urbs[i]);
  392. }
  393. port->tty = NULL;
  394. }
  395. /* Helper functions used by sierra_setup_urbs */
  396. static struct urb *sierra_setup_urb(struct usb_serial *serial, int endpoint,
  397. int dir, void *ctx, char *buf, int len,
  398. usb_complete_t callback)
  399. {
  400. struct urb *urb;
  401. if (endpoint == -1)
  402. return NULL; /* endpoint not needed */
  403. urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
  404. if (urb == NULL) {
  405. dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
  406. return NULL;
  407. }
  408. /* Fill URB using supplied data. */
  409. usb_fill_bulk_urb(urb, serial->dev,
  410. usb_sndbulkpipe(serial->dev, endpoint) | dir,
  411. buf, len, callback, ctx);
  412. return urb;
  413. }
  414. /* Setup urbs */
  415. static void sierra_setup_urbs(struct usb_serial *serial)
  416. {
  417. int i,j;
  418. struct usb_serial_port *port;
  419. struct sierra_port_private *portdata;
  420. dbg("%s", __FUNCTION__);
  421. for (i = 0; i < serial->num_ports; i++) {
  422. port = serial->port[i];
  423. portdata = usb_get_serial_port_data(port);
  424. /* Do indat endpoints first */
  425. for (j = 0; j < N_IN_URB; ++j) {
  426. portdata->in_urbs[j] = sierra_setup_urb (serial,
  427. port->bulk_in_endpointAddress, USB_DIR_IN, port,
  428. portdata->in_buffer[j], IN_BUFLEN, sierra_indat_callback);
  429. }
  430. /* outdat endpoints */
  431. for (j = 0; j < N_OUT_URB; ++j) {
  432. portdata->out_urbs[j] = sierra_setup_urb (serial,
  433. port->bulk_out_endpointAddress, USB_DIR_OUT, port,
  434. portdata->out_buffer[j], OUT_BUFLEN, sierra_outdat_callback);
  435. }
  436. }
  437. }
  438. static int sierra_startup(struct usb_serial *serial)
  439. {
  440. int i, err;
  441. struct usb_serial_port *port;
  442. struct sierra_port_private *portdata;
  443. dbg("%s", __FUNCTION__);
  444. /* Now setup per port private data */
  445. for (i = 0; i < serial->num_ports; i++) {
  446. port = serial->port[i];
  447. portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
  448. if (!portdata) {
  449. dbg("%s: kmalloc for sierra_port_private (%d) failed!.",
  450. __FUNCTION__, i);
  451. return (1);
  452. }
  453. usb_set_serial_port_data(port, portdata);
  454. if (! port->interrupt_in_urb)
  455. continue;
  456. err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
  457. if (err)
  458. dbg("%s: submit irq_in urb failed %d",
  459. __FUNCTION__, err);
  460. }
  461. sierra_setup_urbs(serial);
  462. return (0);
  463. }
  464. static void sierra_shutdown(struct usb_serial *serial)
  465. {
  466. int i, j;
  467. struct usb_serial_port *port;
  468. struct sierra_port_private *portdata;
  469. dbg("%s", __FUNCTION__);
  470. /* Stop reading/writing urbs */
  471. for (i = 0; i < serial->num_ports; ++i) {
  472. port = serial->port[i];
  473. if (!port)
  474. continue;
  475. portdata = usb_get_serial_port_data(port);
  476. if (!portdata)
  477. continue;
  478. for (j = 0; j < N_IN_URB; j++)
  479. usb_unlink_urb(portdata->in_urbs[j]);
  480. for (j = 0; j < N_OUT_URB; j++)
  481. usb_unlink_urb(portdata->out_urbs[j]);
  482. }
  483. /* Now free them */
  484. for (i = 0; i < serial->num_ports; ++i) {
  485. port = serial->port[i];
  486. if (!port)
  487. continue;
  488. portdata = usb_get_serial_port_data(port);
  489. if (!portdata)
  490. continue;
  491. for (j = 0; j < N_IN_URB; j++) {
  492. if (portdata->in_urbs[j]) {
  493. usb_free_urb(portdata->in_urbs[j]);
  494. portdata->in_urbs[j] = NULL;
  495. }
  496. }
  497. for (j = 0; j < N_OUT_URB; j++) {
  498. if (portdata->out_urbs[j]) {
  499. usb_free_urb(portdata->out_urbs[j]);
  500. portdata->out_urbs[j] = NULL;
  501. }
  502. }
  503. }
  504. /* Now free per port private data */
  505. for (i = 0; i < serial->num_ports; i++) {
  506. port = serial->port[i];
  507. if (!port)
  508. continue;
  509. kfree(usb_get_serial_port_data(port));
  510. }
  511. }
  512. static struct usb_serial_driver sierra_1port_device = {
  513. .driver = {
  514. .owner = THIS_MODULE,
  515. .name = "sierra1",
  516. },
  517. .description = "Sierra USB modem (1 port)",
  518. .id_table = id_table_1port,
  519. .usb_driver = &sierra_driver,
  520. .num_interrupt_in = NUM_DONT_CARE,
  521. .num_bulk_in = 1,
  522. .num_bulk_out = 1,
  523. .num_ports = 1,
  524. .open = sierra_open,
  525. .close = sierra_close,
  526. .write = sierra_write,
  527. .write_room = sierra_write_room,
  528. .chars_in_buffer = sierra_chars_in_buffer,
  529. .throttle = sierra_rx_throttle,
  530. .unthrottle = sierra_rx_unthrottle,
  531. .ioctl = sierra_ioctl,
  532. .set_termios = sierra_set_termios,
  533. .break_ctl = sierra_break_ctl,
  534. .tiocmget = sierra_tiocmget,
  535. .tiocmset = sierra_tiocmset,
  536. .attach = sierra_startup,
  537. .shutdown = sierra_shutdown,
  538. .read_int_callback = sierra_instat_callback,
  539. };
  540. static struct usb_serial_driver sierra_3port_device = {
  541. .driver = {
  542. .owner = THIS_MODULE,
  543. .name = "sierra3",
  544. },
  545. .description = "Sierra USB modem (3 port)",
  546. .id_table = id_table_3port,
  547. .usb_driver = &sierra_driver,
  548. .num_interrupt_in = NUM_DONT_CARE,
  549. .num_bulk_in = 3,
  550. .num_bulk_out = 3,
  551. .num_ports = 3,
  552. .open = sierra_open,
  553. .close = sierra_close,
  554. .write = sierra_write,
  555. .write_room = sierra_write_room,
  556. .chars_in_buffer = sierra_chars_in_buffer,
  557. .throttle = sierra_rx_throttle,
  558. .unthrottle = sierra_rx_unthrottle,
  559. .ioctl = sierra_ioctl,
  560. .set_termios = sierra_set_termios,
  561. .break_ctl = sierra_break_ctl,
  562. .tiocmget = sierra_tiocmget,
  563. .tiocmset = sierra_tiocmset,
  564. .attach = sierra_startup,
  565. .shutdown = sierra_shutdown,
  566. .read_int_callback = sierra_instat_callback,
  567. };
  568. /* Functions used by new usb-serial code. */
  569. static int __init sierra_init(void)
  570. {
  571. int retval;
  572. retval = usb_serial_register(&sierra_1port_device);
  573. if (retval)
  574. goto failed_1port_device_register;
  575. retval = usb_serial_register(&sierra_3port_device);
  576. if (retval)
  577. goto failed_3port_device_register;
  578. retval = usb_register(&sierra_driver);
  579. if (retval)
  580. goto failed_driver_register;
  581. info(DRIVER_DESC ": " DRIVER_VERSION);
  582. return 0;
  583. failed_driver_register:
  584. usb_serial_deregister(&sierra_3port_device);
  585. failed_3port_device_register:
  586. usb_serial_deregister(&sierra_1port_device);
  587. failed_1port_device_register:
  588. return retval;
  589. }
  590. static void __exit sierra_exit(void)
  591. {
  592. usb_deregister (&sierra_driver);
  593. usb_serial_deregister(&sierra_1port_device);
  594. usb_serial_deregister(&sierra_3port_device);
  595. }
  596. module_init(sierra_init);
  597. module_exit(sierra_exit);
  598. MODULE_AUTHOR(DRIVER_AUTHOR);
  599. MODULE_DESCRIPTION(DRIVER_DESC);
  600. MODULE_VERSION(DRIVER_VERSION);
  601. MODULE_LICENSE("GPL");
  602. #ifdef CONFIG_USB_DEBUG
  603. module_param(debug, bool, S_IRUGO | S_IWUSR);
  604. MODULE_PARM_DESC(debug, "Debug messages");
  605. #endif