Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Wed, 30 Jul 2014 20:25:49 +0000 (13:25 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Jul 2014 20:25:49 +0000 (13:25 -0700)
Signed-off-by: David S. Miller <davem@davemloft.net>
13 files changed:
1  2 
MAINTAINERS
drivers/net/can/c_can/c_can_platform.c
drivers/net/ethernet/amd/xgbe/xgbe-main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
drivers/net/ethernet/broadcom/genet/bcmgenet.c
drivers/net/hyperv/netvsc.c
drivers/net/phy/phy_device.c
drivers/net/usb/r8152.c
drivers/net/vxlan.c
include/net/ip.h
net/ipv6/ip6_output.c

diff --combined MAINTAINERS
index 9faf35c9f899ea46293b6d601d3773130664bae5,86efa7e213c257e59f4285d30bad7555b259c566..c77a0effe5ddeb4ab6899bff570244526ed2190d
@@@ -148,13 -148,6 +148,13 @@@ L:       linux-scsi@vger.kernel.or
  S:    Maintained
  F:    drivers/scsi/53c700*
  
 +6LOWPAN GENERIC (BTLE/IEEE 802.15.4)
 +M:    Alexander Aring <alex.aring@gmail.com>
 +L:    linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
 +L:    linux-bluetooth@vger.kernel.org
 +S:    Maintained
 +F:    net/6lowpan/
 +
  6PACK NETWORK DRIVER FOR AX.25
  M:    Andreas Koensgen <ajk@comnets.uni-bremen.de>
  L:    linux-hams@vger.kernel.org
@@@ -1919,13 -1912,6 +1919,13 @@@ S:    Supporte
  F:    drivers/net/bonding/
  F:    include/uapi/linux/if_bonding.h
  
 +BPF (Safe dynamic programs and tools)
 +M:    Alexei Starovoitov <ast@kernel.org>
 +L:    netdev@vger.kernel.org
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +F:    kernel/bpf/
 +
  BROADCOM B44 10/100 ETHERNET DRIVER
  M:    Gary Zambrano <zambrano@broadcom.com>
  L:    netdev@vger.kernel.org
@@@ -1939,8 -1925,7 +1939,8 @@@ S:      Supporte
  F:    drivers/net/ethernet/broadcom/genet/
  
  BROADCOM BNX2 GIGABIT ETHERNET DRIVER
 -M:    Michael Chan <mchan@broadcom.com>
 +M:    Sony Chacko <sony.chacko@qlogic.com>
 +M:    Dept-HSGLinuxNICDev@qlogic.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/broadcom/bnx2.*
@@@ -1985,7 -1970,7 +1985,7 @@@ F:      arch/arm/boot/dts/bcm5301x.dts
  F:    arch/arm/boot/dts/bcm470*
  
  BROADCOM TG3 GIGABIT ETHERNET DRIVER
 -M:    Nithin Nayak Sujir <nsujir@broadcom.com>
 +M:    Prashant Sreedharan <prashant@broadcom.com>
  M:    Michael Chan <mchan@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -5670,6 -5655,16 +5670,6 @@@ F:     Documentation/networking/mac80211-in
  F:    include/net/mac80211.h
  F:    net/mac80211/
  
 -MAC80211 PID RATE CONTROL
 -M:    Stefano Brivio <stefano.brivio@polimi.it>
 -M:    Mattias Nissler <mattias.nissler@gmx.de>
 -L:    linux-wireless@vger.kernel.org
 -W:    http://wireless.kernel.org/en/developers/Documentation/mac80211/RateControl/PID
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
 -S:    Maintained
 -F:    net/mac80211/rc80211_pid*
 -
  MACVLAN DRIVER
  M:    Patrick McHardy <kaber@trash.net>
  L:    netdev@vger.kernel.org
@@@ -6961,6 -6956,12 +6961,12 @@@ L:    linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    drivers/pinctrl/pinctrl-at91.c
  
+ PIN CONTROLLER - RENESAS
+ M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+ L:    linux-sh@vger.kernel.org
+ S:    Maintained
+ F:    drivers/pinctrl/sh-pfc/
  PIN CONTROLLER - SAMSUNG
  M:    Tomasz Figa <t.figa@samsung.com>
  M:    Thomas Abraham <thomas.abraham@linaro.org>
index e29b6d05110346855e8f2cb41abd9ae4c4bf59e6,12430be6448acd86d4fa530cab24f6deb3a462a8..5dede6e6437619f455f19ef6f8277e74e7639997
@@@ -208,31 -208,40 +208,31 @@@ static int c_can_plat_probe(struct plat
        }
  
        /* get the appropriate clk */
 -      clk = clk_get(&pdev->dev, NULL);
 +      clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(clk)) {
 -              dev_err(&pdev->dev, "no clock defined\n");
 -              ret = -ENODEV;
 +              ret = PTR_ERR(clk);
                goto exit;
        }
  
        /* get the platform data */
 -      mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        irq = platform_get_irq(pdev, 0);
 -      if (!mem || irq <= 0) {
 +      if (irq <= 0) {
                ret = -ENODEV;
 -              goto exit_free_clk;
 -      }
 -
 -      if (!request_mem_region(mem->start, resource_size(mem),
 -                              KBUILD_MODNAME)) {
 -              dev_err(&pdev->dev, "resource unavailable\n");
 -              ret = -ENODEV;
 -              goto exit_free_clk;
 +              goto exit;
        }
  
 -      addr = ioremap(mem->start, resource_size(mem));
 -      if (!addr) {
 -              dev_err(&pdev->dev, "failed to map can port\n");
 -              ret = -ENOMEM;
 -              goto exit_release_mem;
 +      mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 +      addr = devm_ioremap_resource(&pdev->dev, mem);
 +      if (IS_ERR(addr)) {
 +              ret =  PTR_ERR(addr);
 +              goto exit;
        }
  
        /* allocate the c_can device */
        dev = alloc_c_can_dev();
        if (!dev) {
                ret = -ENOMEM;
 -              goto exit_iounmap;
 +              goto exit;
        }
  
        priv = netdev_priv(dev);
                        break;
                }
  
-               priv->raminit_ctrlreg = devm_ioremap_resource(&pdev->dev, res);
+               priv->raminit_ctrlreg = devm_ioremap(&pdev->dev, res->start,
+                                                    resource_size(res));
                if (IS_ERR(priv->raminit_ctrlreg) || priv->instance < 0)
                        dev_info(&pdev->dev, "control memory is not used for raminit\n");
                else
  
  exit_free_device:
        free_c_can_dev(dev);
 -exit_iounmap:
 -      iounmap(addr);
 -exit_release_mem:
 -      release_mem_region(mem->start, resource_size(mem));
 -exit_free_clk:
 -      clk_put(clk);
  exit:
        dev_err(&pdev->dev, "probe failed\n");
  
  static int c_can_plat_remove(struct platform_device *pdev)
  {
        struct net_device *dev = platform_get_drvdata(pdev);
 -      struct c_can_priv *priv = netdev_priv(dev);
 -      struct resource *mem;
  
        unregister_c_can_dev(dev);
  
        free_c_can_dev(dev);
 -      iounmap(priv->base);
 -
 -      mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 -      release_mem_region(mem->start, resource_size(mem));
 -
 -      clk_put(priv->priv);
  
        return 0;
  }
index d5a4f76e94745f38f4afb92489f8debab9b64504,5a1891faba8a1f9df9090c3c1064af74cb5c2136..e56c3d45b30e3d409dafa4065ccbc7b7c893abc0
@@@ -247,16 -247,16 +247,16 @@@ static int xgbe_probe(struct platform_d
        mutex_init(&pdata->xpcs_mutex);
  
        /* Set and validate the number of descriptors for a ring */
 -      BUILD_BUG_ON_NOT_POWER_OF_2(TX_DESC_CNT);
 -      pdata->tx_desc_count = TX_DESC_CNT;
 +      BUILD_BUG_ON_NOT_POWER_OF_2(XGBE_TX_DESC_CNT);
 +      pdata->tx_desc_count = XGBE_TX_DESC_CNT;
        if (pdata->tx_desc_count & (pdata->tx_desc_count - 1)) {
                dev_err(dev, "tx descriptor count (%d) is not valid\n",
                        pdata->tx_desc_count);
                ret = -EINVAL;
                goto err_io;
        }
 -      BUILD_BUG_ON_NOT_POWER_OF_2(RX_DESC_CNT);
 -      pdata->rx_desc_count = RX_DESC_CNT;
 +      BUILD_BUG_ON_NOT_POWER_OF_2(XGBE_RX_DESC_CNT);
 +      pdata->rx_desc_count = XGBE_RX_DESC_CNT;
        if (pdata->rx_desc_count & (pdata->rx_desc_count - 1)) {
                dev_err(dev, "rx descriptor count (%d) is not valid\n",
                        pdata->rx_desc_count);
        *(dev->dma_mask) = DMA_BIT_MASK(40);
        dev->coherent_dma_mask = DMA_BIT_MASK(40);
  
 +      if (of_property_read_bool(dev->of_node, "dma-coherent")) {
 +              pdata->axdomain = XGBE_DMA_OS_AXDOMAIN;
 +              pdata->arcache = XGBE_DMA_OS_ARCACHE;
 +              pdata->awcache = XGBE_DMA_OS_AWCACHE;
 +      } else {
 +              pdata->axdomain = XGBE_DMA_SYS_AXDOMAIN;
 +              pdata->arcache = XGBE_DMA_SYS_ARCACHE;
 +              pdata->awcache = XGBE_DMA_SYS_AWCACHE;
 +      }
 +
        ret = platform_get_irq(pdev, 0);
        if (ret < 0) {
                dev_err(dev, "platform_get_irq failed\n");
        /* Calculate the number of Tx and Rx rings to be created */
        pdata->tx_ring_count = min_t(unsigned int, num_online_cpus(),
                                     pdata->hw_feat.tx_ch_cnt);
-       if (netif_set_real_num_tx_queues(netdev, pdata->tx_ring_count)) {
+       ret = netif_set_real_num_tx_queues(netdev, pdata->tx_ring_count);
+       if (ret) {
                dev_err(dev, "error setting real tx queue count\n");
                goto err_io;
        }
                              NETIF_F_TSO6 |
                              NETIF_F_GRO |
                              NETIF_F_HW_VLAN_CTAG_RX |
 -                            NETIF_F_HW_VLAN_CTAG_TX;
 +                            NETIF_F_HW_VLAN_CTAG_TX |
 +                            NETIF_F_HW_VLAN_CTAG_FILTER;
  
        netdev->vlan_features |= NETIF_F_SG |
                                 NETIF_F_IP_CSUM |
        netdev->features |= netdev->hw_features;
        pdata->netdev_features = netdev->features;
  
 +      netdev->priv_flags |= IFF_UNICAST_FLT;
 +
        xgbe_init_rx_coalesce(pdata);
        xgbe_init_tx_coalesce(pdata);
  
index ce8f86966c11eaecc80bca97ecb0eb6a664cd73c,8206a293e6b41be5436e0b90753cf9406e034702..d777fae869883fedd4ecba03987f8b56e3db56cb
@@@ -346,6 -346,7 +346,7 @@@ struct sw_tx_bd 
        u8              flags;
  /* Set on the first BD descriptor when there is a split BD */
  #define BNX2X_TSO_SPLIT_BD            (1<<0)
+ #define BNX2X_HAS_SECOND_PBD          (1<<1)
  };
  
  struct sw_rx_page {
@@@ -1482,7 -1483,6 +1483,7 @@@ struct bnx2x 
        union pf_vf_bulletin   *pf2vf_bulletin;
        dma_addr_t              pf2vf_bulletin_mapping;
  
 +      union pf_vf_bulletin            shadow_bulletin;
        struct pf_vf_bulletin_content   old_bulletin;
  
        u16 requested_nr_virtfn;
  /* TCP with Timestamp Option (32) + IPv6 (40) */
  #define ETH_MAX_TPA_HEADER_SIZE               72
  
 -      /* Max supported alignment is 256 (8 shift) */
 -#define BNX2X_RX_ALIGN_SHIFT          min(8, L1_CACHE_SHIFT)
 +      /* Max supported alignment is 256 (8 shift)
 +       * minimal alignment shift 6 is optimal for 57xxx HW performance
 +       */
 +#define BNX2X_RX_ALIGN_SHIFT          max(6, min(8, L1_CACHE_SHIFT))
  
        /* FW uses 2 Cache lines Alignment for start packet and size
         *
        struct semaphore                        stats_sema;
  
        u8                                      phys_port_id[ETH_ALEN];
 +
 +      struct bnx2x_link_report_data           vf_link_vars;
  };
  
  /* Tx queues may be less or equal to Rx queues */
index dca1236dd1cd15afeb97474952c3848c74fe2084,c43e7238de217eccc0745df007e8dfb9e1c4b2aa..4e6c82e2022492ef02b142ac13950fbf4e3a7fef
@@@ -227,6 -227,12 +227,12 @@@ static u16 bnx2x_free_tx_pkt(struct bnx
        --nbd;
        bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
  
+       if (tx_buf->flags & BNX2X_HAS_SECOND_PBD) {
+               /* Skip second parse bd... */
+               --nbd;
+               bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
+       }
        /* TSO headers+data bds share a common mapping. See bnx2x_tx_split() */
        if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) {
                tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd;
@@@ -1186,38 -1192,29 +1192,38 @@@ u16 bnx2x_get_mf_speed(struct bnx2x *bp
  static void bnx2x_fill_report_data(struct bnx2x *bp,
                                   struct bnx2x_link_report_data *data)
  {
 -      u16 line_speed = bnx2x_get_mf_speed(bp);
 -
        memset(data, 0, sizeof(*data));
  
 -      /* Fill the report data: effective line speed */
 -      data->line_speed = line_speed;
 -
 -      /* Link is down */
 -      if (!bp->link_vars.link_up || (bp->flags & MF_FUNC_DIS))
 -              __set_bit(BNX2X_LINK_REPORT_LINK_DOWN,
 -                        &data->link_report_flags);
 -
 -      /* Full DUPLEX */
 -      if (bp->link_vars.duplex == DUPLEX_FULL)
 -              __set_bit(BNX2X_LINK_REPORT_FD, &data->link_report_flags);
 -
 -      /* Rx Flow Control is ON */
 -      if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_RX)
 -              __set_bit(BNX2X_LINK_REPORT_RX_FC_ON, &data->link_report_flags);
 -
 -      /* Tx Flow Control is ON */
 -      if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
 -              __set_bit(BNX2X_LINK_REPORT_TX_FC_ON, &data->link_report_flags);
 +      if (IS_PF(bp)) {
 +              /* Fill the report data: effective line speed */
 +              data->line_speed = bnx2x_get_mf_speed(bp);
 +
 +              /* Link is down */
 +              if (!bp->link_vars.link_up || (bp->flags & MF_FUNC_DIS))
 +                      __set_bit(BNX2X_LINK_REPORT_LINK_DOWN,
 +                                &data->link_report_flags);
 +
 +              if (!BNX2X_NUM_ETH_QUEUES(bp))
 +                      __set_bit(BNX2X_LINK_REPORT_LINK_DOWN,
 +                                &data->link_report_flags);
 +
 +              /* Full DUPLEX */
 +              if (bp->link_vars.duplex == DUPLEX_FULL)
 +                      __set_bit(BNX2X_LINK_REPORT_FD,
 +                                &data->link_report_flags);
 +
 +              /* Rx Flow Control is ON */
 +              if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_RX)
 +                      __set_bit(BNX2X_LINK_REPORT_RX_FC_ON,
 +                                &data->link_report_flags);
 +
 +              /* Tx Flow Control is ON */
 +              if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
 +                      __set_bit(BNX2X_LINK_REPORT_TX_FC_ON,
 +                                &data->link_report_flags);
 +      } else { /* VF */
 +              *data = bp->vf_link_vars;
 +      }
  }
  
  /**
@@@ -1271,10 -1268,6 +1277,10 @@@ void __bnx2x_link_report(struct bnx2x *
         */
        memcpy(&bp->last_reported_link, &cur_data, sizeof(cur_data));
  
 +      /* propagate status to VFs */
 +      if (IS_PF(bp))
 +              bnx2x_iov_link_update(bp);
 +
        if (test_bit(BNX2X_LINK_REPORT_LINK_DOWN,
                     &cur_data.link_report_flags)) {
                netif_carrier_off(bp->dev);
@@@ -3902,6 -3895,9 +3908,9 @@@ netdev_tx_t bnx2x_start_xmit(struct sk_
                        /* set encapsulation flag in start BD */
                        SET_FLAG(tx_start_bd->general_data,
                                 ETH_TX_START_BD_TUNNEL_EXIST, 1);
+                       tx_buf->flags |= BNX2X_HAS_SECOND_PBD;
                        nbd++;
                } else if (xmit_type & XMIT_CSUM) {
                        /* Set PBD in checksum offload case w/o encapsulation */
index 08ea91cab738a02c2c16d87e1eb1d37a054b881c,25eddd90f48234e86991e8c6282ab11c047de76e..92fee842f954f8787b245c007deb5291ca8c8771
@@@ -216,43 -216,6 +216,43 @@@ static int bnx2x_get_port_type(struct b
        return port_type;
  }
  
 +static int bnx2x_get_vf_settings(struct net_device *dev,
 +                               struct ethtool_cmd *cmd)
 +{
 +      struct bnx2x *bp = netdev_priv(dev);
 +
 +      if (bp->state == BNX2X_STATE_OPEN) {
 +              if (test_bit(BNX2X_LINK_REPORT_FD,
 +                           &bp->vf_link_vars.link_report_flags))
 +                      cmd->duplex = DUPLEX_FULL;
 +              else
 +                      cmd->duplex = DUPLEX_HALF;
 +
 +              ethtool_cmd_speed_set(cmd, bp->vf_link_vars.line_speed);
 +      } else {
 +              cmd->duplex = DUPLEX_UNKNOWN;
 +              ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN);
 +      }
 +
 +      cmd->port               = PORT_OTHER;
 +      cmd->phy_address        = 0;
 +      cmd->transceiver        = XCVR_INTERNAL;
 +      cmd->autoneg            = AUTONEG_DISABLE;
 +      cmd->maxtxpkt           = 0;
 +      cmd->maxrxpkt           = 0;
 +
 +      DP(BNX2X_MSG_ETHTOOL, "ethtool_cmd: cmd %d\n"
 +         "  supported 0x%x  advertising 0x%x  speed %u\n"
 +         "  duplex %d  port %d  phy_address %d  transceiver %d\n"
 +         "  autoneg %d  maxtxpkt %d  maxrxpkt %d\n",
 +         cmd->cmd, cmd->supported, cmd->advertising,
 +         ethtool_cmd_speed(cmd),
 +         cmd->duplex, cmd->port, cmd->phy_address, cmd->transceiver,
 +         cmd->autoneg, cmd->maxtxpkt, cmd->maxrxpkt);
 +
 +      return 0;
 +}
 +
  static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
  {
        struct bnx2x *bp = netdev_priv(dev);
@@@ -416,6 -379,7 +416,7 @@@ static int bnx2x_set_settings(struct ne
                        break;
                case PORT_FIBRE:
                case PORT_DA:
+               case PORT_NONE:
                        if (!(bp->port.supported[0] & SUPPORTED_FIBRE ||
                              bp->port.supported[1] & SUPPORTED_FIBRE)) {
                                DP(BNX2X_MSG_ETHTOOL,
@@@ -1147,10 -1111,6 +1148,10 @@@ static u32 bnx2x_get_link(struct net_de
        if (bp->flags & MF_FUNC_DIS || (bp->state != BNX2X_STATE_OPEN))
                return 0;
  
 +      if (IS_VF(bp))
 +              return !test_bit(BNX2X_LINK_REPORT_LINK_DOWN,
 +                               &bp->vf_link_vars.link_report_flags);
 +
        return bp->link_vars.link_up;
  }
  
@@@ -3525,7 -3485,8 +3526,7 @@@ static const struct ethtool_ops bnx2x_e
  };
  
  static const struct ethtool_ops bnx2x_vf_ethtool_ops = {
 -      .get_settings           = bnx2x_get_settings,
 -      .set_settings           = bnx2x_set_settings,
 +      .get_settings           = bnx2x_get_vf_settings,
        .get_drvinfo            = bnx2x_get_drvinfo,
        .get_msglevel           = bnx2x_get_msglevel,
        .set_msglevel           = bnx2x_set_msglevel,
index 28c8111502cd4b9e12c4023e79332465e424f460,4e615debe4729e2b103575fff027a2a491c661dd..417ce68449a4ca005382c7ac0765d9bbdc67e531
@@@ -6,6 -6,15 +6,6 @@@
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope that it will be useful,
 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 - * GNU General Public License for more details.
 - *
 - * You should have received a copy of the GNU General Public License
 - * along with this program; if not, write to the Free Software
 - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   */
  
  #define pr_fmt(fmt)                           "bcmgenet: " fmt
                                TOTAL_DESC * DMA_DESC_SIZE)
  
  static inline void dmadesc_set_length_status(struct bcmgenet_priv *priv,
 -                                              void __iomem *d, u32 value)
 +                                           void __iomem *d, u32 value)
  {
        __raw_writel(value, d + DMA_DESC_LENGTH_STATUS);
  }
  
  static inline u32 dmadesc_get_length_status(struct bcmgenet_priv *priv,
 -                                              void __iomem *d)
 +                                          void __iomem *d)
  {
        return __raw_readl(d + DMA_DESC_LENGTH_STATUS);
  }
@@@ -99,7 -108,7 +99,7 @@@ static inline void dmadesc_set_addr(str
  
  /* Combined address + length/status setter */
  static inline void dmadesc_set(struct bcmgenet_priv *priv,
 -                              void __iomem *d, dma_addr_t addr, u32 val)
 +                             void __iomem *d, dma_addr_t addr, u32 val)
  {
        dmadesc_set_length_status(priv, d, val);
        dmadesc_set_addr(priv, d, addr);
@@@ -233,7 -242,7 +233,7 @@@ static inline struct bcmgenet_priv *dev
  }
  
  static inline u32 bcmgenet_tdma_readl(struct bcmgenet_priv *priv,
 -                                      enum dma_reg r)
 +                                    enum dma_reg r)
  {
        return __raw_readl(priv->base + GENET_TDMA_REG_OFF +
                        DMA_RINGS_SIZE + bcmgenet_dma_regs[r]);
@@@ -247,7 -256,7 +247,7 @@@ static inline void bcmgenet_tdma_writel
  }
  
  static inline u32 bcmgenet_rdma_readl(struct bcmgenet_priv *priv,
 -                                      enum dma_reg r)
 +                                    enum dma_reg r)
  {
        return __raw_readl(priv->base + GENET_RDMA_REG_OFF +
                        DMA_RINGS_SIZE + bcmgenet_dma_regs[r]);
@@@ -324,8 -333,8 +324,8 @@@ static const u8 genet_dma_ring_regs_v12
  static const u8 *genet_dma_ring_regs;
  
  static inline u32 bcmgenet_tdma_ring_readl(struct bcmgenet_priv *priv,
 -                                              unsigned int ring,
 -                                              enum dma_ring_reg r)
 +                                         unsigned int ring,
 +                                         enum dma_ring_reg r)
  {
        return __raw_readl(priv->base + GENET_TDMA_REG_OFF +
                        (DMA_RING_SIZE * ring) +
  }
  
  static inline void bcmgenet_tdma_ring_writel(struct bcmgenet_priv *priv,
 -                                              unsigned int ring,
 -                                              u32 val,
 -                                              enum dma_ring_reg r)
 +                                           unsigned int ring, u32 val,
 +                                           enum dma_ring_reg r)
  {
        __raw_writel(val, priv->base + GENET_TDMA_REG_OFF +
                        (DMA_RING_SIZE * ring) +
  }
  
  static inline u32 bcmgenet_rdma_ring_readl(struct bcmgenet_priv *priv,
 -                                              unsigned int ring,
 -                                              enum dma_ring_reg r)
 +                                         unsigned int ring,
 +                                         enum dma_ring_reg r)
  {
        return __raw_readl(priv->base + GENET_RDMA_REG_OFF +
                        (DMA_RING_SIZE * ring) +
  }
  
  static inline void bcmgenet_rdma_ring_writel(struct bcmgenet_priv *priv,
 -                                              unsigned int ring,
 -                                              u32 val,
 -                                              enum dma_ring_reg r)
 +                                           unsigned int ring, u32 val,
 +                                           enum dma_ring_reg r)
  {
        __raw_writel(val, priv->base + GENET_RDMA_REG_OFF +
                        (DMA_RING_SIZE * ring) +
  }
  
  static int bcmgenet_get_settings(struct net_device *dev,
 -              struct ethtool_cmd *cmd)
 +                               struct ethtool_cmd *cmd)
  {
        struct bcmgenet_priv *priv = netdev_priv(dev);
  
  }
  
  static int bcmgenet_set_settings(struct net_device *dev,
 -              struct ethtool_cmd *cmd)
 +                               struct ethtool_cmd *cmd)
  {
        struct bcmgenet_priv *priv = netdev_priv(dev);
  
@@@ -447,7 -458,7 +447,7 @@@ static int bcmgenet_set_tx_csum(struct 
  }
  
  static int bcmgenet_set_features(struct net_device *dev,
 -              netdev_features_t features)
 +                               netdev_features_t features)
  {
        netdev_features_t changed = features ^ dev->features;
        netdev_features_t wanted = dev->wanted_features;
@@@ -614,11 -625,12 +614,11 @@@ static const struct bcmgenet_stats bcmg
  #define BCMGENET_STATS_LEN    ARRAY_SIZE(bcmgenet_gstrings_stats)
  
  static void bcmgenet_get_drvinfo(struct net_device *dev,
 -              struct ethtool_drvinfo *info)
 +                               struct ethtool_drvinfo *info)
  {
        strlcpy(info->driver, "bcmgenet", sizeof(info->driver));
        strlcpy(info->version, "v2.0", sizeof(info->version));
        info->n_stats = BCMGENET_STATS_LEN;
 -
  }
  
  static int bcmgenet_get_sset_count(struct net_device *dev, int string_set)
        }
  }
  
 -static void bcmgenet_get_strings(struct net_device *dev,
 -                              u32 stringset, u8 *data)
 +static void bcmgenet_get_strings(struct net_device *dev, u32 stringset,
 +                               u8 *data)
  {
        int i;
  
        case ETH_SS_STATS:
                for (i = 0; i < BCMGENET_STATS_LEN; i++) {
                        memcpy(data + i * ETH_GSTRING_LEN,
 -                              bcmgenet_gstrings_stats[i].stat_string,
 -                              ETH_GSTRING_LEN);
 +                             bcmgenet_gstrings_stats[i].stat_string,
 +                             ETH_GSTRING_LEN);
                }
                break;
        }
@@@ -666,8 -678,8 +666,8 @@@ static void bcmgenet_update_mib_counter
                case BCMGENET_STAT_RUNT:
                        if (s->type != BCMGENET_STAT_MIB_RX)
                                offset = BCMGENET_STAT_OFFSET;
 -                      val = bcmgenet_umac_readl(priv, UMAC_MIB_START +
 -                                                              j + offset);
 +                      val = bcmgenet_umac_readl(priv,
 +                                                UMAC_MIB_START + j + offset);
                        break;
                case BCMGENET_STAT_MISC:
                        val = bcmgenet_umac_readl(priv, s->reg_offset);
  }
  
  static void bcmgenet_get_ethtool_stats(struct net_device *dev,
 -                                      struct ethtool_stats *stats,
 -                                      u64 *data)
 +                                     struct ethtool_stats *stats,
 +                                     u64 *data)
  {
        struct bcmgenet_priv *priv = netdev_priv(dev);
        int i;
@@@ -718,8 -730,6 +718,8 @@@ static struct ethtool_ops bcmgenet_etht
        .get_link               = ethtool_op_get_link,
        .get_msglevel           = bcmgenet_get_msglevel,
        .set_msglevel           = bcmgenet_set_msglevel,
 +      .get_wol                = bcmgenet_get_wol,
 +      .set_wol                = bcmgenet_set_wol,
  };
  
  /* Power down the unimac, based on mode. */
