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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/drivers/acorn/net/ether1.c
  3.  *
  4.  *  Copyright (C) 1996-2000 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Acorn ether1 driver (82586 chip) for Acorn machines
  11.  *
  12.  * We basically keep two queues in the cards memory - one for transmit
  13.  * and one for receive.  Each has a head and a tail.  The head is where
  14.  * we/the chip adds packets to be transmitted/received, and the tail
  15.  * is where the transmitter has got to/where the receiver will stop.
  16.  * Both of these queues are circular, and since the chip is running
  17.  * all the time, we have to be careful when we modify the pointers etc
  18.  * so that the buffer memory contents is valid all the time.
  19.  *
  20.  * Change log:
  21.  * 1.00 RMK Released
  22.  * 1.01 RMK 19/03/1996 Transfers the last odd byte onto/off of the card now.
  23.  * 1.02 RMK 25/05/1997 Added code to restart RU if it goes not ready
  24.  * 1.03 RMK 14/09/1997 Cleaned up the handling of a reset during the TX interrupt.
  25.  * Should prevent lockup.
  26.  * 1.04 RMK 17/09/1997 Added more info when initialsation of chip goes wrong.
  27.  * TDR now only reports failure when chip reports non-zero
  28.  * TDR time-distance.
  29.  * 1.05 RMK 31/12/1997 Removed calls to dev_tint for 2.1
  30.  * 1.06 RMK 10/02/2000 Updated for 2.3.43
  31.  * 1.07 RMK 13/05/2000 Updated for 2.3.99-pre8
  32.  */
  33. #include <linux/module.h>
  34. #include <linux/kernel.h>
  35. #include <linux/sched.h>
  36. #include <linux/types.h>
  37. #include <linux/fcntl.h>
  38. #include <linux/interrupt.h>
  39. #include <linux/ptrace.h>
  40. #include <linux/ioport.h>
  41. #include <linux/in.h>
  42. #include <linux/slab.h>
  43. #include <linux/string.h>
  44. #include <linux/errno.h>
  45. #include <linux/init.h>
  46. #include <linux/netdevice.h>
  47. #include <linux/etherdevice.h>
  48. #include <linux/skbuff.h>
  49. #include <asm/system.h>
  50. #include <asm/bitops.h>
  51. #include <asm/io.h>
  52. #include <asm/dma.h>
  53. #include <asm/ecard.h>
  54. #define __ETHER1_C
  55. #include "ether1.h"
  56. static unsigned int net_debug = NET_DEBUG;
  57. #define BUFFER_SIZE 0x10000
  58. #define TX_AREA_START 0x00100
  59. #define TX_AREA_END 0x05000
  60. #define RX_AREA_START 0x05000
  61. #define RX_AREA_END 0x0fc00
  62. static int ether1_open(struct net_device *dev);
  63. static int ether1_sendpacket(struct sk_buff *skb, struct net_device *dev);
  64. static void ether1_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  65. static int ether1_close(struct net_device *dev);
  66. static struct net_device_stats *ether1_getstats(struct net_device *dev);
  67. static void ether1_setmulticastlist(struct net_device *dev);
  68. static void ether1_timeout(struct net_device *dev);
  69. /* ------------------------------------------------------------------------- */
  70. static char version[] __initdata = "ether1 ethernet driver (c) 2000 Russell King v1.07n";
  71. #define BUS_16 16
  72. #define BUS_8  8
  73. static const card_ids __init ether1_cids[] = {
  74. { MANU_ACORN, PROD_ACORN_ETHER1 },
  75. { 0xffff, 0xffff }
  76. };
  77. /* ------------------------------------------------------------------------- */
  78. #define DISABLEIRQS 1
  79. #define NORMALIRQS  0
  80. #define ether1_inw(dev, addr, type, offset, svflgs) ether1_inw_p (dev, addr + (int)(&((type *)0)->offset), svflgs)
  81. #define ether1_outw(dev, val, addr, type, offset, svflgs) ether1_outw_p (dev, val, addr + (int)(&((type *)0)->offset), svflgs)
  82. static inline unsigned short
  83. ether1_inw_p (struct net_device *dev, int addr, int svflgs)
  84. {
  85. unsigned long flags;
  86. unsigned short ret;
  87. if (svflgs) {
  88. save_flags_cli (flags);
  89. }
  90. outb (addr >> 12, REG_PAGE);
  91. ret = inw (ETHER1_RAM + ((addr & 4095) >> 1));
  92. if (svflgs)
  93. restore_flags (flags);
  94. return ret;
  95. }
  96. static inline void
  97. ether1_outw_p (struct net_device *dev, unsigned short val, int addr, int svflgs)
  98. {
  99. unsigned long flags;
  100. if (svflgs) {
  101. save_flags_cli (flags);
  102. }
  103. outb (addr >> 12, REG_PAGE);
  104. outw (val, ETHER1_RAM + ((addr & 4095) >> 1));
  105. if (svflgs)
  106. restore_flags (flags);
  107. }
  108. /*
  109.  * Some inline assembler to allow fast transfers on to/off of the card.
  110.  * Since this driver depends on some features presented by the ARM
  111.  * specific architecture, and that you can't configure this driver
  112.  * without specifiing ARM mode, this is not a problem.
  113.  *
  114.  * This routine is essentially an optimised memcpy from the card's
  115.  * onboard RAM to kernel memory.
  116.  */
  117. static void
  118. ether1_writebuffer (struct net_device *dev, void *data, unsigned int start, unsigned int length)
  119. {
  120. unsigned int page, thislen, offset, addr;
  121. offset = start & 4095;
  122. page = start >> 12;
  123. addr = ioaddr(ETHER1_RAM + (offset >> 1));
  124. if (offset + length > 4096)
  125. thislen = 4096 - offset;
  126. else
  127. thislen = length;
  128. do {
  129. int used;
  130. outb(page, REG_PAGE);
  131. length -= thislen;
  132. __asm__ __volatile__(
  133. "subs %3, %3, #2
  134. bmi 2f
  135. 1: ldr %0, [%1], #2
  136. mov %0, %0, lsl #16
  137. orr %0, %0, %0, lsr #16
  138. str %0, [%2], #4
  139. subs %3, %3, #2
  140. bmi 2f
  141. ldr %0, [%1], #2
  142. mov %0, %0, lsl #16
  143. orr %0, %0, %0, lsr #16
  144. str %0, [%2], #4
  145. subs %3, %3, #2
  146. bmi 2f
  147. ldr %0, [%1], #2
  148. mov %0, %0, lsl #16
  149. orr %0, %0, %0, lsr #16
  150. str %0, [%2], #4
  151. subs %3, %3, #2
  152. bmi 2f
  153. ldr %0, [%1], #2
  154. mov %0, %0, lsl #16
  155. orr %0, %0, %0, lsr #16
  156. str %0, [%2], #4
  157. subs %3, %3, #2
  158. bpl 1b
  159. 2: adds %3, %3, #1
  160. ldreqb %0, [%1]
  161. streqb %0, [%2]"
  162. : "=&r" (used), "=&r" (data)
  163. : "r"  (addr), "r" (thislen), "1" (data));
  164. addr = ioaddr(ETHER1_RAM);
  165. thislen = length;
  166. if (thislen > 4096)
  167. thislen = 4096;
  168. page++;
  169. } while (thislen);
  170. }
  171. static void
  172. ether1_readbuffer (struct net_device *dev, void *data, unsigned int start, unsigned int length)
  173. {
  174. unsigned int page, thislen, offset, addr;
  175. offset = start & 4095;
  176. page = start >> 12;
  177. addr = ioaddr(ETHER1_RAM + (offset >> 1));
  178. if (offset + length > 4096)
  179. thislen = 4096 - offset;
  180. else
  181. thislen = length;
  182. do {
  183. int used;
  184. outb(page, REG_PAGE);
  185. length -= thislen;
  186. __asm__ __volatile__(
  187. "subs %3, %3, #2
  188. bmi 2f
  189. 1: ldr %0, [%2], #4
  190. strb %0, [%1], #1
  191. mov %0, %0, lsr #8
  192. strb %0, [%1], #1
  193. subs %3, %3, #2
  194. bmi 2f
  195. ldr %0, [%2], #4
  196. strb %0, [%1], #1
  197. mov %0, %0, lsr #8
  198. strb %0, [%1], #1
  199. subs %3, %3, #2
  200. bmi 2f
  201. ldr %0, [%2], #4
  202. strb %0, [%1], #1
  203. mov %0, %0, lsr #8
  204. strb %0, [%1], #1
  205. subs %3, %3, #2
  206. bmi 2f
  207. ldr %0, [%2], #4
  208. strb %0, [%1], #1
  209. mov %0, %0, lsr #8
  210. strb %0, [%1], #1
  211. subs %3, %3, #2
  212. bpl 1b
  213. 2: adds %3, %3, #1
  214. ldreqb %0, [%2]
  215. streqb %0, [%1]"
  216. : "=&r" (used), "=&r" (data)
  217. : "r"  (addr), "r" (thislen), "1" (data));
  218. addr = ioaddr(ETHER1_RAM);
  219. thislen = length;
  220. if (thislen > 4096)
  221. thislen = 4096;
  222. page++;
  223. } while (thislen);
  224. }
  225. static int __init
  226. ether1_ramtest(struct net_device *dev, unsigned char byte)
  227. {
  228. unsigned char *buffer = kmalloc (BUFFER_SIZE, GFP_KERNEL);
  229. int i, ret = BUFFER_SIZE;
  230. int max_errors = 15;
  231. int bad = -1;
  232. int bad_start = 0;
  233. if (!buffer)
  234. return 1;
  235. memset (buffer, byte, BUFFER_SIZE);
  236. ether1_writebuffer (dev, buffer, 0, BUFFER_SIZE);
  237. memset (buffer, byte ^ 0xff, BUFFER_SIZE);
  238. ether1_readbuffer (dev, buffer, 0, BUFFER_SIZE);
  239. for (i = 0; i < BUFFER_SIZE; i++) {
  240. if (buffer[i] != byte) {
  241. if (max_errors >= 0 && bad != buffer[i]) {
  242. if (bad != -1)
  243. printk ("n");
  244. printk (KERN_CRIT "%s: RAM failed with (%02X instead of %02X) at 0x%04X",
  245. dev->name, buffer[i], byte, i);
  246. ret = -ENODEV;
  247. max_errors --;
  248. bad = buffer[i];
  249. bad_start = i;
  250. }
  251. } else {
  252. if (bad != -1) {
  253.      if (bad_start == i - 1)
  254. printk ("n");
  255. else
  256. printk (" - 0x%04Xn", i - 1);
  257. bad = -1;
  258. }
  259. }
  260. }
  261. if (bad != -1)
  262. printk (" - 0x%04Xn", BUFFER_SIZE);
  263. kfree (buffer);
  264. return ret;
  265. }
  266. static int
  267. ether1_reset (struct net_device *dev)
  268. {
  269. outb (CTRL_RST|CTRL_ACK, REG_CONTROL);
  270. return BUS_16;
  271. }
  272. static int __init
  273. ether1_init_2(struct net_device *dev)
  274. {
  275. int i;
  276. dev->mem_start = 0;
  277. i = ether1_ramtest (dev, 0x5a);
  278. if (i > 0)
  279. i = ether1_ramtest (dev, 0x1e);
  280. if (i <= 0)
  281.      return -ENODEV;
  282. dev->mem_end = i;
  283. return 0;
  284. }
  285. /*
  286.  * These are the structures that are loaded into the ether RAM card to
  287.  * initialise the 82586
  288.  */
  289. /* at 0x0100 */
  290. #define NOP_ADDR (TX_AREA_START)
  291. #define NOP_SIZE (0x06)
  292. static nop_t  init_nop  = {
  293. 0,
  294. CMD_NOP,
  295. NOP_ADDR
  296. };
  297. /* at 0x003a */
  298. #define TDR_ADDR (0x003a)
  299. #define TDR_SIZE (0x08)
  300. static tdr_t  init_tdr = {
  301. 0,
  302. CMD_TDR | CMD_INTR,
  303. NOP_ADDR,
  304. 0
  305. };
  306. /* at 0x002e */
  307. #define MC_ADDR (0x002e)
  308. #define MC_SIZE (0x0c)
  309. static mc_t   init_mc   = {
  310. 0,
  311. CMD_SETMULTICAST,
  312. TDR_ADDR,
  313. 0,
  314. { { 0, } }
  315. };
  316. /* at 0x0022 */
  317. #define SA_ADDR (0x0022)
  318. #define SA_SIZE (0x0c)
  319. static sa_t   init_sa   = {
  320. 0,
  321. CMD_SETADDRESS,
  322. MC_ADDR,
  323. { 0, }
  324. };
  325. /* at 0x0010 */
  326. #define CFG_ADDR (0x0010)
  327. #define CFG_SIZE (0x12)
  328. static cfg_t  init_cfg  = {
  329. 0,
  330. CMD_CONFIG,
  331. SA_ADDR,
  332. 8,
  333. 8,
  334. CFG8_SRDY,
  335. CFG9_PREAMB8 | CFG9_ADDRLENBUF | CFG9_ADDRLEN(6),
  336. 0,
  337. 0x60,
  338. 0,
  339. CFG13_RETRY(15) | CFG13_SLOTH(2),
  340. 0,
  341. };
  342. /* at 0x0000 */
  343. #define SCB_ADDR (0x0000)
  344. #define SCB_SIZE (0x10)
  345. static scb_t  init_scb  = {
  346. 0,
  347. SCB_CMDACKRNR | SCB_CMDACKCNA | SCB_CMDACKFR | SCB_CMDACKCX,
  348. CFG_ADDR,
  349. RX_AREA_START,
  350. 0,
  351. 0,
  352. 0,
  353. 0
  354. };
  355. /* at 0xffee */
  356. #define ISCP_ADDR (0xffee)
  357. #define ISCP_SIZE (0x08)
  358. static iscp_t init_iscp = {
  359. 1,
  360. SCB_ADDR,
  361. 0x0000,
  362. 0x0000
  363. };
  364. /* at 0xfff6 */
  365. #define SCP_ADDR (0xfff6)
  366. #define SCP_SIZE (0x0a)
  367. static scp_t  init_scp  = {
  368. SCP_SY_16BBUS,
  369. { 0, 0 },
  370. ISCP_ADDR,
  371. 0
  372. };
  373. #define RFD_SIZE (0x16)
  374. static rfd_t  init_rfd = {
  375. 0,
  376. 0,
  377. 0,
  378. 0,
  379. { 0, },
  380. { 0, },
  381. 0
  382. };
  383. #define RBD_SIZE (0x0a)
  384. static rbd_t  init_rbd = {
  385. 0,
  386. 0,
  387. 0,
  388. 0,
  389. ETH_FRAME_LEN + 8
  390. };
  391. #define TX_SIZE (0x08)
  392. #define TBD_SIZE (0x08)
  393. static int
  394. ether1_init_for_open (struct net_device *dev)
  395. {
  396. struct ether1_priv *priv = (struct ether1_priv *)dev->priv;
  397. int i, status, addr, next, next2;
  398. int failures = 0;
  399. outb (CTRL_RST|CTRL_ACK, REG_CONTROL);
  400. for (i = 0; i < 6; i++)
  401. init_sa.sa_addr[i] = dev->dev_addr[i];
  402. /* load data structures into ether1 RAM */
  403. ether1_writebuffer (dev, &init_scp,  SCP_ADDR,  SCP_SIZE);
  404. ether1_writebuffer (dev, &init_iscp, ISCP_ADDR, ISCP_SIZE);
  405. ether1_writebuffer (dev, &init_scb,  SCB_ADDR,  SCB_SIZE);
  406. ether1_writebuffer (dev, &init_cfg,  CFG_ADDR,  CFG_SIZE);
  407. ether1_writebuffer (dev, &init_sa,   SA_ADDR,   SA_SIZE);
  408. ether1_writebuffer (dev, &init_mc,   MC_ADDR,   MC_SIZE);
  409. ether1_writebuffer (dev, &init_tdr,  TDR_ADDR,  TDR_SIZE);
  410. ether1_writebuffer (dev, &init_nop,  NOP_ADDR,  NOP_SIZE);
  411. if (ether1_inw (dev, CFG_ADDR, cfg_t, cfg_command, NORMALIRQS) != CMD_CONFIG) {
  412. printk (KERN_ERR "%s: detected either RAM fault or compiler bugn",
  413. dev->name);
  414. return 1;
  415. }
  416. /*
  417.  * setup circularly linked list of { rfd, rbd, buffer }, with
  418.  * all rfds circularly linked, rbds circularly linked.
  419.  * First rfd is linked to scp, first rbd is linked to first
  420.  * rfd.  Last rbd has a suspend command.
  421.  */
  422. addr = RX_AREA_START;
  423. do {
  424. next = addr + RFD_SIZE + RBD_SIZE + ETH_FRAME_LEN + 10;
  425. next2 = next + RFD_SIZE + RBD_SIZE + ETH_FRAME_LEN + 10;
  426. if (next2 >= RX_AREA_END) {
  427. next = RX_AREA_START;
  428. init_rfd.rfd_command = RFD_CMDEL | RFD_CMDSUSPEND;
  429. priv->rx_tail = addr;
  430. } else
  431. init_rfd.rfd_command = 0;
  432. if (addr == RX_AREA_START)
  433. init_rfd.rfd_rbdoffset = addr + RFD_SIZE;
  434. else
  435. init_rfd.rfd_rbdoffset = 0;
  436. init_rfd.rfd_link = next;
  437. init_rbd.rbd_link = next + RFD_SIZE;
  438. init_rbd.rbd_bufl = addr + RFD_SIZE + RBD_SIZE;
  439. ether1_writebuffer (dev, &init_rfd, addr, RFD_SIZE);
  440. ether1_writebuffer (dev, &init_rbd, addr + RFD_SIZE, RBD_SIZE);
  441. addr = next;
  442. } while (next2 < RX_AREA_END);
  443. priv->tx_link = NOP_ADDR;
  444. priv->tx_head = NOP_ADDR + NOP_SIZE;
  445. priv->tx_tail = TDR_ADDR;
  446. priv->rx_head = RX_AREA_START;
  447. /* release reset & give 586 a prod */
  448. priv->resetting = 1;
  449. priv->initialising = 1;
  450. outb (CTRL_RST, REG_CONTROL);
  451. outb (0, REG_CONTROL);
  452. outb (CTRL_CA, REG_CONTROL);
  453. /* 586 should now unset iscp.busy */
  454. i = jiffies + HZ/2;
  455. while (ether1_inw (dev, ISCP_ADDR, iscp_t, iscp_busy, DISABLEIRQS) == 1) {
  456. if (time_after(jiffies, i)) {
  457. printk (KERN_WARNING "%s: can't initialise 82586: iscp is busyn", dev->name);
  458. return 1;
  459. }
  460. }
  461. /* check status of commands that we issued */
  462. i += HZ/10;
  463. while (((status = ether1_inw (dev, CFG_ADDR, cfg_t, cfg_status, DISABLEIRQS))
  464. & STAT_COMPLETE) == 0) {
  465. if (time_after(jiffies, i))
  466. break;
  467. }
  468. if ((status & (STAT_COMPLETE | STAT_OK)) != (STAT_COMPLETE | STAT_OK)) {
  469. printk (KERN_WARNING "%s: can't initialise 82586: config status %04Xn", dev->name, status);
  470. printk (KERN_DEBUG "%s: SCB=[STS=%04X CMD=%04X CBL=%04X RFA=%04X]n", dev->name,
  471. ether1_inw (dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS),
  472. ether1_inw (dev, SCB_ADDR, scb_t, scb_command, NORMALIRQS),
  473. ether1_inw (dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS),
  474. ether1_inw (dev, SCB_ADDR, scb_t, scb_rfa_offset, NORMALIRQS));
  475. failures += 1;
  476. }
  477. i += HZ/10;
  478. while (((status = ether1_inw (dev, SA_ADDR, sa_t, sa_status, DISABLEIRQS))
  479. & STAT_COMPLETE) == 0) {
  480. if (time_after(jiffies, i))
  481. break;
  482. }
  483. if ((status & (STAT_COMPLETE | STAT_OK)) != (STAT_COMPLETE | STAT_OK)) {
  484. printk (KERN_WARNING "%s: can't initialise 82586: set address status %04Xn", dev->name, status);
  485. printk (KERN_DEBUG "%s: SCB=[STS=%04X CMD=%04X CBL=%04X RFA=%04X]n", dev->name,
  486. ether1_inw (dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS),
  487. ether1_inw (dev, SCB_ADDR, scb_t, scb_command, NORMALIRQS),
  488. ether1_inw (dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS),
  489. ether1_inw (dev, SCB_ADDR, scb_t, scb_rfa_offset, NORMALIRQS));
  490. failures += 1;
  491. }
  492. i += HZ/10;
  493. while (((status = ether1_inw (dev, MC_ADDR, mc_t, mc_status, DISABLEIRQS))
  494. & STAT_COMPLETE) == 0) {
  495. if (time_after(jiffies, i))
  496. break;
  497. }
  498. if ((status & (STAT_COMPLETE | STAT_OK)) != (STAT_COMPLETE | STAT_OK)) {
  499. printk (KERN_WARNING "%s: can't initialise 82586: set multicast status %04Xn", dev->name, status);
  500. printk (KERN_DEBUG "%s: SCB=[STS=%04X CMD=%04X CBL=%04X RFA=%04X]n", dev->name,
  501. ether1_inw (dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS),
  502. ether1_inw (dev, SCB_ADDR, scb_t, scb_command, NORMALIRQS),
  503. ether1_inw (dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS),
  504. ether1_inw (dev, SCB_ADDR, scb_t, scb_rfa_offset, NORMALIRQS));
  505. failures += 1;
  506. }
  507. i += HZ;
  508. while (((status = ether1_inw (dev, TDR_ADDR, tdr_t, tdr_status, DISABLEIRQS))
  509. & STAT_COMPLETE) == 0) {
  510. if (time_after(jiffies, i))
  511. break;
  512. }
  513. if ((status & (STAT_COMPLETE | STAT_OK)) != (STAT_COMPLETE | STAT_OK)) {
  514. printk (KERN_WARNING "%s: can't tdr (ignored)n", dev->name);
  515. printk (KERN_DEBUG "%s: SCB=[STS=%04X CMD=%04X CBL=%04X RFA=%04X]n", dev->name,
  516. ether1_inw (dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS),
  517. ether1_inw (dev, SCB_ADDR, scb_t, scb_command, NORMALIRQS),
  518. ether1_inw (dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS),
  519. ether1_inw (dev, SCB_ADDR, scb_t, scb_rfa_offset, NORMALIRQS));
  520. } else {
  521. status = ether1_inw (dev, TDR_ADDR, tdr_t, tdr_result, DISABLEIRQS);
  522. if (status & TDR_XCVRPROB)
  523. printk (KERN_WARNING "%s: i/f failed tdr: transceiver problemn", dev->name);
  524. else if ((status & (TDR_SHORT|TDR_OPEN)) && (status & TDR_TIME)) {
  525. #ifdef FANCY
  526. printk (KERN_WARNING "%s: i/f failed tdr: cable %s %d.%d us awayn", dev->name,
  527. status & TDR_SHORT ? "short" : "open", (status & TDR_TIME) / 10,
  528. (status & TDR_TIME) % 10);
  529. #else
  530. printk (KERN_WARNING "%s: i/f failed tdr: cable %s %d clks awayn", dev->name,
  531. status & TDR_SHORT ? "short" : "open", (status & TDR_TIME));
  532. #endif
  533. }
  534. }
  535. if (failures)
  536. ether1_reset (dev);
  537. return failures ? 1 : 0;
  538. }
  539. /* ------------------------------------------------------------------------- */
  540. static int
  541. ether1_txalloc (struct net_device *dev, int size)
  542. {
  543. struct ether1_priv *priv = (struct ether1_priv *)dev->priv;
  544. int start, tail;
  545. size = (size + 1) & ~1;
  546. tail = priv->tx_tail;
  547. if (priv->tx_head + size > TX_AREA_END) {
  548. if (tail > priv->tx_head)
  549. return -1;
  550. start = TX_AREA_START;
  551. if (start + size > tail)
  552. return -1;
  553. priv->tx_head = start + size;
  554. } else {
  555. if (priv->tx_head < tail && (priv->tx_head + size) > tail)
  556. return -1;
  557. start = priv->tx_head;
  558. priv->tx_head += size;
  559. }
  560. return start;
  561. }
  562. static int
  563. ether1_open (struct net_device *dev)
  564. {
  565. struct ether1_priv *priv = (struct ether1_priv *)dev->priv;
  566. if (request_irq(dev->irq, ether1_interrupt, 0, "ether1", dev))
  567. return -EAGAIN;
  568. memset (&priv->stats, 0, sizeof (struct net_device_stats));
  569. if (ether1_init_for_open (dev)) {
  570. free_irq (dev->irq, dev);
  571. return -EAGAIN;
  572. }
  573. netif_start_queue(dev);
  574. return 0;
  575. }
  576. static void
  577. ether1_timeout(struct net_device *dev)
  578. {
  579. struct ether1_priv *priv = (struct ether1_priv *)dev->priv;
  580. printk(KERN_WARNING "%s: transmit timeout, network cable problem?n",
  581. dev->name);
  582. printk(KERN_WARNING "%s: resetting devicen", dev->name);
  583. ether1_reset (dev);
  584. if (ether1_init_for_open (dev))
  585. printk (KERN_ERR "%s: unable to restart interfacen", dev->name);
  586. priv->stats.tx_errors++;
  587. netif_wake_queue(dev);
  588. }
  589. static int
  590. ether1_sendpacket (struct sk_buff *skb, struct net_device *dev)
  591. {
  592. struct ether1_priv *priv = (struct ether1_priv *)dev->priv;
  593. int len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN;
  594. int tmp, tst, nopaddr, txaddr, tbdaddr, dataddr;
  595. unsigned long flags;
  596. tx_t tx;
  597. tbd_t tbd;
  598. nop_t nop;
  599. if (priv->restart) {
  600. printk(KERN_WARNING "%s: resetting devicen", dev->name);
  601. ether1_reset(dev);
  602. if (ether1_init_for_open(dev))
  603. printk(KERN_ERR "%s: unable to restart interfacen", dev->name);
  604. else
  605. priv->restart = 0;
  606. }
  607. /*
  608.  * insert packet followed by a nop
  609.  */
  610. txaddr = ether1_txalloc (dev, TX_SIZE);
  611. tbdaddr = ether1_txalloc (dev, TBD_SIZE);
  612. dataddr = ether1_txalloc (dev, len);
  613. nopaddr = ether1_txalloc (dev, NOP_SIZE);
  614. tx.tx_status = 0;
  615. tx.tx_command = CMD_TX | CMD_INTR;
  616. tx.tx_link = nopaddr;
  617. tx.tx_tbdoffset = tbdaddr;
  618. tbd.tbd_opts = TBD_EOL | len;
  619. tbd.tbd_link = I82586_NULL;
  620. tbd.tbd_bufl = dataddr;
  621. tbd.tbd_bufh = 0;
  622. nop.nop_status = 0;
  623. nop.nop_command = CMD_NOP;
  624. nop.nop_link = nopaddr;
  625. save_flags_cli(flags);
  626. ether1_writebuffer (dev, &tx, txaddr, TX_SIZE);
  627. ether1_writebuffer (dev, &tbd, tbdaddr, TBD_SIZE);
  628. ether1_writebuffer (dev, skb->data, dataddr, len);
  629. ether1_writebuffer (dev, &nop, nopaddr, NOP_SIZE);
  630. tmp = priv->tx_link;
  631. priv->tx_link = nopaddr;
  632. /* now reset the previous nop pointer */
  633. ether1_outw (dev, txaddr, tmp, nop_t, nop_link, NORMALIRQS);
  634. restore_flags(flags);
  635. /* handle transmit */
  636. dev->trans_start = jiffies;
  637. /* check to see if we have room for a full sized ether frame */
  638. tmp = priv->tx_head;
  639. tst = ether1_txalloc (dev, TX_SIZE + TBD_SIZE + NOP_SIZE + ETH_FRAME_LEN);
  640. priv->tx_head = tmp;
  641. dev_kfree_skb (skb);
  642. if (tst == -1)
  643. netif_stop_queue(dev);
  644. return 0;
  645. }
  646. static void
  647. ether1_xmit_done (struct net_device *dev)
  648. {
  649. struct ether1_priv *priv = (struct ether1_priv *)dev->priv;
  650. nop_t nop;
  651. int caddr, tst;
  652. caddr = priv->tx_tail;
  653. again:
  654. ether1_readbuffer (dev, &nop, caddr, NOP_SIZE);
  655. switch (nop.nop_command & CMD_MASK) {
  656. case CMD_TDR:
  657. /* special case */
  658. if (ether1_inw (dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS)
  659. != (unsigned short)I82586_NULL) {
  660. ether1_outw(dev, SCB_CMDCUCSTART | SCB_CMDRXSTART, SCB_ADDR, scb_t,
  661.     scb_command, NORMALIRQS);
  662. outb (CTRL_CA, REG_CONTROL);
  663. }
  664. priv->tx_tail = NOP_ADDR;
  665. return;
  666. case CMD_NOP:
  667. if (nop.nop_link == caddr) {
  668. if (priv->initialising == 0)
  669. printk (KERN_WARNING "%s: strange command complete with no tx command!n", dev->name);
  670. else
  671.         priv->initialising = 0;
  672. return;
  673. }
  674. if (caddr == nop.nop_link)
  675. return;
  676. caddr = nop.nop_link;
  677. goto again;
  678. case CMD_TX:
  679. if (nop.nop_status & STAT_COMPLETE)
  680. break;
  681. printk (KERN_ERR "%s: strange command complete without completed commandn", dev->name);
  682. priv->restart = 1;
  683. return;
  684. default:
  685. printk (KERN_WARNING "%s: strange command %d complete! (offset %04X)", dev->name,
  686. nop.nop_command & CMD_MASK, caddr);
  687. priv->restart = 1;
  688. return;
  689. }
  690. while (nop.nop_status & STAT_COMPLETE) {
  691. if (nop.nop_status & STAT_OK) {
  692. priv->stats.tx_packets ++;
  693. priv->stats.collisions += (nop.nop_status & STAT_COLLISIONS);
  694. } else {
  695. priv->stats.tx_errors ++;
  696. if (nop.nop_status & STAT_COLLAFTERTX)
  697. priv->stats.collisions ++;
  698. if (nop.nop_status & STAT_NOCARRIER)
  699. priv->stats.tx_carrier_errors ++;
  700. if (nop.nop_status & STAT_TXLOSTCTS)
  701. printk (KERN_WARNING "%s: cts lostn", dev->name);
  702. if (nop.nop_status & STAT_TXSLOWDMA)
  703. priv->stats.tx_fifo_errors ++;
  704. if (nop.nop_status & STAT_COLLEXCESSIVE)
  705. priv->stats.collisions += 16;
  706. }
  707. if (nop.nop_link == caddr) {
  708. printk (KERN_ERR "%s: tx buffer chaining error: tx command points to itselfn", dev->name);
  709. break;
  710. }
  711. caddr = nop.nop_link;
  712. ether1_readbuffer (dev, &nop, caddr, NOP_SIZE);
  713. if ((nop.nop_command & CMD_MASK) != CMD_NOP) {
  714. printk (KERN_ERR "%s: tx buffer chaining error: no nop after tx commandn", dev->name);
  715. break;
  716. }
  717. if (caddr == nop.nop_link)
  718. break;
  719. caddr = nop.nop_link;
  720. ether1_readbuffer (dev, &nop, caddr, NOP_SIZE);
  721. if ((nop.nop_command & CMD_MASK) != CMD_TX) {
  722. printk (KERN_ERR "%s: tx buffer chaining error: no tx command after nopn", dev->name);
  723. break;
  724. }
  725. }
  726. priv->tx_tail = caddr;
  727. caddr = priv->tx_head;
  728. tst = ether1_txalloc (dev, TX_SIZE + TBD_SIZE + NOP_SIZE + ETH_FRAME_LEN);
  729. priv->tx_head = caddr;
  730. if (tst != -1)
  731. netif_wake_queue(dev);
  732. }
  733. static void
  734. ether1_recv_done (struct net_device *dev)
  735. {
  736. struct ether1_priv *priv = (struct ether1_priv *)dev->priv;
  737. int status;
  738. int nexttail, rbdaddr;
  739. rbd_t rbd;
  740. do {
  741. status = ether1_inw (dev, priv->rx_head, rfd_t, rfd_status, NORMALIRQS);
  742. if ((status & RFD_COMPLETE) == 0)
  743. break;
  744. rbdaddr = ether1_inw (dev, priv->rx_head, rfd_t, rfd_rbdoffset, NORMALIRQS);
  745. ether1_readbuffer (dev, &rbd, rbdaddr, RBD_SIZE);
  746. if ((rbd.rbd_status & (RBD_EOF | RBD_ACNTVALID)) == (RBD_EOF | RBD_ACNTVALID)) {
  747. int length = rbd.rbd_status & RBD_ACNT;
  748. struct sk_buff *skb;
  749. length = (length + 1) & ~1;
  750. skb = dev_alloc_skb (length + 2);
  751. if (skb) {
  752. skb->dev = dev;
  753. skb_reserve (skb, 2);
  754. ether1_readbuffer (dev, skb_put (skb, length), rbd.rbd_bufl, length);
  755. skb->protocol = eth_type_trans (skb, dev);
  756. netif_rx (skb);
  757. priv->stats.rx_packets ++;
  758. } else
  759. priv->stats.rx_dropped ++;
  760. } else {
  761. printk(KERN_WARNING "%s: %sn", dev->name,
  762. (rbd.rbd_status & RBD_EOF) ? "oversized packet" : "acnt not valid");
  763. priv->stats.rx_dropped ++;
  764. }
  765. nexttail = ether1_inw (dev, priv->rx_tail, rfd_t, rfd_link, NORMALIRQS);
  766. /* nexttail should be rx_head */
  767. if (nexttail != priv->rx_head)
  768. printk(KERN_ERR "%s: receiver buffer chaining error (%04X != %04X)n",
  769. dev->name, nexttail, priv->rx_head);
  770. ether1_outw (dev, RFD_CMDEL | RFD_CMDSUSPEND, nexttail, rfd_t, rfd_command, NORMALIRQS);
  771. ether1_outw (dev, 0, priv->rx_tail, rfd_t, rfd_command, NORMALIRQS);
  772. ether1_outw (dev, 0, priv->rx_tail, rfd_t, rfd_status, NORMALIRQS);
  773. ether1_outw (dev, 0, priv->rx_tail, rfd_t, rfd_rbdoffset, NORMALIRQS);
  774. priv->rx_tail = nexttail;
  775. priv->rx_head = ether1_inw (dev, priv->rx_head, rfd_t, rfd_link, NORMALIRQS);
  776. } while (1);
  777. }
  778. static void
  779. ether1_interrupt (int irq, void *dev_id, struct pt_regs *regs)
  780. {
  781. struct net_device *dev = (struct net_device *)dev_id;
  782. struct ether1_priv *priv = (struct ether1_priv *)dev->priv;
  783. int status;
  784. status = ether1_inw (dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS);
  785. if (status) {
  786. ether1_outw(dev, status & (SCB_STRNR | SCB_STCNA | SCB_STFR | SCB_STCX),
  787.     SCB_ADDR, scb_t, scb_command, NORMALIRQS);
  788. outb (CTRL_CA | CTRL_ACK, REG_CONTROL);
  789. if (status & SCB_STCX) {
  790. ether1_xmit_done (dev);
  791. }
  792. if (status & SCB_STCNA) {
  793. if (priv->resetting == 0)
  794. printk (KERN_WARNING "%s: CU went not ready ???n", dev->name);
  795. else
  796. priv->resetting += 1;
  797. if (ether1_inw (dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS)
  798. != (unsigned short)I82586_NULL) {
  799. ether1_outw (dev, SCB_CMDCUCSTART, SCB_ADDR, scb_t, scb_command, NORMALIRQS);
  800. outb (CTRL_CA, REG_CONTROL);
  801. }
  802. if (priv->resetting == 2)
  803. priv->resetting = 0;
  804. }
  805. if (status & SCB_STFR) {
  806. ether1_recv_done (dev);
  807. }
  808. if (status & SCB_STRNR) {
  809. if (ether1_inw (dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS) & SCB_STRXSUSP) {
  810. printk (KERN_WARNING "%s: RU went not ready: RU suspendedn", dev->name);
  811. ether1_outw (dev, SCB_CMDRXRESUME, SCB_ADDR, scb_t, scb_command, NORMALIRQS);
  812. outb (CTRL_CA, REG_CONTROL);
  813. priv->stats.rx_dropped ++; /* we suspended due to lack of buffer space */
  814. } else
  815. printk(KERN_WARNING "%s: RU went not ready: %04Xn", dev->name,
  816. ether1_inw (dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS));
  817. printk (KERN_WARNING "RU ptr = %04Xn", ether1_inw (dev, SCB_ADDR, scb_t, scb_rfa_offset,
  818. NORMALIRQS));
  819. }
  820. } else
  821.         outb (CTRL_ACK, REG_CONTROL);
  822. }
  823. static int
  824. ether1_close (struct net_device *dev)
  825. {
  826. ether1_reset (dev);
  827. free_irq(dev->irq, dev);
  828. return 0;
  829. }
  830. static struct net_device_stats *
  831. ether1_getstats (struct net_device *dev)
  832. {
  833. struct ether1_priv *priv = (struct ether1_priv *)dev->priv;
  834. return &priv->stats;
  835. }
  836. /*
  837.  * Set or clear the multicast filter for this adaptor.
  838.  * num_addrs == -1 Promiscuous mode, receive all packets.
  839.  * num_addrs == 0 Normal mode, clear multicast list.
  840.  * num_addrs > 0 Multicast mode, receive normal and MC packets, and do
  841.  * best-effort filtering.
  842.  */
  843. static void
  844. ether1_setmulticastlist (struct net_device *dev)
  845. {
  846. }
  847. /* ------------------------------------------------------------------------- */
  848. static void __init ether1_banner(void)
  849. {
  850. static unsigned int version_printed = 0;
  851. if (net_debug && version_printed++ == 0)
  852. printk(KERN_INFO "%s", version);
  853. }
  854. static struct net_device * __init ether1_init_one(struct expansion_card *ec)
  855. {
  856. struct net_device *dev;
  857. struct ether1_priv *priv;
  858. int i;
  859. ether1_banner();
  860. ecard_claim(ec);
  861. dev = init_etherdev(NULL, sizeof(struct ether1_priv));
  862. if (!dev)
  863. goto out;
  864. SET_MODULE_OWNER(dev);
  865. dev->base_addr = ecard_address(ec, ECARD_IOC, ECARD_FAST);
  866. dev->irq = ec->irq;
  867. /*
  868.  * these will not fail - the nature of the bus ensures this
  869.  */
  870. request_region(dev->base_addr, 16, dev->name);
  871. request_region(dev->base_addr + 0x800, 4096, dev->name);
  872. priv = (struct ether1_priv *)dev->priv;
  873. if ((priv->bus_type = ether1_reset(dev)) == 0)
  874. goto release;
  875. printk(KERN_INFO "%s: ether1 in slot %d, ",
  876. dev->name, ec->slot_no);
  877.     
  878. for (i = 0; i < 6; i++) {
  879. dev->dev_addr[i] = inb(IDPROM_ADDRESS + i);
  880. printk ("%2.2x%c", dev->dev_addr[i], i == 5 ? 'n' : ':');
  881. }
  882. if (ether1_init_2(dev))
  883. goto release;
  884. dev->open = ether1_open;
  885. dev->stop = ether1_close;
  886. dev->hard_start_xmit    = ether1_sendpacket;
  887. dev->get_stats = ether1_getstats;
  888. dev->set_multicast_list = ether1_setmulticastlist;
  889. dev->tx_timeout = ether1_timeout;
  890. dev->watchdog_timeo = 5 * HZ / 100;
  891. return 0;
  892. release:
  893. release_region(dev->base_addr, 16);
  894. release_region(dev->base_addr + 0x800, 4096);
  895. unregister_netdev(dev);
  896. kfree(dev);
  897. out:
  898. ecard_release(ec);
  899. return dev;
  900. }
  901. static struct expansion_card *e_card[MAX_ECARDS];
  902. static struct net_device *e_dev[MAX_ECARDS];
  903. static int __init ether1_init(void)
  904. {
  905. int i, ret = -ENODEV;
  906. ecard_startfind();
  907. for (i = 0; i < MAX_ECARDS; i++) {
  908. struct expansion_card *ec;
  909. struct net_device *dev;
  910. ec = ecard_find(0, ether1_cids);
  911. if (!ec)
  912. break;
  913. dev = ether1_init_one(ec);
  914. if (!dev)
  915. break;
  916. e_card[i] = ec;
  917. e_dev[i]  = dev;
  918. ret = 0;
  919. }
  920. return ret;
  921. }
  922. static void __exit ether1_exit(void)
  923. {
  924. int i;
  925. for (i = 0; i < MAX_ECARDS; i++) {
  926. if (e_dev[i]) {
  927. unregister_netdev(e_dev[i]);
  928. release_region(e_dev[i]->base_addr, 16);
  929. release_region(e_dev[i]->base_addr + 0x800, 4096);
  930. kfree(e_dev[i]);
  931. e_dev[i] = NULL;
  932. }
  933. if (e_card[i]) {
  934. ecard_release(e_card[i]);
  935. e_card[i] = NULL;
  936. }
  937. }
  938. }
  939. module_init(ether1_init);
  940. module_exit(ether1_exit);
  941. MODULE_LICENSE("GPL");