fs_enet-main.c 25.7 KB
Newer Older
1 2 3
/*
 * Combined Ethernet driver for Motorola MPC8xx and MPC82xx.
 *
V
Vitaly Bordug 已提交
4
 * Copyright (c) 2003 Intracom S.A.
5
 *  by Pantelis Antoniou <panto@intracom.gr>
V
Vitaly Bordug 已提交
6 7
 *
 * 2005 (c) MontaVista Software, Inc.
8 9 10 11 12
 * Vitaly Bordug <vbordug@ru.mvista.com>
 *
 * Heavily based on original FEC driver by Dan Malek <dan@embeddededge.com>
 * and modifications by Joakim Tjernlund <joakim.tjernlund@lumentis.se>
 *
V
Vitaly Bordug 已提交
13 14
 * This file is licensed under the terms of the GNU General Public License
 * version 2. This program is licensed "as is" without any warranty of any
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
 * kind, whether express or implied.
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/ptrace.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/spinlock.h>
#include <linux/mii.h>
#include <linux/ethtool.h>
#include <linux/bitops.h>
#include <linux/fs.h>
M
Marcelo Tosatti 已提交
36
#include <linux/platform_device.h>
37
#include <linux/phy.h>
38 39
#include <linux/of.h>
#include <linux/of_mdio.h>
40
#include <linux/of_platform.h>
41
#include <linux/of_gpio.h>
42
#include <linux/of_net.h>
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

#include <linux/vmalloc.h>
#include <asm/pgtable.h>
#include <asm/irq.h>
#include <asm/uaccess.h>

#include "fs_enet.h"

/*************************************************/

MODULE_AUTHOR("Pantelis Antoniou <panto@intracom.gr>");
MODULE_DESCRIPTION("Freescale Ethernet Driver");
MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_MODULE_VERSION);

S
Scott Wood 已提交
58
static int fs_enet_debug = -1; /* -1 == use FS_ENET_DEF_MSG_ENABLE as value */
R
Rusty Russell 已提交
59
module_param(fs_enet_debug, int, 0);
60 61 62
MODULE_PARM_DESC(fs_enet_debug,
		 "Freescale bitmapped debugging message enable value");

63 64 65
#define RX_RING_SIZE	32
#define TX_RING_SIZE	64

V
Vitaly Bordug 已提交
66 67 68
#ifdef CONFIG_NET_POLL_CONTROLLER
static void fs_enet_netpoll(struct net_device *dev);
#endif
69 70 71 72 73 74 75 76

static void fs_set_multicast_list(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);

	(*fep->ops->set_multicast_list)(dev);
}

S
Scott Wood 已提交
77 78 79 80 81 82 83 84
static void skb_align(struct sk_buff *skb, int align)
{
	int off = ((unsigned long)skb->data) & (align - 1);

	if (off)
		skb_reserve(skb, align - off);
}

85 86
/* NAPI function */
static int fs_enet_napi(struct napi_struct *napi, int budget)
87
{
88
	struct fs_enet_private *fep = container_of(napi, struct fs_enet_private, napi);
S
Scott Wood 已提交
89
	struct net_device *dev = fep->ndev;
90
	const struct fs_platform_info *fpi = fep->fpi;
S
Scott Wood 已提交
91
	cbd_t __iomem *bdp;
92
	struct sk_buff *skb, *skbn;
93 94 95
	int received = 0;
	u16 pkt_len, sc;
	int curidx;
96 97
	int dirtyidx, do_wake, do_restart;
	int tx_left = TX_RING_SIZE;
98

99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
	spin_lock(&fep->tx_lock);
	bdp = fep->dirty_tx;

	/* clear status bits for napi*/
	(*fep->ops->napi_clear_event)(dev);

	do_wake = do_restart = 0;
	while (((sc = CBDR_SC(bdp)) & BD_ENET_TX_READY) == 0 && tx_left) {
		dirtyidx = bdp - fep->tx_bd_base;

		if (fep->tx_free == fep->tx_ring)
			break;

		skb = fep->tx_skbuff[dirtyidx];

		/*
		 * Check for errors.
		 */
		if (sc & (BD_ENET_TX_HB | BD_ENET_TX_LC |
			  BD_ENET_TX_RL | BD_ENET_TX_UN | BD_ENET_TX_CSL)) {

			if (sc & BD_ENET_TX_HB)	/* No heartbeat */
				fep->stats.tx_heartbeat_errors++;
			if (sc & BD_ENET_TX_LC)	/* Late collision */
				fep->stats.tx_window_errors++;
			if (sc & BD_ENET_TX_RL)	/* Retrans limit */
				fep->stats.tx_aborted_errors++;
			if (sc & BD_ENET_TX_UN)	/* Underrun */
				fep->stats.tx_fifo_errors++;
			if (sc & BD_ENET_TX_CSL)	/* Carrier lost */
				fep->stats.tx_carrier_errors++;

			if (sc & (BD_ENET_TX_LC | BD_ENET_TX_RL | BD_ENET_TX_UN)) {
				fep->stats.tx_errors++;
				do_restart = 1;
			}
		} else
			fep->stats.tx_packets++;

		if (sc & BD_ENET_TX_READY) {
			dev_warn(fep->dev,
				 "HEY! Enet xmit interrupt and TX_READY.\n");
		}

		/*
		 * Deferred means some collisions occurred during transmit,
		 * but we eventually sent the packet OK.
		 */
		if (sc & BD_ENET_TX_DEF)
			fep->stats.collisions++;

		/* unmap */
		if (fep->mapped_as_page[dirtyidx])
			dma_unmap_page(fep->dev, CBDR_BUFADDR(bdp),
				       CBDR_DATLEN(bdp), DMA_TO_DEVICE);
		else
			dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
					 CBDR_DATLEN(bdp), DMA_TO_DEVICE);

		/*
		 * Free the sk buffer associated with this last transmit.
		 */
		if (skb) {
			dev_kfree_skb(skb);
			fep->tx_skbuff[dirtyidx] = NULL;
		}

		/*
		 * Update pointer to next buffer descriptor to be transmitted.
		 */
		if ((sc & BD_ENET_TX_WRAP) == 0)
			bdp++;
		else
			bdp = fep->tx_bd_base;

		/*
		 * Since we have freed up a buffer, the ring is no longer
		 * full.
		 */
		if (++fep->tx_free == MAX_SKB_FRAGS)
			do_wake = 1;
		tx_left--;
	}

	fep->dirty_tx = bdp;

	if (do_restart)
		(*fep->ops->tx_restart)(dev);

	spin_unlock(&fep->tx_lock);

	if (do_wake)
		netif_wake_queue(dev);