@@@ -733,10 -743,6 +733,10 @@@ static void bcmgenet_power_down(struct 
                phy_detach(priv->phydev);
                break;
  
 +      case GENET_POWER_WOL_MAGIC:
 +              bcmgenet_wol_power_down_cfg(priv, mode);
 +              break;
 +
        case GENET_POWER_PASSIVE:
                /* Power down LED */
                bcmgenet_mii_reset(priv->dev);
  }
  
  static void bcmgenet_power_up(struct bcmgenet_priv *priv,
 -                              enum bcmgenet_power_mode mode)
 +                            enum bcmgenet_power_mode mode)
  {
        u32 reg;
  
                /* enable APD */
                reg |= EXT_PWR_DN_EN_LD;
                break;
 +      case GENET_POWER_WOL_MAGIC:
 +              bcmgenet_wol_power_up_cfg(priv, mode);
 +              return;
        default:
                break;
        }
@@@ -838,37 -841,37 +838,37 @@@ static inline void bcmgenet_tx_ring16_i
                                                  struct bcmgenet_tx_ring *ring)
  {
        bcmgenet_intrl2_0_writel(priv,
 -                      UMAC_IRQ_TXDMA_BDONE | UMAC_IRQ_TXDMA_PDONE,
 -                      INTRL2_CPU_MASK_SET);
 +                               UMAC_IRQ_TXDMA_BDONE | UMAC_IRQ_TXDMA_PDONE,
 +                               INTRL2_CPU_MASK_SET);
  }
  
  static inline void bcmgenet_tx_ring16_int_enable(struct bcmgenet_priv *priv,
                                                 struct bcmgenet_tx_ring *ring)
  {
        bcmgenet_intrl2_0_writel(priv,
 -                      UMAC_IRQ_TXDMA_BDONE | UMAC_IRQ_TXDMA_PDONE,
 -                      INTRL2_CPU_MASK_CLEAR);
 +                               UMAC_IRQ_TXDMA_BDONE | UMAC_IRQ_TXDMA_PDONE,
 +                               INTRL2_CPU_MASK_CLEAR);
  }
  
  static inline void bcmgenet_tx_ring_int_enable(struct bcmgenet_priv *priv,
 -                                              struct bcmgenet_tx_ring *ring)
 +                                             struct bcmgenet_tx_ring *ring)
  {
 -      bcmgenet_intrl2_1_writel(priv,
 -                      (1 << ring->index), INTRL2_CPU_MASK_CLEAR);
 +      bcmgenet_intrl2_1_writel(priv, (1 << ring->index),
 +                               INTRL2_CPU_MASK_CLEAR);
        priv->int1_mask &= ~(1 << ring->index);
  }
  
  static inline void bcmgenet_tx_ring_int_disable(struct bcmgenet_priv *priv,
                                                struct bcmgenet_tx_ring *ring)
  {
 -      bcmgenet_intrl2_1_writel(priv,
 -                      (1 << ring->index), INTRL2_CPU_MASK_SET);
 +      bcmgenet_intrl2_1_writel(priv, (1 << ring->index),
 +                               INTRL2_CPU_MASK_SET);
        priv->int1_mask |= (1 << ring->index);
  }
  
  /* Unlocked version of the reclaim routine */
  static void __bcmgenet_tx_reclaim(struct net_device *dev,
 -                              struct bcmgenet_tx_ring *ring)
 +                                struct bcmgenet_tx_ring *ring)
  {
        struct bcmgenet_priv *priv = netdev_priv(dev);
        int last_tx_cn, last_c_index, num_tx_bds;
                last_tx_cn = num_tx_bds - last_c_index + c_index;
  
        netif_dbg(priv, tx_done, dev,
 -                      "%s ring=%d index=%d last_tx_cn=%d last_index=%d\n",
 -                      __func__, ring->index,
 -                      c_index, last_tx_cn, last_c_index);
 +                "%s ring=%d index=%d last_tx_cn=%d last_index=%d\n",
 +                __func__, ring->index,
 +                c_index, last_tx_cn, last_c_index);
  
        /* Reclaim transmitted buffers */
        while (last_tx_cn-- > 0) {
                if (tx_cb_ptr->skb) {
                        dev->stats.tx_bytes += tx_cb_ptr->skb->len;
                        dma_unmap_single(&dev->dev,
 -                                      dma_unmap_addr(tx_cb_ptr, dma_addr),
 -                                      tx_cb_ptr->skb->len,
 -                                      DMA_TO_DEVICE);
 +                                       dma_unmap_addr(tx_cb_ptr, dma_addr),
 +                                       tx_cb_ptr->skb->len,
 +                                       DMA_TO_DEVICE);
                        bcmgenet_free_cb(tx_cb_ptr);
                } else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) {
                        dev->stats.tx_bytes +=
                                dma_unmap_len(tx_cb_ptr, dma_len);
                        dma_unmap_page(&dev->dev,
 -                                      dma_unmap_addr(tx_cb_ptr, dma_addr),
 -                                      dma_unmap_len(tx_cb_ptr, dma_len),
 -                                      DMA_TO_DEVICE);
 +                                     dma_unmap_addr(tx_cb_ptr, dma_addr),
 +                                     dma_unmap_len(tx_cb_ptr, dma_len),
 +                                     DMA_TO_DEVICE);
                        dma_unmap_addr_set(tx_cb_ptr, dma_addr, 0);
                }
                dev->stats.tx_packets++;
  }
  
  static void bcmgenet_tx_reclaim(struct net_device *dev,
 -              struct bcmgenet_tx_ring *ring)
 +                              struct bcmgenet_tx_ring *ring)
  {
        unsigned long flags;
  
@@@ -1007,9 -1010,9 +1007,9 @@@ static int bcmgenet_xmit_single(struct 
  
  /* Transmit a SKB fragement */
  static int bcmgenet_xmit_frag(struct net_device *dev,
 -                              skb_frag_t *frag,
 -                              u16 dma_desc_flags,
 -                              struct bcmgenet_tx_ring *ring)
 +                            skb_frag_t *frag,
 +                            u16 dma_desc_flags,
 +                            struct bcmgenet_tx_ring *ring)
  {
        struct bcmgenet_priv *priv = netdev_priv(dev);
        struct device *kdev = &priv->pdev->dev;
        tx_cb_ptr->skb = NULL;
  
        mapping = skb_frag_dma_map(kdev, frag, 0,
 -              skb_frag_size(frag), DMA_TO_DEVICE);
 +                                 skb_frag_size(frag), DMA_TO_DEVICE);
        ret = dma_mapping_error(kdev, mapping);
        if (ret) {
                netif_err(priv, tx_err, dev, "%s: Tx DMA map failed\n",
 -                              __func__);
 +                        __func__);
                return ret;
        }
  
        dma_unmap_len_set(tx_cb_ptr, dma_len, frag->size);
  
        dmadesc_set(priv, tx_cb_ptr->bd_addr, mapping,
 -                      (frag->size << DMA_BUFLENGTH_SHIFT) | dma_desc_flags |
 -                      (priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT));
 +                  (frag->size << DMA_BUFLENGTH_SHIFT) | dma_desc_flags |
 +                  (priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT));
  
  
        ring->free_bds -= 1;
