0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <linux/clk.h>
0016 #include <linux/etherdevice.h>
0017 #include <linux/ethtool.h>
0018 #include <linux/gpio.h>
0019 #include <linux/interrupt.h>
0020 #include <linux/irq.h>
0021 #include <linux/mii.h>
0022 #include <linux/module.h>
0023 #include <linux/netdevice.h>
0024 #include <linux/of_address.h>
0025 #include <linux/of_irq.h>
0026 #include <linux/of_mdio.h>
0027 #include <linux/of_net.h>
0028 #include <linux/of_platform.h>
0029 #include <linux/platform_device.h>
0030 #include <linux/phy.h>
0031 #include <linux/soc/sunxi/sunxi_sram.h>
0032 #include <linux/dmaengine.h>
0033
0034 #include "sun4i-emac.h"
0035
0036 #define DRV_NAME "sun4i-emac"
0037
0038 #define EMAC_MAX_FRAME_LEN 0x0600
0039
0040 #define EMAC_DEFAULT_MSG_ENABLE 0x0000
0041 static int debug = -1; ;
0042 module_param(debug, int, 0);
0043 MODULE_PARM_DESC(debug, "debug message flags");
0044
0045
0046 static int watchdog = 5000;
0047 module_param(watchdog, int, 0400);
0048 MODULE_PARM_DESC(watchdog, "transmit timeout in milliseconds");
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 struct emac_board_info {
0073 struct clk *clk;
0074 struct device *dev;
0075 struct platform_device *pdev;
0076 spinlock_t lock;
0077 void __iomem *membase;
0078 u32 msg_enable;
0079 struct net_device *ndev;
0080 u16 tx_fifo_stat;
0081
0082 int emacrx_completed_flag;
0083
0084 struct device_node *phy_node;
0085 unsigned int link;
0086 unsigned int speed;
0087 unsigned int duplex;
0088
0089 phy_interface_t phy_interface;
0090 struct dma_chan *rx_chan;
0091 phys_addr_t emac_rx_fifo;
0092 };
0093
0094 struct emac_dma_req {
0095 struct emac_board_info *db;
0096 struct dma_async_tx_descriptor *desc;
0097 struct sk_buff *skb;
0098 dma_addr_t rxbuf;
0099 int count;
0100 };
0101
0102 static void emac_update_speed(struct net_device *dev)
0103 {
0104 struct emac_board_info *db = netdev_priv(dev);
0105 unsigned int reg_val;
0106
0107
0108 reg_val = readl(db->membase + EMAC_MAC_SUPP_REG);
0109 reg_val &= ~EMAC_MAC_SUPP_100M;
0110 if (db->speed == SPEED_100)
0111 reg_val |= EMAC_MAC_SUPP_100M;
0112 writel(reg_val, db->membase + EMAC_MAC_SUPP_REG);
0113 }
0114
0115 static void emac_update_duplex(struct net_device *dev)
0116 {
0117 struct emac_board_info *db = netdev_priv(dev);
0118 unsigned int reg_val;
0119
0120
0121 reg_val = readl(db->membase + EMAC_MAC_CTL1_REG);
0122 reg_val &= ~EMAC_MAC_CTL1_DUPLEX_EN;
0123 if (db->duplex)
0124 reg_val |= EMAC_MAC_CTL1_DUPLEX_EN;
0125 writel(reg_val, db->membase + EMAC_MAC_CTL1_REG);
0126 }
0127
0128 static void emac_handle_link_change(struct net_device *dev)
0129 {
0130 struct emac_board_info *db = netdev_priv(dev);
0131 struct phy_device *phydev = dev->phydev;
0132 unsigned long flags;
0133 int status_change = 0;
0134
0135 if (phydev->link) {
0136 if (db->speed != phydev->speed) {
0137 spin_lock_irqsave(&db->lock, flags);
0138 db->speed = phydev->speed;
0139 emac_update_speed(dev);
0140 spin_unlock_irqrestore(&db->lock, flags);
0141 status_change = 1;
0142 }
0143
0144 if (db->duplex != phydev->duplex) {
0145 spin_lock_irqsave(&db->lock, flags);
0146 db->duplex = phydev->duplex;
0147 emac_update_duplex(dev);
0148 spin_unlock_irqrestore(&db->lock, flags);
0149 status_change = 1;
0150 }
0151 }
0152
0153 if (phydev->link != db->link) {
0154 if (!phydev->link) {
0155 db->speed = 0;
0156 db->duplex = -1;
0157 }
0158 db->link = phydev->link;
0159
0160 status_change = 1;
0161 }
0162
0163 if (status_change)
0164 phy_print_status(phydev);
0165 }
0166
0167 static int emac_mdio_probe(struct net_device *dev)
0168 {
0169 struct emac_board_info *db = netdev_priv(dev);
0170 struct phy_device *phydev;
0171
0172
0173
0174
0175 phydev = of_phy_connect(db->ndev, db->phy_node,
0176 &emac_handle_link_change, 0,
0177 db->phy_interface);
0178 if (!phydev) {
0179 netdev_err(db->ndev, "could not find the PHY\n");
0180 return -ENODEV;
0181 }
0182
0183
0184 phy_set_max_speed(phydev, SPEED_100);
0185
0186 db->link = 0;
0187 db->speed = 0;
0188 db->duplex = -1;
0189
0190 return 0;
0191 }
0192
0193 static void emac_mdio_remove(struct net_device *dev)
0194 {
0195 phy_disconnect(dev->phydev);
0196 }
0197
0198 static void emac_reset(struct emac_board_info *db)
0199 {
0200 dev_dbg(db->dev, "resetting device\n");
0201
0202
0203 writel(0, db->membase + EMAC_CTL_REG);
0204 udelay(200);
0205 writel(EMAC_CTL_RESET, db->membase + EMAC_CTL_REG);
0206 udelay(200);
0207 }
0208
0209 static void emac_outblk_32bit(void __iomem *reg, void *data, int count)
0210 {
0211 writesl(reg, data, round_up(count, 4) / 4);
0212 }
0213
0214 static void emac_inblk_32bit(void __iomem *reg, void *data, int count)
0215 {
0216 readsl(reg, data, round_up(count, 4) / 4);
0217 }
0218
0219 static struct emac_dma_req *
0220 emac_alloc_dma_req(struct emac_board_info *db,
0221 struct dma_async_tx_descriptor *desc, struct sk_buff *skb,
0222 dma_addr_t rxbuf, int count)
0223 {
0224 struct emac_dma_req *req;
0225
0226 req = kzalloc(sizeof(struct emac_dma_req), GFP_ATOMIC);
0227 if (!req)
0228 return NULL;
0229
0230 req->db = db;
0231 req->desc = desc;
0232 req->skb = skb;
0233 req->rxbuf = rxbuf;
0234 req->count = count;
0235 return req;
0236 }
0237
0238 static void emac_free_dma_req(struct emac_dma_req *req)
0239 {
0240 kfree(req);
0241 }
0242
0243 static void emac_dma_done_callback(void *arg)
0244 {
0245 struct emac_dma_req *req = arg;
0246 struct emac_board_info *db = req->db;
0247 struct sk_buff *skb = req->skb;
0248 struct net_device *dev = db->ndev;
0249 int rxlen = req->count;
0250 u32 reg_val;
0251
0252 dma_unmap_single(db->dev, req->rxbuf, rxlen, DMA_FROM_DEVICE);
0253
0254 skb->protocol = eth_type_trans(skb, dev);
0255 netif_rx(skb);
0256 dev->stats.rx_bytes += rxlen;
0257
0258 dev->stats.rx_packets++;
0259
0260
0261 reg_val = readl(db->membase + EMAC_RX_CTL_REG);
0262 reg_val &= ~EMAC_RX_CTL_DMA_EN;
0263 writel(reg_val, db->membase + EMAC_RX_CTL_REG);
0264
0265
0266 reg_val = readl(db->membase + EMAC_INT_CTL_REG);
0267 reg_val |= EMAC_INT_CTL_RX_EN;
0268 writel(reg_val, db->membase + EMAC_INT_CTL_REG);
0269
0270 db->emacrx_completed_flag = 1;
0271 emac_free_dma_req(req);
0272 }
0273
0274 static int emac_dma_inblk_32bit(struct emac_board_info *db,
0275 struct sk_buff *skb, void *rdptr, int count)
0276 {
0277 struct dma_async_tx_descriptor *desc;
0278 dma_cookie_t cookie;
0279 dma_addr_t rxbuf;
0280 struct emac_dma_req *req;
0281 int ret = 0;
0282
0283 rxbuf = dma_map_single(db->dev, rdptr, count, DMA_FROM_DEVICE);
0284 ret = dma_mapping_error(db->dev, rxbuf);
0285 if (ret) {
0286 dev_err(db->dev, "dma mapping error.\n");
0287 return ret;
0288 }
0289
0290 desc = dmaengine_prep_slave_single(db->rx_chan, rxbuf, count,
0291 DMA_DEV_TO_MEM,
0292 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
0293 if (!desc) {
0294 dev_err(db->dev, "prepare slave single failed\n");
0295 ret = -ENOMEM;
0296 goto prepare_err;
0297 }
0298
0299 req = emac_alloc_dma_req(db, desc, skb, rxbuf, count);
0300 if (!req) {
0301 dev_err(db->dev, "alloc emac dma req error.\n");
0302 ret = -ENOMEM;
0303 goto alloc_req_err;
0304 }
0305
0306 desc->callback_param = req;
0307 desc->callback = emac_dma_done_callback;
0308
0309 cookie = dmaengine_submit(desc);
0310 ret = dma_submit_error(cookie);
0311 if (ret) {
0312 dev_err(db->dev, "dma submit error.\n");
0313 goto submit_err;
0314 }
0315
0316 dma_async_issue_pending(db->rx_chan);
0317 return ret;
0318
0319 submit_err:
0320 emac_free_dma_req(req);
0321
0322 alloc_req_err:
0323 dmaengine_desc_free(desc);
0324
0325 prepare_err:
0326 dma_unmap_single(db->dev, rxbuf, count, DMA_FROM_DEVICE);
0327 return ret;
0328 }
0329
0330
0331 static void emac_get_drvinfo(struct net_device *dev,
0332 struct ethtool_drvinfo *info)
0333 {
0334 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
0335 strlcpy(info->bus_info, dev_name(&dev->dev), sizeof(info->bus_info));
0336 }
0337
0338 static u32 emac_get_msglevel(struct net_device *dev)
0339 {
0340 struct emac_board_info *db = netdev_priv(dev);
0341
0342 return db->msg_enable;
0343 }
0344
0345 static void emac_set_msglevel(struct net_device *dev, u32 value)
0346 {
0347 struct emac_board_info *db = netdev_priv(dev);
0348
0349 db->msg_enable = value;
0350 }
0351
0352 static const struct ethtool_ops emac_ethtool_ops = {
0353 .get_drvinfo = emac_get_drvinfo,
0354 .get_link = ethtool_op_get_link,
0355 .get_link_ksettings = phy_ethtool_get_link_ksettings,
0356 .set_link_ksettings = phy_ethtool_set_link_ksettings,
0357 .get_msglevel = emac_get_msglevel,
0358 .set_msglevel = emac_set_msglevel,
0359 };
0360
0361 static unsigned int emac_setup(struct net_device *ndev)
0362 {
0363 struct emac_board_info *db = netdev_priv(ndev);
0364 unsigned int reg_val;
0365
0366
0367 reg_val = readl(db->membase + EMAC_TX_MODE_REG);
0368
0369 writel(reg_val | EMAC_TX_MODE_ABORTED_FRAME_EN,
0370 db->membase + EMAC_TX_MODE_REG);
0371
0372
0373
0374 reg_val = readl(db->membase + EMAC_MAC_CTL0_REG);
0375 writel(reg_val | EMAC_MAC_CTL0_RX_FLOW_CTL_EN |
0376 EMAC_MAC_CTL0_TX_FLOW_CTL_EN,
0377 db->membase + EMAC_MAC_CTL0_REG);
0378
0379
0380 reg_val = readl(db->membase + EMAC_MAC_CTL1_REG);
0381 reg_val |= EMAC_MAC_CTL1_LEN_CHECK_EN;
0382 reg_val |= EMAC_MAC_CTL1_CRC_EN;
0383 reg_val |= EMAC_MAC_CTL1_PAD_EN;
0384 writel(reg_val, db->membase + EMAC_MAC_CTL1_REG);
0385
0386
0387 writel(EMAC_MAC_IPGT_FULL_DUPLEX, db->membase + EMAC_MAC_IPGT_REG);
0388
0389
0390 writel((EMAC_MAC_IPGR_IPG1 << 8) | EMAC_MAC_IPGR_IPG2,
0391 db->membase + EMAC_MAC_IPGR_REG);
0392
0393
0394 writel((EMAC_MAC_CLRT_COLLISION_WINDOW << 8) | EMAC_MAC_CLRT_RM,
0395 db->membase + EMAC_MAC_CLRT_REG);
0396
0397
0398 writel(EMAC_MAX_FRAME_LEN,
0399 db->membase + EMAC_MAC_MAXF_REG);
0400
0401 return 0;
0402 }
0403
0404 static void emac_set_rx_mode(struct net_device *ndev)
0405 {
0406 struct emac_board_info *db = netdev_priv(ndev);
0407 unsigned int reg_val;
0408
0409
0410 reg_val = readl(db->membase + EMAC_RX_CTL_REG);
0411
0412 if (ndev->flags & IFF_PROMISC)
0413 reg_val |= EMAC_RX_CTL_PASS_ALL_EN;
0414 else
0415 reg_val &= ~EMAC_RX_CTL_PASS_ALL_EN;
0416
0417 writel(reg_val | EMAC_RX_CTL_PASS_LEN_OOR_EN |
0418 EMAC_RX_CTL_ACCEPT_UNICAST_EN | EMAC_RX_CTL_DA_FILTER_EN |
0419 EMAC_RX_CTL_ACCEPT_MULTICAST_EN |
0420 EMAC_RX_CTL_ACCEPT_BROADCAST_EN,
0421 db->membase + EMAC_RX_CTL_REG);
0422 }
0423
0424 static unsigned int emac_powerup(struct net_device *ndev)
0425 {
0426 struct emac_board_info *db = netdev_priv(ndev);
0427 unsigned int reg_val;
0428
0429
0430
0431 reg_val = readl(db->membase + EMAC_RX_CTL_REG);
0432 reg_val |= EMAC_RX_CTL_FLUSH_FIFO;
0433 writel(reg_val, db->membase + EMAC_RX_CTL_REG);
0434 udelay(1);
0435
0436
0437
0438 reg_val = readl(db->membase + EMAC_MAC_CTL0_REG);
0439 reg_val &= ~EMAC_MAC_CTL0_SOFT_RESET;
0440 writel(reg_val, db->membase + EMAC_MAC_CTL0_REG);
0441
0442
0443 reg_val = readl(db->membase + EMAC_MAC_MCFG_REG);
0444 reg_val &= ~EMAC_MAC_MCFG_MII_CLKD_MASK;
0445 reg_val |= EMAC_MAC_MCFG_MII_CLKD_72;
0446 writel(reg_val, db->membase + EMAC_MAC_MCFG_REG);
0447
0448
0449 writel(0x0, db->membase + EMAC_RX_FBC_REG);
0450
0451
0452 writel(0, db->membase + EMAC_INT_CTL_REG);
0453 reg_val = readl(db->membase + EMAC_INT_STA_REG);
0454 writel(reg_val, db->membase + EMAC_INT_STA_REG);
0455
0456 udelay(1);
0457
0458
0459 emac_setup(ndev);
0460
0461
0462 writel(ndev->dev_addr[0] << 16 | ndev->dev_addr[1] << 8 | ndev->
0463 dev_addr[2], db->membase + EMAC_MAC_A1_REG);
0464 writel(ndev->dev_addr[3] << 16 | ndev->dev_addr[4] << 8 | ndev->
0465 dev_addr[5], db->membase + EMAC_MAC_A0_REG);
0466
0467 mdelay(1);
0468
0469 return 0;
0470 }
0471
0472 static int emac_set_mac_address(struct net_device *dev, void *p)
0473 {
0474 struct sockaddr *addr = p;
0475 struct emac_board_info *db = netdev_priv(dev);
0476
0477 if (netif_running(dev))
0478 return -EBUSY;
0479
0480 eth_hw_addr_set(dev, addr->sa_data);
0481
0482 writel(dev->dev_addr[0] << 16 | dev->dev_addr[1] << 8 | dev->
0483 dev_addr[2], db->membase + EMAC_MAC_A1_REG);
0484 writel(dev->dev_addr[3] << 16 | dev->dev_addr[4] << 8 | dev->
0485 dev_addr[5], db->membase + EMAC_MAC_A0_REG);
0486
0487 return 0;
0488 }
0489
0490
0491 static void emac_init_device(struct net_device *dev)
0492 {
0493 struct emac_board_info *db = netdev_priv(dev);
0494 unsigned long flags;
0495 unsigned int reg_val;
0496
0497 spin_lock_irqsave(&db->lock, flags);
0498
0499 emac_update_speed(dev);
0500 emac_update_duplex(dev);
0501
0502
0503 reg_val = readl(db->membase + EMAC_CTL_REG);
0504 writel(reg_val | EMAC_CTL_RESET | EMAC_CTL_TX_EN | EMAC_CTL_RX_EN,
0505 db->membase + EMAC_CTL_REG);
0506
0507
0508 reg_val = readl(db->membase + EMAC_INT_CTL_REG);
0509 reg_val |= (EMAC_INT_CTL_TX_EN | EMAC_INT_CTL_TX_ABRT_EN | EMAC_INT_CTL_RX_EN);
0510 writel(reg_val, db->membase + EMAC_INT_CTL_REG);
0511
0512 spin_unlock_irqrestore(&db->lock, flags);
0513 }
0514
0515
0516 static void emac_timeout(struct net_device *dev, unsigned int txqueue)
0517 {
0518 struct emac_board_info *db = netdev_priv(dev);
0519 unsigned long flags;
0520
0521 if (netif_msg_timer(db))
0522 dev_err(db->dev, "tx time out.\n");
0523
0524
0525 spin_lock_irqsave(&db->lock, flags);
0526
0527 netif_stop_queue(dev);
0528 emac_reset(db);
0529 emac_init_device(dev);
0530
0531 netif_trans_update(dev);
0532 netif_wake_queue(dev);
0533
0534
0535 spin_unlock_irqrestore(&db->lock, flags);
0536 }
0537
0538
0539
0540
0541 static netdev_tx_t emac_start_xmit(struct sk_buff *skb, struct net_device *dev)
0542 {
0543 struct emac_board_info *db = netdev_priv(dev);
0544 unsigned long channel;
0545 unsigned long flags;
0546
0547 channel = db->tx_fifo_stat & 3;
0548 if (channel == 3)
0549 return NETDEV_TX_BUSY;
0550
0551 channel = (channel == 1 ? 1 : 0);
0552
0553 spin_lock_irqsave(&db->lock, flags);
0554
0555 writel(channel, db->membase + EMAC_TX_INS_REG);
0556
0557 emac_outblk_32bit(db->membase + EMAC_TX_IO_DATA_REG,
0558 skb->data, skb->len);
0559 dev->stats.tx_bytes += skb->len;
0560
0561 db->tx_fifo_stat |= 1 << channel;
0562
0563 if (channel == 0) {
0564
0565 writel(skb->len, db->membase + EMAC_TX_PL0_REG);
0566
0567 writel(readl(db->membase + EMAC_TX_CTL0_REG) | 1,
0568 db->membase + EMAC_TX_CTL0_REG);
0569
0570
0571 netif_trans_update(dev);
0572 } else if (channel == 1) {
0573
0574 writel(skb->len, db->membase + EMAC_TX_PL1_REG);
0575
0576 writel(readl(db->membase + EMAC_TX_CTL1_REG) | 1,
0577 db->membase + EMAC_TX_CTL1_REG);
0578
0579
0580 netif_trans_update(dev);
0581 }
0582
0583 if ((db->tx_fifo_stat & 3) == 3) {
0584
0585 netif_stop_queue(dev);
0586 }
0587
0588 spin_unlock_irqrestore(&db->lock, flags);
0589
0590
0591 dev_consume_skb_any(skb);
0592
0593 return NETDEV_TX_OK;
0594 }
0595
0596
0597
0598
0599 static void emac_tx_done(struct net_device *dev, struct emac_board_info *db,
0600 unsigned int tx_status)
0601 {
0602
0603 db->tx_fifo_stat &= ~(tx_status & 3);
0604 if (3 == (tx_status & 3))
0605 dev->stats.tx_packets += 2;
0606 else
0607 dev->stats.tx_packets++;
0608
0609 if (netif_msg_tx_done(db))
0610 dev_dbg(db->dev, "tx done, NSR %02x\n", tx_status);
0611
0612 netif_wake_queue(dev);
0613 }
0614
0615
0616
0617 static void emac_rx(struct net_device *dev)
0618 {
0619 struct emac_board_info *db = netdev_priv(dev);
0620 struct sk_buff *skb;
0621 u8 *rdptr;
0622 bool good_packet;
0623 unsigned int reg_val;
0624 u32 rxhdr, rxstatus, rxcount, rxlen;
0625
0626
0627 while (1) {
0628
0629
0630
0631
0632 rxcount = readl(db->membase + EMAC_RX_FBC_REG);
0633
0634 if (netif_msg_rx_status(db))
0635 dev_dbg(db->dev, "RXCount: %x\n", rxcount);
0636
0637 if (!rxcount) {
0638 db->emacrx_completed_flag = 1;
0639 reg_val = readl(db->membase + EMAC_INT_CTL_REG);
0640 reg_val |= (EMAC_INT_CTL_TX_EN |
0641 EMAC_INT_CTL_TX_ABRT_EN |
0642 EMAC_INT_CTL_RX_EN);
0643 writel(reg_val, db->membase + EMAC_INT_CTL_REG);
0644
0645
0646 rxcount = readl(db->membase + EMAC_RX_FBC_REG);
0647 if (!rxcount)
0648 return;
0649 }
0650
0651 reg_val = readl(db->membase + EMAC_RX_IO_DATA_REG);
0652 if (netif_msg_rx_status(db))
0653 dev_dbg(db->dev, "receive header: %x\n", reg_val);
0654 if (reg_val != EMAC_UNDOCUMENTED_MAGIC) {
0655
0656 reg_val = readl(db->membase + EMAC_CTL_REG);
0657 writel(reg_val & ~EMAC_CTL_RX_EN,
0658 db->membase + EMAC_CTL_REG);
0659
0660
0661 reg_val = readl(db->membase + EMAC_RX_CTL_REG);
0662 writel(reg_val | (1 << 3),
0663 db->membase + EMAC_RX_CTL_REG);
0664
0665 do {
0666 reg_val = readl(db->membase + EMAC_RX_CTL_REG);
0667 } while (reg_val & (1 << 3));
0668
0669
0670 reg_val = readl(db->membase + EMAC_CTL_REG);
0671 writel(reg_val | EMAC_CTL_RX_EN,
0672 db->membase + EMAC_CTL_REG);
0673 reg_val = readl(db->membase + EMAC_INT_CTL_REG);
0674 reg_val |= (EMAC_INT_CTL_TX_EN |
0675 EMAC_INT_CTL_TX_ABRT_EN |
0676 EMAC_INT_CTL_RX_EN);
0677 writel(reg_val, db->membase + EMAC_INT_CTL_REG);
0678
0679 db->emacrx_completed_flag = 1;
0680
0681 return;
0682 }
0683
0684
0685 good_packet = true;
0686
0687 rxhdr = readl(db->membase + EMAC_RX_IO_DATA_REG);
0688
0689 if (netif_msg_rx_status(db))
0690 dev_dbg(db->dev, "rxhdr: %x\n", *((int *)(&rxhdr)));
0691
0692 rxlen = EMAC_RX_IO_DATA_LEN(rxhdr);
0693 rxstatus = EMAC_RX_IO_DATA_STATUS(rxhdr);
0694
0695 if (netif_msg_rx_status(db))
0696 dev_dbg(db->dev, "RX: status %02x, length %04x\n",
0697 rxstatus, rxlen);
0698
0699
0700 if (rxlen < 0x40) {
0701 good_packet = false;
0702 if (netif_msg_rx_err(db))
0703 dev_dbg(db->dev, "RX: Bad Packet (runt)\n");
0704 }
0705
0706 if (unlikely(!(rxstatus & EMAC_RX_IO_DATA_STATUS_OK))) {
0707 good_packet = false;
0708
0709 if (rxstatus & EMAC_RX_IO_DATA_STATUS_CRC_ERR) {
0710 if (netif_msg_rx_err(db))
0711 dev_dbg(db->dev, "crc error\n");
0712 dev->stats.rx_crc_errors++;
0713 }
0714
0715 if (rxstatus & EMAC_RX_IO_DATA_STATUS_LEN_ERR) {
0716 if (netif_msg_rx_err(db))
0717 dev_dbg(db->dev, "length error\n");
0718 dev->stats.rx_length_errors++;
0719 }
0720 }
0721
0722
0723 if (good_packet) {
0724 skb = netdev_alloc_skb(dev, rxlen + 4);
0725 if (!skb)
0726 continue;
0727 skb_reserve(skb, 2);
0728 rdptr = skb_put(skb, rxlen - 4);
0729
0730
0731 if (netif_msg_rx_status(db))
0732 dev_dbg(db->dev, "RxLen %x\n", rxlen);
0733
0734 if (rxlen >= dev->mtu && db->rx_chan) {
0735 reg_val = readl(db->membase + EMAC_RX_CTL_REG);
0736 reg_val |= EMAC_RX_CTL_DMA_EN;
0737 writel(reg_val, db->membase + EMAC_RX_CTL_REG);
0738 if (!emac_dma_inblk_32bit(db, skb, rdptr, rxlen))
0739 break;
0740
0741
0742 reg_val = readl(db->membase + EMAC_RX_CTL_REG);
0743 reg_val &= ~EMAC_RX_CTL_DMA_EN;
0744 writel(reg_val, db->membase + EMAC_RX_CTL_REG);
0745 }
0746
0747 emac_inblk_32bit(db->membase + EMAC_RX_IO_DATA_REG,
0748 rdptr, rxlen);
0749 dev->stats.rx_bytes += rxlen;
0750
0751
0752 skb->protocol = eth_type_trans(skb, dev);
0753 netif_rx(skb);
0754 dev->stats.rx_packets++;
0755 }
0756 }
0757 }
0758
0759 static irqreturn_t emac_interrupt(int irq, void *dev_id)
0760 {
0761 struct net_device *dev = dev_id;
0762 struct emac_board_info *db = netdev_priv(dev);
0763 int int_status;
0764 unsigned int reg_val;
0765
0766
0767
0768 spin_lock(&db->lock);
0769
0770
0771 writel(0, db->membase + EMAC_INT_CTL_REG);
0772
0773
0774
0775 int_status = readl(db->membase + EMAC_INT_STA_REG);
0776
0777 writel(int_status, db->membase + EMAC_INT_STA_REG);
0778
0779 if (netif_msg_intr(db))
0780 dev_dbg(db->dev, "emac interrupt %02x\n", int_status);
0781
0782
0783 if ((int_status & 0x100) && (db->emacrx_completed_flag == 1)) {
0784
0785 db->emacrx_completed_flag = 0;
0786 emac_rx(dev);
0787 }
0788
0789
0790 if (int_status & EMAC_INT_STA_TX_COMPLETE)
0791 emac_tx_done(dev, db, int_status);
0792
0793 if (int_status & EMAC_INT_STA_TX_ABRT)
0794 netdev_info(dev, " ab : %x\n", int_status);
0795
0796
0797 if (db->emacrx_completed_flag == 1) {
0798 reg_val = readl(db->membase + EMAC_INT_CTL_REG);
0799 reg_val |= (EMAC_INT_CTL_TX_EN | EMAC_INT_CTL_TX_ABRT_EN | EMAC_INT_CTL_RX_EN);
0800 writel(reg_val, db->membase + EMAC_INT_CTL_REG);
0801 } else {
0802 reg_val = readl(db->membase + EMAC_INT_CTL_REG);
0803 reg_val |= (EMAC_INT_CTL_TX_EN | EMAC_INT_CTL_TX_ABRT_EN);
0804 writel(reg_val, db->membase + EMAC_INT_CTL_REG);
0805 }
0806
0807 spin_unlock(&db->lock);
0808
0809 return IRQ_HANDLED;
0810 }
0811
0812 #ifdef CONFIG_NET_POLL_CONTROLLER
0813
0814
0815
0816 static void emac_poll_controller(struct net_device *dev)
0817 {
0818 disable_irq(dev->irq);
0819 emac_interrupt(dev->irq, dev);
0820 enable_irq(dev->irq);
0821 }
0822 #endif
0823
0824
0825
0826
0827 static int emac_open(struct net_device *dev)
0828 {
0829 struct emac_board_info *db = netdev_priv(dev);
0830 int ret;
0831
0832 if (netif_msg_ifup(db))
0833 dev_dbg(db->dev, "enabling %s\n", dev->name);
0834
0835 if (request_irq(dev->irq, &emac_interrupt, 0, dev->name, dev))
0836 return -EAGAIN;
0837
0838
0839 emac_reset(db);
0840 emac_init_device(dev);
0841
0842 ret = emac_mdio_probe(dev);
0843 if (ret < 0) {
0844 free_irq(dev->irq, dev);
0845 netdev_err(dev, "cannot probe MDIO bus\n");
0846 return ret;
0847 }
0848
0849 phy_start(dev->phydev);
0850 netif_start_queue(dev);
0851
0852 return 0;
0853 }
0854
0855 static void emac_shutdown(struct net_device *dev)
0856 {
0857 unsigned int reg_val;
0858 struct emac_board_info *db = netdev_priv(dev);
0859
0860
0861 writel(0, db->membase + EMAC_INT_CTL_REG);
0862
0863
0864 reg_val = readl(db->membase + EMAC_INT_STA_REG);
0865 writel(reg_val, db->membase + EMAC_INT_STA_REG);
0866
0867
0868 reg_val = readl(db->membase + EMAC_CTL_REG);
0869 reg_val &= ~(EMAC_CTL_TX_EN | EMAC_CTL_RX_EN | EMAC_CTL_RESET);
0870 writel(reg_val, db->membase + EMAC_CTL_REG);
0871 }
0872
0873
0874
0875
0876 static int emac_stop(struct net_device *ndev)
0877 {
0878 struct emac_board_info *db = netdev_priv(ndev);
0879
0880 if (netif_msg_ifdown(db))
0881 dev_dbg(db->dev, "shutting down %s\n", ndev->name);
0882
0883 netif_stop_queue(ndev);
0884 netif_carrier_off(ndev);
0885
0886 phy_stop(ndev->phydev);
0887
0888 emac_mdio_remove(ndev);
0889
0890 emac_shutdown(ndev);
0891
0892 free_irq(ndev->irq, ndev);
0893
0894 return 0;
0895 }
0896
0897 static const struct net_device_ops emac_netdev_ops = {
0898 .ndo_open = emac_open,
0899 .ndo_stop = emac_stop,
0900 .ndo_start_xmit = emac_start_xmit,
0901 .ndo_tx_timeout = emac_timeout,
0902 .ndo_set_rx_mode = emac_set_rx_mode,
0903 .ndo_eth_ioctl = phy_do_ioctl_running,
0904 .ndo_validate_addr = eth_validate_addr,
0905 .ndo_set_mac_address = emac_set_mac_address,
0906 #ifdef CONFIG_NET_POLL_CONTROLLER
0907 .ndo_poll_controller = emac_poll_controller,
0908 #endif
0909 };
0910
0911 static int emac_configure_dma(struct emac_board_info *db)
0912 {
0913 struct platform_device *pdev = db->pdev;
0914 struct net_device *ndev = db->ndev;
0915 struct dma_slave_config conf = {};
0916 struct resource *regs;
0917 int err = 0;
0918
0919 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0920 if (!regs) {
0921 netdev_err(ndev, "get io resource from device failed.\n");
0922 err = -ENOMEM;
0923 goto out_clear_chan;
0924 }
0925
0926 netdev_info(ndev, "get io resource from device: %pa, size = %u\n",
0927 ®s->start, (unsigned int)resource_size(regs));
0928 db->emac_rx_fifo = regs->start + EMAC_RX_IO_DATA_REG;
0929
0930 db->rx_chan = dma_request_chan(&pdev->dev, "rx");
0931 if (IS_ERR(db->rx_chan)) {
0932 netdev_err(ndev,
0933 "failed to request dma channel. dma is disabled\n");
0934 err = PTR_ERR(db->rx_chan);
0935 goto out_clear_chan;
0936 }
0937
0938 conf.direction = DMA_DEV_TO_MEM;
0939 conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
0940 conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
0941 conf.src_addr = db->emac_rx_fifo;
0942 conf.dst_maxburst = 4;
0943 conf.src_maxburst = 4;
0944 conf.device_fc = false;
0945
0946 err = dmaengine_slave_config(db->rx_chan, &conf);
0947 if (err) {
0948 netdev_err(ndev, "config dma slave failed\n");
0949 err = -EINVAL;
0950 goto out_slave_configure_err;
0951 }
0952
0953 return err;
0954
0955 out_slave_configure_err:
0956 dma_release_channel(db->rx_chan);
0957
0958 out_clear_chan:
0959 db->rx_chan = NULL;
0960 return err;
0961 }
0962
0963
0964
0965 static int emac_probe(struct platform_device *pdev)
0966 {
0967 struct device_node *np = pdev->dev.of_node;
0968 struct emac_board_info *db;
0969 struct net_device *ndev;
0970 int ret = 0;
0971
0972 ndev = alloc_etherdev(sizeof(struct emac_board_info));
0973 if (!ndev) {
0974 dev_err(&pdev->dev, "could not allocate device.\n");
0975 return -ENOMEM;
0976 }
0977
0978 SET_NETDEV_DEV(ndev, &pdev->dev);
0979
0980 db = netdev_priv(ndev);
0981
0982 db->dev = &pdev->dev;
0983 db->ndev = ndev;
0984 db->pdev = pdev;
0985 db->msg_enable = netif_msg_init(debug, EMAC_DEFAULT_MSG_ENABLE);
0986
0987 spin_lock_init(&db->lock);
0988
0989 db->membase = of_iomap(np, 0);
0990 if (!db->membase) {
0991 dev_err(&pdev->dev, "failed to remap registers\n");
0992 ret = -ENOMEM;
0993 goto out;
0994 }
0995
0996
0997 ndev->base_addr = (unsigned long)db->membase;
0998 ndev->irq = irq_of_parse_and_map(np, 0);
0999 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
1036 ret = of_get_ethdev_address(np, ndev);
1037 if (ret) {
1038
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
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
1069 out_release_sram:
1070 sunxi_sram_release(&pdev->dev);
1071 out_clk_disable_unprepare:
1072 clk_disable_unprepare(db->clk);
1073 out_dispose_mapping:
1074 irq_dispose_mapping(ndev->irq);
1075 dma_release_channel(db->rx_chan);
1076 out_iounmap:
1077 iounmap(db->membase);
1078 out:
1079 dev_err(db->dev, "not found (%d).\n", ret);
1080
1081 free_netdev(ndev);
1082
1083 return ret;
1084 }
1085
1086 static 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
1107 static 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
1118 static 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
1130 static const struct of_device_id emac_of_match[] = {
1131 {.compatible = "allwinner,sun4i-a10-emac",},
1132
1133
1134 {.compatible = "allwinner,sun4i-emac",},
1135 {},
1136 };
1137
1138 MODULE_DEVICE_TABLE(of, emac_of_match);
1139
1140 static 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
1151 module_platform_driver(emac_driver);
1152
1153 MODULE_AUTHOR("Stefan Roese <sr@denx.de>");
1154 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
1155 MODULE_DESCRIPTION("Allwinner A10 emac network driver");
1156 MODULE_LICENSE("GPL");