gianfar.c 87.9 KB
Newer Older
J
Jan Ceuleers 已提交
1
/* drivers/net/ethernet/freescale/gianfar.c
L
Linus Torvalds 已提交
2 3
 *
 * Gianfar Ethernet Driver
4 5
 * This driver is designed for the non-CPM ethernet controllers
 * on the 85xx and 83xx family of integrated processors
L
Linus Torvalds 已提交
6 7 8
 * Based on 8260_io/fcc_enet.c
 *
 * Author: Andy Fleming
9
 * Maintainer: Kumar Gala
10
 * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com>
L
Linus Torvalds 已提交
11
 *
W
Wu Jiajun-B06378 已提交
12
 * Copyright 2002-2009, 2011 Freescale Semiconductor, Inc.
13
 * Copyright 2007 MontaVista Software, Inc.
L
Linus Torvalds 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * 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.
 *
 *  Gianfar:  AKA Lambda Draconis, "Dragon"
 *  RA 11 31 24.2
 *  Dec +69 19 52
 *  V 3.84
 *  B-V +1.62
 *
 *  Theory of operation
27
 *
28 29
 *  The driver is initialized through of_device. Configuration information
 *  is therefore conveyed through an OF-style device tree.
L
Linus Torvalds 已提交
30 31 32
 *
 *  The Gianfar Ethernet Controller uses a ring of buffer
 *  descriptors.  The beginning is indicated by a register
33 34
 *  pointing to the physical address of the start of the ring.
 *  The end is determined by a "wrap" bit being set in the
L
Linus Torvalds 已提交
35 36 37
 *  last descriptor of the ring.
 *
 *  When a packet is received, the RXF bit in the
38
 *  IEVENT register is set, triggering an interrupt when the
L
Linus Torvalds 已提交
39 40 41
 *  corresponding bit in the IMASK register is also set (if
 *  interrupt coalescing is active, then the interrupt may not
 *  happen immediately, but will wait until either a set number
42
 *  of frames or amount of time have passed).  In NAPI, the
L
Linus Torvalds 已提交
43
 *  interrupt handler will signal there is work to be done, and
44
 *  exit. This method will start at the last known empty
45
 *  descriptor, and process every subsequent descriptor until there
L
Linus Torvalds 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
 *  are none left with data (NAPI will stop after a set number of
 *  packets to give time to other tasks, but will eventually
 *  process all the packets).  The data arrives inside a
 *  pre-allocated skb, and so after the skb is passed up to the
 *  stack, a new skb must be allocated, and the address field in
 *  the buffer descriptor must be updated to indicate this new
 *  skb.
 *
 *  When the kernel requests that a packet be transmitted, the
 *  driver starts where it left off last time, and points the
 *  descriptor at the buffer which was passed in.  The driver
 *  then informs the DMA engine that there are packets ready to
 *  be transmitted.  Once the controller is finished transmitting
 *  the packet, an interrupt may be triggered (under the same
 *  conditions as for reception, but depending on the TXF bit).
 *  The driver then cleans up the buffer.
 */

64 65 66
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#define DEBUG

L
Linus Torvalds 已提交
67 68 69
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/errno.h>
70
#include <linux/unistd.h>
L
Linus Torvalds 已提交
71 72 73 74 75 76 77
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
78
#include <linux/if_vlan.h>
L
Linus Torvalds 已提交
79 80
#include <linux/spinlock.h>
#include <linux/mm.h>
81
#include <linux/of_mdio.h>
82
#include <linux/of_platform.h>
83 84 85
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
K
Kumar Gala 已提交
86
#include <linux/in.h>
87
#include <linux/net_tstamp.h>
L
Linus Torvalds 已提交
88 89

#include <asm/io.h>
90
#include <asm/reg.h>
L
Linus Torvalds 已提交
91 92 93 94 95
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <linux/module.h>
#include <linux/dma-mapping.h>
#include <linux/crc32.h>
96 97
#include <linux/mii.h>
#include <linux/phy.h>
98 99
#include <linux/phy_fixed.h>
#include <linux/of.h>
100
#include <linux/of_net.h>
L
Linus Torvalds 已提交
101 102 103 104 105

#include "gianfar.h"

#define TX_TIMEOUT      (1*HZ)

106
const char gfar_driver_version[] = "1.3";
L
Linus Torvalds 已提交
107 108 109

static int gfar_enet_open(struct net_device *dev);
static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev);
110
static void gfar_reset_task(struct work_struct *work);
L
Linus Torvalds 已提交
111 112
static void gfar_timeout(struct net_device *dev);
static int gfar_close(struct net_device *dev);
113
struct sk_buff *gfar_new_skb(struct net_device *dev);
114
static void gfar_new_rxbdp(struct gfar_priv_rx_q *rx_queue, struct rxbd8 *bdp,
115
			   struct sk_buff *skb);
L
Linus Torvalds 已提交
116 117
static int gfar_set_mac_address(struct net_device *dev);
static int gfar_change_mtu(struct net_device *dev, int new_mtu);
118 119 120
static irqreturn_t gfar_error(int irq, void *dev_id);
static irqreturn_t gfar_transmit(int irq, void *dev_id);
static irqreturn_t gfar_interrupt(int irq, void *dev_id);
L
Linus Torvalds 已提交
121 122 123
static void adjust_link(struct net_device *dev);
static void init_registers(struct net_device *dev);
static int init_phy(struct net_device *dev);
124
static int gfar_probe(struct platform_device *ofdev);
125
static int gfar_remove(struct platform_device *ofdev);
126
static void free_skb_resources(struct gfar_private *priv);
L
Linus Torvalds 已提交
127 128
static void gfar_set_multi(struct net_device *dev);
static void gfar_set_hash_for_addr(struct net_device *dev, u8 *addr);
K
Kapil Juneja 已提交
129
static void gfar_configure_serdes(struct net_device *dev);
130
static int gfar_poll(struct napi_struct *napi, int budget);
131
static int gfar_poll_sq(struct napi_struct *napi, int budget);
132 133 134
#ifdef CONFIG_NET_POLL_CONTROLLER
static void gfar_netpoll(struct net_device *dev);
#endif
135
int gfar_clean_rx_ring(struct gfar_priv_rx_q *rx_queue, int rx_work_limit);
C
Claudiu Manoil 已提交
136
static void gfar_clean_tx_ring(struct gfar_priv_tx_q *tx_queue);
137 138
static void gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
			       int amount_pull, struct napi_struct *napi);
139
void gfar_halt(struct net_device *dev);
140
static void gfar_halt_nodisable(struct net_device *dev);
141 142
void gfar_start(struct net_device *dev);
static void gfar_clear_exact_match(struct net_device *dev);
J
Joe Perches 已提交
143 144
static void gfar_set_mac_for_addr(struct net_device *dev, int num,
				  const u8 *addr);
145
static int gfar_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
L
Linus Torvalds 已提交
146 147 148 149 150

MODULE_AUTHOR("Freescale Semiconductor, Inc");
MODULE_DESCRIPTION("Gianfar Ethernet Driver");
MODULE_LICENSE("GPL");

151
static void gfar_init_rxbdp(struct gfar_priv_rx_q *rx_queue, struct rxbd8 *bdp,
152 153 154 155 156 157 158
			    dma_addr_t buf)
{
	u32 lstatus;

	bdp->bufPtr = buf;

	lstatus = BD_LFLAG(RXBD_EMPTY | RXBD_INTERRUPT);
159
	if (bdp == rx_queue->rx_bd_base + rx_queue->rx_ring_size - 1)
160 161 162 163 164 165 166
		lstatus |= BD_LFLAG(RXBD_WRAP);

	eieio();

	bdp->lstatus = lstatus;
}

167
static int gfar_init_bds(struct net_device *ndev)
168
{
169
	struct gfar_private *priv = netdev_priv(ndev);
170 171
	struct gfar_priv_tx_q *tx_queue = NULL;
	struct gfar_priv_rx_q *rx_queue = NULL;
172 173
	struct txbd8 *txbdp;
	struct rxbd8 *rxbdp;
174
	int i, j;
175

176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
	for (i = 0; i < priv->num_tx_queues; i++) {
		tx_queue = priv->tx_queue[i];
		/* Initialize some variables in our dev structure */
		tx_queue->num_txbdfree = tx_queue->tx_ring_size;
		tx_queue->dirty_tx = tx_queue->tx_bd_base;
		tx_queue->cur_tx = tx_queue->tx_bd_base;
		tx_queue->skb_curtx = 0;
		tx_queue->skb_dirtytx = 0;

		/* Initialize Transmit Descriptor Ring */
		txbdp = tx_queue->tx_bd_base;
		for (j = 0; j < tx_queue->tx_ring_size; j++) {
			txbdp->lstatus = 0;
			txbdp->bufPtr = 0;
			txbdp++;
		}
192

193 194 195
		/* Set the last descriptor in the ring to indicate wrap */
		txbdp--;
		txbdp->status |= TXBD_WRAP;
196 197
	}

198 199 200 201 202
	for (i = 0; i < priv->num_rx_queues; i++) {
		rx_queue = priv->rx_queue[i];
		rx_queue->cur_rx = rx_queue->rx_bd_base;
		rx_queue->skb_currx = 0;
		rxbdp = rx_queue->rx_bd_base;
203

204 205
		for (j = 0; j < rx_queue->rx_ring_size; j++) {
			struct sk_buff *skb = rx_queue->rx_skbuff[j];
206

207 208 209 210 211 212
			if (skb) {
				gfar_init_rxbdp(rx_queue, rxbdp,
						rxbdp->bufPtr);
			} else {
				skb = gfar_new_skb(ndev);
				if (!skb) {
213
					netdev_err(ndev, "Can't allocate RX buffers\n");
214
					return -ENOMEM;
215 216 217 218
				}
				rx_queue->rx_skbuff[j] = skb;

				gfar_new_rxbdp(rx_queue, rxbdp, skb);
219 220
			}

221
			rxbdp++;
222 223 224 225 226 227 228 229 230
		}

	}

	return 0;
}

static int gfar_alloc_skb_resources(struct net_device *ndev)
{
231
	void *vaddr;
232 233
	dma_addr_t addr;
	int i, j, k;
234
	struct gfar_private *priv = netdev_priv(ndev);
235
	struct device *dev = priv->dev;
236 237 238
	struct gfar_priv_tx_q *tx_queue = NULL;
	struct gfar_priv_rx_q *rx_queue = NULL;

239 240 241 242 243 244 245
	priv->total_tx_ring_size = 0;
	for (i = 0; i < priv->num_tx_queues; i++)
		priv->total_tx_ring_size += priv->tx_queue[i]->tx_ring_size;

	priv->total_rx_ring_size = 0;
	for (i = 0; i < priv->num_rx_queues; i++)
		priv->total_rx_ring_size += priv->rx_queue[i]->rx_ring_size;
246 247

	/* Allocate memory for the buffer descriptors */
248
	vaddr = dma_alloc_coherent(dev,
249 250 251 252 253 254
				   (priv->total_tx_ring_size *
				    sizeof(struct txbd8)) +
				   (priv->total_rx_ring_size *
				    sizeof(struct rxbd8)),
				   &addr, GFP_KERNEL);
	if (!vaddr)
255 256
		return -ENOMEM;

257 258
	for (i = 0; i < priv->num_tx_queues; i++) {
		tx_queue = priv->tx_queue[i];
259
		tx_queue->tx_bd_base = vaddr;
260 261 262
		tx_queue->tx_bd_dma_base = addr;
		tx_queue->dev = ndev;
		/* enet DMA only understands physical addresses */
263 264
		addr  += sizeof(struct txbd8) * tx_queue->tx_ring_size;
		vaddr += sizeof(struct txbd8) * tx_queue->tx_ring_size;
265
	}
266 267

	/* Start the rx descriptor ring where the tx ring leaves off */
268 269
	for (i = 0; i < priv->num_rx_queues; i++) {
		rx_queue = priv->rx_queue[i];
270
		rx_queue->rx_bd_base = vaddr;
271 272
		rx_queue->rx_bd_dma_base = addr;
		rx_queue->dev = ndev;
273 274
		addr  += sizeof(struct rxbd8) * rx_queue->rx_ring_size;
		vaddr += sizeof(struct rxbd8) * rx_queue->rx_ring_size;
275
	}
276 277

	/* Setup the skbuff rings */
278 279
	for (i = 0; i < priv->num_tx_queues; i++) {
		tx_queue = priv->tx_queue[i];
280 281 282 283 284
		tx_queue->tx_skbuff =
			kmalloc_array(tx_queue->tx_ring_size,
				      sizeof(*tx_queue->tx_skbuff),
				      GFP_KERNEL);
		if (!tx_queue->tx_skbuff)
285
			goto cleanup;
286

287 288 289
		for (k = 0; k < tx_queue->tx_ring_size; k++)
			tx_queue->tx_skbuff[k] = NULL;
	}
290

291 292
	for (i = 0; i < priv->num_rx_queues; i++) {
		rx_queue = priv->rx_queue[i];
293 294 295 296 297
		rx_queue->rx_skbuff =
			kmalloc_array(rx_queue->rx_ring_size,
				      sizeof(*rx_queue->rx_skbuff),
				      GFP_KERNEL);
		if (!rx_queue->rx_skbuff)
298 299 300 301 302
			goto cleanup;

		for (j = 0; j < rx_queue->rx_ring_size; j++)
			rx_queue->rx_skbuff[j] = NULL;
	}
303

304 305
	if (gfar_init_bds(ndev))
		goto cleanup;
306 307 308 309 310 311 312 313

	return 0;

cleanup:
	free_skb_resources(priv);
	return -ENOMEM;
}

314 315
static void gfar_init_tx_rx_base(struct gfar_private *priv)
{
316
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
317
	u32 __iomem *baddr;
318 319 320
	int i;

	baddr = &regs->tbase0;
321
	for (i = 0; i < priv->num_tx_queues; i++) {
322
		gfar_write(baddr, priv->tx_queue[i]->tx_bd_dma_base);
323
		baddr += 2;
324 325 326
	}

	baddr = &regs->rbase0;
327
	for (i = 0; i < priv->num_rx_queues; i++) {
328
		gfar_write(baddr, priv->rx_queue[i]->rx_bd_dma_base);
329
		baddr += 2;
330 331 332
	}
}

333 334 335
static void gfar_init_mac(struct net_device *ndev)
{
	struct gfar_private *priv = netdev_priv(ndev);
336
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
337 338 339 340
	u32 rctrl = 0;
	u32 tctrl = 0;
	u32 attrs = 0;

341 342
	/* write the tx/rx base registers */
	gfar_init_tx_rx_base(priv);
343

344
	/* Configure the coalescing support */
345
	gfar_configure_coalescing_all(priv);
346

347 348 349
	/* set this when rx hw offload (TOE) functions are being used */
	priv->uses_rxfcb = 0;

S
Sandeep Gopalpet 已提交
350
	if (priv->rx_filer_enable) {
351
		rctrl |= RCTRL_FILREN;
S
Sandeep Gopalpet 已提交
352 353 354
		/* Program the RIR0 reg with the required distribution */
		gfar_write(&regs->rir0, DEFAULT_RIR0);
	}
355

356 357 358 359
	/* Restore PROMISC mode */
	if (ndev->flags & IFF_PROMISC)
		rctrl |= RCTRL_PROM;

360
	if (ndev->features & NETIF_F_RXCSUM) {
361
		rctrl |= RCTRL_CHECKSUMMING;
362 363
		priv->uses_rxfcb = 1;
	}
364 365 366 367 368 369 370 371 372 373 374 375 376

	if (priv->extended_hash) {
		rctrl |= RCTRL_EXTHASH;

		gfar_clear_exact_match(ndev);
		rctrl |= RCTRL_EMEN;
	}

	if (priv->padding) {
		rctrl &= ~RCTRL_PAL_MASK;
		rctrl |= RCTRL_PADDING(priv->padding);
	}

377 378 379
	/* Insert receive time stamps into padding alignment bytes */
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER) {
		rctrl &= ~RCTRL_PAL_MASK;
380
		rctrl |= RCTRL_PADDING(8);
381 382 383
		priv->padding = 8;
	}

384
	/* Enable HW time stamping if requested from user space */
385
	if (priv->hwts_rx_en) {
386
		rctrl |= RCTRL_PRSDEP_INIT | RCTRL_TS_ENABLE;
387 388
		priv->uses_rxfcb = 1;
	}
389

390
	if (ndev->features & NETIF_F_HW_VLAN_CTAG_RX) {
391
		rctrl |= RCTRL_VLEX | RCTRL_PRSDEP_INIT;
392 393
		priv->uses_rxfcb = 1;
	}
394 395 396 397 398 399 400

	/* Init rctrl based on our settings */
	gfar_write(&regs->rctrl, rctrl);

	if (ndev->features & NETIF_F_IP_CSUM)
		tctrl |= TCTRL_INIT_CSUM;

401 402 403 404 405 406 407
	if (priv->prio_sched_en)
		tctrl |= TCTRL_TXSCHED_PRIO;
	else {
		tctrl |= TCTRL_TXSCHED_WRRS;
		gfar_write(&regs->tr03wt, DEFAULT_WRRS_WEIGHT);
		gfar_write(&regs->tr47wt, DEFAULT_WRRS_WEIGHT);
	}
408

409 410 411 412 413 414 415 416 417
	gfar_write(&regs->tctrl, tctrl);

	/* Set the extraction length and index */
	attrs = ATTRELI_EL(priv->rx_stash_size) |
		ATTRELI_EI(priv->rx_stash_index);

	gfar_write(&regs->attreli, attrs);

	/* Start with defaults, and add stashing or locking
J
Jan Ceuleers 已提交
418 419
	 * depending on the approprate variables
	 */
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
	attrs = ATTR_INIT_SETTINGS;

	if (priv->bd_stash_en)
		attrs |= ATTR_BDSTASH;

	if (priv->rx_stash_size != 0)
		attrs |= ATTR_BUFSTASH;

	gfar_write(&regs->attr, attrs);

	gfar_write(&regs->fifo_tx_thr, priv->fifo_threshold);
	gfar_write(&regs->fifo_tx_starve, priv->fifo_starve);
	gfar_write(&regs->fifo_tx_starve_shutoff, priv->fifo_starve_off);
}

S
Sandeep Gopalpet 已提交
435 436 437 438 439
static struct net_device_stats *gfar_get_stats(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
	unsigned long rx_packets = 0, rx_bytes = 0, rx_dropped = 0;
	unsigned long tx_packets = 0, tx_bytes = 0;
440
	int i;
S
Sandeep Gopalpet 已提交
441 442 443

	for (i = 0; i < priv->num_rx_queues; i++) {
		rx_packets += priv->rx_queue[i]->stats.rx_packets;
444
		rx_bytes   += priv->rx_queue[i]->stats.rx_bytes;
S
Sandeep Gopalpet 已提交
445 446 447 448
		rx_dropped += priv->rx_queue[i]->stats.rx_dropped;
	}

	dev->stats.rx_packets = rx_packets;
449
	dev->stats.rx_bytes   = rx_bytes;
S
Sandeep Gopalpet 已提交
450 451 452
	dev->stats.rx_dropped = rx_dropped;

	for (i = 0; i < priv->num_tx_queues; i++) {
E
Eric Dumazet 已提交
453 454
		tx_bytes += priv->tx_queue[i]->stats.tx_bytes;
		tx_packets += priv->tx_queue[i]->stats.tx_packets;
S
Sandeep Gopalpet 已提交
455 456
	}

457
	dev->stats.tx_bytes   = tx_bytes;
S
Sandeep Gopalpet 已提交
458 459 460 461 462
	dev->stats.tx_packets = tx_packets;

	return &dev->stats;
}