@@@ -1100,9 -1103,8 +1100,9 @@@ static int bcmgenet_put_tx_csum(struct 
                        tx_csum_info |= STATUS_TX_CSUM_LV;
                        if (ip_proto == IPPROTO_UDP && ip_ver == ETH_P_IP)
                                tx_csum_info |= STATUS_TX_CSUM_PROTO_UDP;
 -              } else
 +              } else {
                        tx_csum_info = 0;
 +              }
  
                status->tx_csum_info = tx_csum_info;
        }
@@@ -1142,11 -1144,16 +1142,16 @@@ static netdev_tx_t bcmgenet_xmit(struc
        if (ring->free_bds <= nr_frags + 1) {
                netif_tx_stop_queue(txq);
                netdev_err(dev, "%s: tx ring %d full when queue %d awake\n",
 -                              __func__, index, ring->queue);
 +                         __func__, index, ring->queue);
                ret = NETDEV_TX_BUSY;
                goto out;
        }
  
+       if (skb_padto(skb, ETH_ZLEN)) {
+               ret = NETDEV_TX_OK;
+               goto out;
+       }
        /* set the SKB transmit checksum */
        if (priv->desc_64b_en) {
                ret = bcmgenet_put_tx_csum(dev, skb);
        /* xmit fragment */
        for (i = 0; i < nr_frags; i++) {
                ret = bcmgenet_xmit_frag(dev,
 -                              &skb_shinfo(skb)->frags[i],
 -                              (i == nr_frags - 1) ? DMA_EOP : 0, ring);
 +                                       &skb_shinfo(skb)->frags[i],
 +                                       (i == nr_frags - 1) ? DMA_EOP : 0,
 +                                       ring);
                if (ret) {
                        ret = NETDEV_TX_OK;
                        goto out;
         * producer index, now write it down to the hardware
         */
        bcmgenet_tdma_ring_writel(priv, ring->index,
 -                      ring->prod_index, TDMA_PROD_INDEX);
 +                                ring->prod_index, TDMA_PROD_INDEX);
  
        if (ring->free_bds <= (MAX_SKB_FRAGS + 1)) {
                netif_tx_stop_queue(txq);
  }
  
  
 -static int bcmgenet_rx_refill(struct bcmgenet_priv *priv,
 -                              struct enet_cb *cb)
 +static int bcmgenet_rx_refill(struct bcmgenet_priv *priv, struct enet_cb *cb)
  {
        struct device *kdev = &priv->pdev->dev;
        struct sk_buff *skb;
        dma_addr_t mapping;
        int ret;
  
 -      skb = netdev_alloc_skb(priv->dev,
 -                              priv->rx_buf_len + SKB_ALIGNMENT);
 +      skb = netdev_alloc_skb(priv->dev, priv->rx_buf_len + SKB_ALIGNMENT);
        if (!skb)
                return -ENOMEM;
  
        WARN_ON(cb->skb != NULL);
        cb->skb = skb;
        mapping = dma_map_single(kdev, skb->data,
 -                      priv->rx_buf_len, DMA_FROM_DEVICE);
 +                               priv->rx_buf_len, DMA_FROM_DEVICE);
        ret = dma_mapping_error(kdev, mapping);
        if (ret) {
                bcmgenet_free_cb(cb);
                netif_err(priv, rx_err, priv->dev,
 -                              "%s DMA map failed\n", __func__);
 +                        "%s DMA map failed\n", __func__);
                return ret;
        }
  
