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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Hitachi SCA HD64570 and HD64572 common 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.  * Sources of information:
  12.  *    Hitachi HD64570 SCA User's Manual
  13.  *    Hitachi HD64572 SCA-II User's Manual
  14.  */
  15. #include <linux/module.h>
  16. #include <linux/kernel.h>
  17. #include <linux/slab.h>
  18. #include <linux/sched.h>
  19. #include <linux/types.h>
  20. #include <linux/fcntl.h>
  21. #include <linux/interrupt.h>
  22. #include <linux/in.h>
  23. #include <linux/string.h>
  24. #include <linux/timer.h>
  25. #include <linux/errno.h>
  26. #include <linux/init.h>
  27. #include <linux/ioport.h>
  28. #include <asm/system.h>
  29. #include <asm/bitops.h>
  30. #include <asm/uaccess.h>
  31. #include <asm/io.h>
  32. #include <linux/netdevice.h>
  33. #include <linux/skbuff.h>
  34. #include <linux/hdlc.h>
  35. #if (!defined (__HD64570_H) && !defined (__HD64572_H)) || 
  36.     (defined (__HD64570_H) && defined (__HD64572_H))
  37. #error Either hd64570.h or hd64572.h must be included
  38. #endif
  39. static card_t *first_card;
  40. static card_t **new_card = &first_card;
  41. /* Maximum events to handle at each interrupt - should I increase it? */
  42. #define INTR_WORK 4
  43. #define get_msci(port)   (phy_node(port) ?   MSCI1_OFFSET :   MSCI0_OFFSET)
  44. #define get_dmac_rx(port) (phy_node(port) ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)
  45. #define get_dmac_tx(port) (phy_node(port) ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)
  46. #define SCA_INTR_MSCI(node)    (node ? 0x10 : 0x01)
  47. #define SCA_INTR_DMAC_RX(node) (node ? 0x20 : 0x02)
  48. #define SCA_INTR_DMAC_TX(node) (node ? 0x40 : 0x04)
  49. #ifdef __HD64570_H /* HD64570 */
  50. #define sca_outa(value, reg, card) sca_outw(value, reg, card)
  51. #define sca_ina(reg, card) sca_inw(reg, card)
  52. #define writea(value, ptr) writew(value, ptr)
  53. static inline int sca_intr_status(card_t *card)
  54. {
  55. u8 isr0 = sca_in(ISR0, card);
  56. u8 isr1 = sca_in(ISR1, card);
  57. u8 result = 0;
  58. if (isr1 & 0x03) result |= SCA_INTR_DMAC_RX(0);
  59. if (isr1 & 0x0C) result |= SCA_INTR_DMAC_TX(0);
  60. if (isr1 & 0x30) result |= SCA_INTR_DMAC_RX(1);
  61. if (isr1 & 0xC0) result |= SCA_INTR_DMAC_TX(1);
  62. if (isr0 & 0x0F) result |= SCA_INTR_MSCI(0);
  63. if (isr0 & 0xF0) result |= SCA_INTR_MSCI(1);
  64. return result;
  65. }
  66. #else /* HD64572 */
  67. #define sca_outa(value, reg, card) sca_outl(value, reg, card)
  68. #define sca_ina(reg, card) sca_inl(reg, card)
  69. #define writea(value, ptr) writel(value, ptr)
  70. static inline int sca_intr_status(card_t *card)
  71. {
  72. u32 isr0 = sca_inl(ISR0, card);
  73. u8 result = 0;
  74. if (isr0 & 0x0000000F) result |= SCA_INTR_DMAC_RX(0);
  75. if (isr0 & 0x000000F0) result |= SCA_INTR_DMAC_TX(0);
  76. if (isr0 & 0x00000F00) result |= SCA_INTR_DMAC_RX(1);
  77. if (isr0 & 0x0000F000) result |= SCA_INTR_DMAC_TX(1);
  78. if (isr0 & 0x003E0000) result |= SCA_INTR_MSCI(0);
  79. if (isr0 & 0x3E000000) result |= SCA_INTR_MSCI(1);
  80. return result;
  81. }
  82. #endif /* HD64570 vs HD64572 */
  83. static inline port_t* hdlc_to_port(hdlc_device *hdlc)
  84. {
  85. return (port_t*)hdlc;
  86. }
  87. static inline port_t* dev_to_port(struct net_device *dev)
  88. {
  89. return hdlc_to_port(dev_to_hdlc(dev));
  90. }
  91. static inline u8 next_desc(port_t *port, u8 desc)
  92. {
  93. return (desc + 1) % port_to_card(port)->ring_buffers;
  94. }
  95. static inline u16 desc_offset(port_t *port, u8 desc, u8 transmit)
  96. {
  97. /* Descriptor offset always fits in 16 bytes */
  98. u8 buffs = port_to_card(port)->ring_buffers;
  99. return ((log_node(port) * 2 + transmit) * buffs + (desc % buffs)) *
  100. sizeof(pkt_desc);
  101. }
  102. static inline pkt_desc* desc_address(port_t *port, u8 desc, u8 transmit)
  103. {
  104. #ifdef PAGE0_ALWAYS_MAPPED
  105. return (pkt_desc*)(win0base(port_to_card(port))
  106.    + desc_offset(port, desc, transmit));
  107. #else
  108. return (pkt_desc*)(winbase(port_to_card(port))
  109.    + desc_offset(port, desc, transmit));
  110. #endif
  111. }
  112. static inline u32 buffer_offset(port_t *port, u8 desc, u8 transmit)
  113. {
  114. u8 buffs = port_to_card(port)->ring_buffers;
  115. return port_to_card(port)->buff_offset +
  116. ((log_node(port) * 2 + transmit) * buffs + (desc % buffs)) *
  117. (u32)HDLC_MAX_MRU;
  118. }
  119. static void sca_init_sync_port(port_t *port)
  120. {
  121. card_t *card = port_to_card(port);
  122. u8 transmit, i;
  123. u16 dmac, buffs = card->ring_buffers;
  124. port->rxin = 0;
  125. port->txin = 0;
  126. port->txlast = 0;
  127. #if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED)
  128. openwin(card, 0);
  129. #endif
  130. for (transmit = 0; transmit < 2; transmit++) {
  131. for (i = 0; i < buffs; i++) {
  132. pkt_desc* desc = desc_address(port, i, transmit);
  133. u16 chain_off = desc_offset(port, i + 1, transmit);
  134. u32 buff_off = buffer_offset(port, i, transmit);
  135. writea(chain_off, &desc->cp);
  136. writel(buff_off, &desc->bp);
  137. writew(0, &desc->len);
  138. writeb(0, &desc->stat);
  139. }
  140. dmac = transmit ? get_dmac_tx(port) : get_dmac_rx(port);
  141. /* DMA disable - to halt state */
  142. sca_out(0, transmit ? DSR_TX(phy_node(port)) :
  143. DSR_RX(phy_node(port)), card);
  144. /* software ABORT - to initial state */
  145. sca_out(DCR_ABORT, transmit ? DCR_TX(phy_node(port)) :
  146. DCR_RX(phy_node(port)), card);
  147. #ifdef __HD64570_H
  148. sca_out(0, dmac + CPB, card); /* pointer base */
  149. #endif
  150. /* current desc addr */
  151. sca_outa(desc_offset(port, 0, transmit), dmac + CDAL, card);
  152. if (!transmit)
  153. sca_outa(desc_offset(port, buffs - 1, transmit),
  154.  dmac + EDAL, card);
  155. else
  156. sca_outa(desc_offset(port, 0, transmit), dmac + EDAL,
  157.  card);
  158. /* clear frame end interrupt counter */
  159. sca_out(DCR_CLEAR_EOF, transmit ? DCR_TX(phy_node(port)) :
  160. DCR_RX(phy_node(port)), card);
  161. if (!transmit) { /* Receive */
  162. /* set buffer length */
  163. sca_outw(HDLC_MAX_MRU, dmac + BFLL, card);
  164. /* Chain mode, Multi-frame */
  165. sca_out(0x14, DMR_RX(phy_node(port)), card);
  166. sca_out(DIR_EOME | DIR_BOFE, DIR_RX(phy_node(port)),
  167. card);
  168. /* DMA enable */
  169. sca_out(DSR_DE, DSR_RX(phy_node(port)), card);
  170. } else { /* Transmit */
  171. /* Chain mode, Multi-frame */
  172. sca_out(0x14, DMR_TX(phy_node(port)), card);
  173. /* enable underflow interrupts */
  174. sca_out(DIR_BOFE, DIR_TX(phy_node(port)), card);
  175. }
  176. }
  177. }
  178. /* MSCI interrupt service */
  179. static inline void sca_msci_intr(port_t *port)
  180. {
  181. u16 msci = get_msci(port);
  182. card_t* card = port_to_card(port);
  183. u8 stat = sca_in(msci + ST1, card); /* read MSCI ST1 status */
  184. /* printk(KERN_DEBUG "MSCI INT: ST1=%02X ILAR=%02Xn",
  185.    stat, sca_in(ILAR, card)); */
  186. /* Reset MSCI TX underrun status bit */
  187. sca_out(stat & ST1_UDRN, msci + ST1, card);
  188. if (stat & ST1_UDRN) {
  189. port->hdlc.stats.tx_errors++; /* TX Underrun error detected */
  190. port->hdlc.stats.tx_fifo_errors++;
  191. }
  192. }
  193. static inline void sca_rx(card_t *card, port_t *port, pkt_desc *desc,
  194.       u8 rxin)
  195. {
  196. struct sk_buff *skb;
  197. u16 len;
  198. u32 buff;
  199. #ifndef ALL_PAGES_ALWAYS_MAPPED
  200. u32 maxlen;
  201. u8 page;
  202. #endif
  203. len = readw(&desc->len);
  204. skb = dev_alloc_skb(len);
  205. if (!skb) {
  206. port->hdlc.stats.rx_dropped++;
  207. return;
  208. }
  209. buff = buffer_offset(port, rxin, 0);
  210. #ifndef ALL_PAGES_ALWAYS_MAPPED
  211. page = buff / winsize(card);
  212. buff = buff % winsize(card);
  213. maxlen = winsize(card) - buff;
  214. openwin(card, page);
  215. if (len > maxlen) {
  216. memcpy_fromio(skb->data, winbase(card) + buff, maxlen);
  217. openwin(card, page + 1);
  218. memcpy_fromio(skb->data + maxlen, winbase(card), len - maxlen);
  219. } else
  220. #endif
  221. memcpy_fromio(skb->data, winbase(card) + buff, len);
  222. #if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED)
  223. /* select pkt_desc table page back */
  224. openwin(card, 0);
  225. #endif
  226. skb_put(skb, len);
  227. #ifdef DEBUG_PKT
  228. printk(KERN_DEBUG "%s RX(%i):", hdlc_to_name(&port->hdlc), skb->len);
  229. debug_frame(skb);
  230. #endif
  231. port->hdlc.stats.rx_packets++;
  232. port->hdlc.stats.rx_bytes += skb->len;
  233. hdlc_netif_rx(&port->hdlc, skb);
  234. }
  235. /* Receive DMA interrupt service */
  236. static inline void sca_rx_intr(port_t *port)
  237. {
  238. u16 dmac = get_dmac_rx(port);
  239. card_t *card = port_to_card(port);
  240. u8 stat = sca_in(DSR_RX(phy_node(port)), card); /* read DMA Status */
  241. struct net_device_stats *stats = &port->hdlc.stats;
  242. /* Reset DSR status bits */
  243. sca_out((stat & (DSR_EOT | DSR_EOM | DSR_BOF | DSR_COF)) | DSR_DWE,
  244. DSR_RX(phy_node(port)), card);
  245. if (stat & DSR_BOF)
  246. stats->rx_over_errors++; /* Dropped one or more frames */
  247. while (1) {
  248. u32 desc_off = desc_offset(port, port->rxin, 0);
  249. pkt_desc *desc;
  250. u32 cda = sca_ina(dmac + CDAL, card);
  251. if (cda == desc_off)
  252. break; /* No frame received */
  253. #ifdef __HD64572_H
  254. if (cda == desc_off + 8)
  255. break; /* SCA-II updates CDA in 2 steps */
  256. #endif
  257. desc = desc_address(port, port->rxin, 0);
  258. stat = readb(&desc->stat);
  259. if (!(stat & ST_RX_EOM))
  260. port->rxpart = 1; /* partial frame received */
  261. else if ((stat & ST_ERROR_MASK) || port->rxpart) {
  262. stats->rx_errors++;
  263. if (stat & ST_RX_OVERRUN) stats->rx_fifo_errors++;
  264. else if ((stat & (ST_RX_SHORT | ST_RX_ABORT |
  265.   ST_RX_RESBIT)) || port->rxpart)
  266. stats->rx_frame_errors++;
  267. else if (stat & ST_RX_CRC) stats->rx_crc_errors++;
  268. if (stat & ST_RX_EOM)
  269. port->rxpart = 0; /* received last fragment */
  270. } else
  271. sca_rx(card, port, desc, port->rxin);
  272. /* Set new error descriptor address */
  273. sca_outa(desc_off, dmac + EDAL, card);
  274. port->rxin = next_desc(port, port->rxin);
  275. }
  276. /* make sure RX DMA is enabled */
  277. sca_out(DSR_DE, DSR_RX(phy_node(port)), card);
  278. }
  279. /* Transmit DMA interrupt service */
  280. static inline void sca_tx_intr(port_t *port)
  281. {
  282. u16 dmac = get_dmac_tx(port);
  283. card_t* card = port_to_card(port);
  284. u8 stat;
  285. spin_lock(&port->lock);
  286. stat = sca_in(DSR_TX(phy_node(port)), card); /* read DMA Status */
  287. /* Reset DSR status bits */
  288. sca_out((stat & (DSR_EOT | DSR_EOM | DSR_BOF | DSR_COF)) | DSR_DWE,
  289. DSR_TX(phy_node(port)), card);
  290. while (1) {
  291. u32 desc_off = desc_offset(port, port->txlast, 1);
  292. pkt_desc *desc;
  293. u16 len;
  294. if (sca_ina(dmac + CDAL, card) == desc_off)
  295. break; /* Transmitter is/will_be sending this frame */
  296. desc = desc_address(port, port->txlast, 1);
  297. len = readw(&desc->len);
  298. port->hdlc.stats.tx_packets++;
  299. port->hdlc.stats.tx_bytes += len;
  300. writeb(0, &desc->stat); /* Free descriptor */
  301. port->txlast = (port->txlast + 1) %
  302. port_to_card(port)->ring_buffers;
  303. }
  304. netif_wake_queue(hdlc_to_dev(&port->hdlc));
  305. spin_unlock(&port->lock);
  306. }
  307. static void sca_intr(int irq, void* dev_id, struct pt_regs *regs)
  308. {
  309. card_t *card = dev_id;
  310. int boguscnt = INTR_WORK;
  311. int i;
  312. u8 stat;
  313. #ifndef ALL_PAGES_ALWAYS_MAPPED
  314. u8 page = sca_get_page(card);
  315. #endif
  316. while((stat = sca_intr_status(card)) != 0) {
  317. for (i = 0; i < 2; i++) {
  318. port_t *port = get_port(card, i);
  319. if (port) {
  320. if (stat & SCA_INTR_MSCI(i))
  321. sca_msci_intr(port);
  322. if (stat & SCA_INTR_DMAC_RX(i))
  323. sca_rx_intr(port);
  324. if (stat & SCA_INTR_DMAC_TX(i))
  325. sca_tx_intr(port);
  326. }
  327. if (--boguscnt < 0) {
  328. printk(KERN_ERR "%s: too much work at "
  329.        "interruptn",
  330.        hdlc_to_name(&port->hdlc));
  331. goto exit;
  332. }
  333. }
  334. }
  335.  exit:
  336. #ifndef ALL_PAGES_ALWAYS_MAPPED
  337. openwin(card, page); /* Restore original page */
  338. #endif
  339. }
  340. static inline int sca_set_loopback(port_t *port, int line)
  341. {
  342. card_t* card = port_to_card(port);
  343. u8 msci = get_msci(port);
  344. u8 md2 = sca_in(msci + MD2, card);
  345. switch(line) {
  346. case LINE_DEFAULT:
  347. md2 &= ~MD2_LOOPBACK;
  348. port->line &= ~LINE_LOOPBACK;
  349. break;
  350. case LINE_LOOPBACK:
  351. md2 |= MD2_LOOPBACK;
  352. port->line |= LINE_LOOPBACK;
  353. break;
  354. default:
  355. return -EINVAL;
  356. }
  357. sca_out(md2, msci + MD2, card);
  358. return 0;
  359. }
  360. static void sca_set_clock(port_t *port)
  361. {
  362. card_t *card = port_to_card(port);
  363. u8 msci = get_msci(port);
  364. unsigned int tmc, br = 10, brv = 1024;
  365. if (port->clkrate > 0) {
  366. /* Try lower br for better accuracy*/
  367. do {
  368. br--;
  369. brv >>= 1; /* brv = 2^9 = 512 max in specs */
  370. /* Baud Rate = CLOCK_BASE / TMC / 2^BR */
  371. tmc = CLOCK_BASE / (brv * port->clkrate);
  372. }while(br > 1 && tmc <= 128);
  373. if (tmc < 1) {
  374. tmc = 1;
  375. br = 0; /* For baud=CLOCK_BASE we use tmc=1 br=0 */
  376. brv = 1;
  377. } else if (tmc > 255)
  378. tmc = 256; /* tmc=0 means 256 - low baud rates */
  379. port->clkrate = CLOCK_BASE / (brv * tmc);
  380. } else {
  381. br = 9; /* Minimum clock rate */
  382. tmc = 256; /* 8bit = 0 */
  383. port->clkrate = CLOCK_BASE / (256 * 512);
  384. }
  385. port->rxs = (port->rxs & ~CLK_BRG_MASK) | br;
  386. port->txs = (port->txs & ~CLK_BRG_MASK) | br;
  387. port->tmc = tmc;
  388. /* baud divisor - time constant*/
  389. #ifdef __HD64570_H
  390. sca_out(port->tmc, msci + TMC, card);
  391. #else
  392. sca_out(port->tmc, msci + TMCR, card);
  393. sca_out(port->tmc, msci + TMCT, card);
  394. #endif
  395. /* Set BRG bits */
  396. sca_out(port->rxs, msci + RXS, card);
  397. sca_out(port->txs, msci + TXS, card);
  398. }
  399. static void sca_set_hdlc_mode(port_t *port, u8 idle, u8 crc, u8 nrzi)
  400. {
  401. card_t* card = port_to_card(port);
  402. u8 msci = get_msci(port);
  403. u8 md2 = (nrzi ? MD2_NRZI : 0) |
  404. ((port->line & LINE_LOOPBACK) ? MD2_LOOPBACK : 0);
  405. u8 ctl = (idle ? CTL_IDLE : 0);
  406. #ifdef __HD64572_H
  407. ctl |= CTL_URCT | CTL_URSKP; /* Skip the rest of underrun frame */
  408. #endif
  409. sca_out(CMD_RESET, msci + CMD, card);
  410. sca_out(MD0_HDLC | crc, msci + MD0, card);
  411. sca_out(0x00, msci + MD1, card); /* no address field check */
  412. sca_out(md2, msci + MD2, card);
  413. sca_out(0x7E, msci + IDL, card); /* flag character 0x7E */
  414. sca_out(ctl, msci + CTL, card);
  415. #ifdef __HD64570_H
  416. /* Allow at least 8 bytes before requesting RX DMA operation */
  417. /* TX with higher priority and possibly with shorter transfers */
  418. sca_out(0x07, msci + RRC, card); /* +1=RXRDY/DMA activation condition*/
  419. sca_out(0x10, msci + TRC0, card); /* = TXRDY/DMA activation condition*/
  420. sca_out(0x14, msci + TRC1, card); /* +1=TXRDY/DMA deactiv condition */
  421. #else
  422. sca_out(0x0F, msci + RNR, card); /* +1=RX DMA activation condition */
  423. /* Setting than to larger value may cause Illegal Access */
  424. sca_out(0x20, msci + TNR0, card); /* =TX DMA activation condition */
  425. sca_out(0x30, msci + TNR1, card); /* +1=TX DMA deactivation condition*/
  426. sca_out(0x04, msci + TCR, card); /* =Critical TX DMA activ condition */
  427. #endif
  428. #ifdef __HD64570_H
  429. /* MSCI TX INT IRQ enable */
  430. sca_out(IE0_TXINT, msci + IE0, card);
  431. sca_out(IE1_UDRN, msci + IE1, card); /* TX underrun IRQ */
  432. sca_out(sca_in(IER0, card) | (phy_node(port) ? 0x80 : 0x08),
  433. IER0, card);
  434. /* DMA IRQ enable */
  435. sca_out(sca_in(IER1, card) | (phy_node(port) ? 0xF0 : 0x0F),
  436. IER1, card);
  437. #else
  438. /* MSCI TX INT and underrrun IRQ enable */
  439. sca_outl(IE0_TXINT | IE0_UDRN, msci + IE0, card);
  440. /* DMA & MSCI IRQ enable */
  441. sca_outl(sca_in(IER0, card) |
  442.  (phy_node(port) ? 0x02006600 : 0x00020066), IER0, card);
  443. #endif
  444. #ifdef __HD64570_H
  445. sca_out(port->tmc, msci + TMC, card); /* Restore registers */
  446. #else
  447. sca_out(port->tmc, msci + TMCR, card);
  448. sca_out(port->tmc, msci + TMCT, card);
  449. #endif
  450. sca_out(port->rxs, msci + RXS, card);
  451. sca_out(port->txs, msci + TXS, card);
  452. sca_out(CMD_TX_ENABLE, msci + CMD, card);
  453. sca_out(CMD_RX_ENABLE, msci + CMD, card);
  454. }
  455. #ifdef DEBUG_RINGS
  456. static void sca_dump_rings(hdlc_device *hdlc)
  457. {
  458. port_t *port = hdlc_to_port(hdlc);
  459. card_t *card = port_to_card(port);
  460. u16 cnt;
  461. #if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED)
  462. u8 page;
  463. #endif
  464. #if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED)
  465. page = sca_get_page(card);
  466. openwin(card, 0);
  467. #endif
  468. printk(KERN_ERR "RX ring: CDA=%u EDA=%u DSR=%02X in=%u "
  469.        "%sactive",
  470.        sca_ina(get_dmac_rx(port) + CDAL, card),
  471.        sca_ina(get_dmac_rx(port) + EDAL, card),
  472.        sca_in(DSR_RX(phy_node(port)), card),
  473.        port->rxin,
  474.        sca_in(DSR_RX(phy_node(port)), card) & DSR_DE?"":"in");
  475. for (cnt = 0; cnt<port_to_card(port)->ring_buffers; cnt++)
  476. printk(" %02X",
  477.        readb(&(desc_address(port, cnt, 0)->stat)));
  478. printk("n" KERN_ERR "TX ring: CDA=%u EDA=%u DSR=%02X in=%u "
  479.        "last=%u %sactive",
  480.        sca_ina(get_dmac_tx(port) + CDAL, card),
  481.        sca_ina(get_dmac_tx(port) + EDAL, card),
  482.        sca_in(DSR_TX(phy_node(port)), card), port->txin,
  483.        port->txlast,
  484.        sca_in(DSR_TX(phy_node(port)), card) & DSR_DE ? "" : "in");
  485. for (cnt = 0; cnt<port_to_card(port)->ring_buffers; cnt++)
  486. printk(" %02X",
  487.        readb(&(desc_address(port, cnt, 1)->stat)));
  488. printk("n");
  489. printk(KERN_ERR "MSCI: MD: %02x %02x %02x, "
  490.        "ST: %02x %02x %02x %02x"
  491. #ifdef __HD64572_H
  492.        " %02x"
  493. #endif
  494.        ", FST: %02x CST: %02x %02xn",
  495.        sca_in(get_msci(port) + MD0, card),
  496.        sca_in(get_msci(port) + MD1, card),
  497.        sca_in(get_msci(port) + MD2, card),
  498.        sca_in(get_msci(port) + ST0, card),
  499.        sca_in(get_msci(port) + ST1, card),
  500.        sca_in(get_msci(port) + ST2, card),
  501.        sca_in(get_msci(port) + ST3, card),
  502. #ifdef __HD64572_H
  503.        sca_in(get_msci(port) + ST4, card),
  504. #endif
  505.        sca_in(get_msci(port) + FST, card),
  506.        sca_in(get_msci(port) + CST0, card),
  507.        sca_in(get_msci(port) + CST1, card));
  508. #ifdef __HD64572_H
  509. printk(KERN_ERR "ILAR: %02xn", sca_in(ILAR, card));
  510. #endif
  511. #if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED)
  512. openwin(card, page); /* Restore original page */
  513. #endif
  514. }
  515. #endif /* DEBUG_RINGS */
  516. static void sca_open(hdlc_device *hdlc)
  517. {
  518. port_t *port = hdlc_to_port(hdlc);
  519. sca_set_hdlc_mode(port, 1, MD0_CRC_ITU, 0);
  520. netif_start_queue(hdlc_to_dev(hdlc));
  521. }
  522. static void sca_close(hdlc_device *hdlc)
  523. {
  524. port_t *port = hdlc_to_port(hdlc);
  525. /* reset channel */
  526. netif_stop_queue(hdlc_to_dev(hdlc));
  527. sca_out(CMD_RESET, get_msci(port) + CMD, port_to_card(port));
  528. }
  529. static int sca_xmit(hdlc_device *hdlc, struct sk_buff *skb)
  530. {
  531. port_t *port = hdlc_to_port(hdlc);
  532. struct net_device *dev = hdlc_to_dev(hdlc);
  533. card_t *card = port_to_card(port);
  534. pkt_desc *desc;
  535. u32 buff, len;
  536. #ifndef ALL_PAGES_ALWAYS_MAPPED
  537. u8 page;
  538. u32 maxlen;
  539. #endif
  540. spin_lock_irq(&port->lock);
  541. desc = desc_address(port, port->txin + 1, 1);
  542. if (readb(&desc->stat)) { /* allow 1 packet gap */
  543. /* should never happen - previous xmit should stop queue */
  544. #ifdef DEBUG_PKT
  545. printk(KERN_DEBUG "%s: transmitter buffer fulln", dev->name);
  546. #endif
  547. netif_stop_queue(dev);
  548. spin_unlock_irq(&port->lock);
  549. return 1; /* request packet to be queued */
  550. }
  551. #ifdef DEBUG_PKT
  552. printk(KERN_DEBUG "%s TX(%i):", hdlc_to_name(hdlc), skb->len);
  553. debug_frame(skb);
  554. #endif
  555. desc = desc_address(port, port->txin, 1);
  556. buff = buffer_offset(port, port->txin, 1);
  557. len = skb->len;
  558. #ifndef ALL_PAGES_ALWAYS_MAPPED
  559. page = buff / winsize(card);
  560. buff = buff % winsize(card);
  561. maxlen = winsize(card) - buff;
  562. openwin(card, page);
  563. if (len > maxlen) {
  564. memcpy_toio(winbase(card) + buff, skb->data, maxlen);
  565. openwin(card, page + 1);
  566. memcpy_toio(winbase(card), skb->data + maxlen, len - maxlen);
  567. }
  568. else
  569. #endif
  570. memcpy_toio(winbase(card) + buff, skb->data, len);
  571. #if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED)
  572. openwin(card, 0); /* select pkt_desc table page back */
  573. #endif
  574. writew(len, &desc->len);
  575. writeb(ST_TX_EOM, &desc->stat);
  576. dev->trans_start = jiffies;
  577. port->txin = next_desc(port, port->txin);
  578. sca_outa(desc_offset(port, port->txin, 1),
  579.  get_dmac_tx(port) + EDAL, card);
  580. sca_out(DSR_DE, DSR_TX(phy_node(port)), card); /* Enable TX DMA */
  581. desc = desc_address(port, port->txin + 1, 1);
  582. if (readb(&desc->stat)) /* allow 1 packet gap */
  583. netif_stop_queue(hdlc_to_dev(&port->hdlc));
  584. spin_unlock_irq(&port->lock);
  585. dev_kfree_skb(skb);
  586. return 0;
  587. }
  588. static void sca_init(card_t *card, int wait_states)
  589. {
  590. sca_out(wait_states, WCRL, card); /* Wait Control */
  591. sca_out(wait_states, WCRM, card);
  592. sca_out(wait_states, WCRH, card);
  593. sca_out(0, DMER, card); /* DMA Master disable */
  594. sca_out(0x03, PCR, card); /* DMA priority */
  595. sca_out(0, IER1, card); /* DMA interrupt disable */
  596. sca_out(0, DSR_RX(0), card); /* DMA disable - to halt state */
  597. sca_out(0, DSR_TX(0), card);
  598. sca_out(0, DSR_RX(1), card);
  599. sca_out(0, DSR_TX(1), card);
  600. sca_out(DMER_DME, DMER, card); /* DMA Master enable */
  601. }