stallion.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:137k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /*
  3.  * stallion.c  -- stallion multiport serial driver.
  4.  *
  5.  * Copyright (C) 1996-1999  Stallion Technologies (support@stallion.oz.au).
  6.  * Copyright (C) 1994-1996  Greg Ungerer.
  7.  *
  8.  * This code is loosely based on the Linux serial driver, written by
  9.  * Linus Torvalds, Theodore T'so and others.
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  */
  25. /*****************************************************************************/
  26. #include <linux/config.h>
  27. #include <linux/module.h>
  28. #include <linux/version.h> /* for linux/stallion.h */
  29. #include <linux/slab.h>
  30. #include <linux/interrupt.h>
  31. #include <linux/tty.h>
  32. #include <linux/tty_flip.h>
  33. #include <linux/serial.h>
  34. #include <linux/cd1400.h>
  35. #include <linux/sc26198.h>
  36. #include <linux/comstats.h>
  37. #include <linux/stallion.h>
  38. #include <linux/ioport.h>
  39. #include <linux/init.h>
  40. #include <linux/smp_lock.h>
  41. #include <linux/devfs_fs_kernel.h>
  42. #include <asm/io.h>
  43. #include <asm/uaccess.h>
  44. #ifdef CONFIG_PCI
  45. #include <linux/pci.h>
  46. #endif
  47. /*****************************************************************************/
  48. /*
  49.  * Define different board types. Use the standard Stallion "assigned"
  50.  * board numbers. Boards supported in this driver are abbreviated as
  51.  * EIO = EasyIO and ECH = EasyConnection 8/32.
  52.  */
  53. #define BRD_EASYIO 20
  54. #define BRD_ECH 21
  55. #define BRD_ECHMC 22
  56. #define BRD_ECHPCI 26
  57. #define BRD_ECH64PCI 27
  58. #define BRD_EASYIOPCI 28
  59. /*
  60.  * Define a configuration structure to hold the board configuration.
  61.  * Need to set this up in the code (for now) with the boards that are
  62.  * to be configured into the system. This is what needs to be modified
  63.  * when adding/removing/modifying boards. Each line entry in the
  64.  * stl_brdconf[] array is a board. Each line contains io/irq/memory
  65.  * ranges for that board (as well as what type of board it is).
  66.  * Some examples:
  67.  * { BRD_EASYIO, 0x2a0, 0, 0, 10, 0 },
  68.  * This line would configure an EasyIO board (4 or 8, no difference),
  69.  * at io address 2a0 and irq 10.
  70.  * Another example:
  71.  * { BRD_ECH, 0x2a8, 0x280, 0, 12, 0 },
  72.  * This line will configure an EasyConnection 8/32 board at primary io
  73.  * address 2a8, secondary io address 280 and irq 12.
  74.  * Enter as many lines into this array as you want (only the first 4
  75.  * will actually be used!). Any combination of EasyIO and EasyConnection
  76.  * boards can be specified. EasyConnection 8/32 boards can share their
  77.  * secondary io addresses between each other.
  78.  *
  79.  * NOTE: there is no need to put any entries in this table for PCI
  80.  * boards. They will be found automatically by the driver - provided
  81.  * PCI BIOS32 support is compiled into the kernel.
  82.  */
  83. typedef struct {
  84. int brdtype;
  85. int ioaddr1;
  86. int ioaddr2;
  87. unsigned long memaddr;
  88. int irq;
  89. int irqtype;
  90. } stlconf_t;
  91. static stlconf_t stl_brdconf[] = {
  92. /*{ BRD_EASYIO, 0x2a0, 0, 0, 10, 0 },*/
  93. };
  94. static int stl_nrbrds = sizeof(stl_brdconf) / sizeof(stlconf_t);
  95. /*****************************************************************************/
  96. /*
  97.  * Define some important driver characteristics. Device major numbers
  98.  * allocated as per Linux Device Registry.
  99.  */
  100. #ifndef STL_SIOMEMMAJOR
  101. #define STL_SIOMEMMAJOR 28
  102. #endif
  103. #ifndef STL_SERIALMAJOR
  104. #define STL_SERIALMAJOR 24
  105. #endif
  106. #ifndef STL_CALLOUTMAJOR
  107. #define STL_CALLOUTMAJOR 25
  108. #endif
  109. #define STL_DRVTYPSERIAL 1
  110. #define STL_DRVTYPCALLOUT 2
  111. /*
  112.  * Set the TX buffer size. Bigger is better, but we don't want
  113.  * to chew too much memory with buffers!
  114.  */
  115. #define STL_TXBUFLOW 512
  116. #define STL_TXBUFSIZE 4096
  117. /*****************************************************************************/
  118. /*
  119.  * Define our local driver identity first. Set up stuff to deal with
  120.  * all the local structures required by a serial tty driver.
  121.  */
  122. static char *stl_drvtitle = "Stallion Multiport Serial Driver";
  123. static char *stl_drvname = "stallion";
  124. static char *stl_drvversion = "5.6.0";
  125. #ifdef CONFIG_DEVFS_FS
  126. static char *stl_serialname = "tts/E%d";
  127. static char *stl_calloutname = "cua/E%d";
  128. #else
  129. static char *stl_serialname = "ttyE";
  130. static char *stl_calloutname = "cue";
  131. #endif
  132. static struct tty_driver stl_serial;
  133. static struct tty_driver stl_callout;
  134. static struct tty_struct *stl_ttys[STL_MAXDEVS];
  135. static struct termios *stl_termios[STL_MAXDEVS];
  136. static struct termios *stl_termioslocked[STL_MAXDEVS];
  137. static int stl_refcount;
  138. /*
  139.  * We will need to allocate a temporary write buffer for chars that
  140.  * come direct from user space. The problem is that a copy from user
  141.  * space might cause a page fault (typically on a system that is
  142.  * swapping!). All ports will share one buffer - since if the system
  143.  * is already swapping a shared buffer won't make things any worse.
  144.  */
  145. static char *stl_tmpwritebuf;
  146. static DECLARE_MUTEX(stl_tmpwritesem);
  147. /*
  148.  * Define a local default termios struct. All ports will be created
  149.  * with this termios initially. Basically all it defines is a raw port
  150.  * at 9600, 8 data bits, 1 stop bit.
  151.  */
  152. static struct termios stl_deftermios = {
  153. c_cflag: (B9600 | CS8 | CREAD | HUPCL | CLOCAL),
  154. c_cc: INIT_C_CC,
  155. };
  156. /*
  157.  * Define global stats structures. Not used often, and can be
  158.  * re-used for each stats call.
  159.  */
  160. static comstats_t stl_comstats;
  161. static combrd_t stl_brdstats;
  162. static stlbrd_t stl_dummybrd;
  163. static stlport_t stl_dummyport;
  164. /*
  165.  * Define global place to put buffer overflow characters.
  166.  */
  167. static char stl_unwanted[SC26198_RXFIFOSIZE];
  168. /*
  169.  * Keep track of what interrupts we have requested for us.
  170.  * We don't need to request an interrupt twice if it is being
  171.  * shared with another Stallion board.
  172.  */
  173. static int stl_gotintrs[STL_MAXBRDS];
  174. static int stl_numintrs;
  175. /*****************************************************************************/
  176. static stlbrd_t *stl_brds[STL_MAXBRDS];
  177. /*
  178.  * Per board state flags. Used with the state field of the board struct.
  179.  * Not really much here!
  180.  */
  181. #define BRD_FOUND 0x1
  182. /*
  183.  * Define the port structure istate flags. These set of flags are
  184.  * modified at interrupt time - so setting and reseting them needs
  185.  * to be atomic. Use the bit clear/setting routines for this.
  186.  */
  187. #define ASYI_TXBUSY 1
  188. #define ASYI_TXLOW 2
  189. #define ASYI_DCDCHANGE 3
  190. #define ASYI_TXFLOWED 4
  191. /*
  192.  * Define an array of board names as printable strings. Handy for
  193.  * referencing boards when printing trace and stuff.
  194.  */
  195. static char *stl_brdnames[] = {
  196. (char *) NULL,
  197. (char *) NULL,
  198. (char *) NULL,
  199. (char *) NULL,
  200. (char *) NULL,
  201. (char *) NULL,
  202. (char *) NULL,
  203. (char *) NULL,
  204. (char *) NULL,
  205. (char *) NULL,
  206. (char *) NULL,
  207. (char *) NULL,
  208. (char *) NULL,
  209. (char *) NULL,
  210. (char *) NULL,
  211. (char *) NULL,
  212. (char *) NULL,
  213. (char *) NULL,
  214. (char *) NULL,
  215. (char *) NULL,
  216. "EasyIO",
  217. "EC8/32-AT",
  218. "EC8/32-MC",
  219. (char *) NULL,
  220. (char *) NULL,
  221. (char *) NULL,
  222. "EC8/32-PCI",
  223. "EC8/64-PCI",
  224. "EasyIO-PCI",
  225. };
  226. /*****************************************************************************/
  227. #ifdef MODULE
  228. /*
  229.  * Define some string labels for arguments passed from the module
  230.  * load line. These allow for easy board definitions, and easy
  231.  * modification of the io, memory and irq resoucres.
  232.  */
  233. static char *board0[4];
  234. static char *board1[4];
  235. static char *board2[4];
  236. static char *board3[4];
  237. static char **stl_brdsp[] = {
  238. (char **) &board0,
  239. (char **) &board1,
  240. (char **) &board2,
  241. (char **) &board3
  242. };
  243. /*
  244.  * Define a set of common board names, and types. This is used to
  245.  * parse any module arguments.
  246.  */
  247. typedef struct stlbrdtype {
  248. char *name;
  249. int type;
  250. } stlbrdtype_t;
  251. static stlbrdtype_t stl_brdstr[] = {
  252. { "easyio", BRD_EASYIO },
  253. { "eio", BRD_EASYIO },
  254. { "20", BRD_EASYIO },
  255. { "ec8/32", BRD_ECH },
  256. { "ec8/32-at", BRD_ECH },
  257. { "ec8/32-isa", BRD_ECH },
  258. { "ech", BRD_ECH },
  259. { "echat", BRD_ECH },
  260. { "21", BRD_ECH },
  261. { "ec8/32-mc", BRD_ECHMC },
  262. { "ec8/32-mca", BRD_ECHMC },
  263. { "echmc", BRD_ECHMC },
  264. { "echmca", BRD_ECHMC },
  265. { "22", BRD_ECHMC },
  266. { "ec8/32-pc", BRD_ECHPCI },
  267. { "ec8/32-pci", BRD_ECHPCI },
  268. { "26", BRD_ECHPCI },
  269. { "ec8/64-pc", BRD_ECH64PCI },
  270. { "ec8/64-pci", BRD_ECH64PCI },
  271. { "ech-pci", BRD_ECH64PCI },
  272. { "echpci", BRD_ECH64PCI },
  273. { "echpc", BRD_ECH64PCI },
  274. { "27", BRD_ECH64PCI },
  275. { "easyio-pc", BRD_EASYIOPCI },
  276. { "easyio-pci", BRD_EASYIOPCI },
  277. { "eio-pci", BRD_EASYIOPCI },
  278. { "eiopci", BRD_EASYIOPCI },
  279. { "28", BRD_EASYIOPCI },
  280. };
  281. /*
  282.  * Define the module agruments.
  283.  */
  284. MODULE_AUTHOR("Greg Ungerer");
  285. MODULE_DESCRIPTION("Stallion Multiport Serial Driver");
  286. MODULE_LICENSE("GPL");
  287. MODULE_PARM(board0, "1-4s");
  288. MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,ioaddr2][,irq]]");
  289. MODULE_PARM(board1, "1-4s");
  290. MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,ioaddr2][,irq]]");
  291. MODULE_PARM(board2, "1-4s");
  292. MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,ioaddr2][,irq]]");
  293. MODULE_PARM(board3, "1-4s");
  294. MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,ioaddr2][,irq]]");
  295. #endif
  296. /*****************************************************************************/
  297. /*
  298.  * Hardware ID bits for the EasyIO and ECH boards. These defines apply
  299.  * to the directly accessible io ports of these boards (not the uarts -
  300.  * they are in cd1400.h and sc26198.h).
  301.  */
  302. #define EIO_8PORTRS 0x04
  303. #define EIO_4PORTRS 0x05
  304. #define EIO_8PORTDI 0x00
  305. #define EIO_8PORTM 0x06
  306. #define EIO_MK3 0x03
  307. #define EIO_IDBITMASK 0x07
  308. #define EIO_BRDMASK 0xf0
  309. #define ID_BRD4 0x10
  310. #define ID_BRD8 0x20
  311. #define ID_BRD16 0x30
  312. #define EIO_INTRPEND 0x08
  313. #define EIO_INTEDGE 0x00
  314. #define EIO_INTLEVEL 0x08
  315. #define EIO_0WS 0x10
  316. #define ECH_ID 0xa0
  317. #define ECH_IDBITMASK 0xe0
  318. #define ECH_BRDENABLE 0x08
  319. #define ECH_BRDDISABLE 0x00
  320. #define ECH_INTENABLE 0x01
  321. #define ECH_INTDISABLE 0x00
  322. #define ECH_INTLEVEL 0x02
  323. #define ECH_INTEDGE 0x00
  324. #define ECH_INTRPEND 0x01
  325. #define ECH_BRDRESET 0x01
  326. #define ECHMC_INTENABLE 0x01
  327. #define ECHMC_BRDRESET 0x02
  328. #define ECH_PNLSTATUS 2
  329. #define ECH_PNL16PORT 0x20
  330. #define ECH_PNLIDMASK 0x07
  331. #define ECH_PNLXPID 0x40
  332. #define ECH_PNLINTRPEND 0x80
  333. #define ECH_ADDR2MASK 0x1e0
  334. /*
  335.  * Define the vector mapping bits for the programmable interrupt board
  336.  * hardware. These bits encode the interrupt for the board to use - it
  337.  * is software selectable (except the EIO-8M).
  338.  */
  339. static unsigned char stl_vecmap[] = {
  340. 0xff, 0xff, 0xff, 0x04, 0x06, 0x05, 0xff, 0x07,
  341. 0xff, 0xff, 0x00, 0x02, 0x01, 0xff, 0xff, 0x03
  342. };
  343. /*
  344.  * Set up enable and disable macros for the ECH boards. They require
  345.  * the secondary io address space to be activated and deactivated.
  346.  * This way all ECH boards can share their secondary io region.
  347.  * If this is an ECH-PCI board then also need to set the page pointer
  348.  * to point to the correct page.
  349.  */
  350. #define BRDENABLE(brdnr,pagenr)
  351. if (stl_brds[(brdnr)]->brdtype == BRD_ECH)
  352. outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDENABLE),
  353. stl_brds[(brdnr)]->ioctrl);
  354. else if (stl_brds[(brdnr)]->brdtype == BRD_ECHPCI)
  355. outb((pagenr), stl_brds[(brdnr)]->ioctrl);
  356. #define BRDDISABLE(brdnr)
  357. if (stl_brds[(brdnr)]->brdtype == BRD_ECH)
  358. outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDDISABLE),
  359. stl_brds[(brdnr)]->ioctrl);
  360. #define STL_CD1400MAXBAUD 230400
  361. #define STL_SC26198MAXBAUD 460800
  362. #define STL_BAUDBASE 115200
  363. #define STL_CLOSEDELAY (5 * HZ / 10)
  364. /*****************************************************************************/
  365. #ifdef CONFIG_PCI
  366. /*
  367.  * Define the Stallion PCI vendor and device IDs.
  368.  */
  369. #ifndef PCI_VENDOR_ID_STALLION
  370. #define PCI_VENDOR_ID_STALLION 0x124d
  371. #endif
  372. #ifndef PCI_DEVICE_ID_ECHPCI832
  373. #define PCI_DEVICE_ID_ECHPCI832 0x0000
  374. #endif
  375. #ifndef PCI_DEVICE_ID_ECHPCI864
  376. #define PCI_DEVICE_ID_ECHPCI864 0x0002
  377. #endif
  378. #ifndef PCI_DEVICE_ID_EIOPCI
  379. #define PCI_DEVICE_ID_EIOPCI 0x0003
  380. #endif
  381. /*
  382.  * Define structure to hold all Stallion PCI boards.
  383.  */
  384. typedef struct stlpcibrd {
  385. unsigned short vendid;
  386. unsigned short devid;
  387. int brdtype;
  388. } stlpcibrd_t;
  389. static stlpcibrd_t stl_pcibrds[] = {
  390. { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI864, BRD_ECH64PCI },
  391. { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_EIOPCI, BRD_EASYIOPCI },
  392. { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI832, BRD_ECHPCI },
  393. { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87410, BRD_ECHPCI },
  394. };
  395. static int stl_nrpcibrds = sizeof(stl_pcibrds) / sizeof(stlpcibrd_t);
  396. #endif
  397. /*****************************************************************************/
  398. /*
  399.  * Define macros to extract a brd/port number from a minor number.
  400.  */
  401. #define MINOR2BRD(min) (((min) & 0xc0) >> 6)
  402. #define MINOR2PORT(min) ((min) & 0x3f)
  403. /*
  404.  * Define a baud rate table that converts termios baud rate selector
  405.  * into the actual baud rate value. All baud rate calculations are
  406.  * based on the actual baud rate required.
  407.  */
  408. static unsigned int stl_baudrates[] = {
  409. 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
  410. 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
  411. };
  412. /*
  413.  * Define some handy local macros...
  414.  */
  415. #undef MIN
  416. #define MIN(a,b) (((a) <= (b)) ? (a) : (b))
  417. #undef TOLOWER
  418. #define TOLOWER(x) ((((x) >= 'A') && ((x) <= 'Z')) ? ((x) + 0x20) : (x))
  419. /*****************************************************************************/
  420. /*
  421.  * Declare all those functions in this driver!
  422.  */
  423. #ifdef MODULE
  424. int init_module(void);
  425. void cleanup_module(void);
  426. static void stl_argbrds(void);
  427. static int stl_parsebrd(stlconf_t *confp, char **argp);
  428. static unsigned long stl_atol(char *str);
  429. #endif
  430. int stl_init(void);
  431. static int stl_open(struct tty_struct *tty, struct file *filp);
  432. static void stl_close(struct tty_struct *tty, struct file *filp);
  433. static int stl_write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count);
  434. static void stl_putchar(struct tty_struct *tty, unsigned char ch);
  435. static void stl_flushchars(struct tty_struct *tty);
  436. static int stl_writeroom(struct tty_struct *tty);
  437. static int stl_charsinbuffer(struct tty_struct *tty);
  438. static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg);
  439. static void stl_settermios(struct tty_struct *tty, struct termios *old);
  440. static void stl_throttle(struct tty_struct *tty);
  441. static void stl_unthrottle(struct tty_struct *tty);
  442. static void stl_stop(struct tty_struct *tty);
  443. static void stl_start(struct tty_struct *tty);
  444. static void stl_flushbuffer(struct tty_struct *tty);
  445. static void stl_breakctl(struct tty_struct *tty, int state);
  446. static void stl_waituntilsent(struct tty_struct *tty, int timeout);
  447. static void stl_sendxchar(struct tty_struct *tty, char ch);
  448. static void stl_hangup(struct tty_struct *tty);
  449. static int stl_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg);
  450. static int stl_portinfo(stlport_t *portp, int portnr, char *pos);
  451. static int stl_readproc(char *page, char **start, off_t off, int count, int *eof, void *data);
  452. static int stl_brdinit(stlbrd_t *brdp);
  453. static int stl_initports(stlbrd_t *brdp, stlpanel_t *panelp);
  454. static int stl_mapirq(int irq, char *name);
  455. static void stl_getserial(stlport_t *portp, struct serial_struct *sp);
  456. static int stl_setserial(stlport_t *portp, struct serial_struct *sp);
  457. static int stl_getbrdstats(combrd_t *bp);
  458. static int stl_getportstats(stlport_t *portp, comstats_t *cp);
  459. static int stl_clrportstats(stlport_t *portp, comstats_t *cp);
  460. static int stl_getportstruct(unsigned long arg);
  461. static int stl_getbrdstruct(unsigned long arg);
  462. static int stl_waitcarrier(stlport_t *portp, struct file *filp);
  463. static void stl_delay(int len);
  464. static void stl_intr(int irq, void *dev_id, struct pt_regs *regs);
  465. static void stl_eiointr(stlbrd_t *brdp);
  466. static void stl_echatintr(stlbrd_t *brdp);
  467. static void stl_echmcaintr(stlbrd_t *brdp);
  468. static void stl_echpciintr(stlbrd_t *brdp);
  469. static void stl_echpci64intr(stlbrd_t *brdp);
  470. static void stl_offintr(void *private);
  471. static void *stl_memalloc(int len);
  472. static stlbrd_t *stl_allocbrd(void);
  473. static stlport_t *stl_getport(int brdnr, int panelnr, int portnr);
  474. static inline int stl_initbrds(void);
  475. static inline int stl_initeio(stlbrd_t *brdp);
  476. static inline int stl_initech(stlbrd_t *brdp);
  477. static inline int stl_getbrdnr(void);
  478. #ifdef CONFIG_PCI
  479. static inline int stl_findpcibrds(void);
  480. static inline int stl_initpcibrd(int brdtype, struct pci_dev *devp);
  481. #endif
  482. /*
  483.  * CD1400 uart specific handling functions.
  484.  */
  485. static void stl_cd1400setreg(stlport_t *portp, int regnr, int value);
  486. static int stl_cd1400getreg(stlport_t *portp, int regnr);
  487. static int stl_cd1400updatereg(stlport_t *portp, int regnr, int value);
  488. static int stl_cd1400panelinit(stlbrd_t *brdp, stlpanel_t *panelp);
  489. static void stl_cd1400portinit(stlbrd_t *brdp, stlpanel_t *panelp, stlport_t *portp);
  490. static void stl_cd1400setport(stlport_t *portp, struct termios *tiosp);
  491. static int stl_cd1400getsignals(stlport_t *portp);
  492. static void stl_cd1400setsignals(stlport_t *portp, int dtr, int rts);
  493. static void stl_cd1400ccrwait(stlport_t *portp);
  494. static void stl_cd1400enablerxtx(stlport_t *portp, int rx, int tx);
  495. static void stl_cd1400startrxtx(stlport_t *portp, int rx, int tx);
  496. static void stl_cd1400disableintrs(stlport_t *portp);
  497. static void stl_cd1400sendbreak(stlport_t *portp, int len);
  498. static void stl_cd1400flowctrl(stlport_t *portp, int state);
  499. static void stl_cd1400sendflow(stlport_t *portp, int state);
  500. static void stl_cd1400flush(stlport_t *portp);
  501. static int stl_cd1400datastate(stlport_t *portp);
  502. static void stl_cd1400eiointr(stlpanel_t *panelp, unsigned int iobase);
  503. static void stl_cd1400echintr(stlpanel_t *panelp, unsigned int iobase);
  504. static void stl_cd1400txisr(stlpanel_t *panelp, int ioaddr);
  505. static void stl_cd1400rxisr(stlpanel_t *panelp, int ioaddr);
  506. static void stl_cd1400mdmisr(stlpanel_t *panelp, int ioaddr);
  507. static inline int stl_cd1400breakisr(stlport_t *portp, int ioaddr);
  508. /*
  509.  * SC26198 uart specific handling functions.
  510.  */
  511. static void stl_sc26198setreg(stlport_t *portp, int regnr, int value);
  512. static int stl_sc26198getreg(stlport_t *portp, int regnr);
  513. static int stl_sc26198updatereg(stlport_t *portp, int regnr, int value);
  514. static int stl_sc26198getglobreg(stlport_t *portp, int regnr);
  515. static int stl_sc26198panelinit(stlbrd_t *brdp, stlpanel_t *panelp);
  516. static void stl_sc26198portinit(stlbrd_t *brdp, stlpanel_t *panelp, stlport_t *portp);
  517. static void stl_sc26198setport(stlport_t *portp, struct termios *tiosp);
  518. static int stl_sc26198getsignals(stlport_t *portp);
  519. static void stl_sc26198setsignals(stlport_t *portp, int dtr, int rts);
  520. static void stl_sc26198enablerxtx(stlport_t *portp, int rx, int tx);
  521. static void stl_sc26198startrxtx(stlport_t *portp, int rx, int tx);
  522. static void stl_sc26198disableintrs(stlport_t *portp);
  523. static void stl_sc26198sendbreak(stlport_t *portp, int len);
  524. static void stl_sc26198flowctrl(stlport_t *portp, int state);
  525. static void stl_sc26198sendflow(stlport_t *portp, int state);
  526. static void stl_sc26198flush(stlport_t *portp);
  527. static int stl_sc26198datastate(stlport_t *portp);
  528. static void stl_sc26198wait(stlport_t *portp);
  529. static void stl_sc26198txunflow(stlport_t *portp, struct tty_struct *tty);
  530. static void stl_sc26198intr(stlpanel_t *panelp, unsigned int iobase);
  531. static void stl_sc26198txisr(stlport_t *port);
  532. static void stl_sc26198rxisr(stlport_t *port, unsigned int iack);
  533. static void stl_sc26198rxbadch(stlport_t *portp, unsigned char status, char ch);
  534. static void stl_sc26198rxbadchars(stlport_t *portp);
  535. static void stl_sc26198otherisr(stlport_t *port, unsigned int iack);
  536. /*****************************************************************************/
  537. /*
  538.  * Generic UART support structure.
  539.  */
  540. typedef struct uart {
  541. int (*panelinit)(stlbrd_t *brdp, stlpanel_t *panelp);
  542. void (*portinit)(stlbrd_t *brdp, stlpanel_t *panelp, stlport_t *portp);
  543. void (*setport)(stlport_t *portp, struct termios *tiosp);
  544. int (*getsignals)(stlport_t *portp);
  545. void (*setsignals)(stlport_t *portp, int dtr, int rts);
  546. void (*enablerxtx)(stlport_t *portp, int rx, int tx);
  547. void (*startrxtx)(stlport_t *portp, int rx, int tx);
  548. void (*disableintrs)(stlport_t *portp);
  549. void (*sendbreak)(stlport_t *portp, int len);
  550. void (*flowctrl)(stlport_t *portp, int state);
  551. void (*sendflow)(stlport_t *portp, int state);
  552. void (*flush)(stlport_t *portp);
  553. int (*datastate)(stlport_t *portp);
  554. void (*intr)(stlpanel_t *panelp, unsigned int iobase);
  555. } uart_t;
  556. /*
  557.  * Define some macros to make calling these functions nice and clean.
  558.  */
  559. #define stl_panelinit (* ((uart_t *) panelp->uartp)->panelinit)
  560. #define stl_portinit (* ((uart_t *) portp->uartp)->portinit)
  561. #define stl_setport (* ((uart_t *) portp->uartp)->setport)
  562. #define stl_getsignals (* ((uart_t *) portp->uartp)->getsignals)
  563. #define stl_setsignals (* ((uart_t *) portp->uartp)->setsignals)
  564. #define stl_enablerxtx (* ((uart_t *) portp->uartp)->enablerxtx)
  565. #define stl_startrxtx (* ((uart_t *) portp->uartp)->startrxtx)
  566. #define stl_disableintrs (* ((uart_t *) portp->uartp)->disableintrs)
  567. #define stl_sendbreak (* ((uart_t *) portp->uartp)->sendbreak)
  568. #define stl_flowctrl (* ((uart_t *) portp->uartp)->flowctrl)
  569. #define stl_sendflow (* ((uart_t *) portp->uartp)->sendflow)
  570. #define stl_flush (* ((uart_t *) portp->uartp)->flush)
  571. #define stl_datastate (* ((uart_t *) portp->uartp)->datastate)
  572. /*****************************************************************************/
  573. /*
  574.  * CD1400 UART specific data initialization.
  575.  */
  576. static uart_t stl_cd1400uart = {
  577. stl_cd1400panelinit,
  578. stl_cd1400portinit,
  579. stl_cd1400setport,
  580. stl_cd1400getsignals,
  581. stl_cd1400setsignals,
  582. stl_cd1400enablerxtx,
  583. stl_cd1400startrxtx,
  584. stl_cd1400disableintrs,
  585. stl_cd1400sendbreak,
  586. stl_cd1400flowctrl,
  587. stl_cd1400sendflow,
  588. stl_cd1400flush,
  589. stl_cd1400datastate,
  590. stl_cd1400eiointr
  591. };
  592. /*
  593.  * Define the offsets within the register bank of a cd1400 based panel.
  594.  * These io address offsets are common to the EasyIO board as well.
  595.  */
  596. #define EREG_ADDR 0
  597. #define EREG_DATA 4
  598. #define EREG_RXACK 5
  599. #define EREG_TXACK 6
  600. #define EREG_MDACK 7
  601. #define EREG_BANKSIZE 8
  602. #define CD1400_CLK 25000000
  603. #define CD1400_CLK8M 20000000
  604. /*
  605.  * Define the cd1400 baud rate clocks. These are used when calculating
  606.  * what clock and divisor to use for the required baud rate. Also
  607.  * define the maximum baud rate allowed, and the default base baud.
  608.  */
  609. static int stl_cd1400clkdivs[] = {
  610. CD1400_CLK0, CD1400_CLK1, CD1400_CLK2, CD1400_CLK3, CD1400_CLK4
  611. };
  612. /*****************************************************************************/
  613. /*
  614.  * SC26198 UART specific data initization.
  615.  */
  616. static uart_t stl_sc26198uart = {
  617. stl_sc26198panelinit,
  618. stl_sc26198portinit,
  619. stl_sc26198setport,
  620. stl_sc26198getsignals,
  621. stl_sc26198setsignals,
  622. stl_sc26198enablerxtx,
  623. stl_sc26198startrxtx,
  624. stl_sc26198disableintrs,
  625. stl_sc26198sendbreak,
  626. stl_sc26198flowctrl,
  627. stl_sc26198sendflow,
  628. stl_sc26198flush,
  629. stl_sc26198datastate,
  630. stl_sc26198intr
  631. };
  632. /*
  633.  * Define the offsets within the register bank of a sc26198 based panel.
  634.  */
  635. #define XP_DATA 0
  636. #define XP_ADDR 1
  637. #define XP_MODID 2
  638. #define XP_STATUS 2
  639. #define XP_IACK 3
  640. #define XP_BANKSIZE 4
  641. /*
  642.  * Define the sc26198 baud rate table. Offsets within the table
  643.  * represent the actual baud rate selector of sc26198 registers.
  644.  */
  645. static unsigned int sc26198_baudtable[] = {
  646. 50, 75, 150, 200, 300, 450, 600, 900, 1200, 1800, 2400, 3600,
  647. 4800, 7200, 9600, 14400, 19200, 28800, 38400, 57600, 115200,
  648. 230400, 460800, 921600
  649. };
  650. #define SC26198_NRBAUDS (sizeof(sc26198_baudtable) / sizeof(unsigned int))
  651. /*****************************************************************************/
  652. /*
  653.  * Define the driver info for a user level control device. Used mainly
  654.  * to get at port stats - only not using the port device itself.
  655.  */
  656. static struct file_operations stl_fsiomem = {
  657. owner: THIS_MODULE,
  658. ioctl: stl_memioctl,
  659. };
  660. /*****************************************************************************/
  661. static devfs_handle_t devfs_handle;
  662. #ifdef MODULE
  663. /*
  664.  * Loadable module initialization stuff.
  665.  */
  666. int init_module()
  667. {
  668. unsigned long flags;
  669. #if DEBUG
  670. printk("init_module()n");
  671. #endif
  672. save_flags(flags);
  673. cli();
  674. stl_init();
  675. restore_flags(flags);
  676. return(0);
  677. }
  678. /*****************************************************************************/
  679. void cleanup_module()
  680. {
  681. stlbrd_t *brdp;
  682. stlpanel_t *panelp;
  683. stlport_t *portp;
  684. unsigned long flags;
  685. int i, j, k;
  686. #if DEBUG
  687. printk("cleanup_module()n");
  688. #endif
  689. printk(KERN_INFO "Unloading %s: version %sn", stl_drvtitle,
  690. stl_drvversion);
  691. save_flags(flags);
  692. cli();
  693. /*
  694.  * Free up all allocated resources used by the ports. This includes
  695.  * memory and interrupts. As part of this process we will also do
  696.  * a hangup on every open port - to try to flush out any processes
  697.  * hanging onto ports.
  698.  */
  699. i = tty_unregister_driver(&stl_serial);
  700. j = tty_unregister_driver(&stl_callout);
  701. if (i || j) {
  702. printk("STALLION: failed to un-register tty driver, "
  703. "errno=%d,%dn", -i, -j);
  704. restore_flags(flags);
  705. return;
  706. }
  707. devfs_unregister (devfs_handle);
  708. if ((i = devfs_unregister_chrdev(STL_SIOMEMMAJOR, "staliomem")))
  709. printk("STALLION: failed to un-register serial memory device, "
  710. "errno=%dn", -i);
  711. if (stl_tmpwritebuf != (char *) NULL)
  712. kfree(stl_tmpwritebuf);
  713. for (i = 0; (i < stl_nrbrds); i++) {
  714. if ((brdp = stl_brds[i]) == (stlbrd_t *) NULL)
  715. continue;
  716. for (j = 0; (j < STL_MAXPANELS); j++) {
  717. panelp = brdp->panels[j];
  718. if (panelp == (stlpanel_t *) NULL)
  719. continue;
  720. for (k = 0; (k < STL_PORTSPERPANEL); k++) {
  721. portp = panelp->ports[k];
  722. if (portp == (stlport_t *) NULL)
  723. continue;
  724. if (portp->tty != (struct tty_struct *) NULL)
  725. stl_hangup(portp->tty);
  726. if (portp->tx.buf != (char *) NULL)
  727. kfree(portp->tx.buf);
  728. kfree(portp);
  729. }
  730. kfree(panelp);
  731. }
  732. release_region(brdp->ioaddr1, brdp->iosize1);
  733. if (brdp->iosize2 > 0)
  734. release_region(brdp->ioaddr2, brdp->iosize2);
  735. kfree(brdp);
  736. stl_brds[i] = (stlbrd_t *) NULL;
  737. }
  738. for (i = 0; (i < stl_numintrs); i++)
  739. free_irq(stl_gotintrs[i], NULL);
  740. restore_flags(flags);
  741. }
  742. /*****************************************************************************/
  743. /*
  744.  * Check for any arguments passed in on the module load command line.
  745.  */
  746. static void stl_argbrds()
  747. {
  748. stlconf_t conf;
  749. stlbrd_t *brdp;
  750. int nrargs, i;
  751. #if DEBUG
  752. printk("stl_argbrds()n");
  753. #endif
  754. nrargs = sizeof(stl_brdsp) / sizeof(char **);
  755. for (i = stl_nrbrds; (i < nrargs); i++) {
  756. memset(&conf, 0, sizeof(conf));
  757. if (stl_parsebrd(&conf, stl_brdsp[i]) == 0)
  758. continue;
  759. if ((brdp = stl_allocbrd()) == (stlbrd_t *) NULL)
  760. continue;
  761. stl_nrbrds = i + 1;
  762. brdp->brdnr = i;
  763. brdp->brdtype = conf.brdtype;
  764. brdp->ioaddr1 = conf.ioaddr1;
  765. brdp->ioaddr2 = conf.ioaddr2;
  766. brdp->irq = conf.irq;
  767. brdp->irqtype = conf.irqtype;
  768. stl_brdinit(brdp);
  769. }
  770. }
  771. /*****************************************************************************/
  772. /*
  773.  * Convert an ascii string number into an unsigned long.
  774.  */
  775. static unsigned long stl_atol(char *str)
  776. {
  777. unsigned long val;
  778. int base, c;
  779. char *sp;
  780. val = 0;
  781. sp = str;
  782. if ((*sp == '0') && (*(sp+1) == 'x')) {
  783. base = 16;
  784. sp += 2;
  785. } else if (*sp == '0') {
  786. base = 8;
  787. sp++;
  788. } else {
  789. base = 10;
  790. }
  791. for (; (*sp != 0); sp++) {
  792. c = (*sp > '9') ? (TOLOWER(*sp) - 'a' + 10) : (*sp - '0');
  793. if ((c < 0) || (c >= base)) {
  794. printk("STALLION: invalid argument %sn", str);
  795. val = 0;
  796. break;
  797. }
  798. val = (val * base) + c;
  799. }
  800. return(val);
  801. }
  802. /*****************************************************************************/
  803. /*
  804.  * Parse the supplied argument string, into the board conf struct.
  805.  */
  806. static int stl_parsebrd(stlconf_t *confp, char **argp)
  807. {
  808. char *sp;
  809. int nrbrdnames, i;
  810. #if DEBUG
  811. printk("stl_parsebrd(confp=%x,argp=%x)n", (int) confp, (int) argp);
  812. #endif
  813. if ((argp[0] == (char *) NULL) || (*argp[0] == 0))
  814. return(0);
  815. for (sp = argp[0], i = 0; ((*sp != 0) && (i < 25)); sp++, i++)
  816. *sp = TOLOWER(*sp);
  817. nrbrdnames = sizeof(stl_brdstr) / sizeof(stlbrdtype_t);
  818. for (i = 0; (i < nrbrdnames); i++) {
  819. if (strcmp(stl_brdstr[i].name, argp[0]) == 0)
  820. break;
  821. }
  822. if (i >= nrbrdnames) {
  823. printk("STALLION: unknown board name, %s?n", argp[0]);
  824. return(0);
  825. }
  826. confp->brdtype = stl_brdstr[i].type;
  827. i = 1;
  828. if ((argp[i] != (char *) NULL) && (*argp[i] != 0))
  829. confp->ioaddr1 = stl_atol(argp[i]);
  830. i++;
  831. if (confp->brdtype == BRD_ECH) {
  832. if ((argp[i] != (char *) NULL) && (*argp[i] != 0))
  833. confp->ioaddr2 = stl_atol(argp[i]);
  834. i++;
  835. }
  836. if ((argp[i] != (char *) NULL) && (*argp[i] != 0))
  837. confp->irq = stl_atol(argp[i]);
  838. return(1);
  839. }
  840. #endif
  841. /*****************************************************************************/
  842. /*
  843.  * Local driver kernel memory allocation routine.
  844.  */
  845. static void *stl_memalloc(int len)
  846. {
  847. return((void *) kmalloc(len, GFP_KERNEL));
  848. }
  849. /*****************************************************************************/
  850. /*
  851.  * Allocate a new board structure. Fill out the basic info in it.
  852.  */
  853. static stlbrd_t *stl_allocbrd()
  854. {
  855. stlbrd_t *brdp;
  856. brdp = (stlbrd_t *) stl_memalloc(sizeof(stlbrd_t));
  857. if (brdp == (stlbrd_t *) NULL) {
  858. printk("STALLION: failed to allocate memory (size=%d)n",
  859. sizeof(stlbrd_t));
  860. return((stlbrd_t *) NULL);
  861. }
  862. memset(brdp, 0, sizeof(stlbrd_t));
  863. brdp->magic = STL_BOARDMAGIC;
  864. return(brdp);
  865. }
  866. /*****************************************************************************/
  867. static int stl_open(struct tty_struct *tty, struct file *filp)
  868. {
  869. stlport_t *portp;
  870. stlbrd_t *brdp;
  871. unsigned int minordev;
  872. int brdnr, panelnr, portnr, rc;
  873. #if DEBUG
  874. printk("stl_open(tty=%x,filp=%x): device=%xn", (int) tty,
  875. (int) filp, tty->device);
  876. #endif
  877. minordev = MINOR(tty->device);
  878. brdnr = MINOR2BRD(minordev);
  879. if (brdnr >= stl_nrbrds)
  880. return(-ENODEV);
  881. brdp = stl_brds[brdnr];
  882. if (brdp == (stlbrd_t *) NULL)
  883. return(-ENODEV);
  884. minordev = MINOR2PORT(minordev);
  885. for (portnr = -1, panelnr = 0; (panelnr < STL_MAXPANELS); panelnr++) {
  886. if (brdp->panels[panelnr] == (stlpanel_t *) NULL)
  887. break;
  888. if (minordev < brdp->panels[panelnr]->nrports) {
  889. portnr = minordev;
  890. break;
  891. }
  892. minordev -= brdp->panels[panelnr]->nrports;
  893. }
  894. if (portnr < 0)
  895. return(-ENODEV);
  896. portp = brdp->panels[panelnr]->ports[portnr];
  897. if (portp == (stlport_t *) NULL)
  898. return(-ENODEV);
  899. MOD_INC_USE_COUNT;
  900. /*
  901.  * On the first open of the device setup the port hardware, and
  902.  * initialize the per port data structure.
  903.  */
  904. portp->tty = tty;
  905. tty->driver_data = portp;
  906. portp->refcount++;
  907. if ((portp->flags & ASYNC_INITIALIZED) == 0) {
  908. if (portp->tx.buf == (char *) NULL) {
  909. portp->tx.buf = (char *) stl_memalloc(STL_TXBUFSIZE);
  910. if (portp->tx.buf == (char *) NULL)
  911. return(-ENOMEM);
  912. portp->tx.head = portp->tx.buf;
  913. portp->tx.tail = portp->tx.buf;
  914. }
  915. stl_setport(portp, tty->termios);
  916. portp->sigs = stl_getsignals(portp);
  917. stl_setsignals(portp, 1, 1);
  918. stl_enablerxtx(portp, 1, 1);
  919. stl_startrxtx(portp, 1, 0);
  920. clear_bit(TTY_IO_ERROR, &tty->flags);
  921. portp->flags |= ASYNC_INITIALIZED;
  922. }
  923. /*
  924.  * Check if this port is in the middle of closing. If so then wait
  925.  * until it is closed then return error status, based on flag settings.
  926.  * The sleep here does not need interrupt protection since the wakeup
  927.  * for it is done with the same context.
  928.  */
  929. if (portp->flags & ASYNC_CLOSING) {
  930. interruptible_sleep_on(&portp->close_wait);
  931. if (portp->flags & ASYNC_HUP_NOTIFY)
  932. return(-EAGAIN);
  933. return(-ERESTARTSYS);
  934. }
  935. /*
  936.  * Based on type of open being done check if it can overlap with any
  937.  * previous opens still in effect. If we are a normal serial device
  938.  * then also we might have to wait for carrier.
  939.  */
  940. if (tty->driver.subtype == STL_DRVTYPCALLOUT) {
  941. if (portp->flags & ASYNC_NORMAL_ACTIVE)
  942. return(-EBUSY);
  943. if (portp->flags & ASYNC_CALLOUT_ACTIVE) {
  944. if ((portp->flags & ASYNC_SESSION_LOCKOUT) &&
  945.     (portp->session != current->session))
  946. return(-EBUSY);
  947. if ((portp->flags & ASYNC_PGRP_LOCKOUT) &&
  948.     (portp->pgrp != current->pgrp))
  949. return(-EBUSY);
  950. }
  951. portp->flags |= ASYNC_CALLOUT_ACTIVE;
  952. } else {
  953. if (filp->f_flags & O_NONBLOCK) {
  954. if (portp->flags & ASYNC_CALLOUT_ACTIVE)
  955. return(-EBUSY);
  956. } else {
  957. if ((rc = stl_waitcarrier(portp, filp)) != 0)
  958. return(rc);
  959. }
  960. portp->flags |= ASYNC_NORMAL_ACTIVE;
  961. }
  962. if ((portp->refcount == 1) && (portp->flags & ASYNC_SPLIT_TERMIOS)) {
  963. if (tty->driver.subtype == STL_DRVTYPSERIAL)
  964. *tty->termios = portp->normaltermios;
  965. else
  966. *tty->termios = portp->callouttermios;
  967. stl_setport(portp, tty->termios);
  968. }
  969. portp->session = current->session;
  970. portp->pgrp = current->pgrp;
  971. return(0);
  972. }
  973. /*****************************************************************************/
  974. /*
  975.  * Possibly need to wait for carrier (DCD signal) to come high. Say
  976.  * maybe because if we are clocal then we don't need to wait...
  977.  */
  978. static int stl_waitcarrier(stlport_t *portp, struct file *filp)
  979. {
  980. unsigned long flags;
  981. int rc, doclocal;
  982. #if DEBUG
  983. printk("stl_waitcarrier(portp=%x,filp=%x)n", (int) portp, (int) filp);
  984. #endif
  985. rc = 0;
  986. doclocal = 0;
  987. if (portp->flags & ASYNC_CALLOUT_ACTIVE) {
  988. if (portp->normaltermios.c_cflag & CLOCAL)
  989. doclocal++;
  990. } else {
  991. if (portp->tty->termios->c_cflag & CLOCAL)
  992. doclocal++;
  993. }
  994. save_flags(flags);
  995. cli();
  996. portp->openwaitcnt++;
  997. if (! tty_hung_up_p(filp))
  998. portp->refcount--;
  999. for (;;) {
  1000. if ((portp->flags & ASYNC_CALLOUT_ACTIVE) == 0)
  1001. stl_setsignals(portp, 1, 1);
  1002. if (tty_hung_up_p(filp) ||
  1003.     ((portp->flags & ASYNC_INITIALIZED) == 0)) {
  1004. if (portp->flags & ASYNC_HUP_NOTIFY)
  1005. rc = -EBUSY;
  1006. else
  1007. rc = -ERESTARTSYS;
  1008. break;
  1009. }
  1010. if (((portp->flags & ASYNC_CALLOUT_ACTIVE) == 0) &&
  1011.     ((portp->flags & ASYNC_CLOSING) == 0) &&
  1012.     (doclocal || (portp->sigs & TIOCM_CD))) {
  1013. break;
  1014. }
  1015. if (signal_pending(current)) {
  1016. rc = -ERESTARTSYS;
  1017. break;
  1018. }
  1019. interruptible_sleep_on(&portp->open_wait);
  1020. }
  1021. if (! tty_hung_up_p(filp))
  1022. portp->refcount++;
  1023. portp->openwaitcnt--;
  1024. restore_flags(flags);
  1025. return(rc);
  1026. }
  1027. /*****************************************************************************/
  1028. static void stl_close(struct tty_struct *tty, struct file *filp)
  1029. {
  1030. stlport_t *portp;
  1031. unsigned long flags;
  1032. #if DEBUG
  1033. printk("stl_close(tty=%x,filp=%x)n", (int) tty, (int) filp);
  1034. #endif
  1035. portp = tty->driver_data;
  1036. if (portp == (stlport_t *) NULL)
  1037. return;
  1038. save_flags(flags);
  1039. cli();
  1040. if (tty_hung_up_p(filp)) {
  1041. MOD_DEC_USE_COUNT;
  1042. restore_flags(flags);
  1043. return;
  1044. }
  1045. if ((tty->count == 1) && (portp->refcount != 1))
  1046. portp->refcount = 1;
  1047. if (portp->refcount-- > 1) {
  1048. MOD_DEC_USE_COUNT;
  1049. restore_flags(flags);
  1050. return;
  1051. }
  1052. portp->refcount = 0;
  1053. portp->flags |= ASYNC_CLOSING;
  1054. if (portp->flags & ASYNC_NORMAL_ACTIVE)
  1055. portp->normaltermios = *tty->termios;
  1056. if (portp->flags & ASYNC_CALLOUT_ACTIVE)
  1057. portp->callouttermios = *tty->termios;
  1058. /*
  1059.  * May want to wait for any data to drain before closing. The BUSY
  1060.  * flag keeps track of whether we are still sending or not - it is
  1061.  * very accurate for the cd1400, not quite so for the sc26198.
  1062.  * (The sc26198 has no "end-of-data" interrupt only empty FIFO)
  1063.  */
  1064. tty->closing = 1;
  1065. if (portp->closing_wait != ASYNC_CLOSING_WAIT_NONE)
  1066. tty_wait_until_sent(tty, portp->closing_wait);
  1067. stl_waituntilsent(tty, (HZ / 2));
  1068. portp->flags &= ~ASYNC_INITIALIZED;
  1069. stl_disableintrs(portp);
  1070. if (tty->termios->c_cflag & HUPCL)
  1071. stl_setsignals(portp, 0, 0);
  1072. stl_enablerxtx(portp, 0, 0);
  1073. stl_flushbuffer(tty);
  1074. portp->istate = 0;
  1075. if (portp->tx.buf != (char *) NULL) {
  1076. kfree(portp->tx.buf);
  1077. portp->tx.buf = (char *) NULL;
  1078. portp->tx.head = (char *) NULL;
  1079. portp->tx.tail = (char *) NULL;
  1080. }
  1081. set_bit(TTY_IO_ERROR, &tty->flags);
  1082. if (tty->ldisc.flush_buffer)
  1083. (tty->ldisc.flush_buffer)(tty);
  1084. tty->closing = 0;
  1085. portp->tty = (struct tty_struct *) NULL;
  1086. if (portp->openwaitcnt) {
  1087. if (portp->close_delay)
  1088. stl_delay(portp->close_delay);
  1089. wake_up_interruptible(&portp->open_wait);
  1090. }
  1091. portp->flags &= ~(ASYNC_CALLOUT_ACTIVE | ASYNC_NORMAL_ACTIVE |
  1092. ASYNC_CLOSING);
  1093. wake_up_interruptible(&portp->close_wait);
  1094. MOD_DEC_USE_COUNT;
  1095. restore_flags(flags);
  1096. }
  1097. /*****************************************************************************/
  1098. /*
  1099.  * Wait for a specified delay period, this is not a busy-loop. It will
  1100.  * give up the processor while waiting. Unfortunately this has some
  1101.  * rather intimate knowledge of the process management stuff.
  1102.  */
  1103. static void stl_delay(int len)
  1104. {
  1105. #if DEBUG
  1106. printk("stl_delay(len=%d)n", len);
  1107. #endif
  1108. if (len > 0) {
  1109. current->state = TASK_INTERRUPTIBLE;
  1110. schedule_timeout(len);
  1111. current->state = TASK_RUNNING;
  1112. }
  1113. }
  1114. /*****************************************************************************/
  1115. /*
  1116.  * Write routine. Take data and stuff it in to the TX ring queue.
  1117.  * If transmit interrupts are not running then start them.
  1118.  */
  1119. static int stl_write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count)
  1120. {
  1121. stlport_t *portp;
  1122. unsigned int len, stlen;
  1123. unsigned char *chbuf;
  1124. char *head, *tail;
  1125. #if DEBUG
  1126. printk("stl_write(tty=%x,from_user=%d,buf=%x,count=%d)n",
  1127. (int) tty, from_user, (int) buf, count);
  1128. #endif
  1129. if ((tty == (struct tty_struct *) NULL) ||
  1130.     (stl_tmpwritebuf == (char *) NULL))
  1131. return(0);
  1132. portp = tty->driver_data;
  1133. if (portp == (stlport_t *) NULL)
  1134. return(0);
  1135. if (portp->tx.buf == (char *) NULL)
  1136. return(0);
  1137. /*
  1138.  * If copying direct from user space we must cater for page faults,
  1139.  * causing us to "sleep" here for a while. To handle this copy in all
  1140.  * the data we need now, into a local buffer. Then when we got it all
  1141.  * copy it into the TX buffer.
  1142.  */
  1143. chbuf = (unsigned char *) buf;
  1144. if (from_user) {
  1145. head = portp->tx.head;
  1146. tail = portp->tx.tail;
  1147. len = (head >= tail) ? (STL_TXBUFSIZE - (head - tail) - 1) :
  1148. (tail - head - 1);
  1149. count = MIN(len, count);
  1150. down(&stl_tmpwritesem);
  1151. copy_from_user(stl_tmpwritebuf, chbuf, count);
  1152. chbuf = &stl_tmpwritebuf[0];
  1153. }
  1154. head = portp->tx.head;
  1155. tail = portp->tx.tail;
  1156. if (head >= tail) {
  1157. len = STL_TXBUFSIZE - (head - tail) - 1;
  1158. stlen = STL_TXBUFSIZE - (head - portp->tx.buf);
  1159. } else {
  1160. len = tail - head - 1;
  1161. stlen = len;
  1162. }
  1163. len = MIN(len, count);
  1164. count = 0;
  1165. while (len > 0) {
  1166. stlen = MIN(len, stlen);
  1167. memcpy(head, chbuf, stlen);
  1168. len -= stlen;
  1169. chbuf += stlen;
  1170. count += stlen;
  1171. head += stlen;
  1172. if (head >= (portp->tx.buf + STL_TXBUFSIZE)) {
  1173. head = portp->tx.buf;
  1174. stlen = tail - head;
  1175. }
  1176. }
  1177. portp->tx.head = head;
  1178. clear_bit(ASYI_TXLOW, &portp->istate);
  1179. stl_startrxtx(portp, -1, 1);
  1180. if (from_user)
  1181. up(&stl_tmpwritesem);
  1182. return(count);
  1183. }
  1184. /*****************************************************************************/
  1185. static void stl_putchar(struct tty_struct *tty, unsigned char ch)
  1186. {
  1187. stlport_t *portp;
  1188. unsigned int len;
  1189. char *head, *tail;
  1190. #if DEBUG
  1191. printk("stl_putchar(tty=%x,ch=%x)n", (int) tty, (int) ch);
  1192. #endif
  1193. if (tty == (struct tty_struct *) NULL)
  1194. return;
  1195. portp = tty->driver_data;
  1196. if (portp == (stlport_t *) NULL)
  1197. return;
  1198. if (portp->tx.buf == (char *) NULL)
  1199. return;
  1200. head = portp->tx.head;
  1201. tail = portp->tx.tail;
  1202. len = (head >= tail) ? (STL_TXBUFSIZE - (head - tail)) : (tail - head);
  1203. len--;
  1204. if (len > 0) {
  1205. *head++ = ch;
  1206. if (head >= (portp->tx.buf + STL_TXBUFSIZE))
  1207. head = portp->tx.buf;
  1208. }
  1209. portp->tx.head = head;
  1210. }
  1211. /*****************************************************************************/
  1212. /*
  1213.  * If there are any characters in the buffer then make sure that TX
  1214.  * interrupts are on and get'em out. Normally used after the putchar
  1215.  * routine has been called.
  1216.  */
  1217. static void stl_flushchars(struct tty_struct *tty)
  1218. {
  1219. stlport_t *portp;
  1220. #if DEBUG
  1221. printk("stl_flushchars(tty=%x)n", (int) tty);
  1222. #endif
  1223. if (tty == (struct tty_struct *) NULL)
  1224. return;
  1225. portp = tty->driver_data;
  1226. if (portp == (stlport_t *) NULL)
  1227. return;
  1228. if (portp->tx.buf == (char *) NULL)
  1229. return;
  1230. #if 0
  1231. if (tty->stopped || tty->hw_stopped ||
  1232.     (portp->tx.head == portp->tx.tail))
  1233. return;
  1234. #endif
  1235. stl_startrxtx(portp, -1, 1);
  1236. }
  1237. /*****************************************************************************/
  1238. static int stl_writeroom(struct tty_struct *tty)
  1239. {
  1240. stlport_t *portp;
  1241. char *head, *tail;
  1242. #if DEBUG
  1243. printk("stl_writeroom(tty=%x)n", (int) tty);
  1244. #endif
  1245. if (tty == (struct tty_struct *) NULL)
  1246. return(0);
  1247. portp = tty->driver_data;
  1248. if (portp == (stlport_t *) NULL)
  1249. return(0);
  1250. if (portp->tx.buf == (char *) NULL)
  1251. return(0);
  1252. head = portp->tx.head;
  1253. tail = portp->tx.tail;
  1254. return((head >= tail) ? (STL_TXBUFSIZE - (head - tail) - 1) : (tail - head - 1));
  1255. }
  1256. /*****************************************************************************/
  1257. /*
  1258.  * Return number of chars in the TX buffer. Normally we would just
  1259.  * calculate the number of chars in the buffer and return that, but if
  1260.  * the buffer is empty and TX interrupts are still on then we return
  1261.  * that the buffer still has 1 char in it. This way whoever called us
  1262.  * will not think that ALL chars have drained - since the UART still
  1263.  * must have some chars in it (we are busy after all).
  1264.  */
  1265. static int stl_charsinbuffer(struct tty_struct *tty)
  1266. {
  1267. stlport_t *portp;
  1268. unsigned int size;
  1269. char *head, *tail;
  1270. #if DEBUG
  1271. printk("stl_charsinbuffer(tty=%x)n", (int) tty);
  1272. #endif
  1273. if (tty == (struct tty_struct *) NULL)
  1274. return(0);
  1275. portp = tty->driver_data;
  1276. if (portp == (stlport_t *) NULL)
  1277. return(0);
  1278. if (portp->tx.buf == (char *) NULL)
  1279. return(0);
  1280. head = portp->tx.head;
  1281. tail = portp->tx.tail;
  1282. size = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
  1283. if ((size == 0) && test_bit(ASYI_TXBUSY, &portp->istate))
  1284. size = 1;
  1285. return(size);
  1286. }
  1287. /*****************************************************************************/
  1288. /*
  1289.  * Generate the serial struct info.
  1290.  */
  1291. static void stl_getserial(stlport_t *portp, struct serial_struct *sp)
  1292. {
  1293. struct serial_struct sio;
  1294. stlbrd_t *brdp;
  1295. #if DEBUG
  1296. printk("stl_getserial(portp=%x,sp=%x)n", (int) portp, (int) sp);
  1297. #endif
  1298. memset(&sio, 0, sizeof(struct serial_struct));
  1299. sio.line = portp->portnr;
  1300. sio.port = portp->ioaddr;
  1301. sio.flags = portp->flags;
  1302. sio.baud_base = portp->baud_base;
  1303. sio.close_delay = portp->close_delay;
  1304. sio.closing_wait = portp->closing_wait;
  1305. sio.custom_divisor = portp->custom_divisor;
  1306. sio.hub6 = 0;
  1307. if (portp->uartp == &stl_cd1400uart) {
  1308. sio.type = PORT_CIRRUS;
  1309. sio.xmit_fifo_size = CD1400_TXFIFOSIZE;
  1310. } else {
  1311. sio.type = PORT_UNKNOWN;
  1312. sio.xmit_fifo_size = SC26198_TXFIFOSIZE;
  1313. }
  1314. brdp = stl_brds[portp->brdnr];
  1315. if (brdp != (stlbrd_t *) NULL)
  1316. sio.irq = brdp->irq;
  1317. copy_to_user(sp, &sio, sizeof(struct serial_struct));
  1318. }
  1319. /*****************************************************************************/
  1320. /*
  1321.  * Set port according to the serial struct info.
  1322.  * At this point we do not do any auto-configure stuff, so we will
  1323.  * just quietly ignore any requests to change irq, etc.
  1324.  */
  1325. static int stl_setserial(stlport_t *portp, struct serial_struct *sp)
  1326. {
  1327. struct serial_struct sio;
  1328. #if DEBUG
  1329. printk("stl_setserial(portp=%x,sp=%x)n", (int) portp, (int) sp);
  1330. #endif
  1331. copy_from_user(&sio, sp, sizeof(struct serial_struct));
  1332. if (!capable(CAP_SYS_ADMIN)) {
  1333. if ((sio.baud_base != portp->baud_base) ||
  1334.     (sio.close_delay != portp->close_delay) ||
  1335.     ((sio.flags & ~ASYNC_USR_MASK) !=
  1336.     (portp->flags & ~ASYNC_USR_MASK)))
  1337. return(-EPERM);
  1338. portp->flags = (portp->flags & ~ASYNC_USR_MASK) |
  1339. (sio.flags & ASYNC_USR_MASK);
  1340. portp->baud_base = sio.baud_base;
  1341. portp->close_delay = sio.close_delay;
  1342. portp->closing_wait = sio.closing_wait;
  1343. portp->custom_divisor = sio.custom_divisor;
  1344. stl_setport(portp, portp->tty->termios);
  1345. return(0);
  1346. }
  1347. /*****************************************************************************/
  1348. static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
  1349. {
  1350. stlport_t *portp;
  1351. unsigned int ival;
  1352. int rc;
  1353. #if DEBUG
  1354. printk("stl_ioctl(tty=%x,file=%x,cmd=%x,arg=%x)n",
  1355. (int) tty, (int) file, cmd, (int) arg);
  1356. #endif
  1357. if (tty == (struct tty_struct *) NULL)
  1358. return(-ENODEV);
  1359. portp = tty->driver_data;
  1360. if (portp == (stlport_t *) NULL)
  1361. return(-ENODEV);
  1362. if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
  1363.       (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS)) {
  1364. if (tty->flags & (1 << TTY_IO_ERROR))
  1365. return(-EIO);
  1366. }
  1367. rc = 0;
  1368. switch (cmd) {
  1369. case TIOCGSOFTCAR:
  1370. rc = put_user(((tty->termios->c_cflag & CLOCAL) ? 1 : 0),
  1371. (unsigned int *) arg);
  1372. break;
  1373. case TIOCSSOFTCAR:
  1374. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1375.     sizeof(int))) == 0) {
  1376. get_user(ival, (unsigned int *) arg);
  1377. tty->termios->c_cflag =
  1378. (tty->termios->c_cflag & ~CLOCAL) |
  1379. (ival ? CLOCAL : 0);
  1380. }
  1381. break;
  1382. case TIOCMGET:
  1383. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  1384.     sizeof(unsigned int))) == 0) {
  1385. ival = stl_getsignals(portp);
  1386. put_user(ival, (unsigned int *) arg);
  1387. }
  1388. break;
  1389. case TIOCMBIS:
  1390. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1391.     sizeof(unsigned int))) == 0) {
  1392. get_user(ival, (unsigned int *) arg);
  1393. stl_setsignals(portp, ((ival & TIOCM_DTR) ? 1 : -1),
  1394. ((ival & TIOCM_RTS) ? 1 : -1));
  1395. }
  1396. break;
  1397. case TIOCMBIC:
  1398. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1399.     sizeof(unsigned int))) == 0) {
  1400. get_user(ival, (unsigned int *) arg);
  1401. stl_setsignals(portp, ((ival & TIOCM_DTR) ? 0 : -1),
  1402. ((ival & TIOCM_RTS) ? 0 : -1));
  1403. }
  1404. break;
  1405. case TIOCMSET:
  1406. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1407.     sizeof(unsigned int))) == 0) {
  1408. get_user(ival, (unsigned int *) arg);
  1409. stl_setsignals(portp, ((ival & TIOCM_DTR) ? 1 : 0),
  1410. ((ival & TIOCM_RTS) ? 1 : 0));
  1411. }
  1412. break;
  1413. case TIOCGSERIAL:
  1414. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  1415.     sizeof(struct serial_struct))) == 0)
  1416. stl_getserial(portp, (struct serial_struct *) arg);
  1417. break;
  1418. case TIOCSSERIAL:
  1419. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1420.     sizeof(struct serial_struct))) == 0)
  1421. rc = stl_setserial(portp, (struct serial_struct *) arg);
  1422. break;
  1423. case COM_GETPORTSTATS:
  1424. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  1425.     sizeof(comstats_t))) == 0)
  1426. rc = stl_getportstats(portp, (comstats_t *) arg);
  1427. break;
  1428. case COM_CLRPORTSTATS:
  1429. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  1430.     sizeof(comstats_t))) == 0)
  1431. rc = stl_clrportstats(portp, (comstats_t *) arg);
  1432. break;
  1433. case TIOCSERCONFIG:
  1434. case TIOCSERGWILD:
  1435. case TIOCSERSWILD:
  1436. case TIOCSERGETLSR:
  1437. case TIOCSERGSTRUCT:
  1438. case TIOCSERGETMULTI:
  1439. case TIOCSERSETMULTI:
  1440. default:
  1441. rc = -ENOIOCTLCMD;
  1442. break;
  1443. }
  1444. return(rc);
  1445. }
  1446. /*****************************************************************************/
  1447. static void stl_settermios(struct tty_struct *tty, struct termios *old)
  1448. {
  1449. stlport_t *portp;
  1450. struct termios *tiosp;
  1451. #if DEBUG
  1452. printk("stl_settermios(tty=%x,old=%x)n", (int) tty, (int) old);
  1453. #endif
  1454. if (tty == (struct tty_struct *) NULL)
  1455. return;
  1456. portp = tty->driver_data;
  1457. if (portp == (stlport_t *) NULL)
  1458. return;
  1459. tiosp = tty->termios;
  1460. if ((tiosp->c_cflag == old->c_cflag) &&
  1461.     (tiosp->c_iflag == old->c_iflag))
  1462. return;
  1463. stl_setport(portp, tiosp);
  1464. stl_setsignals(portp, ((tiosp->c_cflag & (CBAUD & ~CBAUDEX)) ? 1 : 0),
  1465. -1);
  1466. if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0)) {
  1467. tty->hw_stopped = 0;
  1468. stl_start(tty);
  1469. }
  1470. if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL))
  1471. wake_up_interruptible(&portp->open_wait);
  1472. }
  1473. /*****************************************************************************/
  1474. /*
  1475.  * Attempt to flow control who ever is sending us data. Based on termios
  1476.  * settings use software or/and hardware flow control.
  1477.  */
  1478. static void stl_throttle(struct tty_struct *tty)
  1479. {
  1480. stlport_t *portp;
  1481. #if DEBUG
  1482. printk("stl_throttle(tty=%x)n", (int) tty);
  1483. #endif
  1484. if (tty == (struct tty_struct *) NULL)
  1485. return;
  1486. portp = tty->driver_data;
  1487. if (portp == (stlport_t *) NULL)
  1488. return;
  1489. stl_flowctrl(portp, 0);
  1490. }
  1491. /*****************************************************************************/
  1492. /*
  1493.  * Unflow control the device sending us data...
  1494.  */
  1495. static void stl_unthrottle(struct tty_struct *tty)
  1496. {
  1497. stlport_t *portp;
  1498. #if DEBUG
  1499. printk("stl_unthrottle(tty=%x)n", (int) tty);
  1500. #endif
  1501. if (tty == (struct tty_struct *) NULL)
  1502. return;
  1503. portp = tty->driver_data;
  1504. if (portp == (stlport_t *) NULL)
  1505. return;
  1506. stl_flowctrl(portp, 1);
  1507. }
  1508. /*****************************************************************************/
  1509. /*
  1510.  * Stop the transmitter. Basically to do this we will just turn TX
  1511.  * interrupts off.
  1512.  */
  1513. static void stl_stop(struct tty_struct *tty)
  1514. {
  1515. stlport_t *portp;
  1516. #if DEBUG
  1517. printk("stl_stop(tty=%x)n", (int) tty);
  1518. #endif
  1519. if (tty == (struct tty_struct *) NULL)
  1520. return;
  1521. portp = tty->driver_data;
  1522. if (portp == (stlport_t *) NULL)
  1523. return;
  1524. stl_startrxtx(portp, -1, 0);
  1525. }
  1526. /*****************************************************************************/
  1527. /*
  1528.  * Start the transmitter again. Just turn TX interrupts back on.
  1529.  */
  1530. static void stl_start(struct tty_struct *tty)
  1531. {
  1532. stlport_t *portp;
  1533. #if DEBUG
  1534. printk("stl_start(tty=%x)n", (int) tty);
  1535. #endif
  1536. if (tty == (struct tty_struct *) NULL)
  1537. return;
  1538. portp = tty->driver_data;
  1539. if (portp == (stlport_t *) NULL)
  1540. return;
  1541. stl_startrxtx(portp, -1, 1);
  1542. }
  1543. /*****************************************************************************/
  1544. /*
  1545.  * Hangup this port. This is pretty much like closing the port, only
  1546.  * a little more brutal. No waiting for data to drain. Shutdown the
  1547.  * port and maybe drop signals.
  1548.  */
  1549. static void stl_hangup(struct tty_struct *tty)
  1550. {
  1551. stlport_t *portp;
  1552. #if DEBUG
  1553. printk("stl_hangup(tty=%x)n", (int) tty);
  1554. #endif
  1555. if (tty == (struct tty_struct *) NULL)
  1556. return;
  1557. portp = tty->driver_data;
  1558. if (portp == (stlport_t *) NULL)
  1559. return;
  1560. portp->flags &= ~ASYNC_INITIALIZED;
  1561. stl_disableintrs(portp);
  1562. if (tty->termios->c_cflag & HUPCL)
  1563. stl_setsignals(portp, 0, 0);
  1564. stl_enablerxtx(portp, 0, 0);
  1565. stl_flushbuffer(tty);
  1566. portp->istate = 0;
  1567. set_bit(TTY_IO_ERROR, &tty->flags);
  1568. if (portp->tx.buf != (char *) NULL) {
  1569. kfree(portp->tx.buf);
  1570. portp->tx.buf = (char *) NULL;
  1571. portp->tx.head = (char *) NULL;
  1572. portp->tx.tail = (char *) NULL;
  1573. }
  1574. portp->tty = (struct tty_struct *) NULL;
  1575. portp->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CALLOUT_ACTIVE);
  1576. portp->refcount = 0;
  1577. wake_up_interruptible(&portp->open_wait);
  1578. }
  1579. /*****************************************************************************/
  1580. static void stl_flushbuffer(struct tty_struct *tty)
  1581. {
  1582. stlport_t *portp;
  1583. #if DEBUG
  1584. printk("stl_flushbuffer(tty=%x)n", (int) tty);
  1585. #endif
  1586. if (tty == (struct tty_struct *) NULL)
  1587. return;
  1588. portp = tty->driver_data;
  1589. if (portp == (stlport_t *) NULL)
  1590. return;
  1591. stl_flush(portp);
  1592. wake_up_interruptible(&tty->write_wait);
  1593. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  1594.     tty->ldisc.write_wakeup)
  1595. (tty->ldisc.write_wakeup)(tty);
  1596. }
  1597. /*****************************************************************************/
  1598. static void stl_breakctl(struct tty_struct *tty, int state)
  1599. {
  1600. stlport_t *portp;
  1601. #if DEBUG
  1602. printk("stl_breakctl(tty=%x,state=%d)n", (int) tty, state);
  1603. #endif
  1604. if (tty == (struct tty_struct *) NULL)
  1605. return;
  1606. portp = tty->driver_data;
  1607. if (portp == (stlport_t *) NULL)
  1608. return;
  1609. stl_sendbreak(portp, ((state == -1) ? 1 : 2));
  1610. }
  1611. /*****************************************************************************/
  1612. static void stl_waituntilsent(struct tty_struct *tty, int timeout)
  1613. {
  1614. stlport_t *portp;
  1615. unsigned long tend;
  1616. #if DEBUG
  1617. printk("stl_waituntilsent(tty=%x,timeout=%d)n", (int) tty, timeout);
  1618. #endif
  1619. if (tty == (struct tty_struct *) NULL)
  1620. return;
  1621. portp = tty->driver_data;
  1622. if (portp == (stlport_t *) NULL)
  1623. return;
  1624. if (timeout == 0)
  1625. timeout = HZ;
  1626. tend = jiffies + timeout;
  1627. while (stl_datastate(portp)) {
  1628. if (signal_pending(current))
  1629. break;
  1630. stl_delay(2);
  1631. if (time_after_eq(jiffies, tend))
  1632. break;
  1633. }
  1634. }
  1635. /*****************************************************************************/
  1636. static void stl_sendxchar(struct tty_struct *tty, char ch)
  1637. {
  1638. stlport_t *portp;
  1639. #if DEBUG
  1640. printk("stl_sendxchar(tty=%x,ch=%x)n", (int) tty, ch);
  1641. #endif
  1642. if (tty == (struct tty_struct *) NULL)
  1643. return;
  1644. portp = tty->driver_data;
  1645. if (portp == (stlport_t *) NULL)
  1646. return;
  1647. if (ch == STOP_CHAR(tty))
  1648. stl_sendflow(portp, 0);
  1649. else if (ch == START_CHAR(tty))
  1650. stl_sendflow(portp, 1);
  1651. else
  1652. stl_putchar(tty, ch);
  1653. }
  1654. /*****************************************************************************/
  1655. #define MAXLINE 80
  1656. /*
  1657.  * Format info for a specified port. The line is deliberately limited
  1658.  * to 80 characters. (If it is too long it will be truncated, if too
  1659.  * short then padded with spaces).
  1660.  */
  1661. static int stl_portinfo(stlport_t *portp, int portnr, char *pos)
  1662. {
  1663. char *sp;
  1664. int sigs, cnt;
  1665. sp = pos;
  1666. sp += sprintf(sp, "%d: uart:%s tx:%d rx:%d",
  1667. portnr, (portp->hwid == 1) ? "SC26198" : "CD1400",
  1668. (int) portp->stats.txtotal, (int) portp->stats.rxtotal);
  1669. if (portp->stats.rxframing)
  1670. sp += sprintf(sp, " fe:%d", (int) portp->stats.rxframing);
  1671. if (portp->stats.rxparity)
  1672. sp += sprintf(sp, " pe:%d", (int) portp->stats.rxparity);
  1673. if (portp->stats.rxbreaks)
  1674. sp += sprintf(sp, " brk:%d", (int) portp->stats.rxbreaks);
  1675. if (portp->stats.rxoverrun)
  1676. sp += sprintf(sp, " oe:%d", (int) portp->stats.rxoverrun);
  1677. sigs = stl_getsignals(portp);
  1678. cnt = sprintf(sp, "%s%s%s%s%s ",
  1679. (sigs & TIOCM_RTS) ? "|RTS" : "",
  1680. (sigs & TIOCM_CTS) ? "|CTS" : "",
  1681. (sigs & TIOCM_DTR) ? "|DTR" : "",
  1682. (sigs & TIOCM_CD) ? "|DCD" : "",
  1683. (sigs & TIOCM_DSR) ? "|DSR" : "");
  1684. *sp = ' ';
  1685. sp += cnt;
  1686. for (cnt = (sp - pos); (cnt < (MAXLINE - 1)); cnt++)
  1687. *sp++ = ' ';
  1688. if (cnt >= MAXLINE)
  1689. pos[(MAXLINE - 2)] = '+';
  1690. pos[(MAXLINE - 1)] = 'n';
  1691. return(MAXLINE);
  1692. }
  1693. /*****************************************************************************/
  1694. /*
  1695.  * Port info, read from the /proc file system.
  1696.  */
  1697. static int stl_readproc(char *page, char **start, off_t off, int count, int *eof, void *data)
  1698. {
  1699. stlbrd_t *brdp;
  1700. stlpanel_t *panelp;
  1701. stlport_t *portp;
  1702. int brdnr, panelnr, portnr, totalport;
  1703. int curoff, maxoff;
  1704. char *pos;
  1705. #if DEBUG
  1706. printk("stl_readproc(page=%x,start=%x,off=%x,count=%d,eof=%x,"
  1707. "data=%xn", (int) page, (int) start, (int) off, count,
  1708. (int) eof, (int) data);
  1709. #endif
  1710. pos = page;
  1711. totalport = 0;
  1712. curoff = 0;
  1713. if (off == 0) {
  1714. pos += sprintf(pos, "%s: version %s", stl_drvtitle,
  1715. stl_drvversion);
  1716. while (pos < (page + MAXLINE - 1))
  1717. *pos++ = ' ';
  1718. *pos++ = 'n';
  1719. }
  1720. curoff =  MAXLINE;
  1721. /*
  1722.  * We scan through for each board, panel and port. The offset is
  1723.  * calculated on the fly, and irrelevant ports are skipped.
  1724.  */
  1725. for (brdnr = 0; (brdnr < stl_nrbrds); brdnr++) {
  1726. brdp = stl_brds[brdnr];
  1727. if (brdp == (stlbrd_t *) NULL)
  1728. continue;
  1729. if (brdp->state == 0)
  1730. continue;
  1731. maxoff = curoff + (brdp->nrports * MAXLINE);
  1732. if (off >= maxoff) {
  1733. curoff = maxoff;
  1734. continue;
  1735. }
  1736. totalport = brdnr * STL_MAXPORTS;
  1737. for (panelnr = 0; (panelnr < brdp->nrpanels); panelnr++) {
  1738. panelp = brdp->panels[panelnr];
  1739. if (panelp == (stlpanel_t *) NULL)
  1740. continue;
  1741. maxoff = curoff + (panelp->nrports * MAXLINE);
  1742. if (off >= maxoff) {
  1743. curoff = maxoff;
  1744. totalport += panelp->nrports;
  1745. continue;
  1746. }
  1747. for (portnr = 0; (portnr < panelp->nrports); portnr++,
  1748.     totalport++) {
  1749. portp = panelp->ports[portnr];
  1750. if (portp == (stlport_t *) NULL)
  1751. continue;
  1752. if (off >= (curoff += MAXLINE))
  1753. continue;
  1754. if ((pos - page + MAXLINE) > count)
  1755. goto stl_readdone;
  1756. pos += stl_portinfo(portp, totalport, pos);
  1757. }
  1758. }
  1759. }
  1760. *eof = 1;
  1761. stl_readdone:
  1762. *start = page;
  1763. return(pos - page);
  1764. }
  1765. /*****************************************************************************/
  1766. /*
  1767.  * All board interrupts are vectored through here first. This code then
  1768.  * calls off to the approrpriate board interrupt handlers.
  1769.  */
  1770. static void stl_intr(int irq, void *dev_id, struct pt_regs *regs)
  1771. {
  1772. stlbrd_t *brdp;
  1773. int i;
  1774. #if DEBUG
  1775. printk("stl_intr(irq=%d,regs=%x)n", irq, (int) regs);
  1776. #endif
  1777. for (i = 0; (i < stl_nrbrds); i++) {
  1778. if ((brdp = stl_brds[i]) == (stlbrd_t *) NULL)
  1779. continue;
  1780. if (brdp->state == 0)
  1781. continue;
  1782. (* brdp->isr)(brdp);
  1783. }
  1784. }
  1785. /*****************************************************************************/
  1786. /*
  1787.  * Interrupt service routine for EasyIO board types.
  1788.  */
  1789. static void stl_eiointr(stlbrd_t *brdp)
  1790. {
  1791. stlpanel_t *panelp;
  1792. unsigned int iobase;
  1793. panelp = brdp->panels[0];
  1794. iobase = panelp->iobase;
  1795. while (inb(brdp->iostatus) & EIO_INTRPEND)
  1796. (* panelp->isr)(panelp, iobase);
  1797. }
  1798. /*****************************************************************************/
  1799. /*
  1800.  * Interrupt service routine for ECH-AT board types.
  1801.  */
  1802. static void stl_echatintr(stlbrd_t *brdp)
  1803. {
  1804. stlpanel_t *panelp;
  1805. unsigned int ioaddr;
  1806. int bnknr;
  1807. outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
  1808. while (inb(brdp->iostatus) & ECH_INTRPEND) {
  1809. for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
  1810. ioaddr = brdp->bnkstataddr[bnknr];
  1811. if (inb(ioaddr) & ECH_PNLINTRPEND) {
  1812. panelp = brdp->bnk2panel[bnknr];
  1813. (* panelp->isr)(panelp, (ioaddr & 0xfffc));
  1814. }
  1815. }
  1816. }
  1817. outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
  1818. }
  1819. /*****************************************************************************/
  1820. /*
  1821.  * Interrupt service routine for ECH-MCA board types.
  1822.  */
  1823. static void stl_echmcaintr(stlbrd_t *brdp)
  1824. {
  1825. stlpanel_t *panelp;
  1826. unsigned int ioaddr;
  1827. int bnknr;
  1828. while (inb(brdp->iostatus) & ECH_INTRPEND) {
  1829. for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
  1830. ioaddr = brdp->bnkstataddr[bnknr];
  1831. if (inb(ioaddr) & ECH_PNLINTRPEND) {
  1832. panelp = brdp->bnk2panel[bnknr];
  1833. (* panelp->isr)(panelp, (ioaddr & 0xfffc));
  1834. }
  1835. }
  1836. }
  1837. }
  1838. /*****************************************************************************/
  1839. /*
  1840.  * Interrupt service routine for ECH-PCI board types.
  1841.  */
  1842. static void stl_echpciintr(stlbrd_t *brdp)
  1843. {
  1844. stlpanel_t *panelp;
  1845. unsigned int ioaddr;
  1846. int bnknr, recheck;
  1847. while (1) {
  1848. recheck = 0;
  1849. for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
  1850. outb(brdp->bnkpageaddr[bnknr], brdp->ioctrl);
  1851. ioaddr = brdp->bnkstataddr[bnknr];
  1852. if (inb(ioaddr) & ECH_PNLINTRPEND) {
  1853. panelp = brdp->bnk2panel[bnknr];
  1854. (* panelp->isr)(panelp, (ioaddr & 0xfffc));
  1855. recheck++;
  1856. }
  1857. }
  1858. if (! recheck)
  1859. break;
  1860. }
  1861. }
  1862. /*****************************************************************************/
  1863. /*
  1864.  * Interrupt service routine for ECH-8/64-PCI board types.
  1865.  */
  1866. static void stl_echpci64intr(stlbrd_t *brdp)
  1867. {
  1868. stlpanel_t *panelp;
  1869. unsigned int ioaddr;
  1870. int bnknr;
  1871. while (inb(brdp->ioctrl) & 0x1) {
  1872. for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
  1873. ioaddr = brdp->bnkstataddr[bnknr];
  1874. if (inb(ioaddr) & ECH_PNLINTRPEND) {
  1875. panelp = brdp->bnk2panel[bnknr];
  1876. (* panelp->isr)(panelp, (ioaddr & 0xfffc));
  1877. }
  1878. }
  1879. }
  1880. }
  1881. /*****************************************************************************/
  1882. /*
  1883.  * Service an off-level request for some channel.
  1884.  */
  1885. static void stl_offintr(void *private)
  1886. {
  1887. stlport_t *portp;
  1888. struct tty_struct *tty;
  1889. unsigned int oldsigs;
  1890. portp = private;
  1891. #if DEBUG
  1892. printk("stl_offintr(portp=%x)n", (int) portp);
  1893. #endif
  1894. if (portp == (stlport_t *) NULL)
  1895. goto out;
  1896. tty = portp->tty;
  1897. if (tty == (struct tty_struct *) NULL)
  1898. goto out;
  1899. lock_kernel();
  1900. if (test_bit(ASYI_TXLOW, &portp->istate)) {
  1901. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  1902.     tty->ldisc.write_wakeup)
  1903. (tty->ldisc.write_wakeup)(tty);
  1904. wake_up_interruptible(&tty->write_wait);
  1905. }
  1906. if (test_bit(ASYI_DCDCHANGE, &portp->istate)) {
  1907. clear_bit(ASYI_DCDCHANGE, &portp->istate);
  1908. oldsigs = portp->sigs;
  1909. portp->sigs = stl_getsignals(portp);
  1910. if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
  1911. wake_up_interruptible(&portp->open_wait);
  1912. if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0)) {
  1913. if (portp->flags & ASYNC_CHECK_CD) {
  1914. if (! ((portp->flags & ASYNC_CALLOUT_ACTIVE) &&
  1915.     (portp->flags & ASYNC_CALLOUT_NOHUP))) {
  1916. tty_hangup(tty); /* FIXME: module removal race here - AKPM */
  1917. }
  1918. }
  1919. }
  1920. }
  1921. unlock_kernel();
  1922. out:
  1923. MOD_DEC_USE_COUNT;
  1924. }
  1925. /*****************************************************************************/
  1926. /*
  1927.  * Map in interrupt vector to this driver. Check that we don't
  1928.  * already have this vector mapped, we might be sharing this
  1929.  * interrupt across multiple boards.
  1930.  */
  1931. static int __init stl_mapirq(int irq, char *name)
  1932. {
  1933. int rc, i;
  1934. #if DEBUG
  1935. printk("stl_mapirq(irq=%d,name=%s)n", irq, name);
  1936. #endif
  1937. rc = 0;
  1938. for (i = 0; (i < stl_numintrs); i++) {
  1939. if (stl_gotintrs[i] == irq)
  1940. break;
  1941. }
  1942. if (i >= stl_numintrs) {
  1943. if (request_irq(irq, stl_intr, SA_SHIRQ, name, NULL) != 0) {
  1944. printk("STALLION: failed to register interrupt "
  1945. "routine for %s irq=%dn", name, irq);
  1946. rc = -ENODEV;
  1947. } else {
  1948. stl_gotintrs[stl_numintrs++] = irq;
  1949. }
  1950. }
  1951. return(rc);
  1952. }
  1953. /*****************************************************************************/
  1954. /*
  1955.  * Initialize all the ports on a panel.
  1956.  */
  1957. static int __init stl_initports(stlbrd_t *brdp, stlpanel_t *panelp)
  1958. {
  1959. stlport_t *portp;
  1960. int chipmask, i;
  1961. #if DEBUG
  1962. printk("stl_initports(brdp=%x,panelp=%x)n", (int) brdp, (int) panelp);
  1963. #endif
  1964. chipmask = stl_panelinit(brdp, panelp);
  1965. /*
  1966.  * All UART's are initialized (if found!). Now go through and setup
  1967.  * each ports data structures.
  1968.  */
  1969. for (i = 0; (i < panelp->nrports); i++) {
  1970. portp = (stlport_t *) stl_memalloc(sizeof(stlport_t));
  1971. if (portp == (stlport_t *) NULL) {
  1972. printk("STALLION: failed to allocate memory "
  1973. "(size=%d)n", sizeof(stlport_t));
  1974. break;
  1975. }
  1976. memset(portp, 0, sizeof(stlport_t));
  1977. portp->magic = STL_PORTMAGIC;
  1978. portp->portnr = i;
  1979. portp->brdnr = panelp->brdnr;
  1980. portp->panelnr = panelp->panelnr;
  1981. portp->uartp = panelp->uartp;
  1982. portp->clk = brdp->clk;
  1983. portp->baud_base = STL_BAUDBASE;
  1984. portp->close_delay = STL_CLOSEDELAY;
  1985. portp->closing_wait = 30 * HZ;
  1986. portp->normaltermios = stl_deftermios;
  1987. portp->callouttermios = stl_deftermios;
  1988. portp->tqueue.routine = stl_offintr;
  1989. portp->tqueue.data = portp;
  1990. init_waitqueue_head(&portp->open_wait);
  1991. init_waitqueue_head(&portp->close_wait);
  1992. portp->stats.brd = portp->brdnr;
  1993. portp->stats.panel = portp->panelnr;
  1994. portp->stats.port = portp->portnr;
  1995. panelp->ports[i] = portp;
  1996. stl_portinit(brdp, panelp, portp);
  1997. }
  1998. return(0);
  1999. }
  2000. /*****************************************************************************/
  2001. /*
  2002.  * Try to find and initialize an EasyIO board.
  2003.  */
  2004. static inline int stl_initeio(stlbrd_t *brdp)
  2005. {
  2006. stlpanel_t *panelp;
  2007. unsigned int status;
  2008. char *name;
  2009. int rc;
  2010. #if DEBUG
  2011. printk("stl_initeio(brdp=%x)n", (int) brdp);
  2012. #endif
  2013. brdp->ioctrl = brdp->ioaddr1 + 1;
  2014. brdp->iostatus = brdp->ioaddr1 + 2;
  2015. status = inb(brdp->iostatus);
  2016. if ((status & EIO_IDBITMASK) == EIO_MK3)
  2017. brdp->ioctrl++;
  2018. /*
  2019.  * Handle board specific stuff now. The real difference is PCI
  2020.  * or not PCI.
  2021.  */
  2022. if (brdp->brdtype == BRD_EASYIOPCI) {
  2023. brdp->iosize1 = 0x80;
  2024. brdp->iosize2 = 0x80;
  2025. name = "serial(EIO-PCI)";
  2026. outb(0x41, (brdp->ioaddr2 + 0x4c));
  2027. } else {
  2028. brdp->iosize1 = 8;
  2029. name = "serial(EIO)";
  2030. if ((brdp->irq < 0) || (brdp->irq > 15) ||
  2031.     (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
  2032. printk("STALLION: invalid irq=%d for brd=%dn",
  2033. brdp->irq, brdp->brdnr);
  2034. return(-EINVAL);
  2035. }
  2036. outb((stl_vecmap[brdp->irq] | EIO_0WS |
  2037. ((brdp->irqtype) ? EIO_INTLEVEL : EIO_INTEDGE)),
  2038. brdp->ioctrl);
  2039. }
  2040. if (check_region(brdp->ioaddr1, brdp->iosize1)) {
  2041. printk("STALLION: Warning, board %d I/O address %x conflicts "
  2042. "with another devicen", brdp->brdnr, brdp->ioaddr1);
  2043. }
  2044. if (brdp->iosize2 > 0) {
  2045. if (check_region(brdp->ioaddr2, brdp->iosize2)) {
  2046. printk("STALLION: Warning, board %d I/O address %x "
  2047. "conflicts with another devicen",
  2048. brdp->brdnr, brdp->ioaddr2);
  2049. }
  2050. }
  2051.  
  2052. /*
  2053.  * Everything looks OK, so let's go ahead and probe for the hardware.
  2054.  */
  2055. brdp->clk = CD1400_CLK;
  2056. brdp->isr = stl_eiointr;
  2057. switch (status & EIO_IDBITMASK) {
  2058. case EIO_8PORTM:
  2059. brdp->clk = CD1400_CLK8M;
  2060. /* fall thru */
  2061. case EIO_8PORTRS:
  2062. case EIO_8PORTDI:
  2063. brdp->nrports = 8;
  2064. break;
  2065. case EIO_4PORTRS:
  2066. brdp->nrports = 4;
  2067. break;
  2068. case EIO_MK3:
  2069. switch (status & EIO_BRDMASK) {
  2070. case ID_BRD4:
  2071. brdp->nrports = 4;
  2072. break;
  2073. case ID_BRD8:
  2074. brdp->nrports = 8;
  2075. break;
  2076. case ID_BRD16:
  2077. brdp->nrports = 16;
  2078. break;
  2079. default:
  2080. return(-ENODEV);
  2081. }
  2082. break;
  2083. default:
  2084. return(-ENODEV);
  2085. }
  2086. /*
  2087.  * We have verfied that the board is actually present, so now we
  2088.  * can complete the setup.
  2089.  */
  2090. request_region(brdp->ioaddr1, brdp->iosize1, name);
  2091. if (brdp->iosize2 > 0)
  2092. request_region(brdp->ioaddr2, brdp->iosize2, name);
  2093. panelp = (stlpanel_t *) stl_memalloc(sizeof(stlpanel_t));
  2094. if (panelp == (stlpanel_t *) NULL) {
  2095. printk("STALLION: failed to allocate memory (size=%d)n",
  2096. sizeof(stlpanel_t));
  2097. return(-ENOMEM);
  2098. }
  2099. memset(panelp, 0, sizeof(stlpanel_t));
  2100. panelp->magic = STL_PANELMAGIC;
  2101. panelp->brdnr = brdp->brdnr;
  2102. panelp->panelnr = 0;
  2103. panelp->nrports = brdp->nrports;
  2104. panelp->iobase = brdp->ioaddr1;
  2105. panelp->hwid = status;
  2106. if ((status & EIO_IDBITMASK) == EIO_MK3) {
  2107. panelp->uartp = (void *) &stl_sc26198uart;
  2108. panelp->isr = stl_sc26198intr;
  2109. } else {
  2110. panelp->uartp = (void *) &stl_cd1400uart;
  2111. panelp->isr = stl_cd1400eiointr;
  2112. }
  2113. brdp->panels[0] = panelp;
  2114. brdp->nrpanels = 1;
  2115. brdp->state |= BRD_FOUND;
  2116. brdp->hwid = status;
  2117. rc = stl_mapirq(brdp->irq, name);
  2118. return(rc);
  2119. }
  2120. /*****************************************************************************/
  2121. /*
  2122.  * Try to find an ECH board and initialize it. This code is capable of
  2123.  * dealing with all types of ECH board.
  2124.  */
  2125. static int inline stl_initech(stlbrd_t *brdp)
  2126. {
  2127. stlpanel_t *panelp;
  2128. unsigned int status, nxtid, ioaddr, conflict;
  2129. int panelnr, banknr, i;
  2130. char *name;
  2131. #if DEBUG
  2132. printk("stl_initech(brdp=%x)n", (int) brdp);
  2133. #endif
  2134. status = 0;
  2135. conflict = 0;
  2136. /*
  2137.  * Set up the initial board register contents for boards. This varies a
  2138.  * bit between the different board types. So we need to handle each
  2139.  * separately. Also do a check that the supplied IRQ is good.
  2140.  */
  2141. switch (brdp->brdtype) {
  2142. case BRD_ECH:
  2143. brdp->isr = stl_echatintr;
  2144. brdp->ioctrl = brdp->ioaddr1 + 1;
  2145. brdp->iostatus = brdp->ioaddr1 + 1;
  2146. status = inb(brdp->iostatus);
  2147. if ((status & ECH_IDBITMASK) != ECH_ID)
  2148. return(-ENODEV);
  2149. if ((brdp->irq < 0) || (brdp->irq > 15) ||
  2150.     (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
  2151. printk("STALLION: invalid irq=%d for brd=%dn",
  2152. brdp->irq, brdp->brdnr);
  2153. return(-EINVAL);
  2154. }
  2155. status = ((brdp->ioaddr2 & ECH_ADDR2MASK) >> 1);
  2156. status |= (stl_vecmap[brdp->irq] << 1);
  2157. outb((status | ECH_BRDRESET), brdp->ioaddr1);
  2158. brdp->ioctrlval = ECH_INTENABLE |
  2159. ((brdp->irqtype) ? ECH_INTLEVEL : ECH_INTEDGE);
  2160. for (i = 0; (i < 10); i++)
  2161. outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
  2162. brdp->iosize1 = 2;
  2163. brdp->iosize2 = 32;
  2164. name = "serial(EC8/32)";
  2165. outb(status, brdp->ioaddr1);
  2166. break;
  2167. case BRD_ECHMC:
  2168. brdp->isr = stl_echmcaintr;
  2169. brdp->ioctrl = brdp->ioaddr1 + 0x20;
  2170. brdp->iostatus = brdp->ioctrl;
  2171. status = inb(brdp->iostatus);
  2172. if ((status & ECH_IDBITMASK) != ECH_ID)
  2173. return(-ENODEV);
  2174. if ((brdp->irq < 0) || (brdp->irq > 15) ||
  2175.     (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
  2176. printk("STALLION: invalid irq=%d for brd=%dn",
  2177. brdp->irq, brdp->brdnr);
  2178. return(-EINVAL);
  2179. }
  2180. outb(ECHMC_BRDRESET, brdp->ioctrl);
  2181. outb(ECHMC_INTENABLE, brdp->ioctrl);
  2182. brdp->iosize1 = 64;
  2183. name = "serial(EC8/32-MC)";
  2184. break;
  2185. case BRD_ECHPCI:
  2186. brdp->isr = stl_echpciintr;
  2187. brdp->ioctrl = brdp->ioaddr1 + 2;
  2188. brdp->iosize1 = 4;
  2189. brdp->iosize2 = 8;
  2190. name = "serial(EC8/32-PCI)";
  2191. break;
  2192. case BRD_ECH64PCI:
  2193. brdp->isr = stl_echpci64intr;
  2194. brdp->ioctrl = brdp->ioaddr2 + 0x40;
  2195. outb(0x43, (brdp->ioaddr1 + 0x4c));
  2196. brdp->iosize1 = 0x80;
  2197. brdp->iosize2 = 0x80;
  2198. name = "serial(EC8/64-PCI)";
  2199. break;
  2200. default:
  2201. printk("STALLION: unknown board type=%dn", brdp->brdtype);
  2202. return(-EINVAL);
  2203. break;
  2204. }
  2205. /*
  2206.  * Check boards for possible IO address conflicts. We won't actually
  2207.  * do anything about it here, just issue a warning...
  2208.  */
  2209. conflict = check_region(brdp->ioaddr1, brdp->iosize1) ?
  2210. brdp->ioaddr1 : 0;
  2211. if ((conflict == 0) && (brdp->iosize2 > 0))
  2212. conflict = check_region(brdp->ioaddr2, brdp->iosize2) ?
  2213. brdp->ioaddr2 : 0;
  2214. if (conflict) {
  2215. printk("STALLION: Warning, board %d I/O address %x conflicts "
  2216. "with another devicen", brdp->brdnr, conflict);
  2217. }
  2218. request_region(brdp->ioaddr1, brdp->iosize1, name);
  2219. if (brdp->iosize2 > 0)
  2220. request_region(brdp->ioaddr2, brdp->iosize2, name);
  2221. /*
  2222.  * Scan through the secondary io address space looking for panels.
  2223.  * As we find'em allocate and initialize panel structures for each.
  2224.  */
  2225. brdp->clk = CD1400_CLK;
  2226. brdp->hwid = status;
  2227. ioaddr = brdp->ioaddr2;
  2228. banknr = 0;
  2229. panelnr = 0;
  2230. nxtid = 0;
  2231. for (i = 0; (i < STL_MAXPANELS); i++) {
  2232. if (brdp->brdtype == BRD_ECHPCI) {
  2233. outb(nxtid, brdp->ioctrl);
  2234. ioaddr = brdp->ioaddr2;
  2235. }
  2236. status = inb(ioaddr + ECH_PNLSTATUS);
  2237. if ((status & ECH_PNLIDMASK) != nxtid)
  2238. break;
  2239. panelp = (stlpanel_t *) stl_memalloc(sizeof(stlpanel_t));
  2240. if (panelp == (stlpanel_t *) NULL) {
  2241. printk("STALLION: failed to allocate memory "
  2242. "(size=%d)n", sizeof(stlpanel_t));
  2243. break;
  2244. }
  2245. memset(panelp, 0, sizeof(stlpanel_t));
  2246. panelp->magic = STL_PANELMAGIC;
  2247. panelp->brdnr = brdp->brdnr;
  2248. panelp->panelnr = panelnr;
  2249. panelp->iobase = ioaddr;
  2250. panelp->pagenr = nxtid;
  2251. panelp->hwid = status;
  2252. brdp->bnk2panel[banknr] = panelp;
  2253. brdp->bnkpageaddr[banknr] = nxtid;
  2254. brdp->bnkstataddr[banknr++] = ioaddr + ECH_PNLSTATUS;
  2255. if (status & ECH_PNLXPID) {
  2256. panelp->uartp = (void *) &stl_sc26198uart;
  2257. panelp->isr = stl_sc26198intr;
  2258. if (status & ECH_PNL16PORT) {
  2259. panelp->nrports = 16;
  2260. brdp->bnk2panel[banknr] = panelp;
  2261. brdp->bnkpageaddr[banknr] = nxtid;
  2262. brdp->bnkstataddr[banknr++] = ioaddr + 4 +
  2263. ECH_PNLSTATUS;
  2264. } else {
  2265. panelp->nrports = 8;
  2266. }
  2267. } else {
  2268. panelp->uartp = (void *) &stl_cd1400uart;
  2269. panelp->isr = stl_cd1400echintr;
  2270. if (status & ECH_PNL16PORT) {
  2271. panelp->nrports = 16;
  2272. panelp->ackmask = 0x80;
  2273. if (brdp->brdtype != BRD_ECHPCI)
  2274. ioaddr += EREG_BANKSIZE;
  2275. brdp->bnk2panel[banknr] = panelp;
  2276. brdp->bnkpageaddr[banknr] = ++nxtid;
  2277. brdp->bnkstataddr[banknr++] = ioaddr +
  2278. ECH_PNLSTATUS;
  2279. } else {
  2280. panelp->nrports = 8;
  2281. panelp->ackmask = 0xc0;
  2282. }
  2283. }
  2284. nxtid++;