192

193 194 195 196 197 198
	/*
	 * First, grab all of the stats for the incoming packet.
	 * These get messed up if we get called due to a busy condition.
	 */
	bdp = fep->cur_rx;

199 200
	while (((sc = CBDR_SC(bdp)) & BD_ENET_RX_EMPTY) == 0 &&
	       received < budget) {
201 202 203 204 205 206 207
		curidx = bdp - fep->rx_bd_base;

		/*
		 * Since we have allocated space to hold a complete frame,
		 * the last indicator should be set.
		 */
		if ((sc & BD_ENET_RX_LAST) == 0)
208
			dev_warn(fep->dev, "rcv is not +last\n");
209 210

		/*
V
Vitaly Bordug 已提交
211
		 * Check for errors.
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
		 */
		if (sc & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_CL |
			  BD_ENET_RX_NO | BD_ENET_RX_CR | BD_ENET_RX_OV)) {
			fep->stats.rx_errors++;
			/* Frame too long or too short. */
			if (sc & (BD_ENET_RX_LG | BD_ENET_RX_SH))
				fep->stats.rx_length_errors++;
			/* Frame alignment */
			if (sc & (BD_ENET_RX_NO | BD_ENET_RX_CL))
				fep->stats.rx_frame_errors++;
			/* CRC Error */
			if (sc & BD_ENET_RX_CR)
				fep->stats.rx_crc_errors++;
			/* FIFO overrun */
			if (sc & BD_ENET_RX_OV)
				fep->stats.rx_crc_errors++;

229
			skbn = fep->rx_skbuff[curidx];
230 231 232 233 234 235 236 237 238 239 240 241
		} else {
			skb = fep->rx_skbuff[curidx];

			/*
			 * Process the incoming frame.
			 */
			fep->stats.rx_packets++;
			pkt_len = CBDR_DATLEN(bdp) - 4;	/* remove CRC */
			fep->stats.rx_bytes += pkt_len + 4;

			if (pkt_len <= fpi->rx_copybreak) {
				/* +2 to make IP header L1 cache aligned */
242
				skbn = netdev_alloc_skb(dev, pkt_len + 2);
243 244
				if (skbn != NULL) {
					skb_reserve(skbn, 2);	/* align IP header */
245 246
					skb_copy_from_linear_data(skb,
						      skbn->data, pkt_len);
247
					swap(skb, skbn);
248 249 250 251
					dma_sync_single_for_cpu(fep->dev,
						CBDR_BUFADDR(bdp),
						L1_CACHE_ALIGN(pkt_len),
						DMA_FROM_DEVICE);
252
				}
S
Scott Wood 已提交
253
			} else {
254
				skbn = netdev_alloc_skb(dev, ENET_RX_FRSIZE);
255

256 257 258
				if (skbn) {
					dma_addr_t dma;

S
Scott Wood 已提交
259
					skb_align(skbn, ENET_RX_ALIGN);
260 261 262 263 264 265 266 267 268 269 270 271

					dma_unmap_single(fep->dev,
						CBDR_BUFADDR(bdp),
						L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
						DMA_FROM_DEVICE);

					dma = dma_map_single(fep->dev,
						skbn->data,
						L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
						DMA_FROM_DEVICE);
					CBDW_BUFADDR(bdp, dma);
				}
S
Scott Wood 已提交
272 273
			}

274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
			if (skbn != NULL) {
				skb_put(skb, pkt_len);	/* Make room */
				skb->protocol = eth_type_trans(skb, dev);
				received++;
				netif_receive_skb(skb);
			} else {
				fep->stats.rx_dropped++;
				skbn = skb;
			}
		}

		fep->rx_skbuff[curidx] = skbn;
		CBDW_DATLEN(bdp, 0);
		CBDW_SC(bdp, (sc & ~BD_ENET_RX_STATS) | BD_ENET_RX_EMPTY);

		/*
V
Vitaly Bordug 已提交
290
		 * Update BD pointer to next entry.
291 292 293 294 295 296 297 298 299 300 301
		 */
		if ((sc & BD_ENET_RX_WRAP) == 0)
			bdp++;
		else
			bdp = fep->rx_bd_base;

		(*fep->ops->rx_bd_done)(dev);
	}

	fep->cur_rx = bdp;