463 464 465 466 467
static const struct net_device_ops gfar_netdev_ops = {
	.ndo_open = gfar_enet_open,
	.ndo_start_xmit = gfar_start_xmit,
	.ndo_stop = gfar_close,
	.ndo_change_mtu = gfar_change_mtu,
468
	.ndo_set_features = gfar_set_features,
469
	.ndo_set_rx_mode = gfar_set_multi,
470 471
	.ndo_tx_timeout = gfar_timeout,
	.ndo_do_ioctl = gfar_ioctl,
S
Sandeep Gopalpet 已提交
472
	.ndo_get_stats = gfar_get_stats,
473 474
	.ndo_set_mac_address = eth_mac_addr,
	.ndo_validate_addr = eth_validate_addr,
475 476 477 478 479
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller = gfar_netpoll,
#endif
};

480 481
void lock_rx_qs(struct gfar_private *priv)
{
482
	int i;
483 484 485 486 487 488 489

	for (i = 0; i < priv->num_rx_queues; i++)
		spin_lock(&priv->rx_queue[i]->rxlock);
}

void lock_tx_qs(struct gfar_private *priv)
{
490
	int i;
491 492 493 494 495 496 497

	for (i = 0; i < priv->num_tx_queues; i++)
		spin_lock(&priv->tx_queue[i]->txlock);
}

void unlock_rx_qs(struct gfar_private *priv)
{
498
	int i;
499 500 501 502 503 504 505

	for (i = 0; i < priv->num_rx_queues; i++)
		spin_unlock(&priv->rx_queue[i]->rxlock);
}

void unlock_tx_qs(struct gfar_private *priv)
{
506
	int i;
507 508 509 510 511 512 513

	for (i = 0; i < priv->num_tx_queues; i++)
		spin_unlock(&priv->tx_queue[i]->txlock);
}

static void free_tx_pointers(struct gfar_private *priv)
{
514
	int i;
515 516 517 518 519 520 521

	for (i = 0; i < priv->num_tx_queues; i++)
		kfree(priv->tx_queue[i]);
}

static void free_rx_pointers(struct gfar_private *priv)
{
522
	int i;
523 524 525 526 527

	for (i = 0; i < priv->num_rx_queues; i++)
		kfree(priv->rx_queue[i]);
}

528 529
static void unmap_group_regs(struct gfar_private *priv)
{
530
	int i;
531 532 533 534 535 536

	for (i = 0; i < MAXGROUPS; i++)
		if (priv->gfargrp[i].regs)
			iounmap(priv->gfargrp[i].regs);
}

537 538 539 540 541 542 543 544 545 546 547 548 549
static void free_gfar_dev(struct gfar_private *priv)
{
	int i, j;

	for (i = 0; i < priv->num_grps; i++)
		for (j = 0; j < GFAR_NUM_IRQS; j++) {
			kfree(priv->gfargrp[i].irqinfo[j]);
			priv->gfargrp[i].irqinfo[j] = NULL;
		}

	free_netdev(priv->ndev);
}

550 551
static void disable_napi(struct gfar_private *priv)
{
552
	int i;
553 554 555 556 557 558 559

	for (i = 0; i < priv->num_grps; i++)
		napi_disable(&priv->gfargrp[i].napi);
}

static void enable_napi(struct gfar_private *priv)
{
560
	int i;
561 562 563 564 565 566

	for (i = 0; i < priv->num_grps; i++)
		napi_enable(&priv->gfargrp[i].napi);
}

static int gfar_parse_group(struct device_node *np,
567
			    struct gfar_private *priv, const char *model)
568
{
569
	struct gfar_priv_grp *grp = &priv->gfargrp[priv->num_grps];
570
	u32 *queue_mask;
571 572
	int i;

573 574 575 576
	for (i = 0; i < GFAR_NUM_IRQS; i++) {
		grp->irqinfo[i] = kzalloc(sizeof(struct gfar_irqinfo),
					  GFP_KERNEL);
		if (!grp->irqinfo[i])
577 578
			return -ENOMEM;
	}
579

580 581
	grp->regs = of_iomap(np, 0);
	if (!grp->regs)
582 583
		return -ENOMEM;

584
	gfar_irq(grp, TX)->irq = irq_of_parse_and_map(np, 0);
585 586 587

	/* If we aren't the FEC we have multiple interrupts */
	if (model && strcasecmp(model, "FEC")) {
588 589 590 591 592
		gfar_irq(grp, RX)->irq = irq_of_parse_and_map(np, 1);
		gfar_irq(grp, ER)->irq = irq_of_parse_and_map(np, 2);
		if (gfar_irq(grp, TX)->irq == NO_IRQ ||
		    gfar_irq(grp, RX)->irq == NO_IRQ ||
		    gfar_irq(grp, ER)->irq == NO_IRQ)
593 594 595
			return -EINVAL;
	}

596 597
	grp->priv = priv;
	spin_lock_init(&grp->grplock);
598 599
	if (priv->mode == MQ_MG_MODE) {
		queue_mask = (u32 *)of_get_property(np, "fsl,rx-bit-map", NULL);
600
		grp->rx_bit_map = queue_mask ?
601 602
			*queue_mask : (DEFAULT_MAPPING >> priv->num_grps);
		queue_mask = (u32 *)of_get_property(np, "fsl,tx-bit-map", NULL);
603
		grp->tx_bit_map = queue_mask ?
604
			*queue_mask : (DEFAULT_MAPPING >> priv->num_grps);
605
	} else {
606 607
		grp->rx_bit_map = 0xFF;
		grp->tx_bit_map = 0xFF;
608 609 610 611 612 613
	}
	priv->num_grps++;

	return 0;
}

614
static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
615 616 617 618
{
	const char *model;
	const char *ctype;
	const void *mac_addr;
619 620 621
	int err = 0, i;
	struct net_device *dev = NULL;
	struct gfar_private *priv = NULL;
622
	struct device_node *np = ofdev->dev.of_node;
623
	struct device_node *child = NULL;
A
Andy Fleming 已提交
624 625 626
	const u32 *stash;
	const u32 *stash_len;
	const u32 *stash_idx;
627 628
	unsigned int num_tx_qs, num_rx_qs;
	u32 *tx_queues, *rx_queues;
629 630 631 632

	if (!np || !of_device_is_available(np))
		return -ENODEV;

633 634 635 636 637
	/* parse the num of tx and rx queues */
	tx_queues = (u32 *)of_get_property(np, "fsl,num_tx_queues", NULL);
	num_tx_qs = tx_queues ? *tx_queues : 1;

	if (num_tx_qs > MAX_TX_QS) {
638 639 640
		pr_err("num_tx_qs(=%d) greater than MAX_TX_QS(=%d)\n",
		       num_tx_qs, MAX_TX_QS);
		pr_err("Cannot do alloc_etherdev, aborting\n");
641 642 643 644 645 646 647
		return -EINVAL;
	}

	rx_queues = (u32 *)of_get_property(np, "fsl,num_rx_queues", NULL);
	num_rx_qs = rx_queues ? *rx_queues : 1;

	if (num_rx_qs > MAX_RX_QS) {
648 649 650
		pr_err("num_rx_qs(=%d) greater than MAX_RX_QS(=%d)\n",
		       num_rx_qs, MAX_RX_QS);
		pr_err("Cannot do alloc_etherdev, aborting\n");
651 652 653 654 655 656 657 658 659 660 661 662
		return -EINVAL;
	}

	*pdev = alloc_etherdev_mq(sizeof(*priv), num_tx_qs);
	dev = *pdev;
	if (NULL == dev)
		return -ENOMEM;

	priv = netdev_priv(dev);
	priv->ndev = dev;

	priv->num_tx_queues = num_tx_qs;
663
	netif_set_real_num_rx_queues(dev, num_rx_qs);
664
	priv->num_rx_queues = num_rx_qs;
665
	priv->num_grps = 0x0;
666

J
Jan Ceuleers 已提交
667
	/* Init Rx queue filer rule set linked list */
S
Sebastian Poehn 已提交
668 669 670 671
	INIT_LIST_HEAD(&priv->rx_list.list);
	priv->rx_list.count = 0;
	mutex_init(&priv->rx_queue_access);

672 673
	model = of_get_property(np, "model", NULL);

674 675
	for (i = 0; i < MAXGROUPS; i++)
		priv->gfargrp[i].regs = NULL;
676

677 678 679 680 681 682 683
	/* Parse and initialize group specific information */
	if (of_device_is_compatible(np, "fsl,etsec2")) {
		priv->mode = MQ_MG_MODE;
		for_each_child_of_node(np, child) {
			err = gfar_parse_group(child, priv, model);
			if (err)
				goto err_grp_init;
684
		}
685 686 687
	} else {
		priv->mode = SQ_SG_MODE;
		err = gfar_parse_group(np, priv, model);
688
		if (err)
689
			goto err_grp_init;
690 691
	}

692
	for (i = 0; i < priv->num_tx_queues; i++)
693
		priv->tx_queue[i] = NULL;
694 695 696 697
	for (i = 0; i < priv->num_rx_queues; i++)
		priv->rx_queue[i] = NULL;

	for (i = 0; i < priv->num_tx_queues; i++) {
698 699
		priv->tx_queue[i] = kzalloc(sizeof(struct gfar_priv_tx_q),
					    GFP_KERNEL);
700 701 702 703 704 705 706 707 708 709 710
		if (!priv->tx_queue[i]) {
			err = -ENOMEM;
			goto tx_alloc_failed;
		}
		priv->tx_queue[i]->tx_skbuff = NULL;
		priv->tx_queue[i]->qindex = i;
		priv->tx_queue[i]->dev = dev;
		spin_lock_init(&(priv->tx_queue[i]->txlock));
	}

	for (i = 0; i < priv->num_rx_queues; i++) {
711 712
		priv->rx_queue[i] = kzalloc(sizeof(struct gfar_priv_rx_q),
					    GFP_KERNEL);
713 714 715 716 717 718 719 720 721 722 723
		if (!priv->rx_queue[i]) {
			err = -ENOMEM;
			goto rx_alloc_failed;
		}
		priv->rx_queue[i]->rx_skbuff = NULL;
		priv->rx_queue[i]->qindex = i;
		priv->rx_queue[i]->dev = dev;
		spin_lock_init(&(priv->rx_queue[i]->rxlock));
	}


A
Andy Fleming 已提交
724 725
	stash = of_get_property(np, "bd-stash", NULL);

726
	if (stash) {
A
Andy Fleming 已提交
727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
		priv->device_flags |= FSL_GIANFAR_DEV_HAS_BD_STASHING;
		priv->bd_stash_en = 1;
	}

	stash_len = of_get_property(np, "rx-stash-len", NULL);

	if (stash_len)
		priv->rx_stash_size = *stash_len;

	stash_idx = of_get_property(np, "rx-stash-idx", NULL);

	if (stash_idx)
		priv->rx_stash_index = *stash_idx;

	if (stash_len || stash_idx)
		priv->device_flags |= FSL_GIANFAR_DEV_HAS_BUF_STASHING;

744
	mac_addr = of_get_mac_address(np);
745

746
	if (mac_addr)
747
		memcpy(dev->dev_addr, mac_addr, ETH_ALEN);
748 749

	if (model && !strcasecmp(model, "TSEC"))
750 751 752 753 754
		priv->device_flags = FSL_GIANFAR_DEV_HAS_GIGABIT |
				     FSL_GIANFAR_DEV_HAS_COALESCE |
				     FSL_GIANFAR_DEV_HAS_RMON |
				     FSL_GIANFAR_DEV_HAS_MULTI_INTR;

755
	if (model && !strcasecmp(model, "eTSEC"))
756 757 758 759 760 761 762 763 764 765
		priv->device_flags = FSL_GIANFAR_DEV_HAS_GIGABIT |
				     FSL_GIANFAR_DEV_HAS_COALESCE |
				     FSL_GIANFAR_DEV_HAS_RMON |
				     FSL_GIANFAR_DEV_HAS_MULTI_INTR |
				     FSL_GIANFAR_DEV_HAS_PADDING |
				     FSL_GIANFAR_DEV_HAS_CSUM |
				     FSL_GIANFAR_DEV_HAS_VLAN |
				     FSL_GIANFAR_DEV_HAS_MAGIC_PACKET |
				     FSL_GIANFAR_DEV_HAS_EXTENDED_HASH |
				     FSL_GIANFAR_DEV_HAS_TIMER;
766 767 768 769 770 771 772 773 774 775 776 777

	ctype = of_get_property(np, "phy-connection-type", NULL);

	/* We only care about rgmii-id.  The rest are autodetected */
	if (ctype && !strcmp(ctype, "rgmii-id"))
		priv->interface = PHY_INTERFACE_MODE_RGMII_ID;
	else
		priv->interface = PHY_INTERFACE_MODE_MII;

	if (of_get_property(np, "fsl,magic-packet", NULL))
		priv->device_flags |= FSL_GIANFAR_DEV_HAS_MAGIC_PACKET;

778
	priv->phy_node = of_parse_phandle(np, "phy-handle", 0);
779 780

	/* Find the TBI PHY.  If it's not there, we don't support SGMII */
781
	priv->tbi_node = of_parse_phandle(np, "tbi-handle", 0);
782 783 784

	return 0;

785 786 787 788
rx_alloc_failed:
	free_rx_pointers(priv);
tx_alloc_failed:
	free_tx_pointers(priv);
789 790
err_grp_init:
	unmap_group_regs(priv);
791
	free_gfar_dev(priv);
792 793 794
	return err;
}

795
static int gfar_hwtstamp_ioctl(struct net_device *netdev,
796
			       struct ifreq *ifr, int cmd)
797 798 799 800 801 802 803 804 805 806 807
{
	struct hwtstamp_config config;
	struct gfar_private *priv = netdev_priv(netdev);

	if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
		return -EFAULT;

	/* reserved for future extensions */
	if (config.flags)
		return -EINVAL;

808 809 810 811 812 813 814 815 816 817
	switch (config.tx_type) {
	case HWTSTAMP_TX_OFF:
		priv->hwts_tx_en = 0;
		break;
	case HWTSTAMP_TX_ON:
		if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER))
			return -ERANGE;
		priv->hwts_tx_en = 1;
		break;
	default:
818
		return -ERANGE;
819
	}
820 821 822

	switch (config.rx_filter) {
	case HWTSTAMP_FILTER_NONE:
823 824 825 826 827
		if (priv->hwts_rx_en) {
			stop_gfar(netdev);
			priv->hwts_rx_en = 0;
			startup_gfar(netdev);
		}
828 829 830 831
		break;
	default:
		if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER))
			return -ERANGE;
832 833 834 835 836
		if (!priv->hwts_rx_en) {
			stop_gfar(netdev);
			priv->hwts_rx_en = 1;
			startup_gfar(netdev);
		}
837 838 839 840 841 842 843 844
		config.rx_filter = HWTSTAMP_FILTER_ALL;
		break;
	}

	return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
		-EFAULT : 0;
}

845 846 847 848 849 850 851 852
/* Ioctl MII Interface */
static int gfar_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{
	struct gfar_private *priv = netdev_priv(dev);

	if (!netif_running(dev))
		return -EINVAL;

853 854 855
	if (cmd == SIOCSHWTSTAMP)
		return gfar_hwtstamp_ioctl(dev, rq, cmd);

856 857 858
	if (!priv->phydev)
		return -ENODEV;

859
	return phy_mii_ioctl(priv->phydev, rq, cmd);
860 861
}

862 863 864 865
static unsigned int reverse_bitmap(unsigned int bit_map, unsigned int max_qs)
{
	unsigned int new_bit_map = 0x0;
	int mask = 0x1 << (max_qs - 1), i;
866

867 868 869 870 871 872 873
	for (i = 0; i < max_qs; i++) {
		if (bit_map & mask)
			new_bit_map = new_bit_map + (1 << i);
		mask = mask >> 0x1;
	}
	return new_bit_map;
}
874

875 876
static u32 cluster_entry_per_class(struct gfar_private *priv, u32 rqfar,
				   u32 class)
877 878 879 880 881 882
{
	u32 rqfpr = FPR_FILER_MASK;
	u32 rqfcr = 0x0;

	rqfar--;
	rqfcr = RQFCR_CLE | RQFCR_PID_MASK | RQFCR_CMP_EXACT;
W
Wu Jiajun-B06378 已提交
883 884
	priv->ftp_rqfpr[rqfar] = rqfpr;
	priv->ftp_rqfcr[rqfar] = rqfcr;
885 886 887 888
	gfar_write_filer(priv, rqfar, rqfcr, rqfpr);

	rqfar--;
	rqfcr = RQFCR_CMP_NOMATCH;
W
Wu Jiajun-B06378 已提交
889 890
	priv->ftp_rqfpr[rqfar] = rqfpr;
	priv->ftp_rqfcr[rqfar] = rqfcr;
891 892 893 894 895
	gfar_write_filer(priv, rqfar, rqfcr, rqfpr);

	rqfar--;
	rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_PARSE | RQFCR_CLE | RQFCR_AND;
	rqfpr = class;
W
Wu Jiajun-B06378 已提交
896 897
	priv->ftp_rqfcr[rqfar] = rqfcr;
	priv->ftp_rqfpr[rqfar] = rqfpr;
898 899 900 901 902
	gfar_write_filer(priv, rqfar, rqfcr, rqfpr);

	rqfar--;
	rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_MASK | RQFCR_AND;
	rqfpr = class;
W
Wu Jiajun-B06378 已提交
903 904
	priv->ftp_rqfcr[rqfar] = rqfcr;
	priv->ftp_rqfpr[rqfar] = rqfpr;
905 906 907 908 909 910 911 912 913 914 915 916 917 918
	gfar_write_filer(priv, rqfar, rqfcr, rqfpr);

	return rqfar;
}

static void gfar_init_filer_table(struct gfar_private *priv)
{
	int i = 0x0;
	u32 rqfar = MAX_FILER_IDX;
	u32 rqfcr = 0x0;
	u32 rqfpr = FPR_FILER_MASK;

	/* Default rule */
	rqfcr = RQFCR_CMP_MATCH;
W
Wu Jiajun-B06378 已提交
919 920
	priv->ftp_rqfcr[rqfar] = rqfcr;
	priv->ftp_rqfpr[rqfar] = rqfpr;
921 922 923 924 925 926 927 928 929
	gfar_write_filer(priv, rqfar, rqfcr, rqfpr);

	rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV6);
	rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV6 | RQFPR_UDP);
	rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV6 | RQFPR_TCP);
	rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV4);
	rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV4 | RQFPR_UDP);
	rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV4 | RQFPR_TCP);

