at91_ether.c 16.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Ethernet driver for the Atmel AT91RM9200 (Thunder)
 *
 *  Copyright (C) 2003 SAN People (Pty) Ltd
 *
 * Based on an earlier Atmel EMAC macrocell driver by Atmel and Lineo Inc.
 * Initial version by Rick Bronson 01/11/2003
 *
 * Intel LXT971A PHY support by Christopher Bahns & David Knickerbocker
 *   (Polaroid Corporation)
 *
 * Realtek RTL8201(B)L PHY support by Roman Avramenko <roman@imsystems.ru>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#include <linux/module.h>
#include <linux/init.h>
22
#include <linux/interrupt.h>
23 24 25 26 27
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/dma-mapping.h>
#include <linux/ethtool.h>
28
#include <linux/platform_data/macb.h>
29 30
#include <linux/platform_device.h>
#include <linux/clk.h>
31
#include <linux/gfp.h>
32
#include <linux/phy.h>
33 34 35 36 37

#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/mach-types.h>

38
#include "macb.h"
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

#define DRV_NAME	"at91_ether"
#define DRV_VERSION	"1.0"

/* ......................... ADDRESS MANAGEMENT ........................ */

/*
 * NOTE: Your bootloader must always set the MAC address correctly before
 * booting into Linux.
 *
 * - It must always set the MAC address after reset, even if it doesn't
 *   happen to access the Ethernet while it's booting.  Some versions of
 *   U-Boot on the AT91RM9200-DK do not do this.
 *
 * - Likewise it must store the addresses in the correct byte order.
 *   MicroMonitor (uMon) on the CSB337 does this incorrectly (and
 *   continues to do so, for bug-compatibility).
 */

static short __init unpack_mac_address(struct net_device *dev, unsigned int hi, unsigned int lo)
{
	char addr[6];

	if (machine_is_csb337()) {
		addr[5] = (lo & 0xff);			/* The CSB337 bootloader stores the MAC the wrong-way around */
		addr[4] = (lo & 0xff00) >> 8;
		addr[3] = (lo & 0xff0000) >> 16;
		addr[2] = (lo & 0xff000000) >> 24;
		addr[1] = (hi & 0xff);
		addr[0] = (hi & 0xff00) >> 8;
	}
	else {
		addr[0] = (lo & 0xff);
		addr[1] = (lo & 0xff00) >> 8;
		addr[2] = (lo & 0xff0000) >> 16;
		addr[3] = (lo & 0xff000000) >> 24;
		addr[4] = (hi & 0xff);
		addr[5] = (hi & 0xff00) >> 8;
	}

	if (is_valid_ether_addr(addr)) {
		memcpy(dev->dev_addr, &addr, 6);
		return 1;
	}
	return 0;
}

/*
 * Set the ethernet MAC address in dev->dev_addr
 */
static void __init get_mac_address(struct net_device *dev)
{
91
	struct macb *lp = netdev_priv(dev);
92

93
	/* Check Specific-Address 1 */
94
	if (unpack_mac_address(dev, macb_readl(lp, SA1T), macb_readl(lp, SA1B)))
95 96
		return;
	/* Check Specific-Address 2 */
97
	if (unpack_mac_address(dev, macb_readl(lp, SA2T), macb_readl(lp, SA2B)))
98 99
		return;
	/* Check Specific-Address 3 */
100
	if (unpack_mac_address(dev, macb_readl(lp, SA3T), macb_readl(lp, SA3B)))
101 102
		return;
	/* Check Specific-Address 4 */
103
	if (unpack_mac_address(dev, macb_readl(lp, SA4T), macb_readl(lp, SA4B)))
104 105 106 107 108 109 110 111 112 113
		return;

	printk(KERN_ERR "at91_ether: Your bootloader did not configure a MAC address.\n");
}

/*
 * Program the hardware MAC address from dev->dev_addr.
 */
