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

sun4i-emac.c (28909B)


      1/*
      2 * Allwinner EMAC Fast Ethernet driver for Linux.
      3 *
      4 * Copyright 2012-2013 Stefan Roese <sr@denx.de>
      5 * Copyright 2013 Maxime Ripard <maxime.ripard@free-electrons.com>
      6 *
      7 * Based on the Linux driver provided by Allwinner:
      8 * Copyright (C) 1997  Sten Wang
      9 *
     10 * This file is licensed under the terms of the GNU General Public
     11 * License version 2. This program is licensed "as is" without any
     12 * warranty of any kind, whether express or implied.
     13 */
     14
     15#include <linux/clk.h>
     16#include <linux/etherdevice.h>
     17#include <linux/ethtool.h>
     18#include <linux/gpio.h>
     19#include <linux/interrupt.h>
     20#include <linux/irq.h>
     21#include <linux/mii.h>
     22#include <linux/module.h>
     23#include <linux/netdevice.h>
     24#include <linux/of_address.h>
     25#include <linux/of_irq.h>
     26#include <linux/of_mdio.h>
     27#include <linux/of_net.h>
     28#include <linux/of_platform.h>
     29#include <linux/platform_device.h>
     30#include <linux/phy.h>
     31#include <linux/soc/sunxi/sunxi_sram.h>
     32#include <linux/dmaengine.h>
     33
     34#include "sun4i-emac.h"
     35
     36#define DRV_NAME		"sun4i-emac"
     37
     38#define EMAC_MAX_FRAME_LEN	0x0600
     39
     40#define EMAC_DEFAULT_MSG_ENABLE 0x0000
     41static int debug = -1;     /* defaults above */;
     42module_param(debug, int, 0);
     43MODULE_PARM_DESC(debug, "debug message flags");
     44
     45/* Transmit timeout, default 5 seconds. */
     46static int watchdog = 5000;
     47module_param(watchdog, int, 0400);
     48MODULE_PARM_DESC(watchdog, "transmit timeout in milliseconds");
     49
     50/* EMAC register address locking.
     51 *
     52 * The EMAC uses an address register to control where data written
     53 * to the data register goes. This means that the address register
     54 * must be preserved over interrupts or similar calls.
     55 *
     56 * During interrupt and other critical calls, a spinlock is used to
     57 * protect the system, but the calls themselves save the address
     58 * in the address register in case they are interrupting another
     59 * access to the device.
     60 *
     61 * For general accesses a lock is provided so that calls which are
     62 * allowed to sleep are serialised so that the address register does
     63 * not need to be saved. This lock also serves to serialise access
     64 * to the EEPROM and PHY access registers which are shared between
     65 * these two devices.
     66 */
     67
     68/* The driver supports the original EMACE, and now the two newer
     69 * devices, EMACA and EMACB.
     70 */
     71
     72struct emac_board_info {
     73	struct clk		*clk;
     74	struct device		*dev;
     75	struct platform_device	*pdev;
     76	spinlock_t		lock;
     77	void __iomem		*membase;
     78	u32			msg_enable;
     79	struct net_device	*ndev;
     80	u16			tx_fifo_stat;
     81
     82	int			emacrx_completed_flag;
     83
     84	struct device_node	*phy_node;
     85	unsigned int		link;
     86	unsigned int		speed;
     87	unsigned int		duplex;
     88
     89	phy_interface_t		phy_interface;
     90	struct dma_chan	*rx_chan;
     91	phys_addr_t emac_rx_fifo;
     92};
     93
     94struct emac_dma_req {
     95	struct emac_board_info *db;
     96	struct dma_async_tx_descriptor *desc;
     97	struct sk_buff *skb;
     98	dma_addr_t rxbuf;
     99	int count;
    100};
    101
    102static void emac_update_speed(struct net_device *dev)
    103{
    104	struct emac_board_info *db = netdev_priv(dev);
    105	unsigned int reg_val;
    106
    107	/* set EMAC SPEED, depend on PHY  */
    108	reg_val = readl(db->membase + EMAC_MAC_SUPP_REG);
    109	reg_val &= ~EMAC_MAC_SUPP_100M;
    110	if (db->speed == SPEED_100)
    111		reg_val |= EMAC_MAC_SUPP_100M;
    112	writel(reg_val, db->membase + EMAC_MAC_SUPP_REG);
    113}
    114
    115static void emac_update_duplex(struct net_device *dev)
    116{
    117	struct emac_board_info *db = netdev_priv(dev);
    118	unsigned int reg_val;
    119
    120	/* set duplex depend on phy */
    121	reg_val = readl(db->membase + EMAC_MAC_CTL1_REG);
    122	reg_val &= ~EMAC_MAC_CTL1_DUPLEX_EN;
    123	if (db->duplex)
    124		reg_val |= EMAC_MAC_CTL1_DUPLEX_EN;
    125	writel(reg_val, db->membase + EMAC_MAC_CTL1_REG);
    126}
    127
    128static void emac_handle_link_change(struct net_device *dev)
    129{
    130	struct emac_board_info *db = netdev_priv(dev);
    131	struct phy_device *phydev = dev->phydev;
    132	unsigned long flags;
    133	int status_change = 0;
    134
    135	if (phydev->link) {
    136		if (db->speed != phydev->speed) {
    137			spin_lock_irqsave(&db->lock, flags);
    138			db->speed = phydev->speed;
    139			emac_update_speed(dev);
    140			spin_unlock_irqrestore(&db->lock, flags);
    141			status_change = 1;
    142		}
    143
    144		if (db->duplex != phydev->duplex) {
    145			spin_lock_irqsave(&db->lock, flags);
    146			db->duplex = phydev->duplex;
    147			emac_update_duplex(dev);
    148			spin_unlock_irqrestore(&db->lock, flags);
    149			status_change = 1;
    150		}
    151	}
    152
    153	if (phydev->link != db->link) {
    154		if (!phydev->link) {
    155			db->speed = 0;
    156			db->duplex = -1;
    157		}
    158		db->link = phydev->link;
    159
    160		status_change = 1;
    161	}
    162
    163	if (status_change)
    164		phy_print_status(phydev);
    165}
    166
    167static int emac_mdio_probe(struct net_device *dev)
    168{
    169	struct emac_board_info *db = netdev_priv(dev);
    170	struct phy_device *phydev;
    171
    172	/* to-do: PHY interrupts are currently not supported */
    173
    174	/* attach the mac to the phy */
    175	phydev = of_phy_connect(db->ndev, db->phy_node,
    176				&emac_handle_link_change, 0,
    177				db->phy_interface);
    178	if (!phydev) {
    179		netdev_err(db->ndev, "could not find the PHY\n");
    180		return -ENODEV;
    181	}
    182
    183	/* mask with MAC supported features */
    184	phy_set_max_speed(phydev, SPEED_100);
    185
    186	db->link = 0;
    187	db->speed = 0;
    188	db->duplex = -1;
    189
    190	return 0;
    191}
    192
    193static void emac_mdio_remove(struct net_device *dev)
    194{
    195	phy_disconnect(dev->phydev);
    196}
    197
    198static void emac_reset(struct emac_board_info *db)
    199{
    200	dev_dbg(db->dev, "resetting device\n");
    201
    202	/* RESET device */
    203	writel(0, db->membase + EMAC_CTL_REG);
    204	udelay(200);
    205	writel(EMAC_CTL_RESET, db->membase + EMAC_CTL_REG);
    206	udelay(200);
    207}
    208
    209static void emac_outblk_32bit(void __iomem *reg, void *data, int count)
    210{
    211	writesl(reg, data, round_up(count, 4) / 4);
    212}
    213
    214static void emac_inblk_32bit(void __iomem *reg, void *data, int count)
    215{
    216	readsl(reg, data, round_up(count, 4) / 4);
    217}
    218
    219static struct emac_dma_req *
    220emac_alloc_dma_req(struct emac_board_info *db,
    221		   struct dma_async_tx_descriptor *desc, struct sk_buff *skb,
    222		   dma_addr_t rxbuf, int count)
    223{
    224	struct emac_dma_req *req;
    225
    226	req = kzalloc(sizeof(struct emac_dma_req), GFP_ATOMIC);
    227	if (!req)
    228		return NULL;
    229
    230	req->db = db;
    231	req->desc = desc;
    232	req->skb = skb;
    233	req->rxbuf = rxbuf;
    234	req->count = count;
    235	return req;
    236}
    237
    238static void emac_free_dma_req(struct emac_dma_req *req)
    239{
    240	kfree(req);
    241}
    242
    243static void emac_dma_done_callback(void *arg)
    244{
    245	struct emac_dma_req *req = arg;
    246	struct emac_board_info *db = req->db;
    247	struct sk_buff *skb = req->skb;
    248	struct net_device *dev = db->ndev;
    249	int rxlen = req->count;
    250	u32 reg_val;
    251
    252	dma_unmap_single(db->dev, req->rxbuf, rxlen, DMA_FROM_DEVICE);
    253
    254	skb->protocol = eth_type_trans(skb, dev);
    255	netif_rx(skb);
    256	dev->stats.rx_bytes += rxlen;
    257	/* Pass to upper layer */
    258	dev->stats.rx_packets++;
    259
    260	/* re enable cpu receive */
    261	reg_val = readl(db->membase + EMAC_RX_CTL_REG);
    262	reg_val &= ~EMAC_RX_CTL_DMA_EN;
    263	writel(reg_val, db->membase + EMAC_RX_CTL_REG);
    264
    265	/* re enable interrupt */
    266	reg_val = readl(db->membase + EMAC_INT_CTL_REG);
    267	reg_val |= EMAC_INT_CTL_RX_EN;
    268	writel(reg_val, db->membase + EMAC_INT_CTL_REG);
    269
    270	db->emacrx_completed_flag = 1;
    271	emac_free_dma_req(req);
    272}
    273
    274static int emac_dma_inblk_32bit(struct emac_board_info *db,
    275		struct sk_buff *skb, void *rdptr, int count)
    276{
    277	struct dma_async_tx_descriptor *desc;
    278	dma_cookie_t cookie;
    279	dma_addr_t rxbuf;
    280	struct emac_dma_req *req;
    281	int ret = 0;
    282
    283	rxbuf = dma_map_single(db->dev, rdptr, count, DMA_FROM_DEVICE);
    284	ret = dma_mapping_error(db->dev, rxbuf);
    285	if (ret) {
    286		dev_err(db->dev, "dma mapping error.\n");
    287		return ret;
    288	}
    289
    290	desc = dmaengine_prep_slave_single(db->rx_chan, rxbuf, count,
    291					   DMA_DEV_TO_MEM,
    292					   DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
    293	if (!desc) {
    294		dev_err(db->dev, "prepare slave single failed\n");
    295		ret = -ENOMEM;
    296		goto prepare_err;
    297	}
    298
    299	req = emac_alloc_dma_req(db, desc, skb, rxbuf, count);
    300	if (!req) {
    301		dev_err(db->dev, "alloc emac dma req error.\n");
    302		ret = -ENOMEM;
    303		goto alloc_req_err;
    304	}
    305
    306	desc->callback_param = req;
    307	desc->callback = emac_dma_done_callback;
    308
    309	cookie = dmaengine_submit(desc);
    310	ret = dma_submit_error(cookie);
    311	if (ret) {
    312		dev_err(db->dev, "dma submit error.\n");
    313		goto submit_err;
    314	}
    315
    316	dma_async_issue_pending(db->rx_chan);
    317	return ret;
    318
    319submit_err:
    320	emac_free_dma_req(req);
    321
    322alloc_req_err:
    323	dmaengine_desc_free(desc);
    324
    325prepare_err:
    326	dma_unmap_single(db->dev, rxbuf, count, DMA_FROM_DEVICE);
    327	return ret;
    328}
    329
    330/* ethtool ops */
    331static void emac_get_drvinfo(struct net_device *dev,
    332			      struct ethtool_drvinfo *info)
    333{
    334	strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
    335	strlcpy(info->bus_info, dev_name(&dev->dev), sizeof(info->bus_info));
    336}
    337
    338static u32 emac_get_msglevel(struct net_device *dev)
    339{
    340	struct emac_board_info *db = netdev_priv(dev);
    341
    342	return db->msg_enable;
    343}
    344
    345static void emac_set_msglevel(struct net_device *dev, u32 value)
    346{
    347	struct emac_board_info *db = netdev_priv(dev);
    348
    349	db->msg_enable = value;
    350}
    351
    352static const struct ethtool_ops emac_ethtool_ops = {
    353	.get_drvinfo	= emac_get_drvinfo,
    354	.get_link	= ethtool_op_get_link,
    355	.get_link_ksettings = phy_ethtool_get_link_ksettings,
    356	.set_link_ksettings = phy_ethtool_set_link_ksettings,
    357	.get_msglevel	= emac_get_msglevel,
    358	.set_msglevel	= emac_set_msglevel,
    359};
    360
    361static unsigned int emac_setup(struct net_device *ndev)
    362{
    363	struct emac_board_info *db = netdev_priv(ndev);
    364	unsigned int reg_val;
    365
    366	/* set up TX */
    367	reg_val = readl(db->membase + EMAC_TX_MODE_REG);
    368
    369	writel(reg_val | EMAC_TX_MODE_ABORTED_FRAME_EN,
    370		db->membase + EMAC_TX_MODE_REG);
    371
    372	/* set MAC */
    373	/* set MAC CTL0 */
    374	reg_val = readl(db->membase + EMAC_MAC_CTL0_REG);
    375	writel(reg_val | EMAC_MAC_CTL0_RX_FLOW_CTL_EN |
    376		EMAC_MAC_CTL0_TX_FLOW_CTL_EN,
    377		db->membase + EMAC_MAC_CTL0_REG);
    378
    379	/* set MAC CTL1 */
    380	reg_val = readl(db->membase + EMAC_MAC_CTL1_REG);
    381	reg_val |= EMAC_MAC_CTL1_LEN_CHECK_EN;
    382	reg_val |= EMAC_MAC_CTL1_CRC_EN;
    383	reg_val |= EMAC_MAC_CTL1_PAD_EN;
    384	writel(reg_val, db->membase + EMAC_MAC_CTL1_REG);
    385
    386	/* set up IPGT */
    387	writel(EMAC_MAC_IPGT_FULL_DUPLEX, db->membase + EMAC_MAC_IPGT_REG);
    388
    389	/* set up IPGR */
    390	writel((EMAC_MAC_IPGR_IPG1 << 8) | EMAC_MAC_IPGR_IPG2,
    391		db->membase + EMAC_MAC_IPGR_REG);
    392
    393	/* set up Collison window */
    394	writel((EMAC_MAC_CLRT_COLLISION_WINDOW << 8) | EMAC_MAC_CLRT_RM,
    395		db->membase + EMAC_MAC_CLRT_REG);
    396
    397	/* set up Max Frame Length */
    398	writel(EMAC_MAX_FRAME_LEN,
    399		db->membase + EMAC_MAC_MAXF_REG);
    400
    401	return 0;
    402}
    403
    404static void emac_set_rx_mode(struct net_device *ndev)
    405{
    406	struct emac_board_info *db = netdev_priv(ndev);
    407	unsigned int reg_val;
    408
    409	/* set up RX */
    410	reg_val = readl(db->membase + EMAC_RX_CTL_REG);
    411
    412	if (ndev->flags & IFF_PROMISC)
    413		reg_val |= EMAC_RX_CTL_PASS_ALL_EN;
    414	else
    415		reg_val &= ~EMAC_RX_CTL_PASS_ALL_EN;
    416
    417	writel(reg_val | EMAC_RX_CTL_PASS_LEN_OOR_EN |
    418		EMAC_RX_CTL_ACCEPT_UNICAST_EN | EMAC_RX_CTL_DA_FILTER_EN |
    419		EMAC_RX_CTL_ACCEPT_MULTICAST_EN |
    420		EMAC_RX_CTL_ACCEPT_BROADCAST_EN,
    421		db->membase + EMAC_RX_CTL_REG);
    422}
    423
    424static unsigned int emac_powerup(struct net_device *ndev)
    425{
    426	struct emac_board_info *db = netdev_priv(ndev);
    427	unsigned int reg_val;
    428
    429	/* initial EMAC */
    430	/* flush RX FIFO */
    431	reg_val = readl(db->membase + EMAC_RX_CTL_REG);
    432	reg_val |= EMAC_RX_CTL_FLUSH_FIFO;
    433	writel(reg_val, db->membase + EMAC_RX_CTL_REG);
    434	udelay(1);
    435
    436	/* initial MAC */
    437	/* soft reset MAC */
    438	reg_val = readl(db->membase + EMAC_MAC_CTL0_REG);
    439	reg_val &= ~EMAC_MAC_CTL0_SOFT_RESET;
    440	writel(reg_val, db->membase + EMAC_MAC_CTL0_REG);
    441
    442	/* set MII clock */
    443	reg_val = readl(db->membase + EMAC_MAC_MCFG_REG);
    444	reg_val &= ~EMAC_MAC_MCFG_MII_CLKD_MASK;
    445	reg_val |= EMAC_MAC_MCFG_MII_CLKD_72;
    446	writel(reg_val, db->membase + EMAC_MAC_MCFG_REG);
    447
    448	/* clear RX counter */
    449	writel(0x0, db->membase + EMAC_RX_FBC_REG);
    450
    451	/* disable all interrupt and clear interrupt status */
    452	writel(0, db->membase + EMAC_INT_CTL_REG);
    453	reg_val = readl(db->membase + EMAC_INT_STA_REG);
    454	writel(reg_val, db->membase + EMAC_INT_STA_REG);
    455
    456	udelay(1);
    457
    458	/* set up EMAC */
    459	emac_setup(ndev);
    460
    461	/* set mac_address to chip */
    462	writel(ndev->dev_addr[0] << 16 | ndev->dev_addr[1] << 8 | ndev->
    463	       dev_addr[2], db->membase + EMAC_MAC_A1_REG);
    464	writel(ndev->dev_addr[3] << 16 | ndev->dev_addr[4] << 8 | ndev->
    465	       dev_addr[5], db->membase + EMAC_MAC_A0_REG);
    466
    467	mdelay(1);
    468
    469	return 0;
    470}
    471
    472static int emac_set_mac_address(struct net_device *dev, void *p)
    473{
    474	struct sockaddr *addr = p;
    475	struct emac_board_info *db = netdev_priv(dev);
    476
    477	if (netif_running(dev))
    478		return -EBUSY;
    479
    480	eth_hw_addr_set(dev, addr->sa_data);
    481
    482	writel(dev->dev_addr[0] << 16 | dev->dev_addr[1] << 8 | dev->
    483	       dev_addr[2], db->membase + EMAC_MAC_A1_REG);
    484	writel(dev->dev_addr[3] << 16 | dev->dev_addr[4] << 8 | dev->
    485	       dev_addr[5], db->membase + EMAC_MAC_A0_REG);
    486
    487	return 0;
    488}
    489
    490/* Initialize emac board */
    491static void emac_init_device(struct net_device *dev)
    492{
    493	struct emac_board_info *db = netdev_priv(dev);
    494	unsigned long flags;
    495	unsigned int reg_val;
    496
    497	spin_lock_irqsave(&db->lock, flags);
    498
    499	emac_update_speed(dev);
    500	emac_update_duplex(dev);
    501
    502	/* enable RX/TX */
    503	reg_val = readl(db->membase + EMAC_CTL_REG);
    504	writel(reg_val | EMAC_CTL_RESET | EMAC_CTL_TX_EN | EMAC_CTL_RX_EN,
    505		db->membase + EMAC_CTL_REG);
    506
    507	/* enable RX/TX0/RX Hlevel interrup */
    508	reg_val = readl(db->membase + EMAC_INT_CTL_REG);
    509	reg_val |= (EMAC_INT_CTL_TX_EN | EMAC_INT_CTL_TX_ABRT_EN | EMAC_INT_CTL_RX_EN);
    510	writel(reg_val, db->membase + EMAC_INT_CTL_REG);
    511
    512	spin_unlock_irqrestore(&db->lock, flags);
    513}
    514
    515/* Our watchdog timed out. Called by the networking layer */
    516static void emac_timeout(struct net_device *dev, unsigned int txqueue)
    517{
    518	struct emac_board_info *db = netdev_priv(dev);
    519	unsigned long flags;
    520
    521	if (netif_msg_timer(db))
    522		dev_err(db->dev, "tx time out.\n");
    523
    524	/* Save previous register address */
    525	spin_lock_irqsave(&db->lock, flags);
    526
    527	netif_stop_queue(dev);
    528	emac_reset(db);
    529	emac_init_device(dev);
    530	/* We can accept TX packets again */
    531	netif_trans_update(dev);
    532	netif_wake_queue(dev);
    533
    534	/* Restore previous register address */
    535	spin_unlock_irqrestore(&db->lock, flags);
    536}
    537
    538/* Hardware start transmission.
    539 * Send a packet to media from the upper layer.
    540 */
    541static netdev_tx_t emac_start_xmit(struct sk_buff *skb, struct net_device *dev)
    542{
    543	struct emac_board_info *db = netdev_priv(dev);
    544	unsigned long channel;
    545	unsigned long flags;
    546
    547	channel = db->tx_fifo_stat & 3;
    548	if (channel == 3)
    549		return NETDEV_TX_BUSY;
    550
    551	channel = (channel == 1 ? 1 : 0);
    552
    553	spin_lock_irqsave(&db->lock, flags);
    554
    555	writel(channel, db->membase + EMAC_TX_INS_REG);
    556
    557	emac_outblk_32bit(db->membase + EMAC_TX_IO_DATA_REG,
    558			skb->data, skb->len);
    559	dev->stats.tx_bytes += skb->len;
    560
    561	db->tx_fifo_stat |= 1 << channel;
    562	/* TX control: First packet immediately send, second packet queue */
    563	if (channel == 0) {
    564		/* set TX len */
    565		writel(skb->len, db->membase + EMAC_TX_PL0_REG);
    566		/* start translate from fifo to phy */
    567		writel(readl(db->membase + EMAC_TX_CTL0_REG) | 1,
    568		       db->membase + EMAC_TX_CTL0_REG);
    569
    570		/* save the time stamp */
    571		netif_trans_update(dev);
    572	} else if (channel == 1) {
    573		/* set TX len */
    574		writel(skb->len, db->membase + EMAC_TX_PL1_REG);
    575		/* start translate from fifo to phy */
    576		writel(readl(db->membase + EMAC_TX_CTL1_REG) | 1,
    577		       db->membase + EMAC_TX_CTL1_REG);
    578
    579		/* save the time stamp */
    580		netif_trans_update(dev);
    581	}
    582
    583	if ((db->tx_fifo_stat & 3) == 3) {
    584		/* Second packet */
    585		netif_stop_queue(dev);
    586	}
    587
    588	spin_unlock_irqrestore(&db->lock, flags);
    589
    590	/* free this SKB */
    591	dev_consume_skb_any(skb);
    592
    593	return NETDEV_TX_OK;
    594}
    595
    596/* EMAC interrupt handler
    597 * receive the packet to upper layer, free the transmitted packet
    598 */
    599static void emac_tx_done(struct net_device *dev, struct emac_board_info *db,
    600			  unsigned int tx_status)
    601{
    602	/* One packet sent complete */
    603	db->tx_fifo_stat &= ~(tx_status & 3);
    604	if (3 == (tx_status & 3))
    605		dev->stats.tx_packets += 2;
    606	else
    607		dev->stats.tx_packets++;
    608
    609	if (netif_msg_tx_done(db))
    610		dev_dbg(db->dev, "tx done, NSR %02x\n", tx_status);
    611
    612	netif_wake_queue(dev);
    613}
    614
    615/* Received a packet and pass to upper layer
    616 */
    617static void emac_rx(struct net_device *dev)
    618{
    619	struct emac_board_info *db = netdev_priv(dev);
    620	struct sk_buff *skb;
    621	u8 *rdptr;
    622	bool good_packet;
    623	unsigned int reg_val;
    624	u32 rxhdr, rxstatus, rxcount, rxlen;
    625
    626	/* Check packet ready or not */
    627	while (1) {
    628		/* race warning: the first packet might arrive with
    629		 * the interrupts disabled, but the second will fix
    630		 * it
    631		 */
    632		rxcount = readl(db->membase + EMAC_RX_FBC_REG);
    633
    634		if (netif_msg_rx_status(db))
    635			dev_dbg(db->dev, "RXCount: %x\n", rxcount);
    636
    637		if (!rxcount) {
    638			db->emacrx_completed_flag = 1;
    639			reg_val = readl(db->membase + EMAC_INT_CTL_REG);
    640			reg_val |= (EMAC_INT_CTL_TX_EN |
    641					EMAC_INT_CTL_TX_ABRT_EN |
    642					EMAC_INT_CTL_RX_EN);
    643			writel(reg_val, db->membase + EMAC_INT_CTL_REG);
    644
    645			/* had one stuck? */
    646			rxcount = readl(db->membase + EMAC_RX_FBC_REG);
    647			if (!rxcount)
    648				return;
    649		}
    650
    651		reg_val = readl(db->membase + EMAC_RX_IO_DATA_REG);
    652		if (netif_msg_rx_status(db))
    653			dev_dbg(db->dev, "receive header: %x\n", reg_val);
    654		if (reg_val != EMAC_UNDOCUMENTED_MAGIC) {
    655			/* disable RX */
    656			reg_val = readl(db->membase + EMAC_CTL_REG);
    657			writel(reg_val & ~EMAC_CTL_RX_EN,
    658			       db->membase + EMAC_CTL_REG);
    659
    660			/* Flush RX FIFO */
    661			reg_val = readl(db->membase + EMAC_RX_CTL_REG);
    662			writel(reg_val | (1 << 3),
    663			       db->membase + EMAC_RX_CTL_REG);
    664
    665			do {
    666				reg_val = readl(db->membase + EMAC_RX_CTL_REG);
    667			} while (reg_val & (1 << 3));
    668
    669			/* enable RX */
    670			reg_val = readl(db->membase + EMAC_CTL_REG);
    671			writel(reg_val | EMAC_CTL_RX_EN,
    672			       db->membase + EMAC_CTL_REG);
    673			reg_val = readl(db->membase + EMAC_INT_CTL_REG);
    674			reg_val |= (EMAC_INT_CTL_TX_EN |
    675					EMAC_INT_CTL_TX_ABRT_EN |
    676					EMAC_INT_CTL_RX_EN);
    677			writel(reg_val, db->membase + EMAC_INT_CTL_REG);
    678
    679			db->emacrx_completed_flag = 1;
    680
    681			return;
    682		}
    683
    684		/* A packet ready now  & Get status/length */
    685		good_packet = true;
    686
    687		rxhdr = readl(db->membase + EMAC_RX_IO_DATA_REG);
    688
    689		if (netif_msg_rx_status(db))
    690			dev_dbg(db->dev, "rxhdr: %x\n", *((int *)(&rxhdr)));
    691
    692		rxlen = EMAC_RX_IO_DATA_LEN(rxhdr);
    693		rxstatus = EMAC_RX_IO_DATA_STATUS(rxhdr);
    694
    695		if (netif_msg_rx_status(db))
    696			dev_dbg(db->dev, "RX: status %02x, length %04x\n",
    697				rxstatus, rxlen);
    698
    699		/* Packet Status check */
    700		if (rxlen < 0x40) {
    701			good_packet = false;
    702			if (netif_msg_rx_err(db))
    703				dev_dbg(db->dev, "RX: Bad Packet (runt)\n");
    704		}
    705
    706		if (unlikely(!(rxstatus & EMAC_RX_IO_DATA_STATUS_OK))) {
    707			good_packet = false;
    708
    709			if (rxstatus & EMAC_RX_IO_DATA_STATUS_CRC_ERR) {
    710				if (netif_msg_rx_err(db))
    711					dev_dbg(db->dev, "crc error\n");
    712				dev->stats.rx_crc_errors++;
    713			}
    714
    715			if (rxstatus & EMAC_RX_IO_DATA_STATUS_LEN_ERR) {
    716				if (netif_msg_rx_err(db))
    717					dev_dbg(db->dev, "length error\n");
    718				dev->stats.rx_length_errors++;
    719			}
    720		}
    721
    722		/* Move data from EMAC */
    723		if (good_packet) {
    724			skb = netdev_alloc_skb(dev, rxlen + 4);
    725			if (!skb)
    726				continue;
    727			skb_reserve(skb, 2);
    728			rdptr = skb_put(skb, rxlen - 4);
    729
    730			/* Read received packet from RX SRAM */
    731			if (netif_msg_rx_status(db))
    732				dev_dbg(db->dev, "RxLen %x\n", rxlen);
    733
    734			if (rxlen >= dev->mtu && db->rx_chan) {
    735				reg_val = readl(db->membase + EMAC_RX_CTL_REG);
    736				reg_val |= EMAC_RX_CTL_DMA_EN;
    737				writel(reg_val, db->membase + EMAC_RX_CTL_REG);
    738				if (!emac_dma_inblk_32bit(db, skb, rdptr, rxlen))
    739					break;
    740
    741				/* re enable cpu receive. then try to receive by emac_inblk_32bit */
    742				reg_val = readl(db->membase + EMAC_RX_CTL_REG);
    743				reg_val &= ~EMAC_RX_CTL_DMA_EN;
    744				writel(reg_val, db->membase + EMAC_RX_CTL_REG);
    745			}
    746
    747			emac_inblk_32bit(db->membase + EMAC_RX_IO_DATA_REG,
    748					rdptr, rxlen);
    749			dev->stats.rx_bytes += rxlen;
    750
    751			/* Pass to upper layer */
    752			skb->protocol = eth_type_trans(skb, dev);
    753			netif_rx(skb);
    754			dev->stats.rx_packets++;
    755		}
    756	}
    757}
    758
    759static irqreturn_t emac_interrupt(int irq, void *dev_id)
    760{
    761	struct net_device *dev = dev_id;
    762	struct emac_board_info *db = netdev_priv(dev);
    763	int int_status;
    764	unsigned int reg_val;
    765
    766	/* A real interrupt coming */
    767
    768	spin_lock(&db->lock);
    769
    770	/* Disable all interrupts */
    771	writel(0, db->membase + EMAC_INT_CTL_REG);
    772
    773	/* Got EMAC interrupt status */
    774	/* Got ISR */
    775	int_status = readl(db->membase + EMAC_INT_STA_REG);
    776	/* Clear ISR status */
    777	writel(int_status, db->membase + EMAC_INT_STA_REG);
    778
    779	if (netif_msg_intr(db))
    780		dev_dbg(db->dev, "emac interrupt %02x\n", int_status);
    781
    782	/* Received the coming packet */
    783	if ((int_status & 0x100) && (db->emacrx_completed_flag == 1)) {
    784		/* carrier lost */
    785		db->emacrx_completed_flag = 0;
    786		emac_rx(dev);
    787	}
    788
    789	/* Transmit Interrupt check */
    790	if (int_status & EMAC_INT_STA_TX_COMPLETE)
    791		emac_tx_done(dev, db, int_status);
    792
    793	if (int_status & EMAC_INT_STA_TX_ABRT)
    794		netdev_info(dev, " ab : %x\n", int_status);
    795
    796	/* Re-enable interrupt mask */
    797	if (db->emacrx_completed_flag == 1) {
    798		reg_val = readl(db->membase + EMAC_INT_CTL_REG);
    799		reg_val |= (EMAC_INT_CTL_TX_EN | EMAC_INT_CTL_TX_ABRT_EN | EMAC_INT_CTL_RX_EN);
    800		writel(reg_val, db->membase + EMAC_INT_CTL_REG);
    801	} else {
    802		reg_val = readl(db->membase + EMAC_INT_CTL_REG);
    803		reg_val |= (EMAC_INT_CTL_TX_EN | EMAC_INT_CTL_TX_ABRT_EN);
    804		writel(reg_val, db->membase + EMAC_INT_CTL_REG);
    805	}
    806
    807	spin_unlock(&db->lock);
    808
    809	return IRQ_HANDLED;
    810}
    811
    812#ifdef CONFIG_NET_POLL_CONTROLLER
    813/*
    814 * Used by netconsole
    815 */
    816static void emac_poll_controller(struct net_device *dev)
    817{
    818	disable_irq(dev->irq);
    819	emac_interrupt(dev->irq, dev);
    820	enable_irq(dev->irq);
    821}
    822#endif
    823
    824/*  Open the interface.
    825 *  The interface is opened whenever "ifconfig" actives it.
    826 */
    827static int emac_open(struct net_device *dev)
    828{
    829	struct emac_board_info *db = netdev_priv(dev);
    830	int ret;
    831
    832	if (netif_msg_ifup(db))
    833		dev_dbg(db->dev, "enabling %s\n", dev->name);
    834
    835	if (request_irq(dev->irq, &emac_interrupt, 0, dev->name, dev))
    836		return -EAGAIN;
    837
    838	/* Initialize EMAC board */
    839	emac_reset(db);
    840	emac_init_device(dev);
    841
    842	ret = emac_mdio_probe(dev);
    843	if (ret < 0) {
    844		free_irq(dev->irq, dev);
    845		netdev_err(dev, "cannot probe MDIO bus\n");
    846		return ret;
    847	}
    848
    849	phy_start(dev->phydev);
    850	netif_start_queue(dev);
    851
    852	return 0;
    853}
    854
    855static void emac_shutdown(struct net_device *dev)
    856{
    857	unsigned int reg_val;
    858	struct emac_board_info *db = netdev_priv(dev);
    859
    860	/* Disable all interrupt */
    861	writel(0, db->membase + EMAC_INT_CTL_REG);
    862
    863	/* clear interrupt status */
    864	reg_val = readl(db->membase + EMAC_INT_STA_REG);
    865	writel(reg_val, db->membase + EMAC_INT_STA_REG);
    866
    867	/* Disable RX/TX */
    868	reg_val = readl(db->membase + EMAC_CTL_REG);
    869	reg_val &= ~(EMAC_CTL_TX_EN | EMAC_CTL_RX_EN | EMAC_CTL_RESET);
    870	writel(reg_val, db->membase + EMAC_CTL_REG);
    871}
    872
    873/* Stop the interface.
    874 * The interface is stopped when it is brought.
    875 */
    876static int emac_stop(struct net_device *ndev)
    877{
    878	struct emac_board_info *db = netdev_priv(ndev);
    879
    880	if (netif_msg_ifdown(db))
    881		dev_dbg(db->dev, "shutting down %s\n", ndev->name);
    882
    883	netif_stop_queue(ndev);
    884	netif_carrier_off(ndev);
    885
    886	phy_stop(ndev->phydev);
    887
    888	emac_mdio_remove(ndev);
    889
    890	emac_shutdown(ndev);
    891
    892	free_irq(ndev->irq, ndev);
    893
    894	return 0;
    895}
    896
    897static const struct net_device_ops emac_netdev_ops = {
    898	.ndo_open		= emac_open,
    899	.ndo_stop		= emac_stop,
    900	.ndo_start_xmit		= emac_start_xmit,
    901	.ndo_tx_timeout		= emac_timeout,
    902	.ndo_set_rx_mode	= emac_set_rx_mode,
    903	.ndo_eth_ioctl		= phy_do_ioctl_running,
    904	.ndo_validate_addr	= eth_validate_addr,
    905	.ndo_set_mac_address	= emac_set_mac_address,
    906#ifdef CONFIG_NET_POLL_CONTROLLER
    907	.ndo_poll_controller	= emac_poll_controller,
    908#endif
    909};
    910
    911static int emac_configure_dma(struct emac_board_info *db)
    912{
    913	struct platform_device *pdev = db->pdev;
    914	struct net_device *ndev = db->ndev;
    915	struct dma_slave_config conf = {};
    916	struct resource *regs;
    917	int err = 0;
    918
    919	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    920	if (!regs) {
    921		netdev_err(ndev, "get io resource from device failed.\n");
    922		err = -ENOMEM;
    923		goto out_clear_chan;
    924	}
    925
    926	netdev_info(ndev, "get io resource from device: %pa, size = %u\n",
    927		    &regs->start, (unsigned int)resource_size(regs));
    928	db->emac_rx_fifo = regs->start + EMAC_RX_IO_DATA_REG;
    929
    930	db->rx_chan = dma_request_chan(&pdev->dev, "rx");
    931	if (IS_ERR(db->rx_chan)) {
    932		netdev_err(ndev,
    933			   "failed to request dma channel. dma is disabled\n");
    934		err = PTR_ERR(db->rx_chan);
    935		goto out_clear_chan;
    936	}
    937
    938	conf.direction = DMA_DEV_TO_MEM;
    939	conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
    940	conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
    941	conf.src_addr = db->emac_rx_fifo;
    942	conf.dst_maxburst = 4;
    943	conf.src_maxburst = 4;
    944	conf.device_fc = false;
    945
    946	err = dmaengine_slave_config(db->rx_chan, &conf);
    947	if (err) {
    948		netdev_err(ndev, "config dma slave failed\n");
    949		err = -EINVAL;
    950		goto out_slave_configure_err;
    951	}
    952
    953	return err;
    954
    955out_slave_configure_err:
    956	dma_release_channel(db->rx_chan);
    957
    958out_clear_chan:
    959	db->rx_chan = NULL;
    960	return err;
    961}
    962
    963/* Search EMAC board, allocate space and register it
    964 */
    965static int emac_probe(struct platform_device *pdev)
    966{
    967	struct device_node *np = pdev->dev.of_node;
    968	struct emac_board_info *db;
    969	struct net_device *ndev;
    970	int ret = 0;
    971
    972	ndev = alloc_etherdev(sizeof(struct emac_board_info));
    973	if (!ndev) {
    974		dev_err(&pdev->dev, "could not allocate device.\n");
    975		return -ENOMEM;
    976	}
    977
    978	SET_NETDEV_DEV(ndev, &pdev->dev);
    979
    980	db = netdev_priv(ndev);
    981
    982	db->dev = &pdev->dev;
    983	db->ndev = ndev;
    984	db->pdev = pdev;
    985	db->msg_enable = netif_msg_init(debug, EMAC_DEFAULT_MSG_ENABLE);
    986
    987	spin_lock_init(&db->lock);
    988
    989	db->membase = of_iomap(np, 0);
    990	if (!db->membase) {
    991		dev_err(&pdev->dev, "failed to remap registers\n");
    992		ret = -ENOMEM;
    993		goto out;
    994	}
    995
    996	/* fill in parameters for net-dev structure */
    997	ndev->base_addr = (unsigned long)db->membase;
    998	ndev->irq = irq_of_parse_and_map(np, 0);
    999	if (ndev->irq == -ENXIO) {
   1000		netdev_err(ndev, "No irq resource\n");
   1001		ret = ndev->irq;
   1002		goto out_iounmap;
   1003	}
   1004
   1005	if (emac_configure_dma(db))
   1006		netdev_info(ndev, "configure dma failed. disable dma.\n");
   1007
   1008	db->clk = devm_clk_get(&pdev->dev, NULL);
   1009	if (IS_ERR(db->clk)) {
   1010		ret = PTR_ERR(db->clk);
   1011		goto out_dispose_mapping;
   1012	}
   1013
   1014	ret = clk_prepare_enable(db->clk);
   1015	if (ret) {
   1016		dev_err(&pdev->dev, "Error couldn't enable clock (%d)\n", ret);
   1017		goto out_dispose_mapping;
   1018	}
   1019
   1020	ret = sunxi_sram_claim(&pdev->dev);
   1021	if (ret) {
   1022		dev_err(&pdev->dev, "Error couldn't map SRAM to device\n");
   1023		goto out_clk_disable_unprepare;
   1024	}
   1025
   1026	db->phy_node = of_parse_phandle(np, "phy-handle", 0);
   1027	if (!db->phy_node)
   1028		db->phy_node = of_parse_phandle(np, "phy", 0);
   1029	if (!db->phy_node) {
   1030		dev_err(&pdev->dev, "no associated PHY\n");
   1031		ret = -ENODEV;
   1032		goto out_release_sram;
   1033	}
   1034
   1035	/* Read MAC-address from DT */
   1036	ret = of_get_ethdev_address(np, ndev);
   1037	if (ret) {
   1038		/* if the MAC address is invalid get a random one */
   1039		eth_hw_addr_random(ndev);
   1040		dev_warn(&pdev->dev, "using random MAC address %pM\n",
   1041			 ndev->dev_addr);
   1042	}
   1043
   1044	db->emacrx_completed_flag = 1;
   1045	emac_powerup(ndev);
   1046	emac_reset(db);
   1047
   1048	ndev->netdev_ops = &emac_netdev_ops;
   1049	ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
   1050	ndev->ethtool_ops = &emac_ethtool_ops;
   1051
   1052	platform_set_drvdata(pdev, ndev);
   1053
   1054	/* Carrier starts down, phylib will bring it up */
   1055	netif_carrier_off(ndev);
   1056
   1057	ret = register_netdev(ndev);
   1058	if (ret) {
   1059		dev_err(&pdev->dev, "Registering netdev failed!\n");
   1060		ret = -ENODEV;
   1061		goto out_release_sram;
   1062	}
   1063
   1064	dev_info(&pdev->dev, "%s: at %p, IRQ %d MAC: %pM\n",
   1065		 ndev->name, db->membase, ndev->irq, ndev->dev_addr);
   1066
   1067	return 0;
   1068
   1069out_release_sram:
   1070	sunxi_sram_release(&pdev->dev);
   1071out_clk_disable_unprepare:
   1072	clk_disable_unprepare(db->clk);
   1073out_dispose_mapping:
   1074	irq_dispose_mapping(ndev->irq);
   1075	dma_release_channel(db->rx_chan);
   1076out_iounmap:
   1077	iounmap(db->membase);
   1078out:
   1079	dev_err(db->dev, "not found (%d).\n", ret);
   1080
   1081	free_netdev(ndev);
   1082
   1083	return ret;
   1084}
   1085
   1086static int emac_remove(struct platform_device *pdev)
   1087{
   1088	struct net_device *ndev = platform_get_drvdata(pdev);
   1089	struct emac_board_info *db = netdev_priv(ndev);
   1090
   1091	if (db->rx_chan) {
   1092		dmaengine_terminate_all(db->rx_chan);
   1093		dma_release_channel(db->rx_chan);
   1094	}
   1095
   1096	unregister_netdev(ndev);
   1097	sunxi_sram_release(&pdev->dev);
   1098	clk_disable_unprepare(db->clk);
   1099	irq_dispose_mapping(ndev->irq);
   1100	iounmap(db->membase);
   1101	free_netdev(ndev);
   1102
   1103	dev_dbg(&pdev->dev, "released and freed device\n");
   1104	return 0;
   1105}
   1106
   1107static int emac_suspend(struct platform_device *dev, pm_message_t state)
   1108{
   1109	struct net_device *ndev = platform_get_drvdata(dev);
   1110
   1111	netif_carrier_off(ndev);
   1112	netif_device_detach(ndev);
   1113	emac_shutdown(ndev);
   1114
   1115	return 0;
   1116}
   1117
   1118static int emac_resume(struct platform_device *dev)
   1119{
   1120	struct net_device *ndev = platform_get_drvdata(dev);
   1121	struct emac_board_info *db = netdev_priv(ndev);
   1122
   1123	emac_reset(db);
   1124	emac_init_device(ndev);
   1125	netif_device_attach(ndev);
   1126
   1127	return 0;
   1128}
   1129
   1130static const struct of_device_id emac_of_match[] = {
   1131	{.compatible = "allwinner,sun4i-a10-emac",},
   1132
   1133	/* Deprecated */
   1134	{.compatible = "allwinner,sun4i-emac",},
   1135	{},
   1136};
   1137
   1138MODULE_DEVICE_TABLE(of, emac_of_match);
   1139
   1140static struct platform_driver emac_driver = {
   1141	.driver = {
   1142		.name = "sun4i-emac",
   1143		.of_match_table = emac_of_match,
   1144	},
   1145	.probe = emac_probe,
   1146	.remove = emac_remove,
   1147	.suspend = emac_suspend,
   1148	.resume = emac_resume,
   1149};
   1150
   1151module_platform_driver(emac_driver);
   1152
   1153MODULE_AUTHOR("Stefan Roese <sr@denx.de>");
   1154MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
   1155MODULE_DESCRIPTION("Allwinner A10 emac network driver");
   1156MODULE_LICENSE("GPL");