@@@ -1254,7 -1262,8 +1259,7 @@@ static unsigned int bcmgenet_desc_rx(st
        unsigned int p_index;
        unsigned int chksum_ok = 0;
  
 -      p_index = bcmgenet_rdma_ring_readl(priv,
 -                      DESC_INDEX, RDMA_PROD_INDEX);
 +      p_index = bcmgenet_rdma_ring_readl(priv, DESC_INDEX, RDMA_PROD_INDEX);
        p_index &= DMA_P_INDEX_MASK;
  
        if (p_index < priv->rx_c_index)
                rxpkttoprocess = p_index - priv->rx_c_index;
  
        netif_dbg(priv, rx_status, dev,
 -              "RDMA: rxpkttoprocess=%d\n", rxpkttoprocess);
 +                "RDMA: rxpkttoprocess=%d\n", rxpkttoprocess);
  
        while ((rxpktprocessed < rxpkttoprocess) &&
 -                      (rxpktprocessed < budget)) {
 -
 +             (rxpktprocessed < budget)) {
                /* Unmap the packet contents such that we can use the
                 * RSV from the 64 bytes descriptor when enabled and save
                 * a 32-bits register read
                cb = &priv->rx_cbs[priv->rx_read_ptr];
                skb = cb->skb;
                dma_unmap_single(&dev->dev, dma_unmap_addr(cb, dma_addr),
 -                              priv->rx_buf_len, DMA_FROM_DEVICE);
 +                               priv->rx_buf_len, DMA_FROM_DEVICE);
  
                if (!priv->desc_64b_en) {
 -                      dma_length_status = dmadesc_get_length_status(priv,
 -                                                      priv->rx_bds +
 -                                                      (priv->rx_read_ptr *
 -                                                       DMA_DESC_SIZE));
 +                      dma_length_status =
 +                              dmadesc_get_length_status(priv,
 +                                                        priv->rx_bds +
 +                                                        (priv->rx_read_ptr *
 +                                                         DMA_DESC_SIZE));
                } else {
                        struct status_64 *status;
 +
                        status = (struct status_64 *)skb->data;
                        dma_length_status = status->length_status;
                }
                len = dma_length_status >> DMA_BUFLENGTH_SHIFT;
  
                netif_dbg(priv, rx_status, dev,
 -                      "%s: p_ind=%d c_ind=%d read_ptr=%d len_stat=0x%08x\n",
 -                      __func__, p_index, priv->rx_c_index, priv->rx_read_ptr,
 -                      dma_length_status);
 +                        "%s:p_ind=%d c_ind=%d read_ptr=%d len_stat=0x%08x\n",
 +                        __func__, p_index, priv->rx_c_index,
 +                        priv->rx_read_ptr, dma_length_status);
  
                rxpktprocessed++;
  
  
                if (unlikely(!(dma_flag & DMA_EOP) || !(dma_flag & DMA_SOP))) {
                        netif_err(priv, rx_status, dev,
 -                                      "Droping fragmented packet!\n");
 +                                "dropping fragmented packet!\n");
                        dev->stats.rx_dropped++;
                        dev->stats.rx_errors++;
                        dev_kfree_skb_any(cb->skb);
                                                DMA_RX_LG |
                                                DMA_RX_RXER))) {
                        netif_err(priv, rx_status, dev, "dma_flag=0x%x\n",
 -                                              (unsigned int)dma_flag);
 +                                (unsigned int)dma_flag);
                        if (dma_flag & DMA_RX_CRC_ERROR)
                                dev->stats.rx_crc_errors++;
                        if (dma_flag & DMA_RX_OV)
                } /* error packet */
  
                chksum_ok = (dma_flag & priv->dma_rx_chk_bit) &&
 -                              priv->desc_rxchk_en;
 +                           priv->desc_rxchk_en;
  
                skb_put(skb, len);
                if (priv->desc_64b_en) {
@@@ -1408,6 -1416,7 +1413,6 @@@ static int bcmgenet_alloc_rx_buffers(st
                ret = bcmgenet_rx_refill(priv, cb);
                if (ret)
                        break;
 -
        }
  
        return ret;
@@@ -1423,8 -1432,8 +1428,8 @@@ static void bcmgenet_free_rx_buffers(st
  
                if (dma_unmap_addr(cb, dma_addr)) {
                        dma_unmap_single(&priv->dev->dev,
 -                                      dma_unmap_addr(cb, dma_addr),
 -                                      priv->rx_buf_len, DMA_FROM_DEVICE);
 +                                       dma_unmap_addr(cb, dma_addr),
 +                                       priv->rx_buf_len, DMA_FROM_DEVICE);
                        dma_unmap_addr_set(cb, dma_addr, 0);
                }
  
        }
  }
  
 +static void umac_enable_set(struct bcmgenet_priv *priv, u32 mask, bool enable)
 +{
 +      u32 reg;
 +
 +      reg = bcmgenet_umac_readl(priv, UMAC_CMD);
 +      if (enable)
 +              reg |= mask;
 +      else
 +              reg &= ~mask;
 +      bcmgenet_umac_writel(priv, reg, UMAC_CMD);
 +
 +      /* UniMAC stops on a packet boundary, wait for a full-size packet
 +       * to be processed
 +       */
 +      if (enable == 0)
 +              usleep_range(1000, 2000);
 +}
 +
  static int reset_umac(struct bcmgenet_priv *priv)
  {
        struct device *kdev = &priv->pdev->dev;
        return 0;
  }
  
 +static void bcmgenet_intr_disable(struct bcmgenet_priv *priv)
 +{
 +      /* Mask all interrupts.*/
 +      bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_MASK_SET);
 +      bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_CLEAR);
 +      bcmgenet_intrl2_0_writel(priv, 0, INTRL2_CPU_MASK_CLEAR);
 +      bcmgenet_intrl2_1_writel(priv, 0xFFFFFFFF, INTRL2_CPU_MASK_SET);
 +      bcmgenet_intrl2_1_writel(priv, 0xFFFFFFFF, INTRL2_CPU_CLEAR);
 +      bcmgenet_intrl2_1_writel(priv, 0, INTRL2_CPU_MASK_CLEAR);
 +}
 +
  static int init_umac(struct bcmgenet_priv *priv)
  {
        struct device *kdev = &priv->pdev->dev;
        bcmgenet_umac_writel(priv, 0, UMAC_CMD);
        /* clear tx/rx counter */
        bcmgenet_umac_writel(priv,
 -              MIB_RESET_RX | MIB_RESET_TX | MIB_RESET_RUNT, UMAC_MIB_CTRL);
 +                           MIB_RESET_RX | MIB_RESET_TX | MIB_RESET_RUNT,
 +                           UMAC_MIB_CTRL);
        bcmgenet_umac_writel(priv, 0, UMAC_MIB_CTRL);
  
        bcmgenet_umac_writel(priv, ENET_MAX_MTU_SIZE, UMAC_MAX_FRAME_LEN);
        if (!GENET_IS_V1(priv) && !GENET_IS_V2(priv))
                bcmgenet_rbuf_writel(priv, 1, RBUF_TBUF_SIZE_CTRL);
  
 -      /* Mask all interrupts.*/
 -      bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_MASK_SET);
 -      bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_CLEAR);
 -      bcmgenet_intrl2_0_writel(priv, 0, INTRL2_CPU_MASK_CLEAR);
 +      bcmgenet_intr_disable(priv);
  
        cpu_mask_clear = UMAC_IRQ_RXDMA_BDONE;
  
        dev_dbg(kdev, "%s:Enabling RXDMA_BDONE interrupt\n", __func__);
  
        /* Monitor cable plug/unpluged event for internal PHY */
 -      if (phy_is_internal(priv->phydev))
 +      if (phy_is_internal(priv->phydev)) {
                cpu_mask_clear |= (UMAC_IRQ_LINK_DOWN | UMAC_IRQ_LINK_UP);
 -      else if (priv->ext_phy)
 +      } else if (priv->ext_phy) {
                cpu_mask_clear |= (UMAC_IRQ_LINK_DOWN | UMAC_IRQ_LINK_UP);
 -      else if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) {
 +      else if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) {
                reg = bcmgenet_bp_mc_get(priv);
                reg |= BIT(priv->hw_params->bp_in_en_shift);
  
        if (priv->hw_params->flags & GENET_HAS_MDIO_INTR)
                cpu_mask_clear |= UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR;
  
 -      bcmgenet_intrl2_0_writel(priv, cpu_mask_clear,
 -              INTRL2_CPU_MASK_CLEAR);
 +      bcmgenet_intrl2_0_writel(priv, cpu_mask_clear, INTRL2_CPU_MASK_CLEAR);
  
        /* Enable rx/tx engine.*/
        dev_dbg(kdev, "done init umac\n");
@@@ -1599,28 -1582,28 +1604,28 @@@ static void bcmgenet_init_tx_ring(struc
        bcmgenet_tdma_ring_writel(priv, index, 1, DMA_MBUF_DONE_THRESH);
        /* Disable rate control for now */
        bcmgenet_tdma_ring_writel(priv, index, flow_period_val,
 -                      TDMA_FLOW_PERIOD);
 +                                TDMA_FLOW_PERIOD);
        /* Unclassified traffic goes to ring 16 */
        bcmgenet_tdma_ring_writel(priv, index,
 -                      ((size << DMA_RING_SIZE_SHIFT) | RX_BUF_LENGTH),
 -                      DMA_RING_BUF_SIZE);
 +                                ((size << DMA_RING_SIZE_SHIFT) |
 +                                 RX_BUF_LENGTH), DMA_RING_BUF_SIZE);
  
        first_bd = write_ptr;
  
        /* Set start and end address, read and write pointers */
        bcmgenet_tdma_ring_writel(priv, index, first_bd * words_per_bd,
 -                      DMA_START_ADDR);
 +                                DMA_START_ADDR);
        bcmgenet_tdma_ring_writel(priv, index, first_bd * words_per_bd,
 -                      TDMA_READ_PTR);
 +                                TDMA_READ_PTR);
        bcmgenet_tdma_ring_writel(priv, index, first_bd,
 -                      TDMA_WRITE_PTR);
 +                                TDMA_WRITE_PTR);
        bcmgenet_tdma_ring_writel(priv, index, end_ptr * words_per_bd - 1,
 -                      DMA_END_ADDR);
 +                                DMA_END_ADDR);
  }
  
  /* Initialize a RDMA ring */
  static int bcmgenet_init_rx_ring(struct bcmgenet_priv *priv,
 -                                unsigned int index, unsigned int size)
 +                               unsigned int index, unsigned int size)
  {
        u32 words_per_bd = WORDS_PER_BD(priv);
        int ret;
        priv->rx_bd_assign_index = 0;
        priv->rx_c_index = 0;
        priv->rx_read_ptr = 0;
 -      priv->rx_cbs = kzalloc(priv->num_rx_bds * sizeof(struct enet_cb),
 -                              GFP_KERNEL);
 +      priv->rx_cbs = kcalloc(priv->num_rx_bds, sizeof(struct enet_cb),
 +                             GFP_KERNEL);
        if (!priv->rx_cbs)
                return -ENOMEM;
  
        bcmgenet_rdma_ring_writel(priv, index, 0, RDMA_PROD_INDEX);
        bcmgenet_rdma_ring_writel(priv, index, 0, RDMA_CONS_INDEX);
        bcmgenet_rdma_ring_writel(priv, index,
 -              ((size << DMA_RING_SIZE_SHIFT) | RX_BUF_LENGTH),
 -              DMA_RING_BUF_SIZE);
 +                                ((size << DMA_RING_SIZE_SHIFT) |
 +                                 RX_BUF_LENGTH), DMA_RING_BUF_SIZE);
        bcmgenet_rdma_ring_writel(priv, index, 0, DMA_START_ADDR);
        bcmgenet_rdma_ring_writel(priv, index,
 -              words_per_bd * size - 1, DMA_END_ADDR);
 +                                words_per_bd * size - 1, DMA_END_ADDR);
        bcmgenet_rdma_ring_writel(priv, index,
 -                      (DMA_FC_THRESH_LO << DMA_XOFF_THRESHOLD_SHIFT) |
 -                      DMA_FC_THRESH_HI, RDMA_XON_XOFF_THRESH);
 +                                (DMA_FC_THRESH_LO <<
 +                                 DMA_XOFF_THRESHOLD_SHIFT) |
 +                                 DMA_FC_THRESH_HI, RDMA_XON_XOFF_THRESH);
        bcmgenet_rdma_ring_writel(priv, index, 0, RDMA_READ_PTR);
  
        return ret;
