cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fec_mpc52xx.c (28377B)


      1/*
      2 * Driver for the MPC5200 Fast Ethernet Controller
      3 *
      4 * Originally written by Dale Farnsworth <dfarnsworth@mvista.com> and
      5 * now maintained by Sylvain Munaut <tnt@246tNt.com>
      6 *
      7 * Copyright (C) 2007  Domen Puncer, Telargo, Inc.
      8 * Copyright (C) 2007  Sylvain Munaut <tnt@246tNt.com>
      9 * Copyright (C) 2003-2004  MontaVista, Software, Inc.
     10 *
     11 * This file is licensed under the terms of the GNU General Public License
     12 * version 2. This program is licensed "as is" without any warranty of any
     13 * kind, whether express or implied.
     14 *
     15 */
     16
     17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     18
     19#include <linux/dma-mapping.h>
     20#include <linux/module.h>
     21
     22#include <linux/kernel.h>
     23#include <linux/types.h>
     24#include <linux/spinlock.h>
     25#include <linux/slab.h>
     26#include <linux/errno.h>
     27#include <linux/init.h>
     28#include <linux/interrupt.h>
     29#include <linux/crc32.h>
     30#include <linux/hardirq.h>
     31#include <linux/delay.h>
     32#include <linux/of_address.h>
     33#include <linux/of_device.h>
     34#include <linux/of_irq.h>
     35#include <linux/of_mdio.h>
     36#include <linux/of_net.h>
     37#include <linux/of_platform.h>
     38
     39#include <linux/netdevice.h>
     40#include <linux/etherdevice.h>
     41#include <linux/ethtool.h>
     42#include <linux/skbuff.h>
     43
     44#include <asm/io.h>
     45#include <asm/delay.h>
     46#include <asm/mpc52xx.h>
     47
     48#include <linux/fsl/bestcomm/bestcomm.h>
     49#include <linux/fsl/bestcomm/fec.h>
     50
     51#include "fec_mpc52xx.h"
     52
     53#define DRIVER_NAME "mpc52xx-fec"
     54
     55/* Private driver data structure */
     56struct mpc52xx_fec_priv {
     57	struct net_device *ndev;
     58	int duplex;
     59	int speed;
     60	int r_irq;
     61	int t_irq;
     62	struct mpc52xx_fec __iomem *fec;
     63	struct bcom_task *rx_dmatsk;
     64	struct bcom_task *tx_dmatsk;
     65	spinlock_t lock;
     66	int msg_enable;
     67
     68	/* MDIO link details */
     69	unsigned int mdio_speed;
     70	struct device_node *phy_node;
     71	enum phy_state link;
     72	int seven_wire_mode;
     73};
     74
     75
     76static irqreturn_t mpc52xx_fec_interrupt(int, void *);
     77static irqreturn_t mpc52xx_fec_rx_interrupt(int, void *);
     78static irqreturn_t mpc52xx_fec_tx_interrupt(int, void *);
     79static void mpc52xx_fec_stop(struct net_device *dev, bool may_sleep);
     80static void mpc52xx_fec_start(struct net_device *dev);
     81static void mpc52xx_fec_reset(struct net_device *dev);
     82
     83#define MPC52xx_MESSAGES_DEFAULT ( NETIF_MSG_DRV | NETIF_MSG_PROBE | \
     84		NETIF_MSG_LINK | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP)
     85static int debug = -1;	/* the above default */
     86module_param(debug, int, 0);
     87MODULE_PARM_DESC(debug, "debugging messages level");
     88
     89static void mpc52xx_fec_tx_timeout(struct net_device *dev, unsigned int txqueue)
     90{
     91	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
     92	unsigned long flags;
     93
     94	dev_warn(&dev->dev, "transmit timed out\n");
     95
     96	spin_lock_irqsave(&priv->lock, flags);
     97	mpc52xx_fec_reset(dev);
     98	dev->stats.tx_errors++;
     99	spin_unlock_irqrestore(&priv->lock, flags);
    100
    101	netif_wake_queue(dev);
    102}
    103
    104static void mpc52xx_fec_set_paddr(struct net_device *dev, const u8 *mac)
    105{
    106	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    107	struct mpc52xx_fec __iomem *fec = priv->fec;
    108
    109	out_be32(&fec->paddr1, *(const u32 *)(&mac[0]));
    110	out_be32(&fec->paddr2, (*(const u16 *)(&mac[4]) << 16) | FEC_PADDR2_TYPE);
    111}
    112
    113static int mpc52xx_fec_set_mac_address(struct net_device *dev, void *addr)
    114{
    115	struct sockaddr *sock = addr;
    116
    117	eth_hw_addr_set(dev, sock->sa_data);
    118
    119	mpc52xx_fec_set_paddr(dev, sock->sa_data);
    120	return 0;
    121}
    122
    123static void mpc52xx_fec_free_rx_buffers(struct net_device *dev, struct bcom_task *s)
    124{
    125	while (!bcom_queue_empty(s)) {
    126		struct bcom_fec_bd *bd;
    127		struct sk_buff *skb;
    128
    129		skb = bcom_retrieve_buffer(s, NULL, (struct bcom_bd **)&bd);
    130		dma_unmap_single(dev->dev.parent, bd->skb_pa, skb->len,
    131				 DMA_FROM_DEVICE);
    132		kfree_skb(skb);
    133	}
    134}
    135
    136static void
    137mpc52xx_fec_rx_submit(struct net_device *dev, struct sk_buff *rskb)
    138{
    139	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    140	struct bcom_fec_bd *bd;
    141
    142	bd = (struct bcom_fec_bd *) bcom_prepare_next_buffer(priv->rx_dmatsk);
    143	bd->status = FEC_RX_BUFFER_SIZE;
    144	bd->skb_pa = dma_map_single(dev->dev.parent, rskb->data,
    145				    FEC_RX_BUFFER_SIZE, DMA_FROM_DEVICE);
    146	bcom_submit_next_buffer(priv->rx_dmatsk, rskb);
    147}
    148
    149static int mpc52xx_fec_alloc_rx_buffers(struct net_device *dev, struct bcom_task *rxtsk)
    150{
    151	struct sk_buff *skb;
    152
    153	while (!bcom_queue_full(rxtsk)) {
    154		skb = netdev_alloc_skb(dev, FEC_RX_BUFFER_SIZE);
    155		if (!skb)
    156			return -EAGAIN;
    157
    158		/* zero out the initial receive buffers to aid debugging */
    159		memset(skb->data, 0, FEC_RX_BUFFER_SIZE);
    160		mpc52xx_fec_rx_submit(dev, skb);
    161	}
    162	return 0;
    163}
    164
    165/* based on generic_adjust_link from fs_enet-main.c */
    166static void mpc52xx_fec_adjust_link(struct net_device *dev)
    167{
    168	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    169	struct phy_device *phydev = dev->phydev;
    170	int new_state = 0;
    171
    172	if (phydev->link != PHY_DOWN) {
    173		if (phydev->duplex != priv->duplex) {
    174			struct mpc52xx_fec __iomem *fec = priv->fec;
    175			u32 rcntrl;
    176			u32 tcntrl;
    177
    178			new_state = 1;
    179			priv->duplex = phydev->duplex;
    180
    181			rcntrl = in_be32(&fec->r_cntrl);
    182			tcntrl = in_be32(&fec->x_cntrl);
    183
    184			rcntrl &= ~FEC_RCNTRL_DRT;
    185			tcntrl &= ~FEC_TCNTRL_FDEN;
    186			if (phydev->duplex == DUPLEX_FULL)
    187				tcntrl |= FEC_TCNTRL_FDEN;	/* FD enable */
    188			else
    189				rcntrl |= FEC_RCNTRL_DRT;	/* disable Rx on Tx (HD) */
    190
    191			out_be32(&fec->r_cntrl, rcntrl);
    192			out_be32(&fec->x_cntrl, tcntrl);
    193		}
    194
    195		if (phydev->speed != priv->speed) {
    196			new_state = 1;
    197			priv->speed = phydev->speed;
    198		}
    199
    200		if (priv->link == PHY_DOWN) {
    201			new_state = 1;
    202			priv->link = phydev->link;
    203		}
    204
    205	} else if (priv->link) {
    206		new_state = 1;
    207		priv->link = PHY_DOWN;
    208		priv->speed = 0;
    209		priv->duplex = -1;
    210	}
    211
    212	if (new_state && netif_msg_link(priv))
    213		phy_print_status(phydev);
    214}
    215
    216static int mpc52xx_fec_open(struct net_device *dev)
    217{
    218	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    219	struct phy_device *phydev = NULL;
    220	int err = -EBUSY;
    221
    222	if (priv->phy_node) {
    223		phydev = of_phy_connect(priv->ndev, priv->phy_node,
    224					mpc52xx_fec_adjust_link, 0, 0);
    225		if (!phydev) {
    226			dev_err(&dev->dev, "of_phy_connect failed\n");
    227			return -ENODEV;
    228		}
    229		phy_start(phydev);
    230	}
    231
    232	if (request_irq(dev->irq, mpc52xx_fec_interrupt, IRQF_SHARED,
    233	                DRIVER_NAME "_ctrl", dev)) {
    234		dev_err(&dev->dev, "ctrl interrupt request failed\n");
    235		goto free_phy;
    236	}
    237	if (request_irq(priv->r_irq, mpc52xx_fec_rx_interrupt, 0,
    238	                DRIVER_NAME "_rx", dev)) {
    239		dev_err(&dev->dev, "rx interrupt request failed\n");
    240		goto free_ctrl_irq;
    241	}
    242	if (request_irq(priv->t_irq, mpc52xx_fec_tx_interrupt, 0,
    243	                DRIVER_NAME "_tx", dev)) {
    244		dev_err(&dev->dev, "tx interrupt request failed\n");
    245		goto free_2irqs;
    246	}
    247
    248	bcom_fec_rx_reset(priv->rx_dmatsk);
    249	bcom_fec_tx_reset(priv->tx_dmatsk);
    250
    251	err = mpc52xx_fec_alloc_rx_buffers(dev, priv->rx_dmatsk);
    252	if (err) {
    253		dev_err(&dev->dev, "mpc52xx_fec_alloc_rx_buffers failed\n");
    254		goto free_irqs;
    255	}
    256
    257	bcom_enable(priv->rx_dmatsk);
    258	bcom_enable(priv->tx_dmatsk);
    259
    260	mpc52xx_fec_start(dev);
    261
    262	netif_start_queue(dev);
    263
    264	return 0;
    265
    266 free_irqs:
    267	free_irq(priv->t_irq, dev);
    268 free_2irqs:
    269	free_irq(priv->r_irq, dev);
    270 free_ctrl_irq:
    271	free_irq(dev->irq, dev);
    272 free_phy:
    273	if (phydev) {
    274		phy_stop(phydev);
    275		phy_disconnect(phydev);
    276	}
    277
    278	return err;
    279}
    280
    281static int mpc52xx_fec_close(struct net_device *dev)
    282{
    283	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    284	struct phy_device *phydev = dev->phydev;
    285
    286	netif_stop_queue(dev);
    287
    288	mpc52xx_fec_stop(dev, true);
    289
    290	mpc52xx_fec_free_rx_buffers(dev, priv->rx_dmatsk);
    291
    292	free_irq(dev->irq, dev);
    293	free_irq(priv->r_irq, dev);
    294	free_irq(priv->t_irq, dev);
    295
    296	if (phydev) {
    297		/* power down phy */
    298		phy_stop(phydev);
    299		phy_disconnect(phydev);
    300	}
    301
    302	return 0;
    303}
    304
    305/* This will only be invoked if your driver is _not_ in XOFF state.
    306 * What this means is that you need not check it, and that this
    307 * invariant will hold if you make sure that the netif_*_queue()
    308 * calls are done at the proper times.
    309 */
    310static netdev_tx_t
    311mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
    312{
    313	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    314	struct bcom_fec_bd *bd;
    315	unsigned long flags;
    316
    317	if (bcom_queue_full(priv->tx_dmatsk)) {
    318		if (net_ratelimit())
    319			dev_err(&dev->dev, "transmit queue overrun\n");
    320		return NETDEV_TX_BUSY;
    321	}
    322
    323	spin_lock_irqsave(&priv->lock, flags);
    324
    325	bd = (struct bcom_fec_bd *)
    326		bcom_prepare_next_buffer(priv->tx_dmatsk);
    327
    328	bd->status = skb->len | BCOM_FEC_TX_BD_TFD | BCOM_FEC_TX_BD_TC;
    329	bd->skb_pa = dma_map_single(dev->dev.parent, skb->data, skb->len,
    330				    DMA_TO_DEVICE);
    331
    332	skb_tx_timestamp(skb);
    333	bcom_submit_next_buffer(priv->tx_dmatsk, skb);
    334	spin_unlock_irqrestore(&priv->lock, flags);
    335
    336	if (bcom_queue_full(priv->tx_dmatsk)) {
    337		netif_stop_queue(dev);
    338	}
    339
    340	return NETDEV_TX_OK;
    341}
    342
    343#ifdef CONFIG_NET_POLL_CONTROLLER
    344static void mpc52xx_fec_poll_controller(struct net_device *dev)
    345{
    346	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    347
    348	disable_irq(priv->t_irq);
    349	mpc52xx_fec_tx_interrupt(priv->t_irq, dev);
    350	enable_irq(priv->t_irq);
    351	disable_irq(priv->r_irq);
    352	mpc52xx_fec_rx_interrupt(priv->r_irq, dev);
    353	enable_irq(priv->r_irq);
    354}
    355#endif
    356
    357
    358/* This handles BestComm transmit task interrupts
    359 */
    360static irqreturn_t mpc52xx_fec_tx_interrupt(int irq, void *dev_id)
    361{
    362	struct net_device *dev = dev_id;
    363	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    364
    365	spin_lock(&priv->lock);
    366	while (bcom_buffer_done(priv->tx_dmatsk)) {
    367		struct sk_buff *skb;
    368		struct bcom_fec_bd *bd;
    369		skb = bcom_retrieve_buffer(priv->tx_dmatsk, NULL,
    370				(struct bcom_bd **)&bd);
    371		dma_unmap_single(dev->dev.parent, bd->skb_pa, skb->len,
    372				 DMA_TO_DEVICE);
    373
    374		dev_consume_skb_irq(skb);
    375	}
    376	spin_unlock(&priv->lock);
    377
    378	netif_wake_queue(dev);
    379
    380	return IRQ_HANDLED;
    381}
    382
    383static irqreturn_t mpc52xx_fec_rx_interrupt(int irq, void *dev_id)
    384{
    385	struct net_device *dev = dev_id;
    386	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    387	struct sk_buff *rskb; /* received sk_buff */
    388	struct sk_buff *skb;  /* new sk_buff to enqueue in its place */
    389	struct bcom_fec_bd *bd;
    390	u32 status, physaddr;
    391	int length;
    392
    393	spin_lock(&priv->lock);
    394
    395	while (bcom_buffer_done(priv->rx_dmatsk)) {
    396
    397		rskb = bcom_retrieve_buffer(priv->rx_dmatsk, &status,
    398					    (struct bcom_bd **)&bd);
    399		physaddr = bd->skb_pa;
    400
    401		/* Test for errors in received frame */
    402		if (status & BCOM_FEC_RX_BD_ERRORS) {
    403			/* Drop packet and reuse the buffer */
    404			mpc52xx_fec_rx_submit(dev, rskb);
    405			dev->stats.rx_dropped++;
    406			continue;
    407		}
    408
    409		/* skbs are allocated on open, so now we allocate a new one,
    410		 * and remove the old (with the packet) */
    411		skb = netdev_alloc_skb(dev, FEC_RX_BUFFER_SIZE);
    412		if (!skb) {
    413			/* Can't get a new one : reuse the same & drop pkt */
    414			dev_notice(&dev->dev, "Low memory - dropped packet.\n");
    415			mpc52xx_fec_rx_submit(dev, rskb);
    416			dev->stats.rx_dropped++;
    417			continue;
    418		}
    419
    420		/* Enqueue the new sk_buff back on the hardware */
    421		mpc52xx_fec_rx_submit(dev, skb);
    422
    423		/* Process the received skb - Drop the spin lock while
    424		 * calling into the network stack */
    425		spin_unlock(&priv->lock);
    426
    427		dma_unmap_single(dev->dev.parent, physaddr, rskb->len,
    428				 DMA_FROM_DEVICE);
    429		length = status & BCOM_FEC_RX_BD_LEN_MASK;
    430		skb_put(rskb, length - 4);	/* length without CRC32 */
    431		rskb->protocol = eth_type_trans(rskb, dev);
    432		if (!skb_defer_rx_timestamp(rskb))
    433			netif_rx(rskb);
    434
    435		spin_lock(&priv->lock);
    436	}
    437
    438	spin_unlock(&priv->lock);
    439
    440	return IRQ_HANDLED;
    441}
    442
    443static irqreturn_t mpc52xx_fec_interrupt(int irq, void *dev_id)
    444{
    445	struct net_device *dev = dev_id;
    446	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    447	struct mpc52xx_fec __iomem *fec = priv->fec;
    448	u32 ievent;
    449
    450	ievent = in_be32(&fec->ievent);
    451
    452	ievent &= ~FEC_IEVENT_MII;	/* mii is handled separately */
    453	if (!ievent)
    454		return IRQ_NONE;
    455
    456	out_be32(&fec->ievent, ievent);		/* clear pending events */
    457
    458	/* on fifo error, soft-reset fec */
    459	if (ievent & (FEC_IEVENT_RFIFO_ERROR | FEC_IEVENT_XFIFO_ERROR)) {
    460
    461		if (net_ratelimit() && (ievent & FEC_IEVENT_RFIFO_ERROR))
    462			dev_warn(&dev->dev, "FEC_IEVENT_RFIFO_ERROR\n");
    463		if (net_ratelimit() && (ievent & FEC_IEVENT_XFIFO_ERROR))
    464			dev_warn(&dev->dev, "FEC_IEVENT_XFIFO_ERROR\n");
    465
    466		spin_lock(&priv->lock);
    467		mpc52xx_fec_reset(dev);
    468		spin_unlock(&priv->lock);
    469
    470		return IRQ_HANDLED;
    471	}
    472
    473	if (ievent & ~FEC_IEVENT_TFINT)
    474		dev_dbg(&dev->dev, "ievent: %08x\n", ievent);
    475
    476	return IRQ_HANDLED;
    477}
    478
    479/*
    480 * Get the current statistics.
    481 * This may be called with the card open or closed.
    482 */
    483static struct net_device_stats *mpc52xx_fec_get_stats(struct net_device *dev)
    484{
    485	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    486	struct net_device_stats *stats = &dev->stats;
    487	struct mpc52xx_fec __iomem *fec = priv->fec;
    488
    489	stats->rx_bytes = in_be32(&fec->rmon_r_octets);
    490	stats->rx_packets = in_be32(&fec->rmon_r_packets);
    491	stats->rx_errors = in_be32(&fec->rmon_r_crc_align) +
    492		in_be32(&fec->rmon_r_undersize) +
    493		in_be32(&fec->rmon_r_oversize) +
    494		in_be32(&fec->rmon_r_frag) +
    495		in_be32(&fec->rmon_r_jab);
    496
    497	stats->tx_bytes = in_be32(&fec->rmon_t_octets);
    498	stats->tx_packets = in_be32(&fec->rmon_t_packets);
    499	stats->tx_errors = in_be32(&fec->rmon_t_crc_align) +
    500		in_be32(&fec->rmon_t_undersize) +
    501		in_be32(&fec->rmon_t_oversize) +
    502		in_be32(&fec->rmon_t_frag) +
    503		in_be32(&fec->rmon_t_jab);
    504
    505	stats->multicast = in_be32(&fec->rmon_r_mc_pkt);
    506	stats->collisions = in_be32(&fec->rmon_t_col);
    507
    508	/* detailed rx_errors: */
    509	stats->rx_length_errors = in_be32(&fec->rmon_r_undersize)
    510					+ in_be32(&fec->rmon_r_oversize)
    511					+ in_be32(&fec->rmon_r_frag)
    512					+ in_be32(&fec->rmon_r_jab);
    513	stats->rx_over_errors = in_be32(&fec->r_macerr);
    514	stats->rx_crc_errors = in_be32(&fec->ieee_r_crc);
    515	stats->rx_frame_errors = in_be32(&fec->ieee_r_align);
    516	stats->rx_fifo_errors = in_be32(&fec->rmon_r_drop);
    517	stats->rx_missed_errors = in_be32(&fec->rmon_r_drop);
    518
    519	/* detailed tx_errors: */
    520	stats->tx_aborted_errors = 0;
    521	stats->tx_carrier_errors = in_be32(&fec->ieee_t_cserr);
    522	stats->tx_fifo_errors = in_be32(&fec->rmon_t_drop);
    523	stats->tx_heartbeat_errors = in_be32(&fec->ieee_t_sqe);
    524	stats->tx_window_errors = in_be32(&fec->ieee_t_lcol);
    525
    526	return stats;
    527}
    528
    529/*
    530 * Read MIB counters in order to reset them,
    531 * then zero all the stats fields in memory
    532 */
    533static void mpc52xx_fec_reset_stats(struct net_device *dev)
    534{
    535	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    536	struct mpc52xx_fec __iomem *fec = priv->fec;
    537
    538	out_be32(&fec->mib_control, FEC_MIB_DISABLE);
    539	memset_io(&fec->rmon_t_drop, 0,
    540		   offsetof(struct mpc52xx_fec, reserved10) -
    541		   offsetof(struct mpc52xx_fec, rmon_t_drop));
    542	out_be32(&fec->mib_control, 0);
    543
    544	memset(&dev->stats, 0, sizeof(dev->stats));
    545}
    546
    547/*
    548 * Set or clear the multicast filter for this adaptor.
    549 */
    550static void mpc52xx_fec_set_multicast_list(struct net_device *dev)
    551{
    552	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    553	struct mpc52xx_fec __iomem *fec = priv->fec;
    554	u32 rx_control;
    555
    556	rx_control = in_be32(&fec->r_cntrl);
    557
    558	if (dev->flags & IFF_PROMISC) {
    559		rx_control |= FEC_RCNTRL_PROM;
    560		out_be32(&fec->r_cntrl, rx_control);
    561	} else {
    562		rx_control &= ~FEC_RCNTRL_PROM;
    563		out_be32(&fec->r_cntrl, rx_control);
    564
    565		if (dev->flags & IFF_ALLMULTI) {
    566			out_be32(&fec->gaddr1, 0xffffffff);
    567			out_be32(&fec->gaddr2, 0xffffffff);
    568		} else {
    569			u32 crc;
    570			struct netdev_hw_addr *ha;
    571			u32 gaddr1 = 0x00000000;
    572			u32 gaddr2 = 0x00000000;
    573
    574			netdev_for_each_mc_addr(ha, dev) {
    575				crc = ether_crc_le(6, ha->addr) >> 26;
    576				if (crc >= 32)
    577					gaddr1 |= 1 << (crc-32);
    578				else
    579					gaddr2 |= 1 << crc;
    580			}
    581			out_be32(&fec->gaddr1, gaddr1);
    582			out_be32(&fec->gaddr2, gaddr2);
    583		}
    584	}
    585}
    586
    587/**
    588 * mpc52xx_fec_hw_init
    589 * @dev: network device
    590 *
    591 * Setup various hardware setting, only needed once on start
    592 */
    593static void mpc52xx_fec_hw_init(struct net_device *dev)
    594{
    595	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    596	struct mpc52xx_fec __iomem *fec = priv->fec;
    597	int i;
    598
    599	/* Whack a reset.  We should wait for this. */
    600	out_be32(&fec->ecntrl, FEC_ECNTRL_RESET);
    601	for (i = 0; i < FEC_RESET_DELAY; ++i) {
    602		if ((in_be32(&fec->ecntrl) & FEC_ECNTRL_RESET) == 0)
    603			break;
    604		udelay(1);
    605	}
    606	if (i == FEC_RESET_DELAY)
    607		dev_err(&dev->dev, "FEC Reset timeout!\n");
    608
    609	/* set pause to 0x20 frames */
    610	out_be32(&fec->op_pause, FEC_OP_PAUSE_OPCODE | 0x20);
    611
    612	/* high service request will be deasserted when there's < 7 bytes in fifo
    613	 * low service request will be deasserted when there's < 4*7 bytes in fifo
    614	 */
    615	out_be32(&fec->rfifo_cntrl, FEC_FIFO_CNTRL_FRAME | FEC_FIFO_CNTRL_LTG_7);
    616	out_be32(&fec->tfifo_cntrl, FEC_FIFO_CNTRL_FRAME | FEC_FIFO_CNTRL_LTG_7);
    617
    618	/* alarm when <= x bytes in FIFO */
    619	out_be32(&fec->rfifo_alarm, 0x0000030c);
    620	out_be32(&fec->tfifo_alarm, 0x00000100);
    621
    622	/* begin transmittion when 256 bytes are in FIFO (or EOF or FIFO full) */
    623	out_be32(&fec->x_wmrk, FEC_FIFO_WMRK_256B);
    624
    625	/* enable crc generation */
    626	out_be32(&fec->xmit_fsm, FEC_XMIT_FSM_APPEND_CRC | FEC_XMIT_FSM_ENABLE_CRC);
    627	out_be32(&fec->iaddr1, 0x00000000);	/* No individual filter */
    628	out_be32(&fec->iaddr2, 0x00000000);	/* No individual filter */
    629
    630	/* set phy speed.
    631	 * this can't be done in phy driver, since it needs to be called
    632	 * before fec stuff (even on resume) */
    633	out_be32(&fec->mii_speed, priv->mdio_speed);
    634}
    635
    636/**
    637 * mpc52xx_fec_start
    638 * @dev: network device
    639 *
    640 * This function is called to start or restart the FEC during a link
    641 * change.  This happens on fifo errors or when switching between half
    642 * and full duplex.
    643 */
    644static void mpc52xx_fec_start(struct net_device *dev)
    645{
    646	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    647	struct mpc52xx_fec __iomem *fec = priv->fec;
    648	u32 rcntrl;
    649	u32 tcntrl;
    650	u32 tmp;
    651
    652	/* clear sticky error bits */
    653	tmp = FEC_FIFO_STATUS_ERR | FEC_FIFO_STATUS_UF | FEC_FIFO_STATUS_OF;
    654	out_be32(&fec->rfifo_status, in_be32(&fec->rfifo_status) & tmp);
    655	out_be32(&fec->tfifo_status, in_be32(&fec->tfifo_status) & tmp);
    656
    657	/* FIFOs will reset on mpc52xx_fec_enable */
    658	out_be32(&fec->reset_cntrl, FEC_RESET_CNTRL_ENABLE_IS_RESET);
    659
    660	/* Set station address. */
    661	mpc52xx_fec_set_paddr(dev, dev->dev_addr);
    662
    663	mpc52xx_fec_set_multicast_list(dev);
    664
    665	/* set max frame len, enable flow control, select mii mode */
    666	rcntrl = FEC_RX_BUFFER_SIZE << 16;	/* max frame length */
    667	rcntrl |= FEC_RCNTRL_FCE;
    668
    669	if (!priv->seven_wire_mode)
    670		rcntrl |= FEC_RCNTRL_MII_MODE;
    671
    672	if (priv->duplex == DUPLEX_FULL)
    673		tcntrl = FEC_TCNTRL_FDEN;	/* FD enable */
    674	else {
    675		rcntrl |= FEC_RCNTRL_DRT;	/* disable Rx on Tx (HD) */
    676		tcntrl = 0;
    677	}
    678	out_be32(&fec->r_cntrl, rcntrl);
    679	out_be32(&fec->x_cntrl, tcntrl);
    680
    681	/* Clear any outstanding interrupt. */
    682	out_be32(&fec->ievent, 0xffffffff);
    683
    684	/* Enable interrupts we wish to service. */
    685	out_be32(&fec->imask, FEC_IMASK_ENABLE);
    686
    687	/* And last, enable the transmit and receive processing. */
    688	out_be32(&fec->ecntrl, FEC_ECNTRL_ETHER_EN);
    689	out_be32(&fec->r_des_active, 0x01000000);
    690}
    691
    692/**
    693 * mpc52xx_fec_stop
    694 * @dev: network device
    695 *
    696 * stop all activity on fec and empty dma buffers
    697 */
    698static void mpc52xx_fec_stop(struct net_device *dev, bool may_sleep)
    699{
    700	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    701	struct mpc52xx_fec __iomem *fec = priv->fec;
    702	unsigned long timeout;
    703
    704	/* disable all interrupts */
    705	out_be32(&fec->imask, 0);
    706
    707	/* Disable the rx task. */
    708	bcom_disable(priv->rx_dmatsk);
    709
    710	/* Wait for tx queue to drain, but only if we're in process context */
    711	if (may_sleep) {
    712		timeout = jiffies + msecs_to_jiffies(2000);
    713		while (time_before(jiffies, timeout) &&
    714				!bcom_queue_empty(priv->tx_dmatsk))
    715			msleep(100);
    716
    717		if (time_after_eq(jiffies, timeout))
    718			dev_err(&dev->dev, "queues didn't drain\n");
    719#if 1
    720		if (time_after_eq(jiffies, timeout)) {
    721			dev_err(&dev->dev, "  tx: index: %i, outdex: %i\n",
    722					priv->tx_dmatsk->index,
    723					priv->tx_dmatsk->outdex);
    724			dev_err(&dev->dev, "  rx: index: %i, outdex: %i\n",
    725					priv->rx_dmatsk->index,
    726					priv->rx_dmatsk->outdex);
    727		}
    728#endif
    729	}
    730
    731	bcom_disable(priv->tx_dmatsk);
    732
    733	/* Stop FEC */
    734	out_be32(&fec->ecntrl, in_be32(&fec->ecntrl) & ~FEC_ECNTRL_ETHER_EN);
    735}
    736
    737/* reset fec and bestcomm tasks */
    738static void mpc52xx_fec_reset(struct net_device *dev)
    739{
    740	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    741	struct mpc52xx_fec __iomem *fec = priv->fec;
    742
    743	mpc52xx_fec_stop(dev, false);
    744
    745	out_be32(&fec->rfifo_status, in_be32(&fec->rfifo_status));
    746	out_be32(&fec->reset_cntrl, FEC_RESET_CNTRL_RESET_FIFO);
    747
    748	mpc52xx_fec_free_rx_buffers(dev, priv->rx_dmatsk);
    749
    750	mpc52xx_fec_hw_init(dev);
    751
    752	bcom_fec_rx_reset(priv->rx_dmatsk);
    753	bcom_fec_tx_reset(priv->tx_dmatsk);
    754
    755	mpc52xx_fec_alloc_rx_buffers(dev, priv->rx_dmatsk);
    756
    757	bcom_enable(priv->rx_dmatsk);
    758	bcom_enable(priv->tx_dmatsk);
    759
    760	mpc52xx_fec_start(dev);
    761
    762	netif_wake_queue(dev);
    763}
    764
    765
    766/* ethtool interface */
    767
    768static u32 mpc52xx_fec_get_msglevel(struct net_device *dev)
    769{
    770	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    771	return priv->msg_enable;
    772}
    773
    774static void mpc52xx_fec_set_msglevel(struct net_device *dev, u32 level)
    775{
    776	struct mpc52xx_fec_priv *priv = netdev_priv(dev);
    777	priv->msg_enable = level;
    778}
    779
    780static const struct ethtool_ops mpc52xx_fec_ethtool_ops = {
    781	.get_link = ethtool_op_get_link,
    782	.get_msglevel = mpc52xx_fec_get_msglevel,
    783	.set_msglevel = mpc52xx_fec_set_msglevel,
    784	.get_ts_info = ethtool_op_get_ts_info,
    785	.get_link_ksettings = phy_ethtool_get_link_ksettings,
    786	.set_link_ksettings = phy_ethtool_set_link_ksettings,
    787};
    788
    789
    790static const struct net_device_ops mpc52xx_fec_netdev_ops = {
    791	.ndo_open = mpc52xx_fec_open,
    792	.ndo_stop = mpc52xx_fec_close,
    793	.ndo_start_xmit = mpc52xx_fec_start_xmit,
    794	.ndo_set_rx_mode = mpc52xx_fec_set_multicast_list,
    795	.ndo_set_mac_address = mpc52xx_fec_set_mac_address,
    796	.ndo_validate_addr = eth_validate_addr,
    797	.ndo_eth_ioctl = phy_do_ioctl,
    798	.ndo_tx_timeout = mpc52xx_fec_tx_timeout,
    799	.ndo_get_stats = mpc52xx_fec_get_stats,
    800#ifdef CONFIG_NET_POLL_CONTROLLER
    801	.ndo_poll_controller = mpc52xx_fec_poll_controller,
    802#endif
    803};
    804
    805/* ======================================================================== */
    806/* OF Driver                                                                */
    807/* ======================================================================== */
    808
    809static int mpc52xx_fec_probe(struct platform_device *op)
    810{
    811	int rv;
    812	struct net_device *ndev;
    813	struct mpc52xx_fec_priv *priv = NULL;
    814	struct resource mem;
    815	const u32 *prop;
    816	int prop_size;
    817	struct device_node *np = op->dev.of_node;
    818
    819	phys_addr_t rx_fifo;
    820	phys_addr_t tx_fifo;
    821
    822	/* Get the ether ndev & it's private zone */
    823	ndev = alloc_etherdev(sizeof(struct mpc52xx_fec_priv));
    824	if (!ndev)
    825		return -ENOMEM;
    826
    827	priv = netdev_priv(ndev);
    828	priv->ndev = ndev;
    829
    830	/* Reserve FEC control zone */
    831	rv = of_address_to_resource(np, 0, &mem);
    832	if (rv) {
    833		pr_err("Error while parsing device node resource\n");
    834		goto err_netdev;
    835	}
    836	if (resource_size(&mem) < sizeof(struct mpc52xx_fec)) {
    837		pr_err("invalid resource size (%lx < %x), check mpc52xx_devices.c\n",
    838		       (unsigned long)resource_size(&mem),
    839		       sizeof(struct mpc52xx_fec));
    840		rv = -EINVAL;
    841		goto err_netdev;
    842	}
    843
    844	if (!request_mem_region(mem.start, sizeof(struct mpc52xx_fec),
    845				DRIVER_NAME)) {
    846		rv = -EBUSY;
    847		goto err_netdev;
    848	}
    849
    850	/* Init ether ndev with what we have */
    851	ndev->netdev_ops	= &mpc52xx_fec_netdev_ops;
    852	ndev->ethtool_ops	= &mpc52xx_fec_ethtool_ops;
    853	ndev->watchdog_timeo	= FEC_WATCHDOG_TIMEOUT;
    854	ndev->base_addr		= mem.start;
    855	SET_NETDEV_DEV(ndev, &op->dev);
    856
    857	spin_lock_init(&priv->lock);
    858
    859	/* ioremap the zones */
    860	priv->fec = ioremap(mem.start, sizeof(struct mpc52xx_fec));
    861
    862	if (!priv->fec) {
    863		rv = -ENOMEM;
    864		goto err_mem_region;
    865	}
    866
    867	/* Bestcomm init */
    868	rx_fifo = ndev->base_addr + offsetof(struct mpc52xx_fec, rfifo_data);
    869	tx_fifo = ndev->base_addr + offsetof(struct mpc52xx_fec, tfifo_data);
    870
    871	priv->rx_dmatsk = bcom_fec_rx_init(FEC_RX_NUM_BD, rx_fifo, FEC_RX_BUFFER_SIZE);
    872	priv->tx_dmatsk = bcom_fec_tx_init(FEC_TX_NUM_BD, tx_fifo);
    873
    874	if (!priv->rx_dmatsk || !priv->tx_dmatsk) {
    875		pr_err("Can not init SDMA tasks\n");
    876		rv = -ENOMEM;
    877		goto err_rx_tx_dmatsk;
    878	}
    879
    880	/* Get the IRQ we need one by one */
    881		/* Control */
    882	ndev->irq = irq_of_parse_and_map(np, 0);
    883
    884		/* RX */
    885	priv->r_irq = bcom_get_task_irq(priv->rx_dmatsk);
    886
    887		/* TX */
    888	priv->t_irq = bcom_get_task_irq(priv->tx_dmatsk);
    889
    890	/*
    891	 * MAC address init:
    892	 *
    893	 * First try to read MAC address from DT
    894	 */
    895	rv = of_get_ethdev_address(np, ndev);
    896	if (rv) {
    897		struct mpc52xx_fec __iomem *fec = priv->fec;
    898		u8 addr[ETH_ALEN] __aligned(4);
    899
    900		/*
    901		 * If the MAC addresse is not provided via DT then read
    902		 * it back from the controller regs
    903		 */
    904		*(u32 *)(&addr[0]) = in_be32(&fec->paddr1);
    905		*(u16 *)(&addr[4]) = in_be32(&fec->paddr2) >> 16;
    906		eth_hw_addr_set(ndev, addr);
    907	}
    908
    909	/*
    910	 * Check if the MAC address is valid, if not get a random one
    911	 */
    912	if (!is_valid_ether_addr(ndev->dev_addr)) {
    913		eth_hw_addr_random(ndev);
    914		dev_warn(&ndev->dev, "using random MAC address %pM\n",
    915			 ndev->dev_addr);
    916	}
    917
    918	priv->msg_enable = netif_msg_init(debug, MPC52xx_MESSAGES_DEFAULT);
    919
    920	/*
    921	 * Link mode configuration
    922	 */
    923
    924	/* Start with safe defaults for link connection */
    925	priv->speed = 100;
    926	priv->duplex = DUPLEX_HALF;
    927	priv->mdio_speed = ((mpc5xxx_get_bus_frequency(np) >> 20) / 5) << 1;
    928
    929	/* The current speed preconfigures the speed of the MII link */
    930	prop = of_get_property(np, "current-speed", &prop_size);
    931	if (prop && (prop_size >= sizeof(u32) * 2)) {
    932		priv->speed = prop[0];
    933		priv->duplex = prop[1] ? DUPLEX_FULL : DUPLEX_HALF;
    934	}
    935
    936	/* If there is a phy handle, then get the PHY node */
    937	priv->phy_node = of_parse_phandle(np, "phy-handle", 0);
    938
    939	/* the 7-wire property means don't use MII mode */
    940	if (of_find_property(np, "fsl,7-wire-mode", NULL)) {
    941		priv->seven_wire_mode = 1;
    942		dev_info(&ndev->dev, "using 7-wire PHY mode\n");
    943	}
    944
    945	/* Hardware init */
    946	mpc52xx_fec_hw_init(ndev);
    947	mpc52xx_fec_reset_stats(ndev);
    948
    949	rv = register_netdev(ndev);
    950	if (rv < 0)
    951		goto err_node;
    952
    953	/* We're done ! */
    954	platform_set_drvdata(op, ndev);
    955	netdev_info(ndev, "%pOF MAC %pM\n",
    956		    op->dev.of_node, ndev->dev_addr);
    957
    958	return 0;
    959
    960err_node:
    961	of_node_put(priv->phy_node);
    962	irq_dispose_mapping(ndev->irq);
    963err_rx_tx_dmatsk:
    964	if (priv->rx_dmatsk)
    965		bcom_fec_rx_release(priv->rx_dmatsk);
    966	if (priv->tx_dmatsk)
    967		bcom_fec_tx_release(priv->tx_dmatsk);
    968	iounmap(priv->fec);
    969err_mem_region:
    970	release_mem_region(mem.start, sizeof(struct mpc52xx_fec));
    971err_netdev:
    972	free_netdev(ndev);
    973
    974	return rv;
    975}
    976
    977static int
    978mpc52xx_fec_remove(struct platform_device *op)
    979{
    980	struct net_device *ndev;
    981	struct mpc52xx_fec_priv *priv;
    982
    983	ndev = platform_get_drvdata(op);
    984	priv = netdev_priv(ndev);
    985
    986	unregister_netdev(ndev);
    987
    988	of_node_put(priv->phy_node);
    989	priv->phy_node = NULL;
    990
    991	irq_dispose_mapping(ndev->irq);
    992
    993	bcom_fec_rx_release(priv->rx_dmatsk);
    994	bcom_fec_tx_release(priv->tx_dmatsk);
    995
    996	iounmap(priv->fec);
    997
    998	release_mem_region(ndev->base_addr, sizeof(struct mpc52xx_fec));
    999
   1000	free_netdev(ndev);
   1001
   1002	return 0;
   1003}
   1004
   1005#ifdef CONFIG_PM
   1006static int mpc52xx_fec_of_suspend(struct platform_device *op, pm_message_t state)
   1007{
   1008	struct net_device *dev = platform_get_drvdata(op);
   1009
   1010	if (netif_running(dev))
   1011		mpc52xx_fec_close(dev);
   1012
   1013	return 0;
   1014}
   1015
   1016static int mpc52xx_fec_of_resume(struct platform_device *op)
   1017{
   1018	struct net_device *dev = platform_get_drvdata(op);
   1019
   1020	mpc52xx_fec_hw_init(dev);
   1021	mpc52xx_fec_reset_stats(dev);
   1022
   1023	if (netif_running(dev))
   1024		mpc52xx_fec_open(dev);
   1025
   1026	return 0;
   1027}
   1028#endif
   1029
   1030static const struct of_device_id mpc52xx_fec_match[] = {
   1031	{ .compatible = "fsl,mpc5200b-fec", },
   1032	{ .compatible = "fsl,mpc5200-fec", },
   1033	{ .compatible = "mpc5200-fec", },
   1034	{ }
   1035};
   1036
   1037MODULE_DEVICE_TABLE(of, mpc52xx_fec_match);
   1038
   1039static struct platform_driver mpc52xx_fec_driver = {
   1040	.driver = {
   1041		.name = DRIVER_NAME,
   1042		.of_match_table = mpc52xx_fec_match,
   1043	},
   1044	.probe		= mpc52xx_fec_probe,
   1045	.remove		= mpc52xx_fec_remove,
   1046#ifdef CONFIG_PM
   1047	.suspend	= mpc52xx_fec_of_suspend,
   1048	.resume		= mpc52xx_fec_of_resume,
   1049#endif
   1050};
   1051
   1052
   1053/* ======================================================================== */
   1054/* Module                                                                   */
   1055/* ======================================================================== */
   1056
   1057static struct platform_driver * const drivers[] = {
   1058#ifdef CONFIG_FEC_MPC52xx_MDIO
   1059	&mpc52xx_fec_mdio_driver,
   1060#endif
   1061	&mpc52xx_fec_driver,
   1062};
   1063
   1064static int __init
   1065mpc52xx_fec_init(void)
   1066{
   1067	return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
   1068}
   1069
   1070static void __exit
   1071mpc52xx_fec_exit(void)
   1072{
   1073	platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
   1074}
   1075
   1076
   1077module_init(mpc52xx_fec_init);
   1078module_exit(mpc52xx_fec_exit);
   1079
   1080MODULE_LICENSE("GPL");
   1081MODULE_AUTHOR("Dale Farnsworth");
   1082MODULE_DESCRIPTION("Ethernet driver for the Freescale MPC52xx FEC");