014-sierra_support.patch 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484
  1. --- /dev/null
  2. +++ b/drivers/usb/serial/sierra.c
  3. @@ -0,0 +1,1446 @@
  4. +/*
  5. + * Sierra Wireless CDMA Wireless Serial USB drive
  6. + *
  7. + * Current Copy modified by: Kevin Lloyd <[email protected]>
  8. + * Original Copy written by: 2005 Greg Kroah-Hartman <gregkh <at> suse.de>
  9. + *
  10. + *
  11. + * This program is free software; you can redistribute it and/or
  12. + * modify it under the terms of the GNU General Public License version
  13. + * 2 as published by the Free Software Foundation.
  14. + *
  15. + * Version history:
  16. + Version 1.03 (Lloyd):
  17. + Included support for DTR control and enhanced buffering (should help
  18. + speed).
  19. + */
  20. +
  21. +#include <linux/config.h>
  22. +#include <linux/kernel.h>
  23. +#include <linux/init.h>
  24. +#include <linux/slab.h>
  25. +#include <linux/tty.h>
  26. +#include <linux/tty_driver.h>
  27. +#include <linux/tty_flip.h>
  28. +#include <linux/module.h>
  29. +#include <linux/usb.h>
  30. +#include <linux/mm.h>
  31. +#include <asm/uaccess.h>
  32. +#include <linux/errno.h>
  33. +#include <linux/list.h>
  34. +#include <linux/spinlock.h>
  35. +#include <linux/smp_lock.h>
  36. +
  37. +#ifdef CONFIG_USB_SERIAL_DEBUG
  38. + static int debug = 1;
  39. +#else
  40. + static int debug;
  41. +#endif
  42. +
  43. +#include "usb-serial.h"
  44. +#include "sierra.h"
  45. +#if defined(CONFIG_USB_SERIAL_PL2303) || defined(CONFIG_USB_SERIAL_PL2303_MODULE)
  46. +#include "pl2303.h" // see /* BEGIN HORRIBLE HACK FOR PL2303 */ below
  47. +#endif
  48. +
  49. +#define DRIVER_VERSION "v1.03"
  50. +
  51. +#if 0
  52. +#define USB_VENDER_REQUEST_SET_DEVICE_POWER_STATE 0
  53. +
  54. +#define USB_DEVICE_POWER_STATE_D0 0x0000
  55. +#define USB_DEVICE_POWER_STATE_D1 0x0001
  56. +#define USB_DEVICE_POWER_STATE_D2 0x0002
  57. +#define USB_DEVICE_POWER_STATE_D3 0x0003
  58. +
  59. +#define SET_CONTROL_LINE_STATE 0x22
  60. +/*
  61. + * Output control lines.
  62. + */
  63. +
  64. +#define ACM_CTRL_DTR 0x01
  65. +#define ACM_CTRL_RTS 0x02
  66. +#endif
  67. +
  68. +//static int sw_attach(struct usb_serial *serial);
  69. +static void sw_usb_serial_generic_shutdown(struct usb_serial *serial);
  70. +
  71. +static int sw_usb_serial_generic_open(struct usb_serial_port *port, struct file *filp);
  72. +static void sw_usb_serial_generic_close(struct usb_serial_port *port, struct file *filp);
  73. +
  74. +#if 1
  75. +/*-----------------------------------------------------------*/
  76. +static int serial_refcount;
  77. +static struct tty_driver serial_tty_driver;
  78. +static struct tty_struct * serial_tty[SERIAL_TTY_MINORS];
  79. +static struct termios * serial_termios[SERIAL_TTY_MINORS];
  80. +static struct termios * serial_termios_locked[SERIAL_TTY_MINORS];
  81. +static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; /* initially all NULL */
  82. +
  83. +static LIST_HEAD(usb_serial_driver_list);
  84. +static struct usb_serial *get_free_serial (int num_ports, int *minor);
  85. +static void generic_write_bulk_callback (struct urb *urb);
  86. +static void * usb_serial_probe(struct usb_device *dev, unsigned int ifnum,const struct usb_device_id *id);
  87. +static void usb_serial_disconnect(struct usb_device *dev, void *ptr);
  88. +static void sw_usb_serial_generic_read_bulk_callback (struct urb *urb);
  89. +static void port_softint(void *private);
  90. +static void return_serial (struct usb_serial *serial);
  91. +static struct usb_serial *get_free_serial (int num_ports, int *minor);
  92. +static int serial_read_proc (char *page, char **start, off_t off, int count, int *eof, void *data);
  93. +/*-----------------------------------------------------------*/
  94. +
  95. +#endif
  96. +
  97. +
  98. +static struct usb_device_id id_table [] = {
  99. + { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */
  100. + { USB_DEVICE(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */
  101. + { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */
  102. + { USB_DEVICE(0x0f30, 0x1b1d) }, /* Sierra Wireless MC5720 */
  103. + { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
  104. + { USB_DEVICE(0x1199, 0x0220) }, /* Sierra Wireless MC5725 */
  105. + { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
  106. + { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */
  107. + { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless USB Dongle 595U */
  108. + { USB_DEVICE(0x1199, 0x0023) }, /* Sierra Wireless C597 */
  109. +
  110. + { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */
  111. + { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */
  112. + { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
  113. + { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 & AC 875U */
  114. + { USB_DEVICE(0x1199, 0x6813) }, /* Sierra Wireless MC8775 (Thinkpad internal) */
  115. + { USB_DEVICE(0x1199, 0x6815) }, /* Sierra Wireless MC8775 */
  116. + { USB_DEVICE(0x03f0, 0x1e1d) }, /* HP hs2300 a.k.a MC8775 */
  117. + { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
  118. + { USB_DEVICE(0x1199, 0x6821) }, /* Sierra Wireless AirCard 875U */
  119. + { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780*/
  120. + { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781*/
  121. + { USB_DEVICE(0x1199, 0x683B) }, /* Sierra Wireless MC8785 Composite*/
  122. + { USB_DEVICE(0x1199, 0x6850) }, /* Sierra Wireless AirCard 880 */
  123. + { USB_DEVICE(0x1199, 0x6851) }, /* Sierra Wireless AirCard 881 */
  124. + { USB_DEVICE(0x1199, 0x6852) }, /* Sierra Wireless AirCard 880 E */
  125. + { USB_DEVICE(0x1199, 0x6853) }, /* Sierra Wireless AirCard 881 E */
  126. + { USB_DEVICE(0x1199, 0x6855) }, /* Sierra Wireless AirCard 880 U */
  127. + { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881 U */
  128. + { USB_DEVICE(0x1199, 0x6859) }, /* Sierra Wireless AirCard 885 E */
  129. + { USB_DEVICE(0x1199, 0x685A) }, /* Sierra Wireless AirCard 885 E */
  130. +
  131. + { USB_DEVICE(0x1199, 0x6468) }, /* Sierra Wireless MP3G - EVDO */
  132. + { USB_DEVICE(0x1199, 0x6469) }, /* Sierra Wireless MP3G - UMTS/HSPA */
  133. +
  134. + { USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless AirCard 580 */
  135. + { USB_DEVICE(0x0F3D, 0x0112) }, /* AirPrime/Sierra Wireless PC 5220 */
  136. + { USB_DEVICE(0x05C6, 0x6613) }, /* Onda H600/ZTE MF330 */
  137. + { }
  138. +};
  139. +
  140. +MODULE_DEVICE_TABLE(usb, id_table);
  141. +
  142. +static struct usb_driver sierra_driver = {
  143. +// .owner = THIS_MODULE,
  144. + .name = "Sierra wireless",
  145. + .probe = usb_serial_probe,
  146. + .disconnect = usb_serial_disconnect,
  147. + .id_table = id_table,
  148. +};
  149. +
  150. +static struct usb_serial_device_type sierra_device = {
  151. +// .driver = {
  152. + .owner = THIS_MODULE,
  153. + .name = "Sierra Wireless",
  154. +// },
  155. + .id_table = id_table,
  156. + .num_interrupt_in = NUM_DONT_CARE,
  157. + .num_bulk_in = NUM_DONT_CARE,
  158. + .num_bulk_out = NUM_DONT_CARE,
  159. + .num_ports = 3,
  160. + //.startup = sw_attach,
  161. + .shutdown = sw_usb_serial_generic_shutdown,
  162. + .open = sw_usb_serial_generic_open,
  163. + .close = sw_usb_serial_generic_close,
  164. +};
  165. +
  166. +#define MAX_NUM_PORTS 8
  167. +
  168. +/* local function prototypes */
  169. +static int serial_open (struct tty_struct *tty, struct file * filp);
  170. +static void serial_close (struct tty_struct *tty, struct file * filp);
  171. +static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count);
  172. +static int serial_write_room (struct tty_struct *tty);
  173. +static int serial_chars_in_buffer (struct tty_struct *tty);
  174. +static void serial_throttle (struct tty_struct * tty);
  175. +static void serial_unthrottle (struct tty_struct * tty);
  176. +static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg);
  177. +static void serial_set_termios (struct tty_struct *tty, struct termios * old);
  178. +//static void serial_shutdown (struct usb_serial *serial);
  179. +static void serial_break (struct tty_struct *tty, int break_state);
  180. +static int generic_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count);
  181. +static int generic_write_room (struct usb_serial_port *port);
  182. +static void generic_cleanup (struct usb_serial_port *port);
  183. +static int generic_chars_in_buffer (struct usb_serial_port *port);
  184. +//static void generic_shutdown (struct usb_serial *serial);
  185. +
  186. +#if 1
  187. +static struct tty_driver serial_tty_driver = {
  188. + .magic = TTY_DRIVER_MAGIC,
  189. + .driver_name = "usb-serial",
  190. +#ifndef CONFIG_DEVFS_FS
  191. + .name = "ttyUSB",
  192. +#else
  193. + .name = "usb/tts/%d",
  194. +#endif
  195. + .major = SERIAL_TTY_MAJOR,
  196. + .minor_start = 0,
  197. + .num = SERIAL_TTY_MINORS,
  198. + .type = TTY_DRIVER_TYPE_SERIAL,
  199. + .subtype = SERIAL_TYPE_NORMAL,
  200. + .flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,
  201. +
  202. + .refcount = &serial_refcount,
  203. + .table = serial_tty,
  204. + .termios = serial_termios,
  205. + .termios_locked = serial_termios_locked,
  206. +
  207. + .open = serial_open,
  208. + .close = serial_close,
  209. + .write = serial_write,
  210. + .write_room = serial_write_room,
  211. + .ioctl = serial_ioctl,
  212. + .set_termios = serial_set_termios,
  213. + .throttle = serial_throttle,
  214. + .unthrottle = serial_unthrottle,
  215. + .break_ctl = serial_break,
  216. + .chars_in_buffer = serial_chars_in_buffer,
  217. + .read_proc = serial_read_proc,
  218. +};
  219. +#endif
  220. +
  221. +
  222. +/*****************************************************************************
  223. + * Driver tty interface functions
  224. + *****************************************************************************/
  225. +static struct usb_serial *get_serial_by_minor (unsigned int minor)
  226. +{
  227. + return serial_table[minor];
  228. +}
  229. +
  230. +static int serial_open (struct tty_struct *tty, struct file * filp)
  231. +{
  232. + struct usb_serial *serial;
  233. + struct usb_serial_port *port;
  234. + unsigned int portNumber;
  235. + int retval = 0;
  236. +
  237. + dbg("%s", __FUNCTION__);
  238. +
  239. + /* initialize the pointer incase something fails */
  240. + tty->driver_data = NULL;
  241. +
  242. + /* get the serial object associated with this tty pointer */
  243. + serial = get_serial_by_minor (MINOR(tty->device));
  244. +
  245. + if (serial_paranoia_check (serial, __FUNCTION__))
  246. + return -ENODEV;
  247. +
  248. + /* set up our port structure making the tty driver remember our port object, and us it */
  249. + portNumber = MINOR(tty->device) - serial->minor;
  250. + port = &serial->port[portNumber];
  251. + tty->driver_data = port;
  252. +
  253. + down (&port->sem);
  254. + port->tty = tty;
  255. +
  256. + /* lock this module before we call it */
  257. + if (serial->type->owner)
  258. + __MOD_INC_USE_COUNT(serial->type->owner);
  259. +
  260. + ++port->open_count;
  261. + if (port->open_count == 1) {
  262. + /* only call the device specific open if this
  263. + * is the first time the port is opened */
  264. + if (serial->type->open)
  265. + retval = serial->type->open(port, filp);
  266. + else
  267. + retval = sw_usb_serial_generic_open(port, filp);//@.@
  268. + }
  269. +
  270. + if (retval) {
  271. + port->open_count = 0;
  272. + if (serial->type->owner)
  273. + __MOD_DEC_USE_COUNT(serial->type->owner);
  274. + }
  275. +
  276. + up (&port->sem);
  277. + return retval;
  278. +}
  279. +
  280. +static void __serial_close(struct usb_serial_port *port, struct file *filp)
  281. +{
  282. + if (!port->open_count) {
  283. + dbg ("%s - port not opened", __FUNCTION__);
  284. + return;
  285. + }
  286. +
  287. + --port->open_count;
  288. + if (port->open_count <= 0) {
  289. + /* only call the device specific close if this
  290. + * port is being closed by the last owner */
  291. + if (port->serial->type->close)
  292. + port->serial->type->close(port, filp);
  293. + else
  294. + //generic_close(port, filp);
  295. + sw_usb_serial_generic_close(port, filp);
  296. + port->open_count = 0;
  297. + }
  298. +
  299. + if (port->serial->type->owner)
  300. + __MOD_DEC_USE_COUNT(port->serial->type->owner);
  301. +}
  302. +
  303. +static void serial_close(struct tty_struct *tty, struct file * filp)
  304. +{
  305. + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
  306. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  307. +
  308. + if (!serial)
  309. + return;
  310. +
  311. + down (&port->sem);
  312. +
  313. + dbg("%s - port %d", __FUNCTION__, port->number);
  314. +
  315. + /* if disconnect beat us to the punch here, there's nothing to do */
  316. + if (tty->driver_data) {
  317. + __serial_close(port, filp);
  318. + }
  319. +
  320. + up (&port->sem);
  321. +}
  322. +
  323. +static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count)
  324. +{
  325. + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
  326. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  327. + int retval = -EINVAL;
  328. +
  329. + if (!serial)
  330. + return -ENODEV;
  331. +
  332. + down (&port->sem);
  333. +
  334. + dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count);
  335. +
  336. + if (!port->open_count) {
  337. + dbg("%s - port not opened", __FUNCTION__);
  338. + goto exit;
  339. + }
  340. +
  341. + /* pass on to the driver specific version of this function if it is available */
  342. + if (serial->type->write)
  343. + retval = serial->type->write(port, from_user, buf, count);
  344. + else
  345. + retval = generic_write(port, from_user, buf, count);
  346. +
  347. +exit:
  348. + up (&port->sem);
  349. + return retval;
  350. +}
  351. +
  352. +static int serial_write_room (struct tty_struct *tty)
  353. +{
  354. + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
  355. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  356. + int retval = -EINVAL;
  357. +
  358. + if (!serial)
  359. + return -ENODEV;
  360. +
  361. + down (&port->sem);
  362. +
  363. + dbg("%s - port %d", __FUNCTION__, port->number);
  364. +
  365. + if (!port->open_count) {
  366. + dbg("%s - port not open", __FUNCTION__);
  367. + goto exit;
  368. + }
  369. +
  370. + /* pass on to the driver specific version of this function if it is available */
  371. + if (serial->type->write_room)
  372. + retval = serial->type->write_room(port);
  373. + else
  374. + retval = generic_write_room(port);
  375. +
  376. +exit:
  377. + up (&port->sem);
  378. + return retval;
  379. +}
  380. +
  381. +static int serial_chars_in_buffer (struct tty_struct *tty)
  382. +{
  383. + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
  384. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  385. + int retval = -EINVAL;
  386. +
  387. + if (!serial)
  388. + return -ENODEV;
  389. +
  390. + down (&port->sem);
  391. +
  392. + dbg("%s = port %d", __FUNCTION__, port->number);
  393. +
  394. + if (!port->open_count) {
  395. + dbg("%s - port not open", __FUNCTION__);
  396. + goto exit;
  397. + }
  398. +
  399. + /* pass on to the driver specific version of this function if it is available */
  400. + if (serial->type->chars_in_buffer)
  401. + retval = serial->type->chars_in_buffer(port);
  402. + else
  403. + retval = generic_chars_in_buffer(port);
  404. +
  405. +exit:
  406. + up (&port->sem);
  407. + return retval;
  408. +}
  409. +
  410. +static void serial_throttle (struct tty_struct * tty)
  411. +{
  412. + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
  413. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  414. +
  415. + if (!serial)
  416. + return;
  417. +
  418. + down (&port->sem);
  419. +
  420. + dbg("%s - port %d", __FUNCTION__, port->number);
  421. +
  422. + if (!port->open_count) {
  423. + dbg ("%s - port not open", __FUNCTION__);
  424. + goto exit;
  425. + }
  426. +
  427. + /* pass on to the driver specific version of this function */
  428. + if (serial->type->throttle)
  429. + serial->type->throttle(port);
  430. +
  431. +exit:
  432. + up (&port->sem);
  433. +}
  434. +
  435. +static void serial_unthrottle (struct tty_struct * tty)
  436. +{
  437. + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
  438. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  439. +
  440. + if (!serial)
  441. + return;
  442. +
  443. + down (&port->sem);
  444. +
  445. + dbg("%s - port %d", __FUNCTION__, port->number);
  446. +
  447. + if (!port->open_count) {
  448. + dbg("%s - port not open", __FUNCTION__);
  449. + goto exit;
  450. + }
  451. +
  452. + /* pass on to the driver specific version of this function */
  453. + if (serial->type->unthrottle)
  454. + serial->type->unthrottle(port);
  455. +
  456. +exit:
  457. + up (&port->sem);
  458. +}
  459. +
  460. +static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg)
  461. +{
  462. + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
  463. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  464. + int retval = -ENODEV;
  465. +
  466. + if (!serial)
  467. + return -ENODEV;
  468. +
  469. + down (&port->sem);
  470. +
  471. + dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
  472. +
  473. + if (!port->open_count) {
  474. + dbg ("%s - port not open", __FUNCTION__);
  475. + goto exit;
  476. + }
  477. +
  478. + /* pass on to the driver specific version of this function if it is available */
  479. + if (serial->type->ioctl)
  480. + retval = serial->type->ioctl(port, file, cmd, arg);
  481. + else
  482. + retval = -ENOIOCTLCMD;
  483. +
  484. +exit:
  485. + up (&port->sem);
  486. + return retval;
  487. +}
  488. +
  489. +static void serial_set_termios (struct tty_struct *tty, struct termios * old)
  490. +{
  491. + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
  492. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  493. +
  494. + if (!serial)
  495. + return;
  496. +
  497. + down (&port->sem);
  498. +
  499. + dbg("%s - port %d", __FUNCTION__, port->number);
  500. +
  501. + if (!port->open_count) {
  502. + dbg("%s - port not open", __FUNCTION__);
  503. + goto exit;
  504. + }
  505. +
  506. + /* pass on to the driver specific version of this function if it is available */
  507. + if (serial->type->set_termios)
  508. + serial->type->set_termios(port, old);
  509. +
  510. +exit:
  511. + up (&port->sem);
  512. +}
  513. +
  514. +static void serial_break (struct tty_struct *tty, int break_state)
  515. +{
  516. + struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
  517. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  518. +
  519. + if (!serial)
  520. + return;
  521. +
  522. + down (&port->sem);
  523. +
  524. + dbg("%s - port %d", __FUNCTION__, port->number);
  525. +
  526. + if (!port->open_count) {
  527. + dbg("%s - port not open", __FUNCTION__);
  528. + goto exit;
  529. + }
  530. +
  531. + /* pass on to the driver specific version of this function if it is available */
  532. + if (serial->type->break_ctl)
  533. + serial->type->break_ctl(port, break_state);
  534. +
  535. +exit:
  536. + up (&port->sem);
  537. +}
  538. +#if 0
  539. +static void serial_shutdown (struct usb_serial *serial)
  540. +{
  541. + dbg ("%s", __FUNCTION__);
  542. +
  543. + if (serial->type->shutdown)
  544. + serial->type->shutdown(serial);
  545. + else
  546. + generic_shutdown(serial);
  547. +}
  548. +#endif
  549. +static int serial_read_proc (char *page, char **start, off_t off, int count, int *eof, void *data)
  550. +{
  551. + struct usb_serial *serial;
  552. + int length = 0;
  553. + int i;
  554. + off_t begin = 0;
  555. + char tmp[40];
  556. +
  557. + dbg("%s", __FUNCTION__);
  558. + length += sprintf (page, "usbserinfo:1.0 driver:%s\n", DRIVER_VERSION);
  559. + for (i = 0; i < SERIAL_TTY_MINORS && length < PAGE_SIZE; ++i) {
  560. + serial = get_serial_by_minor(i);
  561. + if (serial == NULL)
  562. + continue;
  563. +
  564. + length += sprintf (page+length, "%d:", i);
  565. + if (serial->type->owner)
  566. + length += sprintf (page+length, " module:%s", serial->type->owner->name);
  567. + length += sprintf (page+length, " name:\"%s\"", serial->type->name);
  568. + length += sprintf (page+length, " vendor:%04x product:%04x", serial->vendor, serial->product);
  569. + length += sprintf (page+length, " num_ports:%d", serial->num_ports);
  570. + length += sprintf (page+length, " port:%d", i - serial->minor + 1);
  571. +
  572. + usb_make_path(serial->dev, tmp, sizeof(tmp));
  573. + length += sprintf (page+length, " path:%s", tmp);
  574. +
  575. + length += sprintf (page+length, "\n");
  576. + if ((length + begin) > (off + count))
  577. + goto done;
  578. + if ((length + begin) < off) {
  579. + begin += length;
  580. + length = 0;
  581. + }
  582. + }
  583. + *eof = 1;
  584. +done:
  585. + if (off >= (length + begin))
  586. + return 0;
  587. + *start = page + (off-begin);
  588. + return ((count < begin+length-off) ? count : begin+length-off);
  589. +}
  590. +
  591. +
  592. +/*-----------------------------------------------------------*/
  593. +static int generic_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count)
  594. +{
  595. + struct usb_serial *serial = port->serial;
  596. + int result;
  597. +
  598. + dbg("%s - port %d", __FUNCTION__, port->number);
  599. +
  600. + if (count == 0) {
  601. + dbg("%s - write request of 0 bytes", __FUNCTION__);
  602. + return (0);
  603. + }
  604. +
  605. + /* only do something if we have a bulk out endpoint */
  606. + if (serial->num_bulk_out) {
  607. + if (port->write_urb->status == -EINPROGRESS) {
  608. + dbg("%s - already writing", __FUNCTION__);
  609. + return (0);
  610. + }
  611. +
  612. + count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
  613. +
  614. + if (from_user) {
  615. + if (copy_from_user(port->write_urb->transfer_buffer, buf, count))
  616. + return -EFAULT;
  617. + }
  618. + else {
  619. + memcpy (port->write_urb->transfer_buffer, buf, count);
  620. + }
  621. +
  622. + usb_serial_debug_data (__FILE__, __FUNCTION__, count, port->write_urb->transfer_buffer);
  623. +
  624. + /* set up our urb */
  625. + usb_fill_bulk_urb (port->write_urb, serial->dev,
  626. + usb_sndbulkpipe (serial->dev,
  627. + port->bulk_out_endpointAddress),
  628. + port->write_urb->transfer_buffer, count,
  629. + ((serial->type->write_bulk_callback) ?
  630. + serial->type->write_bulk_callback :
  631. + generic_write_bulk_callback), port);
  632. +
  633. + /* send the data out the bulk port */
  634. + result = usb_submit_urb(port->write_urb);
  635. + if (result)
  636. + err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
  637. + else
  638. + result = count;
  639. +
  640. + return result;
  641. + }
  642. +
  643. + /* no bulk out, so return 0 bytes written */
  644. + return (0);
  645. +}
  646. +
  647. +static int generic_write_room (struct usb_serial_port *port)
  648. +{
  649. + struct usb_serial *serial = port->serial;
  650. + int room = 0;
  651. +
  652. + dbg("%s - port %d", __FUNCTION__, port->number);
  653. +
  654. + if (serial->num_bulk_out) {
  655. + if (port->write_urb->status != -EINPROGRESS)
  656. + room = port->bulk_out_size;
  657. + }
  658. +
  659. + dbg("%s - returns %d", __FUNCTION__, room);
  660. + return (room);
  661. +}
  662. +
  663. +static int generic_chars_in_buffer (struct usb_serial_port *port)
  664. +{
  665. + struct usb_serial *serial = port->serial;
  666. + int chars = 0;
  667. +
  668. + dbg("%s - port %d", __FUNCTION__, port->number);
  669. +
  670. + if (serial->num_bulk_out) {
  671. + if (port->write_urb->status == -EINPROGRESS)
  672. + chars = port->write_urb->transfer_buffer_length;
  673. + }
  674. +
  675. + dbg("%s - returns %d", __FUNCTION__, chars);
  676. + return (chars);
  677. +}
  678. +#if 0
  679. +static void generic_shutdown (struct usb_serial *serial)
  680. +{
  681. + int i;
  682. +
  683. + dbg("%s", __FUNCTION__);
  684. +
  685. + /* stop reads and writes on all ports */
  686. + for (i=0; i < serial->num_ports; ++i) {
  687. + generic_cleanup (&serial->port[i]);
  688. + }
  689. +}
  690. +static void generic_cleanup (struct usb_serial_port *port)
  691. +{
  692. + struct usb_serial *serial = port->serial;
  693. +
  694. + dbg("%s - port %d", __FUNCTION__, port->number);
  695. +
  696. + if (serial->dev) {
  697. + /* shutdown any bulk reads that might be going on */
  698. + if (serial->num_bulk_out)
  699. + usb_unlink_urb (port->write_urb);
  700. + if (serial->num_bulk_in)
  701. + usb_unlink_urb (port->read_urb);
  702. + }
  703. +}
  704. +#endif
  705. +/*----------------------------------------------------------*/
  706. +static void generic_write_bulk_callback (struct urb *urb)
  707. +{
  708. + struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
  709. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  710. +
  711. + dbg("%s - port %d", __FUNCTION__, port->number);
  712. +
  713. + if (!serial) {
  714. + dbg("%s - bad serial pointer, exiting", __FUNCTION__);
  715. + return;
  716. + }
  717. +
  718. + if (urb->status) {
  719. + dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
  720. + return;
  721. + }
  722. +
  723. + queue_task(&port->tqueue, &tq_immediate);
  724. + mark_bh(IMMEDIATE_BH);
  725. +
  726. + return;
  727. +}
  728. +
  729. +static struct usb_serial *get_free_serial (int num_ports, int *minor)
  730. +{
  731. + struct usb_serial *serial = NULL;
  732. + int i, j;
  733. + int good_spot;
  734. +
  735. + dbg("%s %d", __FUNCTION__, num_ports);
  736. +
  737. + *minor = 0;
  738. + for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
  739. + if (serial_table[i])
  740. + continue;
  741. +
  742. + good_spot = 1;
  743. + for (j = 1; j <= num_ports-1; ++j)
  744. + if (serial_table[i+j])
  745. + good_spot = 0;
  746. + if (good_spot == 0)
  747. + continue;
  748. +
  749. + if (!(serial = kmalloc(sizeof(struct usb_serial), GFP_KERNEL))) {
  750. + err("%s - Out of memory", __FUNCTION__);
  751. + return NULL;
  752. + }
  753. + memset(serial, 0, sizeof(struct usb_serial));
  754. + serial->magic = USB_SERIAL_MAGIC;
  755. + serial_table[i] = serial;
  756. + *minor = i;
  757. + dbg("%s - minor base = %d", __FUNCTION__, *minor);
  758. + for (i = *minor+1; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i)
  759. + serial_table[i] = serial;
  760. + return serial;
  761. + }
  762. + return NULL;
  763. +}
  764. +
  765. +static void return_serial (struct usb_serial *serial)
  766. +{
  767. + int i;
  768. +
  769. + dbg("%s", __FUNCTION__);
  770. +
  771. + if (serial == NULL)
  772. + return;
  773. +
  774. + for (i = 0; i < serial->num_ports; ++i) {
  775. + serial_table[serial->minor + i] = NULL;
  776. + }
  777. +
  778. + return;
  779. +}
  780. +
  781. +static void port_softint(void *private)
  782. +{
  783. + struct usb_serial_port *port = (struct usb_serial_port *)private;
  784. + struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  785. + struct tty_struct *tty;
  786. +
  787. + dbg("%s - port %d", __FUNCTION__, port->number);
  788. +
  789. + if (!serial)
  790. + return;
  791. +
  792. + tty = port->tty;
  793. + if (!tty)
  794. + return;
  795. +
  796. + if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) {
  797. + dbg("%s - write wakeup call.", __FUNCTION__);
  798. + (tty->ldisc.write_wakeup)(tty);
  799. + }
  800. +
  801. + wake_up_interruptible(&tty->write_wait);
  802. +}
  803. +
  804. +
  805. +static void * usb_serial_probe(struct usb_device *dev, unsigned int ifnum,
  806. + const struct usb_device_id *id)
  807. +{
  808. + struct usb_serial *serial = NULL;
  809. + struct usb_serial_port *port;
  810. + struct usb_interface *interface;
  811. + struct usb_interface_descriptor *iface_desc;
  812. + struct usb_endpoint_descriptor *endpoint;
  813. + struct usb_endpoint_descriptor *interrupt_in_endpoint[MAX_NUM_PORTS];
  814. + struct usb_endpoint_descriptor *bulk_in_endpoint[MAX_NUM_PORTS];
  815. + struct usb_endpoint_descriptor *bulk_out_endpoint[MAX_NUM_PORTS];
  816. + struct usb_serial_device_type *type = NULL;
  817. + struct list_head *tmp;
  818. + int found;
  819. + int minor;
  820. + int buffer_size;
  821. + int i;
  822. + int num_interrupt_in = 0;
  823. + int num_bulk_in = 0;
  824. + int num_bulk_out = 0;
  825. + int num_ports;
  826. + int max_endpoints;
  827. + const struct usb_device_id *id_pattern = NULL;
  828. +
  829. + /* loop through our list of known serial converters, and see if this
  830. + device matches. */
  831. + found = 0;
  832. + interface = &dev->actconfig->interface[ifnum];
  833. + list_for_each (tmp, &usb_serial_driver_list) {
  834. + type = list_entry(tmp, struct usb_serial_device_type, driver_list);
  835. + id_pattern = usb_match_id(dev, interface, type->id_table);
  836. + if (id_pattern != NULL) {
  837. + dbg("descriptor matches");
  838. + found = 1;
  839. + break;
  840. + }
  841. + }
  842. + if (!found) {
  843. + /* no match */
  844. + dbg("none matched");
  845. + return(NULL);
  846. + }
  847. + /* descriptor matches, let's find the endpoints needed */
  848. + /* check out the endpoints */
  849. + iface_desc = &interface->altsetting[0];
  850. + for (i = 0; i < iface_desc->bNumEndpoints; ++i) {
  851. + endpoint = &iface_desc->endpoint[i];
  852. +
  853. + if ((endpoint->bEndpointAddress & 0x80) &&
  854. + ((endpoint->bmAttributes & 3) == 0x02)) {
  855. + /* we found a bulk in endpoint */
  856. + dbg("found bulk in");
  857. + bulk_in_endpoint[num_bulk_in] = endpoint;
  858. + ++num_bulk_in;
  859. + }
  860. +
  861. + if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&
  862. + ((endpoint->bmAttributes & 3) == 0x02)) {
  863. + /* we found a bulk out endpoint */
  864. + dbg("found bulk out");
  865. + bulk_out_endpoint[num_bulk_out] = endpoint;
  866. + ++num_bulk_out;
  867. + }
  868. +
  869. + if ((endpoint->bEndpointAddress & 0x80) &&
  870. + ((endpoint->bmAttributes & 3) == 0x03)) {
  871. + /* we found a interrupt in endpoint */
  872. + dbg("found interrupt in");
  873. + interrupt_in_endpoint[num_interrupt_in] = endpoint;
  874. + ++num_interrupt_in;
  875. + }
  876. + }
  877. +
  878. +#if defined(CONFIG_USB_SERIAL_PL2303) || defined(CONFIG_USB_SERIAL_PL2303_MODULE)
  879. + /* BEGIN HORRIBLE HACK FOR PL2303 */
  880. + /* this is needed due to the looney way its endpoints are set up */
  881. + if (((dev->descriptor.idVendor == PL2303_VENDOR_ID) &&
  882. + (dev->descriptor.idProduct == PL2303_PRODUCT_ID)) ||
  883. + ((dev->descriptor.idVendor == ATEN_VENDOR_ID) &&
  884. + (dev->descriptor.idProduct == ATEN_PRODUCT_ID))) {
  885. + if (ifnum == 1) {
  886. + /* check out the endpoints of the other interface*/
  887. + interface = &dev->actconfig->interface[ifnum ^ 1];
  888. + iface_desc = &interface->altsetting[0];
  889. + for (i = 0; i < iface_desc->bNumEndpoints; ++i) {
  890. + endpoint = &iface_desc->endpoint[i];
  891. + if ((endpoint->bEndpointAddress & 0x80) &&
  892. + ((endpoint->bmAttributes & 3) == 0x03)) {
  893. + /* we found a interrupt in endpoint */
  894. + dbg("found interrupt in for Prolific device on separate interface");
  895. + interrupt_in_endpoint[num_interrupt_in] = endpoint;
  896. + ++num_interrupt_in;
  897. + }
  898. + }
  899. + }
  900. +
  901. + /* Now make sure the PL-2303 is configured correctly.
  902. + * If not, give up now and hope this hack will work
  903. + * properly during a later invocation of usb_serial_probe
  904. + */
  905. + if (num_bulk_in == 0 || num_bulk_out == 0) {
  906. + info("PL-2303 hack: descriptors matched but endpoints did not");
  907. + return NULL;
  908. + }
  909. + }
  910. + /* END HORRIBLE HACK FOR PL2303 */
  911. +#endif
  912. +
  913. + /* found all that we need */
  914. + info("%s converter detected", type->name);
  915. +
  916. +#ifdef CONFIG_USB_SERIAL_SIERRAWIRELESS
  917. + if (type == &sierra_driver) {
  918. + num_ports = num_bulk_out;
  919. + if (num_ports == 0) {
  920. + err("Sierra 3G device with no bulk out, not allowed.");
  921. + return NULL;
  922. + }
  923. + } else
  924. +#endif
  925. + num_ports = type->num_ports;
  926. +
  927. + serial = get_free_serial (num_ports, &minor);
  928. + if (serial == NULL) {
  929. + err("No more free serial devices");
  930. + return NULL;
  931. + }
  932. +
  933. + serial->dev = dev;
  934. + serial->type = type;
  935. + serial->interface = interface;
  936. + serial->minor = minor;
  937. + serial->num_ports = num_ports;
  938. + serial->num_bulk_in = num_bulk_in;
  939. + serial->num_bulk_out = num_bulk_out;
  940. + serial->num_interrupt_in = num_interrupt_in;
  941. + serial->vendor = dev->descriptor.idVendor;
  942. + serial->product = dev->descriptor.idProduct;
  943. +
  944. + /* set up the endpoint information */
  945. + for (i = 0; i < num_bulk_in; ++i) {
  946. + endpoint = bulk_in_endpoint[i];
  947. + port = &serial->port[i];
  948. + port->read_urb = usb_alloc_urb (0);
  949. + if (!port->read_urb) {
  950. + err("No free urbs available");
  951. + goto probe_error;
  952. + }
  953. +//Amin marked buffer_size = endpoint->wMaxPacketSize;
  954. +// ===> 20060310 Amin modify for improve EVDO and HSDPA Card
  955. + buffer_size = 2048;
  956. + printk("KERNEL DEBUG => USBSERIAL.O buffer_size = 2048\n");
  957. +// <=== 20060310 Amin modify for improve EVDO and HSDPA Card
  958. + port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
  959. + port->bulk_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
  960. + if (!port->bulk_in_buffer) {
  961. + err("Couldn't allocate bulk_in_buffer");
  962. + goto probe_error;
  963. + }
  964. + usb_fill_bulk_urb (port->read_urb, dev,
  965. + usb_rcvbulkpipe (dev,
  966. + endpoint->bEndpointAddress),
  967. + port->bulk_in_buffer, buffer_size,
  968. + ((serial->type->read_bulk_callback) ?
  969. + serial->type->read_bulk_callback :
  970. + sw_usb_serial_generic_read_bulk_callback),
  971. + port);
  972. + }
  973. +
  974. + for (i = 0; i < num_bulk_out; ++i) {
  975. + endpoint = bulk_out_endpoint[i];
  976. + port = &serial->port[i];
  977. + port->write_urb = usb_alloc_urb(0);
  978. + if (!port->write_urb) {
  979. + err("No free urbs available");
  980. + goto probe_error;
  981. + }
  982. + buffer_size = endpoint->wMaxPacketSize;
  983. + port->bulk_out_size = buffer_size;
  984. + port->bulk_out_endpointAddress = endpoint->bEndpointAddress;
  985. + port->bulk_out_buffer = kmalloc (buffer_size, GFP_KERNEL);
  986. + if (!port->bulk_out_buffer) {
  987. + err("Couldn't allocate bulk_out_buffer");
  988. + goto probe_error;
  989. + }
  990. + usb_fill_bulk_urb (port->write_urb, dev,
  991. + usb_sndbulkpipe (dev,
  992. + endpoint->bEndpointAddress),
  993. + port->bulk_out_buffer, buffer_size,
  994. + ((serial->type->write_bulk_callback) ?
  995. + serial->type->write_bulk_callback :
  996. + generic_write_bulk_callback),
  997. + port);
  998. + }
  999. +
  1000. + for (i = 0; i < num_interrupt_in; ++i) {
  1001. + endpoint = interrupt_in_endpoint[i];
  1002. + port = &serial->port[i];
  1003. + port->interrupt_in_urb = usb_alloc_urb(0);
  1004. + if (!port->interrupt_in_urb) {
  1005. + err("No free urbs available");
  1006. + goto probe_error;
  1007. + }
  1008. + buffer_size = endpoint->wMaxPacketSize;
  1009. + port->interrupt_in_endpointAddress = endpoint->bEndpointAddress;
  1010. + port->interrupt_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
  1011. + if (!port->interrupt_in_buffer) {
  1012. + err("Couldn't allocate interrupt_in_buffer");
  1013. + goto probe_error;
  1014. + }
  1015. + usb_fill_int_urb (port->interrupt_in_urb, dev,
  1016. + usb_rcvintpipe (dev,
  1017. + endpoint->bEndpointAddress),
  1018. + port->interrupt_in_buffer, buffer_size,
  1019. + serial->type->read_int_callback, port,
  1020. + endpoint->bInterval);
  1021. + }
  1022. +
  1023. + /* initialize some parts of the port structures */
  1024. + /* we don't use num_ports here cauz some devices have more endpoint pairs than ports */
  1025. + max_endpoints = max(num_bulk_in, num_bulk_out);
  1026. + max_endpoints = max(max_endpoints, num_interrupt_in);
  1027. + max_endpoints = max(max_endpoints, (int)serial->num_ports);
  1028. + dbg("%s - setting up %d port structures for this device", __FUNCTION__, max_endpoints);
  1029. + for (i = 0; i < max_endpoints; ++i) {
  1030. + port = &serial->port[i];
  1031. + port->number = i + serial->minor;
  1032. + port->serial = serial;
  1033. + port->magic = USB_SERIAL_PORT_MAGIC;
  1034. + port->tqueue.routine = port_softint;
  1035. + port->tqueue.data = port;
  1036. + init_MUTEX (&port->sem);
  1037. + }
  1038. +
  1039. + /* if this device type has a startup function, call it */
  1040. + if (type->startup) {
  1041. + i = type->startup (serial);
  1042. + if (i < 0)
  1043. + goto probe_error;
  1044. + if (i > 0)
  1045. + return serial;
  1046. + }
  1047. +
  1048. + /* initialize the devfs nodes for this device and let the user know what ports we are bound to */
  1049. + for (i = 0; i < serial->num_ports; ++i) {
  1050. + tty_register_devfs (&serial_tty_driver, 0, serial->port[i].number);
  1051. + info("%s converter now attached to ttyUSB%d (or usb/tts/%d for devfs)",
  1052. + type->name, serial->port[i].number, serial->port[i].number);
  1053. + }
  1054. +
  1055. + return serial; /* success */
  1056. +
  1057. +
  1058. +probe_error:
  1059. + for (i = 0; i < num_bulk_in; ++i) {
  1060. + port = &serial->port[i];
  1061. + if (port->read_urb)
  1062. + usb_free_urb (port->read_urb);
  1063. + if (port->bulk_in_buffer)
  1064. + kfree (port->bulk_in_buffer);
  1065. + }
  1066. + for (i = 0; i < num_bulk_out; ++i) {
  1067. + port = &serial->port[i];
  1068. + if (port->write_urb)
  1069. + usb_free_urb (port->write_urb);
  1070. + if (port->bulk_out_buffer)
  1071. + kfree (port->bulk_out_buffer);
  1072. + }
  1073. + for (i = 0; i < num_interrupt_in; ++i) {
  1074. + port = &serial->port[i];
  1075. + if (port->interrupt_in_urb)
  1076. + usb_free_urb (port->interrupt_in_urb);
  1077. + if (port->interrupt_in_buffer)
  1078. + kfree (port->interrupt_in_buffer);
  1079. + }
  1080. +
  1081. + /* return the minor range that this device had */
  1082. + return_serial (serial);
  1083. +
  1084. + /* free up any memory that we allocated */
  1085. + kfree (serial);
  1086. + return NULL;
  1087. +}
  1088. +
  1089. +static void usb_serial_disconnect(struct usb_device *dev, void *ptr)
  1090. +{
  1091. + struct usb_serial *serial = (struct usb_serial *) ptr;
  1092. + struct usb_serial_port *port;
  1093. + int i;
  1094. +
  1095. + dbg ("%s", __FUNCTION__);
  1096. + if (serial) {
  1097. + /* fail all future close/read/write/ioctl/etc calls */
  1098. + for (i = 0; i < serial->num_ports; ++i) {
  1099. + port = &serial->port[i];
  1100. + down (&port->sem);
  1101. + if (port->tty != NULL) {
  1102. + while (port->open_count > 0) {
  1103. + //__serial_close(port, NULL);
  1104. + sw_usb_serial_generic_close(port,NULL);
  1105. + }
  1106. + port->tty->driver_data = NULL;
  1107. + }
  1108. + up (&port->sem);
  1109. + }
  1110. +
  1111. + serial->dev = NULL;
  1112. + //serial_shutdown (serial);
  1113. + sw_usb_serial_generic_shutdown(serial);
  1114. +
  1115. + for (i = 0; i < serial->num_ports; ++i)
  1116. + serial->port[i].open_count = 0;
  1117. +
  1118. + for (i = 0; i < serial->num_bulk_in; ++i) {
  1119. + port = &serial->port[i];
  1120. + if (port->read_urb) {
  1121. + usb_unlink_urb (port->read_urb);
  1122. + usb_free_urb (port->read_urb);
  1123. + }
  1124. + if (port->bulk_in_buffer)
  1125. + kfree (port->bulk_in_buffer);
  1126. + }
  1127. + for (i = 0; i < serial->num_bulk_out; ++i) {
  1128. + port = &serial->port[i];
  1129. + if (port->write_urb) {
  1130. + usb_unlink_urb (port->write_urb);
  1131. + usb_free_urb (port->write_urb);
  1132. + }
  1133. + if (port->bulk_out_buffer)
  1134. + kfree (port->bulk_out_buffer);
  1135. + }
  1136. + for (i = 0; i < serial->num_interrupt_in; ++i) {
  1137. + port = &serial->port[i];
  1138. + if (port->interrupt_in_urb) {
  1139. + usb_unlink_urb (port->interrupt_in_urb);
  1140. + usb_free_urb (port->interrupt_in_urb);
  1141. + }
  1142. + if (port->interrupt_in_buffer)
  1143. + kfree (port->interrupt_in_buffer);
  1144. + }
  1145. +
  1146. + for (i = 0; i < serial->num_ports; ++i) {
  1147. + tty_unregister_devfs (&serial_tty_driver, serial->port[i].number);
  1148. + info("%s converter now disconnected from ttyUSB%d", serial->type->name, serial->port[i].number);
  1149. + }
  1150. +
  1151. + /* return the minor range that this device had */
  1152. + return_serial (serial);
  1153. +
  1154. + /* free up any memory that we allocated */
  1155. + kfree (serial);
  1156. +
  1157. + } else {
  1158. + info("device disconnected");
  1159. + }
  1160. +
  1161. +}
  1162. +
  1163. +#if 0
  1164. +static int sw_attach(struct usb_serial *serial)
  1165. +{
  1166. + struct usb_device *hdev = serial->dev;
  1167. + int rc;
  1168. +
  1169. + dbg("%s - serial(0x%p)", __FUNCTION__, serial);
  1170. +
  1171. + rc = usb_control_msg(
  1172. + hdev,
  1173. + usb_sndctrlpipe(hdev, 0),
  1174. + USB_VENDER_REQUEST_SET_DEVICE_POWER_STATE, /* bRequest */
  1175. + USB_TYPE_VENDOR|USB_RECIP_DEVICE, /* bmRequestType */
  1176. + USB_DEVICE_POWER_STATE_D0, /* wValue */
  1177. + 0, /* wIndex */
  1178. + NULL, /* Data */
  1179. + 0, /* wLength */
  1180. + 1000); /* Timeout */
  1181. +
  1182. + err("%s - rc(%d)", __FUNCTION__, rc);
  1183. + return rc;
  1184. +}
  1185. +#endif
  1186. +//void sw_usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
  1187. +static void sw_usb_serial_generic_read_bulk_callback (struct urb *urb)
  1188. +{
  1189. + struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
  1190. + struct usb_serial *serial = port->serial;
  1191. + struct tty_struct *tty;
  1192. + unsigned char *data = urb->transfer_buffer;
  1193. + int result;
  1194. + int i;
  1195. +
  1196. + dbg("%s - port %d", __FUNCTION__, port->number);
  1197. +
  1198. + if (urb->status) {
  1199. + dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
  1200. + return;
  1201. + }
  1202. +
  1203. + //usb_serial_dbg_data(__FILE__, __FUNCTION__, urb->actual_length, data);
  1204. +
  1205. + tty = port->tty;
  1206. + if (tty && urb->actual_length) {
  1207. + #if 0
  1208. + tty_buffer_request_room(tty, urb->actual_length);
  1209. + tty_insert_flip_string(tty, data, urb->actual_length);
  1210. + tty_flip_buffer_push(tty);
  1211. + #endif
  1212. + #if 1
  1213. + for (i = 0; i < urb->actual_length ; ++i) {
  1214. + /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
  1215. + if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
  1216. + tty_flip_buffer_push(tty);
  1217. + }
  1218. + /* this doesn't actually push the data through unless tty->low_latency is set */
  1219. + tty_insert_flip_char(tty, data[i], 0);
  1220. + }
  1221. + tty_flip_buffer_push(tty);
  1222. + #endif
  1223. +
  1224. + }
  1225. + else
  1226. + dbg("%s: empty read urb received", __FUNCTION__);
  1227. +
  1228. + /* Continue trying to always read */
  1229. + usb_fill_bulk_urb (port->read_urb, serial->dev,
  1230. + usb_rcvbulkpipe (serial->dev,
  1231. + port->bulk_in_endpointAddress),
  1232. + port->read_urb->transfer_buffer,
  1233. + port->read_urb->transfer_buffer_length,
  1234. + ((serial->type->read_bulk_callback) ?
  1235. + serial->type->read_bulk_callback :
  1236. + sw_usb_serial_generic_read_bulk_callback), port);
  1237. + result = usb_submit_urb(port->read_urb);
  1238. + //result = usb_submit_urb(port->read_urb, GFP_ATOMIC); //for kernel 2.6
  1239. + if (result)
  1240. + dbg("%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
  1241. +}
  1242. +#if 1
  1243. +static int generic_open (struct usb_serial_port *port, struct file *filp)
  1244. +{
  1245. + struct usb_serial *serial = port->serial;
  1246. + int result = 0;
  1247. +
  1248. + dbg("%s - port %d", __FUNCTION__, port->number);
  1249. +
  1250. + /* force low_latency on so that our tty_push actually forces the data through,
  1251. + otherwise it is scheduled, and with high data rates (like with OHCI) data
  1252. + can get lost. */
  1253. + if (port->tty)
  1254. + port->tty->low_latency = 1;
  1255. +
  1256. + /* if we have a bulk interrupt, start reading from it */
  1257. + if (serial->num_bulk_in) {
  1258. + /* Start reading from the device */
  1259. + usb_fill_bulk_urb (port->read_urb, serial->dev,
  1260. + usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
  1261. + port->read_urb->transfer_buffer,
  1262. + port->read_urb->transfer_buffer_length,
  1263. + ((serial->type->read_bulk_callback) ?
  1264. + serial->type->read_bulk_callback :
  1265. + sw_usb_serial_generic_read_bulk_callback),
  1266. + port);
  1267. + result = usb_submit_urb(port->read_urb); //, GFP_KERNEL);
  1268. + if (result)
  1269. + //dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
  1270. + dbg("%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
  1271. +
  1272. + }
  1273. +
  1274. + return result;
  1275. +}
  1276. +#endif
  1277. +int sw_usb_serial_generic_open (struct usb_serial_port *port, struct file *filp)
  1278. +{
  1279. + int rc;
  1280. + struct usb_serial *serial = port->serial;
  1281. + struct usb_device *hdev = serial->dev;
  1282. +
  1283. + dbg("%s - port %d", __FUNCTION__, port->number);
  1284. +
  1285. + rc = generic_open(port, filp);
  1286. + err("%s - rc(%d)", __FUNCTION__, rc);
  1287. +
  1288. + if(0 == rc)
  1289. + {
  1290. + rc = usb_control_msg(
  1291. + hdev,
  1292. + usb_sndctrlpipe(hdev, 0),
  1293. + SET_CONTROL_LINE_STATE, /* bRequest */
  1294. + USB_TYPE_CLASS|USB_RECIP_INTERFACE, /* bmRequestType */
  1295. + ACM_CTRL_DTR|ACM_CTRL_RTS, /* wValue */
  1296. + 0, /* wIndex */
  1297. + NULL, /* Data */
  1298. + 0, /* wLength */
  1299. + 1000); /* Timeout */
  1300. + err("%s - usb_control_msg: rc(%d)", __FUNCTION__, rc);
  1301. + }
  1302. +
  1303. + return rc;
  1304. +}
  1305. +
  1306. +static void generic_cleanup (struct usb_serial_port *port)
  1307. +{
  1308. + struct usb_serial *serial = port->serial;
  1309. +
  1310. + dbg("%s - port %d", __FUNCTION__, port->number);
  1311. +
  1312. + if (serial->dev) {
  1313. + /* shutdown any bulk reads that might be going on */
  1314. + if (serial->num_bulk_out)
  1315. + usb_unlink_urb(port->write_urb);
  1316. + //usb_kill_urb(port->write_urb);
  1317. + if (serial->num_bulk_in)
  1318. + usb_unlink_urb(port->read_urb);
  1319. + //usb_kill_urb(port->read_urb);
  1320. + }
  1321. +}
  1322. +
  1323. +static void sw_usb_serial_generic_close (struct usb_serial_port *port, struct file * filp)
  1324. +{
  1325. + int rc;
  1326. + struct usb_serial *serial = port->serial;
  1327. + struct usb_device *hdev = serial->dev;
  1328. +
  1329. + dbg("%s - port %d", __FUNCTION__, port->number);
  1330. +
  1331. + rc = usb_control_msg(
  1332. + hdev,
  1333. + usb_sndctrlpipe(hdev, 0),
  1334. + SET_CONTROL_LINE_STATE, /* bRequest */
  1335. + USB_TYPE_CLASS|USB_RECIP_INTERFACE, /* bmRequestType */
  1336. + 0, /* wValue */
  1337. + 0, /* wIndex */
  1338. + NULL, /* Data */
  1339. + 0, /* wLength */
  1340. + 1000); /* Timeout */
  1341. + err("%s - rc(%d)", __FUNCTION__, rc);
  1342. +
  1343. + generic_cleanup (port);
  1344. +}
  1345. +
  1346. +static void sw_usb_serial_generic_shutdown(struct usb_serial *serial)
  1347. +{
  1348. + int i, rc;
  1349. + struct usb_device *hdev = serial->dev;
  1350. +
  1351. + dbg("%s serial(0x%p)", __FUNCTION__, serial);
  1352. +
  1353. + if(hdev)
  1354. + {
  1355. + rc = usb_control_msg(
  1356. + hdev,
  1357. + usb_sndctrlpipe(hdev, 0),
  1358. + USB_VENDER_REQUEST_SET_DEVICE_POWER_STATE, /* bRequest */
  1359. + USB_TYPE_VENDOR|USB_RECIP_DEVICE, /* bmRequestType */
  1360. + USB_DEVICE_POWER_STATE_D3, /* wValue */
  1361. + 0, /* wIndex */
  1362. + NULL, /* Data */
  1363. + 0, /* wLength */
  1364. + 1000); /* Timeout */
  1365. + err("%s - rc(%d)", __FUNCTION__, rc);
  1366. + }
  1367. +
  1368. + /* stop reads and writes on all ports */
  1369. + for (i=0; i < serial->num_ports; ++i) {
  1370. + generic_cleanup(&serial->port[i]);
  1371. + }
  1372. +}
  1373. +int usb_serial_register(struct usb_serial_device_type *new_device)
  1374. +{
  1375. + /* Add this device to our list of devices */
  1376. + list_add(&new_device->driver_list, &usb_serial_driver_list);
  1377. +
  1378. + info ("USB Serial support registered for %s", new_device->name);
  1379. +
  1380. + usb_scan_devices();
  1381. +
  1382. + return 0;
  1383. +}
  1384. +
  1385. +
  1386. +void usb_serial_deregister(struct usb_serial_device_type *device)
  1387. +{
  1388. + struct usb_serial *serial;
  1389. + int i;
  1390. +
  1391. + info("USB Serial deregistering driver %s", device->name);
  1392. +
  1393. + /* clear out the serial_table if the device is attached to a port */
  1394. + for(i = 0; i < SERIAL_TTY_MINORS; ++i) {
  1395. + serial = serial_table[i];
  1396. + if ((serial != NULL) && (serial->type == device)) {
  1397. + usb_driver_release_interface (&sierra_driver, serial->interface);
  1398. + usb_serial_disconnect (NULL, serial);
  1399. + }
  1400. + }
  1401. +
  1402. + list_del(&device->driver_list);
  1403. +}
  1404. +
  1405. +static int __init sierra_init(void)
  1406. +{
  1407. + int retval;
  1408. + int i;
  1409. +
  1410. + /* Initalize our global data */
  1411. + for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
  1412. + serial_table[i] = NULL;
  1413. + }
  1414. +
  1415. + /* register the tty driver */
  1416. + serial_tty_driver.init_termios = tty_std_termios;
  1417. + serial_tty_driver.init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  1418. + if (tty_register_driver (&serial_tty_driver)) {
  1419. + err("%s - failed to register tty driver", __FUNCTION__);
  1420. + return -1;
  1421. + }
  1422. +
  1423. + retval = usb_serial_register(&sierra_device);
  1424. + if (retval)
  1425. + {
  1426. + tty_unregister_driver(&serial_tty_driver);
  1427. + printk("%s return usb_serial_register. retval=[%d].\n",__FUNCTION__, retval);
  1428. + return retval;
  1429. + }
  1430. + retval = usb_register(&sierra_driver);
  1431. + if (retval){
  1432. + usb_serial_deregister(&sierra_device);
  1433. + tty_unregister_driver(&serial_tty_driver);
  1434. + err("usb_register failed for the Sierra 3G USB-Serial driver. Error number %d\n", retval);
  1435. + return -1;
  1436. + }
  1437. +
  1438. + return retval;
  1439. +}
  1440. +
  1441. +static void __exit sierra_exit(void)
  1442. +{
  1443. + usb_deregister(&sierra_driver);
  1444. + usb_serial_deregister(&sierra_device);
  1445. +}
  1446. +
  1447. +module_init(sierra_init);
  1448. +module_exit(sierra_exit);
  1449. +MODULE_LICENSE("GPL");
  1450. --- /dev/null
  1451. +++ b/drivers/usb/serial/sierra.h
  1452. @@ -0,0 +1,32 @@
  1453. +/*
  1454. + * Sierra Wireless CDMA Wireless Serial USB drive
  1455. + *
  1456. + * Current Copy modified by: Kevin Lloyd <[email protected]>
  1457. + * Original Copy written by: 2005 Greg Kroah-Hartman <gregkh <at> suse.de>
  1458. + *
  1459. + *
  1460. + * This program is free software; you can redistribute it and/or
  1461. + * modify it under the terms of the GNU General Public License version
  1462. + * 2 as published by the Free Software Foundation.
  1463. + *
  1464. + * Version history:
  1465. + Version 1.03 (Lloyd):
  1466. + Included support for DTR control and enhanced buffering (should help
  1467. + speed).
  1468. + */
  1469. +
  1470. +#define USB_VENDER_REQUEST_SET_DEVICE_POWER_STATE 0
  1471. +
  1472. +#define USB_DEVICE_POWER_STATE_D0 0x0000
  1473. +#define USB_DEVICE_POWER_STATE_D1 0x0001
  1474. +#define USB_DEVICE_POWER_STATE_D2 0x0002
  1475. +#define USB_DEVICE_POWER_STATE_D3 0x0003
  1476. +
  1477. +#define SET_CONTROL_LINE_STATE 0x22
  1478. +/*
  1479. + * Output control lines.
  1480. + */
  1481. +
  1482. +#define ACM_CTRL_DTR 0x01
  1483. +#define ACM_CTRL_RTS 0x02
  1484. +