@@@ -1701,8 -1683,8 +1706,8 @@@ static void bcmgenet_init_multiq(struc
                 * (ring 16)
                 */
                bcmgenet_init_tx_ring(priv, i, priv->hw_params->bds_cnt,
 -                                      i * priv->hw_params->bds_cnt,
 -                                      (i + 1) * priv->hw_params->bds_cnt);
 +                                    i * priv->hw_params->bds_cnt,
 +                                    (i + 1) * priv->hw_params->bds_cnt);
  
                /* Configure ring as decriptor ring and setup priority */
                ring_cfg |= 1 << i;
@@@ -1773,8 -1755,8 +1778,8 @@@ static int bcmgenet_init_dma(struct bcm
        /* Initialize commont TX ring structures */
        priv->tx_bds = priv->base + priv->hw_params->tdma_offset;
        priv->num_tx_bds = TOTAL_DESC;
 -      priv->tx_cbs = kzalloc(priv->num_tx_bds * sizeof(struct enet_cb),
 -                              GFP_KERNEL);
 +      priv->tx_cbs = kcalloc(priv->num_tx_bds, sizeof(struct enet_cb),
 +                             GFP_KERNEL);
        if (!priv->tx_cbs) {
                bcmgenet_fini_dma(priv);
                return -ENOMEM;
  
        /* initialize special ring 16 */
        bcmgenet_init_tx_ring(priv, DESC_INDEX, GENET_DEFAULT_BD_CNT,
 -                      priv->hw_params->tx_queues * priv->hw_params->bds_cnt,
 -                      TOTAL_DESC);
 +                            priv->hw_params->tx_queues *
 +                            priv->hw_params->bds_cnt,
 +                            TOTAL_DESC);
  
        return 0;
  }
@@@ -1808,11 -1789,11 +1813,11 @@@ static int bcmgenet_poll(struct napi_st
        priv->rx_c_index += work_done;
        priv->rx_c_index &= DMA_C_INDEX_MASK;
        bcmgenet_rdma_ring_writel(priv, DESC_INDEX,
 -                              priv->rx_c_index, RDMA_CONS_INDEX);
 +                                priv->rx_c_index, RDMA_CONS_INDEX);
        if (work_done < budget) {
                napi_complete(napi);
 -              bcmgenet_intrl2_0_writel(priv,
 -                      UMAC_IRQ_RXDMA_BDONE, INTRL2_CPU_MASK_CLEAR);
 +              bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_RXDMA_BDONE,
 +                                       INTRL2_CPU_MASK_CLEAR);
        }
  
        return work_done;
@@@ -1826,18 -1807,11 +1831,18 @@@ static void bcmgenet_irq_task(struct wo
  
        netif_dbg(priv, intr, priv->dev, "%s\n", __func__);
  
 +      if (priv->irq0_stat & UMAC_IRQ_MPD_R) {
 +              priv->irq0_stat &= ~UMAC_IRQ_MPD_R;
 +              netif_dbg(priv, wol, priv->dev,
 +                        "magic packet detected, waking up\n");
 +              bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC);
 +      }
 +
        /* Link UP/DOWN event */
        if ((priv->hw_params->flags & GENET_HAS_MDIO_INTR) &&
 -              (priv->irq0_stat & (UMAC_IRQ_LINK_UP|UMAC_IRQ_LINK_DOWN))) {
 +          (priv->irq0_stat & (UMAC_IRQ_LINK_UP|UMAC_IRQ_LINK_DOWN))) {
                phy_mac_interrupt(priv->phydev,
 -                      priv->irq0_stat & UMAC_IRQ_LINK_UP);
 +                                priv->irq0_stat & UMAC_IRQ_LINK_UP);
                priv->irq0_stat &= ~(UMAC_IRQ_LINK_UP|UMAC_IRQ_LINK_DOWN);
        }
  }
@@@ -1856,7 -1830,7 +1861,7 @@@ static irqreturn_t bcmgenet_isr1(int ir
        bcmgenet_intrl2_1_writel(priv, priv->irq1_stat, INTRL2_CPU_CLEAR);
  
        netif_dbg(priv, intr, priv->dev,
 -              "%s: IRQ=0x%x\n", __func__, priv->irq1_stat);
 +                "%s: IRQ=0x%x\n", __func__, priv->irq1_stat);
        /* Check the MBDONE interrupts.
         * packet is done, reclaim descriptors
         */
                for (index = 0; index < 16; index++) {
                        if (priv->irq1_stat & (1 << index))
                                bcmgenet_tx_reclaim(priv->dev,
 -                                              &priv->tx_rings[index]);
 +                                                  &priv->tx_rings[index]);
                }
        }
        return IRQ_HANDLED;