302
	if (received < budget && tx_left) {
303
		/* done */
304
		napi_complete(napi);
305
		(*fep->ops->napi_enable)(dev);
306

307
		return received;
L
LEROY Christophe 已提交
308 309
	}

310
	return budget;
311 312 313 314 315 316 317
}

/*
 * The interrupt handler.
 * This is called from the MPC core interrupt.
 */
static irqreturn_t
318
fs_enet_interrupt(int irq, void *dev_id)
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
{
	struct net_device *dev = dev_id;
	struct fs_enet_private *fep;
	const struct fs_platform_info *fpi;
	u32 int_events;
	u32 int_clr_events;
	int nr, napi_ok;
	int handled;

	fep = netdev_priv(dev);
	fpi = fep->fpi;

	nr = 0;
	while ((int_events = (*fep->ops->get_int_events)(dev)) != 0) {
		nr++;

		int_clr_events = int_events;
336
		int_clr_events &= ~fep->ev_napi;
337 338 339 340 341 342

		(*fep->ops->clear_int_events)(dev, int_clr_events);

		if (int_events & fep->ev_err)
			(*fep->ops->ev_error)(dev, int_events);

343
		if (int_events & fep->ev) {
344 345
			napi_ok = napi_schedule_prep(&fep->napi);

346 347
			(*fep->ops->napi_disable)(dev);
			(*fep->ops->clear_int_events)(dev, fep->ev_napi);
348 349 350 351 352

			/* NOTE: it is possible for FCCs in NAPI mode    */
			/* to submit a spurious interrupt while in poll  */
			if (napi_ok)
				__napi_schedule(&fep->napi);
353 354 355 356 357 358 359 360 361 362 363
		}

	}

	handled = nr > 0;
	return IRQ_RETVAL(handled);
}

void fs_init_bds(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
S
Scott Wood 已提交
364
	cbd_t __iomem *bdp;
365 366 367 368 369 370 371 372 373 374
	struct sk_buff *skb;
	int i;

	fs_cleanup_bds(dev);

	fep->dirty_tx = fep->cur_tx = fep->tx_bd_base;
	fep->tx_free = fep->tx_ring;
	fep->cur_rx = fep->rx_bd_base;

	/*
V
Vitaly Bordug 已提交
375
	 * Initialize the receive buffer descriptors.
376 377
	 */
	for (i = 0, bdp = fep->rx_bd_base; i < fep->rx_ring; i++, bdp++) {
378
		skb = netdev_alloc_skb(dev, ENET_RX_FRSIZE);
379
		if (skb == NULL)
380
			break;
381

S
Scott Wood 已提交
382
		skb_align(skb, ENET_RX_ALIGN);
383 384 385 386 387 388 389 390 391 392
		fep->rx_skbuff[i] = skb;
		CBDW_BUFADDR(bdp,
			dma_map_single(fep->dev, skb->data,
				L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
				DMA_FROM_DEVICE));
		CBDW_DATLEN(bdp, 0);	/* zero */
		CBDW_SC(bdp, BD_ENET_RX_EMPTY |
			((i < fep->rx_ring - 1) ? 0 : BD_SC_WRAP));
	}
	/*
V
Vitaly Bordug 已提交
393
	 * if we failed, fillup remainder
394 395 396 397 398 399 400
	 */
	for (; i < fep->rx_ring; i++, bdp++) {
		fep->rx_skbuff[i] = NULL;
		CBDW_SC(bdp, (i < fep->rx_ring - 1) ? 0 : BD_SC_WRAP);
	}

	/*
V
Vitaly Bordug 已提交
401
	 * ...and the same for transmit.
402 403 404 405 406 407 408 409 410 411 412 413 414
	 */
	for (i = 0, bdp = fep->tx_bd_base; i < fep->tx_ring; i++, bdp++) {
		fep->tx_skbuff[i] = NULL;
		CBDW_BUFADDR(bdp, 0);
		CBDW_DATLEN(bdp, 0);
		CBDW_SC(bdp, (i < fep->tx_ring - 1) ? 0 : BD_SC_WRAP);
	}
}