static void update_mac_address(struct net_device *dev)
{
114
	struct macb *lp = netdev_priv(dev);
115

116
	macb_writel(lp, SA1B, (dev->dev_addr[3] << 24) | (dev->dev_addr[2] << 16)
117
					| (dev->dev_addr[1] << 8) | (dev->dev_addr[0]));
118
	macb_writel(lp, SA1T, (dev->dev_addr[5] << 8) | (dev->dev_addr[4]));
119

120 121
	macb_writel(lp, SA2B, 0);
	macb_writel(lp, SA2T, 0);
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
}

/*
 * Store the new hardware address in dev->dev_addr, and update the MAC.
 */
static int set_mac_address(struct net_device *dev, void* addr)
{
	struct sockaddr *address = addr;

	if (!is_valid_ether_addr(address->sa_data))
		return -EADDRNOTAVAIL;

	memcpy(dev->dev_addr, address->sa_data, dev->addr_len);
	update_mac_address(dev);

J
Johannes Berg 已提交
137 138
	printk("%s: Setting MAC address to %pM\n", dev->name,
	       dev->dev_addr);
139 140 141 142 143 144 145 146 147 148 149

	return 0;
}

/* ................................ MAC ................................ */

/*
 * Initialize and start the Receiver and Transmit subsystems
 */
static void at91ether_start(struct net_device *dev)
{
150
	struct macb *lp = netdev_priv(dev);
151 152 153 154 155 156 157 158 159
	struct recv_desc_bufs *dlist, *dlist_phys;
	int i;
	unsigned long ctl;

	dlist = lp->dlist;
	dlist_phys = lp->dlist_phys;

	for (i = 0; i < MAX_RX_DESCR; i++) {
		dlist->descriptors[i].addr = (unsigned int) &dlist_phys->recv_buf[i][0];
160
		dlist->descriptors[i].ctrl = 0;
161 162 163
	}

	/* Set the Wrap bit on the last descriptor */
164
	dlist->descriptors[i-1].addr |= MACB_BIT(RX_WRAP);
165 166 167 168 169

	/* Reset buffer index */
	lp->rxBuffIndex = 0;

	/* Program address of descriptor list in Rx Buffer Queue register */
170
	macb_writel(lp, RBQP, (unsigned long) dlist_phys);
171 172

	/* Enable Receive and Transmit */
173 174
	ctl = macb_readl(lp, NCR);
	macb_writel(lp, NCR, ctl | MACB_BIT(RE) | MACB_BIT(TE));
175 176 177 178 179 180 181
}

/*
 * Open the ethernet interface
 */
static int at91ether_open(struct net_device *dev)
{
182
	struct macb *lp = netdev_priv(dev);
183 184
	unsigned long ctl;

185 186
	if (!is_valid_ether_addr(dev->dev_addr))
		return -EADDRNOTAVAIL;
187 188

	/* Clear internal statistics */
189 190
	ctl = macb_readl(lp, NCR);
	macb_writel(lp, NCR, ctl | MACB_BIT(CLRSTAT));
191 192 193 194 195

	/* Update the MAC address (incase user has changed it) */
	update_mac_address(dev);

	/* Enable MAC interrupts */
196
	macb_writel(lp, IER, MACB_BIT(RCOMP) | MACB_BIT(RXUBR)
197 198
				| MACB_BIT(ISR_TUND) | MACB_BIT(ISR_RLE) | MACB_BIT(TCOMP)
				| MACB_BIT(ISR_ROVR) | MACB_BIT(HRESP));
199 200

	at91ether_start(dev);
201 202 203 204

	/* schedule a link state check */
	phy_start(lp->phy_dev);

205
	netif_start_queue(dev);
206

207 208 209 210 211 212 213 214
	return 0;
}

/*
 * Close the interface
 */
static int at91ether_close(struct net_device *dev)
{
215
	struct macb *lp = netdev_priv(dev);
216 217 218
	unsigned long ctl;

	/* Disable Receiver and Transmitter */
219 220
	ctl = macb_readl(lp, NCR);
	macb_writel(lp, NCR, ctl & ~(MACB_BIT(TE) | MACB_BIT(RE)));
221 222

	/* Disable MAC interrupts */
223
	macb_writel(lp, IDR, MACB_BIT(RCOMP) | MACB_BIT(RXUBR)
224 225 226
				| MACB_BIT(ISR_TUND) | MACB_BIT(ISR_RLE)
				| MACB_BIT(TCOMP) | MACB_BIT(ISR_ROVR)
				| MACB_BIT(HRESP));
227 228 229 230 231 232 233 234 235

	netif_stop_queue(dev);

	return 0;
}