U
Uwe Kleine-König 已提交
930
	/* cur_filer_idx indicated the first non-masked rule */
931 932 933 934 935
	priv->cur_filer_idx = rqfar;

	/* Rest are masked rules */
	rqfcr = RQFCR_CMP_NOMATCH;
	for (i = 0; i < rqfar; i++) {
W
Wu Jiajun-B06378 已提交
936 937
		priv->ftp_rqfcr[i] = rqfcr;
		priv->ftp_rqfpr[i] = rqfpr;
938 939 940 941
		gfar_write_filer(priv, i, rqfcr, rqfpr);
	}
}

942 943 944 945 946 947 948 949 950 951
static void gfar_detect_errata(struct gfar_private *priv)
{
	struct device *dev = &priv->ofdev->dev;
	unsigned int pvr = mfspr(SPRN_PVR);
	unsigned int svr = mfspr(SPRN_SVR);
	unsigned int mod = (svr >> 16) & 0xfff6; /* w/o E suffix */
	unsigned int rev = svr & 0xffff;

	/* MPC8313 Rev 2.0 and higher; All MPC837x */
	if ((pvr == 0x80850010 && mod == 0x80b0 && rev >= 0x0020) ||
952
	    (pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0))
953 954
		priv->errata |= GFAR_ERRATA_74;

955 956
	/* MPC8313 and MPC837x all rev */
	if ((pvr == 0x80850010 && mod == 0x80b0) ||
957
	    (pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0))
958 959
		priv->errata |= GFAR_ERRATA_76;

960 961
	/* MPC8313 and MPC837x all rev */
	if ((pvr == 0x80850010 && mod == 0x80b0) ||
962
	    (pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0))
963 964
		priv->errata |= GFAR_ERRATA_A002;

965 966
	/* MPC8313 Rev < 2.0, MPC8548 rev 2.0 */
	if ((pvr == 0x80850010 && mod == 0x80b0 && rev < 0x0020) ||
967
	    (pvr == 0x80210020 && mod == 0x8030 && rev == 0x0020))
968 969
		priv->errata |= GFAR_ERRATA_12;

970 971 972 973 974
	if (priv->errata)
		dev_info(dev, "enabled errata workarounds, flags: 0x%x\n",
			 priv->errata);
}

975
/* Set up the ethernet device structure, private data,
J
Jan Ceuleers 已提交
976 977
 * and anything else we need before we start
 */
978
static int gfar_probe(struct platform_device *ofdev)
L
Linus Torvalds 已提交
979 980 981 982
{
	u32 tempval;
	struct net_device *dev = NULL;
	struct gfar_private *priv = NULL;
983
	struct gfar __iomem *regs = NULL;
984
	int err = 0, i, grp_idx = 0;
985
	u32 rstat = 0, tstat = 0, rqueue = 0, tqueue = 0;
986
	u32 isrg = 0;
987
	u32 __iomem *baddr;
L
Linus Torvalds 已提交
988

989
	err = gfar_of_init(ofdev, &dev);
L
Linus Torvalds 已提交
990

991 992
	if (err)
		return err;
L
Linus Torvalds 已提交
993 994

	priv = netdev_priv(dev);
995 996
	priv->ndev = dev;
	priv->ofdev = ofdev;
997
	priv->dev = &ofdev->dev;
998
	SET_NETDEV_DEV(dev, &ofdev->dev);
L
Linus Torvalds 已提交
999

1000
	spin_lock_init(&priv->bflock);
1001
	INIT_WORK(&priv->reset_task, gfar_reset_task);
L
Linus Torvalds 已提交
1002

1003
	platform_set_drvdata(ofdev, priv);
1004
	regs = priv->gfargrp[0].regs;
L
Linus Torvalds 已提交
1005

1006 1007
	gfar_detect_errata(priv);

J
Jan Ceuleers 已提交
1008 1009 1010
	/* Stop the DMA engine now, in case it was running before
	 * (The firmware could have used it, and left it running).
	 */
1011
	gfar_halt(dev);
L
Linus Torvalds 已提交
1012 1013

	/* Reset MAC layer */
1014
	gfar_write(&regs->maccfg1, MACCFG1_SOFT_RESET);
L
Linus Torvalds 已提交
1015

1016 1017 1018
	/* We need to delay at least 3 TX clocks */
	udelay(2);

L
Linus Torvalds 已提交
1019
	tempval = (MACCFG1_TX_FLOW | MACCFG1_RX_FLOW);
1020
	gfar_write(&regs->maccfg1, tempval);
L
Linus Torvalds 已提交
1021 1022

	/* Initialize MACCFG2. */
1023 1024 1025 1026
	tempval = MACCFG2_INIT_SETTINGS;
	if (gfar_has_errata(priv, GFAR_ERRATA_74))
		tempval |= MACCFG2_HUGEFRAME | MACCFG2_LENGTHCHECK;
	gfar_write(&regs->maccfg2, tempval);
L
Linus Torvalds 已提交
1027 1028

	/* Initialize ECNTRL */
1029
	gfar_write(&regs->ecntrl, ECNTRL_INIT_SETTINGS);
L
Linus Torvalds 已提交
1030 1031

	/* Set the dev->base_addr to the gfar reg region */
1032
	dev->base_addr = (unsigned long) regs;
L
Linus Torvalds 已提交
1033 1034 1035 1036

	/* Fill in the dev structure */
	dev->watchdog_timeo = TX_TIMEOUT;
	dev->mtu = 1500;
1037
	dev->netdev_ops = &gfar_netdev_ops;
1038 1039
	dev->ethtool_ops = &gfar_ethtool_ops;

1040
	/* Register for napi ...We are registering NAPI for each grp */
1041 1042
	if (priv->mode == SQ_SG_MODE)
		netif_napi_add(dev, &priv->gfargrp[0].napi, gfar_poll_sq,
1043
			       GFAR_DEV_WEIGHT);
1044 1045 1046 1047
	else
		for (i = 0; i < priv->num_grps; i++)
			netif_napi_add(dev, &priv->gfargrp[i].napi, gfar_poll,
				       GFAR_DEV_WEIGHT);
1048

1049
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_CSUM) {
1050
		dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
1051
				   NETIF_F_RXCSUM;
1052
		dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG |
1053
				 NETIF_F_RXCSUM | NETIF_F_HIGHDMA;
1054
	}
1055

J
Jiri Pirko 已提交
1056
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) {
1057 1058 1059
		dev->hw_features |= NETIF_F_HW_VLAN_CTAG_TX |
				    NETIF_F_HW_VLAN_CTAG_RX;
		dev->features |= NETIF_F_HW_VLAN_CTAG_RX;
J
Jiri Pirko 已提交
1060
	}
1061

1062
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_EXTENDED_HASH) {
1063 1064 1065
		priv->extended_hash = 1;
		priv->hash_width = 9;

1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
		priv->hash_regs[0] = &regs->igaddr0;
		priv->hash_regs[1] = &regs->igaddr1;
		priv->hash_regs[2] = &regs->igaddr2;
		priv->hash_regs[3] = &regs->igaddr3;
		priv->hash_regs[4] = &regs->igaddr4;
		priv->hash_regs[5] = &regs->igaddr5;
		priv->hash_regs[6] = &regs->igaddr6;
		priv->hash_regs[7] = &regs->igaddr7;
		priv->hash_regs[8] = &regs->gaddr0;
		priv->hash_regs[9] = &regs->gaddr1;
		priv->hash_regs[10] = &regs->gaddr2;
		priv->hash_regs[11] = &regs->gaddr3;
		priv->hash_regs[12] = &regs->gaddr4;
		priv->hash_regs[13] = &regs->gaddr5;
		priv->hash_regs[14] = &regs->gaddr6;
		priv->hash_regs[15] = &regs->gaddr7;
1082 1083 1084 1085 1086

	} else {
		priv->extended_hash = 0;
		priv->hash_width = 8;

1087 1088 1089 1090 1091 1092 1093 1094
		priv->hash_regs[0] = &regs->gaddr0;
		priv->hash_regs[1] = &regs->gaddr1;
		priv->hash_regs[2] = &regs->gaddr2;
		priv->hash_regs[3] = &regs->gaddr3;
		priv->hash_regs[4] = &regs->gaddr4;
		priv->hash_regs[5] = &regs->gaddr5;
		priv->hash_regs[6] = &regs->gaddr6;
		priv->hash_regs[7] = &regs->gaddr7;
1095 1096
	}

1097
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_PADDING)
1098 1099 1100 1101
		priv->padding = DEFAULT_PADDING;
	else
		priv->padding = 0;

1102
	if (dev->features & NETIF_F_IP_CSUM ||
1103
	    priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)
1104
		dev->needed_headroom = GMAC_FCB_LEN;
L
Linus Torvalds 已提交
1105

1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117
	/* Program the isrg regs only if number of grps > 1 */
	if (priv->num_grps > 1) {
		baddr = &regs->isrg0;
		for (i = 0; i < priv->num_grps; i++) {
			isrg |= (priv->gfargrp[i].rx_bit_map << ISRG_SHIFT_RX);
			isrg |= (priv->gfargrp[i].tx_bit_map << ISRG_SHIFT_TX);
			gfar_write(baddr, isrg);
			baddr++;
			isrg = 0x0;
		}
	}

1118
	/* Need to reverse the bit maps as  bit_map's MSB is q0
1119
	 * but, for_each_set_bit parses from right to left, which
J
Jan Ceuleers 已提交
1120 1121
	 * basically reverses the queue numbers
	 */
1122
	for (i = 0; i< priv->num_grps; i++) {
1123 1124 1125 1126
		priv->gfargrp[i].tx_bit_map =
			reverse_bitmap(priv->gfargrp[i].tx_bit_map, MAX_TX_QS);
		priv->gfargrp[i].rx_bit_map =
			reverse_bitmap(priv->gfargrp[i].rx_bit_map, MAX_RX_QS);
1127 1128 1129
	}

	/* Calculate RSTAT, TSTAT, RQUEUE and TQUEUE values,
J
Jan Ceuleers 已提交
1130 1131
	 * also assign queues to groups
	 */
1132 1133
	for (grp_idx = 0; grp_idx < priv->num_grps; grp_idx++) {
		priv->gfargrp[grp_idx].num_rx_queues = 0x0;
1134

1135
		for_each_set_bit(i, &priv->gfargrp[grp_idx].rx_bit_map,
1136
				 priv->num_rx_queues) {
1137 1138 1139 1140 1141 1142
			priv->gfargrp[grp_idx].num_rx_queues++;
			priv->rx_queue[i]->grp = &priv->gfargrp[grp_idx];
			rstat = rstat | (RSTAT_CLEAR_RHALT >> i);
			rqueue = rqueue | ((RQUEUE_EN0 | RQUEUE_EX0) >> i);
		}
		priv->gfargrp[grp_idx].num_tx_queues = 0x0;
1143

1144
		for_each_set_bit(i, &priv->gfargrp[grp_idx].tx_bit_map,
1145
				 priv->num_tx_queues) {
1146 1147 1148 1149 1150 1151 1152 1153
			priv->gfargrp[grp_idx].num_tx_queues++;
			priv->tx_queue[i]->grp = &priv->gfargrp[grp_idx];
			tstat = tstat | (TSTAT_CLEAR_THALT >> i);
			tqueue = tqueue | (TQUEUE_EN0 >> i);
		}
		priv->gfargrp[grp_idx].rstat = rstat;
		priv->gfargrp[grp_idx].tstat = tstat;
		rstat = tstat =0;
1154 1155 1156 1157 1158
	}

	gfar_write(&regs->rqueue, rqueue);
	gfar_write(&regs->tqueue, tqueue);

L
Linus Torvalds 已提交
1159 1160
	priv->rx_buffer_size = DEFAULT_RX_BUFFER_SIZE;

1161
	/* Initializing some of the rx/tx queue level parameters */
1162 1163 1164 1165 1166 1167
	for (i = 0; i < priv->num_tx_queues; i++) {
		priv->tx_queue[i]->tx_ring_size = DEFAULT_TX_RING_SIZE;
		priv->tx_queue[i]->num_txbdfree = DEFAULT_TX_RING_SIZE;
		priv->tx_queue[i]->txcoalescing = DEFAULT_TX_COALESCE;
		priv->tx_queue[i]->txic = DEFAULT_TXIC;
	}
1168

1169 1170 1171 1172 1173
	for (i = 0; i < priv->num_rx_queues; i++) {
		priv->rx_queue[i]->rx_ring_size = DEFAULT_RX_RING_SIZE;
		priv->rx_queue[i]->rxcoalescing = DEFAULT_RX_COALESCE;
		priv->rx_queue[i]->rxic = DEFAULT_RXIC;
	}
L
Linus Torvalds 已提交
1174

J
Jan Ceuleers 已提交
1175
	/* always enable rx filer */
S
Sebastian Poehn 已提交
1176
	priv->rx_filer_enable = 1;
1177 1178
	/* Enable most messages by default */
	priv->msg_enable = (NETIF_MSG_IFUP << 1 ) - 1;
1179 1180 1181
	/* use pritority h/w tx queue scheduling for single queue devices */
	if (priv->num_tx_queues == 1)
		priv->prio_sched_en = 1;
1182

1183 1184 1185
	/* Carrier starts down, phylib will bring it up */
	netif_carrier_off(dev);

L
Linus Torvalds 已提交
1186 1187 1188
	err = register_netdev(dev);

	if (err) {
1189
		pr_err("%s: Cannot register net device, aborting\n", dev->name);
L
Linus Torvalds 已提交
1190 1191 1192
		goto register_fail;
	}

1193
	device_init_wakeup(&dev->dev,
1194 1195
			   priv->device_flags &
			   FSL_GIANFAR_DEV_HAS_MAGIC_PACKET);
1196

1197
	/* fill out IRQ number and name fields */
1198
	for (i = 0; i < priv->num_grps; i++) {
1199
		struct gfar_priv_grp *grp = &priv->gfargrp[i];
1200
		if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) {
1201
			sprintf(gfar_irq(grp, TX)->name, "%s%s%c%s",
1202
				dev->name, "_g", '0' + i, "_tx");
1203
			sprintf(gfar_irq(grp, RX)->name, "%s%s%c%s",
1204
				dev->name, "_g", '0' + i, "_rx");
1205
			sprintf(gfar_irq(grp, ER)->name, "%s%s%c%s",
1206
				dev->name, "_g", '0' + i, "_er");
1207
		} else
1208
			strcpy(gfar_irq(grp, TX)->name, dev->name);
1209
	}
1210

1211 1212 1213
	/* Initialize the filer table */
	gfar_init_filer_table(priv);

1214 1215 1216
	/* Create all the sysfs files */
	gfar_init_sysfs(dev);

L
Linus Torvalds 已提交
1217
	/* Print out the device info */
1218
	netdev_info(dev, "mac: %pM\n", dev->dev_addr);
L
Linus Torvalds 已提交
1219

J
Jan Ceuleers 已提交
1220 1221 1222
	/* Even more device info helps when determining which kernel
	 * provided which set of benchmarks.
	 */
1223
	netdev_info(dev, "Running with NAPI enabled\n");
1224
	for (i = 0; i < priv->num_rx_queues; i++)
1225 1226
		netdev_info(dev, "RX BD ring size for Q[%d]: %d\n",
			    i, priv->rx_queue[i]->rx_ring_size);
1227
	for (i = 0; i < priv->num_tx_queues; i++)
1228 1229
		netdev_info(dev, "TX BD ring size for Q[%d]: %d\n",
			    i, priv->tx_queue[i]->tx_ring_size);
L
Linus Torvalds 已提交
1230 1231 1232 1233

	return 0;

register_fail:
1234
	unmap_group_regs(priv);
1235 1236
	free_tx_pointers(priv);
	free_rx_pointers(priv);
1237 1238 1239 1240
	if (priv->phy_node)
		of_node_put(priv->phy_node);
	if (priv->tbi_node)
		of_node_put(priv->tbi_node);
1241
	free_gfar_dev(priv);
1242
	return err;
L
Linus Torvalds 已提交
1243 1244
}

1245
static int gfar_remove(struct platform_device *ofdev)
L
Linus Torvalds 已提交
1246
{
1247
	struct gfar_private *priv = platform_get_drvdata(ofdev);
L
Linus Torvalds 已提交
1248

1249 1250 1251 1252 1253
	if (priv->phy_node)
		of_node_put(priv->phy_node);
	if (priv->tbi_node)
		of_node_put(priv->tbi_node);

D
David S. Miller 已提交
1254
	unregister_netdev(priv->ndev);
1255
	unmap_group_regs(priv);
1256
	free_gfar_dev(priv);
L
Linus Torvalds 已提交
1257 1258 1259 1260

	return 0;
}

1261
#ifdef CONFIG_PM
1262 1263

static int gfar_suspend(struct device *dev)
1264
{
1265 1266
	struct gfar_private *priv = dev_get_drvdata(dev);
	struct net_device *ndev = priv->ndev;
1267
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
1268 1269 1270 1271
	unsigned long flags;
	u32 tempval;

	int magic_packet = priv->wol_en &&
1272 1273
			   (priv->device_flags &
			    FSL_GIANFAR_DEV_HAS_MAGIC_PACKET);
1274

1275
	netif_device_detach(ndev);
1276

1277
	if (netif_running(ndev)) {
1278 1279 1280 1281

		local_irq_save(flags);
		lock_tx_qs(priv);
		lock_rx_qs(priv);
1282

1283
		gfar_halt_nodisable(ndev);
1284 1285

		/* Disable Tx, and Rx if wake-on-LAN is disabled. */
1286
		tempval = gfar_read(&regs->maccfg1);
1287 1288 1289 1290 1291 1292

		tempval &= ~MACCFG1_TX_EN;

		if (!magic_packet)
			tempval &= ~MACCFG1_RX_EN;

1293
		gfar_write(&regs->maccfg1, tempval);
1294

1295 1296 1297
		unlock_rx_qs(priv);
		unlock_tx_qs(priv);
		local_irq_restore(flags);
1298

1299
		disable_napi(priv);
1300 1301 1302

		if (magic_packet) {
			/* Enable interrupt on Magic Packet */
1303
			gfar_write(&regs->imask, IMASK_MAG);
1304 1305

			/* Enable Magic Packet mode */
1306
			tempval = gfar_read(&regs->maccfg2);
1307
			tempval |= MACCFG2_MPEN;
1308
			gfar_write(&regs->maccfg2, tempval);
1309 1310 1311 1312 1313 1314 1315 1316
		} else {
			phy_stop(priv->phydev);
		}
	}

	return 0;
}

