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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * SDL Inc. RISCom/N2 synchronous serial card driver for Linux
  3.  *
  4.  * Copyright (C) 1998-2000 Krzysztof Halasa <khc@pm.waw.pl>
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * For information see http://hq.pm.waw.pl/hdlc/
  12.  *
  13.  * Note: integrated CSU/DSU/DDS are not supported by this driver
  14.  *
  15.  * Sources of information:
  16.  *    Hitachi HD64570 SCA User's Manual
  17.  *    SDL Inc. PPP/HDLC/CISCO driver
  18.  */
  19. #include <linux/module.h>
  20. #include <linux/kernel.h>
  21. #include <linux/slab.h>
  22. #include <linux/sched.h>
  23. #include <linux/types.h>
  24. #include <linux/fcntl.h>
  25. #include <linux/in.h>
  26. #include <linux/string.h>
  27. #include <linux/errno.h>
  28. #include <linux/init.h>
  29. #include <linux/ioport.h>
  30. #include <linux/netdevice.h>
  31. #include <linux/hdlc.h>
  32. #include <asm/io.h>
  33. #include "hd64570.h"
  34. #define DEBUG_RINGS
  35. /* #define DEBUG_PKT */
  36. static const char* version = "SDL RISCom/N2 driver revision: 1.02 for Linux 2.4";
  37. static const char* devname = "RISCom/N2";
  38. #define USE_WINDOWSIZE 16384
  39. #define USE_BUS16BITS 1
  40. #define CLOCK_BASE 9830400 /* 9.8304 MHz */
  41. #define N2_IOPORTS 0x10
  42. static char *hw = NULL; /* pointer to hw=xxx command line string */
  43. /* RISCom/N2 Board Registers */
  44. /* PC Control Register */
  45. #define N2_PCR 0
  46. #define PCR_RUNSCA 1     /* Run 64570 */
  47. #define PCR_VPM    2     /* Enable VPM - needed if using RAM above 1 MB */
  48. #define PCR_ENWIN  4     /* Open window */
  49. #define PCR_BUS16  8     /* 16-bit bus */
  50. /* Memory Base Address Register */
  51. #define N2_BAR 2
  52. /* Page Scan Register  */
  53. #define N2_PSR 4
  54. #define WIN16K       0x00
  55. #define WIN32K       0x20
  56. #define WIN64K       0x40
  57. #define PSR_WINBITS  0x60
  58. #define PSR_DMAEN    0x80
  59. #define PSR_PAGEBITS 0x0F
  60. /* Modem Control Reg */
  61. #define N2_MCR 6
  62. #define CLOCK_OUT_PORT1 0x80
  63. #define CLOCK_OUT_PORT0 0x40
  64. #define TX422_PORT1     0x20
  65. #define TX422_PORT0     0x10
  66. #define DSR_PORT1       0x08
  67. #define DSR_PORT0       0x04
  68. #define DTR_PORT1       0x02
  69. #define DTR_PORT0       0x01
  70. typedef struct port_s {
  71. hdlc_device hdlc; /* HDLC device struct - must be first */
  72. struct card_s *card;
  73. spinlock_t lock; /* TX lock */
  74. int clkmode; /* clock mode */
  75. int clkrate; /* clock rate */
  76. int line; /* loopback only */
  77. u8 rxs, txs, tmc; /* SCA registers */
  78. u8 valid; /* port enabled */
  79. u8 phy_node; /* physical port # - 0 or 1 */
  80. u8 log_node; /* logical port # */
  81. u8 rxin; /* rx ring buffer 'in' pointer */
  82. u8 txin; /* tx ring buffer 'in' and 'last' pointers */
  83. u8 txlast;
  84. u8 rxpart; /* partial frame received, next frame invalid*/
  85. }port_t;
  86. typedef struct card_s {
  87. u8 *winbase; /* ISA window base address */
  88. u32 phy_winbase; /* ISA physical base address */
  89. u32 ram_size; /* number of bytes */
  90. u16 io; /* IO Base address */
  91. u16 buff_offset; /* offset of first buffer of first channel */
  92. u8 irq; /* IRQ (3-15) */
  93. u8 ring_buffers; /* number of buffers in a ring */
  94. port_t ports[2];
  95. struct card_s *next_card;
  96. }card_t;
  97. #define sca_reg(reg, card) (0x8000 | (card)->io | 
  98.     ((reg) & 0x0F) | (((reg) & 0xF0) << 6))
  99. #define sca_in(reg, card) inb(sca_reg(reg, card))
  100. #define sca_out(value, reg, card) outb(value, sca_reg(reg, card))
  101. #define sca_inw(reg, card) inw(sca_reg(reg, card))
  102. #define sca_outw(value, reg, card) outw(value, sca_reg(reg, card))
  103. #define port_to_card(port) ((port)->card)
  104. #define log_node(port) ((port)->log_node)
  105. #define phy_node(port) ((port)->phy_node)
  106. #define winsize(card) (USE_WINDOWSIZE)
  107. #define winbase(card)             ((card)->winbase)
  108. #define get_port(card, port) ((card)->ports[port].valid ? 
  109.  &(card)->ports[port] : NULL)
  110. static __inline__ u8 sca_get_page(card_t *card)
  111. {
  112. return inb(card->io + N2_PSR) & PSR_PAGEBITS;
  113. }
  114. static __inline__ void openwin(card_t *card, u8 page)
  115. {
  116. u8 psr = inb(card->io + N2_PSR);
  117. outb((psr & ~PSR_PAGEBITS) | page, card->io + N2_PSR);
  118. }
  119. static __inline__ void close_windows(card_t *card)
  120. {
  121. outb(inb(card->io + N2_PCR) & ~PCR_ENWIN, card->io + N2_PCR);
  122. }
  123. #include "hd6457x.c"
  124. static int n2_set_clock(port_t *port, int value)
  125. {
  126. card_t *card = port->card;
  127. int io = card->io;
  128. u8 mcr = inb(io + N2_MCR);
  129. u8 msci = get_msci(port);
  130. u8 rxs = port->rxs & CLK_BRG_MASK;
  131. u8 txs = port->txs & CLK_BRG_MASK;
  132. switch(value) {
  133. case CLOCK_EXT:
  134. mcr &= port->phy_node ? ~CLOCK_OUT_PORT1 : ~CLOCK_OUT_PORT0;
  135. rxs |= CLK_LINE_RX; /* RXC input */
  136. txs |= CLK_LINE_TX; /* TXC input */
  137. break;
  138. case CLOCK_INT:
  139. mcr |= port->phy_node ? CLOCK_OUT_PORT1 : CLOCK_OUT_PORT0;
  140. rxs |= CLK_BRG_RX; /* BRG output */
  141. txs |= CLK_RXCLK_TX; /* RX clock */
  142. break;
  143. case CLOCK_TXINT:
  144. mcr |= port->phy_node ? CLOCK_OUT_PORT1 : CLOCK_OUT_PORT0;
  145. rxs |= CLK_LINE_RX; /* RXC input */
  146. txs |= CLK_BRG_TX; /* BRG output */
  147. break;
  148. case CLOCK_TXFROMRX:
  149. mcr |= port->phy_node ? CLOCK_OUT_PORT1 : CLOCK_OUT_PORT0;
  150. rxs |= CLK_LINE_RX; /* RXC input */
  151. txs |= CLK_RXCLK_TX; /* RX clock */
  152. break;
  153. default:
  154. return -EINVAL;
  155. }
  156. outb(mcr, io + N2_MCR);
  157. port->rxs = rxs;
  158. port->txs = txs;
  159. sca_out(rxs, msci + RXS, card);
  160. sca_out(txs, msci + TXS, card);
  161. port->clkmode = value;
  162. return 0;
  163. }
  164. static int n2_open(hdlc_device *hdlc)
  165. {
  166. port_t *port = hdlc_to_port(hdlc);
  167. int io = port->card->io;
  168. u8 mcr = inb(io + N2_MCR) | (port->phy_node ? TX422_PORT1 : TX422_PORT0);
  169. MOD_INC_USE_COUNT;
  170. mcr &= port->phy_node ? ~DTR_PORT1 : ~DTR_PORT0; /* set DTR ON */
  171. outb(mcr, io + N2_MCR);
  172.   
  173. outb(inb(io + N2_PCR) | PCR_ENWIN, io + N2_PCR); /* open window */
  174. outb(inb(io + N2_PSR) | PSR_DMAEN, io + N2_PSR); /* enable dma */
  175. sca_open(hdlc);
  176. n2_set_clock(port, port->clkmode);
  177. return 0;
  178. }
  179. static void n2_close(hdlc_device *hdlc)
  180. {
  181. port_t *port = hdlc_to_port(hdlc);
  182. int io = port->card->io;
  183. u8 mcr = inb(io+N2_MCR) | (port->phy_node ? TX422_PORT1 : TX422_PORT0);
  184. sca_close(hdlc);
  185. mcr |= port->phy_node ? DTR_PORT1 : DTR_PORT0; /* set DTR OFF */
  186. outb(mcr, io + N2_MCR);
  187. MOD_DEC_USE_COUNT;
  188. }
  189. static int n2_ioctl(hdlc_device *hdlc, struct ifreq *ifr, int cmd)
  190. {
  191. int value = ifr->ifr_ifru.ifru_ivalue;
  192. int result = 0;
  193. port_t *port = hdlc_to_port(hdlc);
  194. if(!capable(CAP_NET_ADMIN))
  195. return -EPERM;
  196. switch(cmd) {
  197. case HDLCSCLOCK:
  198. result = n2_set_clock(port, value);
  199. case HDLCGCLOCK:
  200. value = port->clkmode;
  201. break;
  202. case HDLCSCLOCKRATE:
  203. port->clkrate = value;
  204. sca_set_clock(port);
  205. case HDLCGCLOCKRATE:
  206. value = port->clkrate;
  207. break;
  208. case HDLCSLINE:
  209. result = sca_set_loopback(port, value);
  210. case HDLCGLINE:
  211. value = port->line;
  212. break;
  213. #ifdef DEBUG_RINGS
  214. case HDLCRUN:
  215. sca_dump_rings(hdlc);
  216. return 0;
  217. #endif /* DEBUG_RINGS */
  218. default:
  219. return -EINVAL;
  220. }
  221. ifr->ifr_ifru.ifru_ivalue = value;
  222. return result;
  223. }
  224. static u8 n2_count_page(card_t *card)
  225. {
  226. u8 page;
  227. int i, bcount = USE_WINDOWSIZE, wcount = USE_WINDOWSIZE/2;
  228. u16 *dp = (u16*)card->winbase;
  229. u8 *bp = (u8*)card->winbase;
  230. u8 psr = inb(card->io + N2_PSR) & PSR_WINBITS;
  231. for (page = 0; page < 16; page++) {
  232. outb(psr | page, card->io + N2_PSR); /* select a page */
  233. writeb(page, dp);
  234. if (readb(dp) != page)
  235. break; /* If can't read back, no good memory */
  236. outb(psr, card->io + N2_PSR); /* goto page 0 */
  237. if (readb(dp))
  238. break; /* If page 0 changed, then wrapped around */
  239. outb(psr | page, card->io + N2_PSR); /* select page again */
  240. /*  first do byte tests */
  241. for (i = 0; i < bcount; i++)
  242. writeb(i, bp + i);
  243. for (i = 0; i < bcount; i++)
  244. if (readb(bp + i) != (i & 0xff))
  245. return 0;
  246. for (i = 0; i < bcount; i++)
  247. writeb(~i, bp + i);
  248. for (i = 0; i < bcount; i++)
  249. if (readb(bp + i) != (~i & 0xff))
  250. return 0;
  251. /* next do 16-bit tests */
  252. for (i = 0; i < wcount; i++)
  253. writew(0x55AA, dp + i);
  254. for (i = 0; i < wcount; i++)
  255. if (readw(dp + i) != 0x55AA)
  256. return 0;
  257. for (i = 0; i < wcount; i++)
  258. writew(0xAA55, dp + i);
  259. for (i = 0; i < wcount; i++)
  260. if (readw(dp + i) != 0xAA55)
  261. return 0;
  262. for (i = 0; i < wcount; i++)
  263. writew(page, dp + i);
  264. }
  265. return page;
  266. }
  267. static void n2_destroy_card(card_t *card)
  268. {
  269. int cnt;
  270. for (cnt = 0; cnt < 2; cnt++)
  271. if (card->ports[cnt].card)
  272. unregister_hdlc_device(&card->ports[cnt].hdlc);
  273. if (card->irq)
  274. free_irq(card->irq, card);
  275. if (card->winbase) {
  276. iounmap(card->winbase);
  277. release_mem_region(card->phy_winbase, USE_WINDOWSIZE);
  278. }
  279. if (card->io)
  280. release_region(card->io, N2_IOPORTS);
  281. kfree(card);
  282. }
  283. static int n2_run(unsigned long io, unsigned long irq, unsigned long winbase,
  284.   long valid0, long valid1)
  285. {
  286. card_t *card;
  287. u8 cnt, pcr;
  288. if (io < 0x200 || io > 0x3FF || (io % N2_IOPORTS) != 0) {
  289. printk(KERN_ERR "n2: invalid I/O port valuen");
  290. return -ENODEV;
  291. }
  292. if (irq < 3 || irq > 15 || irq == 6) /* FIXME */ {
  293. printk(KERN_ERR "n2: invalid IRQ valuen");
  294. return -ENODEV;
  295. }
  296.     
  297. if (winbase < 0xA0000 || winbase > 0xFFFFF || (winbase & 0xFFF) != 0) {
  298. printk(KERN_ERR "n2: invalid RAM valuen");
  299. return -ENODEV;
  300. }
  301. card = kmalloc(sizeof(card_t), GFP_KERNEL);
  302. if (card == NULL) {
  303. printk(KERN_ERR "n2: unable to allocate memoryn");
  304. return -ENOBUFS;
  305. }
  306. memset(card, 0, sizeof(card_t));
  307. if (!request_region(io, N2_IOPORTS, devname)) {
  308. printk(KERN_ERR "n2: I/O port region in usen");
  309. n2_destroy_card(card);
  310. return -EBUSY;
  311. }
  312. card->io = io;
  313. if (request_irq(irq, &sca_intr, 0, devname, card)) {
  314. printk(KERN_ERR "n2: could not allocate IRQn");
  315. n2_destroy_card(card);
  316. return(-EBUSY);
  317. }
  318. card->irq = irq;
  319. if (!request_mem_region(winbase, USE_WINDOWSIZE, devname)) {
  320. printk(KERN_ERR "n2: could not request RAM windown");
  321. n2_destroy_card(card);
  322. return(-EBUSY);
  323. }
  324. card->phy_winbase = winbase;
  325. card->winbase = ioremap(winbase, USE_WINDOWSIZE);
  326. outb(0, io + N2_PCR);
  327. outb(winbase >> 12, io + N2_BAR);
  328. switch (USE_WINDOWSIZE) {
  329. case 16384:
  330. outb(WIN16K, io + N2_PSR);
  331. break;
  332. case 32768:
  333. outb(WIN32K, io + N2_PSR);
  334. break;
  335. case 65536:
  336. outb(WIN64K, io + N2_PSR);
  337. break;
  338. default:
  339. printk(KERN_ERR "n2: invalid window sizen");
  340. n2_destroy_card(card);
  341. return -ENODEV;
  342. }
  343. pcr = PCR_ENWIN | PCR_VPM | (USE_BUS16BITS ? PCR_BUS16 : 0);
  344. outb(pcr, io + N2_PCR);
  345. cnt = n2_count_page(card);
  346. if (!cnt) {
  347. printk(KERN_ERR "n2: memory test failed.n");
  348. n2_destroy_card(card);
  349. return -EIO;
  350. }
  351. card->ram_size = cnt * USE_WINDOWSIZE;
  352. /* 4 rings required for 2 ports, 2 rings for one port */
  353. card->ring_buffers = card->ram_size /
  354. ((valid0 + valid1) * 2 * (sizeof(pkt_desc) + HDLC_MAX_MRU));
  355. card->buff_offset = (valid0 + valid1) * 2 * (sizeof(pkt_desc))
  356. * card->ring_buffers;
  357. printk(KERN_DEBUG "n2: RISCom/N2 %u KB RAM, IRQ%u, "
  358.        "using %u packets ringsn", card->ram_size / 1024, card->irq,
  359.        card->ring_buffers);
  360. pcr |= PCR_RUNSCA; /* run SCA */
  361. outb(pcr, io + N2_PCR);
  362. outb(0, io + N2_MCR);
  363. sca_init(card, 0);
  364. for (cnt = 0; cnt < 2; cnt++) {
  365. port_t *port = &card->ports[cnt];
  366. if ((cnt == 0 && !valid0) || (cnt == 1 && !valid1))
  367. continue;
  368. port->phy_node = cnt;
  369. port->valid = 1;
  370. if ((cnt == 1) && valid0)
  371. port->log_node = 1;
  372. spin_lock_init(&port->lock);
  373. hdlc_to_dev(&port->hdlc)->irq = irq;
  374. hdlc_to_dev(&port->hdlc)->mem_start = winbase;
  375. hdlc_to_dev(&port->hdlc)->mem_end = winbase + USE_WINDOWSIZE-1;
  376. hdlc_to_dev(&port->hdlc)->tx_queue_len = 50;
  377. port->hdlc.ioctl = n2_ioctl;
  378. port->hdlc.open = n2_open;
  379. port->hdlc.close = n2_close;
  380. port->hdlc.xmit = sca_xmit;
  381. if (register_hdlc_device(&port->hdlc)) {
  382. printk(KERN_WARNING "n2: unable to register hdlc "
  383.        "devicen");
  384. n2_destroy_card(card);
  385. return -ENOBUFS;
  386. }
  387. port->card = card;
  388. sca_init_sync_port(port); /* Set up SCA memory */
  389. printk(KERN_INFO "%s: RISCom/N2 node %dn",
  390.        hdlc_to_name(&port->hdlc), port->phy_node);
  391. }
  392. *new_card = card;
  393. new_card = &card->next_card;
  394. return 0;
  395. }
  396. static int __init n2_init(void)
  397. {
  398. if (hw==NULL) {
  399. #ifdef MODULE
  400. printk(KERN_INFO "n2: no card initializedn");
  401. #endif
  402. return -ENOSYS; /* no parameters specified, abort */
  403. }
  404. printk(KERN_INFO "%sn", version);
  405. do {
  406. unsigned long io, irq, ram;
  407. long valid[2] = { 0, 0 }; /* Default = both ports disabled */
  408. io = simple_strtoul(hw, &hw, 0);
  409. if (*hw++ != ',')
  410. break;
  411. irq = simple_strtoul(hw, &hw, 0);
  412. if (*hw++ != ',')
  413. break;
  414. ram = simple_strtoul(hw, &hw, 0);
  415. if (*hw++ != ',')
  416. break;
  417. while(1) {
  418. if (*hw == '0' && !valid[0])
  419. valid[0] = 1; /* Port 0 enabled */
  420. else if (*hw == '1' && !valid[1])
  421. valid[1] = 1; /* Port 1 enabled */
  422. else
  423. break;
  424. hw++;
  425. }
  426.       
  427. if (!valid[0] && !valid[1])
  428. break; /* at least one port must be used */
  429. if (*hw == ':' || *hw == 'x0')
  430. n2_run(io, irq, ram, valid[0], valid[1]);
  431. if (*hw == 'x0')
  432. return 0;
  433. }while(*hw++ == ':');
  434. printk(KERN_ERR "n2: invalid hardware parametersn");
  435. return first_card ? 0 : -ENOSYS;
  436. }
  437. #ifndef MODULE
  438. static int __init n2_setup(char *str)
  439. {
  440. hw = str;
  441. return 1;
  442. }
  443. __setup("n2=", n2_setup);
  444. #endif
  445. static void __exit n2_cleanup(void)
  446. {
  447. card_t *card = first_card;
  448. while (card) {
  449. card_t *ptr = card;
  450. card = card->next_card;
  451. n2_destroy_card(ptr);
  452. }
  453. }
  454. module_init(n2_init);
  455. module_exit(n2_cleanup);
  456. MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>");
  457. MODULE_DESCRIPTION("RISCom/N2 serial port driver");
  458. MODULE_LICENSE("GPL");
  459. MODULE_PARM(hw, "s"); /* hw=io,irq,ram,ports:io,irq,... */
  460. EXPORT_NO_SYMBOLS;