/*
 * Transmit packet.
 */
236
static int at91ether_start_xmit(struct sk_buff *skb, struct net_device *dev)
237
{
238
	struct macb *lp = netdev_priv(dev);
239

240
	if (macb_readl(lp, TSR) & MACB_BIT(RM9200_BNQ)) {
241 242 243 244 245 246
		netif_stop_queue(dev);

		/* Store packet information (to free when Tx completed) */
		lp->skb = skb;
		lp->skb_length = skb->len;
		lp->skb_physaddr = dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE);
247
		dev->stats.tx_bytes += skb->len;
248 249

		/* Set address of the data in the Transmit Address register */
250
		macb_writel(lp, TAR, lp->skb_physaddr);
251
		/* Set length of the packet in the Transmit Control register */
252
		macb_writel(lp, TCR, skb->len);
253 254

	} else {
255
		printk(KERN_ERR "at91_ether.c: at91ether_start_xmit() called, but device is busy!\n");
256
		return NETDEV_TX_BUSY;	/* if we return anything but zero, dev.c:1055 calls kfree_skb(skb)
257 258 259 260
				on this skb, he also reports -ENETDOWN and printk's, so either
				we free and return(0) or don't free and return 1 */
	}

261
	return NETDEV_TX_OK;
262 263 264 265 266 267 268
}

/*
 * Update the current statistics from the internal statistics registers.
 */
static struct net_device_stats *at91ether_stats(struct net_device *dev)
{
269
	struct macb *lp = netdev_priv(dev);
270 271 272
	int ale, lenerr, seqe, lcol, ecol;

	if (netif_running(dev)) {
273 274
		dev->stats.rx_packets += macb_readl(lp, FRO);	/* Good frames received */
		ale = macb_readl(lp, ALE);
275
		dev->stats.rx_frame_errors += ale;				/* Alignment errors */
276
		lenerr = macb_readl(lp, ELE) + macb_readl(lp, USF);
277
		dev->stats.rx_length_errors += lenerr;				/* Excessive Length or Undersize Frame error */
278
		seqe = macb_readl(lp, FCSE);
279
		dev->stats.rx_crc_errors += seqe;				/* CRC error */
280
		dev->stats.rx_fifo_errors += macb_readl(lp, RRE);/* Receive buffer not available */
281
		dev->stats.rx_errors += (ale + lenerr + seqe
282
			+ macb_readl(lp, RSE) + macb_readl(lp, RJA));
283

284 285 286 287
		dev->stats.tx_packets += macb_readl(lp, FTO);	/* Frames successfully transmitted */
		dev->stats.tx_fifo_errors += macb_readl(lp, TUND);	/* Transmit FIFO underruns */
		dev->stats.tx_carrier_errors += macb_readl(lp, CSE);	/* Carrier Sense errors */
		dev->stats.tx_heartbeat_errors += macb_readl(lp, STE);/* Heartbeat error */
288

289 290
		lcol = macb_readl(lp, LCOL);
		ecol = macb_readl(lp, EXCOL);
291 292
		dev->stats.tx_window_errors += lcol;			/* Late collisions */
		dev->stats.tx_aborted_errors += ecol;			/* 16 collisions */
293

294
		dev->stats.collisions += (macb_readl(lp, SCF) + macb_readl(lp, MCF) + lcol + ecol);
295
	}
296
	return &dev->stats;
297 298 299 300 301 302 303 304
}

/*
 * Extract received frame from buffer descriptors and sent to upper layers.
 * (Called from interrupt context)
 */