1317
static int gfar_resume(struct device *dev)
1318
{
1319 1320
	struct gfar_private *priv = dev_get_drvdata(dev);
	struct net_device *ndev = priv->ndev;
1321
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
1322 1323 1324
	unsigned long flags;
	u32 tempval;
	int magic_packet = priv->wol_en &&
1325 1326
			   (priv->device_flags &
			    FSL_GIANFAR_DEV_HAS_MAGIC_PACKET);
1327

1328 1329
	if (!netif_running(ndev)) {
		netif_device_attach(ndev);
1330 1331 1332 1333 1334 1335 1336 1337 1338
		return 0;
	}

	if (!magic_packet && priv->phydev)
		phy_start(priv->phydev);

	/* Disable Magic Packet mode, in case something
	 * else woke us up.
	 */
1339 1340 1341
	local_irq_save(flags);
	lock_tx_qs(priv);
	lock_rx_qs(priv);
1342

1343
	tempval = gfar_read(&regs->maccfg2);
1344
	tempval &= ~MACCFG2_MPEN;
1345
	gfar_write(&regs->maccfg2, tempval);
1346

1347
	gfar_start(ndev);
1348

1349 1350 1351
	unlock_rx_qs(priv);
	unlock_tx_qs(priv);
	local_irq_restore(flags);
1352

1353 1354
	netif_device_attach(ndev);

1355
	enable_napi(priv);
1356 1357 1358 1359 1360 1361 1362 1363 1364

	return 0;
}

static int gfar_restore(struct device *dev)
{
	struct gfar_private *priv = dev_get_drvdata(dev);
	struct net_device *ndev = priv->ndev;

1365 1366 1367
	if (!netif_running(ndev)) {
		netif_device_attach(ndev);

1368
		return 0;
1369
	}
1370

1371 1372 1373 1374 1375
	if (gfar_init_bds(ndev)) {
		free_skb_resources(priv);
		return -ENOMEM;
	}

1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386
	init_registers(ndev);
	gfar_set_mac_address(ndev);
	gfar_init_mac(ndev);
	gfar_start(ndev);

	priv->oldlink = 0;
	priv->oldspeed = 0;
	priv->oldduplex = -1;

	if (priv->phydev)
		phy_start(priv->phydev);
1387

1388
	netif_device_attach(ndev);
1389
	enable_napi(priv);
1390 1391 1392

	return 0;
}
1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403

static struct dev_pm_ops gfar_pm_ops = {
	.suspend = gfar_suspend,
	.resume = gfar_resume,
	.freeze = gfar_suspend,
	.thaw = gfar_resume,
	.restore = gfar_restore,
};

#define GFAR_PM_OPS (&gfar_pm_ops)

1404
#else
1405 1406 1407

#define GFAR_PM_OPS NULL

1408
#endif
L
Linus Torvalds 已提交
1409

1410 1411 1412 1413 1414 1415
/* Reads the controller's registers to determine what interface
 * connects it to the PHY.
 */
static phy_interface_t gfar_get_interface(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
1416
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
1417 1418 1419
	u32 ecntrl;

	ecntrl = gfar_read(&regs->ecntrl);
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431

	if (ecntrl & ECNTRL_SGMII_MODE)
		return PHY_INTERFACE_MODE_SGMII;

	if (ecntrl & ECNTRL_TBI_MODE) {
		if (ecntrl & ECNTRL_REDUCED_MODE)
			return PHY_INTERFACE_MODE_RTBI;
		else
			return PHY_INTERFACE_MODE_TBI;
	}

	if (ecntrl & ECNTRL_REDUCED_MODE) {
1432
		if (ecntrl & ECNTRL_REDUCED_MII_MODE) {
1433
			return PHY_INTERFACE_MODE_RMII;
1434
		}
A
Andy Fleming 已提交
1435
		else {
1436
			phy_interface_t interface = priv->interface;
A
Andy Fleming 已提交
1437

J
Jan Ceuleers 已提交
1438
			/* This isn't autodetected right now, so it must
A
Andy Fleming 已提交
1439 1440 1441 1442 1443
			 * be set by the device tree or platform code.
			 */
			if (interface == PHY_INTERFACE_MODE_RGMII_ID)
				return PHY_INTERFACE_MODE_RGMII_ID;

1444
			return PHY_INTERFACE_MODE_RGMII;
A
Andy Fleming 已提交
1445
		}
1446 1447
	}

1448
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_GIGABIT)
1449 1450 1451 1452 1453 1454
		return PHY_INTERFACE_MODE_GMII;

	return PHY_INTERFACE_MODE_MII;
}


1455 1456
/* Initializes driver's PHY state, and attaches to the PHY.
 * Returns 0 on success.
L
Linus Torvalds 已提交
1457 1458 1459 1460
 */
static int init_phy(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
1461
	uint gigabit_support =
1462
		priv->device_flags & FSL_GIANFAR_DEV_HAS_GIGABIT ?
1463
		SUPPORTED_1000baseT_Full : 0;
1464
	phy_interface_t interface;
L
Linus Torvalds 已提交
1465 1466 1467 1468 1469

	priv->oldlink = 0;
	priv->oldspeed = 0;
	priv->oldduplex = -1;

1470 1471
	interface = gfar_get_interface(dev);

1472 1473 1474 1475 1476 1477 1478 1479
	priv->phydev = of_phy_connect(dev, priv->phy_node, &adjust_link, 0,
				      interface);
	if (!priv->phydev)
		priv->phydev = of_phy_connect_fixed_link(dev, &adjust_link,
							 interface);
	if (!priv->phydev) {
		dev_err(&dev->dev, "could not attach to PHY\n");
		return -ENODEV;
1480
	}
L
Linus Torvalds 已提交
1481

K
Kapil Juneja 已提交
1482 1483 1484
	if (interface == PHY_INTERFACE_MODE_SGMII)
		gfar_configure_serdes(dev);

1485
	/* Remove any features not supported by the controller */
1486 1487
	priv->phydev->supported &= (GFAR_SUPPORTED | gigabit_support);
	priv->phydev->advertising = priv->phydev->supported;
L
Linus Torvalds 已提交
1488 1489 1490 1491

	return 0;
}

J
Jan Ceuleers 已提交
1492
/* Initialize TBI PHY interface for communicating with the
1493 1494 1495 1496 1497 1498 1499
 * SERDES lynx PHY on the chip.  We communicate with this PHY
 * through the MDIO bus on each controller, treating it as a
 * "normal" PHY at the address found in the TBIPA register.  We assume
 * that the TBIPA register is valid.  Either the MDIO bus code will set
 * it to a value that doesn't conflict with other PHYs on the bus, or the
 * value doesn't matter, as there are no other PHYs on the bus.
 */
K
Kapil Juneja 已提交
1500 1501 1502
static void gfar_configure_serdes(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
1503 1504 1505 1506 1507 1508 1509
	struct phy_device *tbiphy;

	if (!priv->tbi_node) {
		dev_warn(&dev->dev, "error: SGMII mode requires that the "
				    "device tree specify a tbi-handle\n");
		return;
	}
1510

1511 1512 1513
	tbiphy = of_phy_find_device(priv->tbi_node);
	if (!tbiphy) {
		dev_err(&dev->dev, "error: Could not get TBI device\n");
1514 1515
		return;
	}
K
Kapil Juneja 已提交
1516

J
Jan Ceuleers 已提交
1517
	/* If the link is already up, we must already be ok, and don't need to
1518 1519 1520 1521
	 * configure and reset the TBI<->SerDes link.  Maybe U-Boot configured
	 * everything for us?  Resetting it takes the link down and requires
	 * several seconds for it to come back.
	 */
1522
	if (phy_read(tbiphy, MII_BMSR) & BMSR_LSTATUS)
1523
		return;
K
Kapil Juneja 已提交
1524

1525
	/* Single clk mode, mii mode off(for serdes communication) */
1526
	phy_write(tbiphy, MII_TBICON, TBICON_CLK_SELECT);
K
Kapil Juneja 已提交
1527

1528
	phy_write(tbiphy, MII_ADVERTISE,
1529 1530
		  ADVERTISE_1000XFULL | ADVERTISE_1000XPAUSE |
		  ADVERTISE_1000XPSE_ASYM);
K
Kapil Juneja 已提交
1531

1532 1533 1534
	phy_write(tbiphy, MII_BMCR,
		  BMCR_ANENABLE | BMCR_ANRESTART | BMCR_FULLDPLX |
		  BMCR_SPEED1000);
K
Kapil Juneja 已提交
1535 1536
}

L
Linus Torvalds 已提交
1537 1538 1539
static void init_registers(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
1540
	struct gfar __iomem *regs = NULL;
1541
	int i;
L
Linus Torvalds 已提交
1542

1543 1544 1545 1546
	for (i = 0; i < priv->num_grps; i++) {
		regs = priv->gfargrp[i].regs;
		/* Clear IEVENT */
		gfar_write(&regs->ievent, IEVENT_INIT_CLEAR);
L
Linus Torvalds 已提交
1547

1548 1549 1550
		/* Initialize IMASK */
		gfar_write(&regs->imask, IMASK_INIT_CLEAR);
	}
L
Linus Torvalds 已提交
1551

1552
	regs = priv->gfargrp[0].regs;
L
Linus Torvalds 已提交
1553
	/* Init hash registers to zero */
1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570
	gfar_write(&regs->igaddr0, 0);
	gfar_write(&regs->igaddr1, 0);
	gfar_write(&regs->igaddr2, 0);
	gfar_write(&regs->igaddr3, 0);
	gfar_write(&regs->igaddr4, 0);
	gfar_write(&regs->igaddr5, 0);
	gfar_write(&regs->igaddr6, 0);
	gfar_write(&regs->igaddr7, 0);

	gfar_write(&regs->gaddr0, 0);
	gfar_write(&regs->gaddr1, 0);
	gfar_write(&regs->gaddr2, 0);
	gfar_write(&regs->gaddr3, 0);
	gfar_write(&regs->gaddr4, 0);
	gfar_write(&regs->gaddr5, 0);
	gfar_write(&regs->gaddr6, 0);
	gfar_write(&regs->gaddr7, 0);
L
Linus Torvalds 已提交
1571 1572

	/* Zero out the rmon mib registers if it has them */
1573
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_RMON) {
1574
		memset_io(&(regs->rmon), 0, sizeof (struct rmon_mib));
L
Linus Torvalds 已提交
1575 1576

		/* Mask off the CAM interrupts */
1577 1578
		gfar_write(&regs->rmon.cam1, 0xffffffff);
		gfar_write(&regs->rmon.cam2, 0xffffffff);
L
Linus Torvalds 已提交
1579 1580 1581
	}

	/* Initialize the max receive buffer length */
1582
	gfar_write(&regs->mrblr, priv->rx_buffer_size);
L
Linus Torvalds 已提交
1583 1584

	/* Initialize the Minimum Frame Length Register */
1585
	gfar_write(&regs->minflr, MINFLR_INIT_SETTINGS);
L
Linus Torvalds 已提交
1586 1587
}

1588 1589 1590 1591
static int __gfar_is_rx_idle(struct gfar_private *priv)
{
	u32 res;

J
Jan Ceuleers 已提交
1592
	/* Normaly TSEC should not hang on GRS commands, so we should
1593 1594 1595 1596 1597
	 * actually wait for IEVENT_GRSC flag.
	 */
	if (likely(!gfar_has_errata(priv, GFAR_ERRATA_A002)))
		return 0;

J
Jan Ceuleers 已提交
1598
	/* Read the eTSEC register at offset 0xD1C. If bits 7-14 are
1599 1600 1601 1602 1603 1604 1605 1606 1607 1608
	 * the same as bits 23-30, the eTSEC Rx is assumed to be idle
	 * and the Rx can be safely reset.
	 */
	res = gfar_read((void __iomem *)priv->gfargrp[0].regs + 0xd1c);
	res &= 0x7f807f80;
	if ((res & 0xffff) == (res >> 16))
		return 1;

	return 0;
}
1609 1610

/* Halt the receive and transmit queues */
1611
static void gfar_halt_nodisable(struct net_device *dev)
L
Linus Torvalds 已提交
1612 1613
{
	struct gfar_private *priv = netdev_priv(dev);
1614
	struct gfar __iomem *regs = NULL;
L
Linus Torvalds 已提交
1615
	u32 tempval;
1616
	int i;
L
Linus Torvalds 已提交
1617

1618 1619 1620 1621
	for (i = 0; i < priv->num_grps; i++) {
		regs = priv->gfargrp[i].regs;
		/* Mask all interrupts */
		gfar_write(&regs->imask, IMASK_INIT_CLEAR);
L
Linus Torvalds 已提交
1622

1623 1624 1625
		/* Clear all interrupts */
		gfar_write(&regs->ievent, IEVENT_INIT_CLEAR);
	}
L
Linus Torvalds 已提交
1626

1627
	regs = priv->gfargrp[0].regs;
L
Linus Torvalds 已提交
1628
	/* Stop the DMA, and wait for it to stop */
1629
	tempval = gfar_read(&regs->dmactrl);
1630 1631
	if ((tempval & (DMACTRL_GRS | DMACTRL_GTS)) !=
	    (DMACTRL_GRS | DMACTRL_GTS)) {
1632 1633
		int ret;

L
Linus Torvalds 已提交
1634
		tempval |= (DMACTRL_GRS | DMACTRL_GTS);
1635
		gfar_write(&regs->dmactrl, tempval);
L
Linus Torvalds 已提交
1636

1637 1638 1639 1640 1641 1642 1643
		do {
			ret = spin_event_timeout(((gfar_read(&regs->ievent) &
				 (IEVENT_GRSC | IEVENT_GTSC)) ==
				 (IEVENT_GRSC | IEVENT_GTSC)), 1000000, 0);
			if (!ret && !(gfar_read(&regs->ievent) & IEVENT_GRSC))
				ret = __gfar_is_rx_idle(priv);
		} while (!ret);
L
Linus Torvalds 已提交
1644
	}
1645 1646 1647 1648 1649 1650
}

/* Halt the receive and transmit queues */
void gfar_halt(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
1651
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
1652
	u32 tempval;
L
Linus Torvalds 已提交
1653

1654 1655
	gfar_halt_nodisable(dev);

L
Linus Torvalds 已提交
1656 1657 1658 1659
	/* Disable Rx and Tx */
	tempval = gfar_read(&regs->maccfg1);
	tempval &= ~(MACCFG1_RX_EN | MACCFG1_TX_EN);
	gfar_write(&regs->maccfg1, tempval);
1660 1661
}

1662 1663
static void free_grp_irqs(struct gfar_priv_grp *grp)
{
1664 1665 1666
	free_irq(gfar_irq(grp, TX)->irq, grp);
	free_irq(gfar_irq(grp, RX)->irq, grp);
	free_irq(gfar_irq(grp, ER)->irq, grp);
1667 1668
}

1669 1670 1671 1672
void stop_gfar(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
	unsigned long flags;
1673
	int i;
1674

1675 1676
	phy_stop(priv->phydev);

1677

1678
	/* Lock it down */
1679 1680 1681
	local_irq_save(flags);
	lock_tx_qs(priv);
	lock_rx_qs(priv);
1682 1683

	gfar_halt(dev);
L
Linus Torvalds 已提交
1684

1685 1686 1687
	unlock_rx_qs(priv);
	unlock_tx_qs(priv);
	local_irq_restore(flags);
L
Linus Torvalds 已提交
1688 1689

	/* Free the IRQs */
1690
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) {
1691 1692
		for (i = 0; i < priv->num_grps; i++)
			free_grp_irqs(&priv->gfargrp[i]);
L
Linus Torvalds 已提交
1693
	} else {
1694
		for (i = 0; i < priv->num_grps; i++)
1695
			free_irq(gfar_irq(&priv->gfargrp[i], TX)->irq,
1696
				 &priv->gfargrp[i]);
L
Linus Torvalds 已提交
1697 1698 1699 1700 1701
	}

	free_skb_resources(priv);
}

1702
static void free_skb_tx_queue(struct gfar_priv_tx_q *tx_queue)
L
Linus Torvalds 已提交
1703 1704
{
	struct txbd8 *txbdp;
1705
	struct gfar_private *priv = netdev_priv(tx_queue->dev);
D
Dai Haruki 已提交
1706
	int i, j;
L
Linus Torvalds 已提交
1707

1708
	txbdp = tx_queue->tx_bd_base;
L
Linus Torvalds 已提交
1709

1710 1711
	for (i = 0; i < tx_queue->tx_ring_size; i++) {
		if (!tx_queue->tx_skbuff[i])
D
Dai Haruki 已提交
1712
			continue;
L
Linus Torvalds 已提交
1713

1714
		dma_unmap_single(priv->dev, txbdp->bufPtr,
1715
				 txbdp->length, DMA_TO_DEVICE);
D
Dai Haruki 已提交
1716
		txbdp->lstatus = 0;
1717
		for (j = 0; j < skb_shinfo(tx_queue->tx_skbuff[i])->nr_frags;
1718
		     j++) {
D
Dai Haruki 已提交
1719
			txbdp++;
1720
			dma_unmap_page(priv->dev, txbdp->bufPtr,
1721
				       txbdp->length, DMA_TO_DEVICE);
L
Linus Torvalds 已提交
1722
		}
1723
		txbdp++;
1724 1725
		dev_kfree_skb_any(tx_queue->tx_skbuff[i]);
		tx_queue->tx_skbuff[i] = NULL;
L
Linus Torvalds 已提交
1726
	}
1727
	kfree(tx_queue->tx_skbuff);
1728
	tx_queue->tx_skbuff = NULL;
1729
}
L
Linus Torvalds 已提交
1730

1731 1732 1733 1734 1735
static void free_skb_rx_queue(struct gfar_priv_rx_q *rx_queue)
{
	struct rxbd8 *rxbdp;
	struct gfar_private *priv = netdev_priv(rx_queue->dev);
	int i;
L
Linus Torvalds 已提交
1736

1737
	rxbdp = rx_queue->rx_bd_base;
L
Linus Torvalds 已提交
1738

1739 1740
	for (i = 0; i < rx_queue->rx_ring_size; i++) {
		if (rx_queue->rx_skbuff[i]) {
1741 1742
			dma_unmap_single(priv->dev, rxbdp->bufPtr,
					 priv->rx_buffer_size,
1743
					 DMA_FROM_DEVICE);
1744 1745
			dev_kfree_skb_any(rx_queue->rx_skbuff[i]);
			rx_queue->rx_skbuff[i] = NULL;
L
Linus Torvalds 已提交
1746
		}
1747 1748 1749
		rxbdp->lstatus = 0;
		rxbdp->bufPtr = 0;
		rxbdp++;
L
Linus Torvalds 已提交
1750
	}
1751
	kfree(rx_queue->rx_skbuff);
1752
	rx_queue->rx_skbuff = NULL;
1753
}
1754

1755
/* If there are any tx skbs or rx skbs still around, free them.
J
Jan Ceuleers 已提交
1756 1757
 * Then free tx_skbuff and rx_skbuff
 */