void fs_cleanup_bds(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	struct sk_buff *skb;
S
Scott Wood 已提交
415
	cbd_t __iomem *bdp;
416 417 418
	int i;

	/*
V
Vitaly Bordug 已提交
419
	 * Reset SKB transmit buffers.
420
	 */
421
	for (i = 0, bdp = fep->tx_bd_base; i < fep->tx_ring; i++, bdp++) {
422 423 424 425
		if ((skb = fep->tx_skbuff[i]) == NULL)
			continue;

		/* unmap */
426 427
		dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
				skb->len, DMA_TO_DEVICE);
428 429 430 431 432 433

		fep->tx_skbuff[i] = NULL;
		dev_kfree_skb(skb);
	}

	/*
V
Vitaly Bordug 已提交
434
	 * Reset SKB receive buffers
435
	 */
436
	for (i = 0, bdp = fep->rx_bd_base; i < fep->rx_ring; i++, bdp++) {
437 438 439 440
		if ((skb = fep->rx_skbuff[i]) == NULL)
			continue;

		/* unmap */
441
		dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
442 443 444 445 446 447 448 449 450 451 452
			L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
			DMA_FROM_DEVICE);

		fep->rx_skbuff[i] = NULL;

		dev_kfree_skb(skb);
	}
}

/**********************************************************************************/

453 454 455 456 457 458 459 460 461
#ifdef CONFIG_FS_ENET_MPC5121_FEC
/*
 * MPC5121 FEC requeries 4-byte alignment for TX data buffer!
 */
static struct sk_buff *tx_skb_align_workaround(struct net_device *dev,
					       struct sk_buff *skb)
{
	struct sk_buff *new_skb;

462 463 464
	if (skb_linearize(skb))
		return NULL;

465
	/* Alloc new skb */
466
	new_skb = netdev_alloc_skb(dev, skb->len + 4);
467
	if (!new_skb)
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
		return NULL;

	/* Make sure new skb is properly aligned */
	skb_align(new_skb, 4);

	/* Copy data to new skb ... */
	skb_copy_from_linear_data(skb, new_skb->data, skb->len);
	skb_put(new_skb, skb->len);

	/* ... and free an old one */
	dev_kfree_skb_any(skb);

	return new_skb;
}
#endif

484 485 486
static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
S
Scott Wood 已提交
487
	cbd_t __iomem *bdp;
488 489
	int curidx;
	u16 sc;
490
	int nr_frags;
491 492
	skb_frag_t *frag;
	int len;
493
#ifdef CONFIG_FS_ENET_MPC5121_FEC
494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
	int is_aligned = 1;
	int i;

	if (!IS_ALIGNED((unsigned long)skb->data, 4)) {
		is_aligned = 0;
	} else {
		nr_frags = skb_shinfo(skb)->nr_frags;
		frag = skb_shinfo(skb)->frags;
		for (i = 0; i < nr_frags; i++, frag++) {
			if (!IS_ALIGNED(frag->page_offset, 4)) {
				is_aligned = 0;
				break;
			}
		}
	}

	if (!is_aligned) {
511 512 513 514 515 516 517 518 519 520 521
		skb = tx_skb_align_workaround(dev, skb);
		if (!skb) {
			/*
			 * We have lost packet due to memory allocation error
			 * in tx_skb_align_workaround(). Hopefully original
			 * skb is still valid, so try transmit it later.
			 */
			return NETDEV_TX_BUSY;
		}
	}
#endif
522

L
LEROY Christophe 已提交
523
	spin_lock(&fep->tx_lock);
524 525

	/*
V
Vitaly Bordug 已提交
526
	 * Fill in a Tx ring entry
527 528 529
	 */
	bdp = fep->cur_tx;

530
	nr_frags = skb_shinfo(skb)->nr_frags;
531
	if (fep->tx_free <= nr_frags || (CBDR_SC(bdp) & BD_ENET_TX_READY)) {
532
		netif_stop_queue(dev);
L
LEROY Christophe 已提交
533
		spin_unlock(&fep->tx_lock);
534 535 536 537 538

		/*
		 * Ooops.  All transmit buffers are full.  Bail out.
		 * This should not happen, since the tx queue should be stopped.
		 */
539
		dev_warn(fep->dev, "tx queue full!.\n");
540 541 542 543 544
		return NETDEV_TX_BUSY;
	}

	curidx = bdp - fep->tx_bd_base;

545 546 547 548 549
	len = skb->len;
	fep->stats.tx_bytes += len;
	if (nr_frags)
		len -= skb->data_len;
	fep->tx_free -= nr_frags + 1;