@@@ -1884,7 -1858,7 +1889,7 @@@ static irqreturn_t bcmgenet_isr0(int ir
        bcmgenet_intrl2_0_writel(priv, priv->irq0_stat, INTRL2_CPU_CLEAR);
  
        netif_dbg(priv, intr, priv->dev,
 -              "IRQ=0x%x\n", priv->irq0_stat);
 +                "IRQ=0x%x\n", priv->irq0_stat);
  
        if (priv->irq0_stat & (UMAC_IRQ_RXDMA_BDONE | UMAC_IRQ_RXDMA_PDONE)) {
                /* We use NAPI(software interrupt throttling, if
                 * Disable interrupt, will be enabled in the poll method.
                 */
                if (likely(napi_schedule_prep(&priv->napi))) {
 -                      bcmgenet_intrl2_0_writel(priv,
 -                              UMAC_IRQ_RXDMA_BDONE, INTRL2_CPU_MASK_SET);
 +                      bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_RXDMA_BDONE,
 +                                               INTRL2_CPU_MASK_SET);
                        __napi_schedule(&priv->napi);
                }
        }
        }
  
        if ((priv->hw_params->flags & GENET_HAS_MDIO_INTR) &&
 -              priv->irq0_stat & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) {
 +          priv->irq0_stat & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) {
                priv->irq0_stat &= ~(UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR);
                wake_up(&priv->wq);
        }
        return IRQ_HANDLED;
  }
  
 +static irqreturn_t bcmgenet_wol_isr(int irq, void *dev_id)
 +{
 +      struct bcmgenet_priv *priv = dev_id;
 +
 +      pm_wakeup_event(&priv->pdev->dev, 0);
 +
 +      return IRQ_HANDLED;
 +}
 +
  static void bcmgenet_umac_reset(struct bcmgenet_priv *priv)
  {
        u32 reg;
  }
  
  static void bcmgenet_set_hw_addr(struct bcmgenet_priv *priv,
 -                                unsigned char *addr)
 +                               unsigned char *addr)
  {
        bcmgenet_umac_writel(priv, (addr[0] << 24) | (addr[1] << 16) |
                        (addr[2] << 8) | addr[3], UMAC_MAC0);
  
  static int bcmgenet_wol_resume(struct bcmgenet_priv *priv)
  {
 -      int ret;
 -
        /* From WOL-enabled suspend, switch to regular clock */
 -      clk_disable(priv->clk_wol);
 -      /* init umac registers to synchronize s/w with h/w */
 -      ret = init_umac(priv);
 -      if (ret)
 -              return ret;
 +      clk_disable_unprepare(priv->clk_wol);
  
        phy_init_hw(priv->phydev);
        /* Speed settings must be restored */
@@@ -2001,23 -1972,6 +2006,23 @@@ static void bcmgenet_enable_dma(struct 
        bcmgenet_tdma_writel(priv, reg, DMA_CTRL);
  }
  
 +static void bcmgenet_netif_start(struct net_device *dev)
 +{
 +      struct bcmgenet_priv *priv = netdev_priv(dev);
 +
 +      /* Start the network engine */
 +      napi_enable(&priv->napi);
 +
 +      umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, true);
 +
 +      if (phy_is_internal(priv->phydev))
 +              bcmgenet_power_up(priv, GENET_POWER_PASSIVE);
 +
 +      netif_tx_start_all_queues(dev);
 +
 +      phy_start(priv->phydev);
 +}
 +
  static int bcmgenet_open(struct net_device *dev)
  {
        struct bcmgenet_priv *priv = netdev_priv(dev);
                goto err_clk_disable;
  
        /* disable ethernet MAC while updating its registers */
 +      umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, false);
 +
 +      /* Make sure we reflect the value of CRC_CMD_FWD */
        reg = bcmgenet_umac_readl(priv, UMAC_CMD);
 -      reg &= ~(CMD_TX_EN | CMD_RX_EN);
 -      bcmgenet_umac_writel(priv, reg, UMAC_CMD);
 +      priv->crc_fwd_en = !!(reg & CMD_CRC_FWD);
  
        bcmgenet_set_hw_addr(priv, dev->dev_addr);
  
 -      if (priv->wol_enabled) {
 -              ret = bcmgenet_wol_resume(priv);
 -              if (ret)
 -                      return ret;
 -      }
 -
        if (phy_is_internal(priv->phydev)) {
                reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
                reg |= EXT_ENERGY_DET_MASK;
        bcmgenet_enable_dma(priv, dma_ctrl);
  
        ret = request_irq(priv->irq0, bcmgenet_isr0, IRQF_SHARED,
 -                      dev->name, priv);
 +                        dev->name, priv);
        if (ret < 0) {
                netdev_err(dev, "can't request IRQ %d\n", priv->irq0);
                goto err_fini_dma;
        }
  
        ret = request_irq(priv->irq1, bcmgenet_isr1, IRQF_SHARED,
 -                              dev->name, priv);
 +                        dev->name, priv);
        if (ret < 0) {
                netdev_err(dev, "can't request IRQ %d\n", priv->irq1);
                goto err_irq0;
        }
  
 -      /* Start the network engine */
 -      napi_enable(&priv->napi);
 -
 -      reg = bcmgenet_umac_readl(priv, UMAC_CMD);
 -      reg |= (CMD_TX_EN | CMD_RX_EN);
 -      bcmgenet_umac_writel(priv, reg, UMAC_CMD);
 -
 -      /* Make sure we reflect the value of CRC_CMD_FWD */
 -      priv->crc_fwd_en = !!(reg & CMD_CRC_FWD);
 -
 -      device_set_wakeup_capable(&dev->dev, 1);
 -
 -      if (phy_is_internal(priv->phydev))
 -              bcmgenet_power_up(priv, GENET_POWER_PASSIVE);
 -
 -      netif_tx_start_all_queues(dev);
 -
 -      phy_start(priv->phydev);
 +      bcmgenet_netif_start(dev);
  
        return 0;
  