1758 1759 1760 1761 1762 1763 1764 1765
static void free_skb_resources(struct gfar_private *priv)
{
	struct gfar_priv_tx_q *tx_queue = NULL;
	struct gfar_priv_rx_q *rx_queue = NULL;
	int i;

	/* Go through all the buffer descriptors and free their data buffers */
	for (i = 0; i < priv->num_tx_queues; i++) {
1766
		struct netdev_queue *txq;
1767

1768
		tx_queue = priv->tx_queue[i];
1769
		txq = netdev_get_tx_queue(tx_queue->dev, tx_queue->qindex);
1770
		if (tx_queue->tx_skbuff)
1771
			free_skb_tx_queue(tx_queue);
1772
		netdev_tx_reset_queue(txq);
1773 1774 1775 1776
	}

	for (i = 0; i < priv->num_rx_queues; i++) {
		rx_queue = priv->rx_queue[i];
1777
		if (rx_queue->rx_skbuff)
1778 1779 1780
			free_skb_rx_queue(rx_queue);
	}

1781
	dma_free_coherent(priv->dev,
1782 1783 1784 1785
			  sizeof(struct txbd8) * priv->total_tx_ring_size +
			  sizeof(struct rxbd8) * priv->total_rx_ring_size,
			  priv->tx_queue[0]->tx_bd_base,
			  priv->tx_queue[0]->tx_bd_dma_base);
L
Linus Torvalds 已提交
1786 1787
}

1788 1789 1790
void gfar_start(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
1791
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
1792
	u32 tempval;
1793
	int i = 0;
1794 1795 1796 1797 1798 1799 1800

	/* Enable Rx and Tx in MACCFG1 */
	tempval = gfar_read(&regs->maccfg1);
	tempval |= (MACCFG1_RX_EN | MACCFG1_TX_EN);
	gfar_write(&regs->maccfg1, tempval);

	/* Initialize DMACTRL to have WWR and WOP */
1801
	tempval = gfar_read(&regs->dmactrl);
1802
	tempval |= DMACTRL_INIT_SETTINGS;
1803
	gfar_write(&regs->dmactrl, tempval);
1804 1805

	/* Make sure we aren't stopped */
1806
	tempval = gfar_read(&regs->dmactrl);
1807
	tempval &= ~(DMACTRL_GRS | DMACTRL_GTS);
1808
	gfar_write(&regs->dmactrl, tempval);
1809

1810 1811 1812 1813 1814 1815 1816 1817
	for (i = 0; i < priv->num_grps; i++) {
		regs = priv->gfargrp[i].regs;
		/* Clear THLT/RHLT, so that the DMA starts polling now */
		gfar_write(&regs->tstat, priv->gfargrp[i].tstat);
		gfar_write(&regs->rstat, priv->gfargrp[i].rstat);
		/* Unmask the interrupts we look for */
		gfar_write(&regs->imask, IMASK_DEFAULT);
	}
1818

E
Eric Dumazet 已提交
1819
	dev->trans_start = jiffies; /* prevent tx timeout */
1820 1821
}

1822
static void gfar_configure_coalescing(struct gfar_private *priv,
1823
			       unsigned long tx_mask, unsigned long rx_mask)
L
Linus Torvalds 已提交
1824
{
1825
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
1826
	u32 __iomem *baddr;
1827

1828
	if (priv->mode == MQ_MG_MODE) {
1829
		int i = 0;
1830

1831
		baddr = &regs->txic0;
1832
		for_each_set_bit(i, &tx_mask, priv->num_tx_queues) {
1833 1834
			gfar_write(baddr + i, 0);
			if (likely(priv->tx_queue[i]->txcoalescing))
1835 1836 1837 1838
				gfar_write(baddr + i, priv->tx_queue[i]->txic);
		}

		baddr = &regs->rxic0;
1839
		for_each_set_bit(i, &rx_mask, priv->num_rx_queues) {
1840 1841
			gfar_write(baddr + i, 0);
			if (likely(priv->rx_queue[i]->rxcoalescing))
1842 1843
				gfar_write(baddr + i, priv->rx_queue[i]->rxic);
		}
1844
	} else {
1845
		/* Backward compatible case -- even if we enable
1846 1847 1848 1849 1850 1851 1852 1853 1854
		 * multiple queues, there's only single reg to program
		 */
		gfar_write(&regs->txic, 0);
		if (likely(priv->tx_queue[0]->txcoalescing))
			gfar_write(&regs->txic, priv->tx_queue[0]->txic);

		gfar_write(&regs->rxic, 0);
		if (unlikely(priv->rx_queue[0]->rxcoalescing))
			gfar_write(&regs->rxic, priv->rx_queue[0]->rxic);
1855 1856 1857
	}
}

1858 1859 1860 1861 1862
void gfar_configure_coalescing_all(struct gfar_private *priv)
{
	gfar_configure_coalescing(priv, 0xFF, 0xFF);
}

1863 1864 1865 1866 1867
static int register_grp_irqs(struct gfar_priv_grp *grp)
{
	struct gfar_private *priv = grp->priv;
	struct net_device *dev = priv->ndev;
	int err;
L
Linus Torvalds 已提交
1868 1869

	/* If the device has multiple interrupts, register for
J
Jan Ceuleers 已提交
1870 1871
	 * them.  Otherwise, only register for the one
	 */
1872
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) {
1873
		/* Install our interrupt handlers for Error,
J
Jan Ceuleers 已提交
1874 1875
		 * Transmit, and Receive
		 */
1876 1877 1878
		err = request_irq(gfar_irq(grp, ER)->irq, gfar_error, 0,
				  gfar_irq(grp, ER)->name, grp);
		if (err < 0) {
1879
			netif_err(priv, intr, dev, "Can't get IRQ %d\n",
1880
				  gfar_irq(grp, ER)->irq);
1881

1882
			goto err_irq_fail;
L
Linus Torvalds 已提交
1883
		}
1884 1885 1886
		err = request_irq(gfar_irq(grp, TX)->irq, gfar_transmit, 0,
				  gfar_irq(grp, TX)->name, grp);
		if (err < 0) {
1887
			netif_err(priv, intr, dev, "Can't get IRQ %d\n",
1888
				  gfar_irq(grp, TX)->irq);
L
Linus Torvalds 已提交
1889 1890
			goto tx_irq_fail;
		}
1891 1892 1893
		err = request_irq(gfar_irq(grp, RX)->irq, gfar_receive, 0,
				  gfar_irq(grp, RX)->name, grp);
		if (err < 0) {
1894
			netif_err(priv, intr, dev, "Can't get IRQ %d\n",
1895
				  gfar_irq(grp, RX)->irq);
L
Linus Torvalds 已提交
1896 1897 1898
			goto rx_irq_fail;
		}
	} else {
1899 1900 1901
		err = request_irq(gfar_irq(grp, TX)->irq, gfar_interrupt, 0,
				  gfar_irq(grp, TX)->name, grp);
		if (err < 0) {
1902
			netif_err(priv, intr, dev, "Can't get IRQ %d\n",
1903
				  gfar_irq(grp, TX)->irq);
L
Linus Torvalds 已提交
1904 1905 1906 1907
			goto err_irq_fail;
		}
	}

1908 1909 1910
	return 0;

rx_irq_fail:
1911
	free_irq(gfar_irq(grp, TX)->irq, grp);
1912
tx_irq_fail:
1913
	free_irq(gfar_irq(grp, ER)->irq, grp);
1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942
err_irq_fail:
	return err;

}

/* Bring the controller up and running */
int startup_gfar(struct net_device *ndev)
{
	struct gfar_private *priv = netdev_priv(ndev);
	struct gfar __iomem *regs = NULL;
	int err, i, j;

	for (i = 0; i < priv->num_grps; i++) {
		regs= priv->gfargrp[i].regs;
		gfar_write(&regs->imask, IMASK_INIT_CLEAR);
	}

	regs= priv->gfargrp[0].regs;
	err = gfar_alloc_skb_resources(ndev);
	if (err)
		return err;

	gfar_init_mac(ndev);

	for (i = 0; i < priv->num_grps; i++) {
		err = register_grp_irqs(&priv->gfargrp[i]);
		if (err) {
			for (j = 0; j < i; j++)
				free_grp_irqs(&priv->gfargrp[j]);
1943
			goto irq_fail;
1944 1945 1946
		}
	}

1947
	/* Start the controller */
1948
	gfar_start(ndev);
L
Linus Torvalds 已提交
1949

1950 1951
	phy_start(priv->phydev);

1952
	gfar_configure_coalescing_all(priv);
1953

L
Linus Torvalds 已提交
1954 1955
	return 0;

1956
irq_fail:
1957
	free_skb_resources(priv);
L
Linus Torvalds 已提交
1958 1959 1960
	return err;
}

J
Jan Ceuleers 已提交
1961 1962 1963
/* Called when something needs to use the ethernet device
 * Returns 0 for success.
 */
L
Linus Torvalds 已提交
1964 1965
static int gfar_enet_open(struct net_device *dev)
{
1966
	struct gfar_private *priv = netdev_priv(dev);
L
Linus Torvalds 已提交
1967 1968
	int err;

1969
	enable_napi(priv);
1970

L
Linus Torvalds 已提交
1971 1972 1973 1974 1975 1976 1977
	/* Initialize a bunch of registers */
	init_registers(dev);

	gfar_set_mac_address(dev);

	err = init_phy(dev);

1978
	if (err) {
1979
		disable_napi(priv);
L
Linus Torvalds 已提交
1980
		return err;
1981
	}
L
Linus Torvalds 已提交
1982 1983

	err = startup_gfar(dev);
1984
	if (err) {
1985
		disable_napi(priv);
1986 1987
		return err;
	}
L
Linus Torvalds 已提交
1988

1989
	netif_tx_start_all_queues(dev);
L
Linus Torvalds 已提交
1990

1991 1992
	device_set_wakeup_enable(&dev->dev, priv->wol_en);

L
Linus Torvalds 已提交
1993 1994 1995
	return err;
}

1996
static inline struct txfcb *gfar_add_fcb(struct sk_buff *skb)
1997
{
1998
	struct txfcb *fcb = (struct txfcb *)skb_push(skb, GMAC_FCB_LEN);
1999 2000

	memset(fcb, 0, GMAC_FCB_LEN);
2001 2002 2003 2004

	return fcb;
}

2005
static inline void gfar_tx_checksum(struct sk_buff *skb, struct txfcb *fcb,
2006
				    int fcb_length)
2007 2008 2009 2010 2011
{
	/* If we're here, it's a IP packet with a TCP or UDP
	 * payload.  We set it to checksum, using a pseudo-header
	 * we provide
	 */
2012
	u8 flags = TXFCB_DEFAULT;
2013

J
Jan Ceuleers 已提交
2014 2015 2016
	/* Tell the controller what the protocol is
	 * And provide the already calculated phcs
	 */
2017
	if (ip_hdr(skb)->protocol == IPPROTO_UDP) {
2018
		flags |= TXFCB_UDP;
2019
		fcb->phcs = udp_hdr(skb)->check;
2020
	} else
2021
		fcb->phcs = tcp_hdr(skb)->check;
2022 2023 2024 2025

	/* l3os is the distance between the start of the
	 * frame (skb->data) and the start of the IP hdr.
	 * l4os is the distance between the start of the
J
Jan Ceuleers 已提交
2026 2027
	 * l3 hdr and the l4 hdr
	 */
2028
	fcb->l3os = (u16)(skb_network_offset(skb) - fcb_length);
2029
	fcb->l4os = skb_network_header_len(skb);
2030

2031
	fcb->flags = flags;
2032 2033
}

2034
void inline gfar_tx_vlan(struct sk_buff *skb, struct txfcb *fcb)
2035
{
2036
	fcb->flags |= TXFCB_VLN;
2037 2038 2039
	fcb->vlctl = vlan_tx_tag_get(skb);
}

D
Dai Haruki 已提交
2040
static inline struct txbd8 *skip_txbd(struct txbd8 *bdp, int stride,
2041
				      struct txbd8 *base, int ring_size)
D
Dai Haruki 已提交
2042 2043 2044 2045 2046 2047 2048
{
	struct txbd8 *new_bd = bdp + stride;

	return (new_bd >= (base + ring_size)) ? (new_bd - ring_size) : new_bd;
}

static inline struct txbd8 *next_txbd(struct txbd8 *bdp, struct txbd8 *base,
2049
				      int ring_size)
D
Dai Haruki 已提交
2050 2051 2052 2053
{
	return skip_txbd(bdp, 1, base, ring_size);
}

2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071
/* eTSEC12: csum generation not supported for some fcb offsets */
static inline bool gfar_csum_errata_12(struct gfar_private *priv,
				       unsigned long fcb_addr)
{
	return (gfar_has_errata(priv, GFAR_ERRATA_12) &&
	       (fcb_addr % 0x20) > 0x18);
}

/* eTSEC76: csum generation for frames larger than 2500 may
 * cause excess delays before start of transmission
 */
static inline bool gfar_csum_errata_76(struct gfar_private *priv,
				       unsigned int len)
{
	return (gfar_has_errata(priv, GFAR_ERRATA_76) &&
	       (len > 2500));
}

J
Jan Ceuleers 已提交
2072 2073 2074
/* This is called by the kernel when a frame is ready for transmission.
 * It is pointed to by the dev->hard_start_xmit function pointer
 */
L
Linus Torvalds 已提交
2075 2076 2077
static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
2078
	struct gfar_priv_tx_q *tx_queue = NULL;
2079
	struct netdev_queue *txq;
2080
	struct gfar __iomem *regs = NULL;
2081
	struct txfcb *fcb = NULL;
2082
	struct txbd8 *txbdp, *txbdp_start, *base, *txbdp_tstamp = NULL;
2083
	u32 lstatus;
2084
	int i, rq = 0, do_tstamp = 0;
D
Dai Haruki 已提交
2085
	u32 bufaddr;
A
Andy Fleming 已提交
2086
	unsigned long flags;
2087
	unsigned int nr_frags, nr_txbds, length, fcb_length = GMAC_FCB_LEN;
2088 2089 2090 2091

	rq = skb->queue_mapping;
	tx_queue = priv->tx_queue[rq];
	txq = netdev_get_tx_queue(dev, rq);
2092
	base = tx_queue->tx_bd_base;
2093
	regs = tx_queue->grp->regs;
2094 2095

	/* check if time stamp should be generated */
2096
	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
2097
		     priv->hwts_tx_en)) {
2098
		do_tstamp = 1;
2099 2100
		fcb_length = GMAC_FCB_LEN + GMAC_TXPAL_LEN;
	}
D
Dai Haruki 已提交
2101

2102 2103
	/* make space for additional header when fcb is needed */
	if (((skb->ip_summed == CHECKSUM_PARTIAL) ||
2104 2105 2106
	     vlan_tx_tag_present(skb) ||
	     unlikely(do_tstamp)) &&
	    (skb_headroom(skb) < fcb_length)) {
2107 2108
		struct sk_buff *skb_new;

2109
		skb_new = skb_realloc_headroom(skb, fcb_length);
2110 2111
		if (!skb_new) {
			dev->stats.tx_errors++;
D
David S. Miller 已提交
2112
			kfree_skb(skb);
2113 2114
			return NETDEV_TX_OK;
		}
2115

2116 2117 2118
		if (skb->sk)
			skb_set_owner_w(skb_new, skb->sk);
		consume_skb(skb);
2119 2120 2121
		skb = skb_new;
	}

D
Dai Haruki 已提交
2122 2123 2124
	/* total number of fragments in the SKB */
	nr_frags = skb_shinfo(skb)->nr_frags;

2125 2126 2127 2128 2129 2130
	/* calculate the required number of TxBDs for this skb */
	if (unlikely(do_tstamp))
		nr_txbds = nr_frags + 2;
	else
		nr_txbds = nr_frags + 1;

D
Dai Haruki 已提交
2131
	/* check if there is space to queue this packet */
2132
	if (nr_txbds > tx_queue->num_txbdfree) {
D
Dai Haruki 已提交
2133
		/* no space, stop the queue */
2134
		netif_tx_stop_queue(txq);
D
Dai Haruki 已提交
2135 2136 2137
		dev->stats.tx_fifo_errors++;
		return NETDEV_TX_BUSY;
	}
L
Linus Torvalds 已提交
2138 2139

	/* Update transmit stats */
E
Eric Dumazet 已提交
2140 2141
	tx_queue->stats.tx_bytes += skb->len;
	tx_queue->stats.tx_packets++;
L
Linus Torvalds 已提交
2142

2143
	txbdp = txbdp_start = tx_queue->cur_tx;
2144 2145 2146 2147 2148
	lstatus = txbdp->lstatus;

	/* Time stamp insertion requires one additional TxBD */
	if (unlikely(do_tstamp))
		txbdp_tstamp = txbdp = next_txbd(txbdp, base,
2149
						 tx_queue->tx_ring_size);
L
Linus Torvalds 已提交
2150

D
Dai Haruki 已提交
2151
	if (nr_frags == 0) {
2152 2153
		if (unlikely(do_tstamp))
			txbdp_tstamp->lstatus |= BD_LFLAG(TXBD_LAST |
2154
							  TXBD_INTERRUPT);
2155 2156
		else
			lstatus |= BD_LFLAG(TXBD_LAST | TXBD_INTERRUPT);
D
Dai Haruki 已提交
2157 2158 2159 2160
	} else {
		/* Place the fragment addresses and lengths into the TxBDs */
		for (i = 0; i < nr_frags; i++) {
			/* Point at the next BD, wrapping as needed */
2161
			txbdp = next_txbd(txbdp, base, tx_queue->tx_ring_size);
D
Dai Haruki 已提交
2162 2163 2164 2165

			length = skb_shinfo(skb)->frags[i].size;

			lstatus = txbdp->lstatus | length |
2166
				  BD_LFLAG(TXBD_READY);
D
Dai Haruki 已提交
2167 2168 2169 2170

			/* Handle the last BD specially */
			if (i == nr_frags - 1)
				lstatus |= BD_LFLAG(TXBD_LAST | TXBD_INTERRUPT);
L
Linus Torvalds 已提交
2171

2172
			bufaddr = skb_frag_dma_map(priv->dev,
2173 2174 2175 2176
						   &skb_shinfo(skb)->frags[i],
						   0,
						   length,
						   DMA_TO_DEVICE);
D
Dai Haruki 已提交
2177 2178 2179 2180 2181 2182 2183 2184

			/* set the TxBD length and buffer pointer */
			txbdp->bufPtr = bufaddr;
			txbdp->lstatus = lstatus;
		}

		lstatus = txbdp_start->lstatus;
	}
L
Linus Torvalds 已提交
2185

2186 2187 2188 2189 2190 2191
	/* Add TxPAL between FCB and frame if required */
	if (unlikely(do_tstamp)) {
		skb_push(skb, GMAC_TXPAL_LEN);
		memset(skb->data, 0, GMAC_TXPAL_LEN);
	}

2192
	/* Set up checksumming */