550
	/*
V
Vitaly Bordug 已提交
551
	 * Push the data cache so the CPM does not get stale memory data.
552 553
	 */
	CBDW_BUFADDR(bdp, dma_map_single(fep->dev,
554 555 556 557 558 559 560
				skb->data, len, DMA_TO_DEVICE));
	CBDW_DATLEN(bdp, len);

	fep->mapped_as_page[curidx] = 0;
	frag = skb_shinfo(skb)->frags;
	while (nr_frags) {
		CBDC_SC(bdp,
561 562
			BD_ENET_TX_STATS | BD_ENET_TX_INTR | BD_ENET_TX_LAST |
			BD_ENET_TX_TC);
563 564 565 566 567 568
		CBDS_SC(bdp, BD_ENET_TX_READY);

		if ((CBDR_SC(bdp) & BD_ENET_TX_WRAP) == 0)
			bdp++, curidx++;
		else
			bdp = fep->tx_bd_base, curidx = 0;
569

570 571 572 573
		len = skb_frag_size(frag);
		CBDW_BUFADDR(bdp, skb_frag_dma_map(fep->dev, frag, 0, len,
						   DMA_TO_DEVICE));
		CBDW_DATLEN(bdp, len);
574

575 576 577 578 579 580
		fep->tx_skbuff[curidx] = NULL;
		fep->mapped_as_page[curidx] = 1;

		frag++;
		nr_frags--;
	}
581 582 583 584 585 586 587 588 589 590

	/* Trigger transmission start */
	sc = BD_ENET_TX_READY | BD_ENET_TX_INTR |
	     BD_ENET_TX_LAST | BD_ENET_TX_TC;

	/* note that while FEC does not have this bit
	 * it marks it as available for software use
	 * yay for hw reuse :) */
	if (skb->len <= 60)
		sc |= BD_ENET_TX_PAD;
591
	CBDC_SC(bdp, BD_ENET_TX_STATS);
592 593
	CBDS_SC(bdp, sc);

594 595 596 597 598 599 600 601 602 603 604 605 606
	/* Save skb pointer. */
	fep->tx_skbuff[curidx] = skb;

	/* If this was the last BD in the ring, start at the beginning again. */
	if ((CBDR_SC(bdp) & BD_ENET_TX_WRAP) == 0)
		bdp++;
	else
		bdp = fep->tx_bd_base;
	fep->cur_tx = bdp;

	if (fep->tx_free < MAX_SKB_FRAGS)
		netif_stop_queue(dev);

607 608
	skb_tx_timestamp(skb);

609 610
	(*fep->ops->tx_kickstart)(dev);

L
LEROY Christophe 已提交
611
	spin_unlock(&fep->tx_lock);
612 613 614 615 616 617 618 619 620 621 622 623 624 625 626

	return NETDEV_TX_OK;
}

static void fs_timeout(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	unsigned long flags;
	int wake = 0;

	fep->stats.tx_errors++;

	spin_lock_irqsave(&fep->lock, flags);

	if (dev->flags & IFF_UP) {
627
		phy_stop(dev->phydev);
628 629
		(*fep->ops->stop)(dev);
		(*fep->ops->restart)(dev);
630
		phy_start(dev->phydev);
631 632
	}

633
	phy_start(dev->phydev);
634 635
	wake = fep->tx_free >= MAX_SKB_FRAGS &&
	       !(CBDR_SC(fep->cur_tx) & BD_ENET_TX_READY);
636 637 638 639 640 641
	spin_unlock_irqrestore(&fep->lock, flags);

	if (wake)
		netif_wake_queue(dev);
}

642 643 644 645 646
/*-----------------------------------------------------------------------------
 *  generic link-change handler - should be sufficient for most cases
 *-----------------------------------------------------------------------------*/
static void generic_adjust_link(struct  net_device *dev)
{
S
Scott Wood 已提交
647
	struct fs_enet_private *fep = netdev_priv(dev);
648
	struct phy_device *phydev = dev->phydev;
S
Scott Wood 已提交
649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678
	int new_state = 0;

	if (phydev->link) {
		/* adjust to duplex mode */
		if (phydev->duplex != fep->oldduplex) {
			new_state = 1;
			fep->oldduplex = phydev->duplex;
		}

		if (phydev->speed != fep->oldspeed) {
			new_state = 1;
			fep->oldspeed = phydev->speed;
		}

		if (!fep->oldlink) {
			new_state = 1;
			fep->oldlink = 1;
		}

		if (new_state)
			fep->ops->restart(dev);
	} else if (fep->oldlink) {
		new_state = 1;
		fep->oldlink = 0;
		fep->oldspeed = 0;
		fep->oldduplex = -1;
	}

	if (new_state && netif_msg_link(fep))
		phy_print_status(phydev);
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700
}


static void fs_adjust_link(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	unsigned long flags;

	spin_lock_irqsave(&fep->lock, flags);

	if(fep->ops->adjust_link)
		fep->ops->adjust_link(dev);
	else
		generic_adjust_link(dev);

	spin_unlock_irqrestore(&fep->lock, flags);
}

static int fs_init_phy(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	struct phy_device *phydev;
701
	phy_interface_t iface;
702 703 704 705

	fep->oldlink = 0;
	fep->oldspeed = 0;
	fep->oldduplex = -1;
706

707 708 709
	iface = fep->fpi->use_rmii ?
		PHY_INTERFACE_MODE_RMII : PHY_INTERFACE_MODE_MII;

710
	phydev = of_phy_connect(dev, fep->fpi->phy_node, &fs_adjust_link, 0,
711
				iface);
712 713 714
	if (!phydev) {
		dev_err(&dev->dev, "Could not attach to PHY\n");
		return -ENODEV;
715 716 717 718 719
	}

	return 0;
}

