448 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Amiga Linux/m68k and Linux/PPC Zorro NS8390 Ethernet Driver4 *5 * (C) Copyright 1998-2000 by some Elitist 680x0 Users(TM)6 *7 * ---------------------------------------------------------------------------8 *9 * This program is based on all the other NE2000 drivers for Linux10 *11 * ---------------------------------------------------------------------------12 *13 * The Ariadne II and X-Surf are Zorro-II boards containing Realtek RTL8019AS14 * Ethernet Controllers.15 */16 17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt18 19#include <linux/module.h>20#include <linux/kernel.h>21#include <linux/errno.h>22#include <linux/init.h>23#include <linux/delay.h>24#include <linux/netdevice.h>25#include <linux/etherdevice.h>26#include <linux/zorro.h>27#include <linux/jiffies.h>28 29#include <asm/irq.h>30#include <asm/amigaints.h>31#include <asm/amigahw.h>32 33#define EI_SHIFT(x) (ei_local->reg_offset[x])34#define ei_inb(port) in_8(port)35#define ei_outb(val, port) out_8(port, val)36#define ei_inb_p(port) in_8(port)37#define ei_outb_p(val, port) out_8(port, val)38 39static const char version[] =40 "8390.c:v1.10cvs 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";41 42#include "lib8390.c"43 44#define DRV_NAME "zorro8390"45 46#define NE_BASE (dev->base_addr)47#define NE_CMD (0x00 * 2)48#define NE_DATAPORT (0x10 * 2) /* NatSemi-defined port window offset */49#define NE_RESET (0x1f * 2) /* Issue a read to reset,50 * a write to clear. */51#define NE_IO_EXTENT (0x20 * 2)52 53#define NE_EN0_ISR (0x07 * 2)54#define NE_EN0_DCFG (0x0e * 2)55 56#define NE_EN0_RSARLO (0x08 * 2)57#define NE_EN0_RSARHI (0x09 * 2)58#define NE_EN0_RCNTLO (0x0a * 2)59#define NE_EN0_RXCR (0x0c * 2)60#define NE_EN0_TXCR (0x0d * 2)61#define NE_EN0_RCNTHI (0x0b * 2)62#define NE_EN0_IMR (0x0f * 2)63 64#define NESM_START_PG 0x40 /* First page of TX buffer */65#define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */66 67#define WORDSWAP(a) ((((a) >> 8) & 0xff) | ((a) << 8))68 69static struct card_info {70 zorro_id id;71 const char *name;72 unsigned int offset;73} cards[] = {74 { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE2, "Ariadne II", 0x0600 },75 { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, "X-Surf", 0x8600 },76};77 78/* Hard reset the card. This used to pause for the same period that a79 * 8390 reset command required, but that shouldn't be necessary.80 */81static void zorro8390_reset_8390(struct net_device *dev)82{83 unsigned long reset_start_time = jiffies;84 struct ei_device *ei_local = netdev_priv(dev);85 86 netif_dbg(ei_local, hw, dev, "resetting - t=%ld...\n", jiffies);87 88 z_writeb(z_readb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);89 90 ei_status.txing = 0;91 ei_status.dmaing = 0;92 93 /* This check _should_not_ be necessary, omit eventually. */94 while ((z_readb(NE_BASE + NE_EN0_ISR) & ENISR_RESET) == 0)95 if (time_after(jiffies, reset_start_time + 2 * HZ / 100)) {96 netdev_warn(dev, "%s: did not complete\n", __func__);97 break;98 }99 z_writeb(ENISR_RESET, NE_BASE + NE_EN0_ISR); /* Ack intr */100}101 102/* Grab the 8390 specific header. Similar to the block_input routine, but103 * we don't need to be concerned with ring wrap as the header will be at104 * the start of a page, so we optimize accordingly.105 */106static void zorro8390_get_8390_hdr(struct net_device *dev,107 struct e8390_pkt_hdr *hdr, int ring_page)108{109 int nic_base = dev->base_addr;110 int cnt;111 short *ptrs;112 113 /* This *shouldn't* happen.114 * If it does, it's the last thing you'll see115 */116 if (ei_status.dmaing) {117 netdev_warn(dev,118 "%s: DMAing conflict [DMAstat:%d][irqlock:%d]\n",119 __func__, ei_status.dmaing, ei_status.irqlock);120 return;121 }122 123 ei_status.dmaing |= 0x01;124 z_writeb(E8390_NODMA + E8390_PAGE0 + E8390_START, nic_base + NE_CMD);125 z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR);126 z_writeb(sizeof(struct e8390_pkt_hdr), nic_base + NE_EN0_RCNTLO);127 z_writeb(0, nic_base + NE_EN0_RCNTHI);128 z_writeb(0, nic_base + NE_EN0_RSARLO); /* On page boundary */129 z_writeb(ring_page, nic_base + NE_EN0_RSARHI);130 z_writeb(E8390_RREAD+E8390_START, nic_base + NE_CMD);131 132 ptrs = (short *)hdr;133 for (cnt = 0; cnt < sizeof(struct e8390_pkt_hdr) >> 1; cnt++)134 *ptrs++ = z_readw(NE_BASE + NE_DATAPORT);135 136 z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); /* Ack intr */137 138 hdr->count = WORDSWAP(hdr->count);139 140 ei_status.dmaing &= ~0x01;141}142 143/* Block input and output, similar to the Crynwr packet driver.144 * If you are porting to a new ethercard, look at the packet driver source145 * for hints. The NEx000 doesn't share the on-board packet memory --146 * you have to put the packet out through the "remote DMA" dataport147 * using z_writeb.148 */149static void zorro8390_block_input(struct net_device *dev, int count,150 struct sk_buff *skb, int ring_offset)151{152 int nic_base = dev->base_addr;153 char *buf = skb->data;154 short *ptrs;155 int cnt;156 157 /* This *shouldn't* happen.158 * If it does, it's the last thing you'll see159 */160 if (ei_status.dmaing) {161 netdev_err(dev, "%s: DMAing conflict [DMAstat:%d][irqlock:%d]\n",162 __func__, ei_status.dmaing, ei_status.irqlock);163 return;164 }165 ei_status.dmaing |= 0x01;166 z_writeb(E8390_NODMA + E8390_PAGE0 + E8390_START, nic_base + NE_CMD);167 z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR);168 z_writeb(count & 0xff, nic_base + NE_EN0_RCNTLO);169 z_writeb(count >> 8, nic_base + NE_EN0_RCNTHI);170 z_writeb(ring_offset & 0xff, nic_base + NE_EN0_RSARLO);171 z_writeb(ring_offset >> 8, nic_base + NE_EN0_RSARHI);172 z_writeb(E8390_RREAD+E8390_START, nic_base + NE_CMD);173 ptrs = (short *)buf;174 for (cnt = 0; cnt < count >> 1; cnt++)175 *ptrs++ = z_readw(NE_BASE + NE_DATAPORT);176 if (count & 0x01)177 buf[count - 1] = z_readb(NE_BASE + NE_DATAPORT);178 179 z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); /* Ack intr */180 ei_status.dmaing &= ~0x01;181}182 183static void zorro8390_block_output(struct net_device *dev, int count,184 const unsigned char *buf,185 const int start_page)186{187 int nic_base = NE_BASE;188 unsigned long dma_start;189 short *ptrs;190 int cnt;191 192 /* Round the count up for word writes. Do we need to do this?193 * What effect will an odd byte count have on the 8390?194 * I should check someday.195 */196 if (count & 0x01)197 count++;198 199 /* This *shouldn't* happen.200 * If it does, it's the last thing you'll see201 */202 if (ei_status.dmaing) {203 netdev_err(dev, "%s: DMAing conflict [DMAstat:%d][irqlock:%d]\n",204 __func__, ei_status.dmaing, ei_status.irqlock);205 return;206 }207 ei_status.dmaing |= 0x01;208 /* We should already be in page 0, but to be safe... */209 z_writeb(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);210 211 z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR);212 213 /* Now the normal output. */214 z_writeb(count & 0xff, nic_base + NE_EN0_RCNTLO);215 z_writeb(count >> 8, nic_base + NE_EN0_RCNTHI);216 z_writeb(0x00, nic_base + NE_EN0_RSARLO);217 z_writeb(start_page, nic_base + NE_EN0_RSARHI);218 219 z_writeb(E8390_RWRITE + E8390_START, nic_base + NE_CMD);220 ptrs = (short *)buf;221 for (cnt = 0; cnt < count >> 1; cnt++)222 z_writew(*ptrs++, NE_BASE + NE_DATAPORT);223 224 dma_start = jiffies;225 226 while ((z_readb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0)227 if (time_after(jiffies, dma_start + 2 * HZ / 100)) {228 /* 20ms */229 netdev_warn(dev, "timeout waiting for Tx RDC\n");230 zorro8390_reset_8390(dev);231 __NS8390_init(dev, 1);232 break;233 }234 235 z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); /* Ack intr */236 ei_status.dmaing &= ~0x01;237}238 239static int zorro8390_open(struct net_device *dev)240{241 __ei_open(dev);242 return 0;243}244 245static int zorro8390_close(struct net_device *dev)246{247 struct ei_device *ei_local = netdev_priv(dev);248 249 netif_dbg(ei_local, ifdown, dev, "Shutting down ethercard\n");250 __ei_close(dev);251 return 0;252}253 254static void zorro8390_remove_one(struct zorro_dev *z)255{256 struct net_device *dev = zorro_get_drvdata(z);257 258 unregister_netdev(dev);259 free_irq(IRQ_AMIGA_PORTS, dev);260 release_mem_region(ZTWO_PADDR(dev->base_addr), NE_IO_EXTENT * 2);261 free_netdev(dev);262}263 264static struct zorro_device_id zorro8390_zorro_tbl[] = {265 { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE2, },266 { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, },267 { 0 }268};269MODULE_DEVICE_TABLE(zorro, zorro8390_zorro_tbl);270 271static const struct net_device_ops zorro8390_netdev_ops = {272 .ndo_open = zorro8390_open,273 .ndo_stop = zorro8390_close,274 .ndo_start_xmit = __ei_start_xmit,275 .ndo_tx_timeout = __ei_tx_timeout,276 .ndo_get_stats = __ei_get_stats,277 .ndo_set_rx_mode = __ei_set_multicast_list,278 .ndo_validate_addr = eth_validate_addr,279 .ndo_set_mac_address = eth_mac_addr,280#ifdef CONFIG_NET_POLL_CONTROLLER281 .ndo_poll_controller = __ei_poll,282#endif283};284 285static int zorro8390_init(struct net_device *dev, unsigned long board,286 const char *name, void __iomem *ioaddr)287{288 int i;289 int err;290 unsigned char SA_prom[32];291 int start_page, stop_page;292 static u32 zorro8390_offsets[16] = {293 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e,294 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,295 };296 297 /* Reset card. Who knows what dain-bramaged state it was left in. */298 {299 unsigned long reset_start_time = jiffies;300 301 z_writeb(z_readb(ioaddr + NE_RESET), ioaddr + NE_RESET);302 303 while ((z_readb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0)304 if (time_after(jiffies,305 reset_start_time + 2 * HZ / 100)) {306 netdev_warn(dev, "not found (no reset ack)\n");307 return -ENODEV;308 }309 310 z_writeb(0xff, ioaddr + NE_EN0_ISR); /* Ack all intr. */311 }312 313 /* Read the 16 bytes of station address PROM.314 * We must first initialize registers,315 * similar to NS8390_init(eifdev, 0).316 * We can't reliably read the SAPROM address without this.317 * (I learned the hard way!).318 */319 {320 static const struct {321 u32 value;322 u32 offset;323 } program_seq[] = {324 {E8390_NODMA + E8390_PAGE0 + E8390_STOP, NE_CMD},325 /* Select page 0 */326 {0x48, NE_EN0_DCFG}, /* 0x48: Set byte-wide access */327 {0x00, NE_EN0_RCNTLO}, /* Clear the count regs */328 {0x00, NE_EN0_RCNTHI},329 {0x00, NE_EN0_IMR}, /* Mask completion irq */330 {0xFF, NE_EN0_ISR},331 {E8390_RXOFF, NE_EN0_RXCR}, /* 0x20 Set to monitor */332 {E8390_TXOFF, NE_EN0_TXCR}, /* 0x02 and loopback mode */333 {32, NE_EN0_RCNTLO},334 {0x00, NE_EN0_RCNTHI},335 {0x00, NE_EN0_RSARLO}, /* DMA starting at 0x0000 */336 {0x00, NE_EN0_RSARHI},337 {E8390_RREAD + E8390_START, NE_CMD},338 };339 for (i = 0; i < ARRAY_SIZE(program_seq); i++)340 z_writeb(program_seq[i].value,341 ioaddr + program_seq[i].offset);342 }343 for (i = 0; i < 16; i++) {344 SA_prom[i] = z_readb(ioaddr + NE_DATAPORT);345 (void)z_readb(ioaddr + NE_DATAPORT);346 }347 348 /* We must set the 8390 for word mode. */349 z_writeb(0x49, ioaddr + NE_EN0_DCFG);350 start_page = NESM_START_PG;351 stop_page = NESM_STOP_PG;352 353 dev->base_addr = (unsigned long)ioaddr;354 dev->irq = IRQ_AMIGA_PORTS;355 356 /* Install the Interrupt handler */357 i = request_irq(IRQ_AMIGA_PORTS, __ei_interrupt,358 IRQF_SHARED, DRV_NAME, dev);359 if (i)360 return i;361 362 eth_hw_addr_set(dev, SA_prom);363 364 pr_debug("Found ethernet address: %pM\n", dev->dev_addr);365 366 ei_status.name = name;367 ei_status.tx_start_page = start_page;368 ei_status.stop_page = stop_page;369 ei_status.word16 = 1;370 371 ei_status.rx_start_page = start_page + TX_PAGES;372 373 ei_status.reset_8390 = zorro8390_reset_8390;374 ei_status.block_input = zorro8390_block_input;375 ei_status.block_output = zorro8390_block_output;376 ei_status.get_8390_hdr = zorro8390_get_8390_hdr;377 ei_status.reg_offset = zorro8390_offsets;378 379 dev->netdev_ops = &zorro8390_netdev_ops;380 __NS8390_init(dev, 0);381 382 err = register_netdev(dev);383 if (err) {384 free_irq(IRQ_AMIGA_PORTS, dev);385 return err;386 }387 388 netdev_info(dev, "%s at 0x%08lx, Ethernet Address %pM\n",389 name, board, dev->dev_addr);390 391 return 0;392}393 394static int zorro8390_init_one(struct zorro_dev *z,395 const struct zorro_device_id *ent)396{397 struct net_device *dev;398 unsigned long board, ioaddr;399 int err, i;400 401 for (i = ARRAY_SIZE(cards) - 1; i >= 0; i--)402 if (z->id == cards[i].id)403 break;404 if (i < 0)405 return -ENODEV;406 407 board = z->resource.start;408 ioaddr = board + cards[i].offset;409 dev = ____alloc_ei_netdev(0);410 if (!dev)411 return -ENOMEM;412 if (!request_mem_region(ioaddr, NE_IO_EXTENT * 2, DRV_NAME)) {413 free_netdev(dev);414 return -EBUSY;415 }416 err = zorro8390_init(dev, board, cards[i].name, ZTWO_VADDR(ioaddr));417 if (err) {418 release_mem_region(ioaddr, NE_IO_EXTENT * 2);419 free_netdev(dev);420 return err;421 }422 zorro_set_drvdata(z, dev);423 return 0;424}425 426static struct zorro_driver zorro8390_driver = {427 .name = "zorro8390",428 .id_table = zorro8390_zorro_tbl,429 .probe = zorro8390_init_one,430 .remove = zorro8390_remove_one,431};432 433static int __init zorro8390_init_module(void)434{435 return zorro_register_driver(&zorro8390_driver);436}437 438static void __exit zorro8390_cleanup_module(void)439{440 zorro_unregister_driver(&zorro8390_driver);441}442 443module_init(zorro8390_init_module);444module_exit(zorro8390_cleanup_module);445 446MODULE_DESCRIPTION("Zorro NS8390-based ethernet driver");447MODULE_LICENSE("GPL");448