2193
	if (CHECKSUM_PARTIAL == skb->ip_summed) {
2194
		fcb = gfar_add_fcb(skb);
2195 2196 2197 2198 2199
		lstatus |= BD_LFLAG(TXBD_TOE);
		gfar_tx_checksum(skb, fcb, fcb_length);

		if (unlikely(gfar_csum_errata_12(priv, (unsigned long)fcb)) ||
		    unlikely(gfar_csum_errata_76(priv, skb->len))) {
2200 2201
			__skb_pull(skb, GMAC_FCB_LEN);
			skb_checksum_help(skb);
2202 2203
			lstatus &= ~(BD_LFLAG(TXBD_TOE));
			fcb = NULL;
2204
		}
2205 2206
	}

2207
	if (vlan_tx_tag_present(skb)) {
2208 2209
		if (unlikely(NULL == fcb)) {
			fcb = gfar_add_fcb(skb);
2210
			lstatus |= BD_LFLAG(TXBD_TOE);
2211
		}
2212 2213

		gfar_tx_vlan(skb, fcb);
2214 2215
	}

2216 2217
	/* Setup tx hardware time stamping if requested */
	if (unlikely(do_tstamp)) {
2218
		skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
2219 2220 2221 2222 2223 2224
		if (fcb == NULL)
			fcb = gfar_add_fcb(skb);
		fcb->ptp = 1;
		lstatus |= BD_LFLAG(TXBD_TOE);
	}

2225
	txbdp_start->bufPtr = dma_map_single(priv->dev, skb->data,
2226
					     skb_headlen(skb), DMA_TO_DEVICE);
L
Linus Torvalds 已提交
2227

J
Jan Ceuleers 已提交
2228
	/* If time stamping is requested one additional TxBD must be set up. The
2229 2230 2231 2232 2233
	 * first TxBD points to the FCB and must have a data length of
	 * GMAC_FCB_LEN. The second TxBD points to the actual frame data with
	 * the full frame length.
	 */
	if (unlikely(do_tstamp)) {
2234
		txbdp_tstamp->bufPtr = txbdp_start->bufPtr + fcb_length;
2235
		txbdp_tstamp->lstatus |= BD_LFLAG(TXBD_READY) |
2236
					 (skb_headlen(skb) - fcb_length);
2237 2238 2239 2240
		lstatus |= BD_LFLAG(TXBD_CRC | TXBD_READY) | GMAC_FCB_LEN;
	} else {
		lstatus |= BD_LFLAG(TXBD_CRC | TXBD_READY) | skb_headlen(skb);
	}
L
Linus Torvalds 已提交
2241

2242 2243
	netdev_tx_sent_queue(txq, skb->len);

J
Jan Ceuleers 已提交
2244
	/* We can work in parallel with gfar_clean_tx_ring(), except
A
Anton Vorontsov 已提交
2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256
	 * when modifying num_txbdfree. Note that we didn't grab the lock
	 * when we were reading the num_txbdfree and checking for available
	 * space, that's because outside of this function it can only grow,
	 * and once we've got needed space, it cannot suddenly disappear.
	 *
	 * The lock also protects us from gfar_error(), which can modify
	 * regs->tstat and thus retrigger the transfers, which is why we
	 * also must grab the lock before setting ready bit for the first
	 * to be transmitted BD.
	 */
	spin_lock_irqsave(&tx_queue->txlock, flags);

J
Jan Ceuleers 已提交
2257
	/* The powerpc-specific eieio() is used, as wmb() has too strong
2258 2259 2260 2261 2262 2263 2264
	 * semantics (it requires synchronization between cacheable and
	 * uncacheable mappings, which eieio doesn't provide and which we
	 * don't need), thus requiring a more expensive sync instruction.  At
	 * some point, the set of architecture-independent barrier functions
	 * should be expanded to include weaker barriers.
	 */
	eieio();
2265

D
Dai Haruki 已提交
2266 2267
	txbdp_start->lstatus = lstatus;

2268 2269 2270 2271
	eieio(); /* force lstatus write before tx_skbuff */

	tx_queue->tx_skbuff[tx_queue->skb_curtx] = skb;

D
Dai Haruki 已提交
2272
	/* Update the current skb pointer to the next entry we will use
J
Jan Ceuleers 已提交
2273 2274
	 * (wrapping if necessary)
	 */
2275
	tx_queue->skb_curtx = (tx_queue->skb_curtx + 1) &
2276
			      TX_RING_MOD_MASK(tx_queue->tx_ring_size);
D
Dai Haruki 已提交
2277

2278
	tx_queue->cur_tx = next_txbd(txbdp, base, tx_queue->tx_ring_size);
D
Dai Haruki 已提交
2279 2280

	/* reduce TxBD free count */
2281
	tx_queue->num_txbdfree -= (nr_txbds);
L
Linus Torvalds 已提交
2282 2283

	/* If the next BD still needs to be cleaned up, then the bds
J
Jan Ceuleers 已提交
2284 2285
	 * are full.  We need to tell the kernel to stop sending us stuff.
	 */
2286
	if (!tx_queue->num_txbdfree) {
2287
		netif_tx_stop_queue(txq);
L
Linus Torvalds 已提交
2288

2289
		dev->stats.tx_fifo_errors++;
L
Linus Torvalds 已提交
2290 2291 2292
	}

	/* Tell the DMA to go go go */
2293
	gfar_write(&regs->tstat, TSTAT_CLEAR_THALT >> tx_queue->qindex);
L
Linus Torvalds 已提交
2294 2295

	/* Unlock priv */
2296
	spin_unlock_irqrestore(&tx_queue->txlock, flags);
L
Linus Torvalds 已提交
2297

2298
	return NETDEV_TX_OK;
L
Linus Torvalds 已提交
2299 2300 2301 2302 2303 2304
}

/* Stops the kernel queue, and halts the controller */
static int gfar_close(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
2305

2306
	disable_napi(priv);
2307

2308
	cancel_work_sync(&priv->reset_task);
L
Linus Torvalds 已提交
2309 2310
	stop_gfar(dev);

2311 2312 2313
	/* Disconnect from the PHY */
	phy_disconnect(priv->phydev);
	priv->phydev = NULL;
L
Linus Torvalds 已提交
2314

2315
	netif_tx_stop_all_queues(dev);
L
Linus Torvalds 已提交
2316 2317 2318 2319 2320

	return 0;
}

/* Changes the mac address if the controller is not running. */
2321
static int gfar_set_mac_address(struct net_device *dev)
L
Linus Torvalds 已提交
2322
{
2323
	gfar_set_mac_for_addr(dev, 0, dev->dev_addr);
L
Linus Torvalds 已提交
2324 2325 2326 2327

	return 0;
}

S
Sebastian Pöhn 已提交
2328 2329 2330 2331 2332 2333 2334 2335 2336 2337
/* Check if rx parser should be activated */
void gfar_check_rx_parser_mode(struct gfar_private *priv)
{
	struct gfar __iomem *regs;
	u32 tempval;

	regs = priv->gfargrp[0].regs;

	tempval = gfar_read(&regs->rctrl);
	/* If parse is no longer required, then disable parser */
2338
	if (tempval & RCTRL_REQ_PARSER) {
S
Sebastian Pöhn 已提交
2339
		tempval |= RCTRL_PRSDEP_INIT;
2340 2341
		priv->uses_rxfcb = 1;
	} else {
S
Sebastian Pöhn 已提交
2342
		tempval &= ~RCTRL_PRSDEP_INIT;
2343 2344
		priv->uses_rxfcb = 0;
	}
S
Sebastian Pöhn 已提交
2345 2346 2347
	gfar_write(&regs->rctrl, tempval);
}

2348
/* Enables and disables VLAN insertion/extraction */
2349
void gfar_vlan_mode(struct net_device *dev, netdev_features_t features)
2350 2351
{
	struct gfar_private *priv = netdev_priv(dev);
2352
	struct gfar __iomem *regs = NULL;
2353 2354 2355
	unsigned long flags;
	u32 tempval;

2356
	regs = priv->gfargrp[0].regs;
2357 2358
	local_irq_save(flags);
	lock_rx_qs(priv);
2359

2360
	if (features & NETIF_F_HW_VLAN_CTAG_TX) {
2361
		/* Enable VLAN tag insertion */
2362
		tempval = gfar_read(&regs->tctrl);
2363
		tempval |= TCTRL_VLINS;
2364
		gfar_write(&regs->tctrl, tempval);
2365 2366
	} else {
		/* Disable VLAN tag insertion */
2367
		tempval = gfar_read(&regs->tctrl);
2368
		tempval &= ~TCTRL_VLINS;
2369
		gfar_write(&regs->tctrl, tempval);
J
Jiri Pirko 已提交
2370
	}
2371

2372
	if (features & NETIF_F_HW_VLAN_CTAG_RX) {
J
Jiri Pirko 已提交
2373 2374 2375 2376
		/* Enable VLAN tag extraction */
		tempval = gfar_read(&regs->rctrl);
		tempval |= (RCTRL_VLEX | RCTRL_PRSDEP_INIT);
		gfar_write(&regs->rctrl, tempval);
2377
		priv->uses_rxfcb = 1;
J
Jiri Pirko 已提交
2378
	} else {
2379
		/* Disable VLAN tag extraction */
2380
		tempval = gfar_read(&regs->rctrl);
2381
		tempval &= ~RCTRL_VLEX;
2382
		gfar_write(&regs->rctrl, tempval);
S
Sebastian Pöhn 已提交
2383 2384

		gfar_check_rx_parser_mode(priv);
2385 2386
	}

2387 2388
	gfar_change_mtu(dev, dev->mtu);

2389 2390
	unlock_rx_qs(priv);
	local_irq_restore(flags);
2391 2392
}

L
Linus Torvalds 已提交
2393 2394 2395 2396
static int gfar_change_mtu(struct net_device *dev, int new_mtu)
{
	int tempsize, tempval;
	struct gfar_private *priv = netdev_priv(dev);
2397
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
L
Linus Torvalds 已提交
2398
	int oldsize = priv->rx_buffer_size;
2399 2400
	int frame_size = new_mtu + ETH_HLEN;

L
Linus Torvalds 已提交
2401
	if ((frame_size < 64) || (frame_size > JUMBO_FRAME_SIZE)) {
2402
		netif_err(priv, drv, dev, "Invalid MTU setting\n");
L
Linus Torvalds 已提交
2403 2404 2405
		return -EINVAL;
	}

2406
	if (priv->uses_rxfcb)
2407 2408 2409 2410
		frame_size += GMAC_FCB_LEN;

	frame_size += priv->padding;

2411 2412
	tempsize = (frame_size & ~(INCREMENTAL_BUFFER_SIZE - 1)) +
		   INCREMENTAL_BUFFER_SIZE;
L
Linus Torvalds 已提交
2413 2414

	/* Only stop and start the controller if it isn't already
J
Jan Ceuleers 已提交
2415 2416
	 * stopped, and we changed something
	 */
L
Linus Torvalds 已提交
2417 2418 2419 2420 2421 2422 2423
	if ((oldsize != tempsize) && (dev->flags & IFF_UP))
		stop_gfar(dev);

	priv->rx_buffer_size = tempsize;

	dev->mtu = new_mtu;

2424 2425
	gfar_write(&regs->mrblr, priv->rx_buffer_size);
	gfar_write(&regs->maxfrm, priv->rx_buffer_size);
L
Linus Torvalds 已提交
2426 2427 2428

	/* If the mtu is larger than the max size for standard
	 * ethernet frames (ie, a jumbo frame), then set maccfg2
J
Jan Ceuleers 已提交
2429 2430
	 * to allow huge frames, and to check the length
	 */
2431
	tempval = gfar_read(&regs->maccfg2);
L
Linus Torvalds 已提交
2432

2433
	if (priv->rx_buffer_size > DEFAULT_RX_BUFFER_SIZE ||
2434
	    gfar_has_errata(priv, GFAR_ERRATA_74))
L
Linus Torvalds 已提交
2435 2436 2437 2438
		tempval |= (MACCFG2_HUGEFRAME | MACCFG2_LENGTHCHECK);
	else
		tempval &= ~(MACCFG2_HUGEFRAME | MACCFG2_LENGTHCHECK);

2439
	gfar_write(&regs->maccfg2, tempval);
L
Linus Torvalds 已提交
2440 2441 2442 2443 2444 2445 2446

	if ((oldsize != tempsize) && (dev->flags & IFF_UP))
		startup_gfar(dev);

	return 0;
}

2447
/* gfar_reset_task gets scheduled when a packet has not been
L
Linus Torvalds 已提交
2448 2449
 * transmitted after a set amount of time.
 * For now, assume that clearing out all the structures, and
2450 2451 2452
 * starting over will fix the problem.
 */
static void gfar_reset_task(struct work_struct *work)
L
Linus Torvalds 已提交
2453
{
2454
	struct gfar_private *priv = container_of(work, struct gfar_private,
2455
						 reset_task);
2456
	struct net_device *dev = priv->ndev;
L
Linus Torvalds 已提交
2457 2458

	if (dev->flags & IFF_UP) {
2459
		netif_tx_stop_all_queues(dev);
L
Linus Torvalds 已提交
2460 2461
		stop_gfar(dev);
		startup_gfar(dev);
2462
		netif_tx_start_all_queues(dev);
L
Linus Torvalds 已提交
2463 2464
	}

2465
	netif_tx_schedule_all(dev);
L
Linus Torvalds 已提交
2466 2467
}

2468 2469 2470 2471 2472 2473 2474 2475
static void gfar_timeout(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);

	dev->stats.tx_errors++;
	schedule_work(&priv->reset_task);
}

E
Eran Liberty 已提交
2476 2477 2478 2479 2480 2481
static void gfar_align_skb(struct sk_buff *skb)
{
	/* We need the data buffer to be aligned properly.  We will reserve
	 * as many bytes as needed to align the data properly
	 */
	skb_reserve(skb, RXBUF_ALIGNMENT -
2482
		    (((unsigned long) skb->data) & (RXBUF_ALIGNMENT - 1)));
E
Eran Liberty 已提交
2483 2484
}

L
Linus Torvalds 已提交
2485
/* Interrupt Handler for Transmit complete */
C
Claudiu Manoil 已提交
2486
static void gfar_clean_tx_ring(struct gfar_priv_tx_q *tx_queue)
L
Linus Torvalds 已提交
2487
{
2488
	struct net_device *dev = tx_queue->dev;
2489
	struct netdev_queue *txq;
D
Dai Haruki 已提交
2490
	struct gfar_private *priv = netdev_priv(dev);
2491
	struct txbd8 *bdp, *next = NULL;
D
Dai Haruki 已提交
2492
	struct txbd8 *lbdp = NULL;
2493
	struct txbd8 *base = tx_queue->tx_bd_base;
D
Dai Haruki 已提交
2494 2495
	struct sk_buff *skb;
	int skb_dirtytx;
2496
	int tx_ring_size = tx_queue->tx_ring_size;
2497
	int frags = 0, nr_txbds = 0;
D
Dai Haruki 已提交
2498
	int i;
D
Dai Haruki 已提交
2499
	int howmany = 0;
2500 2501
	int tqi = tx_queue->qindex;
	unsigned int bytes_sent = 0;
D
Dai Haruki 已提交
2502
	u32 lstatus;
2503
	size_t buflen;
L
Linus Torvalds 已提交
2504

2505
	txq = netdev_get_tx_queue(dev, tqi);
2506 2507
	bdp = tx_queue->dirty_tx;
	skb_dirtytx = tx_queue->skb_dirtytx;
L
Linus Torvalds 已提交
2508

2509
	while ((skb = tx_queue->tx_skbuff[skb_dirtytx])) {
A
Anton Vorontsov 已提交
2510 2511
		unsigned long flags;

D
Dai Haruki 已提交
2512
		frags = skb_shinfo(skb)->nr_frags;
2513

J
Jan Ceuleers 已提交
2514
		/* When time stamping, one additional TxBD must be freed.
2515 2516
		 * Also, we need to dma_unmap_single() the TxPAL.
		 */
2517
		if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS))
2518 2519 2520 2521 2522
			nr_txbds = frags + 2;
		else
			nr_txbds = frags + 1;

		lbdp = skip_txbd(bdp, nr_txbds - 1, base, tx_ring_size);
L
Linus Torvalds 已提交
2523

D
Dai Haruki 已提交
2524
		lstatus = lbdp->lstatus;
L
Linus Torvalds 已提交
2525

D
Dai Haruki 已提交
2526 2527
		/* Only clean completed frames */
		if ((lstatus & BD_LFLAG(TXBD_READY)) &&
2528
		    (lstatus & BD_LENGTH_MASK))
D
Dai Haruki 已提交
2529 2530
			break;

2531
		if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) {
2532
			next = next_txbd(bdp, base, tx_ring_size);
2533
			buflen = next->length + GMAC_FCB_LEN + GMAC_TXPAL_LEN;
2534 2535 2536
		} else
			buflen = bdp->length;

2537
		dma_unmap_single(priv->dev, bdp->bufPtr,
2538
				 buflen, DMA_TO_DEVICE);
2539

2540
		if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) {
2541 2542
			struct skb_shared_hwtstamps shhwtstamps;
			u64 *ns = (u64*) (((u32)skb->data + 0x10) & ~0x7);
2543

2544 2545
			memset(&shhwtstamps, 0, sizeof(shhwtstamps));
			shhwtstamps.hwtstamp = ns_to_ktime(*ns);
2546
			skb_pull(skb, GMAC_FCB_LEN + GMAC_TXPAL_LEN);
2547 2548 2549 2550
			skb_tstamp_tx(skb, &shhwtstamps);
			bdp->lstatus &= BD_LFLAG(TXBD_WRAP);
			bdp = next;
		}
A
Andy Fleming 已提交
2551

D
Dai Haruki 已提交
2552 2553
		bdp->lstatus &= BD_LFLAG(TXBD_WRAP);
		bdp = next_txbd(bdp, base, tx_ring_size);
D
Dai Haruki 已提交
2554

D
Dai Haruki 已提交
2555
		for (i = 0; i < frags; i++) {
2556
			dma_unmap_page(priv->dev, bdp->bufPtr,
2557
				       bdp->length, DMA_TO_DEVICE);
D
Dai Haruki 已提交
2558 2559 2560
			bdp->lstatus &= BD_LFLAG(TXBD_WRAP);
			bdp = next_txbd(bdp, base, tx_ring_size);
		}
L
Linus Torvalds 已提交
2561

2562 2563
		bytes_sent += skb->len;

E
Eric Dumazet 已提交
2564
		dev_kfree_skb_any(skb);
2565

2566
		tx_queue->tx_skbuff[skb_dirtytx] = NULL;
D
Dai Haruki 已提交
2567

D
Dai Haruki 已提交
2568
		skb_dirtytx = (skb_dirtytx + 1) &
2569
			      TX_RING_MOD_MASK(tx_ring_size);
D
Dai Haruki 已提交
2570 2571

		howmany++;
A
Anton Vorontsov 已提交
2572
		spin_lock_irqsave(&tx_queue->txlock, flags);
2573
		tx_queue->num_txbdfree += nr_txbds;
A
Anton Vorontsov 已提交
2574
		spin_unlock_irqrestore(&tx_queue->txlock, flags);
D
Dai Haruki 已提交
2575
	}
L
Linus Torvalds 已提交
2576