720 721 722 723
static int fs_enet_open(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	int r;
724
	int err;
725

726
	/* to initialize the fep->cur_rx,... */
727
	/* not doing this, will cause a crash in fs_enet_napi */
728 729
	fs_init_bds(fep->ndev);

730
	napi_enable(&fep->napi);
731

732
	/* Install our interrupt handler. */
733 734
	r = request_irq(fep->interrupt, fs_enet_interrupt, IRQF_SHARED,
			"fs_enet-mac", dev);
735
	if (r != 0) {
736
		dev_err(fep->dev, "Could not allocate FS_ENET IRQ!");
737
		napi_disable(&fep->napi);
738 739 740
		return -EINVAL;
	}

741
	err = fs_init_phy(dev);
S
Scott Wood 已提交
742
	if (err) {
743
		free_irq(fep->interrupt, dev);
744
		napi_disable(&fep->napi);
745
		return err;
746
	}
747
	phy_start(dev->phydev);
748

749 750
	netif_start_queue(dev);

751 752 753 754 755 756 757 758 759 760
	return 0;
}

static int fs_enet_close(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	unsigned long flags;

	netif_stop_queue(dev);
	netif_carrier_off(dev);
761
	napi_disable(&fep->napi);
762
	phy_stop(dev->phydev);
763 764

	spin_lock_irqsave(&fep->lock, flags);
765
	spin_lock(&fep->tx_lock);
766
	(*fep->ops->stop)(dev);
767
	spin_unlock(&fep->tx_lock);
768 769 770
	spin_unlock_irqrestore(&fep->lock, flags);

	/* release any irqs */
771
	phy_disconnect(dev->phydev);
772
	free_irq(fep->interrupt, dev);
773 774 775 776 777 778 779 780 781 782 783 784 785 786 787

	return 0;
}

static struct net_device_stats *fs_enet_get_stats(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	return &fep->stats;
}

/*************************************************************************/

static void fs_get_drvinfo(struct net_device *dev,
			    struct ethtool_drvinfo *info)
{
788 789
	strlcpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver));
	strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version));
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
}

static int fs_get_regs_len(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);

	return (*fep->ops->get_regs_len)(dev);
}

static void fs_get_regs(struct net_device *dev, struct ethtool_regs *regs,
			 void *p)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	unsigned long flags;
	int r, len;

	len = regs->len;

	spin_lock_irqsave(&fep->lock, flags);
	r = (*fep->ops->get_regs)(dev, p, &len);
	spin_unlock_irqrestore(&fep->lock, flags);

	if (r == 0)
		regs->version = 0;
}

static int fs_nway_reset(struct net_device *dev)
{
818
	return 0;
819 820 821 822 823 824 825 826 827 828 829 830 831 832
}

static u32 fs_get_msglevel(struct net_device *dev)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	return fep->msg_enable;
}

static void fs_set_msglevel(struct net_device *dev, u32 value)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	fep->msg_enable = value;
}

833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870
static int fs_get_tunable(struct net_device *dev,
			  const struct ethtool_tunable *tuna, void *data)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	struct fs_platform_info *fpi = fep->fpi;
	int ret = 0;

	switch (tuna->id) {
	case ETHTOOL_RX_COPYBREAK:
		*(u32 *)data = fpi->rx_copybreak;
		break;
	default:
		ret = -EINVAL;
		break;
	}

	return ret;
}

static int fs_set_tunable(struct net_device *dev,
			  const struct ethtool_tunable *tuna, const void *data)
{
	struct fs_enet_private *fep = netdev_priv(dev);
	struct fs_platform_info *fpi = fep->fpi;
	int ret = 0;

	switch (tuna->id) {
	case ETHTOOL_RX_COPYBREAK:
		fpi->rx_copybreak = *(u32 *)data;
		break;
	default:
		ret = -EINVAL;
		break;
	}

	return ret;
}

871
static const struct ethtool_ops fs_ethtool_ops = {
872 873 874 875 876 877 878
	.get_drvinfo = fs_get_drvinfo,
	.get_regs_len = fs_get_regs_len,
	.nway_reset = fs_nway_reset,
	.get_link = ethtool_op_get_link,
	.get_msglevel = fs_get_msglevel,
	.set_msglevel = fs_set_msglevel,
	.get_regs = fs_get_regs,
879
	.get_ts_info = ethtool_op_get_ts_info,
880 881
	.get_link_ksettings = phy_ethtool_get_link_ksettings,
	.set_link_ksettings = phy_ethtool_set_link_ksettings,
882 883
	.get_tunable = fs_get_tunable,
	.set_tunable = fs_set_tunable,
884 885 886 887 888 889 890
};

static int fs_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{
	if (!netif_running(dev))
		return -EINVAL;

891
	return phy_mii_ioctl(dev->phydev, rq, cmd);
892 893 894 895 896 897 898
}