static void at91ether_rx(struct net_device *dev)
{
305
	struct macb *lp = netdev_priv(dev);
306 307 308 309 310 311
	struct recv_desc_bufs *dlist;
	unsigned char *p_recv;
	struct sk_buff *skb;
	unsigned int pktlen;

	dlist = lp->dlist;
312
	while (dlist->descriptors[lp->rxBuffIndex].addr & MACB_BIT(RX_USED)) {
313
		p_recv = dlist->recv_buf[lp->rxBuffIndex];
314
		pktlen = dlist->descriptors[lp->rxBuffIndex].ctrl & 0x7ff;	/* Length of frame including FCS */
315
		skb = netdev_alloc_skb(dev, pktlen + 2);
316 317 318 319 320
		if (skb != NULL) {
			skb_reserve(skb, 2);
			memcpy(skb_put(skb, pktlen), p_recv, pktlen);

			skb->protocol = eth_type_trans(skb, dev);
321
			dev->stats.rx_bytes += pktlen;
322 323 324
			netif_rx(skb);
		}
		else {
325
			dev->stats.rx_dropped += 1;
326 327 328
			printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
		}

329
		if (dlist->descriptors[lp->rxBuffIndex].ctrl & MACB_BIT(RX_MHASH_MATCH))
330
			dev->stats.multicast++;
331

332
		dlist->descriptors[lp->rxBuffIndex].addr &= ~MACB_BIT(RX_USED);	/* reset ownership bit */
333 334 335 336 337 338 339 340 341 342
		if (lp->rxBuffIndex == MAX_RX_DESCR-1)				/* wrap after last buffer */
			lp->rxBuffIndex = 0;
		else
			lp->rxBuffIndex++;
	}
}

/*
 * MAC interrupt handler
 */
343
static irqreturn_t at91ether_interrupt(int irq, void *dev_id)
344 345
{
	struct net_device *dev = (struct net_device *) dev_id;
346
	struct macb *lp = netdev_priv(dev);
347 348 349 350
	unsigned long intstatus, ctl;

	/* MAC Interrupt Status register indicates what interrupts are pending.
	   It is automatically cleared once read. */
351
	intstatus = macb_readl(lp, ISR);
352

353
	if (intstatus & MACB_BIT(RCOMP))		/* Receive complete */
354 355
		at91ether_rx(dev);

356
	if (intstatus & MACB_BIT(TCOMP)) {	/* Transmit complete */
357
		/* The TCOM bit is set even if the transmission failed. */
358
		if (intstatus & (MACB_BIT(ISR_TUND) | MACB_BIT(ISR_RLE)))
359
			dev->stats.tx_errors += 1;
360 361 362 363 364 365 366 367 368 369

		if (lp->skb) {
			dev_kfree_skb_irq(lp->skb);
			lp->skb = NULL;
			dma_unmap_single(NULL, lp->skb_physaddr, lp->skb_length, DMA_TO_DEVICE);
		}
		netif_wake_queue(dev);
	}

	/* Work-around for Errata #11 */
370
	if (intstatus & MACB_BIT(RXUBR)) {
371 372 373
		ctl = macb_readl(lp, NCR);
		macb_writel(lp, NCR, ctl & ~MACB_BIT(RE));
		macb_writel(lp, NCR, ctl | MACB_BIT(RE));
374 375
	}

376
	if (intstatus & MACB_BIT(ISR_ROVR))
377 378 379 380 381
		printk("%s: ROVR error\n", dev->name);

	return IRQ_HANDLED;
}

382 383 384 385 386 387 388 389 390 391 392
#ifdef CONFIG_NET_POLL_CONTROLLER
static void at91ether_poll_controller(struct net_device *dev)
{
	unsigned long flags;

	local_irq_save(flags);
	at91ether_interrupt(dev->irq, dev);
	local_irq_restore(flags);
}
#endif

