linux/drivers/net/bcm63xx_enet.c
<<
>>
Prefs
   1/*
   2 * Driver for BCM963xx builtin Ethernet mac
   3 *
   4 * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19 */
  20#include <linux/init.h>
  21#include <linux/module.h>
  22#include <linux/clk.h>
  23#include <linux/etherdevice.h>
  24#include <linux/delay.h>
  25#include <linux/ethtool.h>
  26#include <linux/crc32.h>
  27#include <linux/err.h>
  28#include <linux/dma-mapping.h>
  29#include <linux/platform_device.h>
  30#include <linux/if_vlan.h>
  31
  32#include <bcm63xx_dev_enet.h>
  33#include "bcm63xx_enet.h"
  34
  35static char bcm_enet_driver_name[] = "bcm63xx_enet";
  36static char bcm_enet_driver_version[] = "1.0";
  37
  38static int copybreak __read_mostly = 128;
  39module_param(copybreak, int, 0);
  40MODULE_PARM_DESC(copybreak, "Receive copy threshold");
  41
  42/* io memory shared between all devices */
  43static void __iomem *bcm_enet_shared_base;
  44
  45/*
  46 * io helpers to access mac registers
  47 */
  48static inline u32 enet_readl(struct bcm_enet_priv *priv, u32 off)
  49{
  50        return bcm_readl(priv->base + off);
  51}
  52
  53static inline void enet_writel(struct bcm_enet_priv *priv,
  54                               u32 val, u32 off)
  55{
  56        bcm_writel(val, priv->base + off);
  57}
  58
  59/*
  60 * io helpers to access shared registers
  61 */
  62static inline u32 enet_dma_readl(struct bcm_enet_priv *priv, u32 off)
  63{
  64        return bcm_readl(bcm_enet_shared_base + off);
  65}
  66
  67static inline void enet_dma_writel(struct bcm_enet_priv *priv,
  68                                       u32 val, u32 off)
  69{
  70        bcm_writel(val, bcm_enet_shared_base + off);
  71}
  72
  73/*
  74 * write given data into mii register and wait for transfer to end
  75 * with timeout (average measured transfer time is 25us)
  76 */
  77static int do_mdio_op(struct bcm_enet_priv *priv, unsigned int data)
  78{
  79        int limit;
  80
  81        /* make sure mii interrupt status is cleared */
  82        enet_writel(priv, ENET_IR_MII, ENET_IR_REG);
  83
  84        enet_writel(priv, data, ENET_MIIDATA_REG);
  85        wmb();
  86
  87        /* busy wait on mii interrupt bit, with timeout */
  88        limit = 1000;
  89        do {
  90                if (enet_readl(priv, ENET_IR_REG) & ENET_IR_MII)
  91                        break;
  92                udelay(1);
  93        } while (limit-- > 0);
  94
  95        return (limit < 0) ? 1 : 0;
  96}
  97
  98/*
  99 * MII internal read callback
 100 */
 101static int bcm_enet_mdio_read(struct bcm_enet_priv *priv, int mii_id,
 102                              int regnum)
 103{
 104        u32 tmp, val;
 105
 106        tmp = regnum << ENET_MIIDATA_REG_SHIFT;
 107        tmp |= 0x2 << ENET_MIIDATA_TA_SHIFT;
 108        tmp |= mii_id << ENET_MIIDATA_PHYID_SHIFT;
 109        tmp |= ENET_MIIDATA_OP_READ_MASK;
 110
 111        if (do_mdio_op(priv, tmp))
 112                return -1;
 113
 114        val = enet_readl(priv, ENET_MIIDATA_REG);
 115        val &= 0xffff;
 116        return val;
 117}
 118
 119/*
 120 * MII internal write callback
 121 */
 122static int bcm_enet_mdio_write(struct bcm_enet_priv *priv, int mii_id,
 123                               int regnum, u16 value)
 124{
 125        u32 tmp;
 126
 127        tmp = (value & 0xffff) << ENET_MIIDATA_DATA_SHIFT;
 128        tmp |= 0x2 << ENET_MIIDATA_TA_SHIFT;
 129        tmp |= regnum << ENET_MIIDATA_REG_SHIFT;
 130        tmp |= mii_id << ENET_MIIDATA_PHYID_SHIFT;
 131        tmp |= ENET_MIIDATA_OP_WRITE_MASK;
 132
 133        (void)do_mdio_op(priv, tmp);
 134        return 0;
 135}
 136
 137/*
 138 * MII read callback from phylib
 139 */
 140static int bcm_enet_mdio_read_phylib(struct mii_bus *bus, int mii_id,
 141                                     int regnum)
 142{
 143        return bcm_enet_mdio_read(bus->priv, mii_id, regnum);
 144}
 145
 146/*
 147 * MII write callback from phylib
 148 */
 149static int bcm_enet_mdio_write_phylib(struct mii_bus *bus, int mii_id,
 150                                      int regnum, u16 value)
 151{
 152        return bcm_enet_mdio_write(bus->priv, mii_id, regnum, value);
 153}
 154
 155/*
 156 * MII read callback from mii core
 157 */
 158static int bcm_enet_mdio_read_mii(struct net_device *dev, int mii_id,
 159                                  int regnum)
 160{
 161        return bcm_enet_mdio_read(netdev_priv(dev), mii_id, regnum);
 162}
 163
 164/*
 165 * MII write callback from mii core
 166 */
 167static void bcm_enet_mdio_write_mii(struct net_device *dev, int mii_id,
 168                                    int regnum, int value)
 169{
 170        bcm_enet_mdio_write(netdev_priv(dev), mii_id, regnum, value);
 171}
 172
 173/*
 174 * refill rx queue
 175 */
 176static int bcm_enet_refill_rx(struct net_device *dev)
 177{
 178        struct bcm_enet_priv *priv;
 179
 180        priv = netdev_priv(dev);
 181
 182        while (priv->rx_desc_count < priv->rx_ring_size) {
 183                struct bcm_enet_desc *desc;
 184                struct sk_buff *skb;
 185                dma_addr_t p;
 186                int desc_idx;
 187                u32 len_stat;
 188
 189                desc_idx = priv->rx_dirty_desc;
 190                desc = &priv->rx_desc_cpu[desc_idx];
 191
 192                if (!priv->rx_skb[desc_idx]) {
 193                        skb = netdev_alloc_skb(dev, priv->rx_skb_size);
 194                        if (!skb)
 195                                break;
 196                        priv->rx_skb[desc_idx] = skb;
 197
 198                        p = dma_map_single(&priv->pdev->dev, skb->data,
 199                                           priv->rx_skb_size,
 200                                           DMA_FROM_DEVICE);
 201                        desc->address = p;
 202                }
 203
 204                len_stat = priv->rx_skb_size << DMADESC_LENGTH_SHIFT;
 205                len_stat |= DMADESC_OWNER_MASK;
 206                if (priv->rx_dirty_desc == priv->rx_ring_size - 1) {
 207                        len_stat |= DMADESC_WRAP_MASK;
 208                        priv->rx_dirty_desc = 0;
 209                } else {
 210                        priv->rx_dirty_desc++;
 211                }
 212                wmb();
 213                desc->len_stat = len_stat;
 214
 215                priv->rx_desc_count++;
 216
 217                /* tell dma engine we allocated one buffer */
 218                enet_dma_writel(priv, 1, ENETDMA_BUFALLOC_REG(priv->rx_chan));
 219        }
 220
 221        /* If rx ring is still empty, set a timer to try allocating
 222         * again at a later time. */
 223        if (priv->rx_desc_count == 0 && netif_running(dev)) {
 224                dev_warn(&priv->pdev->dev, "unable to refill rx ring\n");
 225                priv->rx_timeout.expires = jiffies + HZ;
 226                add_timer(&priv->rx_timeout);
 227        }
 228
 229        return 0;
 230}
 231
 232/*
 233 * timer callback to defer refill rx queue in case we're OOM
 234 */
 235static void bcm_enet_refill_rx_timer(unsigned long data)
 236{
 237        struct net_device *dev;
 238        struct bcm_enet_priv *priv;
 239
 240        dev = (struct net_device *)data;
 241        priv = netdev_priv(dev);
 242
 243        spin_lock(&priv->rx_lock);
 244        bcm_enet_refill_rx((struct net_device *)data);
 245        spin_unlock(&priv->rx_lock);
 246}
 247
 248/*
 249 * extract packet from rx queue
 250 */
 251static int bcm_enet_receive_queue(struct net_device *dev, int budget)
 252{
 253        struct bcm_enet_priv *priv;
 254        struct device *kdev;
 255        int processed;
 256
 257        priv = netdev_priv(dev);
 258        kdev = &priv->pdev->dev;
 259        processed = 0;
 260
 261        /* don't scan ring further than number of refilled
 262         * descriptor */
 263        if (budget > priv->rx_desc_count)
 264                budget = priv->rx_desc_count;
 265
 266        do {
 267                struct bcm_enet_desc *desc;
 268                struct sk_buff *skb;
 269                int desc_idx;
 270                u32 len_stat;
 271                unsigned int len;
 272
 273                desc_idx = priv->rx_curr_desc;
 274                desc = &priv->rx_desc_cpu[desc_idx];
 275
 276                /* make sure we actually read the descriptor status at
 277                 * each loop */
 278                rmb();
 279
 280                len_stat = desc->len_stat;
 281
 282                /* break if dma ownership belongs to hw */
 283                if (len_stat & DMADESC_OWNER_MASK)
 284                        break;
 285
 286                processed++;
 287                priv->rx_curr_desc++;
 288                if (priv->rx_curr_desc == priv->rx_ring_size)
 289                        priv->rx_curr_desc = 0;
 290                priv->rx_desc_count--;
 291
 292                /* if the packet does not have start of packet _and_
 293                 * end of packet flag set, then just recycle it */
 294                if ((len_stat & DMADESC_ESOP_MASK) != DMADESC_ESOP_MASK) {
 295                        priv->stats.rx_dropped++;
 296                        continue;
 297                }
 298
 299                /* recycle packet if it's marked as bad */
 300                if (unlikely(len_stat & DMADESC_ERR_MASK)) {
 301                        priv->stats.rx_errors++;
 302
 303                        if (len_stat & DMADESC_OVSIZE_MASK)
 304                                priv->stats.rx_length_errors++;
 305                        if (len_stat & DMADESC_CRC_MASK)
 306                                priv->stats.rx_crc_errors++;
 307                        if (len_stat & DMADESC_UNDER_MASK)
 308                                priv->stats.rx_frame_errors++;
 309                        if (len_stat & DMADESC_OV_MASK)
 310                                priv->stats.rx_fifo_errors++;
 311                        continue;
 312                }
 313
 314                /* valid packet */
 315                skb = priv->rx_skb[desc_idx];
 316                len = (len_stat & DMADESC_LENGTH_MASK) >> DMADESC_LENGTH_SHIFT;
 317                /* don't include FCS */
 318                len -= 4;
 319
 320                if (len < copybreak) {
 321                        struct sk_buff *nskb;
 322
 323                        nskb = netdev_alloc_skb_ip_align(dev, len);
 324                        if (!nskb) {
 325                                /* forget packet, just rearm desc */
 326                                priv->stats.rx_dropped++;
 327                                continue;
 328                        }
 329
 330                        dma_sync_single_for_cpu(kdev, desc->address,
 331                                                len, DMA_FROM_DEVICE);
 332                        memcpy(nskb->data, skb->data, len);
 333                        dma_sync_single_for_device(kdev, desc->address,
 334                                                   len, DMA_FROM_DEVICE);
 335                        skb = nskb;
 336                } else {
 337                        dma_unmap_single(&priv->pdev->dev, desc->address,
 338                                         priv->rx_skb_size, DMA_FROM_DEVICE);
 339                        priv->rx_skb[desc_idx] = NULL;
 340                }
 341
 342                skb_put(skb, len);
 343                skb->dev = dev;
 344                skb->protocol = eth_type_trans(skb, dev);
 345                priv->stats.rx_packets++;
 346                priv->stats.rx_bytes += len;
 347                dev->last_rx = jiffies;
 348                netif_receive_skb(skb);
 349
 350        } while (--budget > 0);
 351
 352        if (processed || !priv->rx_desc_count) {
 353                bcm_enet_refill_rx(dev);
 354
 355                /* kick rx dma */
 356                enet_dma_writel(priv, ENETDMA_CHANCFG_EN_MASK,
 357                                ENETDMA_CHANCFG_REG(priv->rx_chan));
 358        }
 359
 360        return processed;
 361}
 362
 363
 364/*
 365 * try to or force reclaim of transmitted buffers
 366 */
 367static int bcm_enet_tx_reclaim(struct net_device *dev, int force)
 368{
 369        struct bcm_enet_priv *priv;
 370        int released;
 371
 372        priv = netdev_priv(dev);
 373        released = 0;
 374
 375        while (priv->tx_desc_count < priv->tx_ring_size) {
 376                struct bcm_enet_desc *desc;
 377                struct sk_buff *skb;
 378
 379                /* We run in a bh and fight against start_xmit, which
 380                 * is called with bh disabled  */
 381                spin_lock(&priv->tx_lock);
 382
 383                desc = &priv->tx_desc_cpu[priv->tx_dirty_desc];
 384
 385                if (!force && (desc->len_stat & DMADESC_OWNER_MASK)) {
 386                        spin_unlock(&priv->tx_lock);
 387                        break;
 388                }
 389
 390                /* ensure other field of the descriptor were not read
 391                 * before we checked ownership */
 392                rmb();
 393
 394                skb = priv->tx_skb[priv->tx_dirty_desc];
 395                priv->tx_skb[priv->tx_dirty_desc] = NULL;
 396                dma_unmap_single(&priv->pdev->dev, desc->address, skb->len,
 397                                 DMA_TO_DEVICE);
 398
 399                priv->tx_dirty_desc++;
 400                if (priv->tx_dirty_desc == priv->tx_ring_size)
 401                        priv->tx_dirty_desc = 0;
 402                priv->tx_desc_count++;
 403
 404                spin_unlock(&priv->tx_lock);
 405
 406                if (desc->len_stat & DMADESC_UNDER_MASK)
 407                        priv->stats.tx_errors++;
 408
 409                dev_kfree_skb(skb);
 410                released++;
 411        }
 412
 413        if (netif_queue_stopped(dev) && released)
 414                netif_wake_queue(dev);
 415
 416        return released;
 417}
 418
 419/*
 420 * poll func, called by network core
 421 */
 422static int bcm_enet_poll(struct napi_struct *napi, int budget)
 423{
 424        struct bcm_enet_priv *priv;
 425        struct net_device *dev;
 426        int tx_work_done, rx_work_done;
 427
 428        priv = container_of(napi, struct bcm_enet_priv, napi);
 429        dev = priv->net_dev;
 430
 431        /* ack interrupts */
 432        enet_dma_writel(priv, ENETDMA_IR_PKTDONE_MASK,
 433                        ENETDMA_IR_REG(priv->rx_chan));
 434        enet_dma_writel(priv, ENETDMA_IR_PKTDONE_MASK,
 435                        ENETDMA_IR_REG(priv->tx_chan));
 436
 437        /* reclaim sent skb */
 438        tx_work_done = bcm_enet_tx_reclaim(dev, 0);
 439
 440        spin_lock(&priv->rx_lock);
 441        rx_work_done = bcm_enet_receive_queue(dev, budget);
 442        spin_unlock(&priv->rx_lock);
 443
 444        if (rx_work_done >= budget || tx_work_done > 0) {
 445                /* rx/tx queue is not yet empty/clean */
 446                return rx_work_done;
 447        }
 448
 449        /* no more packet in rx/tx queue, remove device from poll
 450         * queue */
 451        napi_complete(napi);
 452
 453        /* restore rx/tx interrupt */
 454        enet_dma_writel(priv, ENETDMA_IR_PKTDONE_MASK,
 455                        ENETDMA_IRMASK_REG(priv->rx_chan));
 456        enet_dma_writel(priv, ENETDMA_IR_PKTDONE_MASK,
 457                        ENETDMA_IRMASK_REG(priv->tx_chan));
 458
 459        return rx_work_done;
 460}
 461
 462/*
 463 * mac interrupt handler
 464 */
 465static irqreturn_t bcm_enet_isr_mac(int irq, void *dev_id)
 466{
 467        struct net_device *dev;
 468        struct bcm_enet_priv *priv;
 469        u32 stat;
 470
 471        dev = dev_id;
 472        priv = netdev_priv(dev);
 473
 474        stat = enet_readl(priv, ENET_IR_REG);
 475        if (!(stat & ENET_IR_MIB))
 476                return IRQ_NONE;
 477
 478        /* clear & mask interrupt */
 479        enet_writel(priv, ENET_IR_MIB, ENET_IR_REG);
 480        enet_writel(priv, 0, ENET_IRMASK_REG);
 481
 482        /* read mib registers in workqueue */
 483        schedule_work(&priv->mib_update_task);
 484
 485        return IRQ_HANDLED;
 486}
 487
 488/*
 489 * rx/tx dma interrupt handler
 490 */
 491static irqreturn_t bcm_enet_isr_dma(int irq, void *dev_id)
 492{
 493        struct net_device *dev;
 494        struct bcm_enet_priv *priv;
 495
 496        dev = dev_id;
 497        priv = netdev_priv(dev);
 498
 499        /* mask rx/tx interrupts */
 500        enet_dma_writel(priv, 0, ENETDMA_IRMASK_REG(priv->rx_chan));
 501        enet_dma_writel(priv, 0, ENETDMA_IRMASK_REG(priv->tx_chan));
 502
 503        napi_schedule(&priv->napi);
 504
 505        return IRQ_HANDLED;
 506}
 507
 508/*
 509 * tx request callback
 510 */
 511static int bcm_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
 512{
 513        struct bcm_enet_priv *priv;
 514        struct bcm_enet_desc *desc;
 515        u32 len_stat;
 516        int ret;
 517
 518        priv = netdev_priv(dev);
 519
 520        /* lock against tx reclaim */
 521        spin_lock(&priv->tx_lock);
 522
 523        /* make sure  the tx hw queue  is not full,  should not happen
 524         * since we stop queue before it's the case */
 525        if (unlikely(!priv->tx_desc_count)) {
 526                netif_stop_queue(dev);
 527                dev_err(&priv->pdev->dev, "xmit called with no tx desc "
 528                        "available?\n");
 529                ret = NETDEV_TX_BUSY;
 530                goto out_unlock;
 531        }
 532
 533        /* point to the next available desc */
 534        desc = &priv->tx_desc_cpu[priv->tx_curr_desc];
 535        priv->tx_skb[priv->tx_curr_desc] = skb;
 536
 537        /* fill descriptor */
 538        desc->address = dma_map_single(&priv->pdev->dev, skb->data, skb->len,
 539                                       DMA_TO_DEVICE);
 540
 541        len_stat = (skb->len << DMADESC_LENGTH_SHIFT) & DMADESC_LENGTH_MASK;
 542        len_stat |= DMADESC_ESOP_MASK |
 543                DMADESC_APPEND_CRC |
 544                DMADESC_OWNER_MASK;
 545
 546        priv->tx_curr_desc++;
 547        if (priv->tx_curr_desc == priv->tx_ring_size) {
 548                priv->tx_curr_desc = 0;
 549                len_stat |= DMADESC_WRAP_MASK;
 550        }
 551        priv->tx_desc_count--;
 552
 553        /* dma might be already polling, make sure we update desc
 554         * fields in correct order */
 555        wmb();
 556        desc->len_stat = len_stat;
 557        wmb();
 558
 559        /* kick tx dma */
 560        enet_dma_writel(priv, ENETDMA_CHANCFG_EN_MASK,
 561                        ENETDMA_CHANCFG_REG(priv->tx_chan));
 562
 563        /* stop queue if no more desc available */
 564        if (!priv->tx_desc_count)
 565                netif_stop_queue(dev);
 566
 567        priv->stats.tx_bytes += skb->len;
 568        priv->stats.tx_packets++;
 569        dev->trans_start = jiffies;
 570        ret = NETDEV_TX_OK;
 571
 572out_unlock:
 573        spin_unlock(&priv->tx_lock);
 574        return ret;
 575}
 576
 577/*
 578 * Change the interface's mac address.
 579 */
 580static int bcm_enet_set_mac_address(struct net_device *dev, void *p)
 581{
 582        struct bcm_enet_priv *priv;
 583        struct sockaddr *addr = p;
 584        u32 val;
 585
 586        priv = netdev_priv(dev);
 587        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
 588
 589        /* use perfect match register 0 to store my mac address */
 590        val = (dev->dev_addr[2] << 24) | (dev->dev_addr[3] << 16) |
 591                (dev->dev_addr[4] << 8) | dev->dev_addr[5];
 592        enet_writel(priv, val, ENET_PML_REG(0));
 593
 594        val = (dev->dev_addr[0] << 8 | dev->dev_addr[1]);
 595        val |= ENET_PMH_DATAVALID_MASK;
 596        enet_writel(priv, val, ENET_PMH_REG(0));
 597
 598        return 0;
 599}
 600
 601/*
 602 * Change rx mode (promiscous/allmulti) and update multicast list
 603 */
 604static void bcm_enet_set_multicast_list(struct net_device *dev)
 605{
 606        struct bcm_enet_priv *priv;
 607        struct dev_mc_list *mc_list;
 608        u32 val;
 609        int i;
 610
 611        priv = netdev_priv(dev);
 612
 613        val = enet_readl(priv, ENET_RXCFG_REG);
 614
 615        if (dev->flags & IFF_PROMISC)
 616                val |= ENET_RXCFG_PROMISC_MASK;
 617        else
 618                val &= ~ENET_RXCFG_PROMISC_MASK;
 619
 620        /* only 3 perfect match registers left, first one is used for
 621         * own mac address */
 622        if ((dev->flags & IFF_ALLMULTI) || dev->mc_count > 3)
 623                val |= ENET_RXCFG_ALLMCAST_MASK;
 624        else
 625                val &= ~ENET_RXCFG_ALLMCAST_MASK;
 626
 627        /* no need to set perfect match registers if we catch all
 628         * multicast */
 629        if (val & ENET_RXCFG_ALLMCAST_MASK) {
 630                enet_writel(priv, val, ENET_RXCFG_REG);
 631                return;
 632        }
 633
 634        for (i = 0, mc_list = dev->mc_list;
 635             (mc_list != NULL) && (i < dev->mc_count) && (i < 3);
 636             i++, mc_list = mc_list->next) {
 637                u8 *dmi_addr;
 638                u32 tmp;
 639
 640                /* filter non ethernet address */
 641                if (mc_list->dmi_addrlen != 6)
 642                        continue;
 643
 644                /* update perfect match registers */
 645                dmi_addr = mc_list->dmi_addr;
 646                tmp = (dmi_addr[2] << 24) | (dmi_addr[3] << 16) |
 647                        (dmi_addr[4] << 8) | dmi_addr[5];
 648                enet_writel(priv, tmp, ENET_PML_REG(i + 1));
 649
 650                tmp = (dmi_addr[0] << 8 | dmi_addr[1]);
 651                tmp |= ENET_PMH_DATAVALID_MASK;
 652                enet_writel(priv, tmp, ENET_PMH_REG(i + 1));
 653        }
 654
 655        for (; i < 3; i++) {
 656                enet_writel(priv, 0, ENET_PML_REG(i + 1));
 657                enet_writel(priv, 0, ENET_PMH_REG(i + 1));
 658        }
 659
 660        enet_writel(priv, val, ENET_RXCFG_REG);
 661}
 662
 663/*
 664 * set mac duplex parameters
 665 */
 666static void bcm_enet_set_duplex(struct bcm_enet_priv *priv, int fullduplex)
 667{
 668        u32 val;
 669
 670        val = enet_readl(priv, ENET_TXCTL_REG);
 671        if (fullduplex)
 672                val |= ENET_TXCTL_FD_MASK;
 673        else
 674                val &= ~ENET_TXCTL_FD_MASK;
 675        enet_writel(priv, val, ENET_TXCTL_REG);
 676}
 677
 678/*
 679 * set mac flow control parameters
 680 */
 681static void bcm_enet_set_flow(struct bcm_enet_priv *priv, int rx_en, int tx_en)
 682{
 683        u32 val;
 684
 685        /* rx flow control (pause frame handling) */
 686        val = enet_readl(priv, ENET_RXCFG_REG);
 687        if (rx_en)
 688                val |= ENET_RXCFG_ENFLOW_MASK;
 689        else
 690                val &= ~ENET_RXCFG_ENFLOW_MASK;
 691        enet_writel(priv, val, ENET_RXCFG_REG);
 692
 693        /* tx flow control (pause frame generation) */
 694        val = enet_dma_readl(priv, ENETDMA_CFG_REG);
 695        if (tx_en)
 696                val |= ENETDMA_CFG_FLOWCH_MASK(priv->rx_chan);
 697        else
 698                val &= ~ENETDMA_CFG_FLOWCH_MASK(priv->rx_chan);
 699        enet_dma_writel(priv, val, ENETDMA_CFG_REG);
 700}
 701
 702/*
 703 * link changed callback (from phylib)
 704 */
 705static void bcm_enet_adjust_phy_link(struct net_device *dev)
 706{
 707        struct bcm_enet_priv *priv;
 708        struct phy_device *phydev;
 709        int status_changed;
 710
 711        priv = netdev_priv(dev);
 712        phydev = priv->phydev;
 713        status_changed = 0;
 714
 715        if (priv->old_link != phydev->link) {
 716                status_changed = 1;
 717                priv->old_link = phydev->link;
 718        }
 719
 720        /* reflect duplex change in mac configuration */
 721        if (phydev->link && phydev->duplex != priv->old_duplex) {
 722                bcm_enet_set_duplex(priv,
 723                                    (phydev->duplex == DUPLEX_FULL) ? 1 : 0);
 724                status_changed = 1;
 725                priv->old_duplex = phydev->duplex;
 726        }
 727
 728        /* enable flow control if remote advertise it (trust phylib to
 729         * check that duplex is full */
 730        if (phydev->link && phydev->pause != priv->old_pause) {
 731                int rx_pause_en, tx_pause_en;
 732
 733                if (phydev->pause) {
 734                        /* pause was advertised by lpa and us */
 735                        rx_pause_en = 1;
 736                        tx_pause_en = 1;
 737                } else if (!priv->pause_auto) {
 738                        /* pause setting overrided by user */
 739                        rx_pause_en = priv->pause_rx;
 740                        tx_pause_en = priv->pause_tx;
 741                } else {
 742                        rx_pause_en = 0;
 743                        tx_pause_en = 0;
 744                }
 745
 746                bcm_enet_set_flow(priv, rx_pause_en, tx_pause_en);
 747                status_changed = 1;
 748                priv->old_pause = phydev->pause;
 749        }
 750
 751        if (status_changed) {
 752                pr_info("%s: link %s", dev->name, phydev->link ?
 753                        "UP" : "DOWN");
 754                if (phydev->link)
 755                        pr_cont(" - %d/%s - flow control %s", phydev->speed,
 756                               DUPLEX_FULL == phydev->duplex ? "full" : "half",
 757                               phydev->pause == 1 ? "rx&tx" : "off");
 758
 759                pr_cont("\n");
 760        }
 761}
 762
 763/*
 764 * link changed callback (if phylib is not used)
 765 */
 766static void bcm_enet_adjust_link(struct net_device *dev)
 767{
 768        struct bcm_enet_priv *priv;
 769
 770        priv = netdev_priv(dev);
 771        bcm_enet_set_duplex(priv, priv->force_duplex_full);
 772        bcm_enet_set_flow(priv, priv->pause_rx, priv->pause_tx);
 773        netif_carrier_on(dev);
 774
 775        pr_info("%s: link forced UP - %d/%s - flow control %s/%s\n",
 776                dev->name,
 777                priv->force_speed_100 ? 100 : 10,
 778                priv->force_duplex_full ? "full" : "half",
 779                priv->pause_rx ? "rx" : "off",
 780                priv->pause_tx ? "tx" : "off");
 781}
 782
 783/*
 784 * open callback, allocate dma rings & buffers and start rx operation
 785 */
 786static int bcm_enet_open(struct net_device *dev)
 787{
 788        struct bcm_enet_priv *priv;
 789        struct sockaddr addr;
 790        struct device *kdev;
 791        struct phy_device *phydev;
 792        int i, ret;
 793        unsigned int size;
 794        char phy_id[MII_BUS_ID_SIZE + 3];
 795        void *p;
 796        u32 val;
 797
 798        priv = netdev_priv(dev);
 799        kdev = &priv->pdev->dev;
 800
 801        if (priv->has_phy) {
 802                /* connect to PHY */
 803                snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT,
 804                         priv->mac_id ? "1" : "0", priv->phy_id);
 805
 806                phydev = phy_connect(dev, phy_id, &bcm_enet_adjust_phy_link, 0,
 807                                     PHY_INTERFACE_MODE_MII);
 808
 809                if (IS_ERR(phydev)) {
 810                        dev_err(kdev, "could not attach to PHY\n");
 811                        return PTR_ERR(phydev);
 812                }
 813
 814                /* mask with MAC supported features */
 815                phydev->supported &= (SUPPORTED_10baseT_Half |
 816                                      SUPPORTED_10baseT_Full |
 817                                      SUPPORTED_100baseT_Half |
 818                                      SUPPORTED_100baseT_Full |
 819                                      SUPPORTED_Autoneg |
 820                                      SUPPORTED_Pause |
 821                                      SUPPORTED_MII);
 822                phydev->advertising = phydev->supported;
 823
 824                if (priv->pause_auto && priv->pause_rx && priv->pause_tx)
 825                        phydev->advertising |= SUPPORTED_Pause;
 826                else
 827                        phydev->advertising &= ~SUPPORTED_Pause;
 828
 829                dev_info(kdev, "attached PHY at address %d [%s]\n",
 830                         phydev->addr, phydev->drv->name);
 831
 832                priv->old_link = 0;
 833                priv->old_duplex = -1;
 834                priv->old_pause = -1;
 835                priv->phydev = phydev;
 836        }
 837
 838        /* mask all interrupts and request them */
 839        enet_writel(priv, 0, ENET_IRMASK_REG);
 840        enet_dma_writel(priv, 0, ENETDMA_IRMASK_REG(priv->rx_chan));
 841        enet_dma_writel(priv, 0, ENETDMA_IRMASK_REG(priv->tx_chan));
 842
 843        ret = request_irq(dev->irq, bcm_enet_isr_mac, 0, dev->name, dev);
 844        if (ret)
 845                goto out_phy_disconnect;
 846
 847        ret = request_irq(priv->irq_rx, bcm_enet_isr_dma,
 848                          IRQF_SAMPLE_RANDOM | IRQF_DISABLED, dev->name, dev);
 849        if (ret)
 850                goto out_freeirq;
 851
 852        ret = request_irq(priv->irq_tx, bcm_enet_isr_dma,
 853                          IRQF_DISABLED, dev->name, dev);
 854        if (ret)
 855                goto out_freeirq_rx;
 856
 857        /* initialize perfect match registers */
 858        for (i = 0; i < 4; i++) {
 859                enet_writel(priv, 0, ENET_PML_REG(i));
 860                enet_writel(priv, 0, ENET_PMH_REG(i));
 861        }
 862
 863        /* write device mac address */
 864        memcpy(addr.sa_data, dev->dev_addr, ETH_ALEN);
 865        bcm_enet_set_mac_address(dev, &addr);
 866
 867        /* allocate rx dma ring */
 868        size = priv->rx_ring_size * sizeof(struct bcm_enet_desc);
 869        p = dma_alloc_coherent(kdev, size, &priv->rx_desc_dma, GFP_KERNEL);
 870        if (!p) {
 871                dev_err(kdev, "cannot allocate rx ring %u\n", size);
 872                ret = -ENOMEM;
 873                goto out_freeirq_tx;
 874        }
 875
 876        memset(p, 0, size);
 877        priv->rx_desc_alloc_size = size;
 878        priv->rx_desc_cpu = p;
 879
 880        /* allocate tx dma ring */
 881        size = priv->tx_ring_size * sizeof(struct bcm_enet_desc);
 882        p = dma_alloc_coherent(kdev, size, &priv->tx_desc_dma, GFP_KERNEL);
 883        if (!p) {
 884                dev_err(kdev, "cannot allocate tx ring\n");
 885                ret = -ENOMEM;
 886                goto out_free_rx_ring;
 887        }
 888
 889        memset(p, 0, size);
 890        priv->tx_desc_alloc_size = size;
 891        priv->tx_desc_cpu = p;
 892
 893        priv->tx_skb = kzalloc(sizeof(struct sk_buff *) * priv->tx_ring_size,
 894                               GFP_KERNEL);
 895        if (!priv->tx_skb) {
 896                dev_err(kdev, "cannot allocate rx skb queue\n");
 897                ret = -ENOMEM;
 898                goto out_free_tx_ring;
 899        }
 900
 901        priv->tx_desc_count = priv->tx_ring_size;
 902        priv->tx_dirty_desc = 0;
 903        priv->tx_curr_desc = 0;
 904        spin_lock_init(&priv->tx_lock);
 905
 906        /* init & fill rx ring with skbs */
 907        priv->rx_skb = kzalloc(sizeof(struct sk_buff *) * priv->rx_ring_size,
 908                               GFP_KERNEL);
 909        if (!priv->rx_skb) {
 910                dev_err(kdev, "cannot allocate rx skb queue\n");
 911                ret = -ENOMEM;
 912                goto out_free_tx_skb;
 913        }
 914
 915        priv->rx_desc_count = 0;
 916        priv->rx_dirty_desc = 0;
 917        priv->rx_curr_desc = 0;
 918
 919        /* initialize flow control buffer allocation */
 920        enet_dma_writel(priv, ENETDMA_BUFALLOC_FORCE_MASK | 0,
 921                        ENETDMA_BUFALLOC_REG(priv->rx_chan));
 922
 923        if (bcm_enet_refill_rx(dev)) {
 924                dev_err(kdev, "cannot allocate rx skb queue\n");
 925                ret = -ENOMEM;
 926                goto out;
 927        }
 928
 929        /* write rx & tx ring addresses */
 930        enet_dma_writel(priv, priv->rx_desc_dma,
 931                        ENETDMA_RSTART_REG(priv->rx_chan));
 932        enet_dma_writel(priv, priv->tx_desc_dma,
 933                        ENETDMA_RSTART_REG(priv->tx_chan));
 934
 935        /* clear remaining state ram for rx & tx channel */
 936        enet_dma_writel(priv, 0, ENETDMA_SRAM2_REG(priv->rx_chan));
 937        enet_dma_writel(priv, 0, ENETDMA_SRAM2_REG(priv->tx_chan));
 938        enet_dma_writel(priv, 0, ENETDMA_SRAM3_REG(priv->rx_chan));
 939        enet_dma_writel(priv, 0, ENETDMA_SRAM3_REG(priv->tx_chan));
 940        enet_dma_writel(priv, 0, ENETDMA_SRAM4_REG(priv->rx_chan));
 941        enet_dma_writel(priv, 0, ENETDMA_SRAM4_REG(priv->tx_chan));
 942
 943        /* set max rx/tx length */
 944        enet_writel(priv, priv->hw_mtu, ENET_RXMAXLEN_REG);
 945        enet_writel(priv, priv->hw_mtu, ENET_TXMAXLEN_REG);
 946
 947        /* set dma maximum burst len */
 948        enet_dma_writel(priv, BCMENET_DMA_MAXBURST,
 949                        ENETDMA_MAXBURST_REG(priv->rx_chan));
 950        enet_dma_writel(priv, BCMENET_DMA_MAXBURST,
 951                        ENETDMA_MAXBURST_REG(priv->tx_chan));
 952
 953        /* set correct transmit fifo watermark */
 954        enet_writel(priv, BCMENET_TX_FIFO_TRESH, ENET_TXWMARK_REG);
 955
 956        /* set flow control low/high threshold to 1/3 / 2/3 */
 957        val = priv->rx_ring_size / 3;
 958        enet_dma_writel(priv, val, ENETDMA_FLOWCL_REG(priv->rx_chan));
 959        val = (priv->rx_ring_size * 2) / 3;
 960        enet_dma_writel(priv, val, ENETDMA_FLOWCH_REG(priv->rx_chan));
 961
 962        /* all set, enable mac and interrupts, start dma engine and
 963         * kick rx dma channel */
 964        wmb();
 965        enet_writel(priv, ENET_CTL_ENABLE_MASK, ENET_CTL_REG);
 966        enet_dma_writel(priv, ENETDMA_CFG_EN_MASK, ENETDMA_CFG_REG);
 967        enet_dma_writel(priv, ENETDMA_CHANCFG_EN_MASK,
 968                        ENETDMA_CHANCFG_REG(priv->rx_chan));
 969
 970        /* watch "mib counters about to overflow" interrupt */
 971        enet_writel(priv, ENET_IR_MIB, ENET_IR_REG);
 972        enet_writel(priv, ENET_IR_MIB, ENET_IRMASK_REG);
 973
 974        /* watch "packet transferred" interrupt in rx and tx */
 975        enet_dma_writel(priv, ENETDMA_IR_PKTDONE_MASK,
 976                        ENETDMA_IR_REG(priv->rx_chan));
 977        enet_dma_writel(priv, ENETDMA_IR_PKTDONE_MASK,
 978                        ENETDMA_IR_REG(priv->tx_chan));
 979
 980        /* make sure we enable napi before rx interrupt  */
 981        napi_enable(&priv->napi);
 982
 983        enet_dma_writel(priv, ENETDMA_IR_PKTDONE_MASK,
 984                        ENETDMA_IRMASK_REG(priv->rx_chan));
 985        enet_dma_writel(priv, ENETDMA_IR_PKTDONE_MASK,
 986                        ENETDMA_IRMASK_REG(priv->tx_chan));
 987
 988        if (priv->has_phy)
 989                phy_start(priv->phydev);
 990        else
 991                bcm_enet_adjust_link(dev);
 992
 993        netif_start_queue(dev);
 994        return 0;
 995
 996out:
 997        for (i = 0; i < priv->rx_ring_size; i++) {
 998                struct bcm_enet_desc *desc;
 999
1000                if (!priv->rx_skb[i])
1001                        continue;
1002
1003                desc = &priv->rx_desc_cpu[i];
1004                dma_unmap_single(kdev, desc->address, priv->rx_skb_size,
1005                                 DMA_FROM_DEVICE);
1006                kfree_skb(priv->rx_skb[i]);
1007        }
1008        kfree(priv->rx_skb);
1009
1010out_free_tx_skb:
1011        kfree(priv->tx_skb);
1012
1013out_free_tx_ring:
1014        dma_free_coherent(kdev, priv->tx_desc_alloc_size,
1015                          priv->tx_desc_cpu, priv->tx_desc_dma);
1016
1017out_free_rx_ring:
1018        dma_free_coherent(kdev, priv->rx_desc_alloc_size,
1019                          priv->rx_desc_cpu, priv->rx_desc_dma);
1020
1021out_freeirq_tx:
1022        free_irq(priv->irq_tx, dev);
1023
1024out_freeirq_rx:
1025        free_irq(priv->irq_rx, dev);
1026
1027out_freeirq:
1028        free_irq(dev->irq, dev);
1029
1030out_phy_disconnect:
1031        phy_disconnect(priv->phydev);
1032
1033        return ret;
1034}
1035
1036/*
1037 * disable mac
1038 */
1039static void bcm_enet_disable_mac(struct bcm_enet_priv *priv)
1040{
1041        int limit;
1042        u32 val;
1043
1044        val = enet_readl(priv, ENET_CTL_REG);
1045        val |= ENET_CTL_DISABLE_MASK;
1046        enet_writel(priv, val, ENET_CTL_REG);
1047
1048        limit = 1000;
1049        do {
1050                u32 val;
1051
1052                val = enet_readl(priv, ENET_CTL_REG);
1053                if (!(val & ENET_CTL_DISABLE_MASK))
1054                        break;
1055                udelay(1);
1056        } while (limit--);
1057}
1058
1059/*
1060 * disable dma in given channel
1061 */
1062static void bcm_enet_disable_dma(struct bcm_enet_priv *priv, int chan)
1063{
1064        int limit;
1065
1066        enet_dma_writel(priv, 0, ENETDMA_CHANCFG_REG(chan));
1067
1068        limit = 1000;
1069        do {
1070                u32 val;
1071
1072                val = enet_dma_readl(priv, ENETDMA_CHANCFG_REG(chan));
1073                if (!(val & ENETDMA_CHANCFG_EN_MASK))
1074                        break;
1075                udelay(1);
1076        } while (limit--);
1077}
1078
1079/*
1080 * stop callback
1081 */
1082static int bcm_enet_stop(struct net_device *dev)
1083{
1084        struct bcm_enet_priv *priv;
1085        struct device *kdev;
1086        int i;
1087
1088        priv = netdev_priv(dev);
1089        kdev = &priv->pdev->dev;
1090
1091        netif_stop_queue(dev);
1092        napi_disable(&priv->napi);
1093        if (priv->has_phy)
1094                phy_stop(priv->phydev);
1095        del_timer_sync(&priv->rx_timeout);
1096
1097        /* mask all interrupts */
1098        enet_writel(priv, 0, ENET_IRMASK_REG);
1099        enet_dma_writel(priv, 0, ENETDMA_IRMASK_REG(priv->rx_chan));
1100        enet_dma_writel(priv, 0, ENETDMA_IRMASK_REG(priv->tx_chan));
1101
1102        /* make sure no mib update is scheduled */
1103        flush_scheduled_work();
1104
1105        /* disable dma & mac */
1106        bcm_enet_disable_dma(priv, priv->tx_chan);
1107        bcm_enet_disable_dma(priv, priv->rx_chan);
1108        bcm_enet_disable_mac(priv);
1109
1110        /* force reclaim of all tx buffers */
1111        bcm_enet_tx_reclaim(dev, 1);
1112
1113        /* free the rx skb ring */
1114        for (i = 0; i < priv->rx_ring_size; i++) {
1115                struct bcm_enet_desc *desc;
1116
1117                if (!priv->rx_skb[i])
1118                        continue;
1119
1120                desc = &priv->rx_desc_cpu[i];
1121                dma_unmap_single(kdev, desc->address, priv->rx_skb_size,
1122                                 DMA_FROM_DEVICE);
1123                kfree_skb(priv->rx_skb[i]);
1124        }
1125
1126        /* free remaining allocated memory */
1127        kfree(priv->rx_skb);
1128        kfree(priv->tx_skb);
1129        dma_free_coherent(kdev, priv->rx_desc_alloc_size,
1130                          priv->rx_desc_cpu, priv->rx_desc_dma);
1131        dma_free_coherent(kdev, priv->tx_desc_alloc_size,
1132                          priv->tx_desc_cpu, priv->tx_desc_dma);
1133        free_irq(priv->irq_tx, dev);
1134        free_irq(priv->irq_rx, dev);
1135        free_irq(dev->irq, dev);
1136
1137        /* release phy */
1138        if (priv->has_phy) {
1139                phy_disconnect(priv->phydev);
1140                priv->phydev = NULL;
1141        }
1142
1143        return 0;
1144}
1145
1146/*
1147 * core request to return device rx/tx stats
1148 */
1149static struct net_device_stats *bcm_enet_get_stats(struct net_device *dev)
1150{
1151        struct bcm_enet_priv *priv;
1152
1153        priv = netdev_priv(dev);
1154        return &priv->stats;
1155}
1156
1157/*
1158 * ethtool callbacks
1159 */
1160struct bcm_enet_stats {
1161        char stat_string[ETH_GSTRING_LEN];
1162        int sizeof_stat;
1163        int stat_offset;
1164        int mib_reg;
1165};
1166
1167#define GEN_STAT(m) sizeof(((struct bcm_enet_priv *)0)->m),             \
1168                     offsetof(struct bcm_enet_priv, m)
1169
1170static const struct bcm_enet_stats bcm_enet_gstrings_stats[] = {
1171        { "rx_packets", GEN_STAT(stats.rx_packets), -1 },
1172        { "tx_packets", GEN_STAT(stats.tx_packets), -1 },
1173        { "rx_bytes", GEN_STAT(stats.rx_bytes), -1 },
1174        { "tx_bytes", GEN_STAT(stats.tx_bytes), -1 },
1175        { "rx_errors", GEN_STAT(stats.rx_errors), -1 },
1176        { "tx_errors", GEN_STAT(stats.tx_errors), -1 },
1177        { "rx_dropped", GEN_STAT(stats.rx_dropped), -1 },
1178        { "tx_dropped", GEN_STAT(stats.tx_dropped), -1 },
1179
1180        { "rx_good_octets", GEN_STAT(mib.rx_gd_octets), ETH_MIB_RX_GD_OCTETS},
1181        { "rx_good_pkts", GEN_STAT(mib.rx_gd_pkts), ETH_MIB_RX_GD_PKTS },
1182        { "rx_broadcast", GEN_STAT(mib.rx_brdcast), ETH_MIB_RX_BRDCAST },
1183        { "rx_multicast", GEN_STAT(mib.rx_mult), ETH_MIB_RX_MULT },
1184        { "rx_64_octets", GEN_STAT(mib.rx_64), ETH_MIB_RX_64 },
1185        { "rx_65_127_oct", GEN_STAT(mib.rx_65_127), ETH_MIB_RX_65_127 },
1186        { "rx_128_255_oct", GEN_STAT(mib.rx_128_255), ETH_MIB_RX_128_255 },
1187        { "rx_256_511_oct", GEN_STAT(mib.rx_256_511), ETH_MIB_RX_256_511 },
1188        { "rx_512_1023_oct", GEN_STAT(mib.rx_512_1023), ETH_MIB_RX_512_1023 },
1189        { "rx_1024_max_oct", GEN_STAT(mib.rx_1024_max), ETH_MIB_RX_1024_MAX },
1190        { "rx_jabber", GEN_STAT(mib.rx_jab), ETH_MIB_RX_JAB },
1191        { "rx_oversize", GEN_STAT(mib.rx_ovr), ETH_MIB_RX_OVR },
1192        { "rx_fragment", GEN_STAT(mib.rx_frag), ETH_MIB_RX_FRAG },
1193        { "rx_dropped", GEN_STAT(mib.rx_drop), ETH_MIB_RX_DROP },
1194        { "rx_crc_align", GEN_STAT(mib.rx_crc_align), ETH_MIB_RX_CRC_ALIGN },
1195        { "rx_undersize", GEN_STAT(mib.rx_und), ETH_MIB_RX_UND },
1196        { "rx_crc", GEN_STAT(mib.rx_crc), ETH_MIB_RX_CRC },
1197        { "rx_align", GEN_STAT(mib.rx_align), ETH_MIB_RX_ALIGN },
1198        { "rx_symbol_error", GEN_STAT(mib.rx_sym), ETH_MIB_RX_SYM },
1199        { "rx_pause", GEN_STAT(mib.rx_pause), ETH_MIB_RX_PAUSE },
1200        { "rx_control", GEN_STAT(mib.rx_cntrl), ETH_MIB_RX_CNTRL },
1201
1202        { "tx_good_octets", GEN_STAT(mib.tx_gd_octets), ETH_MIB_TX_GD_OCTETS },
1203        { "tx_good_pkts", GEN_STAT(mib.tx_gd_pkts), ETH_MIB_TX_GD_PKTS },
1204        { "tx_broadcast", GEN_STAT(mib.tx_brdcast), ETH_MIB_TX_BRDCAST },
1205        { "tx_multicast", GEN_STAT(mib.tx_mult), ETH_MIB_TX_MULT },
1206        { "tx_64_oct", GEN_STAT(mib.tx_64), ETH_MIB_TX_64 },
1207        { "tx_65_127_oct", GEN_STAT(mib.tx_65_127), ETH_MIB_TX_65_127 },
1208        { "tx_128_255_oct", GEN_STAT(mib.tx_128_255), ETH_MIB_TX_128_255 },
1209        { "tx_256_511_oct", GEN_STAT(mib.tx_256_511), ETH_MIB_TX_256_511 },
1210        { "tx_512_1023_oct", GEN_STAT(mib.tx_512_1023), ETH_MIB_TX_512_1023},
1211        { "tx_1024_max_oct", GEN_STAT(mib.tx_1024_max), ETH_MIB_TX_1024_MAX },
1212        { "tx_jabber", GEN_STAT(mib.tx_jab), ETH_MIB_TX_JAB },
1213        { "tx_oversize", GEN_STAT(mib.tx_ovr), ETH_MIB_TX_OVR },
1214        { "tx_fragment", GEN_STAT(mib.tx_frag), ETH_MIB_TX_FRAG },
1215        { "tx_underrun", GEN_STAT(mib.tx_underrun), ETH_MIB_TX_UNDERRUN },
1216        { "tx_collisions", GEN_STAT(mib.tx_col), ETH_MIB_TX_COL },
1217        { "tx_single_collision", GEN_STAT(mib.tx_1_col), ETH_MIB_TX_1_COL },
1218        { "tx_multiple_collision", GEN_STAT(mib.tx_m_col), ETH_MIB_TX_M_COL },
1219        { "tx_excess_collision", GEN_STAT(mib.tx_ex_col), ETH_MIB_TX_EX_COL },
1220        { "tx_late_collision", GEN_STAT(mib.tx_late), ETH_MIB_TX_LATE },
1221        { "tx_deferred", GEN_STAT(mib.tx_def), ETH_MIB_TX_DEF },
1222        { "tx_carrier_sense", GEN_STAT(mib.tx_crs), ETH_MIB_TX_CRS },
1223        { "tx_pause", GEN_STAT(mib.tx_pause), ETH_MIB_TX_PAUSE },
1224
1225};
1226
1227#define BCM_ENET_STATS_LEN      \
1228        (sizeof(bcm_enet_gstrings_stats) / sizeof(struct bcm_enet_stats))
1229
1230static const u32 unused_mib_regs[] = {
1231        ETH_MIB_TX_ALL_OCTETS,
1232        ETH_MIB_TX_ALL_PKTS,
1233        ETH_MIB_RX_ALL_OCTETS,
1234        ETH_MIB_RX_ALL_PKTS,
1235};
1236
1237
1238static void bcm_enet_get_drvinfo(struct net_device *netdev,
1239                                 struct ethtool_drvinfo *drvinfo)
1240{
1241        strncpy(drvinfo->driver, bcm_enet_driver_name, 32);
1242        strncpy(drvinfo->version, bcm_enet_driver_version, 32);
1243        strncpy(drvinfo->fw_version, "N/A", 32);
1244        strncpy(drvinfo->bus_info, "bcm63xx", 32);
1245        drvinfo->n_stats = BCM_ENET_STATS_LEN;
1246}
1247
1248static int bcm_enet_get_sset_count(struct net_device *netdev,
1249                                        int string_set)
1250{
1251        switch (string_set) {
1252        case ETH_SS_STATS:
1253                return BCM_ENET_STATS_LEN;
1254        default:
1255                return -EINVAL;
1256        }
1257}
1258
1259static void bcm_enet_get_strings(struct net_device *netdev,
1260                                 u32 stringset, u8 *data)
1261{
1262        int i;
1263
1264        switch (stringset) {
1265        case ETH_SS_STATS:
1266                for (i = 0; i < BCM_ENET_STATS_LEN; i++) {
1267                        memcpy(data + i * ETH_GSTRING_LEN,
1268                               bcm_enet_gstrings_stats[i].stat_string,
1269                               ETH_GSTRING_LEN);
1270                }
1271                break;
1272        }
1273}
1274
1275static void update_mib_counters(struct bcm_enet_priv *priv)
1276{
1277        int i;
1278
1279        for (i = 0; i < BCM_ENET_STATS_LEN; i++) {
1280                const struct bcm_enet_stats *s;
1281                u32 val;
1282                char *p;
1283
1284                s = &bcm_enet_gstrings_stats[i];
1285                if (s->mib_reg == -1)
1286                        continue;
1287
1288                val = enet_readl(priv, ENET_MIB_REG(s->mib_reg));
1289                p = (char *)priv + s->stat_offset;
1290
1291                if (s->sizeof_stat == sizeof(u64))
1292                        *(u64 *)p += val;
1293                else
1294                        *(u32 *)p += val;
1295        }
1296
1297        /* also empty unused mib counters to make sure mib counter
1298         * overflow interrupt is cleared */
1299        for (i = 0; i < ARRAY_SIZE(unused_mib_regs); i++)
1300                (void)enet_readl(priv, ENET_MIB_REG(unused_mib_regs[i]));
1301}
1302
1303static void bcm_enet_update_mib_counters_defer(struct work_struct *t)
1304{
1305        struct bcm_enet_priv *priv;
1306
1307        priv = container_of(t, struct bcm_enet_priv, mib_update_task);
1308        mutex_lock(&priv->mib_update_lock);
1309        update_mib_counters(priv);
1310        mutex_unlock(&priv->mib_update_lock);
1311
1312        /* reenable mib interrupt */
1313        if (netif_running(priv->net_dev))
1314                enet_writel(priv, ENET_IR_MIB, ENET_IRMASK_REG);
1315}
1316
1317static void bcm_enet_get_ethtool_stats(struct net_device *netdev,
1318                                       struct ethtool_stats *stats,
1319                                       u64 *data)
1320{
1321        struct bcm_enet_priv *priv;
1322        int i;
1323
1324        priv = netdev_priv(netdev);
1325
1326        mutex_lock(&priv->mib_update_lock);
1327        update_mib_counters(priv);
1328
1329        for (i = 0; i < BCM_ENET_STATS_LEN; i++) {
1330                const struct bcm_enet_stats *s;
1331                char *p;
1332
1333                s = &bcm_enet_gstrings_stats[i];
1334                p = (char *)priv + s->stat_offset;
1335                data[i] = (s->sizeof_stat == sizeof(u64)) ?
1336                        *(u64 *)p : *(u32 *)p;
1337        }
1338        mutex_unlock(&priv->mib_update_lock);
1339}
1340
1341static int bcm_enet_get_settings(struct net_device *dev,
1342                                 struct ethtool_cmd *cmd)
1343{
1344        struct bcm_enet_priv *priv;
1345
1346        priv = netdev_priv(dev);
1347
1348        cmd->maxrxpkt = 0;
1349        cmd->maxtxpkt = 0;
1350
1351        if (priv->has_phy) {
1352                if (!priv->phydev)
1353                        return -ENODEV;
1354                return phy_ethtool_gset(priv->phydev, cmd);
1355        } else {
1356                cmd->autoneg = 0;
1357                cmd->speed = (priv->force_speed_100) ? SPEED_100 : SPEED_10;
1358                cmd->duplex = (priv->force_duplex_full) ?
1359                        DUPLEX_FULL : DUPLEX_HALF;
1360                cmd->supported = ADVERTISED_10baseT_Half  |
1361                        ADVERTISED_10baseT_Full |
1362                        ADVERTISED_100baseT_Half |
1363                        ADVERTISED_100baseT_Full;
1364                cmd->advertising = 0;
1365                cmd->port = PORT_MII;
1366                cmd->transceiver = XCVR_EXTERNAL;
1367        }
1368        return 0;
1369}
1370
1371static int bcm_enet_set_settings(struct net_device *dev,
1372                                 struct ethtool_cmd *cmd)
1373{
1374        struct bcm_enet_priv *priv;
1375
1376        priv = netdev_priv(dev);
1377        if (priv->has_phy) {
1378                if (!priv->phydev)
1379                        return -ENODEV;
1380                return phy_ethtool_sset(priv->phydev, cmd);
1381        } else {
1382
1383                if (cmd->autoneg ||
1384                    (cmd->speed != SPEED_100 && cmd->speed != SPEED_10) ||
1385                    cmd->port != PORT_MII)
1386                        return -EINVAL;
1387
1388                priv->force_speed_100 = (cmd->speed == SPEED_100) ? 1 : 0;
1389                priv->force_duplex_full = (cmd->duplex == DUPLEX_FULL) ? 1 : 0;
1390
1391                if (netif_running(dev))
1392                        bcm_enet_adjust_link(dev);
1393                return 0;
1394        }
1395}
1396
1397static void bcm_enet_get_ringparam(struct net_device *dev,
1398                                   struct ethtool_ringparam *ering)
1399{
1400        struct bcm_enet_priv *priv;
1401
1402        priv = netdev_priv(dev);
1403
1404        /* rx/tx ring is actually only limited by memory */
1405        ering->rx_max_pending = 8192;
1406        ering->tx_max_pending = 8192;
1407        ering->rx_mini_max_pending = 0;
1408        ering->rx_jumbo_max_pending = 0;
1409        ering->rx_pending = priv->rx_ring_size;
1410        ering->tx_pending = priv->tx_ring_size;
1411}
1412
1413static int bcm_enet_set_ringparam(struct net_device *dev,
1414                                  struct ethtool_ringparam *ering)
1415{
1416        struct bcm_enet_priv *priv;
1417        int was_running;
1418
1419        priv = netdev_priv(dev);
1420
1421        was_running = 0;
1422        if (netif_running(dev)) {
1423                bcm_enet_stop(dev);
1424                was_running = 1;
1425        }
1426
1427        priv->rx_ring_size = ering->rx_pending;
1428        priv->tx_ring_size = ering->tx_pending;
1429
1430        if (was_running) {
1431                int err;
1432
1433                err = bcm_enet_open(dev);
1434                if (err)
1435                        dev_close(dev);
1436                else
1437                        bcm_enet_set_multicast_list(dev);
1438        }
1439        return 0;
1440}
1441
1442static void bcm_enet_get_pauseparam(struct net_device *dev,
1443                                    struct ethtool_pauseparam *ecmd)
1444{
1445        struct bcm_enet_priv *priv;
1446
1447        priv = netdev_priv(dev);
1448        ecmd->autoneg = priv->pause_auto;
1449        ecmd->rx_pause = priv->pause_rx;
1450        ecmd->tx_pause = priv->pause_tx;
1451}
1452
1453static int bcm_enet_set_pauseparam(struct net_device *dev,
1454                                   struct ethtool_pauseparam *ecmd)
1455{
1456        struct bcm_enet_priv *priv;
1457
1458        priv = netdev_priv(dev);
1459
1460        if (priv->has_phy) {
1461                if (ecmd->autoneg && (ecmd->rx_pause != ecmd->tx_pause)) {
1462                        /* asymetric pause mode not supported,
1463                         * actually possible but integrated PHY has RO
1464                         * asym_pause bit */
1465                        return -EINVAL;
1466                }
1467        } else {
1468                /* no pause autoneg on direct mii connection */
1469                if (ecmd->autoneg)
1470                        return -EINVAL;
1471        }
1472
1473        priv->pause_auto = ecmd->autoneg;
1474        priv->pause_rx = ecmd->rx_pause;
1475        priv->pause_tx = ecmd->tx_pause;
1476
1477        return 0;
1478}
1479
1480static struct ethtool_ops bcm_enet_ethtool_ops = {
1481        .get_strings            = bcm_enet_get_strings,
1482        .get_sset_count         = bcm_enet_get_sset_count,
1483        .get_ethtool_stats      = bcm_enet_get_ethtool_stats,
1484        .get_settings           = bcm_enet_get_settings,
1485        .set_settings           = bcm_enet_set_settings,
1486        .get_drvinfo            = bcm_enet_get_drvinfo,
1487        .get_link               = ethtool_op_get_link,
1488        .get_ringparam          = bcm_enet_get_ringparam,
1489        .set_ringparam          = bcm_enet_set_ringparam,
1490        .get_pauseparam         = bcm_enet_get_pauseparam,
1491        .set_pauseparam         = bcm_enet_set_pauseparam,
1492};
1493
1494static int bcm_enet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1495{
1496        struct bcm_enet_priv *priv;
1497
1498        priv = netdev_priv(dev);
1499        if (priv->has_phy) {
1500                if (!priv->phydev)
1501                        return -ENODEV;
1502                return phy_mii_ioctl(priv->phydev, if_mii(rq), cmd);
1503        } else {
1504                struct mii_if_info mii;
1505
1506                mii.dev = dev;
1507                mii.mdio_read = bcm_enet_mdio_read_mii;
1508                mii.mdio_write = bcm_enet_mdio_write_mii;
1509                mii.phy_id = 0;
1510                mii.phy_id_mask = 0x3f;
1511                mii.reg_num_mask = 0x1f;
1512                return generic_mii_ioctl(&mii, if_mii(rq), cmd, NULL);
1513        }
1514}
1515
1516/*
1517 * calculate actual hardware mtu
1518 */
1519static int compute_hw_mtu(struct bcm_enet_priv *priv, int mtu)
1520{
1521        int actual_mtu;
1522
1523        actual_mtu = mtu;
1524
1525        /* add ethernet header + vlan tag size */
1526        actual_mtu += VLAN_ETH_HLEN;
1527
1528        if (actual_mtu < 64 || actual_mtu > BCMENET_MAX_MTU)
1529                return -EINVAL;
1530
1531        /*
1532         * setup maximum size before we get overflow mark in
1533         * descriptor, note that this will not prevent reception of
1534         * big frames, they will be split into multiple buffers
1535         * anyway
1536         */
1537        priv->hw_mtu = actual_mtu;
1538
1539        /*
1540         * align rx buffer size to dma burst len, account FCS since
1541         * it's appended
1542         */
1543        priv->rx_skb_size = ALIGN(actual_mtu + ETH_FCS_LEN,
1544                                  BCMENET_DMA_MAXBURST * 4);
1545        return 0;
1546}
1547
1548/*
1549 * adjust mtu, can't be called while device is running
1550 */
1551static int bcm_enet_change_mtu(struct net_device *dev, int new_mtu)
1552{
1553        int ret;
1554
1555        if (netif_running(dev))
1556                return -EBUSY;
1557
1558        ret = compute_hw_mtu(netdev_priv(dev), new_mtu);
1559        if (ret)
1560                return ret;
1561        dev->mtu = new_mtu;
1562        return 0;
1563}
1564
1565/*
1566 * preinit hardware to allow mii operation while device is down
1567 */
1568static void bcm_enet_hw_preinit(struct bcm_enet_priv *priv)
1569{
1570        u32 val;
1571        int limit;
1572
1573        /* make sure mac is disabled */
1574        bcm_enet_disable_mac(priv);
1575
1576        /* soft reset mac */
1577        val = ENET_CTL_SRESET_MASK;
1578        enet_writel(priv, val, ENET_CTL_REG);
1579        wmb();
1580
1581        limit = 1000;
1582        do {
1583                val = enet_readl(priv, ENET_CTL_REG);
1584                if (!(val & ENET_CTL_SRESET_MASK))
1585                        break;
1586                udelay(1);
1587        } while (limit--);
1588
1589        /* select correct mii interface */
1590        val = enet_readl(priv, ENET_CTL_REG);
1591        if (priv->use_external_mii)
1592                val |= ENET_CTL_EPHYSEL_MASK;
1593        else
1594                val &= ~ENET_CTL_EPHYSEL_MASK;
1595        enet_writel(priv, val, ENET_CTL_REG);
1596
1597        /* turn on mdc clock */
1598        enet_writel(priv, (0x1f << ENET_MIISC_MDCFREQDIV_SHIFT) |
1599                    ENET_MIISC_PREAMBLEEN_MASK, ENET_MIISC_REG);
1600
1601        /* set mib counters to self-clear when read */
1602        val = enet_readl(priv, ENET_MIBCTL_REG);
1603        val |= ENET_MIBCTL_RDCLEAR_MASK;
1604        enet_writel(priv, val, ENET_MIBCTL_REG);
1605}
1606
1607static const struct net_device_ops bcm_enet_ops = {
1608        .ndo_open               = bcm_enet_open,
1609        .ndo_stop               = bcm_enet_stop,
1610        .ndo_start_xmit         = bcm_enet_start_xmit,
1611        .ndo_get_stats          = bcm_enet_get_stats,
1612        .ndo_set_mac_address    = bcm_enet_set_mac_address,
1613        .ndo_set_multicast_list = bcm_enet_set_multicast_list,
1614        .ndo_do_ioctl           = bcm_enet_ioctl,
1615        .ndo_change_mtu         = bcm_enet_change_mtu,
1616#ifdef CONFIG_NET_POLL_CONTROLLER
1617        .ndo_poll_controller = bcm_enet_netpoll,
1618#endif
1619};
1620
1621/*
1622 * allocate netdevice, request register memory and register device.
1623 */
1624static int __devinit bcm_enet_probe(struct platform_device *pdev)
1625{
1626        struct bcm_enet_priv *priv;
1627        struct net_device *dev;
1628        struct bcm63xx_enet_platform_data *pd;
1629        struct resource *res_mem, *res_irq, *res_irq_rx, *res_irq_tx;
1630        struct mii_bus *bus;
1631        const char *clk_name;
1632        unsigned int iomem_size;
1633        int i, ret;
1634
1635        /* stop if shared driver failed, assume driver->probe will be
1636         * called in the same order we register devices (correct ?) */
1637        if (!bcm_enet_shared_base)
1638                return -ENODEV;
1639
1640        res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1641        res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1642        res_irq_rx = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
1643        res_irq_tx = platform_get_resource(pdev, IORESOURCE_IRQ, 2);
1644        if (!res_mem || !res_irq || !res_irq_rx || !res_irq_tx)
1645                return -ENODEV;
1646
1647        ret = 0;
1648        dev = alloc_etherdev(sizeof(*priv));
1649        if (!dev)
1650                return -ENOMEM;
1651        priv = netdev_priv(dev);
1652        memset(priv, 0, sizeof(*priv));
1653
1654        ret = compute_hw_mtu(priv, dev->mtu);
1655        if (ret)
1656                goto out;
1657
1658        iomem_size = res_mem->end - res_mem->start + 1;
1659        if (!request_mem_region(res_mem->start, iomem_size, "bcm63xx_enet")) {
1660                ret = -EBUSY;
1661                goto out;
1662        }
1663
1664        priv->base = ioremap(res_mem->start, iomem_size);
1665        if (priv->base == NULL) {
1666                ret = -ENOMEM;
1667                goto out_release_mem;
1668        }
1669        dev->irq = priv->irq = res_irq->start;
1670        priv->irq_rx = res_irq_rx->start;
1671        priv->irq_tx = res_irq_tx->start;
1672        priv->mac_id = pdev->id;
1673
1674        /* get rx & tx dma channel id for this mac */
1675        if (priv->mac_id == 0) {
1676                priv->rx_chan = 0;
1677                priv->tx_chan = 1;
1678                clk_name = "enet0";
1679        } else {
1680                priv->rx_chan = 2;
1681                priv->tx_chan = 3;
1682                clk_name = "enet1";
1683        }
1684
1685        priv->mac_clk = clk_get(&pdev->dev, clk_name);
1686        if (IS_ERR(priv->mac_clk)) {
1687                ret = PTR_ERR(priv->mac_clk);
1688                goto out_unmap;
1689        }
1690        clk_enable(priv->mac_clk);
1691
1692        /* initialize default and fetch platform data */
1693        priv->rx_ring_size = BCMENET_DEF_RX_DESC;
1694        priv->tx_ring_size = BCMENET_DEF_TX_DESC;
1695
1696        pd = pdev->dev.platform_data;
1697        if (pd) {
1698                memcpy(dev->dev_addr, pd->mac_addr, ETH_ALEN);
1699                priv->has_phy = pd->has_phy;
1700                priv->phy_id = pd->phy_id;
1701                priv->has_phy_interrupt = pd->has_phy_interrupt;
1702                priv->phy_interrupt = pd->phy_interrupt;
1703                priv->use_external_mii = !pd->use_internal_phy;
1704                priv->pause_auto = pd->pause_auto;
1705                priv->pause_rx = pd->pause_rx;
1706                priv->pause_tx = pd->pause_tx;
1707                priv->force_duplex_full = pd->force_duplex_full;
1708                priv->force_speed_100 = pd->force_speed_100;
1709        }
1710
1711        if (priv->mac_id == 0 && priv->has_phy && !priv->use_external_mii) {
1712                /* using internal PHY, enable clock */
1713                priv->phy_clk = clk_get(&pdev->dev, "ephy");
1714                if (IS_ERR(priv->phy_clk)) {
1715                        ret = PTR_ERR(priv->phy_clk);
1716                        priv->phy_clk = NULL;
1717                        goto out_put_clk_mac;
1718                }
1719                clk_enable(priv->phy_clk);
1720        }
1721
1722        /* do minimal hardware init to be able to probe mii bus */
1723        bcm_enet_hw_preinit(priv);
1724
1725        /* MII bus registration */
1726        if (priv->has_phy) {
1727
1728                priv->mii_bus = mdiobus_alloc();
1729                if (!priv->mii_bus) {
1730                        ret = -ENOMEM;
1731                        goto out_uninit_hw;
1732                }
1733
1734                bus = priv->mii_bus;
1735                bus->name = "bcm63xx_enet MII bus";
1736                bus->parent = &pdev->dev;
1737                bus->priv = priv;
1738                bus->read = bcm_enet_mdio_read_phylib;
1739                bus->write = bcm_enet_mdio_write_phylib;
1740                sprintf(bus->id, "%d", priv->mac_id);
1741
1742                /* only probe bus where we think the PHY is, because
1743                 * the mdio read operation return 0 instead of 0xffff
1744                 * if a slave is not present on hw */
1745                bus->phy_mask = ~(1 << priv->phy_id);
1746
1747                bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
1748                if (!bus->irq) {
1749                        ret = -ENOMEM;
1750                        goto out_free_mdio;
1751                }
1752
1753                if (priv->has_phy_interrupt)
1754                        bus->irq[priv->phy_id] = priv->phy_interrupt;
1755                else
1756                        bus->irq[priv->phy_id] = PHY_POLL;
1757
1758                ret = mdiobus_register(bus);
1759                if (ret) {
1760                        dev_err(&pdev->dev, "unable to register mdio bus\n");
1761                        goto out_free_mdio;
1762                }
1763        } else {
1764
1765                /* run platform code to initialize PHY device */
1766                if (pd->mii_config &&
1767                    pd->mii_config(dev, 1, bcm_enet_mdio_read_mii,
1768                                   bcm_enet_mdio_write_mii)) {
1769                        dev_err(&pdev->dev, "unable to configure mdio bus\n");
1770                        goto out_uninit_hw;
1771                }
1772        }
1773
1774        spin_lock_init(&priv->rx_lock);
1775
1776        /* init rx timeout (used for oom) */
1777        init_timer(&priv->rx_timeout);
1778        priv->rx_timeout.function = bcm_enet_refill_rx_timer;
1779        priv->rx_timeout.data = (unsigned long)dev;
1780
1781        /* init the mib update lock&work */
1782        mutex_init(&priv->mib_update_lock);
1783        INIT_WORK(&priv->mib_update_task, bcm_enet_update_mib_counters_defer);
1784
1785        /* zero mib counters */
1786        for (i = 0; i < ENET_MIB_REG_COUNT; i++)
1787                enet_writel(priv, 0, ENET_MIB_REG(i));
1788
1789        /* register netdevice */
1790        dev->netdev_ops = &bcm_enet_ops;
1791        netif_napi_add(dev, &priv->napi, bcm_enet_poll, 16);
1792
1793        SET_ETHTOOL_OPS(dev, &bcm_enet_ethtool_ops);
1794        SET_NETDEV_DEV(dev, &pdev->dev);
1795
1796        ret = register_netdev(dev);
1797        if (ret)
1798                goto out_unregister_mdio;
1799
1800        netif_carrier_off(dev);
1801        platform_set_drvdata(pdev, dev);
1802        priv->pdev = pdev;
1803        priv->net_dev = dev;
1804
1805        return 0;
1806
1807out_unregister_mdio:
1808        if (priv->mii_bus) {
1809                mdiobus_unregister(priv->mii_bus);
1810                kfree(priv->mii_bus->irq);
1811        }
1812
1813out_free_mdio:
1814        if (priv->mii_bus)
1815                mdiobus_free(priv->mii_bus);
1816
1817out_uninit_hw:
1818        /* turn off mdc clock */
1819        enet_writel(priv, 0, ENET_MIISC_REG);
1820        if (priv->phy_clk) {
1821                clk_disable(priv->phy_clk);
1822                clk_put(priv->phy_clk);
1823        }
1824
1825out_put_clk_mac:
1826        clk_disable(priv->mac_clk);
1827        clk_put(priv->mac_clk);
1828
1829out_unmap:
1830        iounmap(priv->base);
1831
1832out_release_mem:
1833        release_mem_region(res_mem->start, iomem_size);
1834out:
1835        free_netdev(dev);
1836        return ret;
1837}
1838
1839
1840/*
1841 * exit func, stops hardware and unregisters netdevice
1842 */
1843static int __devexit bcm_enet_remove(struct platform_device *pdev)
1844{
1845        struct bcm_enet_priv *priv;
1846        struct net_device *dev;
1847        struct resource *res;
1848
1849        /* stop netdevice */
1850        dev = platform_get_drvdata(pdev);
1851        priv = netdev_priv(dev);
1852        unregister_netdev(dev);
1853
1854        /* turn off mdc clock */
1855        enet_writel(priv, 0, ENET_MIISC_REG);
1856
1857        if (priv->has_phy) {
1858                mdiobus_unregister(priv->mii_bus);
1859                kfree(priv->mii_bus->irq);
1860                mdiobus_free(priv->mii_bus);
1861        } else {
1862                struct bcm63xx_enet_platform_data *pd;
1863
1864                pd = pdev->dev.platform_data;
1865                if (pd && pd->mii_config)
1866                        pd->mii_config(dev, 0, bcm_enet_mdio_read_mii,
1867                                       bcm_enet_mdio_write_mii);
1868        }
1869
1870        /* release device resources */
1871        iounmap(priv->base);
1872        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1873        release_mem_region(res->start, res->end - res->start + 1);
1874
1875        /* disable hw block clocks */
1876        if (priv->phy_clk) {
1877                clk_disable(priv->phy_clk);
1878                clk_put(priv->phy_clk);
1879        }
1880        clk_disable(priv->mac_clk);
1881        clk_put(priv->mac_clk);
1882
1883        platform_set_drvdata(pdev, NULL);
1884        free_netdev(dev);
1885        return 0;
1886}
1887
1888struct platform_driver bcm63xx_enet_driver = {
1889        .probe  = bcm_enet_probe,
1890        .remove = __devexit_p(bcm_enet_remove),
1891        .driver = {
1892                .name   = "bcm63xx_enet",
1893                .owner  = THIS_MODULE,
1894        },
1895};
1896
1897/*
1898 * reserve & remap memory space shared between all macs
1899 */
1900static int __devinit bcm_enet_shared_probe(struct platform_device *pdev)
1901{
1902        struct resource *res;
1903        unsigned int iomem_size;
1904
1905        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1906        if (!res)
1907                return -ENODEV;
1908
1909        iomem_size = res->end - res->start + 1;
1910        if (!request_mem_region(res->start, iomem_size, "bcm63xx_enet_dma"))
1911                return -EBUSY;
1912
1913        bcm_enet_shared_base = ioremap(res->start, iomem_size);
1914        if (!bcm_enet_shared_base) {
1915                release_mem_region(res->start, iomem_size);
1916                return -ENOMEM;
1917        }
1918        return 0;
1919}
1920
1921static int __devexit bcm_enet_shared_remove(struct platform_device *pdev)
1922{
1923        struct resource *res;
1924
1925        iounmap(bcm_enet_shared_base);
1926        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1927        release_mem_region(res->start, res->end - res->start + 1);
1928        return 0;
1929}
1930
1931/*
1932 * this "shared" driver is needed because both macs share a single
1933 * address space
1934 */
1935struct platform_driver bcm63xx_enet_shared_driver = {
1936        .probe  = bcm_enet_shared_probe,
1937        .remove = __devexit_p(bcm_enet_shared_remove),
1938        .driver = {
1939                .name   = "bcm63xx_enet_shared",
1940                .owner  = THIS_MODULE,
1941        },
1942};
1943
1944/*
1945 * entry point
1946 */
1947static int __init bcm_enet_init(void)
1948{
1949        int ret;
1950
1951        ret = platform_driver_register(&bcm63xx_enet_shared_driver);
1952        if (ret)
1953                return ret;
1954
1955        ret = platform_driver_register(&bcm63xx_enet_driver);
1956        if (ret)
1957                platform_driver_unregister(&bcm63xx_enet_shared_driver);
1958
1959        return ret;
1960}
1961
1962static void __exit bcm_enet_exit(void)
1963{
1964        platform_driver_unregister(&bcm63xx_enet_driver);
1965        platform_driver_unregister(&bcm63xx_enet_shared_driver);
1966}
1967
1968
1969module_init(bcm_enet_init);
1970module_exit(bcm_enet_exit);
1971
1972MODULE_DESCRIPTION("BCM63xx internal ethernet mac driver");
1973MODULE_AUTHOR("Maxime Bizon <mbizon@freebox.fr>");
1974MODULE_LICENSE("GPL");
1975
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.