8253xini.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:88k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* -*- linux-c -*- */
  2. /* 
  3.  * Copyright (C) 2001 By Joachim Martillo, Telford Tools, Inc.
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version
  8.  * 2 of the License, or (at your option) any later version.
  9.  *
  10.  **/
  11. #include <linux/module.h>
  12. #include <linux/kernel.h>
  13. #include <linux/pci.h>
  14. #include <linux/stddef.h>
  15. #include <linux/string.h>
  16. #include <linux/sockios.h>
  17. #include <asm/io.h>
  18. #include <asm/byteorder.h>
  19. #include <asm/pgtable.h>
  20. #include <linux/skbuff.h>
  21. #include <linux/if_arp.h>
  22. #include <linux/fs.h>
  23. #include <linux/sched.h>
  24. #include <asm/uaccess.h>
  25. #include <linux/version.h>
  26. #include <linux/etherdevice.h>
  27. #include <linux/init.h>
  28. #include "Reg9050.h"
  29. #include "8253xctl.h"
  30. #include "ring.h"
  31. #include "8253x.h"
  32. #include "crc32dcl.h"
  33. #include "8253xmcs.h"
  34. #include "sp502.h"
  35. /* card names */
  36. char *aura_functionality[] =
  37. {
  38. "NR",
  39. "AO",
  40. "NA",
  41. "UN"
  42. };
  43. char *board_type[] =
  44. {
  45. "unknown",
  46. "1020P",
  47. "1520P",
  48. "2020P",
  49. "2520P",
  50. "4020P",
  51. "4520P",
  52. "8020P",
  53. "8520P",
  54. "SUNSE",
  55. "WANMS",
  56. "1020C",
  57. "1520C",
  58. "2020C",
  59. "2520C",
  60. "4020C",
  61. "4520C",
  62. "8020C",
  63. "8520C",
  64. };
  65. unsigned int sab8253x_rebootflag = 0;
  66. AURAXX20PARAMS AuraXX20DriverParams; /* loaded at startup */
  67. /* from variables below */
  68. SAB_BOARD *AuraBoardRoot = NULL; /* The order of this list is not important */
  69. SAB_CHIP  *AuraChipRoot = NULL; /* chips grouped by board chip0 before chip1 */
  70. SAB_PORT  *AuraPortRoot = NULL; /* ports grouped by board and by chip, chip0, chip1, etc */
  71. AURA_CIM  *AuraCimRoot = NULL; /* only used for deallocating the cim structures, etc */
  72. /* CIM stands for Communications Interface Module -- the G.Link logic provided by the Altera parts. */
  73. /* Arrays of lists of boards of each type on a given interrupt */
  74. SAB_BOARD *AuraBoardESCC2IrqRoot[NUMINTS]; 
  75. SAB_BOARD *AuraBoardESCC8IrqRoot[NUMINTS];
  76. SAB_BOARD *AuraBoardMCSIrqRoot[NUMINTS];
  77. unsigned int NumSab8253xPorts = 0;
  78. unsigned BD1020Pcounter = 0; /* keep count of each board */
  79. unsigned BD1520Pcounter = 0; /* may change to just keeping count */
  80. unsigned BD2020Pcounter = 0; /* of the total number of boards */
  81. unsigned BD2520Pcounter = 0;
  82. unsigned BD4020Pcounter = 0;
  83. unsigned BD4520Pcounter = 0;
  84. unsigned BD8020Pcounter = 0;
  85. unsigned BD8520Pcounter = 0;
  86. unsigned BD1020CPcounter = 0; /* keep count of each board */
  87. unsigned BD1520CPcounter = 0; /* may change to just keeping count */
  88. unsigned BD2020CPcounter = 0; /* of the total number of boards */
  89. unsigned BD2520CPcounter = 0;
  90. unsigned BD4020CPcounter = 0;
  91. unsigned BD4520CPcounter = 0;
  92. unsigned BD8020CPcounter = 0;
  93. unsigned BD8520CPcounter = 0;
  94. unsigned BDMCScounter = 0;
  95. static int auraXX20n_debug = 0; /* turns on lots of */
  96. /* debugging messages*/
  97. static char* auraXX20n_name = 0;/* set net dev name on command line */
  98. static char *sab8253xc_name = "sab8253xc";
  99. static int sab8253xc_major = 0;
  100. int sab8253xn_listsize = 32; /* recommend descriptor list size */
  101. int sab8253xn_rbufsize = RXSIZE; /* recommend rbuf list size */
  102. int sab8253xt_listsize = 256; /* recommend descriptor list size */
  103. int sab8253xt_rbufsize = 32; /* recommend rbuf list size for tty */
  104. int sab8253xs_listsize = 64; /* recommend descriptor list size */
  105. int sab8253xs_rbufsize = RXSIZE; /* recommend rbuf list size */
  106. int sab8253xc_listsize = 64; /* recommend descriptor list size */
  107. int sab8253xc_rbufsize = RXSIZE; /* recommend rbuf list size for tty */
  108. int xx20_minorstart = 128;
  109. int sab8253x_vendor_id = PCI_VENDOR_ID_AURORATECH;
  110. int sab8253x_cpci_device_id = PCI_DEVICE_ID_AURORATECH_CPCI;
  111. int sab8253x_wmcs_device_id = PCI_DEVICE_ID_AURORATECH_WANMS;
  112. int sab8253x_mpac_device_id = PCI_DEVICE_ID_AURORATECH_MULTI;
  113. int sab8253x_default_sp502_mode = SP502_RS232_MODE;
  114. MODULE_PARM(sab8253x_vendor_id, "i");
  115. MODULE_PARM(sab8253x_cpci_device_id, "i");
  116. MODULE_PARM(sab8253x_wmcs_device_id, "i");
  117. MODULE_PARM(sab8253x_mpac_device_id, "i");
  118. MODULE_PARM(sab8253x_default_sp502_mode, "i");
  119. MODULE_PARM(xx20_minorstart, "i");
  120. MODULE_PARM(sab8253xc_major, "i");
  121. MODULE_PARM(auraXX20n_debug, "i");
  122. MODULE_PARM(auraXX20n_name, "s"); /* this and the following for sync */
  123. MODULE_PARM(sab8253xn_listsize, "i"); /* network driver */
  124. MODULE_PARM(sab8253xn_rbufsize, "i"); /* network driver */
  125. MODULE_PARM(sab8253xt_listsize, "i"); /* tty driver */
  126. MODULE_PARM(sab8253xt_rbufsize, "i"); /* tty driver */
  127. MODULE_PARM(sab8253xc_listsize, "i"); /* network driver */
  128. MODULE_PARM(sab8253xc_rbufsize, "i"); /* network driver */
  129. MODULE_PARM(sab8253xs_listsize, "i"); /* tty driver */
  130. MODULE_PARM(sab8253xs_rbufsize, "i"); /* tty driver */
  131. MODULE_PARM(sab8253xc_name, "s"); 
  132. struct pci_dev   *XX20lastpdev = NULL; /* just used for finding all PCI devices */
  133. static SAB_BOARD *find_ati_multiport_card(void); /* actually implemented */
  134. static SAB_BOARD *find_ati_cpci_card(void); /* to be done */
  135. static SAB_BOARD *find_ati_wanms_card(void); /* to be done */
  136. #if (!defined(MODULE)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0))
  137. /* unpleasantness for 2.2 kernels
  138.  * and probe illogic */
  139. /* The LRP project is still working on
  140.    2.2.* kernels but I suspect
  141.    that initially we will see more
  142.    purchases for complete Linux
  143.    machines using 2.4.*, LRP
  144.    machines tend to be underpowered
  145.    and have a paucity of PCI slots
  146. */
  147. unsigned int do_probe = 1;
  148. #endif
  149. /* One could argue that these could be in  */
  150. /* the 8253xnet.c file but they are fairly */
  151. /* intimately involved with initialization.*/
  152. struct net_device *Sab8253xRoot = NULL;
  153. struct net_device auraXX20n_prototype = /* used for the network device */
  154. {
  155. "8253x0",
  156. 0, 0, 0, 0,
  157. 0x000,
  158. -1, /* bad irq */
  159. 0, 0, 0,
  160. NULL,
  161. sab8253xn_init /* network driver initialization */
  162. };
  163. struct file_operations sab8253xc_fops =
  164. {
  165. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0))
  166. NULL,
  167. #endif
  168. NULL, /* llseek */
  169. sab8253xc_read, /* read */
  170. sab8253xc_write, /* write */
  171. NULL, /* readdir */
  172. sab8253xc_poll, /* poll */
  173. sab8253xc_ioctl, /* ioctl */
  174. NULL, /* mmap */
  175. sab8253xc_open, /* open */
  176. NULL, /* flush */
  177. sab8253xc_release, /* release */
  178. NULL, /* fsync */
  179. sab8253xc_fasync, /* fasync */
  180. NULL, /* check_media_change */
  181. NULL, /* revalidate */
  182. NULL /* lock */
  183. };
  184. /* A few function defined in this file */
  185. /* These functions are basically functionality */
  186. /* independent -- they are used with asynchronous ttys */
  187. /* synchronous ttys, the network device and the */
  188. /* raw character device */
  189. /* used for reading and writing ports
  190.    readw and writew require some reprogramming
  191.    of the PLX9050
  192. */
  193. static unsigned char aura_readb(struct sab_port *port, unsigned char *reg);
  194. static unsigned char wmsaura_readb(struct sab_port *port, unsigned char *reg);
  195. static unsigned short aura_readw(struct sab_port *port, unsigned short *reg);
  196. static unsigned short wmsaura_readw(struct sab_port *port, unsigned short *reg);
  197. static void aura_writeb(struct sab_port *port, unsigned char *reg,unsigned char val);
  198. static void wmsaura_writeb(struct sab_port *port, unsigned char *reg,unsigned char val);
  199. static void aura_writew(struct sab_port *port, unsigned short *reg,unsigned short val);
  200. static void wmsaura_writew(struct sab_port *port, unsigned short *reg,unsigned short val);
  201. static void aura_readfifo(struct sab_port *port, unsigned char *buf, unsigned int nbytes);
  202. static void aura_writefifo(struct sab_port *port);
  203. static void wmsaura_readfifo(struct sab_port *port, unsigned char *buf, unsigned int nbytes);
  204. static void wmsaura_writefifo(struct sab_port *port);
  205. /* function definitions */
  206. /* [124]X20 type cards */
  207. static void DisableESCC2Interrupts(SAB_CHIP *chipptr) /* in processing ports may have to disable ints */
  208. {
  209. struct sab82532_async_wr_regs *regs;
  210. regs = chipptr->c_regs;
  211. writeb(0xff,&regs->pim); /* All interrupts off */
  212. /* Note that regs/->c_regs
  213.    is set to base reg
  214.    address, thus taking
  215.    address or regs->pim
  216.    gets the address of
  217.    the PIM register/int mask */
  218. }
  219. static SAB_CHIP* CreateESCC2(SAB_BOARD *bptr, unsigned int offset)
  220. {
  221. SAB_CHIP *cptr;
  222. struct sab82532_async_wr_regs *regs;
  223. printk(KERN_ALERT 
  224.        "auraXX20n: creating ESCC2 structure on board %p at offset %x.n",
  225.        bptr, offset);
  226. cptr = (SAB_CHIP*) kmalloc(sizeof(SAB_CHIP), GFP_KERNEL);
  227. if(cptr == NULL)
  228. {
  229. printk(KERN_ALERT
  230.        "auraXX20n: Failed to create ESCC2 structure on board %p at offset %x.n",
  231.        bptr, offset);
  232. return NULL;
  233. }
  234. memset(cptr, 0, sizeof(SAB_CHIP));
  235. cptr->chip_type = ESCC2;
  236. cptr->c_board = bptr;
  237. cptr->c_cim = NULL;
  238. cptr->c_chipno = (offset ? 1 : 0); /* first or second chip on board */
  239. cptr->c_revision = 
  240. (readb(((char *)bptr->virtbaseaddress2) + offset + SAB85232_REG_VSTR) &
  241.  SAB82532_VSTR_VN_MASK);
  242. cptr->c_nports = 2;
  243. cptr->c_portbase = NULL;
  244. cptr->next = AuraChipRoot; /* chips are added to chiplist in reverse order */
  245. AuraChipRoot = cptr;
  246. cptr->next_by_board = bptr->board_chipbase; /* likewise for the local board chiplist */
  247. bptr->board_chipbase = cptr;
  248. printk(KERN_ALERT "auraXX20n: chip %d on board %p is revision %d.n",
  249.        cptr->c_chipno, bptr, cptr->c_revision);
  250. /* lets set up the generic parallel
  251.  * port register which is used to
  252.  * control signaling and other stuff*/
  253. /*
  254.  * SAB82532 (Aurora) 1 8-bit parallel port
  255.  * To summarize the use of the parallel port:
  256.  *                    RS-232
  257.  *  A       B        I/O     descr
  258.  * P0      P4      output  TxClk ctrl
  259.  * P1      P5      output  DTR
  260.  * P2      P6      input   DSR
  261.  * P3      P7      output  485 control
  262.  *
  263.  */
  264. /*
  265.  * Configuring the parallel port 
  266.  */
  267. regs = (struct sab82532_async_wr_regs *)(((char *)bptr->virtbaseaddress2) + offset);
  268. DEBUGPRINT((KERN_ALERT "Writing 0x44 to 0x%p + 0x%x for chip %dn",
  269.     regs, SAB82532_REG_PCR, cptr->c_chipno));
  270. writeb(0x44,&regs->pcr);  /* 2 input bits */
  271. writeb(0xff,&regs->pim);/* All interrupts off */
  272. writeb(0x33,&regs->pvr); /* Txclk and DTR low  */
  273. cptr->c_regs = (void*) regs;
  274. cptr->int_disable = DisableESCC2Interrupts;
  275. return cptr;
  276. }
  277. static void CreateESCC2Port(SAB_CHIP *cptr, unsigned int portno, unsigned int function)
  278. {
  279. SAB_BOARD *bptr;
  280. SAB_PORT  *pptr;
  281. extern void sab8253x_setup_ttyport(struct sab_port *p_port) ;
  282. ++NumSab8253xPorts;
  283. bptr = cptr->c_board;
  284. pptr = (SAB_PORT*) kmalloc(sizeof(SAB_PORT), GFP_KERNEL);
  285. if(pptr == NULL)
  286. {
  287. printk(KERN_ALERT
  288.        "auraXX20n: Failed to create ESCC2 port structure on chip %p on board %p.n",
  289.        cptr, bptr);
  290. return;
  291. }
  292. memset(pptr, 0, sizeof(SAB_PORT));
  293. DEBUGPRINT
  294. ((KERN_ALERT "Setting up port %d, chipno %d for %s type board number %d.n", 
  295.   portno, cptr->c_chipno, board_type[bptr->b_type],bptr->board_number));
  296. pptr->portno = portno;
  297. pptr->chip=cptr;
  298. pptr->board=bptr;
  299. pptr->open_type=OPEN_NOT;
  300. pptr->is_console=0;
  301. pptr->regs=
  302. (union sab82532_regs *)
  303. (((unsigned int)cptr->c_regs) +
  304.  (portno * SAB82532_REG_SIZE));
  305. pptr->type = cptr->c_revision;
  306. pptr->function = function;
  307. /* Simpify reading */
  308. #define PVR  pptr->regs->async_write.pvr
  309. #define PCR  pptr->regs->async_write.pcr
  310. #define PIM  pptr->regs->async_write.pim
  311. #define ISR0 pptr->regs->async_read.isr0
  312. #define IMR0 pptr->regs->async_write.imr0
  313. #define IMR1 pptr->regs->async_write.imr1
  314. #define PIS  pptr->regs->async_read.pis
  315. #define VSTR pptr->regs->async_read.vstr
  316. #define STAR pptr->regs->async_read.star
  317. #define MODE pptr->regs->async_read.mode
  318. pptr->irq = bptr->b_irq;
  319. if(portno == 0) 
  320. { /* Port A .... */
  321. pptr->dsr.reg=(unsigned char *)&(PVR);
  322. pptr->dsr.mask=0x04;
  323. pptr->dsr.irq=PIS_IDX;
  324. pptr->dsr.irqmask=0x04;
  325. pptr->dtr.reg=(unsigned char *)&(PVR);
  326. pptr->dtr.mask=0x02;
  327. pptr->txclkdir.reg=(unsigned char *)&(PVR);
  328. pptr->txclkdir.mask=0x01;
  329. else 
  330. { /* Port B */
  331. pptr->dsr.reg=(unsigned char *)&(PVR);
  332. pptr->dsr.mask=0x40;
  333. pptr->dsr.irq=PIS_IDX;
  334. pptr->dsr.irqmask=0x40;
  335. pptr->dtr.reg=(unsigned char *)&(PVR);
  336. pptr->dtr.mask=0x20;
  337. pptr->txclkdir.reg=(unsigned char *)&(PVR);
  338. pptr->txclkdir.mask=0x10;
  339. }
  340. pptr->dsr.inverted=1;
  341. pptr->dsr.cnst = 0;
  342. pptr->dtr.inverted=1;
  343. pptr->dtr.cnst = 0;
  344. pptr->txclkdir.inverted=1;
  345. pptr ->dcd.reg =(unsigned char *) &(VSTR);
  346. DEBUGPRINT((KERN_ALERT "cd register set to 0x%pn", pptr ->dcd.reg));
  347. pptr->dcd.mask = SAB82532_VSTR_CD;
  348. pptr->dcd.inverted = 1;
  349. pptr->dcd.irq=ISR0_IDX;
  350. pptr->dcd.irqmask=SAB82532_ISR0_CDSC;
  351. pptr->dcd.cnst = 0;
  352. pptr->cts.reg = (unsigned char *)&(STAR);
  353. pptr->cts.mask = SAB82532_STAR_CTS;
  354. pptr->cts.inverted = 0;
  355. pptr->cts.irq=ISR1_IDX;
  356. pptr->cts.irqmask=SAB82532_ISR1_CSC;
  357. pptr->cts.cnst = 0;
  358. pptr->rts.reg = (unsigned char *)&(MODE);
  359. pptr->rts.mask = SAB82532_MODE_FRTS;
  360. pptr->rts.inverted = 1;
  361. pptr->rts.cnst = SAB82532_MODE_RTS;
  362. /* Set the read and write function */
  363. pptr->readbyte=aura_readb;
  364. pptr->readword=aura_readw;
  365. pptr->writebyte=aura_writeb;
  366. pptr->writeword=aura_writew;
  367. pptr->readfifo=aura_readfifo;
  368. pptr->writefifo=aura_writefifo;
  369. sab8253x_setup_ttyport(pptr); /* asynchronous */
  370. /* ttys are default, basic */
  371. /* initialization, everything */
  372. /* else works as a modification */
  373. /* thereof */
  374. pptr->next = AuraPortRoot;
  375. AuraPortRoot = pptr;
  376. pptr->next_by_chip = cptr->c_portbase;
  377. cptr->c_portbase = pptr;
  378. pptr->next_by_board = bptr->board_portbase;
  379. bptr->board_portbase = pptr;
  380. }
  381. /* 8x20 type functions */
  382. static void DisableESCC8Interrupts(SAB_CHIP *chipptr)
  383. {
  384. unsigned int regbase; /* a lot more to do for ESCC8 */
  385. regbase = (unsigned int) chipptr->c_regs;
  386. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PIM_A); /* All interrupts off */
  387. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PIM_B); /* All interrupts off */
  388. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PIM_C); /* All interrupts off */
  389. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PIM_D); /* All interrupts off */
  390. }
  391. static SAB_CHIP* CreateESCC8(SAB_BOARD *bptr, unsigned int offset)
  392. {
  393. SAB_CHIP *cptr;
  394. unsigned int regbase;
  395. printk(KERN_ALERT 
  396.        "auraXX20n: creating ESCC8 structure on board %p at offset %x.n",
  397.        bptr, offset);
  398. cptr = (SAB_CHIP*) kmalloc(sizeof(SAB_CHIP), GFP_KERNEL);
  399. if(cptr == NULL)
  400. {
  401. printk(KERN_ALERT
  402.        "auraXX20n: Failed to create ESCC8 structure on board %p at offset %x.n",
  403.        bptr, offset);
  404. return NULL;
  405. }
  406. memset(cptr, 0, sizeof(SAB_CHIP));
  407. cptr->chip_type = ESCC8;
  408. cptr->c_board = bptr;
  409. cptr->c_cim = NULL;
  410. cptr->c_chipno = (offset ? 1 : 0); /* no card actually has 2 ESCC8s on it */
  411. cptr->c_revision = 
  412. (readb(((char *)bptr->virtbaseaddress2) + offset + SAB85232_REG_VSTR) & 
  413.  SAB82532_VSTR_VN_MASK);
  414. cptr->c_nports = 8;
  415. cptr->c_portbase = NULL; /* used for the list of ports associated
  416.    with this chip
  417. */
  418. cptr->next = AuraChipRoot;
  419. AuraChipRoot = cptr;
  420. cptr->next_by_board = bptr->board_chipbase;
  421. bptr->board_chipbase = cptr;
  422. printk(KERN_ALERT "auraXX20n: chip %d on board %p is revision %d.n",
  423.        cptr->c_chipno, bptr, cptr->c_revision);
  424. /* lets set up the generic parallel
  425.  * port register which is used to
  426.  * control signaling and other stuff*/
  427. /* SAB82538 4 8-bits parallel ports
  428.  * To summarize the use of the parallel port:
  429.  *                    RS-232
  430.  * Parallel port A -- TxClkdir control (output) ports 0 - 7
  431.  * Parallel port B -- DTR (output) ports 0 - 7
  432.  * Parallel port C -- DSR (input)  ports 0 - 7
  433.  * Parallel port D -- driver power down  (output) drivers 0 - 3
  434.  *
  435.  * Note port D is not used on recent boards
  436.  */
  437. regbase = (unsigned int)(((char *)bptr->virtbaseaddress2) + offset);
  438. DEBUGPRINT((KERN_ALERT "Setting up parallel port A (0x%x), 0x%x, 0x%x, 0x%xn", regbase,
  439.     SAB82538_REG_PCR_A, SAB82538_REG_PIM_A, SAB82538_REG_PVR_A));
  440. /* Configuring Parallel Port A  (Clkdir)*/
  441. writeb(0x0,((unsigned char *)regbase) + SAB82538_REG_PCR_A);  /* All output bits */
  442. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PIM_A); /* All interrupts off */
  443. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PVR_A);  /* All low */
  444. DEBUGPRINT((KERN_ALERT "Setting up parallel port B (0x%x), 0x%x, 0x%x, 0x%xn", regbase,
  445.     SAB82538_REG_PCR_B,SAB82538_REG_PIM_B,SAB82538_REG_PVR_B));
  446. writeb(0x0,((unsigned char *)regbase) + SAB82538_REG_PCR_B);  /* All output bits */
  447. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PIM_B); /* All interrupts off */
  448. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PVR_B);  /* All low */
  449. DEBUGPRINT((KERN_ALERT "Setting up parallel port C (0x%x), 0x%x, 0x%x, 0x%xn", regbase,
  450.     SAB82538_REG_PCR_C, SAB82538_REG_PIM_C, SAB82538_REG_PVR_C));
  451. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PCR_C);  /* All intput bits */
  452. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PIM_C); /* All interrupts off */
  453. /* don't set port value register on input register */
  454. /* Configuring Parallel Port D */
  455. DEBUGPRINT((KERN_ALERT "Setting up parallel port D (0x%x), 0x%x, 0x%x, 0x%xn", regbase,
  456.     SAB82538_REG_PCR_D, SAB82538_REG_PIM_D, SAB82538_REG_PVR_D));
  457. writeb(0x0f,((unsigned char *)regbase) + SAB82538_REG_PCR_D);  /* 4 input  bits */
  458. writeb(0xff,((unsigned char *)regbase) + SAB82538_REG_PIM_D); /* All interrupts off */
  459. /* don't set port value register on input register */
  460. /* The priority rotation thing */
  461. DEBUGPRINT((KERN_ALERT "Setting IVA (0x%x +  0x%x = 0x%xn", regbase,
  462.     SAB82532_REG_IVA, regbase + SAB82532_REG_IVA));
  463. writeb(SAB82538_IVA_ROT, ((unsigned char *)regbase) + SAB82532_REG_IVA); 
  464. cptr->c_regs = (void*) regbase;
  465. cptr->int_disable = DisableESCC8Interrupts;
  466. return cptr;
  467. }
  468. static void DisableESCC8InterruptsFromCIM(SAB_CHIP *chipptr)
  469. {
  470. unsigned int regbase; /* a lot more to do for ESCC8 */
  471. regbase = (unsigned int) chipptr->c_regs;
  472. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PIM_A)); /* All interrupts off */
  473. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PIM_B)); /* All interrupts off */
  474. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PIM_C)); /* All interrupts off */
  475. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PIM_D)); /* All interrupts off */
  476. }
  477. static void CreateESCC8Port(SAB_CHIP *cptr, unsigned int portno, unsigned int function)
  478. {
  479. SAB_BOARD *bptr;
  480. SAB_PORT  *pptr;
  481. extern void sab8253x_setup_ttyport(struct sab_port *p_port) ;
  482. ++NumSab8253xPorts;
  483. bptr = cptr->c_board;
  484. pptr = (SAB_PORT*) kmalloc(sizeof(SAB_PORT), GFP_KERNEL);
  485. if(pptr == NULL)
  486. {
  487. printk(KERN_ALERT
  488.        "auraXX20n: Failed to create ESCC2 port structure on chip %p on board %p.n",
  489.        cptr, bptr);
  490. return;
  491. }
  492. memset(pptr, 0, sizeof(SAB_PORT));
  493. DEBUGPRINT
  494. ((KERN_ALERT "Setting up port %d, chipno %d for %s type board number %d.n", 
  495.   portno, cptr->c_chipno, board_type[bptr->b_type],bptr->board_number));
  496. pptr->portno = portno;
  497. pptr->chip=cptr;
  498. pptr->board=bptr;
  499. pptr->open_type=OPEN_NOT;
  500. pptr->is_console=0;
  501. pptr->regs=
  502. (union sab82532_regs *)
  503. (((unsigned int)cptr->c_regs) +
  504.  (portno * SAB82538_REG_SIZE));
  505. pptr->type = cptr->c_revision;
  506. pptr->function = function;
  507. pptr->irq = bptr->b_irq;
  508. pptr->dsr.reg = ((unsigned char *)cptr->c_regs) + SAB82538_REG_PVR_C; 
  509. pptr->dsr.mask = 0x1 << portno;
  510. pptr->dsr.inverted = 1;
  511. pptr->dsr.irq=PIS_IDX; /* need to check this constant */
  512. pptr->dsr.irqmask=0x1 << portno;
  513. pptr->dsr.cnst = 0;
  514. pptr->txclkdir.reg = ((unsigned char *)cptr->c_regs) + SAB82538_REG_PVR_A;
  515. pptr->txclkdir.mask = 0x1 << portno;
  516. /* NOTE: Early 8 ports  boards had different tx clkdir sense */
  517. pptr->txclkdir.inverted = 1;
  518. pptr->dtr.reg = ((unsigned char *)cptr->c_regs) + SAB82538_REG_PVR_B;
  519. pptr->dtr.mask = 0x1 << portno;
  520. pptr->dtr.inverted = 1;
  521. pptr->dtr.cnst = 0;
  522. pptr ->dcd.reg = (unsigned char *)&(VSTR);
  523. DEBUGPRINT((KERN_ALERT "cd register set to 0x%pn", pptr ->dcd.reg));
  524. pptr->dcd.mask = SAB82532_VSTR_CD;
  525. pptr->dcd.inverted = 1;
  526. pptr->dcd.irq=ISR0_IDX;
  527. pptr->dcd.irqmask=SAB82532_ISR0_CDSC;
  528. pptr->dcd.cnst = 0;
  529. pptr->cts.reg = (unsigned char *)&(STAR);
  530. pptr->cts.mask = SAB82532_STAR_CTS;
  531. pptr->cts.inverted = 0;
  532. pptr->cts.irq=ISR1_IDX;
  533. pptr->cts.irqmask=SAB82532_ISR1_CSC;
  534. pptr->cts.cnst = 0;
  535. pptr->rts.reg = (unsigned char *)&(MODE);
  536. pptr->rts.mask = SAB82532_MODE_FRTS;
  537. pptr->rts.inverted = 1;
  538. pptr->rts.cnst = SAB82532_MODE_RTS;
  539. /* Set the read and write function */
  540. pptr->readbyte=aura_readb;
  541. pptr->readword=aura_readw;
  542. pptr->writebyte=aura_writeb;
  543. pptr->writeword=aura_writew;
  544. pptr->readfifo=aura_readfifo;
  545. pptr->writefifo=aura_writefifo;
  546. sab8253x_setup_ttyport(pptr); /* asynchronous */
  547. /* ttys are default, basic */
  548. /* initialization, everything */
  549. /* else works as a modification */
  550. /* thereof */
  551. pptr->next = AuraPortRoot;
  552. AuraPortRoot = pptr;
  553. pptr->next_by_chip = cptr->c_portbase;
  554. cptr->c_portbase = pptr;
  555. pptr->next_by_board = bptr->board_portbase;
  556. bptr->board_portbase = pptr;
  557. }
  558. /* Multichannel server functions */
  559. static SAB_CHIP* CreateESCC8fromCIM(SAB_BOARD *bptr, AURA_CIM *cim, unsigned int chipno)
  560. {
  561. SAB_CHIP *cptr;
  562. unsigned int regbase;
  563. printk(KERN_ALERT 
  564.        "auraXX20n: creating ESCC8 %d structure on board %p from cim %p.n",
  565.        chipno, bptr, cim);
  566. cptr = (SAB_CHIP*) kmalloc(sizeof(SAB_CHIP), GFP_KERNEL);
  567. if(cptr == NULL)
  568. {
  569. printk(KERN_ALERT
  570.        "auraXX20n: Failed to create ESCC8 structure %d on board %p at from cim %p.n",
  571.        chipno, bptr, cim);
  572. return NULL;
  573. }
  574. memset(cptr, 0, sizeof(SAB_CHIP));
  575. cptr->chip_type = ESCC8;
  576. cptr->c_board = bptr;
  577. cptr->c_cim = cim;
  578. cptr->c_chipno = chipno;
  579. cptr->c_revision = 
  580. (readb((unsigned char *) (bptr->CIMCMD_REG +
  581.   (CIMCMD_RDREGB | (((chipno*8) << 6) | SAB85232_REG_VSTR))))
  582.  & SAB82532_VSTR_VN_MASK);
  583. cptr->c_nports = 8;
  584. cptr->c_portbase = NULL; /* used for the list of ports associated
  585.    with this chip
  586. */
  587. cptr->next = AuraChipRoot;
  588. AuraChipRoot = cptr;
  589. cptr->next_by_board = bptr->board_chipbase;
  590. bptr->board_chipbase = cptr;
  591. cptr->next_by_cim = cim->ci_chipbase;
  592. cim->ci_chipbase = cptr;
  593. printk(KERN_ALERT "auraXX20n: chip %d on board %p is revision %d.n",
  594.        cptr->c_chipno, bptr, cptr->c_revision);
  595. /* lets set up the generic parallel
  596.  * port register which is used to
  597.  * control signaling and other stuff*/
  598. /* SAB82538 4 8-bits parallel ports
  599.  * To summarize the use of the parallel port:
  600.  *                    RS-232
  601.  * Parallel port A -- TxClkdir control (output) ports 0 - 7
  602.  * Parallel port B -- DTR (output) ports 0 - 7
  603.  * Parallel port C -- DSR (input)  ports 0 - 7
  604.  * Parallel port D -- driver power down  (output) drivers 0 - 3
  605.  *
  606.  * Note port D is not used on recent boards
  607.  */
  608. regbase = (unsigned int)
  609. (bptr->CIMCMD_REG + (0 | (((chipno*8) << 6) | 0))); /* need to add in RDB/WRB cmd bits
  610.  * and reg offset (> 32) */
  611. DEBUGPRINT((KERN_ALERT "Setting up parallel port A (0x%x), 0x%x, 0x%x, 0x%xn", regbase,
  612.     SAB82538_REG_PCR_A, SAB82538_REG_PIM_A, SAB82538_REG_PVR_A));
  613. /* Configuring Parallel Port A  (Clkdir)*/
  614. writeb(0x00,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PCR_A));  /* All output bits */
  615. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PIM_A)); /* All interrupts off */
  616. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PVR_A));  /* All low */
  617. DEBUGPRINT((KERN_ALERT "Setting up parallel port B (0x%x), 0x%x, 0x%x, 0x%xn", regbase,
  618.     SAB82538_REG_PCR_B,SAB82538_REG_PIM_B,SAB82538_REG_PVR_B));
  619. writeb(0x00,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PCR_B));  /* All output bits */
  620. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PIM_B)); /* All interrupts off */
  621. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PVR_B));  /* All low */
  622. DEBUGPRINT((KERN_ALERT "Setting up parallel port C (0x%x), 0x%x, 0x%x, 0x%xn", regbase,
  623.     SAB82538_REG_PCR_C, SAB82538_REG_PIM_C, SAB82538_REG_PVR_C));
  624. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PCR_C));  /* All intput bits */
  625. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PIM_C)); /* All interrupts off */
  626. /* don't set port value register on input register */
  627. /* Configuring Parallel Port D */
  628. DEBUGPRINT((KERN_ALERT "Setting up parallel port D (0x%x), 0x%x, 0x%x, 0x%xn", regbase,
  629.     SAB82538_REG_PCR_D, SAB82538_REG_PIM_D, SAB82538_REG_PVR_D));
  630. writeb(0x0f,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PCR_D));  /* 4 input  bits */
  631. writeb(0xff,((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82538_REG_PIM_D)); /* All interrupts off */
  632. /* don't set port value register on input register */
  633. /* The priority rotation thing */
  634. DEBUGPRINT((KERN_ALERT "Setting IVA (0x%x +  0x%x = 0x%xn", regbase,
  635.     SAB82532_REG_IVA, regbase + SAB82532_REG_IVA));
  636. writeb(SAB82538_IVA_ROT, ((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82532_REG_IVA)); 
  637. writeb(0, ((unsigned char *)regbase) + (CIMCMD_WRREGB | SAB82532_REG_IPC)); 
  638. cptr->c_regs = (void*) regbase;
  639. cptr->int_disable = DisableESCC8InterruptsFromCIM;
  640. return cptr;
  641. }
  642. static void CreateESCC8PortWithCIM(SAB_CHIP *cptr, unsigned int portno, 
  643.    AURA_CIM *cim, unsigned flag)
  644. {
  645. SAB_BOARD *bptr;
  646. SAB_PORT  *pptr;
  647. extern void sab8253x_setup_ttyport(struct sab_port *p_port) ;
  648. ++NumSab8253xPorts;
  649. bptr = cptr->c_board;
  650. pptr = (SAB_PORT*) kmalloc(sizeof(SAB_PORT), GFP_KERNEL);
  651. if(pptr == NULL)
  652. {
  653. printk(KERN_ALERT
  654.        "auraXX20n: Failed to create ESCC2 port structure on chip %p on board %p.n",
  655.        cptr, bptr);
  656. return;
  657. }
  658. memset(pptr, 0, sizeof(SAB_PORT));
  659. DEBUGPRINT
  660. ((KERN_ALERT "Setting up port %d, chipno %d for %s type board number %d.n", 
  661.   portno, cptr->c_chipno, board_type[bptr->b_type],bptr->board_number));
  662. pptr->portno = portno;
  663. pptr->chip=cptr;
  664. pptr->board=bptr;
  665. pptr->open_type=OPEN_NOT;
  666. pptr->is_console=0;
  667. pptr->regs=
  668. (union sab82532_regs *)
  669. (((unsigned int)cptr->c_regs) +
  670.  (portno << 6)); /* addressing is different when there is a cim */
  671. pptr->type = cptr->c_revision;
  672. pptr->function = (((cim->ci_flags & CIM_SYNC) || flag) ? FUNCTION_NR : 
  673.   FUNCTION_AO);
  674. pptr->irq = bptr->b_irq;
  675. pptr->dsr.reg = ((unsigned char *)cptr->c_regs) + SAB82538_REG_PVR_C; 
  676. pptr->dsr.mask = 0x1 << portno;
  677. pptr->dsr.inverted = 1;
  678. pptr->dsr.irq=PIS_IDX; /* need to check this constant */
  679. pptr->dsr.irqmask=0x1 << portno;
  680. pptr->dsr.cnst = 0;
  681. pptr->txclkdir.reg = ((unsigned char *)cptr->c_regs) + SAB82538_REG_PVR_A;
  682. pptr->txclkdir.mask = 0x1 << portno;
  683. /* NOTE: Early 8 ports  boards had different tx clkdir sense */
  684. pptr->txclkdir.inverted = 1;
  685. pptr->dtr.reg = ((unsigned char *)cptr->c_regs) + SAB82538_REG_PVR_B;
  686. pptr->dtr.mask = 0x1 << portno;
  687. pptr->dtr.inverted = 1;
  688. pptr->dtr.cnst = 0;
  689. pptr->dcd.reg = ((unsigned char *)pptr->regs) + SAB85232_REG_VSTR;
  690. DEBUGPRINT((KERN_ALERT "cd register set to 0x%pn", pptr->dcd.reg));
  691. pptr->dcd.mask = SAB82532_VSTR_CD;
  692. pptr->dcd.inverted = 1;
  693. pptr->dcd.irq=ISR0_IDX;
  694. pptr->dcd.irqmask=SAB82532_ISR0_CDSC;
  695. pptr->dcd.cnst = 0;
  696. pptr->cts.reg = (unsigned char *)&(STAR);
  697. pptr->cts.mask = SAB82532_STAR_CTS;
  698. pptr->cts.inverted = 0;
  699. pptr->cts.irq=ISR1_IDX;
  700. pptr->cts.irqmask=SAB82532_ISR1_CSC;
  701. pptr->cts.cnst = 0;
  702. pptr->rts.reg = (unsigned char *)&(MODE);
  703. pptr->rts.mask = SAB82532_MODE_FRTS;
  704. pptr->rts.inverted = 1;
  705. pptr->rts.cnst = SAB82532_MODE_RTS;
  706. /* Set the read and write function */
  707. pptr->readbyte=wmsaura_readb;
  708. pptr->readword=wmsaura_readw;
  709. pptr->writebyte=wmsaura_writeb;
  710. pptr->writeword=wmsaura_writew;
  711. pptr->readfifo=wmsaura_readfifo;
  712. pptr->writefifo=wmsaura_writefifo;
  713. sab8253x_setup_ttyport(pptr); /* asynchronous */
  714. /* ttys are default, basic */
  715. /* initialization, everything */
  716. /* else works as a modification */
  717. /* thereof */
  718. pptr->next = AuraPortRoot;
  719. AuraPortRoot = pptr;
  720. pptr->next_by_chip = cptr->c_portbase;
  721. cptr->c_portbase = pptr;
  722. pptr->next_by_board = bptr->board_portbase;
  723. bptr->board_portbase = pptr;
  724. pptr->next_by_cim = cim->ci_portbase;
  725. cim->ci_portbase = pptr;
  726. }
  727. static void CreateCIMs(SAB_BOARD *bptr)
  728. {
  729. unsigned int cimnum;
  730. unsigned char *wrcsr;
  731. unsigned char *rdcsr;
  732. unsigned char tmp;
  733. AURA_CIM *cim;
  734. unsigned short intrmask;
  735. for(intrmask = 0, cimnum = 0; cimnum < MAX_NCIMS; ++cimnum)
  736. {
  737. intrmask >>= 2;
  738. /*
  739.  * The hardware is mapped.  Try writing to CIM CSR.
  740.  */
  741. wrcsr = bptr->CIMCMD_REG +
  742. (CIMCMD_WRCIMCSR | (cimnum << CIMCMD_CIMSHIFT));
  743. rdcsr = bptr->CIMCMD_REG +
  744. (CIMCMD_RDCIMCSR | (cimnum << CIMCMD_CIMSHIFT));
  745. /* Try to write an 0xff */
  746. writeb((unsigned char) 0xff, (unsigned char *) wrcsr);
  747. /* and read it back */
  748. tmp = (unsigned char) readb((unsigned char *) rdcsr);
  749. DEBUGPRINT((KERN_ALERT 
  750.     "aura wan mcs: wrcsr %p rdcsr %p cim %d 0xff readback: 0x%x.n",
  751.     (void*) wrcsr, (void*) rdcsr, cimnum, tmp));
  752. /* make sure it's really all ones. */
  753. if ((tmp & CIMCMD_CIMCSR_TESTMASK) != CIMCMD_CIMCSR_TESTMASK) 
  754. {
  755. printk(KERN_ALERT 
  756.        "aura wan mcs: not found -- wrcsr %p rdcsr %p cim %d 0xff readback: 0x%x.n",
  757.        (void*) wrcsr, (void*) rdcsr, cimnum, tmp);
  758. continue;
  759. }
  760. /* Try to write a zero */
  761. writeb((unsigned char) 0, (unsigned char*) wrcsr);
  762. /* and read it back */
  763. tmp = (unsigned char) readb((unsigned char *) rdcsr);
  764. DEBUGPRINT((KERN_ALERT 
  765.     "aura wan mcs: wrcsr %p rdcsr %p cim %d 0x0 readback: 0x%x.n",
  766.     (void*) wrcsr, (void*) rdcsr, cimnum, tmp));
  767. /* make sure it's really zero. */
  768. if ((tmp & CIMCMD_CIMCSR_TESTMASK) != 0) 
  769. {
  770. printk(KERN_ALERT 
  771.        "aura wan mcs: not found -- wrcsr %p rdcsr %p cim %d 0x0 readback: 0x%x.n",
  772.        (void*) wrcsr, (void*) rdcsr, cimnum, tmp);
  773. continue;
  774. }
  775. cim = (AURA_CIM*) kmalloc(sizeof(AURA_CIM), GFP_KERNEL);
  776. if(cim == NULL)
  777. {
  778. printk(KERN_ALERT 
  779.        "aura wan mcs: unable to allocate memory, board %p, cim %d.n", 
  780.        bptr, cimnum); 
  781. continue;
  782. }
  783. cim->ci_num = cimnum;
  784. cim->ci_board = bptr;
  785. cim->ci_chipbase = NULL;
  786. cim->ci_portbase = NULL;
  787. cim->ci_nports = CIM_NPORTS;
  788. cim->ci_port0lbl = cimnum * CIM_NPORTS;
  789. if (mcs_ciminit(bptr, cim) == FALSE) 
  790. {
  791. kfree(cim);
  792. continue;
  793. }
  794. intrmask |= 0xc0; /* turn on the high two bits
  795.  * a little obscure, borrowed
  796.  * from solaris driver 0th cim
  797.  * gets lowest two bits*/
  798. cim->next = AuraCimRoot;
  799. AuraCimRoot = cim;
  800. cim->next_by_mcs = bptr->b_cimbase;
  801. bptr->b_cimbase = cim;
  802. printk(KERN_ALERT 
  803.        "aura wan mcs: Created cim %d type %d on board %p.n",
  804.        cim->ci_num, cim->ci_type, bptr);
  805. }
  806. bptr->b_intrmask = intrmask;
  807. }
  808. /* put the chips on the boards */
  809. static void SetupAllChips(SAB_BOARD *bptr)
  810. { /* note that port ordering */
  811. /* is important in chip setup */
  812. /* the open routine walks the */
  813. /* port list for sync and async */
  814. /* ttys */
  815. SAB_CHIP *chip;
  816. AURA_CIM *cim;
  817. unsigned int chipno;
  818. switch(bptr->b_type)
  819. {
  820. case BD_1020P:
  821. case BD_1020CP:
  822. /* setup 1 ESCC2 */
  823. chip = CreateESCC2(bptr, 0);
  824. if(chip != NULL)
  825. {
  826. CreateESCC2Port(chip, 1, FUNCTION_NA);
  827. CreateESCC2Port(chip, 0, FUNCTION_AO);
  828. }
  829. break;
  830. case BD_1520P:
  831. case BD_1520CP:
  832. /* setup 1 ESCC2 */
  833. chip = CreateESCC2(bptr, 0);
  834. if(chip != NULL)
  835. {
  836. CreateESCC2Port(chip, 1, FUNCTION_NA);
  837. CreateESCC2Port(chip, 0, FUNCTION_NR);
  838. }      
  839. break;
  840. case BD_2020P:
  841. case BD_2020CP:
  842. /* setup 1 ESCC2 */
  843. chip = CreateESCC2(bptr, 0);
  844. if(chip != NULL)
  845. {
  846. CreateESCC2Port(chip, 1, FUNCTION_AO);
  847. CreateESCC2Port(chip, 0, FUNCTION_AO);
  848. }      
  849. break;
  850. case BD_2520P:
  851. case BD_2520CP:
  852. /* setup 1 ESCC2 */
  853. chip = CreateESCC2(bptr, 0);
  854. if(chip != NULL)
  855. {
  856. CreateESCC2Port(chip, 1, FUNCTION_NR);
  857. CreateESCC2Port(chip, 0, FUNCTION_NR);
  858. }      
  859. break;
  860. case BD_4020P:
  861. case BD_4020CP: /* do chips in reverCse
  862.    order so that they
  863.    are on lists in forward
  864.    order
  865. */
  866. /* setup 2 ESCC2 */
  867. chip = CreateESCC2(bptr, AURORA_4X20_CHIP_OFFSET);
  868. if(chip != NULL)
  869. {
  870. CreateESCC2Port(chip, 1, FUNCTION_AO);
  871. CreateESCC2Port(chip, 0, FUNCTION_AO);
  872. }
  873. chip = CreateESCC2(bptr, 0);
  874. if(chip != NULL)
  875. {
  876. CreateESCC2Port(chip, 1, FUNCTION_AO);
  877. CreateESCC2Port(chip, 0, FUNCTION_AO);
  878. }
  879. break;
  880. case BD_4520P:
  881. case BD_4520CP:
  882. /* setup 2 ESCC2 */
  883. chip = CreateESCC2(bptr, AURORA_4X20_CHIP_OFFSET);
  884. if(chip != NULL)
  885. {
  886. CreateESCC2Port(chip, 1, FUNCTION_NR);
  887. CreateESCC2Port(chip, 0, FUNCTION_NR);
  888. }
  889. chip = CreateESCC2(bptr, 0);
  890. if(chip != NULL)
  891. {
  892. CreateESCC2Port(chip, 1, FUNCTION_NR);
  893. CreateESCC2Port(chip, 0, FUNCTION_NR);
  894. }
  895. break;
  896. case BD_8020P:
  897. case BD_8020CP:
  898. /* setup 1 ESCC8 */
  899. chip = CreateESCC8(bptr, 0);
  900. if(chip != NULL)
  901. {
  902. CreateESCC8Port(chip, 7, FUNCTION_AO);
  903. CreateESCC8Port(chip, 6, FUNCTION_AO);
  904. CreateESCC8Port(chip, 5, FUNCTION_AO);
  905. CreateESCC8Port(chip, 4, FUNCTION_AO);
  906. CreateESCC8Port(chip, 3, FUNCTION_AO);
  907. CreateESCC8Port(chip, 2, FUNCTION_AO);
  908. CreateESCC8Port(chip, 1, FUNCTION_AO);
  909. CreateESCC8Port(chip, 0, FUNCTION_AO);
  910. }
  911. break;
  912. case BD_8520P:
  913. case BD_8520CP:
  914. /* setup 1 ESCC8 */
  915. chip = CreateESCC8(bptr, 0);
  916. if(chip != NULL)
  917. {
  918. CreateESCC8Port(chip, 7, FUNCTION_NR);
  919. CreateESCC8Port(chip, 6, FUNCTION_NR);
  920. CreateESCC8Port(chip, 5, FUNCTION_NR);
  921. CreateESCC8Port(chip, 4, FUNCTION_NR);
  922. CreateESCC8Port(chip, 3, FUNCTION_NR);
  923. CreateESCC8Port(chip, 2, FUNCTION_NR);
  924. CreateESCC8Port(chip, 1, FUNCTION_NR);
  925. CreateESCC8Port(chip, 0, FUNCTION_NR);
  926. }
  927. break;
  928. case BD_WANMCS:
  929. CreateCIMs(bptr);
  930. for(chipno = 7, cim = bptr->b_cimbase; 
  931.     cim != NULL; cim = cim->next_by_mcs)
  932. {
  933. chip = CreateESCC8fromCIM(bptr, cim, chipno--);
  934. if(chip != NULL)
  935. {
  936. CreateESCC8PortWithCIM(chip, 7, cim, 0);
  937. CreateESCC8PortWithCIM(chip, 6, cim, 0);
  938. CreateESCC8PortWithCIM(chip, 5, cim, 0);
  939. CreateESCC8PortWithCIM(chip, 4, cim, 0);
  940. CreateESCC8PortWithCIM(chip, 3, cim, 0);
  941. CreateESCC8PortWithCIM(chip, 2, cim, 0);
  942. CreateESCC8PortWithCIM(chip, 1, cim, 0);
  943. CreateESCC8PortWithCIM(chip, 0, cim, 0);
  944. }
  945. chip = CreateESCC8fromCIM(bptr, cim, chipno--);
  946. if(chip != NULL)
  947. {
  948. CreateESCC8PortWithCIM(chip, 7, cim, 0);
  949. CreateESCC8PortWithCIM(chip, 6, cim, 0);
  950. CreateESCC8PortWithCIM(chip, 5, cim, 0);
  951. CreateESCC8PortWithCIM(chip, 4, cim, 0);
  952. CreateESCC8PortWithCIM(chip, 3, cim, 0);
  953. CreateESCC8PortWithCIM(chip, 2, cim, 0);
  954. CreateESCC8PortWithCIM(chip, 1, cim, 0);
  955. CreateESCC8PortWithCIM(chip, 0, cim, 1);
  956. }
  957. }
  958. break;
  959. default:
  960. printk(KERN_ALERT "auraXX20n: unable to set up chip for board %p.n", bptr);
  961. break;
  962. }
  963. }
  964. /* finding the cards by PCI device type */
  965. static SAB_BOARD* find_ati_cpci_card(void)
  966. {
  967. struct pci_dev *pdev;
  968. unsigned char bus;
  969. unsigned char devfn;
  970. unsigned char pci_latency;
  971. unsigned short pci_command;
  972. SAB_BOARD *bptr;
  973. unsigned control;
  974. unsigned does_sync;
  975. unsigned use_1port;
  976. printk(KERN_ALERT "auraXX20n: finding ati cpci cards.n");
  977. bptr = (SAB_BOARD*)kmalloc(sizeof(SAB_BOARD), GFP_KERNEL);
  978. if(bptr == NULL)
  979. {
  980. printk(KERN_ALERT "auraXX20n: could not allocate board memory!n");
  981. return 0;
  982. }
  983. memset(bptr, 0, sizeof(SAB_BOARD));
  984. if(!pcibios_present())
  985. {
  986. printk(KERN_ALERT "auraXX20n: system does not support PCI bus.n");
  987. kfree(bptr);
  988. return 0;
  989. }
  990. DEBUGPRINT((KERN_ALERT "auraXX20n: System supports PCI bus.n"));
  991.  CPCIRESTART:
  992. if(pdev = pci_find_device(sab8253x_vendor_id, sab8253x_cpci_device_id, XX20lastpdev),
  993.    pdev == NULL)
  994. {
  995. printk(KERN_ALERT "auraXX20n: could not find cpci card.n");
  996. kfree(bptr);
  997. return 0;
  998. }
  999. DEBUGPRINT((KERN_ALERT "auraXX20n: found multiport CPCI serial card.n"));
  1000. XX20lastpdev = pdev;
  1001. DEBUGPRINT((KERN_ALERT "auraXX20n: found ATI PLX 9050, %p.n", pdev));
  1002. bptr->b_dev = *pdev;
  1003. /* the Solaris and model linux drivers
  1004.  * comment that there are problems with
  1005.  * getting the length via PCI operations
  1006.  * seems to work for 2.4
  1007.  */
  1008. bptr->length0 = (unsigned int) pci_resource_len(pdev, 0);
  1009. bptr->length1 = (unsigned int) pci_resource_len(pdev, 1);
  1010. bptr->length2 = (unsigned int) pci_resource_len(pdev, 2);
  1011. bptr->b_irq = pdev->irq;
  1012. DEBUGPRINT((KERN_ALERT 
  1013.     "auraXX20n: base address 0 is %p, len is %x.n", 
  1014.     (void*) pci_base_address(pdev, 0), bptr->length0));
  1015. DEBUGPRINT((KERN_ALERT 
  1016.     "auraXX20n: base address 1 is %p, len is %x.n", 
  1017.     (void*) pci_base_address(pdev, 1), bptr->length1));
  1018. DEBUGPRINT((KERN_ALERT 
  1019.     "auraXX20n: base address 2 is %p, len is %x.n", 
  1020.     (void*) pci_base_address(pdev, 2),
  1021.     bptr->length2));
  1022. DEBUGPRINT((KERN_ALERT "auraXX20n: interrupt is %i.n", pdev->irq));
  1023. bus = pdev->bus->number;
  1024. devfn = pdev->devfn;
  1025. DEBUGPRINT((KERN_ALERT "auraXX20n: bus is %x, slot is %x.n", bus, PCI_SLOT(devfn)));
  1026. pcibios_read_config_word(bus, devfn, PCI_COMMAND, &pci_command);
  1027. #if 0
  1028. /* The Aurora card does not act as a PCI master
  1029.  * ugh!!
  1030.  */
  1031. new_command = pci_command | PCI_COMMAND_MASTER;
  1032. if(pci_command != new_command)
  1033. {
  1034. DEBUGPRINT((KERN_ALERT 
  1035.     "auraXX20n: the PCI BIOS has not enabled this device!"
  1036.     " Updating PCI command %4.4x->%4.4x.n", 
  1037.     pci_command,
  1038.     new_command));
  1039. pcibios_write_config_word(bus, devfn, PCI_COMMAND, 
  1040.   new_command);
  1041. }
  1042. else
  1043. {
  1044. DEBUGPRINT
  1045. ((KERN_ALERT 
  1046.   "auraXX20n: the PCI BIOS has enabled this device as master!n"));
  1047. }
  1048. #endif
  1049. if((pci_command & PCI_COMMAND_MASTER) != PCI_COMMAND_MASTER)
  1050. {
  1051. DEBUGPRINT((KERN_ALERT "auraXX20n: Aurora card is not a bus master.n"));
  1052. }
  1053. pcibios_read_config_byte(bus, devfn, PCI_LATENCY_TIMER, 
  1054.  &pci_latency);
  1055. if (pci_latency < 32) 
  1056. {
  1057. DEBUGPRINT
  1058. ((KERN_ALERT
  1059.   "auraXX20n: PCI latency timer (CFLT) is low at %i.n", pci_latency));
  1060. /* may need to change the latency */
  1061. #if 0
  1062. pcibios_write_config_byte(bus, devfn, PCI_LATENCY_TIMER, 32);
  1063. #endif
  1064. else 
  1065. {
  1066. DEBUGPRINT((KERN_ALERT
  1067.     "auraXX20n: PCI latency timer (CFLT) is %#x.n", 
  1068.     pci_latency));
  1069. }
  1070. bptr->virtbaseaddress0 = ioremap_nocache(pci_base_address(pdev, 0), 
  1071.  bptr->length0);
  1072. if(bptr->virtbaseaddress0 == NULL)
  1073. {
  1074. printk(KERN_ALERT
  1075.        "auraXX20n: unable to remap physical address %p.n", 
  1076.        (void*) pci_base_address(pdev, 0));
  1077. goto CPCIRESTART;
  1078. }
  1079. bptr->b_bridge = (PLX9050*) bptr->virtbaseaddress0; /* MAKE SURE INTS ARE OFF */
  1080. writel(PLX_INT_OFF, &(bptr->b_bridge->intr));
  1081. printk
  1082. (KERN_ALERT
  1083.  "auraXX20n: remapped physical address %p to virtual address %p.n",
  1084.  (void*) pci_base_address(pdev, 0), (void*) bptr->virtbaseaddress0);
  1085. dump_ati_adapter_registers((unsigned int*) bptr->virtbaseaddress0, bptr->length0);
  1086. if(*(unsigned int*)bptr->virtbaseaddress0 == -1) /* XP7 problem? */
  1087. {
  1088. printk(KERN_ALERT
  1089.        "auraXX20n: unable to access PLX 9050 registers at %p.n", 
  1090.        (void*)bptr->virtbaseaddress0);
  1091. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1092.        (void*)bptr->virtbaseaddress0);
  1093. iounmap((void*)bptr->virtbaseaddress0);
  1094. bptr->virtbaseaddress0 = 0;
  1095. goto CPCIRESTART;
  1096. }
  1097. bptr->virtbaseaddress2 = ioremap_nocache(pci_base_address(pdev, 2),
  1098.  bptr->length2);
  1099. if(bptr->virtbaseaddress2 == NULL)
  1100. {
  1101. printk(KERN_ALERT
  1102.        "auraXX20n: unable to remap physical address %p.n", 
  1103.        (void*) pci_base_address(pdev, 2));
  1104. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1105.        (void*)bptr->virtbaseaddress0);
  1106. iounmap((void*)bptr->virtbaseaddress0);
  1107. bptr->virtbaseaddress0 = 0;
  1108. goto CPCIRESTART;
  1109. }
  1110. DEBUGPRINT
  1111. ((KERN_ALERT
  1112.   "auraXX20n: remapped physical address %p to virtual address %p.n",
  1113.   (void*) pci_base_address(pdev, 2), (void*) bptr->virtbaseaddress2));
  1114. /* we get clockrate from serial eeprom */
  1115. if (!plx9050_eprom_read(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1116. (unsigned short*) bptr->b_eprom,
  1117. (unsigned char) 0, EPROM9050_SIZE))
  1118. {
  1119. printk(KERN_ALERT "auraXX20n: Could not read serial eprom.n");
  1120. iounmap((void*)bptr->virtbaseaddress0);
  1121. bptr->virtbaseaddress0 = 0;
  1122. iounmap((void*)bptr->virtbaseaddress2);
  1123. bptr->virtbaseaddress2 = 0;
  1124. goto CPCIRESTART;
  1125. }
  1126. printk(KERN_ALERT "auraXX20n: dumping serial eprom.n");
  1127. dump_ati_adapter_registers((unsigned int*) bptr->b_eprom, 2 * EPROM9050_SIZE);  
  1128. if(*(unsigned int*)bptr->b_eprom != PCIMEMVALIDCPCI) /* bridge problem? */
  1129. {
  1130. printk(KERN_ALERT "auraXX20n: unable to access valid serial eprom data.n");
  1131. iounmap((void*)bptr->virtbaseaddress0);
  1132. bptr->virtbaseaddress0 = 0;
  1133. iounmap((void*)bptr->virtbaseaddress2);
  1134. bptr->virtbaseaddress2 = 0;
  1135. goto CPCIRESTART;
  1136. }
  1137. if(((unsigned short*) bptr->b_eprom)[EPROMPREFETCHOFFSET] & PREFETCHBIT)
  1138. {
  1139. ++sab8253x_rebootflag;
  1140. printk(KERN_ALERT "8253x: eeprom programmed for prefetchable memory resources; must reprogram!!n");
  1141. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1142.   NM93_WENCMD, NM93_WENADDR, 0);
  1143. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1144.   NM93_WRITECMD, 
  1145.   9,
  1146.   (((unsigned short*) bptr->b_eprom)[EPROMPREFETCHOFFSET] & (~PREFETCHBIT)));
  1147. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1148.   NM93_WDSCMD, NM93_WDSADDR, 0);
  1149. }
  1150. /* get SYNC and ONEPORT values */
  1151. control = readl(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl);
  1152. /* note we use the actual address
  1153.  * of the control register in
  1154.  * memory
  1155.  */
  1156. if(control & AURORA_MULTI_SYNCBIT)
  1157. {
  1158. does_sync = 0;
  1159. }
  1160. else
  1161. {
  1162. does_sync = 1;
  1163. }
  1164. if(control & AURORA_MULTI_1PORTBIT)
  1165. {
  1166. use_1port = 1;
  1167. }
  1168. else
  1169. {
  1170. use_1port = 0;
  1171. }
  1172. /* Figure out the board */
  1173. switch(bptr->length2) 
  1174. {
  1175. case AURORA_4X20_SIZE:
  1176. if(does_sync) 
  1177. {
  1178. bptr->b_type = BD_4520CP;
  1179. bptr->b_nchips = 2;
  1180. bptr->b_nports = 4;
  1181. bptr->b_flags = BD_SYNC;
  1182. bptr->b_cimbase  =  NULL;
  1183. bptr->board_number = BD4520CPcounter; /* keep track of boardnumber for naming devices */
  1184. ++BD4520CPcounter;
  1185. printk(KERN_ALERT "auraXX20n: Found Saturn 4520CP.n");
  1186. else 
  1187. {
  1188. bptr->b_type = BD_4020CP;
  1189. bptr->b_nchips = 2;
  1190. bptr->b_nports = 4;
  1191. bptr->b_flags = 0x0;
  1192. bptr->b_cimbase  =  NULL;
  1193. bptr->board_number = BD4020CPcounter;
  1194. ++BD4020CPcounter;
  1195. printk(KERN_ALERT "auraXX20n: Found Apollo 4020CP.n");
  1196. }
  1197. break;
  1198. case AURORA_8X20_SIZE:
  1199. if(does_sync) 
  1200. bptr->b_type = BD_8520CP;
  1201. bptr->b_nchips = 1;
  1202. bptr->b_nports = 8;
  1203. bptr->b_flags = BD_SYNC;
  1204. bptr->b_cimbase  =  NULL;
  1205. bptr->board_number = BD8520CPcounter;
  1206. ++BD8520CPcounter;
  1207. printk(KERN_ALERT "auraXX20n: Found Saturn 8520CP.n");
  1208. else 
  1209. {
  1210. bptr->b_type = BD_8020CP;
  1211. bptr->b_nchips = 1;
  1212. bptr->b_nports = 8;
  1213. bptr->b_flags = 0x0;
  1214. bptr->b_cimbase  =  NULL;
  1215. bptr->board_number = BD8020CPcounter;
  1216. ++BD8020CPcounter;
  1217. printk(KERN_ALERT "auraXX20n: Found Apollo 8020CP.n");
  1218. }
  1219. break;
  1220. case AURORA_2X20_SIZE:
  1221. if(does_sync) 
  1222. {
  1223. if(use_1port) 
  1224. {
  1225. bptr->b_type = BD_1520CP;
  1226. printk(KERN_ALERT "auraXX20n: Found Saturn 1520CP.n");
  1227. bptr->b_nchips = 1;
  1228. bptr->b_nports = 1;
  1229. bptr->b_flags = BD_SYNC;
  1230. bptr->b_cimbase  =  NULL;
  1231. bptr->board_number = BD1520CPcounter;
  1232. ++BD1520CPcounter;
  1233. printk(KERN_ALERT "auraXX20n: Found Saturn 1520CP.n");
  1234. else 
  1235. {
  1236. bptr->b_type = BD_2520CP;
  1237. bptr->b_nchips = 1;
  1238. bptr->b_nports = 2;
  1239. bptr->b_flags = BD_SYNC;
  1240. bptr->b_cimbase  =  NULL;
  1241. bptr->board_number = BD2520CPcounter;
  1242. ++BD2520CPcounter;
  1243. printk(KERN_ALERT "auraXX20n: Found Saturn 2520CP.n");
  1244. }
  1245. }
  1246. else
  1247. {
  1248. if(use_1port) 
  1249. {
  1250. bptr->b_type = BD_1020CP;
  1251. bptr->b_nchips = 1;
  1252. bptr->b_nports = 1;
  1253. bptr->b_flags = 0x0;
  1254. bptr->b_cimbase  =  NULL;
  1255. bptr->board_number = BD1020CPcounter;
  1256. ++BD1020CPcounter;
  1257. printk(KERN_ALERT "auraXX20n: Found Apollo 1020CP.n");
  1258. else 
  1259. {
  1260. bptr->b_type = BD_2020CP;
  1261. bptr->b_nchips = 1;
  1262. bptr->b_nports = 2;
  1263. bptr->b_flags = 0x0;
  1264. bptr->b_cimbase  =  NULL;
  1265. bptr->board_number = BD2020CPcounter;
  1266. ++BD2020CPcounter;
  1267. printk(KERN_ALERT "auraXX20n: Found Apollo 2020CP.n");
  1268. }
  1269. }
  1270. break;
  1271. default:
  1272. printk(KERN_ALERT "Error: Board could not be identifiedn");
  1273. iounmap((void*)bptr->virtbaseaddress0);
  1274. bptr->virtbaseaddress0 = 0;
  1275. iounmap((void*)bptr->virtbaseaddress2);
  1276. bptr->virtbaseaddress2 = 0;
  1277. goto CPCIRESTART;
  1278. }
  1279. /* Let's get the clockrate right -- ugh!*/
  1280. bptr->b_clkspeed = bptr->b_eprom[AURORA_MULTI_EPROM_CLKLSW/2];
  1281. if(bptr->b_clkspeed == -1) /* misprogrammed -- ugh. */
  1282. {
  1283. switch(bptr->b_type)
  1284. {
  1285. case BD_8520CP:
  1286. case BD_8020CP:
  1287. bptr->b_clkspeed = AURORA_MULTI_CLKSPEED/4;
  1288. break;
  1289. default:
  1290. bptr->b_clkspeed = AURORA_MULTI_CLKSPEED;
  1291. break;
  1292. }
  1293. printk(KERN_ALERT "auraXX20n:  UNKNOWN CLOCKSPEED -- ASSUMING %ld.n", bptr->b_clkspeed);
  1294. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1295.   NM93_WENCMD, NM93_WENADDR, 0);
  1296. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1297.   NM93_WRITECMD, 
  1298.   54, (unsigned short) bptr->b_clkspeed);
  1299. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1300.   NM93_WRITECMD, 
  1301.   55, (unsigned short) (bptr->b_clkspeed >> 16));
  1302. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1303.   NM93_WDSCMD, NM93_WDSADDR, 0);
  1304. }
  1305. return bptr;
  1306. }
  1307. static SAB_BOARD* find_ati_wanms_card(void)   /* wan multichanner server == mcs [ multichannel server] */
  1308. {
  1309. struct pci_dev *pdev;
  1310. unsigned char bus;
  1311. unsigned char devfn;
  1312. unsigned char pci_latency;
  1313. unsigned short pci_command;
  1314. SAB_BOARD *bptr;
  1315. int resetresult;
  1316. printk(KERN_ALERT "auraXX20n: finding ati mcs cards.n");
  1317. bptr = (SAB_BOARD*)kmalloc(sizeof(SAB_BOARD), GFP_KERNEL);
  1318. if(bptr == NULL)
  1319. {
  1320. printk(KERN_ALERT "auraXX20n: could not allocate board memory!n");
  1321. return 0;
  1322. }
  1323. memset(bptr, 0, sizeof(SAB_BOARD));
  1324. if(!pcibios_present())
  1325. {
  1326. printk(KERN_ALERT "auraXX20n: system does not support PCI bus.n");
  1327. kfree(bptr);
  1328. return 0;
  1329. }
  1330. DEBUGPRINT((KERN_ALERT "auraXX20n: System supports PCI bus.n"));
  1331.  MCSRESTART:
  1332. if(pdev = pci_find_device(sab8253x_vendor_id, sab8253x_wmcs_device_id, XX20lastpdev),
  1333.    pdev == NULL)
  1334. {
  1335. printk(KERN_ALERT "auraXX20n: could not find mcs card.n");
  1336. kfree(bptr);
  1337. return 0;
  1338. }
  1339. DEBUGPRINT((KERN_ALERT "auraXX20n: found mcs card.n"));
  1340. XX20lastpdev = pdev;
  1341. DEBUGPRINT((KERN_ALERT "auraXX20n: found ATI S5920, %p.n", pdev));
  1342. bptr->b_dev = *pdev;
  1343. /* the Solaris and model linux drivers
  1344.  * comment that there are problems with
  1345.  * getting the length via PCI operations
  1346.  * seems to work for 2.4
  1347.  */
  1348. bptr->length0 = (unsigned int) pci_resource_len(pdev, 0); /* AMCC 5920 operation registers
  1349.      includes access to serial eprom */
  1350. bptr->length1 = (unsigned int) pci_resource_len(pdev, 1); /* commands to remote cards */
  1351. bptr->length2 = (unsigned int) pci_resource_len(pdev, 2); /* command to host card */
  1352. bptr->length3 = (unsigned int) pci_resource_len(pdev, 3); /* RFIFO cache */
  1353. bptr->b_irq = pdev->irq;
  1354. DEBUGPRINT((KERN_ALERT 
  1355.     "auraXX20n: base address 0 is %p, len is %x.n", 
  1356.     (void*) pci_base_address(pdev, 0), bptr->length0));
  1357. DEBUGPRINT((KERN_ALERT 
  1358.     "auraXX20n: base address 1 is %p, len is %x.n", 
  1359.     (void*) pci_base_address(pdev, 1), bptr->length1));
  1360. DEBUGPRINT((KERN_ALERT 
  1361.     "auraXX20n: base address 2 is %p, len is %x.n", 
  1362.     (void*) pci_base_address(pdev, 2),
  1363.     bptr->length2));
  1364. DEBUGPRINT((KERN_ALERT 
  1365.     "auraXX20n: base address 3 is %p, len is %x.n", 
  1366.     (void*) pci_base_address(pdev, 3),
  1367.     bptr->length3));
  1368. DEBUGPRINT((KERN_ALERT "auraXX20n: interrupt is %i.n", pdev->irq));
  1369. bus = pdev->bus->number;
  1370. devfn = pdev->devfn;
  1371. DEBUGPRINT((KERN_ALERT "auraXX20n: bus is %x, slot is %x.n", bus, PCI_SLOT(devfn)));
  1372. pcibios_read_config_word(bus, devfn, PCI_COMMAND, &pci_command);
  1373. #if 0
  1374. /* The Aurora card does not act as a PCI master
  1375.  * ugh!!
  1376.  */
  1377. new_command = pci_command | PCI_COMMAND_MASTER;
  1378. if(pci_command != new_command)
  1379. {
  1380. DEBUGPRINT((KERN_ALERT 
  1381.     "auraXX20n: the PCI BIOS has not enabled this device!"
  1382.     " Updating PCI command %4.4x->%4.4x.n", 
  1383.     pci_command,
  1384.     new_command));
  1385. pcibios_write_config_word(bus, devfn, PCI_COMMAND, 
  1386.   new_command);
  1387. }
  1388. else
  1389. {
  1390. DEBUGPRINT
  1391. ((KERN_ALERT 
  1392.   "auraXX20n: the PCI BIOS has enabled this device as master!n"));
  1393. }
  1394. #endif
  1395. if((pci_command & PCI_COMMAND_MASTER) != PCI_COMMAND_MASTER)
  1396. {
  1397. DEBUGPRINT((KERN_ALERT "auraXX20n: Aurora card is not a bus master.n"));
  1398. }
  1399. pcibios_read_config_byte(bus, devfn, PCI_LATENCY_TIMER, 
  1400.  &pci_latency);
  1401. if (pci_latency < 32) 
  1402. {
  1403. DEBUGPRINT
  1404. ((KERN_ALERT
  1405.   "auraXX20n: PCI latency timer (CFLT) is low at %i.n", pci_latency));
  1406. /* may need to change the latency */
  1407. #if 0
  1408. pcibios_write_config_byte(bus, devfn, PCI_LATENCY_TIMER, 32);
  1409. #endif
  1410. else 
  1411. {
  1412. DEBUGPRINT((KERN_ALERT
  1413.     "auraXX20n: PCI latency timer (CFLT) is %#x.n", 
  1414.     pci_latency));
  1415. }
  1416. bptr->virtbaseaddress0 = ioremap_nocache(pci_base_address(pdev, 0), 
  1417.  bptr->length0);
  1418. if(bptr->virtbaseaddress0 == NULL)
  1419. {
  1420. printk(KERN_ALERT
  1421.        "auraXX20n: unable to remap physical address %p.n", 
  1422.        (void*) pci_base_address(pdev, 0));
  1423. goto MCSRESTART;
  1424. }
  1425. bptr->b_bridge = (void*) bptr->virtbaseaddress0; /* b_bridge is not supposed
  1426.     to be used by the AMCC based
  1427.     products -- it is set just
  1428.     in case */
  1429. printk(KERN_ALERT
  1430.        "auraXX20n: remapped physical address %p to virtual address %p.n",
  1431.        (void*) pci_base_address(pdev, 0), (void*) bptr->virtbaseaddress0);
  1432. /* unfortunate name -- works for any bridge */
  1433. dump_ati_adapter_registers((unsigned int*) bptr->virtbaseaddress0, bptr->length0);
  1434. if(*(unsigned int*)bptr->virtbaseaddress0 == -1) /* XP7 problem? */
  1435. {
  1436. printk(KERN_ALERT
  1437.        "auraXX20n: unable to access AMCC registers at %p.n", 
  1438.        (void*)bptr->virtbaseaddress0);
  1439. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1440.        (void*)bptr->virtbaseaddress0);
  1441. iounmap((void*)bptr->virtbaseaddress0);
  1442. bptr->virtbaseaddress0 = 0;
  1443. goto MCSRESTART;        /* try the next one if any */
  1444. }
  1445. writel(AMCC_INT_OFF, (unsigned int*)(bptr->AMCC_REG + AMCC_INTCSR));
  1446. bptr->virtbaseaddress1 = ioremap_nocache(pci_base_address(pdev, 1),
  1447.  bptr->length1);
  1448. if(bptr->virtbaseaddress1 == NULL)
  1449. {
  1450. printk(KERN_ALERT
  1451.        "auraXX20n: unable to remap physical address %p.n", 
  1452.        (void*) pci_base_address(pdev, 1));
  1453. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1454.        (void*)bptr->virtbaseaddress0);
  1455. iounmap((void*)bptr->virtbaseaddress0);
  1456. bptr->virtbaseaddress0 = 0;
  1457. goto MCSRESTART;
  1458. }
  1459. DEBUGPRINT
  1460. ((KERN_ALERT
  1461.   "auraXX20n: remapped physical address %p to virtual address %p.n",
  1462.   (void*) pci_base_address(pdev, 1), (void*) bptr->virtbaseaddress1));
  1463. /* next address space */
  1464. bptr->virtbaseaddress2 = ioremap_nocache(pci_base_address(pdev, 2),
  1465.  bptr->length2);
  1466. if(bptr->virtbaseaddress2 == NULL)
  1467. {
  1468. printk(KERN_ALERT
  1469.        "auraXX20n: unable to remap physical address %p.n", 
  1470.        (void*) pci_base_address(pdev, 2));
  1471. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1472.        (void*)bptr->virtbaseaddress0);
  1473. iounmap((void*)bptr->virtbaseaddress0);
  1474. bptr->virtbaseaddress0 = 0;
  1475. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1476.        (void*)bptr->virtbaseaddress1);
  1477. iounmap((void*)bptr->virtbaseaddress1);
  1478. bptr->virtbaseaddress1 = 0;
  1479. goto MCSRESTART;
  1480. }
  1481. DEBUGPRINT
  1482. ((KERN_ALERT
  1483.   "auraXX20n: remapped physical address %p to virtual address %p.n",
  1484.   (void*) pci_base_address(pdev, 2), (void*) bptr->virtbaseaddress2));
  1485. bptr->virtbaseaddress3 = ioremap_nocache(pci_base_address(pdev, 3),
  1486.  bptr->length3);
  1487. if(bptr->virtbaseaddress3 == NULL)
  1488. {
  1489. printk(KERN_ALERT
  1490.        "auraXX20n: unable to remap physical address %p.n", 
  1491.        (void*) pci_base_address(pdev, 3));
  1492. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1493.        (void*)bptr->virtbaseaddress0);
  1494. iounmap((void*)bptr->virtbaseaddress0);
  1495. bptr->virtbaseaddress0 = 0;
  1496. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1497.        (void*)bptr->virtbaseaddress1);
  1498. iounmap((void*)bptr->virtbaseaddress1);
  1499. bptr->virtbaseaddress1 = 0;
  1500. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1501.        (void*)bptr->virtbaseaddress2);
  1502. iounmap((void*)bptr->virtbaseaddress2);
  1503. bptr->virtbaseaddress2 = 0;
  1504. goto MCSRESTART;
  1505. }
  1506. DEBUGPRINT
  1507. ((KERN_ALERT
  1508.   "auraXX20n: remapped physical address %p to virtual address %p.n",
  1509.   (void*) pci_base_address(pdev, 3), (void*) bptr->virtbaseaddress3));
  1510. bptr->b_type = BD_WANMCS;
  1511. resetresult = wanmcs_reset(bptr);
  1512. writel(AMCC_INT_OFF, (unsigned int*)(bptr->AMCC_REG + AMCC_INTCSR));
  1513. if(resetresult == FALSE)
  1514. {
  1515. printk(KERN_ALERT "auraXX20n: unable to reset wan mcs %p.n", bptr);
  1516. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1517.        (void*)bptr->virtbaseaddress0);
  1518. iounmap((void*)bptr->virtbaseaddress0);
  1519. bptr->virtbaseaddress0 = 0;
  1520. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1521.        (void*)bptr->virtbaseaddress1);
  1522. iounmap((void*)bptr->virtbaseaddress1);
  1523. bptr->virtbaseaddress1 = 0;
  1524. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1525.        (void*)bptr->virtbaseaddress2);
  1526. iounmap((void*)bptr->virtbaseaddress2);
  1527. bptr->virtbaseaddress2 = 0;
  1528. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1529.        (void*)bptr->virtbaseaddress3);
  1530. iounmap((void*)bptr->virtbaseaddress3);
  1531. bptr->virtbaseaddress3 = 0;
  1532. goto MCSRESTART;
  1533. }
  1534. /* we get clockrate from serial eeprom */
  1535. if (amcc_read_nvram((unsigned char*) bptr->b_eprom,
  1536.     AMCC_NVRAM_SIZE, bptr->AMCC_REG) == FALSE)
  1537. {
  1538. printk(KERN_ALERT "auraXX20n: Could not read serial eprom.n");
  1539. iounmap((void*)bptr->virtbaseaddress0);
  1540. bptr->virtbaseaddress0 = 0;
  1541. iounmap((void*)bptr->virtbaseaddress1);
  1542. bptr->virtbaseaddress1 = 0;
  1543. iounmap((void*)bptr->virtbaseaddress2);
  1544. bptr->virtbaseaddress2 = 0;
  1545. iounmap((void*)bptr->virtbaseaddress3);
  1546. bptr->virtbaseaddress3 = 0;
  1547. goto MCSRESTART;
  1548. }
  1549. printk(KERN_ALERT "auraXX20n: dumping serial eprom.n");
  1550. dump_ati_adapter_registers((unsigned int*) bptr->b_eprom, 2 * AMCC_NVRAM_SIZE);  
  1551. if(bptr->b_eprom[AMCC_NVR_VENDEVID] != PCIMEMVALIDWMCS)
  1552. {
  1553. printk(KERN_ALERT "auraXX20: bad serial eprom, board %p.n", bptr);
  1554. iounmap((void*)bptr->virtbaseaddress0);
  1555. bptr->virtbaseaddress0 = 0;
  1556. iounmap((void*)bptr->virtbaseaddress1);
  1557. bptr->virtbaseaddress1 = 0;
  1558. iounmap((void*)bptr->virtbaseaddress2);
  1559. bptr->virtbaseaddress2 = 0;
  1560. iounmap((void*)bptr->virtbaseaddress3);
  1561. bptr->virtbaseaddress3 = 0;
  1562. goto MCSRESTART;
  1563. }
  1564. return bptr;
  1565. }
  1566. /* initialize the auraXX20 */
  1567. static SAB_BOARD* find_ati_multiport_card(void)
  1568. {
  1569. struct pci_dev *pdev;
  1570. unsigned char bus;
  1571. unsigned char devfn;
  1572. unsigned char pci_latency;
  1573. unsigned short pci_command;
  1574. SAB_BOARD *bptr;
  1575. unsigned control;
  1576. unsigned does_sync;
  1577. unsigned use_1port;
  1578. printk(KERN_ALERT "auraXX20n: finding ati cards.n");
  1579. bptr = (SAB_BOARD*)kmalloc(sizeof(SAB_BOARD), GFP_KERNEL);
  1580. if(bptr == NULL)
  1581. {
  1582. printk(KERN_ALERT "auraXX20n: could not allocate board memory!n");
  1583. return 0;
  1584. }
  1585. memset(bptr, 0, sizeof(SAB_BOARD));
  1586. if(!pcibios_present())
  1587. {
  1588. printk(KERN_ALERT "auraXX20n: system does not support PCI bus.n");
  1589. kfree(bptr);
  1590. return 0;
  1591. }
  1592. DEBUGPRINT((KERN_ALERT "auraXX20n: System supports PCI bus.n"));
  1593.  MULTIPORTRESTART:
  1594. if(pdev = pci_find_device(sab8253x_vendor_id, sab8253x_mpac_device_id, XX20lastpdev),
  1595.    pdev == NULL)
  1596. {
  1597. printk(KERN_ALERT "auraXX20n: could not find multiport card.n");
  1598. kfree(bptr);
  1599. return 0;
  1600. }
  1601. DEBUGPRINT((KERN_ALERT "auraXX20n: found multiport PCI serial card.n"));
  1602. XX20lastpdev = pdev;
  1603. DEBUGPRINT((KERN_ALERT "auraXX20n: found ATI PLX 9050, %p.n", pdev));
  1604. bptr->b_dev = *pdev;
  1605. /* the Solaris and model linux drivers
  1606.  * comment that there are problems with
  1607.  * getting the length via PCI operations
  1608.  * seems to work for 2.4
  1609.  */
  1610. bptr->length0 = (unsigned int) pci_resource_len(pdev, 0);
  1611. bptr->length1 = (unsigned int) pci_resource_len(pdev, 1);
  1612. bptr->length2 = (unsigned int) pci_resource_len(pdev, 2);
  1613. bptr->b_irq = pdev->irq;
  1614. DEBUGPRINT((KERN_ALERT 
  1615.     "auraXX20n: base address 0 is %p, len is %x.n", 
  1616.     (void*) pci_base_address(pdev, 0), bptr->length0));
  1617. DEBUGPRINT((KERN_ALERT 
  1618.     "auraXX20n: base address 1 is %p, len is %x.n", 
  1619.     (void*) pci_base_address(pdev, 1), bptr->length1));
  1620. DEBUGPRINT((KERN_ALERT 
  1621.     "auraXX20n: base address 2 is %p, len is %x.n", 
  1622.     (void*) pci_base_address(pdev, 2),
  1623.     bptr->length2));
  1624. DEBUGPRINT((KERN_ALERT "auraXX20n: interrupt is %i.n", pdev->irq));
  1625. bus = pdev->bus->number;
  1626. devfn = pdev->devfn;
  1627. DEBUGPRINT((KERN_ALERT "auraXX20n: bus is %x, slot is %x.n", bus, PCI_SLOT(devfn)));
  1628. pcibios_read_config_word(bus, devfn, PCI_COMMAND, &pci_command);
  1629. #if 0
  1630. /* The Aurora card does not act as a PCI master
  1631.  * ugh!!
  1632.  */
  1633. new_command = pci_command | PCI_COMMAND_MASTER;
  1634. if(pci_command != new_command)
  1635. {
  1636. DEBUGPRINT((KERN_ALERT 
  1637.     "auraXX20n: the PCI BIOS has not enabled this device!"
  1638.     " Updating PCI command %4.4x->%4.4x.n", 
  1639.     pci_command,
  1640.     new_command));
  1641. pcibios_write_config_word(bus, devfn, PCI_COMMAND, 
  1642.   new_command);
  1643. }
  1644. else
  1645. {
  1646. DEBUGPRINT
  1647. ((KERN_ALERT 
  1648.   "auraXX20n: the PCI BIOS has enabled this device as master!n"));
  1649. }
  1650. #endif
  1651. if((pci_command & PCI_COMMAND_MASTER) != PCI_COMMAND_MASTER)
  1652. {
  1653. DEBUGPRINT((KERN_ALERT "auraXX20n: Aurora card is not a bus master.n"));
  1654. }
  1655. pcibios_read_config_byte(bus, devfn, PCI_LATENCY_TIMER, 
  1656.  &pci_latency);
  1657. if (pci_latency < 32) 
  1658. {
  1659. DEBUGPRINT
  1660. ((KERN_ALERT
  1661.   "auraXX20n: PCI latency timer (CFLT) is low at %i.n", pci_latency));
  1662. /* may need to change the latency */
  1663. #if 0
  1664. pcibios_write_config_byte(bus, devfn, PCI_LATENCY_TIMER, 32);
  1665. #endif
  1666. else 
  1667. {
  1668. DEBUGPRINT((KERN_ALERT
  1669.     "auraXX20n: PCI latency timer (CFLT) is %#x.n", 
  1670.     pci_latency));
  1671. }
  1672. bptr->virtbaseaddress0 = ioremap_nocache(pci_base_address(pdev, 0), 
  1673.  bptr->length0);
  1674. if(bptr->virtbaseaddress0 == NULL)
  1675. {
  1676. printk(KERN_ALERT
  1677.        "auraXX20n: unable to remap physical address %p.n", 
  1678.        (void*) pci_base_address(pdev, 0));
  1679. goto MULTIPORTRESTART;
  1680. }
  1681. bptr->b_bridge = (PLX9050*) bptr->virtbaseaddress0; /* MAKE SURE INTS ARE OFF */
  1682. writel(PLX_INT_OFF, &(bptr->b_bridge->intr));
  1683. printk(KERN_ALERT
  1684.        "auraXX20n: remapped physical address %p to virtual address %p.n",
  1685.        (void*) pci_base_address(pdev, 0), (void*) bptr->virtbaseaddress0);
  1686. dump_ati_adapter_registers((unsigned int*) bptr->virtbaseaddress0, bptr->length0);
  1687. if(*(unsigned int*)bptr->virtbaseaddress0 == -1) /* XP7 problem? */
  1688. {
  1689. printk(KERN_ALERT
  1690.        "auraXX20n: unable to access PLX 9050 registers at %p.n", 
  1691.        (void*)bptr->virtbaseaddress0);
  1692. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1693.        (void*)bptr->virtbaseaddress0);
  1694. iounmap((void*)bptr->virtbaseaddress0);
  1695. bptr->virtbaseaddress0 = 0;
  1696. goto MULTIPORTRESTART;
  1697. }
  1698. bptr->virtbaseaddress2 = ioremap_nocache(pci_base_address(pdev, 2),
  1699.  bptr->length2);
  1700. if(bptr->virtbaseaddress2 == NULL)
  1701. {
  1702. printk(KERN_ALERT
  1703.        "auraXX20n: unable to remap physical address %p.n", 
  1704.        (void*) pci_base_address(pdev, 2));
  1705. printk(KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  1706.        (void*)bptr->virtbaseaddress0);
  1707. iounmap((void*)bptr->virtbaseaddress0);
  1708. bptr->virtbaseaddress0 = 0;
  1709. goto MULTIPORTRESTART;
  1710. }
  1711. DEBUGPRINT((KERN_ALERT
  1712.     "auraXX20n: remapped physical address %p to virtual address %p.n",
  1713.     (void*) pci_base_address(pdev, 2), (void*) bptr->virtbaseaddress2));
  1714. if (!plx9050_eprom_read(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1715. (unsigned short*) bptr->b_eprom,
  1716. (unsigned char) 0, EPROM9050_SIZE))
  1717. {
  1718. printk(KERN_ALERT "auraXX20n: Could not read serial eprom.n");
  1719. iounmap((void*)bptr->virtbaseaddress0);
  1720. bptr->virtbaseaddress0 = 0;
  1721. iounmap((void*)bptr->virtbaseaddress2);
  1722. bptr->virtbaseaddress2 = 0;
  1723. goto MULTIPORTRESTART;
  1724. }
  1725. printk(KERN_ALERT "auraXX20n: dumping serial eprom.n");
  1726. dump_ati_adapter_registers((unsigned int*) bptr->b_eprom, 2 * EPROM9050_SIZE);  
  1727. if(*(unsigned int*)bptr->b_eprom != PCIMEMVALIDMULTI) /* bridge problem? */
  1728. {
  1729. printk(KERN_ALERT "auraXX20n: unable to access valid serial eprom data.n");
  1730. iounmap((void*)bptr->virtbaseaddress0);
  1731. bptr->virtbaseaddress0 = 0;
  1732. iounmap((void*)bptr->virtbaseaddress2);
  1733. bptr->virtbaseaddress2 = 0;
  1734. goto MULTIPORTRESTART;
  1735. }
  1736. if(((unsigned short*) bptr->b_eprom)[EPROMPREFETCHOFFSET] & PREFETCHBIT)
  1737. {
  1738. ++sab8253x_rebootflag;
  1739. printk(KERN_ALERT "8253x: eeprom programmed for prefetchable memory resources; must reprogram!!n");
  1740. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1741.   NM93_WENCMD, NM93_WENADDR, 0);
  1742. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1743.   NM93_WRITECMD, 
  1744.   9,
  1745.   (((unsigned short*) bptr->b_eprom)[EPROMPREFETCHOFFSET] & (~PREFETCHBIT)));
  1746. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1747.   NM93_WDSCMD, NM93_WDSADDR, 0);
  1748. }
  1749. /* get SYNC and ONEPORT values */
  1750. control = readl(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl);
  1751. /* note we use the actual address
  1752.  * of the control register in
  1753.  * memory
  1754.  */
  1755. if(control & AURORA_MULTI_SYNCBIT)
  1756. {
  1757. does_sync = 0;
  1758. }
  1759. else
  1760. {
  1761. does_sync = 1;
  1762. }
  1763. if(control & AURORA_MULTI_1PORTBIT)
  1764. {
  1765. use_1port = 1;
  1766. }
  1767. else
  1768. {
  1769. use_1port = 0;
  1770. }
  1771. /* Figure out the board */
  1772. switch(bptr->length2) 
  1773. {
  1774. case AURORA_4X20_SIZE:
  1775. if(does_sync) 
  1776. {
  1777. bptr->b_type = BD_4520P;
  1778. bptr->b_nchips = 2;
  1779. bptr->b_nports = 4;
  1780. bptr->b_flags = BD_SYNC;
  1781. bptr->b_cimbase  =  NULL;
  1782. bptr->board_number = BD4520Pcounter; /* keep track of boardnumber for naming devices */
  1783. ++BD4520Pcounter;
  1784. printk(KERN_ALERT "auraXX20n: Found Saturn 4520P.n");
  1785. else 
  1786. {
  1787. bptr->b_type = BD_4020P;
  1788. bptr->b_nchips = 2;
  1789. bptr->b_nports = 4;
  1790. bptr->b_flags = 0x0;
  1791. bptr->b_cimbase  =  NULL;
  1792. bptr->board_number = BD4020Pcounter;
  1793. ++BD4020Pcounter;
  1794. printk(KERN_ALERT "auraXX20n: Found Apollo 4020P.n");
  1795. }
  1796. break;
  1797. case AURORA_8X20_SIZE:
  1798. if(does_sync) 
  1799. bptr->b_type = BD_8520P;
  1800. bptr->b_nchips = 1;
  1801. bptr->b_nports = 8;
  1802. bptr->b_flags = BD_SYNC;
  1803. bptr->b_cimbase  =  NULL;
  1804. bptr->board_number = BD8520Pcounter;
  1805. ++BD8520Pcounter;
  1806. printk(KERN_ALERT "auraXX20n: Found Saturn 8520P.n");
  1807. else 
  1808. {
  1809. bptr->b_type = BD_8020P;
  1810. bptr->b_nchips = 1;
  1811. bptr->b_nports = 8;
  1812. bptr->b_flags = 0x0;
  1813. bptr->b_cimbase  =  NULL;
  1814. bptr->board_number = BD8020Pcounter;
  1815. ++BD8020Pcounter;
  1816. printk(KERN_ALERT "auraXX20n: Found Apollo 8020P.n");
  1817. }
  1818. break;
  1819. case AURORA_2X20_SIZE:
  1820. if(does_sync) 
  1821. {
  1822. if(use_1port) 
  1823. {
  1824. bptr->b_type = BD_1520P;
  1825. printk(KERN_ALERT "auraXX20n: Found Saturn 1520P.n");
  1826. bptr->b_nchips = 1;
  1827. bptr->b_nports = 1;
  1828. bptr->b_flags = BD_SYNC;
  1829. bptr->b_cimbase  =  NULL;
  1830. bptr->board_number = BD1520Pcounter;
  1831. ++BD1520Pcounter;
  1832. printk(KERN_ALERT "auraXX20n: Found Saturn 1520P.n");
  1833. else 
  1834. {
  1835. bptr->b_type = BD_2520P;
  1836. bptr->b_nchips = 1;
  1837. bptr->b_nports = 2;
  1838. bptr->b_flags = BD_SYNC;
  1839. bptr->b_cimbase  =  NULL;
  1840. bptr->board_number = BD2520Pcounter;
  1841. ++BD2520Pcounter;
  1842. printk(KERN_ALERT "auraXX20n: Found Saturn 2520P.n");
  1843. }
  1844. }
  1845. else
  1846. {
  1847. if(use_1port) 
  1848. {
  1849. bptr->b_type = BD_1020P;
  1850. bptr->b_nchips = 1;
  1851. bptr->b_nports = 1;
  1852. bptr->b_flags = 0x0;
  1853. bptr->b_cimbase  =  NULL;
  1854. bptr->board_number = BD1020Pcounter;
  1855. ++BD1020Pcounter;
  1856. printk(KERN_ALERT "auraXX20n: Found Apollo 1020P.n");
  1857. else 
  1858. {
  1859. bptr->b_type = BD_2020P;
  1860. bptr->b_nchips = 1;
  1861. bptr->b_nports = 2;
  1862. bptr->b_flags = 0x0;
  1863. bptr->b_cimbase  =  NULL;
  1864. bptr->board_number = BD2020Pcounter;
  1865. ++BD2020Pcounter;
  1866. printk(KERN_ALERT "auraXX20n: Found Apollo 2020P.n");
  1867. }
  1868. }
  1869. break;
  1870. default:
  1871. printk(KERN_ALERT "Error: Board could not be identifiedn");
  1872. iounmap((void*)bptr->virtbaseaddress0);
  1873. bptr->virtbaseaddress0 = 0;
  1874. iounmap((void*)bptr->virtbaseaddress2);
  1875. bptr->virtbaseaddress2 = 0;
  1876. goto MULTIPORTRESTART;
  1877. }
  1878. /* Let's get the clockrate right -- ugh!*/
  1879. bptr->b_clkspeed = bptr->b_eprom[AURORA_MULTI_EPROM_CLKLSW/2];
  1880. if(bptr->b_clkspeed == -1) /* misprogrammed -- ugh. */
  1881. {
  1882. switch(bptr->b_type)
  1883. {
  1884. case BD_8520P:
  1885. case BD_8020P:
  1886. bptr->b_clkspeed = AURORA_MULTI_CLKSPEED/4;
  1887. break;
  1888. default:
  1889. bptr->b_clkspeed = AURORA_MULTI_CLKSPEED;
  1890. break;
  1891. }
  1892. printk(KERN_ALERT "auraXX20n:  UNKNOWN CLOCKSPEED -- ASSUMING %ld.n", bptr->b_clkspeed);
  1893. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1894.   NM93_WENCMD, NM93_WENADDR, 0);
  1895. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1896.   NM93_WRITECMD, 
  1897.   54, (unsigned short) bptr->b_clkspeed);
  1898. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1899.   NM93_WRITECMD, 
  1900.   55, (bptr->b_clkspeed >> 16));
  1901. plx9050_eprom_cmd(&((PLX9050*)(bptr->virtbaseaddress0))->ctrl, 
  1902.   NM93_WDSCMD, NM93_WDSADDR, 0);
  1903. }
  1904. return bptr;
  1905. }
  1906. #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)
  1907. #ifdef MODULE
  1908. int init_module(void) /* all OS */
  1909. #else
  1910. int auraXX20_probe(struct net_device *devp) /* passed default device structure */
  1911. #endif
  1912. #else
  1913. static int __init auraXX20_probe(void) /* legacy device initialization 2.4.* */
  1914. #endif
  1915. {
  1916. SAB_BOARD *boardptr;
  1917. SAB_PORT *portptr;
  1918. struct net_device *dev;
  1919. unsigned int result;
  1920. unsigned int namelength;
  1921. unsigned int portno;
  1922. int intr_val;
  1923. int mp_probe_count = 0; /* multiport count */
  1924. int cp_probe_count = 0; /* compact pci count */
  1925. int wm_probe_count = 0; /* wan multiserver count */
  1926. printk(KERN_ALERT "aurora interea miseris mortalibus almam extulerat lucemn");
  1927. printk(KERN_ALERT "        referens opera atque laboresn"); 
  1928. memset(AuraBoardESCC8IrqRoot, 0, sizeof(AuraBoardESCC8IrqRoot));
  1929. memset(AuraBoardESCC2IrqRoot, 0, sizeof(AuraBoardESCC2IrqRoot));
  1930. memset(AuraBoardMCSIrqRoot, 0, sizeof(AuraBoardMCSIrqRoot));
  1931. #if !defined(MODULE) && (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0))
  1932. if(do_probe == 0)
  1933. return -1; /* only allow to be called one 2.2.* */
  1934. do_probe = 0;
  1935. #endif
  1936. fn_init_crc_table(); /* used in faking ethernet packets for */
  1937. /* the network driver -- crcs are currently */
  1938. /* not being checked by this software */
  1939. /* but is good to have them in case a frame */
  1940. /* passes through a WAN LAN bridge */
  1941. sab8253x_setup_ttydriver(); /* add synchronous tty and synchronous network
  1942.    driver initialization */
  1943. AuraBoardRoot = NULL; /* basic lists */
  1944. AuraChipRoot = NULL;
  1945. AuraPortRoot = NULL;
  1946. NumSab8253xPorts = 0;
  1947. AuraXX20DriverParams.debug = auraXX20n_debug;
  1948. AuraXX20DriverParams.listsize = sab8253xn_listsize;
  1949. if(auraXX20n_name != 0)
  1950. {
  1951. #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)
  1952. auraXX20n_prototype.name = auraXX20n_name;
  1953. #else
  1954. strcpy(auraXX20n_prototype.name, auraXX20n_name);
  1955. #endif
  1956. }
  1957. /* find all multiport cards */
  1958. XX20lastpdev = NULL;
  1959. while(1)
  1960. {
  1961. boardptr = find_ati_multiport_card();
  1962. if(boardptr == NULL)
  1963. {
  1964. printk(KERN_ALERT 
  1965.        "auraXX20n: found %d AURAXX20 multiport device%s.n", 
  1966.        mp_probe_count, ((mp_probe_count == 1) ? "" : "s"));
  1967. break;
  1968. }
  1969. boardptr->nextboard = AuraBoardRoot;
  1970. AuraBoardRoot = boardptr;
  1971. printk(KERN_ALERT "auraXX20n: found AURAXX20 multiport device #%d.n",
  1972.        mp_probe_count);
  1973. ++mp_probe_count;
  1974. }
  1975. /* find all cpci cards */
  1976. XX20lastpdev = NULL;
  1977. while(1)
  1978. {
  1979. boardptr = find_ati_cpci_card();
  1980. if(boardptr == NULL)
  1981. {
  1982. printk(KERN_ALERT 
  1983.        "auraXX20n: found %d AURAXX20 CPCI device%s.n", 
  1984.        cp_probe_count, ((cp_probe_count == 1) ? "" : "s"));
  1985. break;
  1986. }
  1987. boardptr->nextboard = AuraBoardRoot;
  1988. AuraBoardRoot = boardptr;
  1989. printk(KERN_ALERT "auraXX20n: found AURAXX20 CPCI device #%d.n",
  1990.        cp_probe_count);
  1991. ++cp_probe_count;
  1992. }
  1993. /* find all WAN MS cards */
  1994. XX20lastpdev = NULL;
  1995. while(1)
  1996. {
  1997. boardptr = find_ati_wanms_card();
  1998. if(boardptr == NULL)
  1999. {
  2000. printk(KERN_ALERT 
  2001.        "auraXX20n: found %d AURAXX20 WANMS device%s.n", 
  2002.        wm_probe_count, ((wm_probe_count == 1) ? "" : "s"));
  2003. break;
  2004. }
  2005. boardptr->nextboard = AuraBoardRoot;
  2006. AuraBoardRoot = boardptr;
  2007. printk(KERN_ALERT "auraXX20n: found AURAXX20 WANMS device #%d.n",
  2008.        wm_probe_count);
  2009. ++wm_probe_count;
  2010. }
  2011. /* Now do the chips! */
  2012. for(boardptr = AuraBoardRoot; boardptr != NULL; boardptr = boardptr->nextboard)
  2013. {
  2014. SetupAllChips(boardptr); /* sets up the ports on the chips */
  2015. }
  2016. /* set up global driver structures
  2017.  * for async tty, call out device
  2018.  * for sync tty and for network device
  2019.  */
  2020. /* NOW TURN ON THE PLX INTS */
  2021. /* note all port ints (only receive right now)
  2022.  * are off */
  2023. /* interrupts cannot be turned on by port
  2024.    this seems to be the only sensible place
  2025.    to do it*/
  2026. /* only at this point is the number of
  2027.  * ttys to be created known. */
  2028. if(finish_sab8253x_setup_ttydriver() ==  -1) /* only as many termios are allocated */
  2029. /* as needed */
  2030. {
  2031. return 0;
  2032. }
  2033. for(portno = 0, portptr = AuraPortRoot; portptr != NULL; ++portno, portptr = portptr->next)
  2034. {
  2035. portptr->line = portno; /* set up the line number == minor dev associated with port */
  2036. portptr->sigmode = sab8253x_default_sp502_mode; 
  2037. /* if we have SP502s let getty work with RS232 by default */
  2038. /* unless overridden in module setup. */
  2039. }
  2040. /* Now lets set up the network devices */
  2041. for(portno = 0, portptr = AuraPortRoot; portptr != NULL; ++portno, portptr = portptr->next)
  2042. {
  2043. dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
  2044. if(!dev)
  2045. {
  2046. break;
  2047. }
  2048. memset(dev, 0, sizeof(struct net_device));
  2049. *dev = auraXX20n_prototype;
  2050. #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)
  2051. dev->name = kmalloc(IFNAMSIZ+1, GFP_KERNEL);
  2052. if(!dev->name)
  2053. {
  2054. kfree(dev);
  2055. break;
  2056. }
  2057. #endif
  2058. namelength = MIN(strlen(auraXX20n_prototype.name), IFNAMSIZ);
  2059. strcpy(dev->name, auraXX20n_prototype.name);
  2060. sprintf(&dev->name[namelength-1], "%3.3d", portno);
  2061. #if 1
  2062. current_sab_port = portptr;
  2063. #else
  2064. dev->priv = portptr;
  2065. #endif
  2066. result = register_netdev(dev);
  2067. if(result)
  2068. { /* if we run into some internal kernel limit */
  2069. break;
  2070. }
  2071. printk(KERN_ALERT "sab8253xn: found sab8253x network device #%d.n",
  2072.        portno);
  2073. }
  2074. printk(KERN_ALERT 
  2075.        "sab8253xn: found %d sab8253x network device%s.n", 
  2076.        portno, ((portno == 1) ? "" : "s"));
  2077. /* Now lets set up the character device */
  2078. if(sab8253xc_name)
  2079. {
  2080. result = register_chrdev(sab8253xc_major, sab8253xc_name, &sab8253xc_fops);
  2081. if(result < 0)
  2082. {
  2083. sab8253xc_major = result;
  2084. printk(KERN_ALERT "Could not install sab8253xc device.n");
  2085. }
  2086. else if(result > 0)
  2087. {
  2088. sab8253xc_major = result;
  2089. }
  2090. }
  2091. for(boardptr = AuraBoardRoot; boardptr != NULL; boardptr = boardptr->nextboard)
  2092. { /* let's set up port interrupt lists */
  2093. intr_val = boardptr->b_irq;
  2094. if((intr_val < 0) || (intr_val >= NUMINTS))
  2095. {
  2096. printk(KERN_ALERT "sab8253xn:  bad interrupt %i board %p.n", intr_val, boardptr);
  2097. continue;
  2098. }
  2099. switch(boardptr->b_type)
  2100. {
  2101. case BD_WANMCS:
  2102. boardptr->next_on_interrupt = AuraBoardMCSIrqRoot[intr_val];
  2103. AuraBoardMCSIrqRoot[intr_val] = boardptr;
  2104. break;
  2105. case BD_8520P:
  2106. case BD_8520CP:
  2107. boardptr->next_on_interrupt = AuraBoardESCC8IrqRoot[intr_val];
  2108. AuraBoardESCC8IrqRoot[intr_val] = boardptr;
  2109. break;
  2110. default:
  2111. boardptr->next_on_interrupt = AuraBoardESCC2IrqRoot[intr_val];
  2112. AuraBoardESCC2IrqRoot[intr_val] = boardptr;
  2113. break;
  2114. }
  2115. }
  2116. for(intr_val = 0; intr_val < NUMINTS; ++intr_val) /* trying to install as few int handlers as possible */
  2117. { /* one for each group of boards on a given irq */
  2118. if((AuraBoardESCC2IrqRoot[intr_val] != NULL) || (AuraBoardESCC8IrqRoot[intr_val] != NULL) ||
  2119.    (AuraBoardMCSIrqRoot[intr_val] != NULL))
  2120. {
  2121. if (request_irq(intr_val, sab8253x_interrupt, SA_SHIRQ,
  2122. "sab8253x", &AuraBoardESCC2IrqRoot[intr_val]) == 0) 
  2123. /* interrupts on perboard basis
  2124.  * cycle through chips and then
  2125.  * ports */
  2126. /* NOTE PLX INTS ARE OFF -- so turn them on */
  2127. {
  2128. for(boardptr = AuraBoardESCC2IrqRoot[intr_val]; boardptr != NULL; 
  2129.     boardptr = boardptr->next_on_interrupt)
  2130. {
  2131. writel(PLX_INT_ON, &(boardptr->b_bridge->intr));
  2132. }
  2133. for(boardptr = AuraBoardESCC8IrqRoot[intr_val]; boardptr != NULL; 
  2134.     boardptr = boardptr->next_on_interrupt)
  2135. {
  2136. writel(PLX_INT_ON, &(boardptr->b_bridge->intr));
  2137. }
  2138. for(boardptr = AuraBoardMCSIrqRoot[intr_val]; boardptr != NULL; 
  2139.     boardptr = boardptr->next_on_interrupt)
  2140. {
  2141. /* write to the MIC csr to reset the PCI interrupt */
  2142. writeb(0, (unsigned char*)(boardptr->MICCMD_REG +  MICCMD_MICCSR));
  2143. /* now, write to the CIM interrupt ena to re-enable interrupt generation */
  2144. writeb(0, (unsigned char*)(boardptr->CIMCMD_REG + CIMCMD_WRINTENA));
  2145. /* now, activate PCI interrupts */
  2146. writel(AMCC_AOINTPINENA, (unsigned int*)(boardptr->AMCC_REG + AMCC_INTCSR));
  2147. }
  2148. }
  2149. else
  2150. {
  2151. printk(KERN_ALERT "Unable to get interrupt, board set up not complete %i.n", intr_val);
  2152. }
  2153. }
  2154. }
  2155. /* all done!  a lot of work */
  2156. #if !defined(MODULE) && (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0))
  2157. return -1; /* otherwise 2.2 probe uses up
  2158.  * a default device structure*/
  2159. #else
  2160. return 0;
  2161. #endif
  2162. }
  2163. #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)
  2164. #ifdef MODULE
  2165. /* cleanup module/free up virtual memory */
  2166. /* space*/
  2167. void cleanup_module(void)
  2168. #endif
  2169. #else
  2170. void auraXX20_cleanup(void)
  2171. #endif
  2172. {
  2173. SAB_BOARD *boardptr;
  2174. SAB_CHIP *chipptr;
  2175. SAB_PORT *portptr;
  2176. AURA_CIM *cimptr;
  2177. int intr_val;
  2178. extern void sab8253x_cleanup_ttydriver(void);
  2179. printk(KERN_ALERT "auraXX20n: unloading AURAXX20 driver.n");
  2180. sab8253x_cleanup_ttydriver(); /* clean up tty */
  2181. /* unallocate and turn off ints */
  2182. for(intr_val = 0; intr_val < NUMINTS; ++intr_val)
  2183. {
  2184. if((AuraBoardESCC2IrqRoot[intr_val] != NULL) || (AuraBoardESCC8IrqRoot[intr_val] != NULL) ||
  2185.    (AuraBoardMCSIrqRoot[intr_val] != NULL))
  2186. {
  2187. for(boardptr = AuraBoardESCC2IrqRoot[intr_val]; boardptr != NULL; 
  2188.     boardptr = boardptr->next_on_interrupt)
  2189. {
  2190. writel(PLX_INT_OFF, &(boardptr->b_bridge->intr));
  2191. }
  2192. for(boardptr = AuraBoardESCC8IrqRoot[intr_val]; boardptr != NULL; 
  2193.     boardptr = boardptr->next_on_interrupt)
  2194. {
  2195. writel(PLX_INT_OFF, &(boardptr->b_bridge->intr));
  2196. }
  2197. for(boardptr = AuraBoardMCSIrqRoot[intr_val]; boardptr != NULL; 
  2198.     boardptr = boardptr->next_on_interrupt)
  2199. {
  2200. writel(AMCC_INT_OFF, (unsigned int*)(boardptr->AMCC_REG + AMCC_INTCSR));
  2201. (void) wanmcs_reset(boardptr);
  2202. writel(AMCC_INT_OFF, (unsigned int*)(boardptr->AMCC_REG + AMCC_INTCSR));
  2203. }
  2204. free_irq(intr_val, &AuraBoardESCC2IrqRoot[intr_val]); /* free up board int
  2205.        * note that if two boards
  2206.        * share an int, two int
  2207.        * handlers were registered
  2208.        * 
  2209.        */
  2210. }
  2211. }
  2212. /* disable chips and free board memory*/
  2213. while(AuraBoardRoot)
  2214. {
  2215. boardptr = AuraBoardRoot;
  2216. for(chipptr = boardptr->board_chipbase; chipptr != NULL; chipptr = chipptr->next_by_board)
  2217. {
  2218. (*chipptr->int_disable)(chipptr); /* make sure no ints can come int */
  2219. }
  2220. AuraBoardRoot = boardptr->nextboard;
  2221. if(boardptr->b_type == BD_WANMCS)
  2222. {
  2223. if(boardptr->virtbaseaddress0 != 0)
  2224. {
  2225. DEBUGPRINT((KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  2226.     (void*)boardptr->virtbaseaddress0));
  2227. iounmap((void*)boardptr->virtbaseaddress0);
  2228. boardptr->virtbaseaddress0 = 0;
  2229. }
  2230. if(boardptr->virtbaseaddress1 != 0)
  2231. {
  2232. DEBUGPRINT((KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  2233.     (void*)boardptr->virtbaseaddress1));
  2234. iounmap((void*)boardptr->virtbaseaddress1);
  2235. boardptr->virtbaseaddress1 = 0;
  2236. }
  2237. if(boardptr->virtbaseaddress2 != 0)
  2238. {
  2239. DEBUGPRINT((KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  2240.     (void*)boardptr->virtbaseaddress2));
  2241. iounmap((void*)boardptr->virtbaseaddress2);
  2242. boardptr->virtbaseaddress2 = 0;
  2243. }
  2244. if(boardptr->virtbaseaddress3 != 0)
  2245. {
  2246. DEBUGPRINT((KERN_ALERT "auraXX20n: unmapping virtual address %p.n",
  2247.     (void*)boardptr->virtbaseaddress3));
  2248. iounmap((void*)boardptr->virtbaseaddress3);
  2249. boardptr->virtbaseaddress3 = 0;
  2250. }
  2251. }
  2252. else /* everything but wan multichannel servers */
  2253. {
  2254. if(boardptr->virtbaseaddress0)
  2255. {
  2256. DEBUGPRINT((KERN_ALERT
  2257.     "auraXX20n: unmapping virtual address %p.n", 
  2258.     (void*)boardptr->virtbaseaddress0));
  2259. iounmap((void*)boardptr->virtbaseaddress0);
  2260. boardptr->virtbaseaddress0 = 0;
  2261. }
  2262. if(boardptr->virtbaseaddress2)
  2263. {
  2264. DEBUGPRINT((KERN_ALERT
  2265.     "auraXX20n: unmapping virtual address %p.n", 
  2266.     (void*)boardptr->virtbaseaddress2));
  2267. iounmap((void*)boardptr->virtbaseaddress2);
  2268. boardptr->virtbaseaddress2 = 0;
  2269. }
  2270. }
  2271. kfree(boardptr);
  2272. }
  2273. while(AuraCimRoot)
  2274. {
  2275. cimptr = AuraCimRoot;
  2276. AuraCimRoot = cimptr->next;
  2277. kfree(cimptr);
  2278. }
  2279. while(AuraChipRoot) /* free chip memory */
  2280. {
  2281. chipptr = AuraChipRoot;
  2282. AuraChipRoot = chipptr->next;
  2283. kfree(chipptr);
  2284. }
  2285. if(sab8253xc_name && (sab8253xc_major > 0)) /* unregister the chr device */
  2286. {
  2287. unregister_chrdev(sab8253xc_major, sab8253xc_name);
  2288. }
  2289. while(Sab8253xRoot) /* free up network stuff */
  2290. {
  2291. SAB_PORT *priv;
  2292. priv = (SAB_PORT *)Sab8253xRoot->priv;
  2293. unregister_netdev(Sab8253xRoot);
  2294. #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)
  2295. kfree(Sab8253xRoot.name);
  2296. #endif
  2297. kfree(Sab8253xRoot);
  2298. Sab8253xRoot = priv->next_dev;
  2299. }
  2300. while(AuraPortRoot) /* free up port memory */
  2301. {
  2302. portptr = AuraPortRoot;
  2303. AuraPortRoot = portptr->next;
  2304. if(portptr->dcontrol2.receive)
  2305. {
  2306. kfree(portptr->dcontrol2.receive);
  2307. }
  2308. if(portptr->dcontrol2.transmit)
  2309. {
  2310. kfree(portptr->dcontrol2.transmit);
  2311. }
  2312. kfree(portptr);
  2313. }
  2314. }
  2315. /*
  2316.  * Hardware dependent read and write functions.
  2317.  * We have functions to write/read a byte, write/read
  2318.  * a word and read and write the FIFO
  2319.  */
  2320. /***************************************************************************
  2321.  * aura_readb:    Function to read a byte on a 4X20P, 8X20P or Sun serial
  2322.  *                
  2323.  *
  2324.  *     Parameters   : 
  2325.  *                   port: The port being accessed
  2326.  *                   reg: The address of the register
  2327.  *
  2328.  *     Return value : The value of the register. 
  2329.  *
  2330.  *     Prerequisite : The port must have been opened
  2331.  *
  2332.  *     Remark       : 
  2333.  *
  2334.  *     Author       : fw
  2335.  *
  2336.  *     Revision     : Oct 10 2000, creation
  2337.  ***************************************************************************/
  2338. static unsigned char aura_readb(struct sab_port *port, unsigned char *reg) 
  2339. {
  2340. return readb(reg);
  2341. }
  2342. /***************************************************************************
  2343.  * aura_writeb:    Function to write a byte on a 4X20P, 8X20P or Sun serial
  2344.  *                
  2345.  *
  2346.  *     Parameters   : 
  2347.  *                   port: The port being accessed
  2348.  *                   reg:  The address of the register
  2349.  *                   val:  The value to put into the register
  2350.  *
  2351.  *     Return value : None
  2352.  *
  2353.  *     Prerequisite : The port must have been opened
  2354.  *
  2355.  *     Remark       : 
  2356.  *
  2357.  *     Author       : fw
  2358.  *
  2359.  *     Revision     : Oct 10 2000, creation
  2360.  ***************************************************************************/
  2361. static void aura_writeb(struct sab_port *port, unsigned char *reg,unsigned char val) 
  2362. {
  2363. writeb(val,reg);
  2364. }
  2365. /***************************************************************************
  2366.  * aura_readw:    Function to read a word on a 4X20P, 8X20P or Sun serial
  2367.  *                
  2368.  *
  2369.  *     Parameters   : 
  2370.  *                   port: The port being accessed
  2371.  *                   reg: The address of the hw memory to access
  2372.  *
  2373.  *     Return value : The value of the memory area. 
  2374.  *
  2375.  *     Prerequisite : The port must have been opened
  2376.  *
  2377.  *     Remark       : 
  2378.  *
  2379.  *     Author       : fw
  2380.  *
  2381.  *     Revision     : Oct 10 2000, creation
  2382.  ***************************************************************************/
  2383. static unsigned short aura_readw(struct sab_port *port, unsigned short *reg) 
  2384. {
  2385. return readw(reg);
  2386. }
  2387. /***************************************************************************
  2388.  * aura_writew:    Function to write a word on a 4X20P, 8X20P or Sun serial
  2389.  *                
  2390.  *
  2391.  *     Parameters   : 
  2392.  *                   port: The port being accessed
  2393.  *                   reg:  The address of the hw memory to access
  2394.  *                   val:  The value to put into the register
  2395.  *
  2396.  *     Return value : The value of the memory area. 
  2397.  *
  2398.  *     Prerequisite : The port must have been opened
  2399.  *
  2400.  *     Remark       : 
  2401.  *
  2402.  *     Author       : fw
  2403.  *
  2404.  *     Revision     : Oct 10 2000, creation
  2405.  ***************************************************************************/
  2406. static void aura_writew(struct sab_port *port, unsigned short *reg,unsigned short val) 
  2407. {
  2408. writew(val,reg);
  2409. }
  2410. /***************************************************************************
  2411.  * aura_readfifo:    Function to read the FIFO on a 4X20P, 8X20P or Sun serial
  2412.  *                
  2413.  *
  2414.  *     Parameters   : 
  2415.  *                   port:  The port being accessed
  2416.  *                   buf:   The address of a buffer where we should put
  2417.  *                          what we read
  2418.  *                  nbytes: How many chars to read.
  2419.  *
  2420.  *     Return value : none
  2421.  *
  2422.  *     Prerequisite : The port must have been opened
  2423.  *
  2424.  *     Remark       : 
  2425.  *
  2426.  *     Author       : fw
  2427.  *
  2428.  *     Revision     : Oct 13 2000, creation
  2429.  ***************************************************************************/
  2430. static void aura_readfifo(struct sab_port *port, unsigned char *buf, unsigned int nbytes) 
  2431. {
  2432. int i;
  2433. unsigned short *wptr = (unsigned short*) buf;
  2434. int nwords = ((nbytes+1)/2);
  2435. for(i = 0; i < nwords; i ++) 
  2436. {
  2437. wptr[i] = readw(((unsigned short *)port->regs));
  2438. }
  2439. }
  2440. /***************************************************************************
  2441.  * aura_writefifo:    Function to write the FIFO on a 4X20P, 8X20P or Sun serial
  2442.  *                
  2443.  *
  2444.  *     Parameters   : 
  2445.  *                   port:  The port being accessed
  2446.  *
  2447.  *     Return value : none
  2448.  *
  2449.  *     Prerequisite : The port must have been opened
  2450.  *
  2451.  *     Remark       : 
  2452.  *
  2453.  *     Author       : fw
  2454.  *
  2455.  *     Revision     : Oct 13 2000, creation
  2456.  ***************************************************************************/
  2457. static void aura_writefifo(struct sab_port *port) 
  2458. {
  2459. int i,max,maxw;
  2460. unsigned short *wptr;
  2461. unsigned char buffer[32];
  2462. if(port->xmit_cnt <= 0)
  2463. {
  2464. return; 
  2465. }
  2466. max= (port->xmit_fifo_size < port->xmit_cnt) ? port->xmit_fifo_size : port->xmit_cnt;
  2467. for (i = 0; i < max; i++) 
  2468. {
  2469. buffer[i] = port->xmit_buf[port->xmit_tail++];
  2470. port->xmit_tail &= (SAB8253X_XMIT_SIZE - 1);
  2471. port->icount.tx++;
  2472. port->xmit_cnt--;
  2473. }
  2474. maxw = max/2;
  2475. wptr = (unsigned short*) buffer;
  2476. for(i = 0; i < maxw; ++i)
  2477. {
  2478. writew(wptr[i], (unsigned short *)port->regs);
  2479. }
  2480. if(max & 1)
  2481. {
  2482. writeb(buffer[max-1], (unsigned char*)port->regs);
  2483. }
  2484. }
  2485. /***************************************************************************
  2486.  * wmsaura_readb:    Function to read a byte on a LMS, WMS
  2487.  *                
  2488.  *
  2489.  *     Parameters   : 
  2490.  *                   port: The port being accessed
  2491.  *                   reg: The address of the register
  2492.  *
  2493.  *     Return value : The value of the register. 
  2494.  *
  2495.  *     Prerequisite : The port must have been opened
  2496.  *
  2497.  *     Remark       : TO BE IMPLEMENTED 
  2498.  *
  2499.  *     Author       : fw
  2500.  *
  2501.  *     Revision     : Oct 10 2000, creation
  2502.  ***************************************************************************/
  2503. static unsigned char wmsaura_readb(struct sab_port *port, unsigned char *reg) 
  2504. {
  2505. return readb((unsigned char*) (((unsigned int) reg) + CIMCMD_RDREGB));
  2506. }
  2507. /***************************************************************************
  2508.  * wmsaura_writeb:    Function to write a byte on a LMS, WMS
  2509.  *                
  2510.  *
  2511.  *     Parameters   : 
  2512.  *                   port: The port being accessed
  2513.  *                   reg:  The address of the register
  2514.  *                   val:  The value to put into the register
  2515.  *
  2516.  *     Return value : None
  2517.  *
  2518.  *     Prerequisite : The port must have been opened
  2519.  *
  2520.  *     Remark       : TO BE IMPLEMENTED
  2521.  *
  2522.  *     Author       : fw
  2523.  *
  2524.  *     Revision     : Oct 10 2000, creation
  2525.  ***************************************************************************/
  2526. static void wmsaura_writeb(struct sab_port *port, unsigned char *reg,unsigned char val) 
  2527. {
  2528. writeb(val, (unsigned char*) (((unsigned int) reg) + CIMCMD_WRREGB));
  2529. }
  2530. /***************************************************************************
  2531.  * wmsaura_readw:    Function to read a word on a LMS, WMS
  2532.  *                
  2533.  *
  2534.  *     Parameters   : 
  2535.  *                   port: The port being accessed
  2536.  *                   reg: The address of the hw memory to access
  2537.  *
  2538.  *     Return value : The value of the memory area. 
  2539.  *
  2540.  *     Prerequisite : The port must have been opened
  2541.  *
  2542.  *     Remark       : TO BE IMPLEMENTED
  2543.  *
  2544.  *     Author       : fw
  2545.  *
  2546.  *     Revision     : Oct 10 2000, creation
  2547.  ***************************************************************************/
  2548. static unsigned short wmsaura_readw(struct sab_port *port, unsigned short *reg) 
  2549. {
  2550. unsigned short readval;
  2551. unsigned int address;
  2552. address = (unsigned int) reg;
  2553. readval =  readb((unsigned char*) (address + CIMCMD_RDREGB));
  2554. ++address;
  2555. return (readval | (readb((unsigned char*) (address + CIMCMD_RDREGB)) << 8));
  2556. }
  2557. /***************************************************************************
  2558.  * wmsaura_writew:    Function to write a word on a LMS, WMS
  2559.  *                
  2560.  *
  2561.  *     Parameters   : 
  2562.  *                   port: The port being accessed
  2563.  *                   reg:  The address of the hw memory to access
  2564.  *                   val:  The value to put into the register
  2565.  *
  2566.  *     Return value : The value of the memory area. 
  2567.  *
  2568.  *     Prerequisite : The port must have been opened
  2569.  *
  2570.  *     Remark       : TO BE IMPLEMENTED
  2571.  *
  2572.  *     Author       : fw
  2573.  *
  2574.  *     Revision     : Oct 10 2000, creation
  2575.  ***************************************************************************/
  2576. static void wmsaura_writew(struct sab_port *port, unsigned short *reg, unsigned short val) 
  2577. {
  2578. unsigned char vallow;
  2579. unsigned char valhigh;
  2580. unsigned int address;
  2581. address = (unsigned int) reg;
  2582. vallow = (unsigned char) val;
  2583. valhigh = (unsigned char) (val >> 8);
  2584. writeb(vallow, (unsigned char*) (address + CIMCMD_WRREGB));
  2585. ++address;
  2586. writeb(valhigh, (unsigned char*) (address + CIMCMD_WRREGB));
  2587. }
  2588. static void wmsaura_readfifo(struct sab_port *port, unsigned char *buf, unsigned int nbytes) 
  2589. {
  2590. #ifdef FIFO_DIRECT
  2591. unsigned short fifo[32/2]; /* this array is word aligned
  2592.  * buf may not be word aligned*/
  2593. unsigned int nwords;
  2594. int i;
  2595. int wcount;
  2596. unsigned int address;
  2597. if (nbytes == 0) 
  2598. {
  2599. return;
  2600. }
  2601. wcount = ((nbytes + 1) >> 1);
  2602. /* Read the thing into the local FIFO and copy it out. */
  2603. address = (unsigned int) port->regs;
  2604. for(i = 0; i < wcount; ++i)
  2605. {
  2606. fifo[i] = readw((unsigned short*)(address + CIMCMD_RDFIFOW));
  2607. }
  2608. memcpy((unsigned char*) buf, (unsigned char*) &(fifo[0]), (unsigned int) nbytes);
  2609. #else /* FIFO_DIRECT */
  2610. unsigned short fifo[32/2];
  2611. int i;
  2612. int wcount;
  2613. SAB_BOARD *bptr;
  2614. unsigned int channel;
  2615. if (nbytes == 0) 
  2616. {
  2617. return;
  2618. }
  2619. bptr = port->board;
  2620. wcount = ((nbytes + 1) >> 1);
  2621. channel = (((unsigned char*) port->regs) - bptr->CIMCMD_REG); /* should be properly shifted */
  2622. /*
  2623.  * Trigger a cache read by writing the nwords - 1 to the
  2624.  *  magic place.
  2625.  */
  2626. writeb((unsigned char) wcount, bptr->MICCMD_REG + (MICCMD_CACHETRIG + channel));
  2627. /*
  2628.  * Now, read out the contents.
  2629.  */
  2630. channel >>= 1;
  2631. for(i = 0; i < wcount; ++i)
  2632. {
  2633. fifo[i] = readw((unsigned short*)(bptr->FIFOCACHE_REG + (channel + (i << 1))));
  2634. }
  2635. memcpy((unsigned char*) buf, (unsigned char*) &(fifo[0]), (unsigned int) nbytes);
  2636. #endif /* !FIFO_DIRECT */
  2637. }
  2638. static void wmsaura_writefifo(struct sab_port *port)
  2639. {
  2640. unsigned short fifo[32/2];
  2641. unsigned char* fifob = (unsigned char*) fifo;
  2642. int i,max;
  2643. int wcount;
  2644. unsigned int address;
  2645. if(port->xmit_cnt <= 0) 
  2646. {
  2647. return; 
  2648. }
  2649. max = (port->xmit_fifo_size < port->xmit_cnt) ? port->xmit_fifo_size:port->xmit_cnt;
  2650. for (i = 0; i < max; i++) 
  2651. {
  2652. fifob[i] = port->xmit_buf[port->xmit_tail++];
  2653. port->xmit_tail &= (SAB8253X_XMIT_SIZE - 1);
  2654. port->icount.tx++;
  2655. port->xmit_cnt--;
  2656. }
  2657. wcount = (max >> 1);
  2658. /* Copy from the linear local FIFO into the hardware fifo. */
  2659. address = (unsigned int) port->regs;
  2660. for(i = 0; i < wcount; ++i)
  2661. {
  2662. writew(fifo[i], (unsigned short*)(address + CIMCMD_WRFIFOW));
  2663. }
  2664. if(max & 1) /* odd byte */
  2665. {
  2666. --max;
  2667. writeb(fifob[max], (unsigned short*)(address + CIMCMD_WRFIFOB));
  2668. }
  2669. }
  2670. module_init(auraXX20_probe);
  2671. module_exit(auraXX20_cleanup);
  2672. MODULE_DESCRIPTION("Aurora Multiport Multiprotocol Serial Driver");
  2673. MODULE_AUTHOR("Joachim Martillo <martillo@telfordtools.com>");