extern int fs_mii_connect(struct net_device *dev);
extern void fs_mii_disconnect(struct net_device *dev);

/**************************************************************************************/

899 900 901 902 903 904
#ifdef CONFIG_FS_ENET_HAS_FEC
#define IS_FEC(match) ((match)->data == &fs_fec_ops)
#else
#define IS_FEC(match) 0
#endif

905 906 907 908 909 910
static const struct net_device_ops fs_enet_netdev_ops = {
	.ndo_open		= fs_enet_open,
	.ndo_stop		= fs_enet_close,
	.ndo_get_stats		= fs_enet_get_stats,
	.ndo_start_xmit		= fs_enet_start_xmit,
	.ndo_tx_timeout		= fs_timeout,
911
	.ndo_set_rx_mode	= fs_set_multicast_list,
912 913 914 915 916 917 918 919 920
	.ndo_do_ioctl		= fs_ioctl,
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_set_mac_address	= eth_mac_addr,
	.ndo_change_mtu		= eth_change_mtu,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= fs_enet_netpoll,
#endif
};

921
static const struct of_device_id fs_enet_match[];
B
Bill Pemberton 已提交
922
static int fs_enet_probe(struct platform_device *ofdev)
923
{
924
	const struct of_device_id *match;
925 926 927 928
	struct net_device *ndev;
	struct fs_enet_private *fep;
	struct fs_platform_info *fpi;
	const u32 *data;
G
Gerhard Sittig 已提交
929 930
	struct clk *clk;
	int err;
931
	const u8 *mac_addr;
932
	const char *phy_connection_type;
933 934
	int privsize, len, ret = -ENODEV;

935 936
	match = of_match_device(fs_enet_match, &ofdev->dev);
	if (!match)
937 938
		return -EINVAL;

939 940 941 942
	fpi = kzalloc(sizeof(*fpi), GFP_KERNEL);
	if (!fpi)
		return -ENOMEM;

943
	if (!IS_FEC(match)) {
944
		data = of_get_property(ofdev->dev.of_node, "fsl,cpm-command", &len);
945 946 947 948 949 950
		if (!data || len != 4)
			goto out_free_fpi;

		fpi->cp_command = *data;
	}

951 952
	fpi->rx_ring = RX_RING_SIZE;
	fpi->tx_ring = TX_RING_SIZE;
953 954
	fpi->rx_copybreak = 240;
	fpi->napi_weight = 17;
955
	fpi->phy_node = of_parse_phandle(ofdev->dev.of_node, "phy-handle", 0);
956 957 958 959 960 961 962 963
	if (!fpi->phy_node && of_phy_is_fixed_link(ofdev->dev.of_node)) {
		err = of_phy_register_fixed_link(ofdev->dev.of_node);
		if (err)
			goto out_free_fpi;

		/* In the case of a fixed PHY, the DT node associated
		 * to the PHY is the Ethernet MAC DT node.
		 */
964
		fpi->phy_node = of_node_get(ofdev->dev.of_node);
965
	}
966

967 968 969 970 971 972 973
	if (of_device_is_compatible(ofdev->dev.of_node, "fsl,mpc5125-fec")) {
		phy_connection_type = of_get_property(ofdev->dev.of_node,
						"phy-connection-type", NULL);
		if (phy_connection_type && !strcmp("rmii", phy_connection_type))
			fpi->use_rmii = 1;
	}

G
Gerhard Sittig 已提交
974 975 976 977 978 979 980 981 982 983 984 985 986 987
	/* make clock lookup non-fatal (the driver is shared among platforms),
	 * but require enable to succeed when a clock was specified/found,
	 * keep a reference to the clock upon successful acquisition
	 */
	clk = devm_clk_get(&ofdev->dev, "per");
	if (!IS_ERR(clk)) {
		err = clk_prepare_enable(clk);
		if (err) {
			ret = err;
			goto out_free_fpi;
		}
		fpi->clk_per = clk;
	}

988 989
	privsize = sizeof(*fep) +
	           sizeof(struct sk_buff **) *
990 991
		     (fpi->rx_ring + fpi->tx_ring) +
		   sizeof(char) * fpi->tx_ring;
992 993 994 995

	ndev = alloc_etherdev(privsize);
	if (!ndev) {
		ret = -ENOMEM;
996
		goto out_put;
997 998
	}

999
	SET_NETDEV_DEV(ndev, &ofdev->dev);
1000
	platform_set_drvdata(ofdev, ndev);
1001 1002 1003

	fep = netdev_priv(ndev);
	fep->dev = &ofdev->dev;
S
Scott Wood 已提交
1004
	fep->ndev = ndev;
1005
	fep->fpi = fpi;
1006
	fep->ops = match->data;
1007 1008 1009 1010 1011 1012 1013

	ret = fep->ops->setup_data(ndev);
	if (ret)
		goto out_free_dev;

	fep->rx_skbuff = (struct sk_buff **)&fep[1];
	fep->tx_skbuff = fep->rx_skbuff + fpi->rx_ring;
1014 1015
	fep->mapped_as_page = (char *)(fep->rx_skbuff + fpi->rx_ring +
				       fpi->tx_ring);
1016 1017 1018 1019

	spin_lock_init(&fep->lock);
	spin_lock_init(&fep->tx_lock);

1020
	mac_addr = of_get_mac_address(ofdev->dev.of_node);
1021
	if (mac_addr)
1022
		memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033

	ret = fep->ops->allocate_bd(ndev);
	if (ret)
		goto out_cleanup_data;

	fep->rx_bd_base = fep->ring_base;
	fep->tx_bd_base = fep->rx_bd_base + fpi->rx_ring;

	fep->tx_ring = fpi->tx_ring;
	fep->rx_ring = fpi->rx_ring;

1034
	ndev->netdev_ops = &fs_enet_netdev_ops;
1035
	ndev->watchdog_timeo = 2 * HZ;
1036
	netif_napi_add(ndev, &fep->napi, fs_enet_napi, fpi->napi_weight);
S
Scott Wood 已提交
1037

1038 1039 1040 1041 1042 1043
	ndev->ethtool_ops = &fs_ethtool_ops;

	init_timer(&fep->phy_timer_list);

	netif_carrier_off(ndev);

1044 1045
	ndev->features |= NETIF_F_SG;

1046 1047 1048 1049
	ret = register_netdev(ndev);
	if (ret)
		goto out_free_bd;

1050
	pr_info("%s: fs_enet: %pM\n", ndev->name, ndev->dev_addr);
1051 1052 1053 1054 1055 1056 1057 1058 1059

	return 0;

out_free_bd:
	fep->ops->free_bd(ndev);
out_cleanup_data:
	fep->ops->cleanup_data(ndev);
out_free_dev:
	free_netdev(ndev);
1060
out_put:
1061
	of_node_put(fpi->phy_node);
G
Gerhard Sittig 已提交
1062 1063
	if (fpi->clk_per)
		clk_disable_unprepare(fpi->clk_per);
1064 1065 1066 1067 1068
out_free_fpi:
	kfree(fpi);
	return ret;
}

