moxa.c 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547
  1. /*****************************************************************************/
  2. /*
  3. * moxa.c -- MOXA Intellio family multiport serial driver.
  4. *
  5. * Copyright (C) 1999-2000 Moxa Technologies (support@moxa.com.tw).
  6. *
  7. * This code is loosely based on the Linux serial driver, written by
  8. * Linus Torvalds, Theodore T'so and others.
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. */
  15. /*
  16. * MOXA Intellio Series Driver
  17. * for : LINUX
  18. * date : 1999/1/7
  19. * version : 5.1
  20. */
  21. #include <linux/module.h>
  22. #include <linux/types.h>
  23. #include <linux/mm.h>
  24. #include <linux/ioport.h>
  25. #include <linux/errno.h>
  26. #include <linux/firmware.h>
  27. #include <linux/signal.h>
  28. #include <linux/sched.h>
  29. #include <linux/timer.h>
  30. #include <linux/interrupt.h>
  31. #include <linux/tty.h>
  32. #include <linux/tty_flip.h>
  33. #include <linux/major.h>
  34. #include <linux/string.h>
  35. #include <linux/fcntl.h>
  36. #include <linux/ptrace.h>
  37. #include <linux/serial.h>
  38. #include <linux/tty_driver.h>
  39. #include <linux/delay.h>
  40. #include <linux/pci.h>
  41. #include <linux/init.h>
  42. #include <linux/bitops.h>
  43. #include <linux/completion.h>
  44. #include <asm/system.h>
  45. #include <asm/io.h>
  46. #include <asm/uaccess.h>
  47. #include "moxa.h"
  48. #define MOXA_VERSION "5.1k"
  49. #define MOXA_FW_HDRLEN 32
  50. #define MOXAMAJOR 172
  51. #define MOXACUMAJOR 173
  52. #define MAX_BOARDS 4 /* Don't change this value */
  53. #define MAX_PORTS_PER_BOARD 32 /* Don't change this value */
  54. #define MAX_PORTS (MAX_BOARDS * MAX_PORTS_PER_BOARD)
  55. /*
  56. * Define the Moxa PCI vendor and device IDs.
  57. */
  58. #define MOXA_BUS_TYPE_ISA 0
  59. #define MOXA_BUS_TYPE_PCI 1
  60. enum {
  61. MOXA_BOARD_C218_PCI = 1,
  62. MOXA_BOARD_C218_ISA,
  63. MOXA_BOARD_C320_PCI,
  64. MOXA_BOARD_C320_ISA,
  65. MOXA_BOARD_CP204J,
  66. };
  67. static char *moxa_brdname[] =
  68. {
  69. "C218 Turbo PCI series",
  70. "C218 Turbo ISA series",
  71. "C320 Turbo PCI series",
  72. "C320 Turbo ISA series",
  73. "CP-204J series",
  74. };
  75. #ifdef CONFIG_PCI
  76. static struct pci_device_id moxa_pcibrds[] = {
  77. { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C218),
  78. .driver_data = MOXA_BOARD_C218_PCI },
  79. { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C320),
  80. .driver_data = MOXA_BOARD_C320_PCI },
  81. { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP204J),
  82. .driver_data = MOXA_BOARD_CP204J },
  83. { 0 }
  84. };
  85. MODULE_DEVICE_TABLE(pci, moxa_pcibrds);
  86. #endif /* CONFIG_PCI */
  87. struct moxa_port;
  88. static struct moxa_board_conf {
  89. int boardType;
  90. int numPorts;
  91. int busType;
  92. int loadstat;
  93. struct moxa_port *ports;
  94. void __iomem *basemem;
  95. void __iomem *intNdx;
  96. void __iomem *intPend;
  97. void __iomem *intTable;
  98. } moxa_boards[MAX_BOARDS];
  99. struct mxser_mstatus {
  100. tcflag_t cflag;
  101. int cts;
  102. int dsr;
  103. int ri;
  104. int dcd;
  105. };
  106. struct moxaq_str {
  107. int inq;
  108. int outq;
  109. };
  110. struct moxa_port {
  111. struct moxa_board_conf *board;
  112. int type;
  113. int close_delay;
  114. int count;
  115. int blocked_open;
  116. int asyncflags;
  117. unsigned long statusflags;
  118. struct tty_struct *tty;
  119. int cflag;
  120. wait_queue_head_t open_wait;
  121. struct completion close_wait;
  122. struct timer_list emptyTimer;
  123. char chkPort;
  124. char lineCtrl;
  125. void __iomem *tableAddr;
  126. char DCDState;
  127. char lowChkFlag;
  128. ushort breakCnt;
  129. };
  130. /* statusflags */
  131. #define TXSTOPPED 0x1
  132. #define LOWWAIT 0x2
  133. #define EMPTYWAIT 0x4
  134. #define THROTTLE 0x8
  135. #define SERIAL_DO_RESTART
  136. #define WAKEUP_CHARS 256
  137. static int ttymajor = MOXAMAJOR;
  138. static int moxaCard;
  139. /* Variables for insmod */
  140. #ifdef MODULE
  141. static unsigned long baseaddr[MAX_BOARDS];
  142. static unsigned int type[MAX_BOARDS];
  143. static unsigned int numports[MAX_BOARDS];
  144. #endif
  145. MODULE_AUTHOR("William Chen");
  146. MODULE_DESCRIPTION("MOXA Intellio Family Multiport Board Device Driver");
  147. MODULE_LICENSE("GPL");
  148. #ifdef MODULE
  149. module_param_array(type, uint, NULL, 0);
  150. MODULE_PARM_DESC(type, "card type: C218=2, C320=4");
  151. module_param_array(baseaddr, ulong, NULL, 0);
  152. MODULE_PARM_DESC(baseaddr, "base address");
  153. module_param_array(numports, uint, NULL, 0);
  154. MODULE_PARM_DESC(numports, "numports (ignored for C218)");
  155. #endif
  156. module_param(ttymajor, int, 0);
  157. /*
  158. * static functions:
  159. */
  160. static int moxa_open(struct tty_struct *, struct file *);
  161. static void moxa_close(struct tty_struct *, struct file *);
  162. static int moxa_write(struct tty_struct *, const unsigned char *, int);
  163. static int moxa_write_room(struct tty_struct *);
  164. static void moxa_flush_buffer(struct tty_struct *);
  165. static int moxa_chars_in_buffer(struct tty_struct *);
  166. static void moxa_flush_chars(struct tty_struct *);
  167. static void moxa_put_char(struct tty_struct *, unsigned char);
  168. static int moxa_ioctl(struct tty_struct *, struct file *, unsigned int, unsigned long);
  169. static void moxa_throttle(struct tty_struct *);
  170. static void moxa_unthrottle(struct tty_struct *);
  171. static void moxa_set_termios(struct tty_struct *, struct ktermios *);
  172. static void moxa_stop(struct tty_struct *);
  173. static void moxa_start(struct tty_struct *);
  174. static void moxa_hangup(struct tty_struct *);
  175. static int moxa_tiocmget(struct tty_struct *tty, struct file *file);
  176. static int moxa_tiocmset(struct tty_struct *tty, struct file *file,
  177. unsigned int set, unsigned int clear);
  178. static void moxa_poll(unsigned long);
  179. static void moxa_set_tty_param(struct tty_struct *, struct ktermios *);
  180. static int moxa_block_till_ready(struct tty_struct *, struct file *,
  181. struct moxa_port *);
  182. static void moxa_setup_empty_event(struct tty_struct *);
  183. static void moxa_check_xmit_empty(unsigned long);
  184. static void moxa_shut_down(struct moxa_port *);
  185. static void moxa_receive_data(struct moxa_port *);
  186. /*
  187. * moxa board interface functions:
  188. */
  189. static int MoxaDriverIoctl(struct tty_struct *, unsigned int, unsigned long);
  190. static int MoxaDriverPoll(void);
  191. static int MoxaPortsOfCard(int);
  192. static int MoxaPortIsValid(int);
  193. static void MoxaPortEnable(struct moxa_port *);
  194. static void MoxaPortDisable(struct moxa_port *);
  195. static int MoxaPortSetTermio(struct moxa_port *, struct ktermios *, speed_t);
  196. static int MoxaPortGetLineOut(struct moxa_port *, int *, int *);
  197. static void MoxaPortLineCtrl(struct moxa_port *, int, int);
  198. static void MoxaPortFlowCtrl(struct moxa_port *, int, int, int, int, int);
  199. static int MoxaPortLineStatus(struct moxa_port *);
  200. static int MoxaPortDCDChange(struct moxa_port *);
  201. static int MoxaPortDCDON(struct moxa_port *);
  202. static void MoxaPortFlushData(struct moxa_port *, int);
  203. static int MoxaPortWriteData(struct moxa_port *, unsigned char *, int);
  204. static int MoxaPortReadData(struct moxa_port *, struct tty_struct *tty);
  205. static int MoxaPortTxQueue(struct moxa_port *);
  206. static int MoxaPortRxQueue(struct moxa_port *);
  207. static int MoxaPortTxFree(struct moxa_port *);
  208. static void MoxaPortTxDisable(struct moxa_port *);
  209. static void MoxaPortTxEnable(struct moxa_port *);
  210. static int MoxaPortResetBrkCnt(struct moxa_port *);
  211. static void MoxaPortSendBreak(struct moxa_port *, int);
  212. static int moxa_get_serial_info(struct moxa_port *, struct serial_struct __user *);
  213. static int moxa_set_serial_info(struct moxa_port *, struct serial_struct __user *);
  214. static void MoxaSetFifo(struct moxa_port *port, int enable);
  215. static const struct tty_operations moxa_ops = {
  216. .open = moxa_open,
  217. .close = moxa_close,
  218. .write = moxa_write,
  219. .write_room = moxa_write_room,
  220. .flush_buffer = moxa_flush_buffer,
  221. .chars_in_buffer = moxa_chars_in_buffer,
  222. .flush_chars = moxa_flush_chars,
  223. .put_char = moxa_put_char,
  224. .ioctl = moxa_ioctl,
  225. .throttle = moxa_throttle,
  226. .unthrottle = moxa_unthrottle,
  227. .set_termios = moxa_set_termios,
  228. .stop = moxa_stop,
  229. .start = moxa_start,
  230. .hangup = moxa_hangup,
  231. .tiocmget = moxa_tiocmget,
  232. .tiocmset = moxa_tiocmset,
  233. };
  234. static struct tty_driver *moxaDriver;
  235. static struct moxa_port moxa_ports[MAX_PORTS];
  236. static DEFINE_TIMER(moxaTimer, moxa_poll, 0, 0);
  237. static DEFINE_SPINLOCK(moxa_lock);
  238. static int moxa_check_fw_model(struct moxa_board_conf *brd, u8 model)
  239. {
  240. switch (brd->boardType) {
  241. case MOXA_BOARD_C218_ISA:
  242. case MOXA_BOARD_C218_PCI:
  243. if (model != 1)
  244. goto err;
  245. break;
  246. case MOXA_BOARD_CP204J:
  247. if (model != 3)
  248. goto err;
  249. break;
  250. default:
  251. if (model != 2)
  252. goto err;
  253. break;
  254. }
  255. return 0;
  256. err:
  257. return -EINVAL;
  258. }
  259. static int moxa_check_fw(const void *ptr)
  260. {
  261. const __le16 *lptr = ptr;
  262. if (*lptr != cpu_to_le16(0x7980))
  263. return -EINVAL;
  264. return 0;
  265. }
  266. static int moxa_load_bios(struct moxa_board_conf *brd, const u8 *buf,
  267. size_t len)
  268. {
  269. void __iomem *baseAddr = brd->basemem;
  270. u16 tmp;
  271. writeb(HW_reset, baseAddr + Control_reg); /* reset */
  272. msleep(10);
  273. memset_io(baseAddr, 0, 4096);
  274. memcpy_toio(baseAddr, buf, len); /* download BIOS */
  275. writeb(0, baseAddr + Control_reg); /* restart */
  276. msleep(2000);
  277. switch (brd->boardType) {
  278. case MOXA_BOARD_C218_ISA:
  279. case MOXA_BOARD_C218_PCI:
  280. tmp = readw(baseAddr + C218_key);
  281. if (tmp != C218_KeyCode)
  282. goto err;
  283. break;
  284. case MOXA_BOARD_CP204J:
  285. tmp = readw(baseAddr + C218_key);
  286. if (tmp != CP204J_KeyCode)
  287. goto err;
  288. break;
  289. default:
  290. tmp = readw(baseAddr + C320_key);
  291. if (tmp != C320_KeyCode)
  292. goto err;
  293. tmp = readw(baseAddr + C320_status);
  294. if (tmp != STS_init) {
  295. printk(KERN_ERR "moxa: bios upload failed -- CPU/Basic "
  296. "module not found\n");
  297. return -EIO;
  298. }
  299. break;
  300. }
  301. return 0;
  302. err:
  303. printk(KERN_ERR "moxa: bios upload failed -- board not found\n");
  304. return -EIO;
  305. }
  306. static int moxa_load_320b(struct moxa_board_conf *brd, const u8 *ptr,
  307. size_t len)
  308. {
  309. void __iomem *baseAddr = brd->basemem;
  310. if (len < 7168) {
  311. printk(KERN_ERR "moxa: invalid 320 bios -- too short\n");
  312. return -EINVAL;
  313. }
  314. writew(len - 7168 - 2, baseAddr + C320bapi_len);
  315. writeb(1, baseAddr + Control_reg); /* Select Page 1 */
  316. memcpy_toio(baseAddr + DynPage_addr, ptr, 7168);
  317. writeb(2, baseAddr + Control_reg); /* Select Page 2 */
  318. memcpy_toio(baseAddr + DynPage_addr, ptr + 7168, len - 7168);
  319. return 0;
  320. }
  321. static int moxa_real_load_code(struct moxa_board_conf *brd, const void *ptr,
  322. size_t len)
  323. {
  324. void __iomem *baseAddr = brd->basemem;
  325. const u16 *uptr = ptr;
  326. size_t wlen, len2, j;
  327. unsigned long key, loadbuf, loadlen, checksum, checksum_ok;
  328. unsigned int i, retry, c320;
  329. u16 usum, keycode;
  330. c320 = brd->boardType == MOXA_BOARD_C320_PCI ||
  331. brd->boardType == MOXA_BOARD_C320_ISA;
  332. keycode = (brd->boardType == MOXA_BOARD_CP204J) ? CP204J_KeyCode :
  333. C218_KeyCode;
  334. switch (brd->boardType) {
  335. case MOXA_BOARD_CP204J:
  336. case MOXA_BOARD_C218_ISA:
  337. case MOXA_BOARD_C218_PCI:
  338. key = C218_key;
  339. loadbuf = C218_LoadBuf;
  340. loadlen = C218DLoad_len;
  341. checksum = C218check_sum;
  342. checksum_ok = C218chksum_ok;
  343. break;
  344. default:
  345. key = C320_key;
  346. keycode = C320_KeyCode;
  347. loadbuf = C320_LoadBuf;
  348. loadlen = C320DLoad_len;
  349. checksum = C320check_sum;
  350. checksum_ok = C320chksum_ok;
  351. break;
  352. }
  353. usum = 0;
  354. wlen = len >> 1;
  355. for (i = 0; i < wlen; i++)
  356. usum += le16_to_cpu(uptr[i]);
  357. retry = 0;
  358. do {
  359. wlen = len >> 1;
  360. j = 0;
  361. while (wlen) {
  362. len2 = (wlen > 2048) ? 2048 : wlen;
  363. wlen -= len2;
  364. memcpy_toio(baseAddr + loadbuf, ptr + j, len2 << 1);
  365. j += len2 << 1;
  366. writew(len2, baseAddr + loadlen);
  367. writew(0, baseAddr + key);
  368. for (i = 0; i < 100; i++) {
  369. if (readw(baseAddr + key) == keycode)
  370. break;
  371. msleep(10);
  372. }
  373. if (readw(baseAddr + key) != keycode)
  374. return -EIO;
  375. }
  376. writew(0, baseAddr + loadlen);
  377. writew(usum, baseAddr + checksum);
  378. writew(0, baseAddr + key);
  379. for (i = 0; i < 100; i++) {
  380. if (readw(baseAddr + key) == keycode)
  381. break;
  382. msleep(10);
  383. }
  384. retry++;
  385. } while ((readb(baseAddr + checksum_ok) != 1) && (retry < 3));
  386. if (readb(baseAddr + checksum_ok) != 1)
  387. return -EIO;
  388. writew(0, baseAddr + key);
  389. for (i = 0; i < 600; i++) {
  390. if (readw(baseAddr + Magic_no) == Magic_code)
  391. break;
  392. msleep(10);
  393. }
  394. if (readw(baseAddr + Magic_no) != Magic_code)
  395. return -EIO;
  396. if (c320) {
  397. if (brd->busType == MOXA_BUS_TYPE_PCI) { /* ASIC board */
  398. writew(0x3800, baseAddr + TMS320_PORT1);
  399. writew(0x3900, baseAddr + TMS320_PORT2);
  400. writew(28499, baseAddr + TMS320_CLOCK);
  401. } else {
  402. writew(0x3200, baseAddr + TMS320_PORT1);
  403. writew(0x3400, baseAddr + TMS320_PORT2);
  404. writew(19999, baseAddr + TMS320_CLOCK);
  405. }
  406. }
  407. writew(1, baseAddr + Disable_IRQ);
  408. writew(0, baseAddr + Magic_no);
  409. for (i = 0; i < 500; i++) {
  410. if (readw(baseAddr + Magic_no) == Magic_code)
  411. break;
  412. msleep(10);
  413. }
  414. if (readw(baseAddr + Magic_no) != Magic_code)
  415. return -EIO;
  416. if (c320) {
  417. j = readw(baseAddr + Module_cnt);
  418. if (j <= 0)
  419. return -EIO;
  420. brd->numPorts = j * 8;
  421. writew(j, baseAddr + Module_no);
  422. writew(0, baseAddr + Magic_no);
  423. for (i = 0; i < 600; i++) {
  424. if (readw(baseAddr + Magic_no) == Magic_code)
  425. break;
  426. msleep(10);
  427. }
  428. if (readw(baseAddr + Magic_no) != Magic_code)
  429. return -EIO;
  430. }
  431. moxaCard = 1;
  432. brd->intNdx = baseAddr + IRQindex;
  433. brd->intPend = baseAddr + IRQpending;
  434. brd->intTable = baseAddr + IRQtable;
  435. return 0;
  436. }
  437. static int moxa_load_code(struct moxa_board_conf *brd, const void *ptr,
  438. size_t len)
  439. {
  440. void __iomem *ofsAddr, *baseAddr = brd->basemem;
  441. struct moxa_port *port;
  442. int retval, i;
  443. if (len % 2) {
  444. printk(KERN_ERR "moxa: bios length is not even\n");
  445. return -EINVAL;
  446. }
  447. retval = moxa_real_load_code(brd, ptr, len); /* may change numPorts */
  448. if (retval)
  449. return retval;
  450. switch (brd->boardType) {
  451. case MOXA_BOARD_C218_ISA:
  452. case MOXA_BOARD_C218_PCI:
  453. case MOXA_BOARD_CP204J:
  454. port = brd->ports;
  455. for (i = 0; i < brd->numPorts; i++, port++) {
  456. port->board = brd;
  457. port->chkPort = 1;
  458. port->DCDState = 0;
  459. port->tableAddr = baseAddr + Extern_table +
  460. Extern_size * i;
  461. ofsAddr = port->tableAddr;
  462. writew(C218rx_mask, ofsAddr + RX_mask);
  463. writew(C218tx_mask, ofsAddr + TX_mask);
  464. writew(C218rx_spage + i * C218buf_pageno, ofsAddr + Page_rxb);
  465. writew(readw(ofsAddr + Page_rxb) + C218rx_pageno, ofsAddr + EndPage_rxb);
  466. writew(C218tx_spage + i * C218buf_pageno, ofsAddr + Page_txb);
  467. writew(readw(ofsAddr + Page_txb) + C218tx_pageno, ofsAddr + EndPage_txb);
  468. }
  469. break;
  470. default:
  471. port = brd->ports;
  472. for (i = 0; i < brd->numPorts; i++, port++) {
  473. port->board = brd;
  474. port->chkPort = 1;
  475. port->DCDState = 0;
  476. port->tableAddr = baseAddr + Extern_table +
  477. Extern_size * i;
  478. ofsAddr = port->tableAddr;
  479. switch (brd->numPorts) {
  480. case 8:
  481. writew(C320p8rx_mask, ofsAddr + RX_mask);
  482. writew(C320p8tx_mask, ofsAddr + TX_mask);
  483. writew(C320p8rx_spage + i * C320p8buf_pgno, ofsAddr + Page_rxb);
  484. writew(readw(ofsAddr + Page_rxb) + C320p8rx_pgno, ofsAddr + EndPage_rxb);
  485. writew(C320p8tx_spage + i * C320p8buf_pgno, ofsAddr + Page_txb);
  486. writew(readw(ofsAddr + Page_txb) + C320p8tx_pgno, ofsAddr + EndPage_txb);
  487. break;
  488. case 16:
  489. writew(C320p16rx_mask, ofsAddr + RX_mask);
  490. writew(C320p16tx_mask, ofsAddr + TX_mask);
  491. writew(C320p16rx_spage + i * C320p16buf_pgno, ofsAddr + Page_rxb);
  492. writew(readw(ofsAddr + Page_rxb) + C320p16rx_pgno, ofsAddr + EndPage_rxb);
  493. writew(C320p16tx_spage + i * C320p16buf_pgno, ofsAddr + Page_txb);
  494. writew(readw(ofsAddr + Page_txb) + C320p16tx_pgno, ofsAddr + EndPage_txb);
  495. break;
  496. case 24:
  497. writew(C320p24rx_mask, ofsAddr + RX_mask);
  498. writew(C320p24tx_mask, ofsAddr + TX_mask);
  499. writew(C320p24rx_spage + i * C320p24buf_pgno, ofsAddr + Page_rxb);
  500. writew(readw(ofsAddr + Page_rxb) + C320p24rx_pgno, ofsAddr + EndPage_rxb);
  501. writew(C320p24tx_spage + i * C320p24buf_pgno, ofsAddr + Page_txb);
  502. writew(readw(ofsAddr + Page_txb), ofsAddr + EndPage_txb);
  503. break;
  504. case 32:
  505. writew(C320p32rx_mask, ofsAddr + RX_mask);
  506. writew(C320p32tx_mask, ofsAddr + TX_mask);
  507. writew(C320p32tx_ofs, ofsAddr + Ofs_txb);
  508. writew(C320p32rx_spage + i * C320p32buf_pgno, ofsAddr + Page_rxb);
  509. writew(readb(ofsAddr + Page_rxb), ofsAddr + EndPage_rxb);
  510. writew(C320p32tx_spage + i * C320p32buf_pgno, ofsAddr + Page_txb);
  511. writew(readw(ofsAddr + Page_txb), ofsAddr + EndPage_txb);
  512. break;
  513. }
  514. }
  515. break;
  516. }
  517. brd->loadstat = 1;
  518. return 0;
  519. }
  520. static int moxa_load_fw(struct moxa_board_conf *brd, const struct firmware *fw)
  521. {
  522. void *ptr = fw->data;
  523. char rsn[64];
  524. u16 lens[5];
  525. size_t len;
  526. unsigned int a, lenp, lencnt;
  527. int ret = -EINVAL;
  528. struct {
  529. __le32 magic; /* 0x34303430 */
  530. u8 reserved1[2];
  531. u8 type; /* UNIX = 3 */
  532. u8 model; /* C218T=1, C320T=2, CP204=3 */
  533. u8 reserved2[8];
  534. __le16 len[5];
  535. } *hdr = ptr;
  536. BUILD_BUG_ON(ARRAY_SIZE(hdr->len) != ARRAY_SIZE(lens));
  537. if (fw->size < MOXA_FW_HDRLEN) {
  538. strcpy(rsn, "too short (even header won't fit)");
  539. goto err;
  540. }
  541. if (hdr->magic != cpu_to_le32(0x30343034)) {
  542. sprintf(rsn, "bad magic: %.8x", le32_to_cpu(hdr->magic));
  543. goto err;
  544. }
  545. if (hdr->type != 3) {
  546. sprintf(rsn, "not for linux, type is %u", hdr->type);
  547. goto err;
  548. }
  549. if (moxa_check_fw_model(brd, hdr->model)) {
  550. sprintf(rsn, "not for this card, model is %u", hdr->model);
  551. goto err;
  552. }
  553. len = MOXA_FW_HDRLEN;
  554. lencnt = hdr->model == 2 ? 5 : 3;
  555. for (a = 0; a < ARRAY_SIZE(lens); a++) {
  556. lens[a] = le16_to_cpu(hdr->len[a]);
  557. if (lens[a] && len + lens[a] <= fw->size &&
  558. moxa_check_fw(&fw->data[len]))
  559. printk(KERN_WARNING "moxa firmware: unexpected input "
  560. "at offset %u, but going on\n", (u32)len);
  561. if (!lens[a] && a < lencnt) {
  562. sprintf(rsn, "too few entries in fw file");
  563. goto err;
  564. }
  565. len += lens[a];
  566. }
  567. if (len != fw->size) {
  568. sprintf(rsn, "bad length: %u (should be %u)", (u32)fw->size,
  569. (u32)len);
  570. goto err;
  571. }
  572. ptr += MOXA_FW_HDRLEN;
  573. lenp = 0; /* bios */
  574. strcpy(rsn, "read above");
  575. ret = moxa_load_bios(brd, ptr, lens[lenp]);
  576. if (ret)
  577. goto err;
  578. /* we skip the tty section (lens[1]), since we don't need it */
  579. ptr += lens[lenp] + lens[lenp + 1];
  580. lenp += 2; /* comm */
  581. if (hdr->model == 2) {
  582. ret = moxa_load_320b(brd, ptr, lens[lenp]);
  583. if (ret)
  584. goto err;
  585. /* skip another tty */
  586. ptr += lens[lenp] + lens[lenp + 1];
  587. lenp += 2;
  588. }
  589. ret = moxa_load_code(brd, ptr, lens[lenp]);
  590. if (ret)
  591. goto err;
  592. return 0;
  593. err:
  594. printk(KERN_ERR "firmware failed to load, reason: %s\n", rsn);
  595. return ret;
  596. }
  597. static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev)
  598. {
  599. const struct firmware *fw;
  600. const char *file;
  601. int ret;
  602. switch (brd->boardType) {
  603. case MOXA_BOARD_C218_ISA:
  604. case MOXA_BOARD_C218_PCI:
  605. file = "c218tunx.cod";
  606. break;
  607. case MOXA_BOARD_CP204J:
  608. file = "cp204unx.cod";
  609. break;
  610. default:
  611. file = "c320tunx.cod";
  612. break;
  613. }
  614. ret = request_firmware(&fw, file, dev);
  615. if (ret) {
  616. printk(KERN_ERR "request_firmware failed\n");
  617. goto end;
  618. }
  619. ret = moxa_load_fw(brd, fw);
  620. release_firmware(fw);
  621. end:
  622. return ret;
  623. }
  624. #ifdef CONFIG_PCI
  625. static int __devinit moxa_pci_probe(struct pci_dev *pdev,
  626. const struct pci_device_id *ent)
  627. {
  628. struct moxa_board_conf *board;
  629. unsigned int i;
  630. int board_type = ent->driver_data;
  631. int retval;
  632. retval = pci_enable_device(pdev);
  633. if (retval) {
  634. dev_err(&pdev->dev, "can't enable pci device\n");
  635. goto err;
  636. }
  637. for (i = 0; i < MAX_BOARDS; i++)
  638. if (moxa_boards[i].basemem == NULL)
  639. break;
  640. retval = -ENODEV;
  641. if (i >= MAX_BOARDS) {
  642. dev_warn(&pdev->dev, "more than %u MOXA Intellio family boards "
  643. "found. Board is ignored.\n", MAX_BOARDS);
  644. goto err;
  645. }
  646. board = &moxa_boards[i];
  647. board->ports = &moxa_ports[i * MAX_PORTS_PER_BOARD];
  648. retval = pci_request_region(pdev, 2, "moxa-base");
  649. if (retval) {
  650. dev_err(&pdev->dev, "can't request pci region 2\n");
  651. goto err;
  652. }
  653. board->basemem = ioremap(pci_resource_start(pdev, 2), 0x4000);
  654. if (board->basemem == NULL) {
  655. dev_err(&pdev->dev, "can't remap io space 2\n");
  656. goto err_reg;
  657. }
  658. board->boardType = board_type;
  659. switch (board_type) {
  660. case MOXA_BOARD_C218_ISA:
  661. case MOXA_BOARD_C218_PCI:
  662. board->numPorts = 8;
  663. break;
  664. case MOXA_BOARD_CP204J:
  665. board->numPorts = 4;
  666. break;
  667. default:
  668. board->numPorts = 0;
  669. break;
  670. }
  671. board->busType = MOXA_BUS_TYPE_PCI;
  672. retval = moxa_init_board(board, &pdev->dev);
  673. if (retval)
  674. goto err_base;
  675. pci_set_drvdata(pdev, board);
  676. return (0);
  677. err_base:
  678. iounmap(board->basemem);
  679. board->basemem = NULL;
  680. err_reg:
  681. pci_release_region(pdev, 2);
  682. err:
  683. return retval;
  684. }
  685. static void __devexit moxa_pci_remove(struct pci_dev *pdev)
  686. {
  687. struct moxa_board_conf *brd = pci_get_drvdata(pdev);
  688. iounmap(brd->basemem);
  689. brd->basemem = NULL;
  690. pci_release_region(pdev, 2);
  691. }
  692. static struct pci_driver moxa_pci_driver = {
  693. .name = "moxa",
  694. .id_table = moxa_pcibrds,
  695. .probe = moxa_pci_probe,
  696. .remove = __devexit_p(moxa_pci_remove)
  697. };
  698. #endif /* CONFIG_PCI */
  699. static int __init moxa_init(void)
  700. {
  701. struct moxa_port *ch;
  702. unsigned int i, isabrds = 0;
  703. int retval = 0;
  704. printk(KERN_INFO "MOXA Intellio family driver version %s\n",
  705. MOXA_VERSION);
  706. moxaDriver = alloc_tty_driver(MAX_PORTS + 1);
  707. if (!moxaDriver)
  708. return -ENOMEM;
  709. moxaDriver->owner = THIS_MODULE;
  710. moxaDriver->name = "ttyMX";
  711. moxaDriver->major = ttymajor;
  712. moxaDriver->minor_start = 0;
  713. moxaDriver->type = TTY_DRIVER_TYPE_SERIAL;
  714. moxaDriver->subtype = SERIAL_TYPE_NORMAL;
  715. moxaDriver->init_termios = tty_std_termios;
  716. moxaDriver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
  717. moxaDriver->init_termios.c_ispeed = 9600;
  718. moxaDriver->init_termios.c_ospeed = 9600;
  719. moxaDriver->flags = TTY_DRIVER_REAL_RAW;
  720. tty_set_operations(moxaDriver, &moxa_ops);
  721. for (i = 0, ch = moxa_ports; i < MAX_PORTS; i++, ch++) {
  722. ch->type = PORT_16550A;
  723. ch->close_delay = 5 * HZ / 10;
  724. ch->cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
  725. init_waitqueue_head(&ch->open_wait);
  726. init_completion(&ch->close_wait);
  727. setup_timer(&ch->emptyTimer, moxa_check_xmit_empty,
  728. (unsigned long)ch);
  729. }
  730. pr_debug("Moxa tty devices major number = %d\n", ttymajor);
  731. if (tty_register_driver(moxaDriver)) {
  732. printk(KERN_ERR "Couldn't install MOXA Smartio family driver !\n");
  733. put_tty_driver(moxaDriver);
  734. return -1;
  735. }
  736. mod_timer(&moxaTimer, jiffies + HZ / 50);
  737. /* Find the boards defined from module args. */
  738. #ifdef MODULE
  739. {
  740. struct moxa_board_conf *brd = moxa_boards;
  741. for (i = 0; i < MAX_BOARDS; i++) {
  742. if (!baseaddr[i])
  743. break;
  744. if (type[i] == MOXA_BOARD_C218_ISA ||
  745. type[i] == MOXA_BOARD_C320_ISA) {
  746. pr_debug("Moxa board %2d: %s board(baseAddr=%lx)\n",
  747. isabrds + 1, moxa_brdname[type[i] - 1],
  748. baseaddr[i]);
  749. brd->boardType = type[i];
  750. brd->ports = &moxa_ports[isabrds * MAX_PORTS_PER_BOARD];
  751. brd->numPorts = type[i] == MOXA_BOARD_C218_ISA ? 8 :
  752. numports[i];
  753. brd->busType = MOXA_BUS_TYPE_ISA;
  754. brd->basemem = ioremap(baseaddr[i], 0x4000);
  755. if (!brd->basemem) {
  756. printk(KERN_ERR "moxa: can't remap %lx\n",
  757. baseaddr[i]);
  758. continue;
  759. }
  760. if (moxa_init_board(brd, NULL)) {
  761. iounmap(brd->basemem);
  762. brd->basemem = NULL;
  763. continue;
  764. }
  765. brd++;
  766. isabrds++;
  767. }
  768. }
  769. }
  770. #endif
  771. #ifdef CONFIG_PCI
  772. retval = pci_register_driver(&moxa_pci_driver);
  773. if (retval) {
  774. printk(KERN_ERR "Can't register moxa pci driver!\n");
  775. if (isabrds)
  776. retval = 0;
  777. }
  778. #endif
  779. return retval;
  780. }
  781. static void __exit moxa_exit(void)
  782. {
  783. int i;
  784. del_timer_sync(&moxaTimer);
  785. for (i = 0; i < MAX_PORTS; i++)
  786. del_timer_sync(&moxa_ports[i].emptyTimer);
  787. if (tty_unregister_driver(moxaDriver))
  788. printk(KERN_ERR "Couldn't unregister MOXA Intellio family "
  789. "serial driver\n");
  790. put_tty_driver(moxaDriver);
  791. #ifdef CONFIG_PCI
  792. pci_unregister_driver(&moxa_pci_driver);
  793. #endif
  794. for (i = 0; i < MAX_BOARDS; i++)
  795. if (moxa_boards[i].basemem)
  796. iounmap(moxa_boards[i].basemem);
  797. }
  798. module_init(moxa_init);
  799. module_exit(moxa_exit);
  800. static int moxa_open(struct tty_struct *tty, struct file *filp)
  801. {
  802. struct moxa_port *ch;
  803. int port;
  804. int retval;
  805. port = tty->index;
  806. if (port == MAX_PORTS) {
  807. return (0);
  808. }
  809. if (!MoxaPortIsValid(port)) {
  810. tty->driver_data = NULL;
  811. return (-ENODEV);
  812. }
  813. ch = &moxa_ports[port];
  814. ch->count++;
  815. tty->driver_data = ch;
  816. ch->tty = tty;
  817. if (!(ch->asyncflags & ASYNC_INITIALIZED)) {
  818. ch->statusflags = 0;
  819. moxa_set_tty_param(tty, tty->termios);
  820. MoxaPortLineCtrl(ch, 1, 1);
  821. MoxaPortEnable(ch);
  822. ch->asyncflags |= ASYNC_INITIALIZED;
  823. }
  824. retval = moxa_block_till_ready(tty, filp, ch);
  825. moxa_unthrottle(tty);
  826. if (ch->type == PORT_16550A) {
  827. MoxaSetFifo(ch, 1);
  828. } else {
  829. MoxaSetFifo(ch, 0);
  830. }
  831. return (retval);
  832. }
  833. static void moxa_close(struct tty_struct *tty, struct file *filp)
  834. {
  835. struct moxa_port *ch;
  836. int port;
  837. port = tty->index;
  838. if (port == MAX_PORTS) {
  839. return;
  840. }
  841. if (!MoxaPortIsValid(port)) {
  842. pr_debug("Invalid portno in moxa_close\n");
  843. tty->driver_data = NULL;
  844. return;
  845. }
  846. if (tty->driver_data == NULL) {
  847. return;
  848. }
  849. if (tty_hung_up_p(filp)) {
  850. return;
  851. }
  852. ch = (struct moxa_port *) tty->driver_data;
  853. if ((tty->count == 1) && (ch->count != 1)) {
  854. printk(KERN_WARNING "moxa_close: bad serial port count; "
  855. "tty->count is 1, ch->count is %d\n", ch->count);
  856. ch->count = 1;
  857. }
  858. if (--ch->count < 0) {
  859. printk(KERN_WARNING "moxa_close: bad serial port count, "
  860. "device=%s\n", tty->name);
  861. ch->count = 0;
  862. }
  863. if (ch->count) {
  864. return;
  865. }
  866. ch->asyncflags |= ASYNC_CLOSING;
  867. ch->cflag = tty->termios->c_cflag;
  868. if (ch->asyncflags & ASYNC_INITIALIZED) {
  869. moxa_setup_empty_event(tty);
  870. tty_wait_until_sent(tty, 30 * HZ); /* 30 seconds timeout */
  871. del_timer_sync(&ch->emptyTimer);
  872. }
  873. moxa_shut_down(ch);
  874. MoxaPortFlushData(ch, 2);
  875. if (tty->driver->flush_buffer)
  876. tty->driver->flush_buffer(tty);
  877. tty_ldisc_flush(tty);
  878. tty->closing = 0;
  879. ch->tty = NULL;
  880. if (ch->blocked_open) {
  881. if (ch->close_delay) {
  882. msleep_interruptible(jiffies_to_msecs(ch->close_delay));
  883. }
  884. wake_up_interruptible(&ch->open_wait);
  885. }
  886. ch->asyncflags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
  887. complete_all(&ch->close_wait);
  888. }
  889. static int moxa_write(struct tty_struct *tty,
  890. const unsigned char *buf, int count)
  891. {
  892. struct moxa_port *ch = tty->driver_data;
  893. unsigned long flags;
  894. int len;
  895. if (ch == NULL)
  896. return 0;
  897. spin_lock_irqsave(&moxa_lock, flags);
  898. len = MoxaPortWriteData(ch, (unsigned char *) buf, count);
  899. spin_unlock_irqrestore(&moxa_lock, flags);
  900. /*********************************************
  901. if ( !(ch->statusflags & LOWWAIT) &&
  902. ((len != count) || (MoxaPortTxFree(port) <= 100)) )
  903. ************************************************/
  904. ch->statusflags |= LOWWAIT;
  905. return (len);
  906. }
  907. static int moxa_write_room(struct tty_struct *tty)
  908. {
  909. struct moxa_port *ch;
  910. if (tty->stopped)
  911. return (0);
  912. ch = tty->driver_data;
  913. if (ch == NULL)
  914. return (0);
  915. return MoxaPortTxFree(ch);
  916. }
  917. static void moxa_flush_buffer(struct tty_struct *tty)
  918. {
  919. struct moxa_port *ch = tty->driver_data;
  920. if (ch == NULL)
  921. return;
  922. MoxaPortFlushData(ch, 1);
  923. tty_wakeup(tty);
  924. }
  925. static int moxa_chars_in_buffer(struct tty_struct *tty)
  926. {
  927. struct moxa_port *ch = tty->driver_data;
  928. int chars;
  929. /*
  930. * Sigh...I have to check if driver_data is NULL here, because
  931. * if an open() fails, the TTY subsystem eventually calls
  932. * tty_wait_until_sent(), which calls the driver's chars_in_buffer()
  933. * routine. And since the open() failed, we return 0 here. TDJ
  934. */
  935. if (ch == NULL)
  936. return (0);
  937. chars = MoxaPortTxQueue(ch);
  938. if (chars) {
  939. /*
  940. * Make it possible to wakeup anything waiting for output
  941. * in tty_ioctl.c, etc.
  942. */
  943. if (!(ch->statusflags & EMPTYWAIT))
  944. moxa_setup_empty_event(tty);
  945. }
  946. return (chars);
  947. }
  948. static void moxa_flush_chars(struct tty_struct *tty)
  949. {
  950. /*
  951. * Don't think I need this, because this is called to empty the TX
  952. * buffer for the 16450, 16550, etc.
  953. */
  954. }
  955. static void moxa_put_char(struct tty_struct *tty, unsigned char c)
  956. {
  957. struct moxa_port *ch = tty->driver_data;
  958. unsigned long flags;
  959. if (ch == NULL)
  960. return;
  961. spin_lock_irqsave(&moxa_lock, flags);
  962. MoxaPortWriteData(ch, &c, 1);
  963. spin_unlock_irqrestore(&moxa_lock, flags);
  964. /************************************************
  965. if ( !(ch->statusflags & LOWWAIT) && (MoxaPortTxFree(port) <= 100) )
  966. *************************************************/
  967. ch->statusflags |= LOWWAIT;
  968. }
  969. static int moxa_tiocmget(struct tty_struct *tty, struct file *file)
  970. {
  971. struct moxa_port *ch = tty->driver_data;
  972. int flag = 0, dtr, rts;
  973. if ((tty->index != MAX_PORTS) && (!ch))
  974. return (-EINVAL);
  975. MoxaPortGetLineOut(ch, &dtr, &rts);
  976. if (dtr)
  977. flag |= TIOCM_DTR;
  978. if (rts)
  979. flag |= TIOCM_RTS;
  980. dtr = MoxaPortLineStatus(ch);
  981. if (dtr & 1)
  982. flag |= TIOCM_CTS;
  983. if (dtr & 2)
  984. flag |= TIOCM_DSR;
  985. if (dtr & 4)
  986. flag |= TIOCM_CD;
  987. return flag;
  988. }
  989. static int moxa_tiocmset(struct tty_struct *tty, struct file *file,
  990. unsigned int set, unsigned int clear)
  991. {
  992. struct moxa_port *ch = tty->driver_data;
  993. int port;
  994. int dtr, rts;
  995. port = tty->index;
  996. if ((port != MAX_PORTS) && (!ch))
  997. return (-EINVAL);
  998. MoxaPortGetLineOut(ch, &dtr, &rts);
  999. if (set & TIOCM_RTS)
  1000. rts = 1;
  1001. if (set & TIOCM_DTR)
  1002. dtr = 1;
  1003. if (clear & TIOCM_RTS)
  1004. rts = 0;
  1005. if (clear & TIOCM_DTR)
  1006. dtr = 0;
  1007. MoxaPortLineCtrl(ch, dtr, rts);
  1008. return 0;
  1009. }
  1010. static int moxa_ioctl(struct tty_struct *tty, struct file *file,
  1011. unsigned int cmd, unsigned long arg)
  1012. {
  1013. struct moxa_port *ch = tty->driver_data;
  1014. register int port;
  1015. void __user *argp = (void __user *)arg;
  1016. int retval;
  1017. port = tty->index;
  1018. if ((port != MAX_PORTS) && (!ch))
  1019. return (-EINVAL);
  1020. switch (cmd) {
  1021. case TCSBRK: /* SVID version: non-zero arg --> no break */
  1022. retval = tty_check_change(tty);
  1023. if (retval)
  1024. return (retval);
  1025. moxa_setup_empty_event(tty);
  1026. tty_wait_until_sent(tty, 0);
  1027. if (!arg)
  1028. MoxaPortSendBreak(ch, 0);
  1029. return (0);
  1030. case TCSBRKP: /* support for POSIX tcsendbreak() */
  1031. retval = tty_check_change(tty);
  1032. if (retval)
  1033. return (retval);
  1034. moxa_setup_empty_event(tty);
  1035. tty_wait_until_sent(tty, 0);
  1036. MoxaPortSendBreak(ch, arg);
  1037. return (0);
  1038. case TIOCGSOFTCAR:
  1039. return put_user(C_CLOCAL(tty) ? 1 : 0, (int __user *)argp);
  1040. case TIOCSSOFTCAR:
  1041. if (get_user(retval, (int __user *)argp))
  1042. return -EFAULT;
  1043. arg = retval;
  1044. tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL) |
  1045. (arg ? CLOCAL : 0));
  1046. if (C_CLOCAL(tty))
  1047. ch->asyncflags &= ~ASYNC_CHECK_CD;
  1048. else
  1049. ch->asyncflags |= ASYNC_CHECK_CD;
  1050. return (0);
  1051. case TIOCGSERIAL:
  1052. return moxa_get_serial_info(ch, argp);
  1053. case TIOCSSERIAL:
  1054. return moxa_set_serial_info(ch, argp);
  1055. default:
  1056. retval = MoxaDriverIoctl(tty, cmd, arg);
  1057. }
  1058. return (retval);
  1059. }
  1060. static void moxa_throttle(struct tty_struct *tty)
  1061. {
  1062. struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
  1063. ch->statusflags |= THROTTLE;
  1064. }
  1065. static void moxa_unthrottle(struct tty_struct *tty)
  1066. {
  1067. struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
  1068. ch->statusflags &= ~THROTTLE;
  1069. }
  1070. static void moxa_set_termios(struct tty_struct *tty,
  1071. struct ktermios *old_termios)
  1072. {
  1073. struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
  1074. if (ch == NULL)
  1075. return;
  1076. moxa_set_tty_param(tty, old_termios);
  1077. if (!(old_termios->c_cflag & CLOCAL) &&
  1078. (tty->termios->c_cflag & CLOCAL))
  1079. wake_up_interruptible(&ch->open_wait);
  1080. }
  1081. static void moxa_stop(struct tty_struct *tty)
  1082. {
  1083. struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
  1084. if (ch == NULL)
  1085. return;
  1086. MoxaPortTxDisable(ch);
  1087. ch->statusflags |= TXSTOPPED;
  1088. }
  1089. static void moxa_start(struct tty_struct *tty)
  1090. {
  1091. struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
  1092. if (ch == NULL)
  1093. return;
  1094. if (!(ch->statusflags & TXSTOPPED))
  1095. return;
  1096. MoxaPortTxEnable(ch);
  1097. ch->statusflags &= ~TXSTOPPED;
  1098. }
  1099. static void moxa_hangup(struct tty_struct *tty)
  1100. {
  1101. struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
  1102. moxa_flush_buffer(tty);
  1103. moxa_shut_down(ch);
  1104. ch->count = 0;
  1105. ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE;
  1106. ch->tty = NULL;
  1107. wake_up_interruptible(&ch->open_wait);
  1108. }
  1109. static void moxa_poll(unsigned long ignored)
  1110. {
  1111. register int card;
  1112. struct moxa_port *ch;
  1113. struct tty_struct *tp;
  1114. int i, ports;
  1115. del_timer(&moxaTimer);
  1116. if (MoxaDriverPoll() < 0) {
  1117. mod_timer(&moxaTimer, jiffies + HZ / 50);
  1118. return;
  1119. }
  1120. for (card = 0; card < MAX_BOARDS; card++) {
  1121. if ((ports = MoxaPortsOfCard(card)) <= 0)
  1122. continue;
  1123. ch = &moxa_ports[card * MAX_PORTS_PER_BOARD];
  1124. for (i = 0; i < ports; i++, ch++) {
  1125. if ((ch->asyncflags & ASYNC_INITIALIZED) == 0)
  1126. continue;
  1127. if (!(ch->statusflags & THROTTLE) &&
  1128. (MoxaPortRxQueue(ch) > 0))
  1129. moxa_receive_data(ch);
  1130. if ((tp = ch->tty) == 0)
  1131. continue;
  1132. if (ch->statusflags & LOWWAIT) {
  1133. if (MoxaPortTxQueue(ch) <= WAKEUP_CHARS) {
  1134. if (!tp->stopped) {
  1135. ch->statusflags &= ~LOWWAIT;
  1136. tty_wakeup(tp);
  1137. }
  1138. }
  1139. }
  1140. if (!I_IGNBRK(tp) && (MoxaPortResetBrkCnt(ch) > 0)) {
  1141. tty_insert_flip_char(tp, 0, TTY_BREAK);
  1142. tty_schedule_flip(tp);
  1143. }
  1144. if (MoxaPortDCDChange(ch)) {
  1145. if (ch->asyncflags & ASYNC_CHECK_CD) {
  1146. if (MoxaPortDCDON(ch))
  1147. wake_up_interruptible(&ch->open_wait);
  1148. else {
  1149. tty_hangup(tp);
  1150. wake_up_interruptible(&ch->open_wait);
  1151. ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE;
  1152. }
  1153. }
  1154. }
  1155. }
  1156. }
  1157. mod_timer(&moxaTimer, jiffies + HZ / 50);
  1158. }
  1159. /******************************************************************************/
  1160. static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios)
  1161. {
  1162. register struct ktermios *ts;
  1163. struct moxa_port *ch;
  1164. int rts, cts, txflow, rxflow, xany, baud;
  1165. ch = (struct moxa_port *) tty->driver_data;
  1166. ts = tty->termios;
  1167. if (ts->c_cflag & CLOCAL)
  1168. ch->asyncflags &= ~ASYNC_CHECK_CD;
  1169. else
  1170. ch->asyncflags |= ASYNC_CHECK_CD;
  1171. rts = cts = txflow = rxflow = xany = 0;
  1172. if (ts->c_cflag & CRTSCTS)
  1173. rts = cts = 1;
  1174. if (ts->c_iflag & IXON)
  1175. txflow = 1;
  1176. if (ts->c_iflag & IXOFF)
  1177. rxflow = 1;
  1178. if (ts->c_iflag & IXANY)
  1179. xany = 1;
  1180. /* Clear the features we don't support */
  1181. ts->c_cflag &= ~CMSPAR;
  1182. MoxaPortFlowCtrl(ch, rts, cts, txflow, rxflow, xany);
  1183. baud = MoxaPortSetTermio(ch, ts, tty_get_baud_rate(tty));
  1184. if (baud == -1)
  1185. baud = tty_termios_baud_rate(old_termios);
  1186. /* Not put the baud rate into the termios data */
  1187. tty_encode_baud_rate(tty, baud, baud);
  1188. }
  1189. static int moxa_block_till_ready(struct tty_struct *tty, struct file *filp,
  1190. struct moxa_port *ch)
  1191. {
  1192. DECLARE_WAITQUEUE(wait,current);
  1193. unsigned long flags;
  1194. int retval;
  1195. int do_clocal = C_CLOCAL(tty);
  1196. /*
  1197. * If the device is in the middle of being closed, then block
  1198. * until it's done, and then try again.
  1199. */
  1200. if (tty_hung_up_p(filp) || (ch->asyncflags & ASYNC_CLOSING)) {
  1201. if (ch->asyncflags & ASYNC_CLOSING)
  1202. wait_for_completion_interruptible(&ch->close_wait);
  1203. #ifdef SERIAL_DO_RESTART
  1204. if (ch->asyncflags & ASYNC_HUP_NOTIFY)
  1205. return (-EAGAIN);
  1206. else
  1207. return (-ERESTARTSYS);
  1208. #else
  1209. return (-EAGAIN);
  1210. #endif
  1211. }
  1212. /*
  1213. * If non-blocking mode is set, then make the check up front
  1214. * and then exit.
  1215. */
  1216. if (filp->f_flags & O_NONBLOCK) {
  1217. ch->asyncflags |= ASYNC_NORMAL_ACTIVE;
  1218. return (0);
  1219. }
  1220. /*
  1221. * Block waiting for the carrier detect and the line to become free
  1222. */
  1223. retval = 0;
  1224. add_wait_queue(&ch->open_wait, &wait);
  1225. pr_debug("block_til_ready before block: ttys%d, count = %d\n",
  1226. tty->index, ch->count);
  1227. spin_lock_irqsave(&moxa_lock, flags);
  1228. if (!tty_hung_up_p(filp))
  1229. ch->count--;
  1230. ch->blocked_open++;
  1231. spin_unlock_irqrestore(&moxa_lock, flags);
  1232. while (1) {
  1233. set_current_state(TASK_INTERRUPTIBLE);
  1234. if (tty_hung_up_p(filp) ||
  1235. !(ch->asyncflags & ASYNC_INITIALIZED)) {
  1236. #ifdef SERIAL_DO_RESTART
  1237. if (ch->asyncflags & ASYNC_HUP_NOTIFY)
  1238. retval = -EAGAIN;
  1239. else
  1240. retval = -ERESTARTSYS;
  1241. #else
  1242. retval = -EAGAIN;
  1243. #endif
  1244. break;
  1245. }
  1246. if (!(ch->asyncflags & ASYNC_CLOSING) && (do_clocal ||
  1247. MoxaPortDCDON(ch)))
  1248. break;
  1249. if (signal_pending(current)) {
  1250. retval = -ERESTARTSYS;
  1251. break;
  1252. }
  1253. schedule();
  1254. }
  1255. set_current_state(TASK_RUNNING);
  1256. remove_wait_queue(&ch->open_wait, &wait);
  1257. spin_lock_irqsave(&moxa_lock, flags);
  1258. if (!tty_hung_up_p(filp))
  1259. ch->count++;
  1260. ch->blocked_open--;
  1261. spin_unlock_irqrestore(&moxa_lock, flags);
  1262. pr_debug("block_til_ready after blocking: ttys%d, count = %d\n",
  1263. tty->index, ch->count);
  1264. if (retval)
  1265. return (retval);
  1266. /* FIXME: review to see if we need to use set_bit on these */
  1267. ch->asyncflags |= ASYNC_NORMAL_ACTIVE;
  1268. return 0;
  1269. }
  1270. static void moxa_setup_empty_event(struct tty_struct *tty)
  1271. {
  1272. struct moxa_port *ch = tty->driver_data;
  1273. unsigned long flags;
  1274. spin_lock_irqsave(&moxa_lock, flags);
  1275. ch->statusflags |= EMPTYWAIT;
  1276. mod_timer(&ch->emptyTimer, jiffies + HZ);
  1277. spin_unlock_irqrestore(&moxa_lock, flags);
  1278. }
  1279. static void moxa_check_xmit_empty(unsigned long data)
  1280. {
  1281. struct moxa_port *ch;
  1282. ch = (struct moxa_port *) data;
  1283. if (ch->tty && (ch->statusflags & EMPTYWAIT)) {
  1284. if (MoxaPortTxQueue(ch) == 0) {
  1285. ch->statusflags &= ~EMPTYWAIT;
  1286. tty_wakeup(ch->tty);
  1287. return;
  1288. }
  1289. mod_timer(&ch->emptyTimer, round_jiffies(jiffies + HZ));
  1290. } else
  1291. ch->statusflags &= ~EMPTYWAIT;
  1292. }
  1293. static void moxa_shut_down(struct moxa_port *ch)
  1294. {
  1295. struct tty_struct *tp;
  1296. if (!(ch->asyncflags & ASYNC_INITIALIZED))
  1297. return;
  1298. tp = ch->tty;
  1299. MoxaPortDisable(ch);
  1300. /*
  1301. * If we're a modem control device and HUPCL is on, drop RTS & DTR.
  1302. */
  1303. if (tp->termios->c_cflag & HUPCL)
  1304. MoxaPortLineCtrl(ch, 0, 0);
  1305. ch->asyncflags &= ~ASYNC_INITIALIZED;
  1306. }
  1307. static void moxa_receive_data(struct moxa_port *ch)
  1308. {
  1309. struct tty_struct *tp;
  1310. struct ktermios *ts;
  1311. unsigned long flags;
  1312. ts = NULL;
  1313. tp = ch->tty;
  1314. if (tp)
  1315. ts = tp->termios;
  1316. /**************************************************
  1317. if ( !tp || !ts || !(ts->c_cflag & CREAD) ) {
  1318. *****************************************************/
  1319. if (!tp || !ts) {
  1320. MoxaPortFlushData(ch, 0);
  1321. return;
  1322. }
  1323. spin_lock_irqsave(&moxa_lock, flags);
  1324. MoxaPortReadData(ch, tp);
  1325. spin_unlock_irqrestore(&moxa_lock, flags);
  1326. tty_schedule_flip(tp);
  1327. }
  1328. /*
  1329. * Query
  1330. */
  1331. struct mon_str {
  1332. int tick;
  1333. int rxcnt[MAX_PORTS];
  1334. int txcnt[MAX_PORTS];
  1335. };
  1336. #define DCD_changed 0x01
  1337. #define DCD_oldstate 0x80
  1338. static int moxaLowWaterChk;
  1339. static struct mon_str moxaLog;
  1340. static int moxaFuncTout = HZ / 2;
  1341. static void moxafunc(void __iomem *, int, ushort);
  1342. static void moxa_wait_finish(void __iomem *);
  1343. static void moxa_low_water_check(void __iomem *);
  1344. /*****************************************************************************
  1345. * Driver level functions: *
  1346. * 2. MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port); *
  1347. * 3. MoxaDriverPoll(void); *
  1348. *****************************************************************************/
  1349. #define MOXA 0x400
  1350. #define MOXA_GET_IQUEUE (MOXA + 1) /* get input buffered count */
  1351. #define MOXA_GET_OQUEUE (MOXA + 2) /* get output buffered count */
  1352. #define MOXA_GETDATACOUNT (MOXA + 23)
  1353. #define MOXA_GET_IOQUEUE (MOXA + 27)
  1354. #define MOXA_FLUSH_QUEUE (MOXA + 28)
  1355. #define MOXA_GET_CONF (MOXA + 35) /* configuration */
  1356. #define MOXA_GET_MAJOR (MOXA + 63)
  1357. #define MOXA_GET_CUMAJOR (MOXA + 64)
  1358. #define MOXA_GETMSTATUS (MOXA + 65)
  1359. static void MoxaPortFlushData(struct moxa_port *port, int mode)
  1360. {
  1361. void __iomem *ofsAddr;
  1362. if ((mode < 0) || (mode > 2))
  1363. return;
  1364. ofsAddr = port->tableAddr;
  1365. moxafunc(ofsAddr, FC_FlushQueue, mode);
  1366. if (mode != 1) {
  1367. port->lowChkFlag = 0;
  1368. moxa_low_water_check(ofsAddr);
  1369. }
  1370. }
  1371. static int MoxaDriverIoctl(struct tty_struct *tty, unsigned int cmd,
  1372. unsigned long arg)
  1373. {
  1374. struct moxa_port *port = tty->driver_data;
  1375. int i;
  1376. int status;
  1377. void __user *argp = (void __user *)arg;
  1378. if (tty->index == MAX_PORTS) {
  1379. if ((cmd != MOXA_GET_CONF) && (cmd != MOXA_GETDATACOUNT) &&
  1380. (cmd != MOXA_GET_IOQUEUE) && (cmd != MOXA_GET_MAJOR) &&
  1381. (cmd != MOXA_GET_CUMAJOR) && (cmd != MOXA_GETMSTATUS))
  1382. return (-EINVAL);
  1383. }
  1384. switch (cmd) {
  1385. case MOXA_GETDATACOUNT:
  1386. moxaLog.tick = jiffies;
  1387. if(copy_to_user(argp, &moxaLog, sizeof(struct mon_str)))
  1388. return -EFAULT;
  1389. return (0);
  1390. case MOXA_FLUSH_QUEUE:
  1391. MoxaPortFlushData(port, arg);
  1392. return (0);
  1393. case MOXA_GET_IOQUEUE: {
  1394. struct moxaq_str __user *argm = argp;
  1395. struct moxaq_str tmp;
  1396. for (i = 0; i < MAX_PORTS; i++, argm++) {
  1397. memset(&tmp, 0, sizeof(tmp));
  1398. if (moxa_ports[i].chkPort) {
  1399. tmp.inq = MoxaPortRxQueue(&moxa_ports[i]);
  1400. tmp.outq = MoxaPortTxQueue(&moxa_ports[i]);
  1401. }
  1402. if (copy_to_user(argm, &tmp, sizeof(tmp)))
  1403. return -EFAULT;
  1404. }
  1405. return (0);
  1406. } case MOXA_GET_OQUEUE:
  1407. i = MoxaPortTxQueue(port);
  1408. return put_user(i, (unsigned long __user *)argp);
  1409. case MOXA_GET_IQUEUE:
  1410. i = MoxaPortRxQueue(port);
  1411. return put_user(i, (unsigned long __user *)argp);
  1412. case MOXA_GET_MAJOR:
  1413. if(copy_to_user(argp, &ttymajor, sizeof(int)))
  1414. return -EFAULT;
  1415. return 0;
  1416. case MOXA_GET_CUMAJOR:
  1417. i = 0;
  1418. if(copy_to_user(argp, &i, sizeof(int)))
  1419. return -EFAULT;
  1420. return 0;
  1421. case MOXA_GETMSTATUS: {
  1422. struct mxser_mstatus __user *argm = argp;
  1423. struct mxser_mstatus tmp;
  1424. struct moxa_port *p;
  1425. for (i = 0; i < MAX_PORTS; i++, argm++) {
  1426. p = &moxa_ports[i];
  1427. memset(&tmp, 0, sizeof(tmp));
  1428. if (!p->chkPort) {
  1429. goto copy;
  1430. } else {
  1431. status = MoxaPortLineStatus(p);
  1432. if (status & 1)
  1433. tmp.cts = 1;
  1434. if (status & 2)
  1435. tmp.dsr = 1;
  1436. if (status & 4)
  1437. tmp.dcd = 1;
  1438. }
  1439. if (!p->tty || !p->tty->termios)
  1440. tmp.cflag = p->cflag;
  1441. else
  1442. tmp.cflag = p->tty->termios->c_cflag;
  1443. copy:
  1444. if (copy_to_user(argm, &tmp, sizeof(tmp)))
  1445. return -EFAULT;
  1446. }
  1447. return 0;
  1448. }
  1449. }
  1450. return -ENOIOCTLCMD;
  1451. }
  1452. int MoxaDriverPoll(void)
  1453. {
  1454. struct moxa_board_conf *brd;
  1455. register ushort temp;
  1456. register int card;
  1457. void __iomem *ofsAddr;
  1458. void __iomem *ip;
  1459. int port, p, ports;
  1460. if (moxaCard == 0)
  1461. return (-1);
  1462. for (card = 0; card < MAX_BOARDS; card++) {
  1463. brd = &moxa_boards[card];
  1464. if (brd->loadstat == 0)
  1465. continue;
  1466. if ((ports = brd->numPorts) == 0)
  1467. continue;
  1468. if (readb(brd->intPend) == 0xff) {
  1469. ip = brd->intTable + readb(brd->intNdx);
  1470. p = card * MAX_PORTS_PER_BOARD;
  1471. ports <<= 1;
  1472. for (port = 0; port < ports; port += 2, p++) {
  1473. if ((temp = readw(ip + port)) != 0) {
  1474. writew(0, ip + port);
  1475. ofsAddr = moxa_ports[p].tableAddr;
  1476. if (temp & IntrTx)
  1477. writew(readw(ofsAddr + HostStat) & ~WakeupTx, ofsAddr + HostStat);
  1478. if (temp & IntrBreak) {
  1479. moxa_ports[p].breakCnt++;
  1480. }
  1481. if (temp & IntrLine) {
  1482. if (readb(ofsAddr + FlagStat) & DCD_state) {
  1483. if ((moxa_ports[p].DCDState & DCD_oldstate) == 0)
  1484. moxa_ports[p].DCDState = (DCD_oldstate |
  1485. DCD_changed);
  1486. } else {
  1487. if (moxa_ports[p].DCDState & DCD_oldstate)
  1488. moxa_ports[p].DCDState = DCD_changed;
  1489. }
  1490. }
  1491. }
  1492. }
  1493. writeb(0, brd->intPend);
  1494. }
  1495. if (moxaLowWaterChk) {
  1496. p = card * MAX_PORTS_PER_BOARD;
  1497. for (port = 0; port < ports; port++, p++) {
  1498. if (moxa_ports[p].lowChkFlag) {
  1499. moxa_ports[p].lowChkFlag = 0;
  1500. ofsAddr = moxa_ports[p].tableAddr;
  1501. moxa_low_water_check(ofsAddr);
  1502. }
  1503. }
  1504. }
  1505. }
  1506. moxaLowWaterChk = 0;
  1507. return (0);
  1508. }
  1509. /*****************************************************************************
  1510. * Card level function: *
  1511. * 1. MoxaPortsOfCard(int cardno); *
  1512. *****************************************************************************/
  1513. int MoxaPortsOfCard(int cardno)
  1514. {
  1515. if (moxa_boards[cardno].boardType == 0)
  1516. return (0);
  1517. return (moxa_boards[cardno].numPorts);
  1518. }
  1519. /*****************************************************************************
  1520. * Port level functions: *
  1521. * 1. MoxaPortIsValid(int port); *
  1522. * 2. MoxaPortEnable(int port); *
  1523. * 3. MoxaPortDisable(int port); *
  1524. * 4. MoxaPortGetMaxBaud(int port); *
  1525. * 6. MoxaPortSetBaud(int port, long baud); *
  1526. * 8. MoxaPortSetTermio(int port, unsigned char *termio); *
  1527. * 9. MoxaPortGetLineOut(int port, int *dtrState, int *rtsState); *
  1528. * 10. MoxaPortLineCtrl(int port, int dtrState, int rtsState); *
  1529. * 11. MoxaPortFlowCtrl(int port, int rts, int cts, int rx, int tx,int xany); *
  1530. * 12. MoxaPortLineStatus(int port); *
  1531. * 13. MoxaPortDCDChange(int port); *
  1532. * 14. MoxaPortDCDON(int port); *
  1533. * 15. MoxaPortFlushData(int port, int mode); *
  1534. * 16. MoxaPortWriteData(int port, unsigned char * buffer, int length); *
  1535. * 17. MoxaPortReadData(int port, struct tty_struct *tty); *
  1536. * 20. MoxaPortTxQueue(int port); *
  1537. * 21. MoxaPortTxFree(int port); *
  1538. * 22. MoxaPortRxQueue(int port); *
  1539. * 24. MoxaPortTxDisable(int port); *
  1540. * 25. MoxaPortTxEnable(int port); *
  1541. * 27. MoxaPortResetBrkCnt(int port); *
  1542. * 30. MoxaPortSendBreak(int port, int ticks); *
  1543. *****************************************************************************/
  1544. /*
  1545. * Moxa Port Number Description:
  1546. *
  1547. * MOXA serial driver supports up to 4 MOXA-C218/C320 boards. And,
  1548. * the port number using in MOXA driver functions will be 0 to 31 for
  1549. * first MOXA board, 32 to 63 for second, 64 to 95 for third and 96
  1550. * to 127 for fourth. For example, if you setup three MOXA boards,
  1551. * first board is C218, second board is C320-16 and third board is
  1552. * C320-32. The port number of first board (C218 - 8 ports) is from
  1553. * 0 to 7. The port number of second board (C320 - 16 ports) is form
  1554. * 32 to 47. The port number of third board (C320 - 32 ports) is from
  1555. * 64 to 95. And those port numbers form 8 to 31, 48 to 63 and 96 to
  1556. * 127 will be invalid.
  1557. *
  1558. *
  1559. * Moxa Functions Description:
  1560. *
  1561. * Function 1: Driver initialization routine, this routine must be
  1562. * called when initialized driver.
  1563. * Syntax:
  1564. * void MoxaDriverInit();
  1565. *
  1566. *
  1567. * Function 2: Moxa driver private IOCTL command processing.
  1568. * Syntax:
  1569. * int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port);
  1570. *
  1571. * unsigned int cmd : IOCTL command
  1572. * unsigned long arg : IOCTL argument
  1573. * int port : port number (0 - 127)
  1574. *
  1575. * return: 0 (OK)
  1576. * -EINVAL
  1577. * -ENOIOCTLCMD
  1578. *
  1579. *
  1580. * Function 3: Moxa driver polling process routine.
  1581. * Syntax:
  1582. * int MoxaDriverPoll(void);
  1583. *
  1584. * return: 0 ; polling O.K.
  1585. * -1 : no any Moxa card.
  1586. *
  1587. *
  1588. * Function 4: Get the ports of this card.
  1589. * Syntax:
  1590. * int MoxaPortsOfCard(int cardno);
  1591. *
  1592. * int cardno : card number (0 - 3)
  1593. *
  1594. * return: 0 : this card is invalid
  1595. * 8/16/24/32
  1596. *
  1597. *
  1598. * Function 5: Check this port is valid or invalid
  1599. * Syntax:
  1600. * int MoxaPortIsValid(int port);
  1601. * int port : port number (0 - 127, ref port description)
  1602. *
  1603. * return: 0 : this port is invalid
  1604. * 1 : this port is valid
  1605. *
  1606. *
  1607. * Function 6: Enable this port to start Tx/Rx data.
  1608. * Syntax:
  1609. * void MoxaPortEnable(int port);
  1610. * int port : port number (0 - 127)
  1611. *
  1612. *
  1613. * Function 7: Disable this port
  1614. * Syntax:
  1615. * void MoxaPortDisable(int port);
  1616. * int port : port number (0 - 127)
  1617. *
  1618. *
  1619. * Function 8: Get the maximun available baud rate of this port.
  1620. * Syntax:
  1621. * long MoxaPortGetMaxBaud(int port);
  1622. * int port : port number (0 - 127)
  1623. *
  1624. * return: 0 : this port is invalid
  1625. * 38400/57600/115200 bps
  1626. *
  1627. *
  1628. * Function 10: Setting baud rate of this port.
  1629. * Syntax:
  1630. * long MoxaPortSetBaud(int port, long baud);
  1631. * int port : port number (0 - 127)
  1632. * long baud : baud rate (50 - 115200)
  1633. *
  1634. * return: 0 : this port is invalid or baud < 50
  1635. * 50 - 115200 : the real baud rate set to the port, if
  1636. * the argument baud is large than maximun
  1637. * available baud rate, the real setting
  1638. * baud rate will be the maximun baud rate.
  1639. *
  1640. *
  1641. * Function 12: Configure the port.
  1642. * Syntax:
  1643. * int MoxaPortSetTermio(int port, struct ktermios *termio, speed_t baud);
  1644. * int port : port number (0 - 127)
  1645. * struct ktermios * termio : termio structure pointer
  1646. * speed_t baud : baud rate
  1647. *
  1648. * return: -1 : this port is invalid or termio == NULL
  1649. * 0 : setting O.K.
  1650. *
  1651. *
  1652. * Function 13: Get the DTR/RTS state of this port.
  1653. * Syntax:
  1654. * int MoxaPortGetLineOut(int port, int *dtrState, int *rtsState);
  1655. * int port : port number (0 - 127)
  1656. * int * dtrState : pointer to INT to receive the current DTR
  1657. * state. (if NULL, this function will not
  1658. * write to this address)
  1659. * int * rtsState : pointer to INT to receive the current RTS
  1660. * state. (if NULL, this function will not
  1661. * write to this address)
  1662. *
  1663. * return: -1 : this port is invalid
  1664. * 0 : O.K.
  1665. *
  1666. *
  1667. * Function 14: Setting the DTR/RTS output state of this port.
  1668. * Syntax:
  1669. * void MoxaPortLineCtrl(int port, int dtrState, int rtsState);
  1670. * int port : port number (0 - 127)
  1671. * int dtrState : DTR output state (0: off, 1: on)
  1672. * int rtsState : RTS output state (0: off, 1: on)
  1673. *
  1674. *
  1675. * Function 15: Setting the flow control of this port.
  1676. * Syntax:
  1677. * void MoxaPortFlowCtrl(int port, int rtsFlow, int ctsFlow, int rxFlow,
  1678. * int txFlow,int xany);
  1679. * int port : port number (0 - 127)
  1680. * int rtsFlow : H/W RTS flow control (0: no, 1: yes)
  1681. * int ctsFlow : H/W CTS flow control (0: no, 1: yes)
  1682. * int rxFlow : S/W Rx XON/XOFF flow control (0: no, 1: yes)
  1683. * int txFlow : S/W Tx XON/XOFF flow control (0: no, 1: yes)
  1684. * int xany : S/W XANY flow control (0: no, 1: yes)
  1685. *
  1686. *
  1687. * Function 16: Get ths line status of this port
  1688. * Syntax:
  1689. * int MoxaPortLineStatus(int port);
  1690. * int port : port number (0 - 127)
  1691. *
  1692. * return: Bit 0 - CTS state (0: off, 1: on)
  1693. * Bit 1 - DSR state (0: off, 1: on)
  1694. * Bit 2 - DCD state (0: off, 1: on)
  1695. *
  1696. *
  1697. * Function 17: Check the DCD state has changed since the last read
  1698. * of this function.
  1699. * Syntax:
  1700. * int MoxaPortDCDChange(int port);
  1701. * int port : port number (0 - 127)
  1702. *
  1703. * return: 0 : no changed
  1704. * 1 : DCD has changed
  1705. *
  1706. *
  1707. * Function 18: Check ths current DCD state is ON or not.
  1708. * Syntax:
  1709. * int MoxaPortDCDON(int port);
  1710. * int port : port number (0 - 127)
  1711. *
  1712. * return: 0 : DCD off
  1713. * 1 : DCD on
  1714. *
  1715. *
  1716. * Function 19: Flush the Rx/Tx buffer data of this port.
  1717. * Syntax:
  1718. * void MoxaPortFlushData(int port, int mode);
  1719. * int port : port number (0 - 127)
  1720. * int mode
  1721. * 0 : flush the Rx buffer
  1722. * 1 : flush the Tx buffer
  1723. * 2 : flush the Rx and Tx buffer
  1724. *
  1725. *
  1726. * Function 20: Write data.
  1727. * Syntax:
  1728. * int MoxaPortWriteData(int port, unsigned char * buffer, int length);
  1729. * int port : port number (0 - 127)
  1730. * unsigned char * buffer : pointer to write data buffer.
  1731. * int length : write data length
  1732. *
  1733. * return: 0 - length : real write data length
  1734. *
  1735. *
  1736. * Function 21: Read data.
  1737. * Syntax:
  1738. * int MoxaPortReadData(int port, struct tty_struct *tty);
  1739. * int port : port number (0 - 127)
  1740. * struct tty_struct *tty : tty for data
  1741. *
  1742. * return: 0 - length : real read data length
  1743. *
  1744. *
  1745. * Function 24: Get the Tx buffer current queued data bytes
  1746. * Syntax:
  1747. * int MoxaPortTxQueue(int port);
  1748. * int port : port number (0 - 127)
  1749. *
  1750. * return: .. : Tx buffer current queued data bytes
  1751. *
  1752. *
  1753. * Function 25: Get the Tx buffer current free space
  1754. * Syntax:
  1755. * int MoxaPortTxFree(int port);
  1756. * int port : port number (0 - 127)
  1757. *
  1758. * return: .. : Tx buffer current free space
  1759. *
  1760. *
  1761. * Function 26: Get the Rx buffer current queued data bytes
  1762. * Syntax:
  1763. * int MoxaPortRxQueue(int port);
  1764. * int port : port number (0 - 127)
  1765. *
  1766. * return: .. : Rx buffer current queued data bytes
  1767. *
  1768. *
  1769. * Function 28: Disable port data transmission.
  1770. * Syntax:
  1771. * void MoxaPortTxDisable(int port);
  1772. * int port : port number (0 - 127)
  1773. *
  1774. *
  1775. * Function 29: Enable port data transmission.
  1776. * Syntax:
  1777. * void MoxaPortTxEnable(int port);
  1778. * int port : port number (0 - 127)
  1779. *
  1780. *
  1781. * Function 31: Get the received BREAK signal count and reset it.
  1782. * Syntax:
  1783. * int MoxaPortResetBrkCnt(int port);
  1784. * int port : port number (0 - 127)
  1785. *
  1786. * return: 0 - .. : BREAK signal count
  1787. *
  1788. *
  1789. * Function 34: Send out a BREAK signal.
  1790. * Syntax:
  1791. * void MoxaPortSendBreak(int port, int ms100);
  1792. * int port : port number (0 - 127)
  1793. * int ms100 : break signal time interval.
  1794. * unit: 100 mini-second. if ms100 == 0, it will
  1795. * send out a about 250 ms BREAK signal.
  1796. *
  1797. */
  1798. static int MoxaPortIsValid(int port)
  1799. {
  1800. if (moxaCard == 0)
  1801. return (0);
  1802. if (moxa_ports[port].chkPort == 0)
  1803. return (0);
  1804. return (1);
  1805. }
  1806. static void MoxaPortEnable(struct moxa_port *port)
  1807. {
  1808. void __iomem *ofsAddr;
  1809. short lowwater = 512;
  1810. ofsAddr = port->tableAddr;
  1811. writew(lowwater, ofsAddr + Low_water);
  1812. port->breakCnt = 0;
  1813. if (port->board->boardType == MOXA_BOARD_C320_ISA ||
  1814. port->board->boardType == MOXA_BOARD_C320_PCI) {
  1815. moxafunc(ofsAddr, FC_SetBreakIrq, 0);
  1816. } else {
  1817. writew(readw(ofsAddr + HostStat) | WakeupBreak, ofsAddr + HostStat);
  1818. }
  1819. moxafunc(ofsAddr, FC_SetLineIrq, Magic_code);
  1820. moxafunc(ofsAddr, FC_FlushQueue, 2);
  1821. moxafunc(ofsAddr, FC_EnableCH, Magic_code);
  1822. MoxaPortLineStatus(port);
  1823. }
  1824. static void MoxaPortDisable(struct moxa_port *port)
  1825. {
  1826. void __iomem *ofsAddr = port->tableAddr;
  1827. moxafunc(ofsAddr, FC_SetFlowCtl, 0); /* disable flow control */
  1828. moxafunc(ofsAddr, FC_ClrLineIrq, Magic_code);
  1829. writew(0, ofsAddr + HostStat);
  1830. moxafunc(ofsAddr, FC_DisableCH, Magic_code);
  1831. }
  1832. static long MoxaPortGetMaxBaud(struct moxa_port *port)
  1833. {
  1834. if (port->board->boardType == MOXA_BOARD_C320_ISA ||
  1835. port->board->boardType == MOXA_BOARD_C320_PCI)
  1836. return (460800L);
  1837. else
  1838. return (921600L);
  1839. }
  1840. static long MoxaPortSetBaud(struct moxa_port *port, long baud)
  1841. {
  1842. void __iomem *ofsAddr;
  1843. long max, clock;
  1844. unsigned int val;
  1845. if ((baud < 50L) || ((max = MoxaPortGetMaxBaud(port)) == 0))
  1846. return (0);
  1847. ofsAddr = port->tableAddr;
  1848. if (baud > max)
  1849. baud = max;
  1850. if (max == 38400L)
  1851. clock = 614400L; /* for 9.8304 Mhz : max. 38400 bps */
  1852. else if (max == 57600L)
  1853. clock = 691200L; /* for 11.0592 Mhz : max. 57600 bps */
  1854. else
  1855. clock = 921600L; /* for 14.7456 Mhz : max. 115200 bps */
  1856. val = clock / baud;
  1857. moxafunc(ofsAddr, FC_SetBaud, val);
  1858. baud = clock / val;
  1859. return (baud);
  1860. }
  1861. static int MoxaPortSetTermio(struct moxa_port *port, struct ktermios *termio,
  1862. speed_t baud)
  1863. {
  1864. void __iomem *ofsAddr;
  1865. tcflag_t cflag;
  1866. tcflag_t mode = 0;
  1867. if (port->chkPort == 0 || termio == 0)
  1868. return (-1);
  1869. ofsAddr = port->tableAddr;
  1870. cflag = termio->c_cflag; /* termio->c_cflag */
  1871. mode = termio->c_cflag & CSIZE;
  1872. if (mode == CS5)
  1873. mode = MX_CS5;
  1874. else if (mode == CS6)
  1875. mode = MX_CS6;
  1876. else if (mode == CS7)
  1877. mode = MX_CS7;
  1878. else if (mode == CS8)
  1879. mode = MX_CS8;
  1880. if (termio->c_cflag & CSTOPB) {
  1881. if (mode == MX_CS5)
  1882. mode |= MX_STOP15;
  1883. else
  1884. mode |= MX_STOP2;
  1885. } else
  1886. mode |= MX_STOP1;
  1887. if (termio->c_cflag & PARENB) {
  1888. if (termio->c_cflag & PARODD)
  1889. mode |= MX_PARODD;
  1890. else
  1891. mode |= MX_PAREVEN;
  1892. } else
  1893. mode |= MX_PARNONE;
  1894. moxafunc(ofsAddr, FC_SetDataMode, (ushort) mode);
  1895. if (port->board->boardType == MOXA_BOARD_C320_ISA ||
  1896. port->board->boardType == MOXA_BOARD_C320_PCI) {
  1897. if (baud >= 921600L)
  1898. return (-1);
  1899. }
  1900. baud = MoxaPortSetBaud(port, baud);
  1901. if (termio->c_iflag & (IXON | IXOFF | IXANY)) {
  1902. writeb(termio->c_cc[VSTART], ofsAddr + FuncArg);
  1903. writeb(termio->c_cc[VSTOP], ofsAddr + FuncArg1);
  1904. writeb(FC_SetXonXoff, ofsAddr + FuncCode);
  1905. moxa_wait_finish(ofsAddr);
  1906. }
  1907. return (baud);
  1908. }
  1909. static int MoxaPortGetLineOut(struct moxa_port *port, int *dtrState,
  1910. int *rtsState)
  1911. {
  1912. if (!MoxaPortIsValid(port->tty->index))
  1913. return (-1);
  1914. if (dtrState)
  1915. *dtrState = !!(port->lineCtrl & DTR_ON);
  1916. if (rtsState)
  1917. *rtsState = !!(port->lineCtrl & RTS_ON);
  1918. return (0);
  1919. }
  1920. static void MoxaPortLineCtrl(struct moxa_port *port, int dtr, int rts)
  1921. {
  1922. int mode = 0;
  1923. if (dtr)
  1924. mode |= DTR_ON;
  1925. if (rts)
  1926. mode |= RTS_ON;
  1927. port->lineCtrl = mode;
  1928. moxafunc(port->tableAddr, FC_LineControl, mode);
  1929. }
  1930. static void MoxaPortFlowCtrl(struct moxa_port *port, int rts, int cts,
  1931. int txflow, int rxflow, int txany)
  1932. {
  1933. int mode = 0;
  1934. if (rts)
  1935. mode |= RTS_FlowCtl;
  1936. if (cts)
  1937. mode |= CTS_FlowCtl;
  1938. if (txflow)
  1939. mode |= Tx_FlowCtl;
  1940. if (rxflow)
  1941. mode |= Rx_FlowCtl;
  1942. if (txany)
  1943. mode |= IXM_IXANY;
  1944. moxafunc(port->tableAddr, FC_SetFlowCtl, mode);
  1945. }
  1946. static int MoxaPortLineStatus(struct moxa_port *port)
  1947. {
  1948. void __iomem *ofsAddr;
  1949. int val;
  1950. ofsAddr = port->tableAddr;
  1951. if (port->board->boardType == MOXA_BOARD_C320_ISA ||
  1952. port->board->boardType == MOXA_BOARD_C320_PCI) {
  1953. moxafunc(ofsAddr, FC_LineStatus, 0);
  1954. val = readw(ofsAddr + FuncArg);
  1955. } else {
  1956. val = readw(ofsAddr + FlagStat) >> 4;
  1957. }
  1958. val &= 0x0B;
  1959. if (val & 8) {
  1960. val |= 4;
  1961. if ((port->DCDState & DCD_oldstate) == 0)
  1962. port->DCDState = (DCD_oldstate | DCD_changed);
  1963. } else {
  1964. if (port->DCDState & DCD_oldstate)
  1965. port->DCDState = DCD_changed;
  1966. }
  1967. val &= 7;
  1968. return (val);
  1969. }
  1970. static int MoxaPortDCDChange(struct moxa_port *port)
  1971. {
  1972. int n;
  1973. if (port->chkPort == 0)
  1974. return (0);
  1975. n = port->DCDState;
  1976. port->DCDState &= ~DCD_changed;
  1977. n &= DCD_changed;
  1978. return (n);
  1979. }
  1980. static int MoxaPortDCDON(struct moxa_port *port)
  1981. {
  1982. int n;
  1983. if (port->chkPort == 0)
  1984. return (0);
  1985. if (port->DCDState & DCD_oldstate)
  1986. n = 1;
  1987. else
  1988. n = 0;
  1989. return (n);
  1990. }
  1991. static int MoxaPortWriteData(struct moxa_port *port, unsigned char *buffer,
  1992. int len)
  1993. {
  1994. int c, total, i;
  1995. ushort tail;
  1996. int cnt;
  1997. ushort head, tx_mask, spage, epage;
  1998. ushort pageno, pageofs, bufhead;
  1999. void __iomem *baseAddr, *ofsAddr, *ofs;
  2000. ofsAddr = port->tableAddr;
  2001. baseAddr = port->board->basemem;
  2002. tx_mask = readw(ofsAddr + TX_mask);
  2003. spage = readw(ofsAddr + Page_txb);
  2004. epage = readw(ofsAddr + EndPage_txb);
  2005. tail = readw(ofsAddr + TXwptr);
  2006. head = readw(ofsAddr + TXrptr);
  2007. c = (head > tail) ? (head - tail - 1)
  2008. : (head - tail + tx_mask);
  2009. if (c > len)
  2010. c = len;
  2011. moxaLog.txcnt[port->tty->index] += c;
  2012. total = c;
  2013. if (spage == epage) {
  2014. bufhead = readw(ofsAddr + Ofs_txb);
  2015. writew(spage, baseAddr + Control_reg);
  2016. while (c > 0) {
  2017. if (head > tail)
  2018. len = head - tail - 1;
  2019. else
  2020. len = tx_mask + 1 - tail;
  2021. len = (c > len) ? len : c;
  2022. ofs = baseAddr + DynPage_addr + bufhead + tail;
  2023. for (i = 0; i < len; i++)
  2024. writeb(*buffer++, ofs + i);
  2025. tail = (tail + len) & tx_mask;
  2026. c -= len;
  2027. }
  2028. writew(tail, ofsAddr + TXwptr);
  2029. } else {
  2030. len = c;
  2031. pageno = spage + (tail >> 13);
  2032. pageofs = tail & Page_mask;
  2033. do {
  2034. cnt = Page_size - pageofs;
  2035. if (cnt > c)
  2036. cnt = c;
  2037. c -= cnt;
  2038. writeb(pageno, baseAddr + Control_reg);
  2039. ofs = baseAddr + DynPage_addr + pageofs;
  2040. for (i = 0; i < cnt; i++)
  2041. writeb(*buffer++, ofs + i);
  2042. if (c == 0) {
  2043. writew((tail + len) & tx_mask, ofsAddr + TXwptr);
  2044. break;
  2045. }
  2046. if (++pageno == epage)
  2047. pageno = spage;
  2048. pageofs = 0;
  2049. } while (1);
  2050. }
  2051. writeb(1, ofsAddr + CD180TXirq); /* start to send */
  2052. return (total);
  2053. }
  2054. static int MoxaPortReadData(struct moxa_port *port, struct tty_struct *tty)
  2055. {
  2056. register ushort head, pageofs;
  2057. int i, count, cnt, len, total, remain;
  2058. ushort tail, rx_mask, spage, epage;
  2059. ushort pageno, bufhead;
  2060. void __iomem *baseAddr, *ofsAddr, *ofs;
  2061. ofsAddr = port->tableAddr;
  2062. baseAddr = port->board->basemem;
  2063. head = readw(ofsAddr + RXrptr);
  2064. tail = readw(ofsAddr + RXwptr);
  2065. rx_mask = readw(ofsAddr + RX_mask);
  2066. spage = readw(ofsAddr + Page_rxb);
  2067. epage = readw(ofsAddr + EndPage_rxb);
  2068. count = (tail >= head) ? (tail - head)
  2069. : (tail - head + rx_mask + 1);
  2070. if (count == 0)
  2071. return 0;
  2072. total = count;
  2073. remain = count - total;
  2074. moxaLog.rxcnt[port->tty->index] += total;
  2075. count = total;
  2076. if (spage == epage) {
  2077. bufhead = readw(ofsAddr + Ofs_rxb);
  2078. writew(spage, baseAddr + Control_reg);
  2079. while (count > 0) {
  2080. if (tail >= head)
  2081. len = tail - head;
  2082. else
  2083. len = rx_mask + 1 - head;
  2084. len = (count > len) ? len : count;
  2085. ofs = baseAddr + DynPage_addr + bufhead + head;
  2086. for (i = 0; i < len; i++)
  2087. tty_insert_flip_char(tty, readb(ofs + i), TTY_NORMAL);
  2088. head = (head + len) & rx_mask;
  2089. count -= len;
  2090. }
  2091. writew(head, ofsAddr + RXrptr);
  2092. } else {
  2093. len = count;
  2094. pageno = spage + (head >> 13);
  2095. pageofs = head & Page_mask;
  2096. do {
  2097. cnt = Page_size - pageofs;
  2098. if (cnt > count)
  2099. cnt = count;
  2100. count -= cnt;
  2101. writew(pageno, baseAddr + Control_reg);
  2102. ofs = baseAddr + DynPage_addr + pageofs;
  2103. for (i = 0; i < cnt; i++)
  2104. tty_insert_flip_char(tty, readb(ofs + i), TTY_NORMAL);
  2105. if (count == 0) {
  2106. writew((head + len) & rx_mask, ofsAddr + RXrptr);
  2107. break;
  2108. }
  2109. if (++pageno == epage)
  2110. pageno = spage;
  2111. pageofs = 0;
  2112. } while (1);
  2113. }
  2114. if ((readb(ofsAddr + FlagStat) & Xoff_state) && (remain < LowWater)) {
  2115. moxaLowWaterChk = 1;
  2116. port->lowChkFlag = 1;
  2117. }
  2118. return (total);
  2119. }
  2120. static int MoxaPortTxQueue(struct moxa_port *port)
  2121. {
  2122. void __iomem *ofsAddr = port->tableAddr;
  2123. ushort rptr, wptr, mask;
  2124. int len;
  2125. rptr = readw(ofsAddr + TXrptr);
  2126. wptr = readw(ofsAddr + TXwptr);
  2127. mask = readw(ofsAddr + TX_mask);
  2128. len = (wptr - rptr) & mask;
  2129. return (len);
  2130. }
  2131. static int MoxaPortTxFree(struct moxa_port *port)
  2132. {
  2133. void __iomem *ofsAddr = port->tableAddr;
  2134. ushort rptr, wptr, mask;
  2135. int len;
  2136. rptr = readw(ofsAddr + TXrptr);
  2137. wptr = readw(ofsAddr + TXwptr);
  2138. mask = readw(ofsAddr + TX_mask);
  2139. len = mask - ((wptr - rptr) & mask);
  2140. return (len);
  2141. }
  2142. static int MoxaPortRxQueue(struct moxa_port *port)
  2143. {
  2144. void __iomem *ofsAddr = port->tableAddr;
  2145. ushort rptr, wptr, mask;
  2146. int len;
  2147. rptr = readw(ofsAddr + RXrptr);
  2148. wptr = readw(ofsAddr + RXwptr);
  2149. mask = readw(ofsAddr + RX_mask);
  2150. len = (wptr - rptr) & mask;
  2151. return (len);
  2152. }
  2153. static void MoxaPortTxDisable(struct moxa_port *port)
  2154. {
  2155. moxafunc(port->tableAddr, FC_SetXoffState, Magic_code);
  2156. }
  2157. static void MoxaPortTxEnable(struct moxa_port *port)
  2158. {
  2159. moxafunc(port->tableAddr, FC_SetXonState, Magic_code);
  2160. }
  2161. static int MoxaPortResetBrkCnt(struct moxa_port *port)
  2162. {
  2163. ushort cnt;
  2164. cnt = port->breakCnt;
  2165. port->breakCnt = 0;
  2166. return (cnt);
  2167. }
  2168. static void MoxaPortSendBreak(struct moxa_port *port, int ms100)
  2169. {
  2170. void __iomem *ofsAddr = port->tableAddr;
  2171. if (ms100) {
  2172. moxafunc(ofsAddr, FC_SendBreak, Magic_code);
  2173. msleep(ms100 * 10);
  2174. } else {
  2175. moxafunc(ofsAddr, FC_SendBreak, Magic_code);
  2176. msleep(250);
  2177. }
  2178. moxafunc(ofsAddr, FC_StopBreak, Magic_code);
  2179. }
  2180. static int moxa_get_serial_info(struct moxa_port *info,
  2181. struct serial_struct __user *retinfo)
  2182. {
  2183. struct serial_struct tmp;
  2184. memset(&tmp, 0, sizeof(tmp));
  2185. tmp.type = info->type;
  2186. tmp.line = info->tty->index;
  2187. tmp.port = 0;
  2188. tmp.irq = 0;
  2189. tmp.flags = info->asyncflags;
  2190. tmp.baud_base = 921600;
  2191. tmp.close_delay = info->close_delay;
  2192. tmp.custom_divisor = 0;
  2193. tmp.hub6 = 0;
  2194. if(copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
  2195. return -EFAULT;
  2196. return (0);
  2197. }
  2198. static int moxa_set_serial_info(struct moxa_port *info,
  2199. struct serial_struct __user *new_info)
  2200. {
  2201. struct serial_struct new_serial;
  2202. if(copy_from_user(&new_serial, new_info, sizeof(new_serial)))
  2203. return -EFAULT;
  2204. if ((new_serial.irq != 0) ||
  2205. (new_serial.port != 0) ||
  2206. // (new_serial.type != info->type) ||
  2207. (new_serial.custom_divisor != 0) ||
  2208. (new_serial.baud_base != 921600))
  2209. return (-EPERM);
  2210. if (!capable(CAP_SYS_ADMIN)) {
  2211. if (((new_serial.flags & ~ASYNC_USR_MASK) !=
  2212. (info->asyncflags & ~ASYNC_USR_MASK)))
  2213. return (-EPERM);
  2214. } else {
  2215. info->close_delay = new_serial.close_delay * HZ / 100;
  2216. }
  2217. new_serial.flags = (new_serial.flags & ~ASYNC_FLAGS);
  2218. new_serial.flags |= (info->asyncflags & ASYNC_FLAGS);
  2219. if (new_serial.type == PORT_16550A) {
  2220. MoxaSetFifo(info, 1);
  2221. } else {
  2222. MoxaSetFifo(info, 0);
  2223. }
  2224. info->type = new_serial.type;
  2225. return (0);
  2226. }
  2227. /*****************************************************************************
  2228. * Static local functions: *
  2229. *****************************************************************************/
  2230. static void moxafunc(void __iomem *ofsAddr, int cmd, ushort arg)
  2231. {
  2232. writew(arg, ofsAddr + FuncArg);
  2233. writew(cmd, ofsAddr + FuncCode);
  2234. moxa_wait_finish(ofsAddr);
  2235. }
  2236. static void moxa_wait_finish(void __iomem *ofsAddr)
  2237. {
  2238. unsigned long i, j;
  2239. i = jiffies;
  2240. while (readw(ofsAddr + FuncCode) != 0) {
  2241. j = jiffies;
  2242. if ((j - i) > moxaFuncTout) {
  2243. return;
  2244. }
  2245. }
  2246. }
  2247. static void moxa_low_water_check(void __iomem *ofsAddr)
  2248. {
  2249. int len;
  2250. ushort rptr, wptr, mask;
  2251. if (readb(ofsAddr + FlagStat) & Xoff_state) {
  2252. rptr = readw(ofsAddr + RXrptr);
  2253. wptr = readw(ofsAddr + RXwptr);
  2254. mask = readw(ofsAddr + RX_mask);
  2255. len = (wptr - rptr) & mask;
  2256. if (len <= Low_water)
  2257. moxafunc(ofsAddr, FC_SendXon, 0);
  2258. }
  2259. }
  2260. static void MoxaSetFifo(struct moxa_port *port, int enable)
  2261. {
  2262. void __iomem *ofsAddr = port->tableAddr;
  2263. if (!enable) {
  2264. moxafunc(ofsAddr, FC_SetRxFIFOTrig, 0);
  2265. moxafunc(ofsAddr, FC_SetTxFIFOCnt, 1);
  2266. } else {
  2267. moxafunc(ofsAddr, FC_SetRxFIFOTrig, 3);
  2268. moxafunc(ofsAddr, FC_SetTxFIFOCnt, 16);
  2269. }
  2270. }