@@@ -2115,7 -2090,8 +2120,7 @@@ static int bcmgenet_dma_teardown(struc
        }
  
        if (timeout == DMA_TIMEOUT_VAL) {
 -              netdev_warn(priv->dev,
 -                      "Timed out while disabling TX DMA\n");
 +              netdev_warn(priv->dev, "Timed out while disabling TX DMA\n");
                ret = -ETIMEDOUT;
        }
  
        }
  
        if (timeout == DMA_TIMEOUT_VAL) {
 -              netdev_warn(priv->dev,
 -                      "Timed out while disabling RX DMA\n");
 -                      ret = -ETIMEDOUT;
 +              netdev_warn(priv->dev, "Timed out while disabling RX DMA\n");
 +              ret = -ETIMEDOUT;
        }
  
        return ret;
  }
  
 +static void bcmgenet_netif_stop(struct net_device *dev)
 +{
 +      struct bcmgenet_priv *priv = netdev_priv(dev);
 +
 +      netif_tx_stop_all_queues(dev);
 +      napi_disable(&priv->napi);
 +      phy_stop(priv->phydev);
 +
 +      bcmgenet_intr_disable(priv);
 +
 +      /* Wait for pending work items to complete. Since interrupts are
 +       * disabled no new work will be scheduled.
 +       */
 +      cancel_work_sync(&priv->bcmgenet_irq_work);
 +}
 +
  static int bcmgenet_close(struct net_device *dev)
  {
        struct bcmgenet_priv *priv = netdev_priv(dev);
        int ret;
 -      u32 reg;
  
        netif_dbg(priv, ifdown, dev, "bcmgenet_close\n");
  
 -      phy_stop(priv->phydev);
 +      bcmgenet_netif_stop(dev);
  
        /* Disable MAC receive */
 -      reg = bcmgenet_umac_readl(priv, UMAC_CMD);
 -      reg &= ~CMD_RX_EN;
 -      bcmgenet_umac_writel(priv, reg, UMAC_CMD);
 -
 -      netif_tx_stop_all_queues(dev);
 +      umac_enable_set(priv, CMD_RX_EN, false);
  
        ret = bcmgenet_dma_teardown(priv);
        if (ret)
                return ret;
  
        /* Disable MAC transmit. TX DMA disabled have to done before this */
 -      reg = bcmgenet_umac_readl(priv, UMAC_CMD);
 -      reg &= ~CMD_TX_EN;
 -      bcmgenet_umac_writel(priv, reg, UMAC_CMD);
 -
 -      napi_disable(&priv->napi);
 +      umac_enable_set(priv, CMD_TX_EN, false);
  
        /* tx reclaim */
        bcmgenet_tx_reclaim_all(dev);
        free_irq(priv->irq0, priv);
        free_irq(priv->irq1, priv);
  
 -      /* Wait for pending work items to complete - we are stopping
 -       * the clock now. Since interrupts are disabled, no new work
 -       * will be scheduled.
 -       */
 -      cancel_work_sync(&priv->bcmgenet_irq_work);
 -
        if (phy_is_internal(priv->phydev))
                bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
  
 -      if (priv->wol_enabled)
 -              clk_enable(priv->clk_wol);
 -
        if (!IS_ERR(priv->clk))
                clk_disable_unprepare(priv->clk);
  
@@@ -2218,11 -2197,12 +2223,11 @@@ static inline void bcmgenet_set_mdf_add
  {
        u32 reg;
  
 -      bcmgenet_umac_writel(priv,
 -                      addr[0] << 8 | addr[1], UMAC_MDF_ADDR + (*i * 4));
 -      bcmgenet_umac_writel(priv,
 -                      addr[2] << 24 | addr[3] << 16 |
 -                      addr[4] << 8 | addr[5],
 -                      UMAC_MDF_ADDR + ((*i + 1) * 4));
 +      bcmgenet_umac_writel(priv, addr[0] << 8 | addr[1],
 +                           UMAC_MDF_ADDR + (*i * 4));
 +      bcmgenet_umac_writel(priv, addr[2] << 24 | addr[3] << 16 |
 +                           addr[4] << 8 | addr[5],
 +                           UMAC_MDF_ADDR + ((*i + 1) * 4));
        reg = bcmgenet_umac_readl(priv, UMAC_MDF_CTRL);
        reg |= (1 << (MAX_MC_COUNT - *mc));
        bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL);
@@@ -2419,7 -2399,7 +2424,7 @@@ static void bcmgenet_set_hw_params(stru
  
        /* Print the GENET core version */
        dev_info(&priv->pdev->dev, "GENET " GENET_VER_FMT,
 -              major, (reg >> 16) & 0x0f, reg & 0xffff);
 +               major, (reg >> 16) & 0x0f, reg & 0xffff);
  
  #ifdef CONFIG_PHYS_ADDR_T_64BIT
        if (!(params->flags & GENET_HAS_40BITS))
@@@ -2475,7 -2455,6 +2480,7 @@@ static int bcmgenet_probe(struct platfo
        priv = netdev_priv(dev);
        priv->irq0 = platform_get_irq(pdev, 0);
        priv->irq1 = platform_get_irq(pdev, 1);
 +      priv->wol_irq = platform_get_irq(pdev, 2);
        if (!priv->irq0 || !priv->irq1) {
                dev_err(&pdev->dev, "can't find IRQs\n");
                err = -EINVAL;
        dev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM |
                NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM;
  
 +      /* Request the WOL interrupt and advertise suspend if available */
 +      priv->wol_irq_disabled = true;
 +      err = devm_request_irq(&pdev->dev, priv->wol_irq, bcmgenet_wol_isr, 0,
 +                             dev->name, priv);
 +      if (!err)
 +              device_set_wakeup_capable(&pdev->dev, 1);
 +
        /* Set the needed headroom to account for any possible
         * features enabling/disabling at runtime
         */
@@@ -2594,111 -2566,6 +2599,111 @@@ static int bcmgenet_remove(struct platf
        return 0;
  }
  
 +#ifdef CONFIG_PM_SLEEP
 +static int bcmgenet_suspend(struct device *d)
 +{
 +      struct net_device *dev = dev_get_drvdata(d);
 +      struct bcmgenet_priv *priv = netdev_priv(dev);
 +      int ret;
 +
 +      if (!netif_running(dev))
 +              return 0;
 +
 +      bcmgenet_netif_stop(dev);
 +
 +      netif_device_detach(dev);
 +
 +      /* Disable MAC receive */
 +      umac_enable_set(priv, CMD_RX_EN, false);
 +
 +      ret = bcmgenet_dma_teardown(priv);
 +      if (ret)
 +              return ret;
 +
 +      /* Disable MAC transmit. TX DMA disabled have to done before this */
 +      umac_enable_set(priv, CMD_TX_EN, false);
 +
 +      /* tx reclaim */
 +      bcmgenet_tx_reclaim_all(dev);
 +      bcmgenet_fini_dma(priv);
 +
 +      /* Prepare the device for Wake-on-LAN and switch to the slow clock */
 +      if (device_may_wakeup(d) && priv->wolopts) {
 +              bcmgenet_power_down(priv, GENET_POWER_WOL_MAGIC);
 +              clk_prepare_enable(priv->clk_wol);
 +      }
 +
 +      /* Turn off the clocks */
 +      clk_disable_unprepare(priv->clk);
 +
 +      return 0;
 +}
 +
 +static int bcmgenet_resume(struct device *d)
 +{
 +      struct net_device *dev = dev_get_drvdata(d);
 +      struct bcmgenet_priv *priv = netdev_priv(dev);
 +      unsigned long dma_ctrl;
 +      int ret;
 +      u32 reg;
 +
 +      if (!netif_running(dev))
 +              return 0;
 +
 +      /* Turn on the clock */
 +      ret = clk_prepare_enable(priv->clk);
 +      if (ret)
 +              return ret;
 +
 +      bcmgenet_umac_reset(priv);
 +
 +      ret = init_umac(priv);
 +      if (ret)
 +              goto out_clk_disable;
 +
 +      if (priv->wolopts)
 +              ret = bcmgenet_wol_resume(priv);
 +
 +      if (ret)
 +              goto out_clk_disable;
 +
 +      /* disable ethernet MAC while updating its registers */
 +      umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, false);
 +
 +      bcmgenet_set_hw_addr(priv, dev->dev_addr);
 +
 +      if (phy_is_internal(priv->phydev)) {
 +              reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
 +              reg |= EXT_ENERGY_DET_MASK;
 +              bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
 +      }
 +
 +      /* Disable RX/TX DMA and flush TX queues */
 +      dma_ctrl = bcmgenet_dma_disable(priv);
 +
 +      /* Reinitialize TDMA and RDMA and SW housekeeping */
 +      ret = bcmgenet_init_dma(priv);
 +      if (ret) {
 +              netdev_err(dev, "failed to initialize DMA\n");
 +              goto out_clk_disable;
 +      }
 +
 +      /* Always enable ring 16 - descriptor ring */
 +      bcmgenet_enable_dma(priv, dma_ctrl);
 +
 +      netif_device_attach(dev);
 +
 +      bcmgenet_netif_start(dev);
 +
 +      return 0;
 +
 +out_clk_disable:
 +      clk_disable_unprepare(priv->clk);
 +      return ret;
 +}
 +#endif /* CONFIG_PM_SLEEP */
 +
 +static SIMPLE_DEV_PM_OPS(bcmgenet_pm_ops, bcmgenet_suspend, bcmgenet_resume);
  
  static struct platform_driver bcmgenet_driver = {
        .probe  = bcmgenet_probe,
                .name   = "bcmgenet",
                .owner  = THIS_MODULE,
                .of_match_table = bcmgenet_match,
 +              .pm     = &bcmgenet_pm_ops,
        },
  };
  module_platform_driver(bcmgenet_driver);
index f13e0acc8a69ea6bd3975ef2e0c76d3fb831cf6f,d97d5f39a04e4a307bb1e5b53eaab18a85b6b828..592977a6547cd6369df4b9d11a76c056dd2c418d
@@@ -378,8 -378,10 +378,10 @@@ static int netvsc_init_buf(struct hv_de
  
        net_device->send_section_map =
                kzalloc(net_device->map_words * sizeof(ulong), GFP_KERNEL);
-       if (net_device->send_section_map == NULL)
+       if (net_device->send_section_map == NULL) {
+               ret = -ENOMEM;
                goto cleanup;
+       }
  
        goto exit;
  
@@@ -1094,7 -1096,9 +1096,7 @@@ close
        vmbus_close(device->channel);
  
  cleanup:
 -
 -      if (net_device)
 -              kfree(net_device);
 +      kfree(net_device);
  
        return ret;
  }
index 4f4568ef124e4662350c27196092585d46915501,22c57be4dfa0544199a516a00bbe16bf291c9b26..ca5ec3e18d3662daeebd999291cc6a78c73e79de
@@@ -355,7 -355,7 +355,7 @@@ int phy_device_register(struct phy_devi
        phydev->bus->phy_map[phydev->addr] = phydev;
  
        /* Run all of the fixups for this PHY */
-       err = phy_init_hw(phydev);
+       err = phy_scan_fixups(phydev);
        if (err) {
                pr_err("PHY %d failed to initialize\n", phydev->addr);
                goto out;
@@@ -575,6 -575,7 +575,7 @@@ int phy_attach_direct(struct net_devic
                      u32 flags, phy_interface_t interface)
  {
        struct device *d = &phydev->dev;
+       struct module *bus_module;
        int err;
  
        /* Assume that if there is no driver, that it doesn't
                return -EBUSY;
        }
  
+       /* Increment the bus module reference count */
+       bus_module = phydev->bus->dev.driver ?
+                    phydev->bus->dev.driver->owner : NULL;
+       if (!try_module_get(bus_module)) {
+               dev_err(&dev->dev, "failed to get the bus module\n");
+               return -EIO;
+       }
        phydev->attached_dev = dev;
        dev->phydev = phydev;
  
@@@ -664,6 -673,10 +673,10 @@@ EXPORT_SYMBOL(phy_attach)
  void phy_detach(struct phy_device *phydev)
  {
        int i;
+       if (phydev->bus->dev.driver)
+               module_put(phydev->bus->dev.driver->owner);
        phydev->attached_dev->phydev = NULL;
        phydev->attached_dev = NULL;
        phy_suspend(phydev);
@@@ -696,7 -709,6 +709,7 @@@ int phy_suspend(struct phy_device *phyd
                return phydrv->suspend(phydev);
        return 0;
  }
 +EXPORT_SYMBOL(phy_suspend);
  
  int phy_resume(struct phy_device *phydev)
  {
                return phydrv->resume(phydev);
        return 0;
  }
 +EXPORT_SYMBOL(phy_resume);
  
  /* Generic PHY support and helper functions */
  
diff --combined drivers/net/usb/r8152.c
index e1e430587868560e67fc03b3f4a4531586ca4d51,3eab74c7c55406417b65ba5f80f869fc95c606ea..87f710476217d8a02cc496925d57ac5fcd0021c8
@@@ -59,7 -59,6 +59,7 @@@
  #define PLA_WDT6_CTRL         0xe428
  #define PLA_TCR0              0xe610
  #define PLA_TCR1              0xe612
 +#define PLA_MTPS              0xe615
  #define PLA_TXFIFO_CTRL               0xe618
  #define PLA_RSTTALLY          0xe800
  #define PLA_CR                        0xe813
  /* PLA_TCR1 */
  #define VERSION_MASK          0x7cf0
  
 +/* PLA_MTPS */
 +#define MTPS_JUMBO            (12 * 1024 / 64)
 +#define MTPS_DEFAULT          (6 * 1024 / 64)
 +
  /* PLA_RSTTALLY */
  #define TALLY_RESET           0x0001
  
  /* USB_DEV_STAT */
  #define STAT_SPEED_MASK               0x0006
  #define STAT_SPEED_HIGH               0x0000
- #define STAT_SPEED_FULL               0x0001
+ #define STAT_SPEED_FULL               0x0002
  
  /* USB_TX_AGG */
  #define TX_AGG_MAX_THRESHOLD  0x03
@@@ -445,11 -440,8 +445,11 @@@ enum rtl_register_content 
  #define BYTE_EN_START_MASK    0x0f
  #define BYTE_EN_END_MASK      0xf0
  
 +#define RTL8153_MAX_PACKET    9216 /* 9K */
 +#define RTL8153_MAX_MTU               (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - VLAN_HLEN)
  #define RTL8152_RMS           (VLAN_ETH_FRAME_LEN + VLAN_HLEN)
 -#define RTL8152_TX_TIMEOUT    (HZ)
 +#define RTL8153_RMS           RTL8153_MAX_PACKET
 +#define RTL8152_TX_TIMEOUT    (5 * HZ)
  
  /* rtl8152 flags */
  enum rtl8152_flags {
@@@ -2300,9 -2292,8 +2300,8 @@@ static void r8152b_exit_oob(struct r815
        /* rx share fifo credit full threshold */
        ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_NORMAL);
  
-       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_DEV_STAT);
-       ocp_data &= STAT_SPEED_MASK;
-       if (ocp_data == STAT_SPEED_FULL) {
+       if (tp->udev->speed == USB_SPEED_FULL ||
+           tp->udev->speed == USB_SPEED_LOW) {
                /* rx share fifo credit near full threshold */
                ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1,
                                RXFIFO_THR2_FULL);
@@@ -2530,8 -2521,7 +2529,8 @@@ static void r8153_first_init(struct r81
        ocp_data &= ~CPCR_RX_VLAN;
        ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
  
 -      ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
 +      ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8153_RMS);
 +      ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
  
        ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
        ocp_data |= TCR0_AUTO_FIFO;
@@@ -2581,7 -2571,7 +2580,7 @@@ static void r8153_enter_oob(struct r815
                mdelay(1);
        }
  
 -      ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
 +      ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8153_RMS);
  
        ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG);
        ocp_data &= ~TEREDO_WAKE_MASK;
        return res;
  }
  
 +static int rtl8152_change_mtu(struct net_device *dev, int new_mtu)
 +{
 +      struct r8152 *tp = netdev_priv(dev);
 +
 +      switch (tp->version) {
 +      case RTL_VER_01:
 +      case RTL_VER_02:
 +              return eth_change_mtu(dev, new_mtu);
 +      default:
 +              break;
 +      }
 +
 +      if (new_mtu < 68 || new_mtu > RTL8153_MAX_MTU)
 +              return -EINVAL;
 +
 +      dev->mtu = new_mtu;
 +
 +      return 0;
 +}
 +
  static const struct net_device_ops rtl8152_netdev_ops = {
        .ndo_open               = rtl8152_open,
        .ndo_stop               = rtl8152_close,
        .ndo_tx_timeout         = rtl8152_tx_timeout,
        .ndo_set_rx_mode        = rtl8152_set_rx_mode,
        .ndo_set_mac_address    = rtl8152_set_mac_address,
 -
 -      .ndo_change_mtu         = eth_change_mtu,
 +      .ndo_change_mtu         = rtl8152_change_mtu,
        .ndo_validate_addr      = eth_validate_addr,
  };
  
diff --combined drivers/net/vxlan.c
index d3f3e5d21874672d18d84bfdc71043c6480d5bbd,9f79192c9aa0130d978e01ea8c1585298686ea2a..1fb7b37d1402a447b84298829bab61d4f8b6d129
@@@ -33,7 -33,6 +33,7 @@@
  #include <net/ip_tunnels.h>
  #include <net/icmp.h>
  #include <net/udp.h>
 +#include <net/udp_tunnel.h>
  #include <net/rtnetlink.h>
  #include <net/route.h>
  #include <net/dsfield.h>
@@@ -340,7 -339,7 +340,7 @@@ static int vxlan_fdb_info(struct sk_buf
        ndm->ndm_state = fdb->state;
        ndm->ndm_ifindex = vxlan->dev->ifindex;
        ndm->ndm_flags = fdb->flags;
-       ndm->ndm_type = NDA_DST;
+       ndm->ndm_type = RTN_UNICAST;
  
        if (send_eth && nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->eth_addr))
                goto nla_put_failure;
@@@ -934,8 -933,7 +934,8 @@@ out
  
  /* Dump forwarding table */
  static int vxlan_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
 -                        struct net_device *dev, int idx)
 +                        struct net_device *dev,
 +                        struct net_device *filter_dev, int idx)
  {
        struct vxlan_dev *vxlan = netdev_priv(dev);
        unsigned int h;
@@@ -1572,6 -1570,25 +1572,6 @@@ static bool route_shortcircuit(struct n
        return false;
  }
  
 -/* Compute source port for outgoing packet
 - *   first choice to use L4 flow hash since it will spread
 - *     better and maybe available from hardware
 - *   secondary choice is to use jhash on the Ethernet header
 - */
 -__be16 vxlan_src_port(__u16 port_min, __u16 port_max, struct sk_buff *skb)
 -{
 -      unsigned int range = (port_max - port_min) + 1;
 -      u32 hash;
 -
 -      hash = skb_get_hash(skb);
 -      if (!hash)
 -              hash = jhash(skb->data, 2 * ETH_ALEN,
 -                           (__force u32) skb->protocol);
 -
 -      return htons((((u64) hash * range) >> 32) + port_min);
 -}
 -EXPORT_SYMBOL_GPL(vxlan_src_port);
 -
  static inline struct sk_buff *vxlan_handle_offloads(struct sk_buff *skb,
                                                    bool udp_csum)
  {
@@@ -1790,8 -1807,7 +1790,8 @@@ static void vxlan_xmit_one(struct sk_bu
        if (tos == 1)
                tos = ip_tunnel_get_dsfield(old_iph, skb);
  
 -      src_port = vxlan_src_port(vxlan->port_min, vxlan->port_max, skb);
 +      src_port = udp_flow_src_port(dev_net(dev), skb, vxlan->port_min,
 +                                   vxlan->port_max, true);
  
        if (dst->sa.sa_family == AF_INET) {
                memset(&fl4, 0, sizeof(fl4));
@@@ -2219,6 -2235,7 +2219,6 @@@ static void vxlan_setup(struct net_devi
  {
        struct vxlan_dev *vxlan = netdev_priv(dev);
        unsigned int h;
 -      int low, high;
  
        eth_hw_addr_random(dev);
        ether_setup(dev);
        vxlan->age_timer.function = vxlan_cleanup;
        vxlan->age_timer.data = (unsigned long) vxlan;
  
 -      inet_get_local_port_range(dev_net(dev), &low, &high);
 -      vxlan->port_min = low;
 -      vxlan->port_max = high;
        vxlan->dst_port = htons(vxlan_port);
  
        vxlan->dev = dev;
@@@ -2340,37 -2360,102 +2340,37 @@@ static void vxlan_del_work(struct work_
        kfree_rcu(vs, rcu);
  }
  
 -#if IS_ENABLED(CONFIG_IPV6)
 -/* Create UDP socket for encapsulation receive. AF_INET6 socket
 - * could be used for both IPv4 and IPv6 communications, but
 - * users may set bindv6only=1.
 - */
 -static struct socket *create_v6_sock(struct net *net, __be16 port, u32 flags)
 +static struct socket *vxlan_create_sock(struct net *net, bool ipv6,
 +                                      __be16 port, u32 flags)
  {
 -      struct sock *sk;
        struct socket *sock;
 -      struct sockaddr_in6 vxlan_addr = {
 -              .sin6_family = AF_INET6,
 -              .sin6_port = port,
 -      };
 -      int rc, val = 1;
 +      struct udp_port_cfg udp_conf;
 +      int err;
  
 -      rc = sock_create_kern(AF_INET6, SOCK_DGRAM, IPPROTO_UDP, &sock);
 -      if (rc < 0) {
 -              pr_debug("UDPv6 socket create failed\n");
 -              return ERR_PTR(rc);
 -      }
 +      memset(&udp_conf, 0, sizeof(udp_conf));
  
 -      /* Put in proper namespace */
 -      sk = sock->sk;
 -      sk_change_net(sk, net);
 -
 -      kernel_setsockopt(sock, SOL_IPV6, IPV6_V6ONLY,
 -                        (char *)&val, sizeof(val));
 -      rc = kernel_bind(sock, (struct sockaddr *)&vxlan_addr,
 -                       sizeof(struct sockaddr_in6));
 -      if (rc < 0) {
 -              pr_debug("bind for UDPv6 socket %pI6:%u (%d)\n",
 -                       &vxlan_addr.sin6_addr, ntohs(vxlan_addr.sin6_port), rc);
 -              sk_release_kernel(sk);
 -              return ERR_PTR(rc);
 +      if (ipv6) {
 +              udp_conf.family = AF_INET6;
 +              udp_conf.use_udp6_tx_checksums =
 +                  !!(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);
 +              udp_conf.use_udp6_rx_checksums =
 +                  !!(flags & VXLAN_F_UDP_ZERO_CSUM6_RX);
 +      } else {
 +              udp_conf.family = AF_INET;
 +              udp_conf.local_ip.s_addr = INADDR_ANY;
 +              udp_conf.use_udp_checksums =
 +                  !!(flags & VXLAN_F_UDP_CSUM);
        }
 -      /* At this point, IPv6 module should have been loaded in
 -       * sock_create_kern().
 -       */
 -      BUG_ON(!ipv6_stub);
 -
 -      /* Disable multicast loopback */
 -      inet_sk(sk)->mc_loop = 0;
 -
 -      if (flags & VXLAN_F_UDP_ZERO_CSUM6_TX)
 -              udp_set_no_check6_tx(sk, true);
 -
 -      if (flags & VXLAN_F_UDP_ZERO_CSUM6_RX)
 -              udp_set_no_check6_rx(sk, true);
 -
 -      return sock;
 -}
 -
 -#else
 -
 -static struct socket *create_v6_sock(struct net *net, __be16 port, u32 flags)
 -{
 -              return ERR_PTR(-EPFNOSUPPORT);
 -}
 -#endif
 -
 -static struct socket *create_v4_sock(struct net *net, __be16 port, u32 flags)
 -{
 -      struct sock *sk;
 -      struct socket *sock;
 -      struct sockaddr_in vxlan_addr = {
 -              .sin_family = AF_INET,
 -              .sin_addr.s_addr = htonl(INADDR_ANY),
 -              .sin_port = port,
 -      };
 -      int rc;
  
 -      /* Create UDP socket for encapsulation receive. */
 -      rc = sock_create_kern(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
 -      if (rc < 0) {
 -              pr_debug("UDP socket create failed\n");
 -              return ERR_PTR(rc);
 -      }
 +      udp_conf.local_udp_port = port;
  
 -      /* Put in proper namespace */
 -      sk = sock->sk;
 -      sk_change_net(sk, net);
 -
 -      rc = kernel_bind(sock, (struct sockaddr *) &vxlan_addr,
 -                       sizeof(vxlan_addr));
 -      if (rc < 0) {
 -              pr_debug("bind for UDP socket %pI4:%u (%d)\n",
 -                       &vxlan_addr.sin_addr, ntohs(vxlan_addr.sin_port), rc);
 -              sk_release_kernel(sk);
 -              return ERR_PTR(rc);
 -      }
 +      /* Open UDP socket */
 +      err = udp_sock_create(net, &udp_conf, &sock);
 +      if (err < 0)
 +              return ERR_PTR(err);
  
        /* Disable multicast loopback */
 -      inet_sk(sk)->mc_loop = 0;
 -
 -      if (!(flags & VXLAN_F_UDP_CSUM))
 -              sock->sk->sk_no_check_tx = 1;
 +      inet_sk(sock->sk)->mc_loop = 0;
  
        return sock;
  }
@@@ -2396,7 -2481,10 +2396,7 @@@ static struct vxlan_sock *vxlan_socket_
  
        INIT_WORK(&vs->del_work, vxlan_del_work);
  
 -      if (ipv6)
 -              sock = create_v6_sock(net, port, flags);
 -      else
 -              sock = create_v4_sock(net, port, flags);
 +      sock = vxlan_create_sock(net, ipv6, port, flags);
        if (IS_ERR(sock)) {
                kfree(vs);
                return ERR_CAST(sock);
diff --combined include/net/ip.h
index 09b32da1b929502a1db86aa8866e02893fdaea42,7596eb22e1ce3c8585eeca8fc30cd2bcae502e26..db4a771b9ef3a6893bb2ae5d5f8692bfec5c571d
@@@ -31,7 -31,6 +31,7 @@@
  #include <net/route.h>
  #include <net/snmp.h>
  #include <net/flow.h>
 +#include <net/flow_keys.h>
  
  struct sock;
  
@@@ -216,12 -215,6 +216,12 @@@ static inline int inet_is_local_reserve
                return 0;
        return test_bit(port, net->ipv4.sysctl_local_reserved_ports);
  }
 +
 +static inline bool sysctl_dev_name_is_allowed(const char *name)
 +{
 +      return strcmp(name, "default") != 0  && strcmp(name, "all") != 0;
 +}
 +
  #else
  static inline int inet_is_local_reserved_port(struct net *net, int port)
  {
@@@ -316,16 -309,7 +316,7 @@@ static inline unsigned int ip_skb_dst_m
        }
  }
  
- #define IP_IDENTS_SZ 2048u
- extern atomic_t *ip_idents;
- static inline u32 ip_idents_reserve(u32 hash, int segs)
- {
-       atomic_t *id_ptr = ip_idents + hash % IP_IDENTS_SZ;
-       return atomic_add_return(segs, id_ptr) - segs;
- }
+ u32 ip_idents_reserve(u32 hash, int segs);
  void __ip_select_ident(struct iphdr *iph, int segs);
  
  static inline void ip_select_ident_segs(struct sk_buff *skb, struct sock *sk, int segs)
@@@ -360,19 -344,6 +351,19 @@@ static inline __wsum inet_compute_pseud
                                  skb->len, proto, 0);
  }
  
 +static inline void inet_set_txhash(struct sock *sk)
 +{
 +      struct inet_sock *inet = inet_sk(sk);
 +      struct flow_keys keys;
 +
 +      keys.src = inet->inet_saddr;
 +      keys.dst = inet->inet_daddr;
 +      keys.port16[0] = inet->inet_sport;
 +      keys.port16[1] = inet->inet_dport;
 +
 +      sk->sk_txhash = flow_hash_from_keys(&keys);
 +}
 +
  /*
   *    Map a multicast IP onto multicast MAC for type ethernet.
   */
@@@ -501,6 -472,7 +492,6 @@@ static inline struct sk_buff *ip_check_
  }
  #endif
  int ip_frag_mem(struct net *net);
 -int ip_frag_nqueues(struct net *net);
  
  /*
   *    Functions provided by ip_forward.c
diff --combined net/ipv6/ip6_output.c
index 2e339d241b6997d2e11ae7159b218e86d55885d8,45702b8cd141d2c850741184c2efc53d3a510c73..f5dafe609f8b7a7b8cfa1d105079fc45f2d9b707
@@@ -205,8 -205,7 +205,8 @@@ int ip6_xmit(struct sock *sk, struct sk
        if (hlimit < 0)
                hlimit = ip6_dst_hoplimit(dst);
  
 -      ip6_flow_hdr(hdr, tclass, fl6->flowlabel);
 +      ip6_flow_hdr(hdr, tclass, ip6_make_flowlabel(net, skb, fl6->flowlabel,
 +                                                   np->autoflowlabel));
  
        hdr->payload_len = htons(seg_len);
        hdr->nexthdr = proto;
@@@ -546,6 -545,8 +546,8 @@@ static void ipv6_select_ident(struct fr
        net_get_random_once(&ip6_idents_hashrnd, sizeof(ip6_idents_hashrnd));
  
        hash = __ipv6_addr_jhash(&rt->rt6i_dst.addr, ip6_idents_hashrnd);
+       hash = __ipv6_addr_jhash(&rt->rt6i_src.addr, hash);
        id = ip_idents_reserve(hash, 1);
        fhdr->identification = htonl(id);
  }
@@@ -801,8 -802,8 +803,8 @@@ slow_path
                /*
                 *      Copy a block of the IP datagram.
                 */
 -              if (skb_copy_bits(skb, ptr, skb_transport_header(frag), len))
 -                      BUG();
 +              BUG_ON(skb_copy_bits(skb, ptr, skb_transport_header(frag),
 +                                   len));
                left -= len;
  
                fh->frag_off = htons(offset);
@@@ -1270,7 -1271,8 +1272,7 @@@ emsgsize
                }
        }
  
 -      /* For UDP, check if TX timestamp is enabled */
 -      if (sk->sk_type == SOCK_DGRAM)
 +      if (sk->sk_type == SOCK_DGRAM || sk->sk_type == SOCK_RAW)
                sock_tx_timestamp(sk, &tx_flags);
  
        /*
@@@ -1379,6 -1381,12 +1381,6 @@@ alloc_new_skb
                                                           sk->sk_allocation);
                                if (unlikely(skb == NULL))
                                        err = -ENOBUFS;
 -                              else {
 -                                      /* Only the initial fragment
 -                                       * is time stamped.
 -                                       */
 -                                      tx_flags = 0;
 -                              }
                        }
                        if (skb == NULL)
                                goto error;
                        skb_reserve(skb, hh_len + sizeof(struct frag_hdr) +
                                    dst_exthdrlen);
  
 -                      if (sk->sk_type == SOCK_DGRAM)
 -                              skb_shinfo(skb)->tx_flags = tx_flags;
 +                      /* Only the initial fragment is time stamped */
 +                      skb_shinfo(skb)->tx_flags = tx_flags;
 +                      tx_flags = 0;
  
                        /*
                         *      Find where to start putting bytes
@@@ -1564,9 -1571,7 +1566,9 @@@ int ip6_push_pending_frames(struct soc
        skb_reset_network_header(skb);
        hdr = ipv6_hdr(skb);
  
 -      ip6_flow_hdr(hdr, np->cork.tclass, fl6->flowlabel);
 +      ip6_flow_hdr(hdr, np->cork.tclass,
 +                   ip6_make_flowlabel(net, skb, fl6->flowlabel,
 +                                      np->autoflowlabel));
        hdr->hop_limit = np->cork.hop_limit;
        hdr->nexthdr = proto;
        hdr->saddr = fl6->saddr;