393 394 395 396 397
static const struct net_device_ops at91ether_netdev_ops = {
	.ndo_open		= at91ether_open,
	.ndo_stop		= at91ether_close,
	.ndo_start_xmit		= at91ether_start_xmit,
	.ndo_get_stats		= at91ether_stats,
398
	.ndo_set_rx_mode	= macb_set_rx_mode,
399
	.ndo_set_mac_address	= set_mac_address,
400
	.ndo_do_ioctl		= macb_ioctl,
401 402 403 404 405 406 407
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_change_mtu		= eth_change_mtu,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= at91ether_poll_controller,
#endif
};

408 409 410 411
/*
 * Detect MAC & PHY and perform ethernet interface initialization
 */
static int __init at91ether_probe(struct platform_device *pdev)
412
{
413
	struct macb_platform_data *board_data = pdev->dev.platform_data;
414
	struct resource *regs;
415
	struct net_device *dev;
416
	struct phy_device *phydev;
417
	struct macb *lp;
418 419
	int res;

420 421 422 423
	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!regs)
		return -ENOENT;

424
	dev = alloc_etherdev(sizeof(struct macb));
425 426 427
	if (!dev)
		return -ENOMEM;

428
	lp = netdev_priv(dev);
429 430
	lp->pdev = pdev;
	lp->dev = dev;
431 432 433 434
	lp->board_data = *board_data;
	spin_lock_init(&lp->lock);

	dev->base_addr = regs->start;		/* physical base address */
435 436
	lp->regs = ioremap(regs->start, regs->end - regs->start + 1);
	if (!lp->regs) {
437 438 439 440 441
		res = -ENOMEM;
		goto err_free_dev;
	}

	/* Clock */
442 443 444
	lp->pclk = clk_get(&pdev->dev, "ether_clk");
	if (IS_ERR(lp->pclk)) {
		res = PTR_ERR(lp->pclk);
445 446
		goto err_ioumap;
	}
447
	clk_enable(lp->pclk);
448 449

	/* Install the interrupt handler */
450
	dev->irq = platform_get_irq(pdev, 0);
451
	if (request_irq(dev->irq, at91ether_interrupt, 0, dev->name, dev)) {
452 453
		res = -EBUSY;
		goto err_disable_clock;
454 455 456 457 458
	}

	/* Allocate memory for DMA Receive descriptors */
	lp->dlist = (struct recv_desc_bufs *) dma_alloc_coherent(NULL, sizeof(struct recv_desc_bufs), (dma_addr_t *) &lp->dlist_phys, GFP_KERNEL);
	if (lp->dlist == NULL) {
459 460
		res = -ENOMEM;
		goto err_free_irq;
461 462 463
	}

	ether_setup(dev);
464
	dev->netdev_ops = &at91ether_netdev_ops;
465
	dev->ethtool_ops = &macb_ethtool_ops;
466
	platform_set_drvdata(pdev, dev);
467 468 469 470 471
	SET_NETDEV_DEV(dev, &pdev->dev);

	get_mac_address(dev);		/* Get ethernet address and store it in dev->dev_addr */
	update_mac_address(dev);	/* Program ethernet address into MAC */

472
	macb_writel(lp, NCR, 0);
473

474
	if (board_data->is_rmii) {
475
		macb_writel(lp, NCFGR, MACB_BF(CLK, MACB_CLK_DIV32) | MACB_BIT(BIG) | MACB_BIT(RM9200_RMII));
476 477
		lp->phy_interface = PHY_INTERFACE_MODE_RMII;
	} else {
478
		macb_writel(lp, NCFGR, MACB_BF(CLK, MACB_CLK_DIV32) | MACB_BIT(BIG));
479
		lp->phy_interface = PHY_INTERFACE_MODE_MII;
480
	}
481

482 483
	/* Register the network interface */
	res = register_netdev(dev);
484 485
	if (res)
		goto err_free_dmamem;
486

487 488 489
	if (macb_mii_init(lp) != 0)
		goto err_out_unregister_netdev;

490 491
	netif_carrier_off(dev);		/* will be enabled in open() */

492 493 494
	phydev = lp->phy_dev;
	netdev_info(dev, "attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
		phydev->drv->name, dev_name(&phydev->dev), phydev->irq);
495

496
	/* Display ethernet banner */
