1087 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * linux/drivers/acorn/net/ether1.c4 *5 * Copyright (C) 1996-2000 Russell King6 *7 * Acorn ether1 driver (82586 chip) for Acorn machines8 *9 * We basically keep two queues in the cards memory - one for transmit10 * and one for receive. Each has a head and a tail. The head is where11 * we/the chip adds packets to be transmitted/received, and the tail12 * is where the transmitter has got to/where the receiver will stop.13 * Both of these queues are circular, and since the chip is running14 * all the time, we have to be careful when we modify the pointers etc15 * so that the buffer memory contents is valid all the time.16 *17 * Change log:18 * 1.00 RMK Released19 * 1.01 RMK 19/03/1996 Transfers the last odd byte onto/off of the card now.20 * 1.02 RMK 25/05/1997 Added code to restart RU if it goes not ready21 * 1.03 RMK 14/09/1997 Cleaned up the handling of a reset during the TX interrupt.22 * Should prevent lockup.23 * 1.04 RMK 17/09/1997 Added more info when initialisation of chip goes wrong.24 * TDR now only reports failure when chip reports non-zero25 * TDR time-distance.26 * 1.05 RMK 31/12/1997 Removed calls to dev_tint for 2.127 * 1.06 RMK 10/02/2000 Updated for 2.3.4328 * 1.07 RMK 13/05/2000 Updated for 2.3.99-pre829 */30 31#include <linux/module.h>32#include <linux/kernel.h>33#include <linux/types.h>34#include <linux/fcntl.h>35#include <linux/interrupt.h>36#include <linux/ioport.h>37#include <linux/in.h>38#include <linux/slab.h>39#include <linux/string.h>40#include <linux/errno.h>41#include <linux/device.h>42#include <linux/init.h>43#include <linux/netdevice.h>44#include <linux/etherdevice.h>45#include <linux/skbuff.h>46#include <linux/bitops.h>47 48#include <asm/io.h>49#include <asm/dma.h>50#include <asm/ecard.h>51 52#define __ETHER1_C53#include "ether1.h"54 55static unsigned int net_debug = NET_DEBUG;56 57#define BUFFER_SIZE 0x1000058#define TX_AREA_START 0x0010059#define TX_AREA_END 0x0500060#define RX_AREA_START 0x0500061#define RX_AREA_END 0x0fc0062 63static int ether1_open(struct net_device *dev);64static netdev_tx_t ether1_sendpacket(struct sk_buff *skb,65 struct net_device *dev);66static irqreturn_t ether1_interrupt(int irq, void *dev_id);67static int ether1_close(struct net_device *dev);68static void ether1_setmulticastlist(struct net_device *dev);69static void ether1_timeout(struct net_device *dev, unsigned int txqueue);70 71/* ------------------------------------------------------------------------- */72 73static char version[] = "ether1 ethernet driver (c) 2000 Russell King v1.07\n";74 75#define BUS_16 1676#define BUS_8 877 78/* ------------------------------------------------------------------------- */79 80#define DISABLEIRQS 181#define NORMALIRQS 082 83#define ether1_readw(dev, addr, type, offset, svflgs) ether1_inw_p (dev, addr + (int)(&((type *)0)->offset), svflgs)84#define ether1_writew(dev, val, addr, type, offset, svflgs) ether1_outw_p (dev, val, addr + (int)(&((type *)0)->offset), svflgs)85 86static inline unsigned short87ether1_inw_p (struct net_device *dev, int addr, int svflgs)88{89 unsigned long flags;90 unsigned short ret;91 92 if (svflgs)93 local_irq_save (flags);94 95 writeb(addr >> 12, REG_PAGE);96 ret = readw(ETHER1_RAM + ((addr & 4095) << 1));97 if (svflgs)98 local_irq_restore (flags);99 return ret;100}101 102static inline void103ether1_outw_p (struct net_device *dev, unsigned short val, int addr, int svflgs)104{105 unsigned long flags;106 107 if (svflgs)108 local_irq_save (flags);109 110 writeb(addr >> 12, REG_PAGE);111 writew(val, ETHER1_RAM + ((addr & 4095) << 1));112 if (svflgs)113 local_irq_restore (flags);114}115 116/*117 * Some inline assembler to allow fast transfers on to/off of the card.118 * Since this driver depends on some features presented by the ARM119 * specific architecture, and that you can't configure this driver120 * without specifying ARM mode, this is not a problem.121 *122 * This routine is essentially an optimised memcpy from the card's123 * onboard RAM to kernel memory.124 */125static void126ether1_writebuffer (struct net_device *dev, void *data, unsigned int start, unsigned int length)127{128 unsigned int page, thislen, offset;129 void __iomem *addr;130 131 offset = start & 4095;132 page = start >> 12;133 addr = ETHER1_RAM + (offset << 1);134 135 if (offset + length > 4096)136 thislen = 4096 - offset;137 else138 thislen = length;139 140 do {141 int used;142 143 writeb(page, REG_PAGE);144 length -= thislen;145 146 __asm__ __volatile__(147 "subs %3, %3, #2\n\148 bmi 2f\n\1491: ldr %0, [%1], #2\n\150 mov %0, %0, lsl #16\n\151 orr %0, %0, %0, lsr #16\n\152 str %0, [%2], #4\n\153 subs %3, %3, #2\n\154 bmi 2f\n\155 ldr %0, [%1], #2\n\156 mov %0, %0, lsl #16\n\157 orr %0, %0, %0, lsr #16\n\158 str %0, [%2], #4\n\159 subs %3, %3, #2\n\160 bmi 2f\n\161 ldr %0, [%1], #2\n\162 mov %0, %0, lsl #16\n\163 orr %0, %0, %0, lsr #16\n\164 str %0, [%2], #4\n\165 subs %3, %3, #2\n\166 bmi 2f\n\167 ldr %0, [%1], #2\n\168 mov %0, %0, lsl #16\n\169 orr %0, %0, %0, lsr #16\n\170 str %0, [%2], #4\n\171 subs %3, %3, #2\n\172 bpl 1b\n\1732: adds %3, %3, #1\n\174 ldreqb %0, [%1]\n\175 streqb %0, [%2]"176 : "=&r" (used), "=&r" (data)177 : "r" (addr), "r" (thislen), "1" (data));178 179 addr = ETHER1_RAM;180 181 thislen = length;182 if (thislen > 4096)183 thislen = 4096;184 page++;185 } while (thislen);186}187 188static void189ether1_readbuffer (struct net_device *dev, void *data, unsigned int start, unsigned int length)190{191 unsigned int page, thislen, offset;192 void __iomem *addr;193 194 offset = start & 4095;195 page = start >> 12;196 addr = ETHER1_RAM + (offset << 1);197 198 if (offset + length > 4096)199 thislen = 4096 - offset;200 else201 thislen = length;202 203 do {204 int used;205 206 writeb(page, REG_PAGE);207 length -= thislen;208 209 __asm__ __volatile__(210 "subs %3, %3, #2\n\211 bmi 2f\n\2121: ldr %0, [%2], #4\n\213 strb %0, [%1], #1\n\214 mov %0, %0, lsr #8\n\215 strb %0, [%1], #1\n\216 subs %3, %3, #2\n\217 bmi 2f\n\218 ldr %0, [%2], #4\n\219 strb %0, [%1], #1\n\220 mov %0, %0, lsr #8\n\221 strb %0, [%1], #1\n\222 subs %3, %3, #2\n\223 bmi 2f\n\224 ldr %0, [%2], #4\n\225 strb %0, [%1], #1\n\226 mov %0, %0, lsr #8\n\227 strb %0, [%1], #1\n\228 subs %3, %3, #2\n\229 bmi 2f\n\230 ldr %0, [%2], #4\n\231 strb %0, [%1], #1\n\232 mov %0, %0, lsr #8\n\233 strb %0, [%1], #1\n\234 subs %3, %3, #2\n\235 bpl 1b\n\2362: adds %3, %3, #1\n\237 ldreqb %0, [%2]\n\238 streqb %0, [%1]"239 : "=&r" (used), "=&r" (data)240 : "r" (addr), "r" (thislen), "1" (data));241 242 addr = ETHER1_RAM;243 244 thislen = length;245 if (thislen > 4096)246 thislen = 4096;247 page++;248 } while (thislen);249}250 251static int252ether1_ramtest(struct net_device *dev, unsigned char byte)253{254 unsigned char *buffer = kmalloc (BUFFER_SIZE, GFP_KERNEL);255 int i, ret = BUFFER_SIZE;256 int max_errors = 15;257 int bad = -1;258 int bad_start = 0;259 260 if (!buffer)261 return 1;262 263 memset (buffer, byte, BUFFER_SIZE);264 ether1_writebuffer (dev, buffer, 0, BUFFER_SIZE);265 memset (buffer, byte ^ 0xff, BUFFER_SIZE);266 ether1_readbuffer (dev, buffer, 0, BUFFER_SIZE);267 268 for (i = 0; i < BUFFER_SIZE; i++) {269 if (buffer[i] != byte) {270 if (max_errors >= 0 && bad != buffer[i]) {271 if (bad != -1)272 printk ("\n");273 printk (KERN_CRIT "%s: RAM failed with (%02X instead of %02X) at 0x%04X",274 dev->name, buffer[i], byte, i);275 ret = -ENODEV;276 max_errors --;277 bad = buffer[i];278 bad_start = i;279 }280 } else {281 if (bad != -1) {282 if (bad_start == i - 1)283 printk ("\n");284 else285 printk (" - 0x%04X\n", i - 1);286 bad = -1;287 }288 }289 }290 291 if (bad != -1)292 printk (" - 0x%04X\n", BUFFER_SIZE);293 kfree (buffer);294 295 return ret;296}297 298static int299ether1_reset (struct net_device *dev)300{301 writeb(CTRL_RST|CTRL_ACK, REG_CONTROL);302 return BUS_16;303}304 305static int306ether1_init_2(struct net_device *dev)307{308 int i;309 dev->mem_start = 0;310 311 i = ether1_ramtest (dev, 0x5a);312 313 if (i > 0)314 i = ether1_ramtest (dev, 0x1e);315 316 if (i <= 0)317 return -ENODEV;318 319 dev->mem_end = i;320 return 0;321}322 323/*324 * These are the structures that are loaded into the ether RAM card to325 * initialise the 82586326 */327 328/* at 0x0100 */329#define NOP_ADDR (TX_AREA_START)330#define NOP_SIZE (0x06)331static nop_t init_nop = {332 0,333 CMD_NOP,334 NOP_ADDR335};336 337/* at 0x003a */338#define TDR_ADDR (0x003a)339#define TDR_SIZE (0x08)340static tdr_t init_tdr = {341 0,342 CMD_TDR | CMD_INTR,343 NOP_ADDR,344 0345};346 347/* at 0x002e */348#define MC_ADDR (0x002e)349#define MC_SIZE (0x0c)350static mc_t init_mc = {351 0,352 CMD_SETMULTICAST,353 TDR_ADDR,354 0,355 { { 0, } }356};357 358/* at 0x0022 */359#define SA_ADDR (0x0022)360#define SA_SIZE (0x0c)361static sa_t init_sa = {362 0,363 CMD_SETADDRESS,364 MC_ADDR,365 { 0, }366};367 368/* at 0x0010 */369#define CFG_ADDR (0x0010)370#define CFG_SIZE (0x12)371static cfg_t init_cfg = {372 0,373 CMD_CONFIG,374 SA_ADDR,375 8,376 8,377 CFG8_SRDY,378 CFG9_PREAMB8 | CFG9_ADDRLENBUF | CFG9_ADDRLEN(6),379 0,380 0x60,381 0,382 CFG13_RETRY(15) | CFG13_SLOTH(2),383 0,384};385 386/* at 0x0000 */387#define SCB_ADDR (0x0000)388#define SCB_SIZE (0x10)389static scb_t init_scb = {390 0,391 SCB_CMDACKRNR | SCB_CMDACKCNA | SCB_CMDACKFR | SCB_CMDACKCX,392 CFG_ADDR,393 RX_AREA_START,394 0,395 0,396 0,397 0398};399 400/* at 0xffee */401#define ISCP_ADDR (0xffee)402#define ISCP_SIZE (0x08)403static iscp_t init_iscp = {404 1,405 SCB_ADDR,406 0x0000,407 0x0000408};409 410/* at 0xfff6 */411#define SCP_ADDR (0xfff6)412#define SCP_SIZE (0x0a)413static scp_t init_scp = {414 SCP_SY_16BBUS,415 { 0, 0 },416 ISCP_ADDR,417 0418};419 420#define RFD_SIZE (0x16)421static rfd_t init_rfd = {422 0,423 0,424 0,425 0,426 { 0, },427 { 0, },428 0429};430 431#define RBD_SIZE (0x0a)432static rbd_t init_rbd = {433 0,434 0,435 0,436 0,437 ETH_FRAME_LEN + 8438};439 440#define TX_SIZE (0x08)441#define TBD_SIZE (0x08)442 443static int444ether1_init_for_open (struct net_device *dev)445{446 int i, status, addr, next, next2;447 int failures = 0;448 unsigned long timeout;449 450 writeb(CTRL_RST|CTRL_ACK, REG_CONTROL);451 452 for (i = 0; i < 6; i++)453 init_sa.sa_addr[i] = dev->dev_addr[i];454 455 /* load data structures into ether1 RAM */456 ether1_writebuffer (dev, &init_scp, SCP_ADDR, SCP_SIZE);457 ether1_writebuffer (dev, &init_iscp, ISCP_ADDR, ISCP_SIZE);458 ether1_writebuffer (dev, &init_scb, SCB_ADDR, SCB_SIZE);459 ether1_writebuffer (dev, &init_cfg, CFG_ADDR, CFG_SIZE);460 ether1_writebuffer (dev, &init_sa, SA_ADDR, SA_SIZE);461 ether1_writebuffer (dev, &init_mc, MC_ADDR, MC_SIZE);462 ether1_writebuffer (dev, &init_tdr, TDR_ADDR, TDR_SIZE);463 ether1_writebuffer (dev, &init_nop, NOP_ADDR, NOP_SIZE);464 465 if (ether1_readw(dev, CFG_ADDR, cfg_t, cfg_command, NORMALIRQS) != CMD_CONFIG) {466 printk (KERN_ERR "%s: detected either RAM fault or compiler bug\n",467 dev->name);468 return 1;469 }470 471 /*472 * setup circularly linked list of { rfd, rbd, buffer }, with473 * all rfds circularly linked, rbds circularly linked.474 * First rfd is linked to scp, first rbd is linked to first475 * rfd. Last rbd has a suspend command.476 */477 addr = RX_AREA_START;478 do {479 next = addr + RFD_SIZE + RBD_SIZE + ETH_FRAME_LEN + 10;480 next2 = next + RFD_SIZE + RBD_SIZE + ETH_FRAME_LEN + 10;481 482 if (next2 >= RX_AREA_END) {483 next = RX_AREA_START;484 init_rfd.rfd_command = RFD_CMDEL | RFD_CMDSUSPEND;485 priv(dev)->rx_tail = addr;486 } else487 init_rfd.rfd_command = 0;488 if (addr == RX_AREA_START)489 init_rfd.rfd_rbdoffset = addr + RFD_SIZE;490 else491 init_rfd.rfd_rbdoffset = 0;492 init_rfd.rfd_link = next;493 init_rbd.rbd_link = next + RFD_SIZE;494 init_rbd.rbd_bufl = addr + RFD_SIZE + RBD_SIZE;495 496 ether1_writebuffer (dev, &init_rfd, addr, RFD_SIZE);497 ether1_writebuffer (dev, &init_rbd, addr + RFD_SIZE, RBD_SIZE);498 addr = next;499 } while (next2 < RX_AREA_END);500 501 priv(dev)->tx_link = NOP_ADDR;502 priv(dev)->tx_head = NOP_ADDR + NOP_SIZE;503 priv(dev)->tx_tail = TDR_ADDR;504 priv(dev)->rx_head = RX_AREA_START;505 506 /* release reset & give 586 a prod */507 priv(dev)->resetting = 1;508 priv(dev)->initialising = 1;509 writeb(CTRL_RST, REG_CONTROL);510 writeb(0, REG_CONTROL);511 writeb(CTRL_CA, REG_CONTROL);512 513 /* 586 should now unset iscp.busy */514 timeout = jiffies + HZ/2;515 while (ether1_readw(dev, ISCP_ADDR, iscp_t, iscp_busy, DISABLEIRQS) == 1) {516 if (time_after(jiffies, timeout)) {517 printk (KERN_WARNING "%s: can't initialise 82586: iscp is busy\n", dev->name);518 return 1;519 }520 }521 522 /* check status of commands that we issued */523 timeout += HZ/10;524 while (((status = ether1_readw(dev, CFG_ADDR, cfg_t, cfg_status, DISABLEIRQS))525 & STAT_COMPLETE) == 0) {526 if (time_after(jiffies, timeout))527 break;528 }529 530 if ((status & (STAT_COMPLETE | STAT_OK)) != (STAT_COMPLETE | STAT_OK)) {531 printk (KERN_WARNING "%s: can't initialise 82586: config status %04X\n", dev->name, status);532 printk (KERN_DEBUG "%s: SCB=[STS=%04X CMD=%04X CBL=%04X RFA=%04X]\n", dev->name,533 ether1_readw(dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS),534 ether1_readw(dev, SCB_ADDR, scb_t, scb_command, NORMALIRQS),535 ether1_readw(dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS),536 ether1_readw(dev, SCB_ADDR, scb_t, scb_rfa_offset, NORMALIRQS));537 failures += 1;538 }539 540 timeout += HZ/10;541 while (((status = ether1_readw(dev, SA_ADDR, sa_t, sa_status, DISABLEIRQS))542 & STAT_COMPLETE) == 0) {543 if (time_after(jiffies, timeout))544 break;545 }546 547 if ((status & (STAT_COMPLETE | STAT_OK)) != (STAT_COMPLETE | STAT_OK)) {548 printk (KERN_WARNING "%s: can't initialise 82586: set address status %04X\n", dev->name, status);549 printk (KERN_DEBUG "%s: SCB=[STS=%04X CMD=%04X CBL=%04X RFA=%04X]\n", dev->name,550 ether1_readw(dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS),551 ether1_readw(dev, SCB_ADDR, scb_t, scb_command, NORMALIRQS),552 ether1_readw(dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS),553 ether1_readw(dev, SCB_ADDR, scb_t, scb_rfa_offset, NORMALIRQS));554 failures += 1;555 }556 557 timeout += HZ/10;558 while (((status = ether1_readw(dev, MC_ADDR, mc_t, mc_status, DISABLEIRQS))559 & STAT_COMPLETE) == 0) {560 if (time_after(jiffies, timeout))561 break;562 }563 564 if ((status & (STAT_COMPLETE | STAT_OK)) != (STAT_COMPLETE | STAT_OK)) {565 printk (KERN_WARNING "%s: can't initialise 82586: set multicast status %04X\n", dev->name, status);566 printk (KERN_DEBUG "%s: SCB=[STS=%04X CMD=%04X CBL=%04X RFA=%04X]\n", dev->name,567 ether1_readw(dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS),568 ether1_readw(dev, SCB_ADDR, scb_t, scb_command, NORMALIRQS),569 ether1_readw(dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS),570 ether1_readw(dev, SCB_ADDR, scb_t, scb_rfa_offset, NORMALIRQS));571 failures += 1;572 }573 574 timeout += HZ;575 while (((status = ether1_readw(dev, TDR_ADDR, tdr_t, tdr_status, DISABLEIRQS))576 & STAT_COMPLETE) == 0) {577 if (time_after(jiffies, timeout))578 break;579 }580 581 if ((status & (STAT_COMPLETE | STAT_OK)) != (STAT_COMPLETE | STAT_OK)) {582 printk (KERN_WARNING "%s: can't tdr (ignored)\n", dev->name);583 printk (KERN_DEBUG "%s: SCB=[STS=%04X CMD=%04X CBL=%04X RFA=%04X]\n", dev->name,584 ether1_readw(dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS),585 ether1_readw(dev, SCB_ADDR, scb_t, scb_command, NORMALIRQS),586 ether1_readw(dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS),587 ether1_readw(dev, SCB_ADDR, scb_t, scb_rfa_offset, NORMALIRQS));588 } else {589 status = ether1_readw(dev, TDR_ADDR, tdr_t, tdr_result, DISABLEIRQS);590 if (status & TDR_XCVRPROB)591 printk (KERN_WARNING "%s: i/f failed tdr: transceiver problem\n", dev->name);592 else if ((status & (TDR_SHORT|TDR_OPEN)) && (status & TDR_TIME)) {593#ifdef FANCY594 printk (KERN_WARNING "%s: i/f failed tdr: cable %s %d.%d us away\n", dev->name,595 status & TDR_SHORT ? "short" : "open", (status & TDR_TIME) / 10,596 (status & TDR_TIME) % 10);597#else598 printk (KERN_WARNING "%s: i/f failed tdr: cable %s %d clks away\n", dev->name,599 status & TDR_SHORT ? "short" : "open", (status & TDR_TIME));600#endif601 }602 }603 604 if (failures)605 ether1_reset (dev);606 return failures ? 1 : 0;607}608 609/* ------------------------------------------------------------------------- */610 611static int612ether1_txalloc (struct net_device *dev, int size)613{614 int start, tail;615 616 size = (size + 1) & ~1;617 tail = priv(dev)->tx_tail;618 619 if (priv(dev)->tx_head + size > TX_AREA_END) {620 if (tail > priv(dev)->tx_head)621 return -1;622 start = TX_AREA_START;623 if (start + size > tail)624 return -1;625 priv(dev)->tx_head = start + size;626 } else {627 if (priv(dev)->tx_head < tail && (priv(dev)->tx_head + size) > tail)628 return -1;629 start = priv(dev)->tx_head;630 priv(dev)->tx_head += size;631 }632 633 return start;634}635 636static int637ether1_open (struct net_device *dev)638{639 if (request_irq(dev->irq, ether1_interrupt, 0, "ether1", dev))640 return -EAGAIN;641 642 if (ether1_init_for_open (dev)) {643 free_irq (dev->irq, dev);644 return -EAGAIN;645 }646 647 netif_start_queue(dev);648 649 return 0;650}651 652static void653ether1_timeout(struct net_device *dev, unsigned int txqueue)654{655 printk(KERN_WARNING "%s: transmit timeout, network cable problem?\n",656 dev->name);657 printk(KERN_WARNING "%s: resetting device\n", dev->name);658 659 ether1_reset (dev);660 661 if (ether1_init_for_open (dev))662 printk (KERN_ERR "%s: unable to restart interface\n", dev->name);663 664 dev->stats.tx_errors++;665 netif_wake_queue(dev);666}667 668static netdev_tx_t669ether1_sendpacket (struct sk_buff *skb, struct net_device *dev)670{671 int tmp, tst, nopaddr, txaddr, tbdaddr, dataddr;672 unsigned long flags;673 tx_t tx;674 tbd_t tbd;675 nop_t nop;676 677 if (priv(dev)->restart) {678 printk(KERN_WARNING "%s: resetting device\n", dev->name);679 680 ether1_reset(dev);681 682 if (ether1_init_for_open(dev))683 printk(KERN_ERR "%s: unable to restart interface\n", dev->name);684 else685 priv(dev)->restart = 0;686 }687 688 if (skb->len < ETH_ZLEN) {689 if (skb_padto(skb, ETH_ZLEN))690 goto out;691 }692 693 /*694 * insert packet followed by a nop695 */696 txaddr = ether1_txalloc (dev, TX_SIZE);697 tbdaddr = ether1_txalloc (dev, TBD_SIZE);698 dataddr = ether1_txalloc (dev, skb->len);699 nopaddr = ether1_txalloc (dev, NOP_SIZE);700 701 tx.tx_status = 0;702 tx.tx_command = CMD_TX | CMD_INTR;703 tx.tx_link = nopaddr;704 tx.tx_tbdoffset = tbdaddr;705 tbd.tbd_opts = TBD_EOL | skb->len;706 tbd.tbd_link = I82586_NULL;707 tbd.tbd_bufl = dataddr;708 tbd.tbd_bufh = 0;709 nop.nop_status = 0;710 nop.nop_command = CMD_NOP;711 nop.nop_link = nopaddr;712 713 local_irq_save(flags);714 ether1_writebuffer (dev, &tx, txaddr, TX_SIZE);715 ether1_writebuffer (dev, &tbd, tbdaddr, TBD_SIZE);716 ether1_writebuffer (dev, skb->data, dataddr, skb->len);717 ether1_writebuffer (dev, &nop, nopaddr, NOP_SIZE);718 tmp = priv(dev)->tx_link;719 priv(dev)->tx_link = nopaddr;720 721 /* now reset the previous nop pointer */722 ether1_writew(dev, txaddr, tmp, nop_t, nop_link, NORMALIRQS);723 724 local_irq_restore(flags);725 726 /* handle transmit */727 728 /* check to see if we have room for a full sized ether frame */729 tmp = priv(dev)->tx_head;730 tst = ether1_txalloc (dev, TX_SIZE + TBD_SIZE + NOP_SIZE + ETH_FRAME_LEN);731 priv(dev)->tx_head = tmp;732 dev_kfree_skb (skb);733 734 if (tst == -1)735 netif_stop_queue(dev);736 737 out:738 return NETDEV_TX_OK;739}740 741static void742ether1_xmit_done (struct net_device *dev)743{744 nop_t nop;745 int caddr, tst;746 747 caddr = priv(dev)->tx_tail;748 749again:750 ether1_readbuffer (dev, &nop, caddr, NOP_SIZE);751 752 switch (nop.nop_command & CMD_MASK) {753 case CMD_TDR:754 /* special case */755 if (ether1_readw(dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS)756 != (unsigned short)I82586_NULL) {757 ether1_writew(dev, SCB_CMDCUCSTART | SCB_CMDRXSTART, SCB_ADDR, scb_t,758 scb_command, NORMALIRQS);759 writeb(CTRL_CA, REG_CONTROL);760 }761 priv(dev)->tx_tail = NOP_ADDR;762 return;763 764 case CMD_NOP:765 if (nop.nop_link == caddr) {766 if (priv(dev)->initialising == 0)767 printk (KERN_WARNING "%s: strange command complete with no tx command!\n", dev->name);768 else769 priv(dev)->initialising = 0;770 return;771 }772 if (caddr == nop.nop_link)773 return;774 caddr = nop.nop_link;775 goto again;776 777 case CMD_TX:778 if (nop.nop_status & STAT_COMPLETE)779 break;780 printk (KERN_ERR "%s: strange command complete without completed command\n", dev->name);781 priv(dev)->restart = 1;782 return;783 784 default:785 printk (KERN_WARNING "%s: strange command %d complete! (offset %04X)", dev->name,786 nop.nop_command & CMD_MASK, caddr);787 priv(dev)->restart = 1;788 return;789 }790 791 while (nop.nop_status & STAT_COMPLETE) {792 if (nop.nop_status & STAT_OK) {793 dev->stats.tx_packets++;794 dev->stats.collisions += (nop.nop_status & STAT_COLLISIONS);795 } else {796 dev->stats.tx_errors++;797 798 if (nop.nop_status & STAT_COLLAFTERTX)799 dev->stats.collisions++;800 if (nop.nop_status & STAT_NOCARRIER)801 dev->stats.tx_carrier_errors++;802 if (nop.nop_status & STAT_TXLOSTCTS)803 printk (KERN_WARNING "%s: cts lost\n", dev->name);804 if (nop.nop_status & STAT_TXSLOWDMA)805 dev->stats.tx_fifo_errors++;806 if (nop.nop_status & STAT_COLLEXCESSIVE)807 dev->stats.collisions += 16;808 }809 810 if (nop.nop_link == caddr) {811 printk (KERN_ERR "%s: tx buffer chaining error: tx command points to itself\n", dev->name);812 break;813 }814 815 caddr = nop.nop_link;816 ether1_readbuffer (dev, &nop, caddr, NOP_SIZE);817 if ((nop.nop_command & CMD_MASK) != CMD_NOP) {818 printk (KERN_ERR "%s: tx buffer chaining error: no nop after tx command\n", dev->name);819 break;820 }821 822 if (caddr == nop.nop_link)823 break;824 825 caddr = nop.nop_link;826 ether1_readbuffer (dev, &nop, caddr, NOP_SIZE);827 if ((nop.nop_command & CMD_MASK) != CMD_TX) {828 printk (KERN_ERR "%s: tx buffer chaining error: no tx command after nop\n", dev->name);829 break;830 }831 }832 priv(dev)->tx_tail = caddr;833 834 caddr = priv(dev)->tx_head;835 tst = ether1_txalloc (dev, TX_SIZE + TBD_SIZE + NOP_SIZE + ETH_FRAME_LEN);836 priv(dev)->tx_head = caddr;837 if (tst != -1)838 netif_wake_queue(dev);839}840 841static void842ether1_recv_done (struct net_device *dev)843{844 int status;845 int nexttail, rbdaddr;846 rbd_t rbd;847 848 do {849 status = ether1_readw(dev, priv(dev)->rx_head, rfd_t, rfd_status, NORMALIRQS);850 if ((status & RFD_COMPLETE) == 0)851 break;852 853 rbdaddr = ether1_readw(dev, priv(dev)->rx_head, rfd_t, rfd_rbdoffset, NORMALIRQS);854 ether1_readbuffer (dev, &rbd, rbdaddr, RBD_SIZE);855 856 if ((rbd.rbd_status & (RBD_EOF | RBD_ACNTVALID)) == (RBD_EOF | RBD_ACNTVALID)) {857 int length = rbd.rbd_status & RBD_ACNT;858 struct sk_buff *skb;859 860 length = (length + 1) & ~1;861 skb = netdev_alloc_skb(dev, length + 2);862 863 if (skb) {864 skb_reserve (skb, 2);865 866 ether1_readbuffer (dev, skb_put (skb, length), rbd.rbd_bufl, length);867 868 skb->protocol = eth_type_trans (skb, dev);869 netif_rx (skb);870 dev->stats.rx_packets++;871 } else872 dev->stats.rx_dropped++;873 } else {874 printk(KERN_WARNING "%s: %s\n", dev->name,875 (rbd.rbd_status & RBD_EOF) ? "oversized packet" : "acnt not valid");876 dev->stats.rx_dropped++;877 }878 879 nexttail = ether1_readw(dev, priv(dev)->rx_tail, rfd_t, rfd_link, NORMALIRQS);880 /* nexttail should be rx_head */881 if (nexttail != priv(dev)->rx_head)882 printk(KERN_ERR "%s: receiver buffer chaining error (%04X != %04X)\n",883 dev->name, nexttail, priv(dev)->rx_head);884 ether1_writew(dev, RFD_CMDEL | RFD_CMDSUSPEND, nexttail, rfd_t, rfd_command, NORMALIRQS);885 ether1_writew(dev, 0, priv(dev)->rx_tail, rfd_t, rfd_command, NORMALIRQS);886 ether1_writew(dev, 0, priv(dev)->rx_tail, rfd_t, rfd_status, NORMALIRQS);887 ether1_writew(dev, 0, priv(dev)->rx_tail, rfd_t, rfd_rbdoffset, NORMALIRQS);888 889 priv(dev)->rx_tail = nexttail;890 priv(dev)->rx_head = ether1_readw(dev, priv(dev)->rx_head, rfd_t, rfd_link, NORMALIRQS);891 } while (1);892}893 894static irqreturn_t895ether1_interrupt (int irq, void *dev_id)896{897 struct net_device *dev = (struct net_device *)dev_id;898 int status;899 900 status = ether1_readw(dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS);901 902 if (status) {903 ether1_writew(dev, status & (SCB_STRNR | SCB_STCNA | SCB_STFR | SCB_STCX),904 SCB_ADDR, scb_t, scb_command, NORMALIRQS);905 writeb(CTRL_CA | CTRL_ACK, REG_CONTROL);906 if (status & SCB_STCX) {907 ether1_xmit_done (dev);908 }909 if (status & SCB_STCNA) {910 if (priv(dev)->resetting == 0)911 printk (KERN_WARNING "%s: CU went not ready ???\n", dev->name);912 else913 priv(dev)->resetting += 1;914 if (ether1_readw(dev, SCB_ADDR, scb_t, scb_cbl_offset, NORMALIRQS)915 != (unsigned short)I82586_NULL) {916 ether1_writew(dev, SCB_CMDCUCSTART, SCB_ADDR, scb_t, scb_command, NORMALIRQS);917 writeb(CTRL_CA, REG_CONTROL);918 }919 if (priv(dev)->resetting == 2)920 priv(dev)->resetting = 0;921 }922 if (status & SCB_STFR) {923 ether1_recv_done (dev);924 }925 if (status & SCB_STRNR) {926 if (ether1_readw(dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS) & SCB_STRXSUSP) {927 printk (KERN_WARNING "%s: RU went not ready: RU suspended\n", dev->name);928 ether1_writew(dev, SCB_CMDRXRESUME, SCB_ADDR, scb_t, scb_command, NORMALIRQS);929 writeb(CTRL_CA, REG_CONTROL);930 dev->stats.rx_dropped++; /* we suspended due to lack of buffer space */931 } else932 printk(KERN_WARNING "%s: RU went not ready: %04X\n", dev->name,933 ether1_readw(dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS));934 printk (KERN_WARNING "RU ptr = %04X\n", ether1_readw(dev, SCB_ADDR, scb_t, scb_rfa_offset,935 NORMALIRQS));936 }937 } else938 writeb(CTRL_ACK, REG_CONTROL);939 940 return IRQ_HANDLED;941}942 943static int944ether1_close (struct net_device *dev)945{946 ether1_reset (dev);947 948 free_irq(dev->irq, dev);949 950 return 0;951}952 953/*954 * Set or clear the multicast filter for this adaptor.955 * num_addrs == -1 Promiscuous mode, receive all packets.956 * num_addrs == 0 Normal mode, clear multicast list.957 * num_addrs > 0 Multicast mode, receive normal and MC packets, and do958 * best-effort filtering.959 */960static void961ether1_setmulticastlist (struct net_device *dev)962{963}964 965/* ------------------------------------------------------------------------- */966 967static void ether1_banner(void)968{969 static unsigned int version_printed = 0;970 971 if (net_debug && version_printed++ == 0)972 printk(KERN_INFO "%s", version);973}974 975static const struct net_device_ops ether1_netdev_ops = {976 .ndo_open = ether1_open,977 .ndo_stop = ether1_close,978 .ndo_start_xmit = ether1_sendpacket,979 .ndo_set_rx_mode = ether1_setmulticastlist,980 .ndo_tx_timeout = ether1_timeout,981 .ndo_validate_addr = eth_validate_addr,982 .ndo_set_mac_address = eth_mac_addr,983};984 985static int986ether1_probe(struct expansion_card *ec, const struct ecard_id *id)987{988 struct net_device *dev;989 u8 addr[ETH_ALEN];990 int i, ret = 0;991 992 ether1_banner();993 994 ret = ecard_request_resources(ec);995 if (ret)996 goto out;997 998 dev = alloc_etherdev(sizeof(struct ether1_priv));999 if (!dev) {1000 ret = -ENOMEM;1001 goto release;1002 }1003 1004 SET_NETDEV_DEV(dev, &ec->dev);1005 1006 dev->irq = ec->irq;1007 priv(dev)->base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);1008 if (!priv(dev)->base) {1009 ret = -ENOMEM;1010 goto free;1011 }1012 1013 if ((priv(dev)->bus_type = ether1_reset(dev)) == 0) {1014 ret = -ENODEV;1015 goto free;1016 }1017 1018 for (i = 0; i < 6; i++)1019 addr[i] = readb(IDPROM_ADDRESS + (i << 2));1020 eth_hw_addr_set(dev, addr);1021 1022 if (ether1_init_2(dev)) {1023 ret = -ENODEV;1024 goto free;1025 }1026 1027 dev->netdev_ops = ðer1_netdev_ops;1028 dev->watchdog_timeo = 5 * HZ / 100;1029 1030 ret = register_netdev(dev);1031 if (ret)1032 goto free;1033 1034 printk(KERN_INFO "%s: ether1 in slot %d, %pM\n",1035 dev->name, ec->slot_no, dev->dev_addr);1036 1037 ecard_set_drvdata(ec, dev);1038 return 0;1039 1040 free:1041 free_netdev(dev);1042 release:1043 ecard_release_resources(ec);1044 out:1045 return ret;1046}1047 1048static void ether1_remove(struct expansion_card *ec)1049{1050 struct net_device *dev = ecard_get_drvdata(ec);1051 1052 ecard_set_drvdata(ec, NULL); 1053 1054 unregister_netdev(dev);1055 free_netdev(dev);1056 ecard_release_resources(ec);1057}1058 1059static const struct ecard_id ether1_ids[] = {1060 { MANU_ACORN, PROD_ACORN_ETHER1 },1061 { 0xffff, 0xffff }1062};1063 1064static struct ecard_driver ether1_driver = {1065 .probe = ether1_probe,1066 .remove = ether1_remove,1067 .id_table = ether1_ids,1068 .drv = {1069 .name = "ether1",1070 },1071};1072 1073static int __init ether1_init(void)1074{1075 return ecard_register_driver(ðer1_driver);1076}1077 1078static void __exit ether1_exit(void)1079{1080 ecard_remove_driver(ðer1_driver);1081}1082 1083module_init(ether1_init);1084module_exit(ether1_exit);1085 1086MODULE_LICENSE("GPL");1087