linux/drivers/net/ethernet/faraday/ftmac100.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Faraday FTMAC100 10/100 Ethernet
   4 *
   5 * (C) Copyright 2009-2011 Faraday Technology
   6 * Po-Yu Chuang <ratbert@faraday-tech.com>
   7 */
   8
   9#define pr_fmt(fmt)     KBUILD_MODNAME ": " fmt
  10
  11#include <linux/dma-mapping.h>
  12#include <linux/etherdevice.h>
  13#include <linux/ethtool.h>
  14#include <linux/init.h>
  15#include <linux/interrupt.h>
  16#include <linux/io.h>
  17#include <linux/mii.h>
  18#include <linux/module.h>
  19#include <linux/mod_devicetable.h>
  20#include <linux/netdevice.h>
  21#include <linux/platform_device.h>
  22
  23#include "ftmac100.h"
  24
  25#define DRV_NAME        "ftmac100"
  26
  27#define RX_QUEUE_ENTRIES        128     /* must be power of 2 */
  28#define TX_QUEUE_ENTRIES        16      /* must be power of 2 */
  29
  30#define MAX_PKT_SIZE            1518
  31#define RX_BUF_SIZE             2044    /* must be smaller than 0x7ff */
  32
  33#if MAX_PKT_SIZE > 0x7ff
  34#error invalid MAX_PKT_SIZE
  35#endif
  36
  37#if RX_BUF_SIZE > 0x7ff || RX_BUF_SIZE > PAGE_SIZE
  38#error invalid RX_BUF_SIZE
  39#endif
  40
  41/******************************************************************************
  42 * private data
  43 *****************************************************************************/
  44struct ftmac100_descs {
  45        struct ftmac100_rxdes rxdes[RX_QUEUE_ENTRIES];
  46        struct ftmac100_txdes txdes[TX_QUEUE_ENTRIES];
  47};
  48
  49struct ftmac100 {
  50        struct resource *res;
  51        void __iomem *base;
  52        int irq;
  53
  54        struct ftmac100_descs *descs;
  55        dma_addr_t descs_dma_addr;
  56
  57        unsigned int rx_pointer;
  58        unsigned int tx_clean_pointer;
  59        unsigned int tx_pointer;
  60        unsigned int tx_pending;
  61
  62        spinlock_t tx_lock;
  63
  64        struct net_device *netdev;
  65        struct device *dev;
  66        struct napi_struct napi;
  67
  68        struct mii_if_info mii;
  69};
  70
  71static int ftmac100_alloc_rx_page(struct ftmac100 *priv,
  72                                  struct ftmac100_rxdes *rxdes, gfp_t gfp);
  73
  74/******************************************************************************
  75 * internal functions (hardware register access)
  76 *****************************************************************************/
  77#define INT_MASK_ALL_ENABLED    (FTMAC100_INT_RPKT_FINISH       | \
  78                                 FTMAC100_INT_NORXBUF           | \
  79                                 FTMAC100_INT_XPKT_OK           | \
  80                                 FTMAC100_INT_XPKT_LOST         | \
  81                                 FTMAC100_INT_RPKT_LOST         | \
  82                                 FTMAC100_INT_AHB_ERR           | \
  83                                 FTMAC100_INT_PHYSTS_CHG)
  84
  85#define INT_MASK_ALL_DISABLED   0
  86
  87static void ftmac100_enable_all_int(struct ftmac100 *priv)
  88{
  89        iowrite32(INT_MASK_ALL_ENABLED, priv->base + FTMAC100_OFFSET_IMR);
  90}
  91
  92static void ftmac100_disable_all_int(struct ftmac100 *priv)
  93{
  94        iowrite32(INT_MASK_ALL_DISABLED, priv->base + FTMAC100_OFFSET_IMR);
  95}
  96
  97static void ftmac100_set_rx_ring_base(struct ftmac100 *priv, dma_addr_t addr)
  98{
  99        iowrite32(addr, priv->base + FTMAC100_OFFSET_RXR_BADR);
 100}
 101
 102static void ftmac100_set_tx_ring_base(struct ftmac100 *priv, dma_addr_t addr)
 103{
 104        iowrite32(addr, priv->base + FTMAC100_OFFSET_TXR_BADR);
 105}
 106
 107static void ftmac100_txdma_start_polling(struct ftmac100 *priv)
 108{
 109        iowrite32(1, priv->base + FTMAC100_OFFSET_TXPD);
 110}
 111
 112static int ftmac100_reset(struct ftmac100 *priv)
 113{
 114        struct net_device *netdev = priv->netdev;
 115        int i;
 116
 117        /* NOTE: reset clears all registers */
 118        iowrite32(FTMAC100_MACCR_SW_RST, priv->base + FTMAC100_OFFSET_MACCR);
 119
 120        for (i = 0; i < 5; i++) {
 121                unsigned int maccr;
 122
 123                maccr = ioread32(priv->base + FTMAC100_OFFSET_MACCR);
 124                if (!(maccr & FTMAC100_MACCR_SW_RST)) {
 125                        /*
 126                         * FTMAC100_MACCR_SW_RST cleared does not indicate
 127                         * that hardware reset completed (what the f*ck).
 128                         * We still need to wait for a while.
 129                         */
 130                        udelay(500);
 131                        return 0;
 132                }
 133
 134                udelay(1000);
 135        }
 136
 137        netdev_err(netdev, "software reset failed\n");
 138        return -EIO;
 139}
 140
 141static void ftmac100_set_mac(struct ftmac100 *priv, const unsigned char *mac)
 142{
 143        unsigned int maddr = mac[0] << 8 | mac[1];
 144        unsigned int laddr = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5];
 145
 146        iowrite32(maddr, priv->base + FTMAC100_OFFSET_MAC_MADR);
 147        iowrite32(laddr, priv->base + FTMAC100_OFFSET_MAC_LADR);
 148}
 149
 150#define MACCR_ENABLE_ALL        (FTMAC100_MACCR_XMT_EN  | \
 151                                 FTMAC100_MACCR_RCV_EN  | \
 152                                 FTMAC100_MACCR_XDMA_EN | \
 153                                 FTMAC100_MACCR_RDMA_EN | \
 154                                 FTMAC100_MACCR_CRC_APD | \
 155                                 FTMAC100_MACCR_FULLDUP | \
 156                                 FTMAC100_MACCR_RX_RUNT | \
 157                                 FTMAC100_MACCR_RX_BROADPKT)
 158
 159static int ftmac100_start_hw(struct ftmac100 *priv)
 160{
 161        struct net_device *netdev = priv->netdev;
 162
 163        if (ftmac100_reset(priv))
 164                return -EIO;
 165
 166        /* setup ring buffer base registers */
 167        ftmac100_set_rx_ring_base(priv,
 168                                  priv->descs_dma_addr +
 169                                  offsetof(struct ftmac100_descs, rxdes));
 170        ftmac100_set_tx_ring_base(priv,
 171                                  priv->descs_dma_addr +
 172                                  offsetof(struct ftmac100_descs, txdes));
 173
 174        iowrite32(FTMAC100_APTC_RXPOLL_CNT(1), priv->base + FTMAC100_OFFSET_APTC);
 175
 176        ftmac100_set_mac(priv, netdev->dev_addr);
 177
 178        iowrite32(MACCR_ENABLE_ALL, priv->base + FTMAC100_OFFSET_MACCR);
 179        return 0;
 180}
 181
 182static void ftmac100_stop_hw(struct ftmac100 *priv)
 183{
 184        iowrite32(0, priv->base + FTMAC100_OFFSET_MACCR);
 185}
 186
 187/******************************************************************************
 188 * internal functions (receive descriptor)
 189 *****************************************************************************/
 190static bool ftmac100_rxdes_first_segment(struct ftmac100_rxdes *rxdes)
 191{
 192        return rxdes->rxdes0 & cpu_to_le32(FTMAC100_RXDES0_FRS);
 193}
 194
 195static bool ftmac100_rxdes_last_segment(struct ftmac100_rxdes *rxdes)
 196{
 197        return rxdes->rxdes0 & cpu_to_le32(FTMAC100_RXDES0_LRS);
 198}
 199
 200static bool ftmac100_rxdes_owned_by_dma(struct ftmac100_rxdes *rxdes)
 201{
 202        return rxdes->rxdes0 & cpu_to_le32(FTMAC100_RXDES0_RXDMA_OWN);
 203}
 204
 205static void ftmac100_rxdes_set_dma_own(struct ftmac100_rxdes *rxdes)
 206{
 207        /* clear status bits */
 208        rxdes->rxdes0 = cpu_to_le32(FTMAC100_RXDES0_RXDMA_OWN);
 209}
 210
 211static bool ftmac100_rxdes_rx_error(struct ftmac100_rxdes *rxdes)
 212{
 213        return rxdes->rxdes0 & cpu_to_le32(FTMAC100_RXDES0_RX_ERR);
 214}
 215
 216static bool ftmac100_rxdes_crc_error(struct ftmac100_rxdes *rxdes)
 217{
 218        return rxdes->rxdes0 & cpu_to_le32(FTMAC100_RXDES0_CRC_ERR);
 219}
 220
 221static bool ftmac100_rxdes_frame_too_long(struct ftmac100_rxdes *rxdes)
 222{
 223        return rxdes->rxdes0 & cpu_to_le32(FTMAC100_RXDES0_FTL);
 224}
 225
 226static bool ftmac100_rxdes_runt(struct ftmac100_rxdes *rxdes)
 227{
 228        return rxdes->rxdes0 & cpu_to_le32(FTMAC100_RXDES0_RUNT);
 229}
 230
 231static bool ftmac100_rxdes_odd_nibble(struct ftmac100_rxdes *rxdes)
 232{
 233        return rxdes->rxdes0 & cpu_to_le32(FTMAC100_RXDES0_RX_ODD_NB);
 234}
 235
 236static unsigned int ftmac100_rxdes_frame_length(struct ftmac100_rxdes *rxdes)
 237{
 238        return le32_to_cpu(rxdes->rxdes0) & FTMAC100_RXDES0_RFL;
 239}
 240
 241static bool ftmac100_rxdes_multicast(struct ftmac100_rxdes *rxdes)
 242{
 243        return rxdes->rxdes0 & cpu_to_le32(FTMAC100_RXDES0_MULTICAST);
 244}
 245
 246static void ftmac100_rxdes_set_buffer_size(struct ftmac100_rxdes *rxdes,
 247                                           unsigned int size)
 248{
 249        rxdes->rxdes1 &= cpu_to_le32(FTMAC100_RXDES1_EDORR);
 250        rxdes->rxdes1 |= cpu_to_le32(FTMAC100_RXDES1_RXBUF_SIZE(size));
 251}
 252
 253static void ftmac100_rxdes_set_end_of_ring(struct ftmac100_rxdes *rxdes)
 254{
 255        rxdes->rxdes1 |= cpu_to_le32(FTMAC100_RXDES1_EDORR);
 256}
 257
 258static void ftmac100_rxdes_set_dma_addr(struct ftmac100_rxdes *rxdes,
 259                                        dma_addr_t addr)
 260{
 261        rxdes->rxdes2 = cpu_to_le32(addr);
 262}
 263
 264static dma_addr_t ftmac100_rxdes_get_dma_addr(struct ftmac100_rxdes *rxdes)
 265{
 266        return le32_to_cpu(rxdes->rxdes2);
 267}
 268
 269/*
 270 * rxdes3 is not used by hardware. We use it to keep track of page.
 271 * Since hardware does not touch it, we can skip cpu_to_le32()/le32_to_cpu().
 272 */
 273static void ftmac100_rxdes_set_page(struct ftmac100_rxdes *rxdes, struct page *page)
 274{
 275        rxdes->rxdes3 = (unsigned int)page;
 276}
 277
 278static struct page *ftmac100_rxdes_get_page(struct ftmac100_rxdes *rxdes)
 279{
 280        return (struct page *)rxdes->rxdes3;
 281}
 282
 283/******************************************************************************
 284 * internal functions (receive)
 285 *****************************************************************************/
 286static int ftmac100_next_rx_pointer(int pointer)
 287{
 288        return (pointer + 1) & (RX_QUEUE_ENTRIES - 1);
 289}
 290
 291static void ftmac100_rx_pointer_advance(struct ftmac100 *priv)
 292{
 293        priv->rx_pointer = ftmac100_next_rx_pointer(priv->rx_pointer);
 294}
 295
 296static struct ftmac100_rxdes *ftmac100_current_rxdes(struct ftmac100 *priv)
 297{
 298        return &priv->descs->rxdes[priv->rx_pointer];
 299}
 300
 301static struct ftmac100_rxdes *
 302ftmac100_rx_locate_first_segment(struct ftmac100 *priv)
 303{
 304        struct ftmac100_rxdes *rxdes = ftmac100_current_rxdes(priv);
 305
 306        while (!ftmac100_rxdes_owned_by_dma(rxdes)) {
 307                if (ftmac100_rxdes_first_segment(rxdes))
 308                        return rxdes;
 309
 310                ftmac100_rxdes_set_dma_own(rxdes);
 311                ftmac100_rx_pointer_advance(priv);
 312                rxdes = ftmac100_current_rxdes(priv);
 313        }
 314
 315        return NULL;
 316}
 317
 318static bool ftmac100_rx_packet_error(struct ftmac100 *priv,
 319                                     struct ftmac100_rxdes *rxdes)
 320{
 321        struct net_device *netdev = priv->netdev;
 322        bool error = false;
 323
 324        if (unlikely(ftmac100_rxdes_rx_error(rxdes))) {
 325                if (net_ratelimit())
 326                        netdev_info(netdev, "rx err\n");
 327
 328                netdev->stats.rx_errors++;
 329                error = true;
 330        }
 331
 332        if (unlikely(ftmac100_rxdes_crc_error(rxdes))) {
 333                if (net_ratelimit())
 334                        netdev_info(netdev, "rx crc err\n");
 335
 336                netdev->stats.rx_crc_errors++;
 337                error = true;
 338        }
 339
 340        if (unlikely(ftmac100_rxdes_frame_too_long(rxdes))) {
 341                if (net_ratelimit())
 342                        netdev_info(netdev, "rx frame too long\n");
 343
 344                netdev->stats.rx_length_errors++;
 345                error = true;
 346        } else if (unlikely(ftmac100_rxdes_runt(rxdes))) {
 347                if (net_ratelimit())
 348                        netdev_info(netdev, "rx runt\n");
 349
 350                netdev->stats.rx_length_errors++;
 351                error = true;
 352        } else if (unlikely(ftmac100_rxdes_odd_nibble(rxdes))) {
 353                if (net_ratelimit())
 354                        netdev_info(netdev, "rx odd nibble\n");
 355
 356                netdev->stats.rx_length_errors++;
 357                error = true;
 358        }
 359
 360        return error;
 361}
 362
 363static void ftmac100_rx_drop_packet(struct ftmac100 *priv)
 364{
 365        struct net_device *netdev = priv->netdev;
 366        struct ftmac100_rxdes *rxdes = ftmac100_current_rxdes(priv);
 367        bool done = false;
 368
 369        if (net_ratelimit())
 370                netdev_dbg(netdev, "drop packet %p\n", rxdes);
 371
 372        do {
 373                if (ftmac100_rxdes_last_segment(rxdes))
 374                        done = true;
 375
 376                ftmac100_rxdes_set_dma_own(rxdes);
 377                ftmac100_rx_pointer_advance(priv);
 378                rxdes = ftmac100_current_rxdes(priv);
 379        } while (!done && !ftmac100_rxdes_owned_by_dma(rxdes));
 380
 381        netdev->stats.rx_dropped++;
 382}
 383
 384static bool ftmac100_rx_packet(struct ftmac100 *priv, int *processed)
 385{
 386        struct net_device *netdev = priv->netdev;
 387        struct ftmac100_rxdes *rxdes;
 388        struct sk_buff *skb;
 389        struct page *page;
 390        dma_addr_t map;
 391        int length;
 392        bool ret;
 393
 394        rxdes = ftmac100_rx_locate_first_segment(priv);
 395        if (!rxdes)
 396                return false;
 397
 398        if (unlikely(ftmac100_rx_packet_error(priv, rxdes))) {
 399                ftmac100_rx_drop_packet(priv);
 400                return true;
 401        }
 402
 403        /*
 404         * It is impossible to get multi-segment packets
 405         * because we always provide big enough receive buffers.
 406         */
 407        ret = ftmac100_rxdes_last_segment(rxdes);
 408        BUG_ON(!ret);
 409
 410        /* start processing */
 411        skb = netdev_alloc_skb_ip_align(netdev, 128);
 412        if (unlikely(!skb)) {
 413                if (net_ratelimit())
 414                        netdev_err(netdev, "rx skb alloc failed\n");
 415
 416                ftmac100_rx_drop_packet(priv);
 417                return true;
 418        }
 419
 420        if (unlikely(ftmac100_rxdes_multicast(rxdes)))
 421                netdev->stats.multicast++;
 422
 423        map = ftmac100_rxdes_get_dma_addr(rxdes);
 424        dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
 425
 426        length = ftmac100_rxdes_frame_length(rxdes);
 427        page = ftmac100_rxdes_get_page(rxdes);
 428        skb_fill_page_desc(skb, 0, page, 0, length);
 429        skb->len += length;
 430        skb->data_len += length;
 431
 432        if (length > 128) {
 433                skb->truesize += PAGE_SIZE;
 434                /* We pull the minimum amount into linear part */
 435                __pskb_pull_tail(skb, ETH_HLEN);
 436        } else {
 437                /* Small frames are copied into linear part to free one page */
 438                __pskb_pull_tail(skb, length);
 439        }
 440        ftmac100_alloc_rx_page(priv, rxdes, GFP_ATOMIC);
 441
 442        ftmac100_rx_pointer_advance(priv);
 443
 444        skb->protocol = eth_type_trans(skb, netdev);
 445
 446        netdev->stats.rx_packets++;
 447        netdev->stats.rx_bytes += skb->len;
 448
 449        /* push packet to protocol stack */
 450        netif_receive_skb(skb);
 451
 452        (*processed)++;
 453        return true;
 454}
 455
 456/******************************************************************************
 457 * internal functions (transmit descriptor)
 458 *****************************************************************************/
 459static void ftmac100_txdes_reset(struct ftmac100_txdes *txdes)
 460{
 461        /* clear all except end of ring bit */
 462        txdes->txdes0 = 0;
 463        txdes->txdes1 &= cpu_to_le32(FTMAC100_TXDES1_EDOTR);
 464        txdes->txdes2 = 0;
 465        txdes->txdes3 = 0;
 466}
 467
 468static bool ftmac100_txdes_owned_by_dma(struct ftmac100_txdes *txdes)
 469{
 470        return txdes->txdes0 & cpu_to_le32(FTMAC100_TXDES0_TXDMA_OWN);
 471}
 472
 473static void ftmac100_txdes_set_dma_own(struct ftmac100_txdes *txdes)
 474{
 475        /*
 476         * Make sure dma own bit will not be set before any other
 477         * descriptor fields.
 478         */
 479        wmb();
 480        txdes->txdes0 |= cpu_to_le32(FTMAC100_TXDES0_TXDMA_OWN);
 481}
 482
 483static bool ftmac100_txdes_excessive_collision(struct ftmac100_txdes *txdes)
 484{
 485        return txdes->txdes0 & cpu_to_le32(FTMAC100_TXDES0_TXPKT_EXSCOL);
 486}
 487
 488static bool ftmac100_txdes_late_collision(struct ftmac100_txdes *txdes)
 489{
 490        return txdes->txdes0 & cpu_to_le32(FTMAC100_TXDES0_TXPKT_LATECOL);
 491}
 492
 493static void ftmac100_txdes_set_end_of_ring(struct ftmac100_txdes *txdes)
 494{
 495        txdes->txdes1 |= cpu_to_le32(FTMAC100_TXDES1_EDOTR);
 496}
 497
 498static void ftmac100_txdes_set_first_segment(struct ftmac100_txdes *txdes)
 499{
 500        txdes->txdes1 |= cpu_to_le32(FTMAC100_TXDES1_FTS);
 501}
 502
 503static void ftmac100_txdes_set_last_segment(struct ftmac100_txdes *txdes)
 504{
 505        txdes->txdes1 |= cpu_to_le32(FTMAC100_TXDES1_LTS);
 506}
 507
 508static void ftmac100_txdes_set_txint(struct ftmac100_txdes *txdes)
 509{
 510        txdes->txdes1 |= cpu_to_le32(FTMAC100_TXDES1_TXIC);
 511}
 512
 513static void ftmac100_txdes_set_buffer_size(struct ftmac100_txdes *txdes,
 514                                           unsigned int len)
 515{
 516        txdes->txdes1 |= cpu_to_le32(FTMAC100_TXDES1_TXBUF_SIZE(len));
 517}
 518
 519static void ftmac100_txdes_set_dma_addr(struct ftmac100_txdes *txdes,
 520                                        dma_addr_t addr)
 521{
 522        txdes->txdes2 = cpu_to_le32(addr);
 523}
 524
 525static dma_addr_t ftmac100_txdes_get_dma_addr(struct ftmac100_txdes *txdes)
 526{
 527        return le32_to_cpu(txdes->txdes2);
 528}
 529
 530/*
 531 * txdes3 is not used by hardware. We use it to keep track of socket buffer.
 532 * Since hardware does not touch it, we can skip cpu_to_le32()/le32_to_cpu().
 533 */
 534static void ftmac100_txdes_set_skb(struct ftmac100_txdes *txdes, struct sk_buff *skb)
 535{
 536        txdes->txdes3 = (unsigned int)skb;
 537}
 538
 539static struct sk_buff *ftmac100_txdes_get_skb(struct ftmac100_txdes *txdes)
 540{
 541        return (struct sk_buff *)txdes->txdes3;
 542}
 543
 544/******************************************************************************
 545 * internal functions (transmit)
 546 *****************************************************************************/
 547static int ftmac100_next_tx_pointer(int pointer)
 548{
 549        return (pointer + 1) & (TX_QUEUE_ENTRIES - 1);
 550}
 551
 552static void ftmac100_tx_pointer_advance(struct ftmac100 *priv)
 553{
 554        priv->tx_pointer = ftmac100_next_tx_pointer(priv->tx_pointer);
 555}
 556
 557static void ftmac100_tx_clean_pointer_advance(struct ftmac100 *priv)
 558{
 559        priv->tx_clean_pointer = ftmac100_next_tx_pointer(priv->tx_clean_pointer);
 560}
 561
 562static struct ftmac100_txdes *ftmac100_current_txdes(struct ftmac100 *priv)
 563{
 564        return &priv->descs->txdes[priv->tx_pointer];
 565}
 566
 567static struct ftmac100_txdes *ftmac100_current_clean_txdes(struct ftmac100 *priv)
 568{
 569        return &priv->descs->txdes[priv->tx_clean_pointer];
 570}
 571
 572static bool ftmac100_tx_complete_packet(struct ftmac100 *priv)
 573{
 574        struct net_device *netdev = priv->netdev;
 575        struct ftmac100_txdes *txdes;
 576        struct sk_buff *skb;
 577        dma_addr_t map;
 578
 579        if (priv->tx_pending == 0)
 580                return false;
 581
 582        txdes = ftmac100_current_clean_txdes(priv);
 583
 584        if (ftmac100_txdes_owned_by_dma(txdes))
 585                return false;
 586
 587        skb = ftmac100_txdes_get_skb(txdes);
 588        map = ftmac100_txdes_get_dma_addr(txdes);
 589
 590        if (unlikely(ftmac100_txdes_excessive_collision(txdes) ||
 591                     ftmac100_txdes_late_collision(txdes))) {
 592                /*
 593                 * packet transmitted to ethernet lost due to late collision
 594                 * or excessive collision
 595                 */
 596                netdev->stats.tx_aborted_errors++;
 597        } else {
 598                netdev->stats.tx_packets++;
 599                netdev->stats.tx_bytes += skb->len;
 600        }
 601
 602        dma_unmap_single(priv->dev, map, skb_headlen(skb), DMA_TO_DEVICE);
 603        dev_kfree_skb(skb);
 604
 605        ftmac100_txdes_reset(txdes);
 606
 607        ftmac100_tx_clean_pointer_advance(priv);
 608
 609        spin_lock(&priv->tx_lock);
 610        priv->tx_pending--;
 611        spin_unlock(&priv->tx_lock);
 612        netif_wake_queue(netdev);
 613
 614        return true;
 615}
 616
 617static void ftmac100_tx_complete(struct ftmac100 *priv)
 618{
 619        while (ftmac100_tx_complete_packet(priv))
 620                ;
 621}
 622
 623static netdev_tx_t ftmac100_xmit(struct ftmac100 *priv, struct sk_buff *skb,
 624                                 dma_addr_t map)
 625{
 626        struct net_device *netdev = priv->netdev;
 627        struct ftmac100_txdes *txdes;
 628        unsigned int len = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
 629
 630        txdes = ftmac100_current_txdes(priv);
 631        ftmac100_tx_pointer_advance(priv);
 632
 633        /* setup TX descriptor */
 634        ftmac100_txdes_set_skb(txdes, skb);
 635        ftmac100_txdes_set_dma_addr(txdes, map);
 636
 637        ftmac100_txdes_set_first_segment(txdes);
 638        ftmac100_txdes_set_last_segment(txdes);
 639        ftmac100_txdes_set_txint(txdes);
 640        ftmac100_txdes_set_buffer_size(txdes, len);
 641
 642        spin_lock(&priv->tx_lock);
 643        priv->tx_pending++;
 644        if (priv->tx_pending == TX_QUEUE_ENTRIES)
 645                netif_stop_queue(netdev);
 646
 647        /* start transmit */
 648        ftmac100_txdes_set_dma_own(txdes);
 649        spin_unlock(&priv->tx_lock);
 650
 651        ftmac100_txdma_start_polling(priv);
 652        return NETDEV_TX_OK;
 653}
 654
 655/******************************************************************************
 656 * internal functions (buffer)
 657 *****************************************************************************/
 658static int ftmac100_alloc_rx_page(struct ftmac100 *priv,
 659                                  struct ftmac100_rxdes *rxdes, gfp_t gfp)
 660{
 661        struct net_device *netdev = priv->netdev;
 662        struct page *page;
 663        dma_addr_t map;
 664
 665        page = alloc_page(gfp);
 666        if (!page) {
 667                if (net_ratelimit())
 668                        netdev_err(netdev, "failed to allocate rx page\n");
 669                return -ENOMEM;
 670        }
 671
 672        map = dma_map_page(priv->dev, page, 0, RX_BUF_SIZE, DMA_FROM_DEVICE);
 673        if (unlikely(dma_mapping_error(priv->dev, map))) {
 674                if (net_ratelimit())
 675                        netdev_err(netdev, "failed to map rx page\n");
 676                __free_page(page);
 677                return -ENOMEM;
 678        }
 679
 680        ftmac100_rxdes_set_page(rxdes, page);
 681        ftmac100_rxdes_set_dma_addr(rxdes, map);
 682        ftmac100_rxdes_set_buffer_size(rxdes, RX_BUF_SIZE);
 683        ftmac100_rxdes_set_dma_own(rxdes);
 684        return 0;
 685}
 686
 687static void ftmac100_free_buffers(struct ftmac100 *priv)
 688{
 689        int i;
 690
 691        for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
 692                struct ftmac100_rxdes *rxdes = &priv->descs->rxdes[i];
 693                struct page *page = ftmac100_rxdes_get_page(rxdes);
 694                dma_addr_t map = ftmac100_rxdes_get_dma_addr(rxdes);
 695
 696                if (!page)
 697                        continue;
 698
 699                dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
 700                __free_page(page);
 701        }
 702
 703        for (i = 0; i < TX_QUEUE_ENTRIES; i++) {
 704                struct ftmac100_txdes *txdes = &priv->descs->txdes[i];
 705                struct sk_buff *skb = ftmac100_txdes_get_skb(txdes);
 706                dma_addr_t map = ftmac100_txdes_get_dma_addr(txdes);
 707
 708                if (!skb)
 709                        continue;
 710
 711                dma_unmap_single(priv->dev, map, skb_headlen(skb), DMA_TO_DEVICE);
 712                dev_kfree_skb(skb);
 713        }
 714
 715        dma_free_coherent(priv->dev, sizeof(struct ftmac100_descs),
 716                          priv->descs, priv->descs_dma_addr);
 717}
 718
 719static int ftmac100_alloc_buffers(struct ftmac100 *priv)
 720{
 721        int i;
 722
 723        priv->descs = dma_alloc_coherent(priv->dev,
 724                                         sizeof(struct ftmac100_descs),
 725                                         &priv->descs_dma_addr, GFP_KERNEL);
 726        if (!priv->descs)
 727                return -ENOMEM;
 728
 729        /* initialize RX ring */
 730        ftmac100_rxdes_set_end_of_ring(&priv->descs->rxdes[RX_QUEUE_ENTRIES - 1]);
 731
 732        for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
 733                struct ftmac100_rxdes *rxdes = &priv->descs->rxdes[i];
 734
 735                if (ftmac100_alloc_rx_page(priv, rxdes, GFP_KERNEL))
 736                        goto err;
 737        }
 738
 739        /* initialize TX ring */
 740        ftmac100_txdes_set_end_of_ring(&priv->descs->txdes[TX_QUEUE_ENTRIES - 1]);
 741        return 0;
 742
 743err:
 744        ftmac100_free_buffers(priv);
 745        return -ENOMEM;
 746}
 747
 748/******************************************************************************
 749 * struct mii_if_info functions
 750 *****************************************************************************/
 751static int ftmac100_mdio_read(struct net_device *netdev, int phy_id, int reg)
 752{
 753        struct ftmac100 *priv = netdev_priv(netdev);
 754        unsigned int phycr;
 755        int i;
 756
 757        phycr = FTMAC100_PHYCR_PHYAD(phy_id) |
 758                FTMAC100_PHYCR_REGAD(reg) |
 759                FTMAC100_PHYCR_MIIRD;
 760
 761        iowrite32(phycr, priv->base + FTMAC100_OFFSET_PHYCR);
 762
 763        for (i = 0; i < 10; i++) {
 764                phycr = ioread32(priv->base + FTMAC100_OFFSET_PHYCR);
 765
 766                if ((phycr & FTMAC100_PHYCR_MIIRD) == 0)
 767                        return phycr & FTMAC100_PHYCR_MIIRDATA;
 768
 769                udelay(100);
 770        }
 771
 772        netdev_err(netdev, "mdio read timed out\n");
 773        return 0;
 774}
 775
 776static void ftmac100_mdio_write(struct net_device *netdev, int phy_id, int reg,
 777                                int data)
 778{
 779        struct ftmac100 *priv = netdev_priv(netdev);
 780        unsigned int phycr;
 781        int i;
 782
 783        phycr = FTMAC100_PHYCR_PHYAD(phy_id) |
 784                FTMAC100_PHYCR_REGAD(reg) |
 785                FTMAC100_PHYCR_MIIWR;
 786
 787        data = FTMAC100_PHYWDATA_MIIWDATA(data);
 788
 789        iowrite32(data, priv->base + FTMAC100_OFFSET_PHYWDATA);
 790        iowrite32(phycr, priv->base + FTMAC100_OFFSET_PHYCR);
 791
 792        for (i = 0; i < 10; i++) {
 793                phycr = ioread32(priv->base + FTMAC100_OFFSET_PHYCR);
 794
 795                if ((phycr & FTMAC100_PHYCR_MIIWR) == 0)
 796                        return;
 797
 798                udelay(100);
 799        }
 800
 801        netdev_err(netdev, "mdio write timed out\n");
 802}
 803
 804/******************************************************************************
 805 * struct ethtool_ops functions
 806 *****************************************************************************/
 807static void ftmac100_get_drvinfo(struct net_device *netdev,
 808                                 struct ethtool_drvinfo *info)
 809{
 810        strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
 811        strlcpy(info->bus_info, dev_name(&netdev->dev), sizeof(info->bus_info));
 812}
 813
 814static int ftmac100_get_link_ksettings(struct net_device *netdev,
 815                                       struct ethtool_link_ksettings *cmd)
 816{
 817        struct ftmac100 *priv = netdev_priv(netdev);
 818
 819        mii_ethtool_get_link_ksettings(&priv->mii, cmd);
 820
 821        return 0;
 822}
 823
 824static int ftmac100_set_link_ksettings(struct net_device *netdev,
 825                                       const struct ethtool_link_ksettings *cmd)
 826{
 827        struct ftmac100 *priv = netdev_priv(netdev);
 828        return mii_ethtool_set_link_ksettings(&priv->mii, cmd);
 829}
 830
 831static int ftmac100_nway_reset(struct net_device *netdev)
 832{
 833        struct ftmac100 *priv = netdev_priv(netdev);
 834        return mii_nway_restart(&priv->mii);
 835}
 836
 837static u32 ftmac100_get_link(struct net_device *netdev)
 838{
 839        struct ftmac100 *priv = netdev_priv(netdev);
 840        return mii_link_ok(&priv->mii);
 841}
 842
 843static const struct ethtool_ops ftmac100_ethtool_ops = {
 844        .get_drvinfo            = ftmac100_get_drvinfo,
 845        .nway_reset             = ftmac100_nway_reset,
 846        .get_link               = ftmac100_get_link,
 847        .get_link_ksettings     = ftmac100_get_link_ksettings,
 848        .set_link_ksettings     = ftmac100_set_link_ksettings,
 849};
 850
 851/******************************************************************************
 852 * interrupt handler
 853 *****************************************************************************/
 854static irqreturn_t ftmac100_interrupt(int irq, void *dev_id)
 855{
 856        struct net_device *netdev = dev_id;
 857        struct ftmac100 *priv = netdev_priv(netdev);
 858
 859        /* Disable interrupts for polling */
 860        ftmac100_disable_all_int(priv);
 861        if (likely(netif_running(netdev)))
 862                napi_schedule(&priv->napi);
 863
 864        return IRQ_HANDLED;
 865}
 866
 867/******************************************************************************
 868 * struct napi_struct functions
 869 *****************************************************************************/
 870static int ftmac100_poll(struct napi_struct *napi, int budget)
 871{
 872        struct ftmac100 *priv = container_of(napi, struct ftmac100, napi);
 873        struct net_device *netdev = priv->netdev;
 874        unsigned int status;
 875        bool completed = true;
 876        int rx = 0;
 877
 878        status = ioread32(priv->base + FTMAC100_OFFSET_ISR);
 879
 880        if (status & (FTMAC100_INT_RPKT_FINISH | FTMAC100_INT_NORXBUF)) {
 881                /*
 882                 * FTMAC100_INT_RPKT_FINISH:
 883                 *      RX DMA has received packets into RX buffer successfully
 884                 *
 885                 * FTMAC100_INT_NORXBUF:
 886                 *      RX buffer unavailable
 887                 */
 888                bool retry;
 889
 890                do {
 891                        retry = ftmac100_rx_packet(priv, &rx);
 892                } while (retry && rx < budget);
 893
 894                if (retry && rx == budget)
 895                        completed = false;
 896        }
 897
 898        if (status & (FTMAC100_INT_XPKT_OK | FTMAC100_INT_XPKT_LOST)) {
 899                /*
 900                 * FTMAC100_INT_XPKT_OK:
 901                 *      packet transmitted to ethernet successfully
 902                 *
 903                 * FTMAC100_INT_XPKT_LOST:
 904                 *      packet transmitted to ethernet lost due to late
 905                 *      collision or excessive collision
 906                 */
 907                ftmac100_tx_complete(priv);
 908        }
 909
 910        if (status & (FTMAC100_INT_NORXBUF | FTMAC100_INT_RPKT_LOST |
 911                      FTMAC100_INT_AHB_ERR | FTMAC100_INT_PHYSTS_CHG)) {
 912                if (net_ratelimit())
 913                        netdev_info(netdev, "[ISR] = 0x%x: %s%s%s%s\n", status,
 914                                    status & FTMAC100_INT_NORXBUF ? "NORXBUF " : "",
 915                                    status & FTMAC100_INT_RPKT_LOST ? "RPKT_LOST " : "",
 916                                    status & FTMAC100_INT_AHB_ERR ? "AHB_ERR " : "",
 917                                    status & FTMAC100_INT_PHYSTS_CHG ? "PHYSTS_CHG" : "");
 918
 919                if (status & FTMAC100_INT_NORXBUF) {
 920                        /* RX buffer unavailable */
 921                        netdev->stats.rx_over_errors++;
 922                }
 923
 924                if (status & FTMAC100_INT_RPKT_LOST) {
 925                        /* received packet lost due to RX FIFO full */
 926                        netdev->stats.rx_fifo_errors++;
 927                }
 928
 929                if (status & FTMAC100_INT_PHYSTS_CHG) {
 930                        /* PHY link status change */
 931                        mii_check_link(&priv->mii);
 932                }
 933        }
 934
 935        if (completed) {
 936                /* stop polling */
 937                napi_complete(napi);
 938                ftmac100_enable_all_int(priv);
 939        }
 940
 941        return rx;
 942}
 943
 944/******************************************************************************
 945 * struct net_device_ops functions
 946 *****************************************************************************/
 947static int ftmac100_open(struct net_device *netdev)
 948{
 949        struct ftmac100 *priv = netdev_priv(netdev);
 950        int err;
 951
 952        err = ftmac100_alloc_buffers(priv);
 953        if (err) {
 954                netdev_err(netdev, "failed to allocate buffers\n");
 955                goto err_alloc;
 956        }
 957
 958        err = request_irq(priv->irq, ftmac100_interrupt, 0, netdev->name, netdev);
 959        if (err) {
 960                netdev_err(netdev, "failed to request irq %d\n", priv->irq);
 961                goto err_irq;
 962        }
 963
 964        priv->rx_pointer = 0;
 965        priv->tx_clean_pointer = 0;
 966        priv->tx_pointer = 0;
 967        priv->tx_pending = 0;
 968
 969        err = ftmac100_start_hw(priv);
 970        if (err)
 971                goto err_hw;
 972
 973        napi_enable(&priv->napi);
 974        netif_start_queue(netdev);
 975
 976        ftmac100_enable_all_int(priv);
 977
 978        return 0;
 979
 980err_hw:
 981        free_irq(priv->irq, netdev);
 982err_irq:
 983        ftmac100_free_buffers(priv);
 984err_alloc:
 985        return err;
 986}
 987
 988static int ftmac100_stop(struct net_device *netdev)
 989{
 990        struct ftmac100 *priv = netdev_priv(netdev);
 991
 992        ftmac100_disable_all_int(priv);
 993        netif_stop_queue(netdev);
 994        napi_disable(&priv->napi);
 995        ftmac100_stop_hw(priv);
 996        free_irq(priv->irq, netdev);
 997        ftmac100_free_buffers(priv);
 998
 999        return 0;
1000}
1001
1002static netdev_tx_t
1003ftmac100_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev)
1004{
1005        struct ftmac100 *priv = netdev_priv(netdev);
1006        dma_addr_t map;
1007
1008        if (unlikely(skb->len > MAX_PKT_SIZE)) {
1009                if (net_ratelimit())
1010                        netdev_dbg(netdev, "tx packet too big\n");
1011
1012                netdev->stats.tx_dropped++;
1013                dev_kfree_skb(skb);
1014                return NETDEV_TX_OK;
1015        }
1016
1017        map = dma_map_single(priv->dev, skb->data, skb_headlen(skb), DMA_TO_DEVICE);
1018        if (unlikely(dma_mapping_error(priv->dev, map))) {
1019                /* drop packet */
1020                if (net_ratelimit())
1021                        netdev_err(netdev, "map socket buffer failed\n");
1022
1023                netdev->stats.tx_dropped++;
1024                dev_kfree_skb(skb);
1025                return NETDEV_TX_OK;
1026        }
1027
1028        return ftmac100_xmit(priv, skb, map);
1029}
1030
1031/* optional */
1032static int ftmac100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
1033{
1034        struct ftmac100 *priv = netdev_priv(netdev);
1035        struct mii_ioctl_data *data = if_mii(ifr);
1036
1037        return generic_mii_ioctl(&priv->mii, data, cmd, NULL);
1038}
1039
1040static const struct net_device_ops ftmac100_netdev_ops = {
1041        .ndo_open               = ftmac100_open,
1042        .ndo_stop               = ftmac100_stop,
1043        .ndo_start_xmit         = ftmac100_hard_start_xmit,
1044        .ndo_set_mac_address    = eth_mac_addr,
1045        .ndo_validate_addr      = eth_validate_addr,
1046        .ndo_eth_ioctl          = ftmac100_do_ioctl,
1047};
1048
1049/******************************************************************************
1050 * struct platform_driver functions
1051 *****************************************************************************/
1052static int ftmac100_probe(struct platform_device *pdev)
1053{
1054        struct resource *res;
1055        int irq;
1056        struct net_device *netdev;
1057        struct ftmac100 *priv;
1058        int err;
1059
1060        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1061        if (!res)
1062                return -ENXIO;
1063
1064        irq = platform_get_irq(pdev, 0);
1065        if (irq < 0)
1066                return irq;
1067
1068        /* setup net_device */
1069        netdev = alloc_etherdev(sizeof(*priv));
1070        if (!netdev) {
1071                err = -ENOMEM;
1072                goto err_alloc_etherdev;
1073        }
1074
1075        SET_NETDEV_DEV(netdev, &pdev->dev);
1076        netdev->ethtool_ops = &ftmac100_ethtool_ops;
1077        netdev->netdev_ops = &ftmac100_netdev_ops;
1078
1079        platform_set_drvdata(pdev, netdev);
1080
1081        /* setup private data */
1082        priv = netdev_priv(netdev);
1083        priv->netdev = netdev;
1084        priv->dev = &pdev->dev;
1085
1086        spin_lock_init(&priv->tx_lock);
1087
1088        /* initialize NAPI */
1089        netif_napi_add(netdev, &priv->napi, ftmac100_poll, 64);
1090
1091        /* map io memory */
1092        priv->res = request_mem_region(res->start, resource_size(res),
1093                                       dev_name(&pdev->dev));
1094        if (!priv->res) {
1095                dev_err(&pdev->dev, "Could not reserve memory region\n");
1096                err = -ENOMEM;
1097                goto err_req_mem;
1098        }
1099
1100        priv->base = ioremap(res->start, resource_size(res));
1101        if (!priv->base) {
1102                dev_err(&pdev->dev, "Failed to ioremap ethernet registers\n");
1103                err = -EIO;
1104                goto err_ioremap;
1105        }
1106
1107        priv->irq = irq;
1108
1109        /* initialize struct mii_if_info */
1110        priv->mii.phy_id        = 0;
1111        priv->mii.phy_id_mask   = 0x1f;
1112        priv->mii.reg_num_mask  = 0x1f;
1113        priv->mii.dev           = netdev;
1114        priv->mii.mdio_read     = ftmac100_mdio_read;
1115        priv->mii.mdio_write    = ftmac100_mdio_write;
1116
1117        /* register network device */
1118        err = register_netdev(netdev);
1119        if (err) {
1120                dev_err(&pdev->dev, "Failed to register netdev\n");
1121                goto err_register_netdev;
1122        }
1123
1124        netdev_info(netdev, "irq %d, mapped at %p\n", priv->irq, priv->base);
1125
1126        if (!is_valid_ether_addr(netdev->dev_addr)) {
1127                eth_hw_addr_random(netdev);
1128                netdev_info(netdev, "generated random MAC address %pM\n",
1129                            netdev->dev_addr);
1130        }
1131
1132        return 0;
1133
1134err_register_netdev:
1135        iounmap(priv->base);
1136err_ioremap:
1137        release_resource(priv->res);
1138err_req_mem:
1139        netif_napi_del(&priv->napi);
1140        free_netdev(netdev);
1141err_alloc_etherdev:
1142        return err;
1143}
1144
1145static int ftmac100_remove(struct platform_device *pdev)
1146{
1147        struct net_device *netdev;
1148        struct ftmac100 *priv;
1149
1150        netdev = platform_get_drvdata(pdev);
1151        priv = netdev_priv(netdev);
1152
1153        unregister_netdev(netdev);
1154
1155        iounmap(priv->base);
1156        release_resource(priv->res);
1157
1158        netif_napi_del(&priv->napi);
1159        free_netdev(netdev);
1160        return 0;
1161}
1162
1163static const struct of_device_id ftmac100_of_ids[] = {
1164        { .compatible = "andestech,atmac100" },
1165        { }
1166};
1167
1168static struct platform_driver ftmac100_driver = {
1169        .probe          = ftmac100_probe,
1170        .remove         = ftmac100_remove,
1171        .driver         = {
1172                .name   = DRV_NAME,
1173                .of_match_table = ftmac100_of_ids
1174        },
1175};
1176
1177/******************************************************************************
1178 * initialization / finalization
1179 *****************************************************************************/
1180module_platform_driver(ftmac100_driver);
1181
1182MODULE_AUTHOR("Po-Yu Chuang <ratbert@faraday-tech.com>");
1183MODULE_DESCRIPTION("FTMAC100 driver");
1184MODULE_LICENSE("GPL");
1185MODULE_DEVICE_TABLE(of, ftmac100_of_ids);
1186