J
Johannes Berg 已提交
497
	printk(KERN_INFO "%s: AT91 ethernet at 0x%08x int=%d %s%s (%pM)\n",
498
	       dev->name, (uint) dev->base_addr, dev->irq,
499 500
	       macb_readl(lp, NCFGR) & MACB_BIT(SPD) ? "100-" : "10-",
	       macb_readl(lp, NCFGR) & MACB_BIT(FD) ? "FullDuplex" : "HalfDuplex",
J
Johannes Berg 已提交
501
	       dev->dev_addr);
502

503
	return 0;
504

505 506
err_out_unregister_netdev:
	unregister_netdev(dev);
507 508 509 510 511 512
err_free_dmamem:
	platform_set_drvdata(pdev, NULL);
	dma_free_coherent(NULL, sizeof(struct recv_desc_bufs), lp->dlist, (dma_addr_t)lp->dlist_phys);
err_free_irq:
	free_irq(dev->irq, dev);
err_disable_clock:
513 514
	clk_disable(lp->pclk);
	clk_put(lp->pclk);
515
err_ioumap:
516
	iounmap(lp->regs);
517 518 519
err_free_dev:
	free_netdev(dev);
	return res;
520 521 522 523
}

static int __devexit at91ether_remove(struct platform_device *pdev)
{
524
	struct net_device *dev = platform_get_drvdata(pdev);
525
	struct macb *lp = netdev_priv(dev);
526

527 528
	if (lp->phy_dev)
		phy_disconnect(lp->phy_dev);
529

530 531 532
	mdiobus_unregister(lp->mii_bus);
	kfree(lp->mii_bus->irq);
	mdiobus_free(lp->mii_bus);
533 534
	unregister_netdev(dev);
	free_irq(dev->irq, dev);
535
	dma_free_coherent(NULL, sizeof(struct recv_desc_bufs), lp->dlist, (dma_addr_t)lp->dlist_phys);
536 537
	iounmap(lp->regs);
	clk_disable(lp->pclk);
538
	clk_put(lp->pclk);
539
	free_netdev(dev);
540 541
	platform_set_drvdata(pdev, NULL);

542 543 544
	return 0;
}

545 546 547 548 549
#ifdef CONFIG_PM

static int at91ether_suspend(struct platform_device *pdev, pm_message_t mesg)
{
	struct net_device *net_dev = platform_get_drvdata(pdev);
550
	struct macb *lp = netdev_priv(net_dev);
551 552 553 554 555

	if (netif_running(net_dev)) {
		netif_stop_queue(net_dev);
		netif_device_detach(net_dev);

556
		clk_disable(lp->pclk);
557 558 559 560 561 562 563
	}
	return 0;
}

static int at91ether_resume(struct platform_device *pdev)
{
	struct net_device *net_dev = platform_get_drvdata(pdev);
564
	struct macb *lp = netdev_priv(net_dev);
565 566

	if (netif_running(net_dev)) {
567
		clk_enable(lp->pclk);
568 569 570 571 572 573 574 575 576 577 578 579

		netif_device_attach(net_dev);
		netif_start_queue(net_dev);
	}
	return 0;
}

#else
#define at91ether_suspend	NULL
#define at91ether_resume	NULL
#endif

580 581
static struct platform_driver at91ether_driver = {
	.remove		= __devexit_p(at91ether_remove),
582 583
	.suspend	= at91ether_suspend,
	.resume		= at91ether_resume,
584 585 586 587 588 589 590 591
	.driver		= {
		.name	= DRV_NAME,
		.owner	= THIS_MODULE,
	},
};

static int __init at91ether_init(void)
{
592
	return platform_driver_probe(&at91ether_driver, at91ether_probe);
593 594 595 596 597 598 599 600 601 602 603 604 605
}

static void __exit at91ether_exit(void)
{
	platform_driver_unregister(&at91ether_driver);
}

module_init(at91ether_init)
module_exit(at91ether_exit)

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("AT91RM9200 EMAC Ethernet driver");
MODULE_AUTHOR("Andrew Victor");
606
MODULE_ALIAS("platform:" DRV_NAME);