D
Dai Haruki 已提交
2577
	/* If we freed a buffer, we can restart transmission, if necessary */
2578
	if (netif_tx_queue_stopped(txq) && tx_queue->num_txbdfree)
2579
		netif_wake_subqueue(dev, tqi);
L
Linus Torvalds 已提交
2580

D
Dai Haruki 已提交
2581
	/* Update dirty indicators */
2582 2583
	tx_queue->skb_dirtytx = skb_dirtytx;
	tx_queue->dirty_tx = bdp;
L
Linus Torvalds 已提交
2584

2585
	netdev_tx_completed_queue(txq, howmany, bytes_sent);
D
Dai Haruki 已提交
2586 2587
}

2588
static void gfar_schedule_cleanup(struct gfar_priv_grp *gfargrp)
D
Dai Haruki 已提交
2589
{
2590 2591
	unsigned long flags;

2592 2593
	spin_lock_irqsave(&gfargrp->grplock, flags);
	if (napi_schedule_prep(&gfargrp->napi)) {
2594
		gfar_write(&gfargrp->regs->imask, IMASK_RTX_DISABLED);
2595
		__napi_schedule(&gfargrp->napi);
2596
	} else {
J
Jan Ceuleers 已提交
2597
		/* Clear IEVENT, so interrupts aren't called again
2598 2599
		 * because of the packets that have already arrived.
		 */
2600
		gfar_write(&gfargrp->regs->ievent, IEVENT_RTX_MASK);
2601
	}
2602
	spin_unlock_irqrestore(&gfargrp->grplock, flags);
2603

2604
}
L
Linus Torvalds 已提交
2605

2606
/* Interrupt Handler for Transmit complete */
2607
static irqreturn_t gfar_transmit(int irq, void *grp_id)
2608
{
2609
	gfar_schedule_cleanup((struct gfar_priv_grp *)grp_id);
L
Linus Torvalds 已提交
2610 2611 2612
	return IRQ_HANDLED;
}

2613
static void gfar_new_rxbdp(struct gfar_priv_rx_q *rx_queue, struct rxbd8 *bdp,
2614
			   struct sk_buff *skb)
2615
{
2616
	struct net_device *dev = rx_queue->dev;
2617
	struct gfar_private *priv = netdev_priv(dev);
2618
	dma_addr_t buf;
2619

2620
	buf = dma_map_single(priv->dev, skb->data,
2621
			     priv->rx_buffer_size, DMA_FROM_DEVICE);
2622
	gfar_init_rxbdp(rx_queue, bdp, buf);
2623 2624
}

2625
static struct sk_buff *gfar_alloc_skb(struct net_device *dev)
L
Linus Torvalds 已提交
2626 2627
{
	struct gfar_private *priv = netdev_priv(dev);
E
Eric Dumazet 已提交
2628
	struct sk_buff *skb;
L
Linus Torvalds 已提交
2629

E
Eran Liberty 已提交
2630
	skb = netdev_alloc_skb(dev, priv->rx_buffer_size + RXBUF_ALIGNMENT);
2631
	if (!skb)
L
Linus Torvalds 已提交
2632 2633
		return NULL;

E
Eran Liberty 已提交
2634
	gfar_align_skb(skb);
2635

E
Eran Liberty 已提交
2636 2637 2638
	return skb;
}

2639
struct sk_buff *gfar_new_skb(struct net_device *dev)
E
Eran Liberty 已提交
2640
{
E
Eric Dumazet 已提交
2641
	return gfar_alloc_skb(dev);
L
Linus Torvalds 已提交
2642 2643
}

2644
static inline void count_errors(unsigned short status, struct net_device *dev)
L
Linus Torvalds 已提交
2645
{
2646
	struct gfar_private *priv = netdev_priv(dev);
2647
	struct net_device_stats *stats = &dev->stats;
L
Linus Torvalds 已提交
2648 2649
	struct gfar_extra_stats *estats = &priv->extra_stats;

J
Jan Ceuleers 已提交
2650
	/* If the packet was truncated, none of the other errors matter */
L
Linus Torvalds 已提交
2651 2652 2653
	if (status & RXBD_TRUNCATED) {
		stats->rx_length_errors++;

2654
		atomic64_inc(&estats->rx_trunc);
L
Linus Torvalds 已提交
2655 2656 2657 2658 2659 2660 2661 2662

		return;
	}
	/* Count the errors, if there were any */
	if (status & (RXBD_LARGE | RXBD_SHORT)) {
		stats->rx_length_errors++;

		if (status & RXBD_LARGE)
2663
			atomic64_inc(&estats->rx_large);
L
Linus Torvalds 已提交
2664
		else
2665
			atomic64_inc(&estats->rx_short);
L
Linus Torvalds 已提交
2666 2667 2668
	}
	if (status & RXBD_NONOCTET) {
		stats->rx_frame_errors++;
2669
		atomic64_inc(&estats->rx_nonoctet);
L
Linus Torvalds 已提交
2670 2671
	}
	if (status & RXBD_CRCERR) {
2672
		atomic64_inc(&estats->rx_crcerr);
L
Linus Torvalds 已提交
2673 2674 2675
		stats->rx_crc_errors++;
	}
	if (status & RXBD_OVERRUN) {
2676
		atomic64_inc(&estats->rx_overrun);
L
Linus Torvalds 已提交
2677 2678 2679 2680
		stats->rx_crc_errors++;
	}
}

2681
irqreturn_t gfar_receive(int irq, void *grp_id)
L
Linus Torvalds 已提交
2682
{
2683
	gfar_schedule_cleanup((struct gfar_priv_grp *)grp_id);
L
Linus Torvalds 已提交
2684 2685 2686
	return IRQ_HANDLED;
}

2687 2688 2689 2690
static inline void gfar_rx_checksum(struct sk_buff *skb, struct rxfcb *fcb)
{
	/* If valid headers were found, and valid sums
	 * were verified, then we tell the kernel that no
J
Jan Ceuleers 已提交
2691 2692
	 * checksumming is necessary.  Otherwise, it is [FIXME]
	 */
2693
	if ((fcb->flags & RXFCB_CSUM_MASK) == (RXFCB_CIP | RXFCB_CTU))
2694 2695
		skb->ip_summed = CHECKSUM_UNNECESSARY;
	else
2696
		skb_checksum_none_assert(skb);
2697 2698 2699
}


J
Jan Ceuleers 已提交
2700
/* gfar_process_frame() -- handle one incoming packet if skb isn't NULL. */
2701 2702
static void gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
			       int amount_pull, struct napi_struct *napi)
L
Linus Torvalds 已提交
2703 2704
{
	struct gfar_private *priv = netdev_priv(dev);
2705
	struct rxfcb *fcb = NULL;
L
Linus Torvalds 已提交
2706

2707 2708
	/* fcb is at the beginning if exists */
	fcb = (struct rxfcb *)skb->data;
2709

J
Jan Ceuleers 已提交
2710 2711 2712
	/* Remove the FCB from the skb
	 * Remove the padded bytes, if there are any
	 */
2713 2714
	if (amount_pull) {
		skb_record_rx_queue(skb, fcb->rq);
2715
		skb_pull(skb, amount_pull);
2716
	}
2717

2718 2719 2720 2721
	/* Get receive timestamp from the skb */
	if (priv->hwts_rx_en) {
		struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
		u64 *ns = (u64 *) skb->data;
2722

2723 2724 2725 2726 2727 2728 2729
		memset(shhwtstamps, 0, sizeof(*shhwtstamps));
		shhwtstamps->hwtstamp = ns_to_ktime(*ns);
	}

	if (priv->padding)
		skb_pull(skb, priv->padding);

2730
	if (dev->features & NETIF_F_RXCSUM)
2731
		gfar_rx_checksum(skb, fcb);
2732

2733 2734
	/* Tell the skb what kind of packet this is */
	skb->protocol = eth_type_trans(skb, dev);
L
Linus Torvalds 已提交
2735

2736
	/* There's need to check for NETIF_F_HW_VLAN_CTAG_RX here.
2737 2738 2739
	 * Even if vlan rx accel is disabled, on some chips
	 * RXFCB_VLN is pseudo randomly set.
	 */
2740
	if (dev->features & NETIF_F_HW_VLAN_CTAG_RX &&
2741
	    fcb->flags & RXFCB_VLN)
2742
		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), fcb->vlctl);
J
Jiri Pirko 已提交
2743

2744
	/* Send the packet up the stack */
2745
	napi_gro_receive(napi, skb);
2746

L
Linus Torvalds 已提交
2747 2748 2749
}

/* gfar_clean_rx_ring() -- Processes each frame in the rx ring
2750 2751
 * until the budget/quota has been reached. Returns the number
 * of frames handled
L
Linus Torvalds 已提交
2752
 */
2753
int gfar_clean_rx_ring(struct gfar_priv_rx_q *rx_queue, int rx_work_limit)
L
Linus Torvalds 已提交
2754
{
2755
	struct net_device *dev = rx_queue->dev;
2756
	struct rxbd8 *bdp, *base;
L
Linus Torvalds 已提交
2757
	struct sk_buff *skb;
2758 2759
	int pkt_len;
	int amount_pull;
L
Linus Torvalds 已提交
2760 2761 2762 2763
	int howmany = 0;
	struct gfar_private *priv = netdev_priv(dev);

	/* Get the first full descriptor */
2764 2765
	bdp = rx_queue->cur_rx;
	base = rx_queue->rx_bd_base;
L
Linus Torvalds 已提交
2766

2767
	amount_pull = priv->uses_rxfcb ? GMAC_FCB_LEN : 0;
2768

L
Linus Torvalds 已提交
2769
	while (!((bdp->status & RXBD_EMPTY) || (--rx_work_limit < 0))) {
2770
		struct sk_buff *newskb;
2771

2772
		rmb();
2773 2774 2775 2776

		/* Add another skb for the future */
		newskb = gfar_new_skb(dev);

2777
		skb = rx_queue->rx_skbuff[rx_queue->skb_currx];
L
Linus Torvalds 已提交
2778

2779
		dma_unmap_single(priv->dev, bdp->bufPtr,
2780
				 priv->rx_buffer_size, DMA_FROM_DEVICE);
A
Andy Fleming 已提交
2781

2782
		if (unlikely(!(bdp->status & RXBD_ERR) &&
2783
			     bdp->length > priv->rx_buffer_size))
2784 2785
			bdp->status = RXBD_LARGE;

2786 2787
		/* We drop the frame if we failed to allocate a new buffer */
		if (unlikely(!newskb || !(bdp->status & RXBD_LAST) ||
2788
			     bdp->status & RXBD_ERR)) {
2789 2790 2791 2792
			count_errors(bdp->status, dev);

			if (unlikely(!newskb))
				newskb = skb;
E
Eran Liberty 已提交
2793
			else if (skb)
E
Eric Dumazet 已提交
2794
				dev_kfree_skb(skb);
2795
		} else {
L
Linus Torvalds 已提交
2796
			/* Increment the number of packets */
S
Sandeep Gopalpet 已提交
2797
			rx_queue->stats.rx_packets++;
L
Linus Torvalds 已提交
2798 2799
			howmany++;

2800 2801 2802 2803
			if (likely(skb)) {
				pkt_len = bdp->length - ETH_FCS_LEN;
				/* Remove the FCS from the packet length */
				skb_put(skb, pkt_len);
S
Sandeep Gopalpet 已提交
2804
				rx_queue->stats.rx_bytes += pkt_len;
2805
				skb_record_rx_queue(skb, rx_queue->qindex);
W
Wu Jiajun-B06378 已提交
2806
				gfar_process_frame(dev, skb, amount_pull,
2807
						   &rx_queue->grp->napi);
2808 2809

			} else {
2810
				netif_warn(priv, rx_err, dev, "Missing skb!\n");
S
Sandeep Gopalpet 已提交
2811
				rx_queue->stats.rx_dropped++;
2812
				atomic64_inc(&priv->extra_stats.rx_skbmissing);
2813
			}
L
Linus Torvalds 已提交
2814 2815 2816

		}

2817
		rx_queue->rx_skbuff[rx_queue->skb_currx] = newskb;
L
Linus Torvalds 已提交
2818

2819
		/* Setup the new bdp */
2820
		gfar_new_rxbdp(rx_queue, bdp, newskb);
L
Linus Torvalds 已提交
2821 2822

		/* Update to the next pointer */
2823
		bdp = next_bd(bdp, base, rx_queue->rx_ring_size);
L
Linus Torvalds 已提交
2824 2825

		/* update to point at the next skb */
2826 2827
		rx_queue->skb_currx = (rx_queue->skb_currx + 1) &
				      RX_RING_MOD_MASK(rx_queue->rx_ring_size);
L
Linus Torvalds 已提交
2828 2829 2830
	}

	/* Update the current rxbd pointer to be the next one */
2831
	rx_queue->cur_rx = bdp;
L
Linus Torvalds 已提交
2832 2833 2834 2835

	return howmany;
}

2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877
static int gfar_poll_sq(struct napi_struct *napi, int budget)
{
	struct gfar_priv_grp *gfargrp =
		container_of(napi, struct gfar_priv_grp, napi);
	struct gfar __iomem *regs = gfargrp->regs;
	struct gfar_priv_tx_q *tx_queue = gfargrp->priv->tx_queue[0];
	struct gfar_priv_rx_q *rx_queue = gfargrp->priv->rx_queue[0];
	int work_done = 0;

	/* Clear IEVENT, so interrupts aren't called again
	 * because of the packets that have already arrived
	 */
	gfar_write(&regs->ievent, IEVENT_RTX_MASK);

	/* run Tx cleanup to completion */
	if (tx_queue->tx_skbuff[tx_queue->skb_dirtytx])
		gfar_clean_tx_ring(tx_queue);

	work_done = gfar_clean_rx_ring(rx_queue, budget);

	if (work_done < budget) {
		napi_complete(napi);
		/* Clear the halt bit in RSTAT */
		gfar_write(&regs->rstat, gfargrp->rstat);

		gfar_write(&regs->imask, IMASK_DEFAULT);

		/* If we are coalescing interrupts, update the timer
		 * Otherwise, clear it
		 */
		gfar_write(&regs->txic, 0);
		if (likely(tx_queue->txcoalescing))
			gfar_write(&regs->txic, tx_queue->txic);

		gfar_write(&regs->rxic, 0);
		if (unlikely(rx_queue->rxcoalescing))
			gfar_write(&regs->rxic, rx_queue->rxic);
	}

	return work_done;
}

2878
static int gfar_poll(struct napi_struct *napi, int budget)
L
Linus Torvalds 已提交
2879
{
2880 2881
	struct gfar_priv_grp *gfargrp =
		container_of(napi, struct gfar_priv_grp, napi);
2882
	struct gfar_private *priv = gfargrp->priv;
2883
	struct gfar __iomem *regs = gfargrp->regs;
2884
	struct gfar_priv_tx_q *tx_queue = NULL;
2885
	struct gfar_priv_rx_q *rx_queue = NULL;
C
Claudiu Manoil 已提交
2886
	int work_done = 0, work_done_per_q = 0;
2887
	int i, budget_per_q = 0;
C
Claudiu Manoil 已提交
2888
	int has_tx_work;
2889 2890
	unsigned long rstat_rxf;
	int num_act_queues;
2891

2892
	/* Clear IEVENT, so interrupts aren't called again
J
Jan Ceuleers 已提交
2893 2894
	 * because of the packets that have already arrived
	 */
2895
	gfar_write(&regs->ievent, IEVENT_RTX_MASK);
2896

2897 2898 2899 2900 2901 2902
	rstat_rxf = gfar_read(&regs->rstat) & RSTAT_RXF_MASK;

	num_act_queues = bitmap_weight(&rstat_rxf, MAX_RX_QS);
	if (num_act_queues)
		budget_per_q = budget/num_act_queues;

C
Claudiu Manoil 已提交
2903 2904 2905 2906 2907 2908 2909 2910 2911 2912
	while (1) {
		has_tx_work = 0;
		for_each_set_bit(i, &gfargrp->tx_bit_map, priv->num_tx_queues) {
			tx_queue = priv->tx_queue[i];
			/* run Tx cleanup to completion */
			if (tx_queue->tx_skbuff[tx_queue->skb_dirtytx]) {
				gfar_clean_tx_ring(tx_queue);
				has_tx_work = 1;
			}
		}
2913

2914
		for_each_set_bit(i, &gfargrp->rx_bit_map, priv->num_rx_queues) {
2915 2916
			/* skip queue if not active */
			if (!(rstat_rxf & (RSTAT_CLEAR_RXF0 >> i)))
2917
				continue;
C
Claudiu Manoil 已提交
2918

2919
			rx_queue = priv->rx_queue[i];
C
Claudiu Manoil 已提交
2920 2921 2922 2923 2924 2925
			work_done_per_q =
				gfar_clean_rx_ring(rx_queue, budget_per_q);
			work_done += work_done_per_q;

			/* finished processing this queue */
			if (work_done_per_q < budget_per_q) {
2926 2927 2928 2929 2930 2931 2932
				/* clear active queue hw indication */
				gfar_write(&regs->rstat,
					   RSTAT_CLEAR_RXF0 >> i);
				rstat_rxf &= ~(RSTAT_CLEAR_RXF0 >> i);
				num_act_queues--;

				if (!num_act_queues)
C
Claudiu Manoil 已提交
2933 2934 2935
					break;
				/* recompute budget per Rx queue */
				budget_per_q =
2936
					(budget - work_done) / num_act_queues;
2937 2938
			}
		}
L
Linus Torvalds 已提交
2939

C
Claudiu Manoil 已提交
2940 2941
		if (work_done >= budget)
			break;
2942

2943
		if (!num_act_queues && !has_tx_work) {
L
Linus Torvalds 已提交
2944

C
Claudiu Manoil 已提交
2945
			napi_complete(napi);
L
Linus Torvalds 已提交
2946

C
Claudiu Manoil 已提交
2947 2948
			/* Clear the halt bit in RSTAT */
			gfar_write(&regs->rstat, gfargrp->rstat);
L
Linus Torvalds 已提交
2949

C
Claudiu Manoil 已提交
2950 2951 2952 2953 2954 2955 2956 2957 2958
			gfar_write(&regs->imask, IMASK_DEFAULT);

			/* If we are coalescing interrupts, update the timer
			 * Otherwise, clear it
			 */
			gfar_configure_coalescing(priv, gfargrp->rx_bit_map,
						  gfargrp->tx_bit_map);
			break;
		}
L
Linus Torvalds 已提交
2959 2960
	}

C
Claudiu Manoil 已提交
2961
	return work_done;
L
Linus Torvalds 已提交
2962 2963
}

2964
#ifdef CONFIG_NET_POLL_CONTROLLER
J
Jan Ceuleers 已提交
2965
/* Polling 'interrupt' - used by things like netconsole to send skbs
2966 2967 2968 2969 2970 2971
 * without having to re-enable interrupts. It's not called while
 * the interrupt routine is executing.
 */
