brintos

brintos / linux-shallow public Read only

0
0
Text · 12.4 KiB · c24dd4f Raw
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