1069
static int fs_enet_remove(struct platform_device *ofdev)
1070
{
1071
	struct net_device *ndev = platform_get_drvdata(ofdev);
1072 1073 1074 1075 1076 1077 1078
	struct fs_enet_private *fep = netdev_priv(ndev);

	unregister_netdev(ndev);

	fep->ops->free_bd(ndev);
	fep->ops->cleanup_data(ndev);
	dev_set_drvdata(fep->dev, NULL);
1079
	of_node_put(fep->fpi->phy_node);
G
Gerhard Sittig 已提交
1080 1081
	if (fep->fpi->clk_per)
		clk_disable_unprepare(fep->fpi->clk_per);
1082 1083 1084 1085
	free_netdev(ndev);
	return 0;
}

1086
static const struct of_device_id fs_enet_match[] = {
1087 1088 1089 1090 1091
#ifdef CONFIG_FS_ENET_HAS_SCC
	{
		.compatible = "fsl,cpm1-scc-enet",
		.data = (void *)&fs_scc_ops,
	},
1092 1093 1094 1095
	{
		.compatible = "fsl,cpm2-scc-enet",
		.data = (void *)&fs_scc_ops,
	},
1096 1097 1098 1099 1100 1101 1102 1103
#endif
#ifdef CONFIG_FS_ENET_HAS_FCC
	{
		.compatible = "fsl,cpm2-fcc-enet",
		.data = (void *)&fs_fcc_ops,
	},
#endif
#ifdef CONFIG_FS_ENET_HAS_FEC
1104 1105 1106 1107 1108
#ifdef CONFIG_FS_ENET_MPC5121_FEC
	{
		.compatible = "fsl,mpc5121-fec",
		.data = (void *)&fs_fec_ops,
	},
1109 1110 1111 1112
	{
		.compatible = "fsl,mpc5125-fec",
		.data = (void *)&fs_fec_ops,
	},
1113
#else
1114 1115 1116 1117
	{
		.compatible = "fsl,pq1-fec-enet",
		.data = (void *)&fs_fec_ops,
	},
1118
#endif
1119 1120 1121
#endif
	{}
};
1122
MODULE_DEVICE_TABLE(of, fs_enet_match);
1123

1124
static struct platform_driver fs_enet_driver = {
1125 1126 1127 1128
	.driver = {
		.name = "fs_enet",
		.of_match_table = fs_enet_match,
	},
1129 1130 1131 1132
	.probe = fs_enet_probe,
	.remove = fs_enet_remove,
};

V
Vitaly Bordug 已提交
1133 1134 1135 1136
#ifdef CONFIG_NET_POLL_CONTROLLER
static void fs_enet_netpoll(struct net_device *dev)
{
       disable_irq(dev->irq);
A
Alexey Dobriyan 已提交
1137
       fs_enet_interrupt(dev->irq, dev);
V
Vitaly Bordug 已提交
1138 1139 1140 1141
       enable_irq(dev->irq);
}
#endif

1142
module_platform_driver(fs_enet_driver);