static void gfar_netpoll(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
2972
	int i;
2973 2974

	/* If the device has multiple interrupts, run tx/rx */
2975
	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) {
2976
		for (i = 0; i < priv->num_grps; i++) {
2977 2978 2979 2980 2981 2982 2983 2984 2985
			struct gfar_priv_grp *grp = &priv->gfargrp[i];

			disable_irq(gfar_irq(grp, TX)->irq);
			disable_irq(gfar_irq(grp, RX)->irq);
			disable_irq(gfar_irq(grp, ER)->irq);
			gfar_interrupt(gfar_irq(grp, TX)->irq, grp);
			enable_irq(gfar_irq(grp, ER)->irq);
			enable_irq(gfar_irq(grp, RX)->irq);
			enable_irq(gfar_irq(grp, TX)->irq);
2986
		}
2987
	} else {
2988
		for (i = 0; i < priv->num_grps; i++) {
2989 2990 2991 2992 2993
			struct gfar_priv_grp *grp = &priv->gfargrp[i];

			disable_irq(gfar_irq(grp, TX)->irq);
			gfar_interrupt(gfar_irq(grp, TX)->irq, grp);
			enable_irq(gfar_irq(grp, TX)->irq);
2994
		}
2995 2996 2997 2998
	}
}
#endif

L
Linus Torvalds 已提交
2999
/* The interrupt handler for devices with one interrupt */
3000
static irqreturn_t gfar_interrupt(int irq, void *grp_id)
L
Linus Torvalds 已提交
3001
{
3002
	struct gfar_priv_grp *gfargrp = grp_id;
L
Linus Torvalds 已提交
3003 3004

	/* Save ievent for future reference */
3005
	u32 events = gfar_read(&gfargrp->regs->ievent);
L
Linus Torvalds 已提交
3006 3007

	/* Check for reception */
3008
	if (events & IEVENT_RX_MASK)
3009
		gfar_receive(irq, grp_id);
L
Linus Torvalds 已提交
3010 3011

	/* Check for transmit completion */
3012
	if (events & IEVENT_TX_MASK)
3013
		gfar_transmit(irq, grp_id);
L
Linus Torvalds 已提交
3014

3015 3016
	/* Check for errors */
	if (events & IEVENT_ERR_MASK)
3017
		gfar_error(irq, grp_id);
L
Linus Torvalds 已提交
3018 3019 3020 3021 3022 3023

	return IRQ_HANDLED;
}

/* Called every time the controller might need to be made
 * aware of new link state.  The PHY code conveys this
3024
 * information through variables in the phydev structure, and this
L
Linus Torvalds 已提交
3025 3026 3027 3028 3029 3030
 * function converts those variables into the appropriate
 * register values, and can bring down the device if needed.
 */
static void adjust_link(struct net_device *dev)
{
	struct gfar_private *priv = netdev_priv(dev);
3031
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
3032 3033 3034 3035
	unsigned long flags;
	struct phy_device *phydev = priv->phydev;
	int new_state = 0;

3036 3037 3038
	local_irq_save(flags);
	lock_tx_qs(priv);

3039 3040
	if (phydev->link) {
		u32 tempval = gfar_read(&regs->maccfg2);
3041
		u32 ecntrl = gfar_read(&regs->ecntrl);
L
Linus Torvalds 已提交
3042 3043

		/* Now we make sure that we can be in full duplex mode.
J
Jan Ceuleers 已提交
3044 3045
		 * If not, we operate in half-duplex mode.
		 */
3046 3047 3048
		if (phydev->duplex != priv->oldduplex) {
			new_state = 1;
			if (!(phydev->duplex))
L
Linus Torvalds 已提交
3049
				tempval &= ~(MACCFG2_FULL_DUPLEX);
3050
			else
L
Linus Torvalds 已提交
3051 3052
				tempval |= MACCFG2_FULL_DUPLEX;

3053
			priv->oldduplex = phydev->duplex;
L
Linus Torvalds 已提交
3054 3055
		}

3056 3057 3058
		if (phydev->speed != priv->oldspeed) {
			new_state = 1;
			switch (phydev->speed) {
L
Linus Torvalds 已提交
3059 3060 3061
			case 1000:
				tempval =
				    ((tempval & ~(MACCFG2_IF)) | MACCFG2_GMII);
3062 3063

				ecntrl &= ~(ECNTRL_R100);
L
Linus Torvalds 已提交
3064 3065 3066 3067 3068
				break;
			case 100:
			case 10:
				tempval =
				    ((tempval & ~(MACCFG2_IF)) | MACCFG2_MII);
3069 3070

				/* Reduced mode distinguishes
J
Jan Ceuleers 已提交
3071 3072
				 * between 10 and 100
				 */
3073 3074 3075 3076
				if (phydev->speed == SPEED_100)
					ecntrl |= ECNTRL_R100;
				else
					ecntrl &= ~(ECNTRL_R100);
L
Linus Torvalds 已提交
3077 3078
				break;
			default:
3079 3080 3081
				netif_warn(priv, link, dev,
					   "Ack!  Speed (%d) is not 10/100/1000!\n",
					   phydev->speed);
L
Linus Torvalds 已提交
3082 3083 3084
				break;
			}

3085
			priv->oldspeed = phydev->speed;
L
Linus Torvalds 已提交
3086 3087
		}

3088
		gfar_write(&regs->maccfg2, tempval);
3089
		gfar_write(&regs->ecntrl, ecntrl);
3090

L
Linus Torvalds 已提交
3091
		if (!priv->oldlink) {
3092
			new_state = 1;
L
Linus Torvalds 已提交
3093 3094
			priv->oldlink = 1;
		}
3095 3096 3097 3098 3099
	} else if (priv->oldlink) {
		new_state = 1;
		priv->oldlink = 0;
		priv->oldspeed = 0;
		priv->oldduplex = -1;
L
Linus Torvalds 已提交
3100 3101
	}

3102 3103
	if (new_state && netif_msg_link(priv))
		phy_print_status(phydev);
3104 3105
	unlock_tx_qs(priv);
	local_irq_restore(flags);
3106
}
L
Linus Torvalds 已提交
3107 3108 3109 3110

/* Update the hash table based on the current list of multicast
 * addresses we subscribe to.  Also, change the promiscuity of
 * the device based on the flags (this function is called
J
Jan Ceuleers 已提交
3111 3112
 * whenever dev->flags is changed
 */
L
Linus Torvalds 已提交
3113 3114
static void gfar_set_multi(struct net_device *dev)
{
3115
	struct netdev_hw_addr *ha;
L
Linus Torvalds 已提交
3116
	struct gfar_private *priv = netdev_priv(dev);
3117
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
L
Linus Torvalds 已提交
3118 3119
	u32 tempval;

3120
	if (dev->flags & IFF_PROMISC) {
L
Linus Torvalds 已提交
3121 3122 3123 3124 3125 3126 3127 3128 3129 3130
		/* Set RCTRL to PROM */
		tempval = gfar_read(&regs->rctrl);
		tempval |= RCTRL_PROM;
		gfar_write(&regs->rctrl, tempval);
	} else {
		/* Set RCTRL to not PROM */
		tempval = gfar_read(&regs->rctrl);
		tempval &= ~(RCTRL_PROM);
		gfar_write(&regs->rctrl, tempval);
	}
3131

3132
	if (dev->flags & IFF_ALLMULTI) {
L
Linus Torvalds 已提交
3133
		/* Set the hash to rx all multicast frames */
3134 3135 3136 3137 3138 3139 3140 3141
		gfar_write(&regs->igaddr0, 0xffffffff);
		gfar_write(&regs->igaddr1, 0xffffffff);
		gfar_write(&regs->igaddr2, 0xffffffff);
		gfar_write(&regs->igaddr3, 0xffffffff);
		gfar_write(&regs->igaddr4, 0xffffffff);
		gfar_write(&regs->igaddr5, 0xffffffff);
		gfar_write(&regs->igaddr6, 0xffffffff);
		gfar_write(&regs->igaddr7, 0xffffffff);
L
Linus Torvalds 已提交
3142 3143 3144 3145 3146 3147 3148 3149 3150
		gfar_write(&regs->gaddr0, 0xffffffff);
		gfar_write(&regs->gaddr1, 0xffffffff);
		gfar_write(&regs->gaddr2, 0xffffffff);
		gfar_write(&regs->gaddr3, 0xffffffff);
		gfar_write(&regs->gaddr4, 0xffffffff);
		gfar_write(&regs->gaddr5, 0xffffffff);
		gfar_write(&regs->gaddr6, 0xffffffff);
		gfar_write(&regs->gaddr7, 0xffffffff);
	} else {
3151 3152 3153
		int em_num;
		int idx;

L
Linus Torvalds 已提交
3154
		/* zero out the hash */
3155 3156 3157 3158 3159 3160 3161 3162
		gfar_write(&regs->igaddr0, 0x0);
		gfar_write(&regs->igaddr1, 0x0);
		gfar_write(&regs->igaddr2, 0x0);
		gfar_write(&regs->igaddr3, 0x0);
		gfar_write(&regs->igaddr4, 0x0);
		gfar_write(&regs->igaddr5, 0x0);
		gfar_write(&regs->igaddr6, 0x0);
		gfar_write(&regs->igaddr7, 0x0);
L
Linus Torvalds 已提交
3163 3164 3165 3166 3167 3168 3169 3170 3171
		gfar_write(&regs->gaddr0, 0x0);
		gfar_write(&regs->gaddr1, 0x0);
		gfar_write(&regs->gaddr2, 0x0);
		gfar_write(&regs->gaddr3, 0x0);
		gfar_write(&regs->gaddr4, 0x0);
		gfar_write(&regs->gaddr5, 0x0);
		gfar_write(&regs->gaddr6, 0x0);
		gfar_write(&regs->gaddr7, 0x0);

3172 3173
		/* If we have extended hash tables, we need to
		 * clear the exact match registers to prepare for
J
Jan Ceuleers 已提交
3174 3175
		 * setting them
		 */
3176 3177 3178 3179 3180 3181 3182 3183 3184
		if (priv->extended_hash) {
			em_num = GFAR_EM_NUM + 1;
			gfar_clear_exact_match(dev);
			idx = 1;
		} else {
			idx = 0;
			em_num = 0;
		}

3185
		if (netdev_mc_empty(dev))
L
Linus Torvalds 已提交
3186 3187 3188
			return;

		/* Parse the list, and set the appropriate bits */
3189
		netdev_for_each_mc_addr(ha, dev) {
3190
			if (idx < em_num) {
3191
				gfar_set_mac_for_addr(dev, idx, ha->addr);
3192 3193
				idx++;
			} else
3194
				gfar_set_hash_for_addr(dev, ha->addr);
L
Linus Torvalds 已提交
3195 3196 3197 3198
		}
	}
}

3199 3200

/* Clears each of the exact match registers to zero, so they
J
Jan Ceuleers 已提交
3201 3202
 * don't interfere with normal reception
 */
3203 3204 3205
static void gfar_clear_exact_match(struct net_device *dev)
{
	int idx;
3206
	static const u8 zero_arr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
3207

3208
	for (idx = 1; idx < GFAR_EM_NUM + 1; idx++)
J
Joe Perches 已提交
3209
		gfar_set_mac_for_addr(dev, idx, zero_arr);
3210 3211
}

L
Linus Torvalds 已提交
3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223
/* Set the appropriate hash bit for the given addr */
/* The algorithm works like so:
 * 1) Take the Destination Address (ie the multicast address), and
 * do a CRC on it (little endian), and reverse the bits of the
 * result.
 * 2) Use the 8 most significant bits as a hash into a 256-entry
 * table.  The table is controlled through 8 32-bit registers:
 * gaddr0-7.  gaddr0's MSB is entry 0, and gaddr7's LSB is
 * gaddr7.  This means that the 3 most significant bits in the
 * hash index which gaddr register to use, and the 5 other bits
 * indicate which bit (assuming an IBM numbering scheme, which
 * for PowerPC (tm) is usually the case) in the register holds
J
Jan Ceuleers 已提交
3224 3225
 * the entry.
 */
L
Linus Torvalds 已提交
3226 3227 3228 3229
static void gfar_set_hash_for_addr(struct net_device *dev, u8 *addr)
{
	u32 tempval;
	struct gfar_private *priv = netdev_priv(dev);
3230
	u32 result = ether_crc(ETH_ALEN, addr);
3231 3232 3233
	int width = priv->hash_width;
	u8 whichbit = (result >> (32 - width)) & 0x1f;
	u8 whichreg = result >> (32 - width + 5);
L
Linus Torvalds 已提交
3234 3235
	u32 value = (1 << (31-whichbit));

3236
	tempval = gfar_read(priv->hash_regs[whichreg]);
L
Linus Torvalds 已提交
3237
	tempval |= value;
3238
	gfar_write(priv->hash_regs[whichreg], tempval);
L
Linus Torvalds 已提交
3239 3240
}

3241 3242 3243 3244

/* There are multiple MAC Address register pairs on some controllers
 * This function sets the numth pair to a given address
 */
J
Joe Perches 已提交
3245 3246
static void gfar_set_mac_for_addr(struct net_device *dev, int num,
				  const u8 *addr)
3247 3248
{
	struct gfar_private *priv = netdev_priv(dev);
3249
	struct gfar __iomem *regs = priv->gfargrp[0].regs;
3250
	int idx;
3251
	char tmpbuf[ETH_ALEN];
3252
	u32 tempval;
3253
	u32 __iomem *macptr = &regs->macstnaddr1;
3254 3255 3256

	macptr += num*2;

J
Jan Ceuleers 已提交
3257 3258 3259
	/* Now copy it into the mac registers backwards, cuz
	 * little endian is silly
	 */
3260 3261
	for (idx = 0; idx < ETH_ALEN; idx++)
		tmpbuf[ETH_ALEN - 1 - idx] = addr[idx];
3262 3263 3264 3265 3266 3267 3268 3269

	gfar_write(macptr, *((u32 *) (tmpbuf)));

	tempval = *((u32 *) (tmpbuf + 4));

	gfar_write(macptr+1, tempval);
}

L
Linus Torvalds 已提交
3270
/* GFAR error interrupt handler */
3271
static irqreturn_t gfar_error(int irq, void *grp_id)
L
Linus Torvalds 已提交
3272
{
3273 3274 3275 3276
	struct gfar_priv_grp *gfargrp = grp_id;
	struct gfar __iomem *regs = gfargrp->regs;
	struct gfar_private *priv= gfargrp->priv;
	struct net_device *dev = priv->ndev;
L
Linus Torvalds 已提交
3277 3278

	/* Save ievent for future reference */
3279
	u32 events = gfar_read(&regs->ievent);
L
Linus Torvalds 已提交
3280 3281

	/* Clear IEVENT */
3282
	gfar_write(&regs->ievent, events & IEVENT_ERR_MASK);
3283 3284

	/* Magic Packet is not an error. */
3285
	if ((priv->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET) &&
3286 3287
	    (events & IEVENT_MAG))
		events &= ~IEVENT_MAG;
L
Linus Torvalds 已提交
3288 3289

	/* Hmm... */
3290
	if (netif_msg_rx_err(priv) || netif_msg_tx_err(priv))
3291 3292
		netdev_dbg(dev,
			   "error interrupt (ievent=0x%08x imask=0x%08x)\n",
3293
			   events, gfar_read(&regs->imask));
L
Linus Torvalds 已提交
3294 3295 3296

	/* Update the error counters */
	if (events & IEVENT_TXE) {
3297
		dev->stats.tx_errors++;
L
Linus Torvalds 已提交
3298 3299

		if (events & IEVENT_LC)
3300
			dev->stats.tx_window_errors++;
L
Linus Torvalds 已提交
3301
		if (events & IEVENT_CRL)
3302
			dev->stats.tx_aborted_errors++;
L
Linus Torvalds 已提交
3303
		if (events & IEVENT_XFUN) {
3304 3305
			unsigned long flags;

3306 3307
			netif_dbg(priv, tx_err, dev,
				  "TX FIFO underrun, packet dropped\n");
3308
			dev->stats.tx_dropped++;
3309
			atomic64_inc(&priv->extra_stats.tx_underrun);
L
Linus Torvalds 已提交
3310

3311 3312 3313
			local_irq_save(flags);
			lock_tx_qs(priv);

L
Linus Torvalds 已提交
3314
			/* Reactivate the Tx Queues */
3315
			gfar_write(&regs->tstat, gfargrp->tstat);
3316 3317 3318

			unlock_tx_qs(priv);
			local_irq_restore(flags);
L
Linus Torvalds 已提交
3319
		}
3320
		netif_dbg(priv, tx_err, dev, "Transmit Error\n");
L
Linus Torvalds 已提交
3321 3322
	}
	if (events & IEVENT_BSY) {
3323
		dev->stats.rx_errors++;
3324
		atomic64_inc(&priv->extra_stats.rx_bsy);
L
Linus Torvalds 已提交
3325

3326
		gfar_receive(irq, grp_id);
L
Linus Torvalds 已提交
3327

3328 3329
		netif_dbg(priv, rx_err, dev, "busy error (rstat: %x)\n",
			  gfar_read(&regs->rstat));
L
Linus Torvalds 已提交
3330 3331
	}
	if (events & IEVENT_BABR) {
3332
		dev->stats.rx_errors++;
3333
		atomic64_inc(&priv->extra_stats.rx_babr);
L
Linus Torvalds 已提交
3334

3335
		netif_dbg(priv, rx_err, dev, "babbling RX error\n");
L
Linus Torvalds 已提交
3336 3337
	}
	if (events & IEVENT_EBERR) {
3338
		atomic64_inc(&priv->extra_stats.eberr);
3339
		netif_dbg(priv, rx_err, dev, "bus error\n");
L
Linus Torvalds 已提交
3340
	}
3341 3342
	if (events & IEVENT_RXC)
		netif_dbg(priv, rx_status, dev, "control frame\n");
L
Linus Torvalds 已提交
3343 3344

	if (events & IEVENT_BABT) {
3345
		atomic64_inc(&priv->extra_stats.tx_babt);
3346
		netif_dbg(priv, tx_err, dev, "babbling TX error\n");
L
Linus Torvalds 已提交
3347 3348 3349 3350
	}
	return IRQ_HANDLED;
}

3351 3352 3353 3354 3355 3356
static struct of_device_id gfar_match[] =
{
	{
		.type = "network",
		.compatible = "gianfar",
	},
3357 3358 3359
	{
		.compatible = "fsl,etsec2",
	},
3360 3361
	{},
};
3362
MODULE_DEVICE_TABLE(of, gfar_match);
3363

L
Linus Torvalds 已提交
3364
/* Structure for a device driver */
3365
static struct platform_driver gfar_driver = {
3366 3367 3368 3369 3370 3371
	.driver = {
		.name = "fsl-gianfar",
		.owner = THIS_MODULE,
		.pm = GFAR_PM_OPS,
		.of_match_table = gfar_match,
	},
L
Linus Torvalds 已提交
3372 3373 3374 3375
	.probe = gfar_probe,
	.remove = gfar_remove,
};

3376
module_platform_driver(gfar_driver);