LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH] [resend] net: get rid of SET_ETHTOOL_OPS
From: Anish Khurana @ 2014-05-11  7:43 UTC (permalink / raw)
  To: netdev@vger.kernel.org, David S. Miller, linux-rdma, linux-acenic,
	nios2-dev, linuxppc-dev, e1000-devel, devel, linux-usb,
	virtualization, linux-wireless, xen-devel, linux-s390, devel,
	b.a.t.m.a.n, bridge, dev, trivial, linux-kernel@vger.kernel.org
In-Reply-To: <20140511001231.GC7875@kaos.lebenslange-mailadresse.de>

SET_ETHTOOL_OPS is equivalent to :
#define SET_ETHTOOL_OPS(netdev,ops) \
    ( (netdev)->ethtool_ops = (ops) )

how it makes difference  removing this code and replacing with the
code mentioned ?

On Sun, May 11, 2014 at 5:42 AM, Wilfried Klaebe
<w-lkml@lebenslange-mailadresse.de> wrote:
> net: get rid of SET_ETHTOOL_OPS
>
> Dave Miller mentioned he'd like to see SET_ETHTOOL_OPS gone.
> This does that.
>
> Mostly done via coccinelle script:
> @@
> struct ethtool_ops *ops;
> struct net_device *dev;
> @@
> -       SET_ETHTOOL_OPS(dev, ops);
> +       dev->ethtool_ops = ops;
>
> Compile tested only, but I'd seriously wonder if this broke anything.
>
> Suggested-by: Dave Miller <davem@davemloft.net>
> Signed-off-by: Wilfried Klaebe <w-lkml@lebenslange-mailadresse.de>
>
> ---
>
> Applies against v3.15-rc4 and v3.15-rc5 likewise.
>
> resend: trimmed CC list. Thanks to Dave for notifying me.
>
> diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c b/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
> index c4b3940..078cadd 100644
> --- a/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
> +++ b/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
> @@ -105,5 +105,5 @@ static const struct ethtool_ops ipoib_ethtool_ops = {
>
>  void ipoib_set_ethtool_ops(struct net_device *dev)
>  {
> -       SET_ETHTOOL_OPS(dev, &ipoib_ethtool_ops);
> +       dev->ethtool_ops = &ipoib_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/3com/3c509.c b/drivers/net/ethernet/3com/3c509.c
> index 35df0b9..a968654 100644
> --- a/drivers/net/ethernet/3com/3c509.c
> +++ b/drivers/net/ethernet/3com/3c509.c
> @@ -534,7 +534,7 @@ static int el3_common_init(struct net_device *dev)
>         /* The EL3-specific entries in the device structure. */
>         dev->netdev_ops = &netdev_ops;
>         dev->watchdog_timeo = TX_TIMEOUT;
> -       SET_ETHTOOL_OPS(dev, &ethtool_ops);
> +       dev->ethtool_ops = &ethtool_ops;
>
>         err = register_netdev(dev);
>         if (err) {
> diff --git a/drivers/net/ethernet/3com/3c589_cs.c b/drivers/net/ethernet/3com/3c589_cs.c
> index 063557e..f18647c 100644
> --- a/drivers/net/ethernet/3com/3c589_cs.c
> +++ b/drivers/net/ethernet/3com/3c589_cs.c
> @@ -218,7 +218,7 @@ static int tc589_probe(struct pcmcia_device *link)
>         dev->netdev_ops = &el3_netdev_ops;
>         dev->watchdog_timeo = TX_TIMEOUT;
>
> -       SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
> +       dev->ethtool_ops = &netdev_ethtool_ops;
>
>         return tc589_config(link);
>  }
> diff --git a/drivers/net/ethernet/3com/typhoon.c b/drivers/net/ethernet/3com/typhoon.c
> index 465cc71..e13b046 100644
> --- a/drivers/net/ethernet/3com/typhoon.c
> +++ b/drivers/net/ethernet/3com/typhoon.c
> @@ -2435,7 +2435,7 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
>         netif_napi_add(dev, &tp->napi, typhoon_poll, 16);
>         dev->watchdog_timeo     = TX_TIMEOUT;
>
> -       SET_ETHTOOL_OPS(dev, &typhoon_ethtool_ops);
> +       dev->ethtool_ops = &typhoon_ethtool_ops;
>
>         /* We can handle scatter gather, up to 16 entries, and
>          * we can do IP checksumming (only version 4, doh...)
> diff --git a/drivers/net/ethernet/adaptec/starfire.c b/drivers/net/ethernet/adaptec/starfire.c
> index 171d73c..40dbbf7 100644
> --- a/drivers/net/ethernet/adaptec/starfire.c
> +++ b/drivers/net/ethernet/adaptec/starfire.c
> @@ -784,7 +784,7 @@ static int starfire_init_one(struct pci_dev *pdev,
>
>         dev->netdev_ops = &netdev_ops;
>         dev->watchdog_timeo = TX_TIMEOUT;
> -       SET_ETHTOOL_OPS(dev, &ethtool_ops);
> +       dev->ethtool_ops = &ethtool_ops;
>
>         netif_napi_add(dev, &np->napi, netdev_poll, max_interrupt_work);
>
> diff --git a/drivers/net/ethernet/alteon/acenic.c b/drivers/net/ethernet/alteon/acenic.c
> index 1517e9df..9a6991b 100644
> --- a/drivers/net/ethernet/alteon/acenic.c
> +++ b/drivers/net/ethernet/alteon/acenic.c
> @@ -476,7 +476,7 @@ static int acenic_probe_one(struct pci_dev *pdev,
>         dev->watchdog_timeo = 5*HZ;
>
>         dev->netdev_ops = &ace_netdev_ops;
> -       SET_ETHTOOL_OPS(dev, &ace_ethtool_ops);
> +       dev->ethtool_ops = &ace_ethtool_ops;
>
>         /* we only display this string ONCE */
>         if (!boards_found)
> diff --git a/drivers/net/ethernet/altera/altera_tse_ethtool.c b/drivers/net/ethernet/altera/altera_tse_ethtool.c
> index 319ca74..8ac4bd2 100644
> --- a/drivers/net/ethernet/altera/altera_tse_ethtool.c
> +++ b/drivers/net/ethernet/altera/altera_tse_ethtool.c
> @@ -231,5 +231,5 @@ static const struct ethtool_ops tse_ethtool_ops = {
>
>  void altera_tse_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &tse_ethtool_ops);
> +       netdev->ethtool_ops = &tse_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/amd/amd8111e.c b/drivers/net/ethernet/amd/amd8111e.c
> index 26efaaa..068dc7c 100644
> --- a/drivers/net/ethernet/amd/amd8111e.c
> +++ b/drivers/net/ethernet/amd/amd8111e.c
> @@ -1900,7 +1900,7 @@ static int amd8111e_probe_one(struct pci_dev *pdev,
>
>         /* Initialize driver entry points */
>         dev->netdev_ops = &amd8111e_netdev_ops;
> -       SET_ETHTOOL_OPS(dev, &ops);
> +       dev->ethtool_ops = &ops;
>         dev->irq =pdev->irq;
>         dev->watchdog_timeo = AMD8111E_TX_TIMEOUT;
>         netif_napi_add(dev, &lp->napi, amd8111e_rx_poll, 32);
> diff --git a/drivers/net/ethernet/amd/au1000_eth.c b/drivers/net/ethernet/amd/au1000_eth.c
> index a2bd91e..a78e4c1 100644
> --- a/drivers/net/ethernet/amd/au1000_eth.c
> +++ b/drivers/net/ethernet/amd/au1000_eth.c
> @@ -1229,7 +1229,7 @@ static int au1000_probe(struct platform_device *pdev)
>         dev->base_addr = base->start;
>         dev->irq = irq;
>         dev->netdev_ops = &au1000_netdev_ops;
> -       SET_ETHTOOL_OPS(dev, &au1000_ethtool_ops);
> +       dev->ethtool_ops = &au1000_ethtool_ops;
>         dev->watchdog_timeo = ETH_TX_TIMEOUT;
>
>         /*
> diff --git a/drivers/net/ethernet/amd/nmclan_cs.c b/drivers/net/ethernet/amd/nmclan_cs.c
> index 08569fe..abf3b15 100644
> --- a/drivers/net/ethernet/amd/nmclan_cs.c
> +++ b/drivers/net/ethernet/amd/nmclan_cs.c
> @@ -457,7 +457,7 @@ static int nmclan_probe(struct pcmcia_device *link)
>      lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
>
>      dev->netdev_ops = &mace_netdev_ops;
> -    SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
> +    dev->ethtool_ops = &netdev_ethtool_ops;
>      dev->watchdog_timeo = TX_TIMEOUT;
>
>      return nmclan_config(link);
> diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
> index 17bb9ce..49faa97 100644
> --- a/drivers/net/ethernet/atheros/alx/main.c
> +++ b/drivers/net/ethernet/atheros/alx/main.c
> @@ -1302,7 +1302,7 @@ static int alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>         }
>
>         netdev->netdev_ops = &alx_netdev_ops;
> -       SET_ETHTOOL_OPS(netdev, &alx_ethtool_ops);
> +       netdev->ethtool_ops = &alx_ethtool_ops;
>         netdev->irq = pdev->irq;
>         netdev->watchdog_timeo = ALX_WATCHDOG_TIME;
>
> diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_ethtool.c b/drivers/net/ethernet/atheros/atl1c/atl1c_ethtool.c
> index 859ea84..ecacaae 100644
> --- a/drivers/net/ethernet/atheros/atl1c/atl1c_ethtool.c
> +++ b/drivers/net/ethernet/atheros/atl1c/atl1c_ethtool.c
> @@ -305,5 +305,5 @@ static const struct ethtool_ops atl1c_ethtool_ops = {
>
>  void atl1c_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &atl1c_ethtool_ops);
> +       netdev->ethtool_ops = &atl1c_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_ethtool.c b/drivers/net/ethernet/atheros/atl1e/atl1e_ethtool.c
> index 82b2386..206e9b7 100644
> --- a/drivers/net/ethernet/atheros/atl1e/atl1e_ethtool.c
> +++ b/drivers/net/ethernet/atheros/atl1e/atl1e_ethtool.c
> @@ -388,5 +388,5 @@ static const struct ethtool_ops atl1e_ethtool_ops = {
>
>  void atl1e_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &atl1e_ethtool_ops);
> +       netdev->ethtool_ops = &atl1e_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/atheros/atlx/atl2.c b/drivers/net/ethernet/atheros/atlx/atl2.c
> index 78befb5..2587fed 100644
> --- a/drivers/net/ethernet/atheros/atlx/atl2.c
> +++ b/drivers/net/ethernet/atheros/atlx/atl2.c
> @@ -1396,7 +1396,7 @@ static int atl2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>         atl2_setup_pcicmd(pdev);
>
>         netdev->netdev_ops = &atl2_netdev_ops;
> -       SET_ETHTOOL_OPS(netdev, &atl2_ethtool_ops);
> +       netdev->ethtool_ops = &atl2_ethtool_ops;
>         netdev->watchdog_timeo = 5 * HZ;
>         strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
>
> diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c
> index 05ba625..ca5a20a 100644
> --- a/drivers/net/ethernet/broadcom/b44.c
> +++ b/drivers/net/ethernet/broadcom/b44.c
> @@ -2380,7 +2380,7 @@ static int b44_init_one(struct ssb_device *sdev,
>         netif_napi_add(dev, &bp->napi, b44_poll, 64);
>         dev->watchdog_timeo = B44_TX_TIMEOUT;
>         dev->irq = sdev->irq;
> -       SET_ETHTOOL_OPS(dev, &b44_ethtool_ops);
> +       dev->ethtool_ops = &b44_ethtool_ops;
>
>         err = ssb_bus_powerup(sdev->bus, 0);
>         if (err) {
> diff --git a/drivers/net/ethernet/broadcom/bcm63xx_enet.c b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
> index a7d11f5..1e7bba9c 100644
> --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
> +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
> @@ -1898,7 +1898,7 @@ static int bcm_enet_probe(struct platform_device *pdev)
>         dev->netdev_ops = &bcm_enet_ops;
>         netif_napi_add(dev, &priv->napi, bcm_enet_poll, 16);
>
> -       SET_ETHTOOL_OPS(dev, &bcm_enet_ethtool_ops);
> +       dev->ethtool_ops = &bcm_enet_ethtool_ops;
>         SET_NETDEV_DEV(dev, &pdev->dev);
>
>         ret = register_netdev(dev);
> @@ -2784,7 +2784,7 @@ static int bcm_enetsw_probe(struct platform_device *pdev)
>         /* register netdevice */
>         dev->netdev_ops = &bcm_enetsw_ops;
>         netif_napi_add(dev, &priv->napi, bcm_enet_poll, 16);
> -       SET_ETHTOOL_OPS(dev, &bcm_enetsw_ethtool_ops);
> +       dev->ethtool_ops = &bcm_enetsw_ethtool_ops;
>         SET_NETDEV_DEV(dev, &pdev->dev);
>
>         spin_lock_init(&priv->enetsw_mdio_lock);
> diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
> index 0297a79..05c6af6 100644
> --- a/drivers/net/ethernet/broadcom/bgmac.c
> +++ b/drivers/net/ethernet/broadcom/bgmac.c
> @@ -1436,7 +1436,7 @@ static int bgmac_probe(struct bcma_device *core)
>                 return -ENOMEM;
>         net_dev->netdev_ops = &bgmac_netdev_ops;
>         net_dev->irq = core->irq;
> -       SET_ETHTOOL_OPS(net_dev, &bgmac_ethtool_ops);
> +       net_dev->ethtool_ops = &bgmac_ethtool_ops;
>         bgmac = netdev_priv(net_dev);
>         bgmac->net_dev = net_dev;
>         bgmac->core = core;
> diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
> index b6de05e..0322409 100644
> --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
> +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
> @@ -3506,8 +3506,6 @@ static const struct ethtool_ops bnx2x_vf_ethtool_ops = {
>
>  void bnx2x_set_ethtool_ops(struct bnx2x *bp, struct net_device *netdev)
>  {
> -       if (IS_PF(bp))
> -               SET_ETHTOOL_OPS(netdev, &bnx2x_ethtool_ops);
> -       else /* vf */
> -               SET_ETHTOOL_OPS(netdev, &bnx2x_vf_ethtool_ops);
> +       netdev->ethtool_ops = (IS_PF(bp)) ?
> +               &bnx2x_ethtool_ops : &bnx2x_vf_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
> index 0966bd0..5ba1cfb 100644
> --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
> +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
> @@ -2481,7 +2481,7 @@ static int bcmgenet_probe(struct platform_device *pdev)
>         dev_set_drvdata(&pdev->dev, dev);
>         ether_addr_copy(dev->dev_addr, macaddr);
>         dev->watchdog_timeo = 2 * HZ;
> -       SET_ETHTOOL_OPS(dev, &bcmgenet_ethtool_ops);
> +       dev->ethtool_ops = &bcmgenet_ethtool_ops;
>         dev->netdev_ops = &bcmgenet_netdev_ops;
>         netif_napi_add(dev, &priv->napi, bcmgenet_poll, 64);
>
> diff --git a/drivers/net/ethernet/brocade/bna/bnad_ethtool.c b/drivers/net/ethernet/brocade/bna/bnad_ethtool.c
> index f9e1508..adca62b 100644
> --- a/drivers/net/ethernet/brocade/bna/bnad_ethtool.c
> +++ b/drivers/net/ethernet/brocade/bna/bnad_ethtool.c
> @@ -1137,5 +1137,5 @@ static const struct ethtool_ops bnad_ethtool_ops = {
>  void
>  bnad_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &bnad_ethtool_ops);
> +       netdev->ethtool_ops = &bnad_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c
> index 521dfea..25d6b2a 100644
> --- a/drivers/net/ethernet/calxeda/xgmac.c
> +++ b/drivers/net/ethernet/calxeda/xgmac.c
> @@ -1737,7 +1737,7 @@ static int xgmac_probe(struct platform_device *pdev)
>         platform_set_drvdata(pdev, ndev);
>         ether_setup(ndev);
>         ndev->netdev_ops = &xgmac_netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &xgmac_ethtool_ops);
> +       ndev->ethtool_ops = &xgmac_ethtool_ops;
>         spin_lock_init(&priv->stats_lock);
>         INIT_WORK(&priv->tx_timeout_work, xgmac_tx_timeout_work);
>
> diff --git a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c
> index 0fe7ff7..c1b2c1d 100644
> --- a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c
> +++ b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c
> @@ -1100,7 +1100,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
>
>                 netif_napi_add(netdev, &adapter->napi, t1_poll, 64);
>
> -               SET_ETHTOOL_OPS(netdev, &t1_ethtool_ops);
> +               netdev->ethtool_ops = &t1_ethtool_ops;
>         }
>
>         if (t1_init_sw_modules(adapter, bi) < 0) {
> diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
> index 07bbb71..3ed5079 100644
> --- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
> +++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
> @@ -3291,7 +3291,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
>                         netdev->features |= NETIF_F_HIGHDMA;
>
>                 netdev->netdev_ops = &cxgb_netdev_ops;
> -               SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops);
> +               netdev->ethtool_ops = &cxgb_ethtool_ops;
>         }
>
>         pci_set_drvdata(pdev, adapter);
> diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
> index 6fe5891..7c61f89 100644
> --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
> +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
> @@ -6074,7 +6074,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
>                 netdev->priv_flags |= IFF_UNICAST_FLT;
>
>                 netdev->netdev_ops = &cxgb4_netdev_ops;
> -               SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops);
> +               netdev->ethtool_ops = &cxgb_ethtool_ops;
>         }
>
>         pci_set_drvdata(pdev, adapter);
> diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
> index 5285928..ff1cdd1 100644
> --- a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
> +++ b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
> @@ -2664,7 +2664,7 @@ static int cxgb4vf_pci_probe(struct pci_dev *pdev,
>                 netdev->priv_flags |= IFF_UNICAST_FLT;
>
>                 netdev->netdev_ops = &cxgb4vf_netdev_ops;
> -               SET_ETHTOOL_OPS(netdev, &cxgb4vf_ethtool_ops);
> +               netdev->ethtool_ops = &cxgb4vf_ethtool_ops;
>
>                 /*
>                  * Initialize the hardware/software state for the port.
> diff --git a/drivers/net/ethernet/cisco/enic/enic_ethtool.c b/drivers/net/ethernet/cisco/enic/enic_ethtool.c
> index 47e3562..58a8c67 100644
> --- a/drivers/net/ethernet/cisco/enic/enic_ethtool.c
> +++ b/drivers/net/ethernet/cisco/enic/enic_ethtool.c
> @@ -253,5 +253,5 @@ static const struct ethtool_ops enic_ethtool_ops = {
>
>  void enic_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &enic_ethtool_ops);
> +       netdev->ethtool_ops = &enic_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/dec/tulip/tulip_core.c b/drivers/net/ethernet/dec/tulip/tulip_core.c
> index 1642de7..8616608 100644
> --- a/drivers/net/ethernet/dec/tulip/tulip_core.c
> +++ b/drivers/net/ethernet/dec/tulip/tulip_core.c
> @@ -1703,7 +1703,7 @@ static int tulip_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
>  #ifdef CONFIG_TULIP_NAPI
>         netif_napi_add(dev, &tp->napi, tulip_poll, 16);
>  #endif
> -       SET_ETHTOOL_OPS(dev, &ops);
> +       dev->ethtool_ops = &ops;
>
>         if (register_netdev(dev))
>                 goto err_out_free_ring;
> diff --git a/drivers/net/ethernet/dlink/dl2k.c b/drivers/net/ethernet/dlink/dl2k.c
> index 4fb756d..2324f2d 100644
> --- a/drivers/net/ethernet/dlink/dl2k.c
> +++ b/drivers/net/ethernet/dlink/dl2k.c
> @@ -227,7 +227,7 @@ rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent)
>         }
>         dev->netdev_ops = &netdev_ops;
>         dev->watchdog_timeo = TX_TIMEOUT;
> -       SET_ETHTOOL_OPS(dev, &ethtool_ops);
> +       dev->ethtool_ops = &ethtool_ops;
>  #if 0
>         dev->features = NETIF_F_IP_CSUM;
>  #endif
> diff --git a/drivers/net/ethernet/dlink/sundance.c b/drivers/net/ethernet/dlink/sundance.c
> index d9e5ca0..433c1e1 100644
> --- a/drivers/net/ethernet/dlink/sundance.c
> +++ b/drivers/net/ethernet/dlink/sundance.c
> @@ -577,7 +577,7 @@ static int sundance_probe1(struct pci_dev *pdev,
>
>         /* The chip-specific entries in the device structure. */
>         dev->netdev_ops = &netdev_ops;
> -       SET_ETHTOOL_OPS(dev, &ethtool_ops);
> +       dev->ethtool_ops = &ethtool_ops;
>         dev->watchdog_timeo = TX_TIMEOUT;
>
>         pci_set_drvdata(pdev, dev);
> diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
> index a186454..9a9e7c7 100644
> --- a/drivers/net/ethernet/emulex/benet/be_main.c
> +++ b/drivers/net/ethernet/emulex/benet/be_main.c
> @@ -4301,7 +4301,7 @@ static void be_netdev_init(struct net_device *netdev)
>
>         netdev->netdev_ops = &be_netdev_ops;
>
> -       SET_ETHTOOL_OPS(netdev, &be_ethtool_ops);
> +       netdev->ethtool_ops = &be_ethtool_ops;
>  }
>
>  static void be_unmap_pci_bars(struct be_adapter *adapter)
> diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
> index 68069ea..c77fa4a 100644
> --- a/drivers/net/ethernet/faraday/ftgmac100.c
> +++ b/drivers/net/ethernet/faraday/ftgmac100.c
> @@ -1210,7 +1210,7 @@ static int ftgmac100_probe(struct platform_device *pdev)
>
>         SET_NETDEV_DEV(netdev, &pdev->dev);
>
> -       SET_ETHTOOL_OPS(netdev, &ftgmac100_ethtool_ops);
> +       netdev->ethtool_ops = &ftgmac100_ethtool_ops;
>         netdev->netdev_ops = &ftgmac100_netdev_ops;
>         netdev->features = NETIF_F_IP_CSUM | NETIF_F_GRO;
>
> diff --git a/drivers/net/ethernet/faraday/ftmac100.c b/drivers/net/ethernet/faraday/ftmac100.c
> index 8be5b40..4ff1adc 100644
> --- a/drivers/net/ethernet/faraday/ftmac100.c
> +++ b/drivers/net/ethernet/faraday/ftmac100.c
> @@ -1085,7 +1085,7 @@ static int ftmac100_probe(struct platform_device *pdev)
>         }
>
>         SET_NETDEV_DEV(netdev, &pdev->dev);
> -       SET_ETHTOOL_OPS(netdev, &ftmac100_ethtool_ops);
> +       netdev->ethtool_ops = &ftmac100_ethtool_ops;
>         netdev->netdev_ops = &ftmac100_netdev_ops;
>
>         platform_set_drvdata(pdev, netdev);
> diff --git a/drivers/net/ethernet/freescale/ucc_geth_ethtool.c b/drivers/net/ethernet/freescale/ucc_geth_ethtool.c
> index 413329e..cc83350 100644
> --- a/drivers/net/ethernet/freescale/ucc_geth_ethtool.c
> +++ b/drivers/net/ethernet/freescale/ucc_geth_ethtool.c
> @@ -417,5 +417,5 @@ static const struct ethtool_ops uec_ethtool_ops = {
>
>  void uec_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &uec_ethtool_ops);
> +       netdev->ethtool_ops = &uec_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/fujitsu/fmvj18x_cs.c b/drivers/net/ethernet/fujitsu/fmvj18x_cs.c
> index 7becab1..cfe7a74 100644
> --- a/drivers/net/ethernet/fujitsu/fmvj18x_cs.c
> +++ b/drivers/net/ethernet/fujitsu/fmvj18x_cs.c
> @@ -256,7 +256,7 @@ static int fmvj18x_probe(struct pcmcia_device *link)
>      dev->netdev_ops = &fjn_netdev_ops;
>      dev->watchdog_timeo = TX_TIMEOUT;
>
> -    SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
> +    dev->ethtool_ops = &netdev_ethtool_ops;
>
>      return fmvj18x_config(link);
>  } /* fmvj18x_attach */
> diff --git a/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c b/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
> index 95837b9..6055e3e 100644
> --- a/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
> +++ b/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
> @@ -278,5 +278,5 @@ static const struct ethtool_ops ehea_ethtool_ops = {
>
>  void ehea_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &ehea_ethtool_ops);
> +       netdev->ethtool_ops = &ehea_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/ibm/emac/core.c b/drivers/net/ethernet/ibm/emac/core.c
> index ae342fd..87bd953 100644
> --- a/drivers/net/ethernet/ibm/emac/core.c
> +++ b/drivers/net/ethernet/ibm/emac/core.c
> @@ -2879,7 +2879,7 @@ static int emac_probe(struct platform_device *ofdev)
>                 dev->commac.ops = &emac_commac_sg_ops;
>         } else
>                 ndev->netdev_ops = &emac_netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &emac_ethtool_ops);
> +       ndev->ethtool_ops = &emac_ethtool_ops;
>
>         netif_carrier_off(ndev);
>
> diff --git a/drivers/net/ethernet/icplus/ipg.c b/drivers/net/ethernet/icplus/ipg.c
> index 25045ae..5727779 100644
> --- a/drivers/net/ethernet/icplus/ipg.c
> +++ b/drivers/net/ethernet/icplus/ipg.c
> @@ -2245,7 +2245,7 @@ static int ipg_probe(struct pci_dev *pdev, const struct pci_device_id *id)
>          */
>         dev->netdev_ops = &ipg_netdev_ops;
>         SET_NETDEV_DEV(dev, &pdev->dev);
> -       SET_ETHTOOL_OPS(dev, &ipg_ethtool_ops);
> +       dev->ethtool_ops = &ipg_ethtool_ops;
>
>         rc = pci_request_regions(pdev, DRV_NAME);
>         if (rc)
> diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c
> index b56461c..9d979d7 100644
> --- a/drivers/net/ethernet/intel/e100.c
> +++ b/drivers/net/ethernet/intel/e100.c
> @@ -2854,7 +2854,7 @@ static int e100_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>         netdev->hw_features |= NETIF_F_RXALL;
>
>         netdev->netdev_ops = &e100_netdev_ops;
> -       SET_ETHTOOL_OPS(netdev, &e100_ethtool_ops);
> +       netdev->ethtool_ops = &e100_ethtool_ops;
>         netdev->watchdog_timeo = E100_WATCHDOG_PERIOD;
>         strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
>
> diff --git a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c
> index 73a8aee..341889a 100644
> --- a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c
> +++ b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c
> @@ -1905,5 +1905,5 @@ static const struct ethtool_ops e1000_ethtool_ops = {
>
>  void e1000_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &e1000_ethtool_ops);
> +       netdev->ethtool_ops = &e1000_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c
> index cad250b..d9f8a2d 100644
> --- a/drivers/net/ethernet/intel/e1000e/ethtool.c
> +++ b/drivers/net/ethernet/intel/e1000e/ethtool.c
> @@ -2315,5 +2315,5 @@ static const struct ethtool_ops e1000_ethtool_ops = {
>
>  void e1000e_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &e1000_ethtool_ops);
> +       netdev->ethtool_ops = &e1000_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> index 03d99cb..7673f86 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> @@ -1692,5 +1692,5 @@ static const struct ethtool_ops i40e_ethtool_ops = {
>
>  void i40e_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &i40e_ethtool_ops);
> +       netdev->ethtool_ops = &i40e_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
> index 8b0db1c..4defd51 100644
> --- a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
> +++ b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
> @@ -389,5 +389,5 @@ static struct ethtool_ops i40evf_ethtool_ops = {
>   **/
>  void i40evf_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &i40evf_ethtool_ops);
> +       netdev->ethtool_ops = &i40evf_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
> index e5570ac..30b76e1 100644
> --- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
> +++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
> @@ -3029,5 +3029,5 @@ static const struct ethtool_ops igb_ethtool_ops = {
>
>  void igb_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &igb_ethtool_ops);
> +       netdev->ethtool_ops = &igb_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/intel/igbvf/ethtool.c b/drivers/net/ethernet/intel/igbvf/ethtool.c
> index 90eef07..f58170b 100644
> --- a/drivers/net/ethernet/intel/igbvf/ethtool.c
> +++ b/drivers/net/ethernet/intel/igbvf/ethtool.c
> @@ -476,5 +476,5 @@ static const struct ethtool_ops igbvf_ethtool_ops = {
>
>  void igbvf_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &igbvf_ethtool_ops);
> +       netdev->ethtool_ops = &igbvf_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/intel/ixgb/ixgb_ethtool.c b/drivers/net/ethernet/intel/ixgb/ixgb_ethtool.c
> index dbb7dd2..1da2d98 100644
> --- a/drivers/net/ethernet/intel/ixgb/ixgb_ethtool.c
> +++ b/drivers/net/ethernet/intel/ixgb/ixgb_ethtool.c
> @@ -656,5 +656,5 @@ static const struct ethtool_ops ixgb_ethtool_ops = {
>
>  void ixgb_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &ixgb_ethtool_ops);
> +       netdev->ethtool_ops = &ixgb_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
> index 6c55c14..31d7268 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
> @@ -3099,5 +3099,5 @@ static const struct ethtool_ops ixgbe_ethtool_ops = {
>
>  void ixgbe_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &ixgbe_ethtool_ops);
> +       netdev->ethtool_ops = &ixgbe_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ethtool.c b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
> index 1baecb6..a757f07 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ethtool.c
> +++ b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
> @@ -813,5 +813,5 @@ static const struct ethtool_ops ixgbevf_ethtool_ops = {
>
>  void ixgbevf_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &ixgbevf_ethtool_ops);
> +       netdev->ethtool_ops = &ixgbevf_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c
> index b7b8d74..df1d1b9 100644
> --- a/drivers/net/ethernet/marvell/mv643xx_eth.c
> +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c
> @@ -2889,7 +2889,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
>         if (err)
>                 goto out;
>
> -       SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops);
> +       dev->ethtool_ops = &mv643xx_eth_ethtool_ops;
>
>         init_pscr(mp, pd->speed, pd->duplex);
>
> diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
> index 14786c8..72bc47f 100644
> --- a/drivers/net/ethernet/marvell/mvneta.c
> +++ b/drivers/net/ethernet/marvell/mvneta.c
> @@ -2813,7 +2813,7 @@ static int mvneta_probe(struct platform_device *pdev)
>         dev->watchdog_timeo = 5 * HZ;
>         dev->netdev_ops = &mvneta_netdev_ops;
>
> -       SET_ETHTOOL_OPS(dev, &mvneta_eth_tool_ops);
> +       dev->ethtool_ops = &mvneta_eth_tool_ops;
>
>         pp = netdev_priv(dev);
>
> diff --git a/drivers/net/ethernet/marvell/pxa168_eth.c b/drivers/net/ethernet/marvell/pxa168_eth.c
> index b358c2f..8f5aa7c 100644
> --- a/drivers/net/ethernet/marvell/pxa168_eth.c
> +++ b/drivers/net/ethernet/marvell/pxa168_eth.c
> @@ -1488,7 +1488,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
>         dev->netdev_ops = &pxa168_eth_netdev_ops;
>         dev->watchdog_timeo = 2 * HZ;
>         dev->base_addr = 0;
> -       SET_ETHTOOL_OPS(dev, &pxa168_ethtool_ops);
> +       dev->ethtool_ops = &pxa168_ethtool_ops;
>
>         INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
>
> diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c
> index b811064..6969338 100644
> --- a/drivers/net/ethernet/marvell/sky2.c
> +++ b/drivers/net/ethernet/marvell/sky2.c
> @@ -4760,7 +4760,7 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port,
>
>         SET_NETDEV_DEV(dev, &hw->pdev->dev);
>         dev->irq = hw->pdev->irq;
> -       SET_ETHTOOL_OPS(dev, &sky2_ethtool_ops);
> +       dev->ethtool_ops = &sky2_ethtool_ops;
>         dev->watchdog_timeo = TX_WATCHDOG;
>         dev->netdev_ops = &sky2_netdev_ops[port];
>
> diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
> index 7e4b172..36af5e7 100644
> --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
> +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
> @@ -2539,7 +2539,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
>         netif_set_real_num_tx_queues(dev, priv->tx_ring_num);
>         netif_set_real_num_rx_queues(dev, priv->rx_ring_num);
>
> -       SET_ETHTOOL_OPS(dev, &mlx4_en_ethtool_ops);
> +       dev->ethtool_ops = &mlx4_en_ethtool_ops;
>
>         /*
>          * Set driver features
> diff --git a/drivers/net/ethernet/micrel/ks8695net.c b/drivers/net/ethernet/micrel/ks8695net.c
> index 16435b3..6c7c78ba 100644
> --- a/drivers/net/ethernet/micrel/ks8695net.c
> +++ b/drivers/net/ethernet/micrel/ks8695net.c
> @@ -1504,15 +1504,15 @@ ks8695_probe(struct platform_device *pdev)
>         if (ksp->phyiface_regs && ksp->link_irq == -1) {
>                 ks8695_init_switch(ksp);
>                 ksp->dtype = KS8695_DTYPE_LAN;
> -               SET_ETHTOOL_OPS(ndev, &ks8695_ethtool_ops);
> +               ndev->ethtool_ops = &ks8695_ethtool_ops;
>         } else if (ksp->phyiface_regs && ksp->link_irq != -1) {
>                 ks8695_init_wan_phy(ksp);
>                 ksp->dtype = KS8695_DTYPE_WAN;
> -               SET_ETHTOOL_OPS(ndev, &ks8695_wan_ethtool_ops);
> +               ndev->ethtool_ops = &ks8695_wan_ethtool_ops;
>         } else {
>                 /* No initialisation since HPNA does not have a PHY */
>                 ksp->dtype = KS8695_DTYPE_HPNA;
> -               SET_ETHTOOL_OPS(ndev, &ks8695_ethtool_ops);
> +               ndev->ethtool_ops = &ks8695_ethtool_ops;
>         }
>
>         /* And bring up the net_device with the net core */
> diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
> index e0c92e0..13767eb 100644
> --- a/drivers/net/ethernet/micrel/ks8851.c
> +++ b/drivers/net/ethernet/micrel/ks8851.c
> @@ -1471,7 +1471,7 @@ static int ks8851_probe(struct spi_device *spi)
>
>         skb_queue_head_init(&ks->txq);
>
> -       SET_ETHTOOL_OPS(ndev, &ks8851_ethtool_ops);
> +       ndev->ethtool_ops = &ks8851_ethtool_ops;
>         SET_NETDEV_DEV(ndev, &spi->dev);
>
>         spi_set_drvdata(spi, ks);
> diff --git a/drivers/net/ethernet/micrel/ksz884x.c b/drivers/net/ethernet/micrel/ksz884x.c
> index 14ac0e2..4b9592c1 100644
> --- a/drivers/net/ethernet/micrel/ksz884x.c
> +++ b/drivers/net/ethernet/micrel/ksz884x.c
> @@ -7106,7 +7106,7 @@ static int pcidev_init(struct pci_dev *pdev, const struct pci_device_id *id)
>                 }
>
>                 dev->netdev_ops = &netdev_ops;
> -               SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
> +               dev->ethtool_ops = &netdev_ethtool_ops;
>                 if (register_netdev(dev))
>                         goto pcidev_init_reg_err;
>                 port_set_power_saving(port, true);
> diff --git a/drivers/net/ethernet/microchip/enc28j60.c b/drivers/net/ethernet/microchip/enc28j60.c
> index c7b40aa..b1b5f66 100644
> --- a/drivers/net/ethernet/microchip/enc28j60.c
> +++ b/drivers/net/ethernet/microchip/enc28j60.c
> @@ -1593,7 +1593,7 @@ static int enc28j60_probe(struct spi_device *spi)
>         dev->irq = spi->irq;
>         dev->netdev_ops = &enc28j60_netdev_ops;
>         dev->watchdog_timeo = TX_TIMEOUT;
> -       SET_ETHTOOL_OPS(dev, &enc28j60_ethtool_ops);
> +       dev->ethtool_ops = &enc28j60_ethtool_ops;
>
>         enc28j60_lowpower(priv, true);
>
> diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
> index 130f6b2..f3d5d79 100644
> --- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
> +++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
> @@ -4112,7 +4112,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>         setup_timer(&mgp->watchdog_timer, myri10ge_watchdog_timer,
>                     (unsigned long)mgp);
>
> -       SET_ETHTOOL_OPS(netdev, &myri10ge_ethtool_ops);
> +       netdev->ethtool_ops = &myri10ge_ethtool_ops;
>         INIT_WORK(&mgp->watchdog_work, myri10ge_watchdog);
>         status = register_netdev(netdev);
>         if (status != 0) {
> diff --git a/drivers/net/ethernet/natsemi/natsemi.c b/drivers/net/ethernet/natsemi/natsemi.c
> index 64ec2a4..291fba8 100644
> --- a/drivers/net/ethernet/natsemi/natsemi.c
> +++ b/drivers/net/ethernet/natsemi/natsemi.c
> @@ -927,7 +927,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
>         dev->netdev_ops = &natsemi_netdev_ops;
>         dev->watchdog_timeo = TX_TIMEOUT;
>
> -       SET_ETHTOOL_OPS(dev, &ethtool_ops);
> +       dev->ethtool_ops = &ethtool_ops;
>
>         if (mtu)
>                 dev->mtu = mtu;
> diff --git a/drivers/net/ethernet/natsemi/ns83820.c b/drivers/net/ethernet/natsemi/ns83820.c
> index dbccf1d..19bb824 100644
> --- a/drivers/net/ethernet/natsemi/ns83820.c
> +++ b/drivers/net/ethernet/natsemi/ns83820.c
> @@ -2030,7 +2030,7 @@ static int ns83820_init_one(struct pci_dev *pci_dev,
>                 pci_dev->subsystem_vendor, pci_dev->subsystem_device);
>
>         ndev->netdev_ops = &netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &ops);
> +       ndev->ethtool_ops = &ops;
>         ndev->watchdog_timeo = 5 * HZ;
>         pci_set_drvdata(pci_dev, ndev);
>
> diff --git a/drivers/net/ethernet/neterion/s2io.c b/drivers/net/ethernet/neterion/s2io.c
> index a2844ff..190538d 100644
> --- a/drivers/net/ethernet/neterion/s2io.c
> +++ b/drivers/net/ethernet/neterion/s2io.c
> @@ -7919,7 +7919,7 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
>
>         /*  Driver entry points */
>         dev->netdev_ops = &s2io_netdev_ops;
> -       SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
> +       dev->ethtool_ops = &netdev_ethtool_ops;
>         dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
>                 NETIF_F_TSO | NETIF_F_TSO6 |
>                 NETIF_F_RXCSUM | NETIF_F_LRO;
> diff --git a/drivers/net/ethernet/neterion/vxge/vxge-ethtool.c b/drivers/net/ethernet/neterion/vxge/vxge-ethtool.c
> index f8f0738..ddcc81a 100644
> --- a/drivers/net/ethernet/neterion/vxge/vxge-ethtool.c
> +++ b/drivers/net/ethernet/neterion/vxge/vxge-ethtool.c
> @@ -1128,5 +1128,5 @@ static const struct ethtool_ops vxge_ethtool_ops = {
>
>  void vxge_initialize_ethtool_ops(struct net_device *ndev)
>  {
> -       SET_ETHTOOL_OPS(ndev, &vxge_ethtool_ops);
> +       ndev->ethtool_ops = &vxge_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/nvidia/forcedeth.c b/drivers/net/ethernet/nvidia/forcedeth.c
> index fddb464..e8235c5 100644
> --- a/drivers/net/ethernet/nvidia/forcedeth.c
> +++ b/drivers/net/ethernet/nvidia/forcedeth.c
> @@ -5766,7 +5766,7 @@ static int nv_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
>                 dev->netdev_ops = &nv_netdev_ops_optimized;
>
>         netif_napi_add(dev, &np->napi, nv_napi_poll, RX_WORK_PER_LOOP);
> -       SET_ETHTOOL_OPS(dev, &ops);
> +       dev->ethtool_ops = &ops;
>         dev->watchdog_timeo = NV_WATCHDOG_TIMEO;
>
>         pci_set_drvdata(pci_dev, dev);
> diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
> index 826f0cc..114d2fe 100644
> --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
> +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
> @@ -508,5 +508,5 @@ static const struct ethtool_ops pch_gbe_ethtool_ops = {
>
>  void pch_gbe_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &pch_gbe_ethtool_ops);
> +       netdev->ethtool_ops = &pch_gbe_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/packetengines/hamachi.c b/drivers/net/ethernet/packetengines/hamachi.c
> index b6bdeb3..9a997e4 100644
> --- a/drivers/net/ethernet/packetengines/hamachi.c
> +++ b/drivers/net/ethernet/packetengines/hamachi.c
> @@ -724,10 +724,8 @@ static int hamachi_init_one(struct pci_dev *pdev,
>
>         /* The Hamachi-specific entries in the device structure. */
>         dev->netdev_ops = &hamachi_netdev_ops;
> -       if (chip_tbl[hmp->chip_id].flags & CanHaveMII)
> -               SET_ETHTOOL_OPS(dev, &ethtool_ops);
> -       else
> -               SET_ETHTOOL_OPS(dev, &ethtool_ops_no_mii);
> +       dev->ethtool_ops = (chip_tbl[hmp->chip_id].flags & CanHaveMII) ?
> +               &ethtool_ops : &ethtool_ops_no_mii;
>         dev->watchdog_timeo = TX_TIMEOUT;
>         if (mtu)
>                 dev->mtu = mtu;
> diff --git a/drivers/net/ethernet/packetengines/yellowfin.c b/drivers/net/ethernet/packetengines/yellowfin.c
> index 9a6cb48..69a8dc0 100644
> --- a/drivers/net/ethernet/packetengines/yellowfin.c
> +++ b/drivers/net/ethernet/packetengines/yellowfin.c
> @@ -472,7 +472,7 @@ static int yellowfin_init_one(struct pci_dev *pdev,
>
>         /* The Yellowfin-specific entries in the device structure. */
>         dev->netdev_ops = &netdev_ops;
> -       SET_ETHTOOL_OPS(dev, &ethtool_ops);
> +       dev->ethtool_ops = &ethtool_ops;
>         dev->watchdog_timeo = TX_TIMEOUT;
>
>         if (mtu)
> diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
> index f09c35d..5bf0581 100644
> --- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
> +++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
> @@ -1373,7 +1373,7 @@ netxen_setup_netdev(struct netxen_adapter *adapter,
>
>         netxen_nic_change_mtu(netdev, netdev->mtu);
>
> -       SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops);
> +       netdev->ethtool_ops = &netxen_nic_ethtool_ops;
>
>         netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
>                               NETIF_F_RXCSUM;
> diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c
> index 2eabd44..b5d6bc1 100644
> --- a/drivers/net/ethernet/qlogic/qla3xxx.c
> +++ b/drivers/net/ethernet/qlogic/qla3xxx.c
> @@ -3838,7 +3838,7 @@ static int ql3xxx_probe(struct pci_dev *pdev,
>
>         /* Set driver entry points */
>         ndev->netdev_ops = &ql3xxx_netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &ql3xxx_ethtool_ops);
> +       ndev->ethtool_ops = &ql3xxx_ethtool_ops;
>         ndev->watchdog_timeo = 5 * HZ;
>
>         netif_napi_add(ndev, &qdev->napi, ql_poll, 64);
> diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
> index dbf7539..4bdbdca 100644
> --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
> +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
> @@ -2222,10 +2222,8 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev,
>
>         qlcnic_change_mtu(netdev, netdev->mtu);
>
> -       if (qlcnic_sriov_vf_check(adapter))
> -               SET_ETHTOOL_OPS(netdev, &qlcnic_sriov_vf_ethtool_ops);
> -       else
> -               SET_ETHTOOL_OPS(netdev, &qlcnic_ethtool_ops);
> +       netdev->ethtool_ops = (qlcnic_sriov_vf_check(adapter)) ?
> +               &qlcnic_sriov_vf_ethtool_ops : &qlcnic_ethtool_ops;
>
>         netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
>                              NETIF_F_IPV6_CSUM | NETIF_F_GRO |
> @@ -2630,7 +2628,7 @@ err_out_disable_pdev:
>  err_out_maintenance_mode:
>         set_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state);
>         netdev->netdev_ops = &qlcnic_netdev_failed_ops;
> -       SET_ETHTOOL_OPS(netdev, &qlcnic_ethtool_failed_ops);
> +       netdev->ethtool_ops = &qlcnic_ethtool_failed_ops;
>         ahw->port_type = QLCNIC_XGBE;
>
>         if (qlcnic_83xx_check(adapter))
> diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c
> index 0a1d76a..79b86e9 100644
> --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c
> +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c
> @@ -4770,7 +4770,7 @@ static int qlge_probe(struct pci_dev *pdev,
>         ndev->irq = pdev->irq;
>
>         ndev->netdev_ops = &qlge_netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &qlge_ethtool_ops);
> +       ndev->ethtool_ops = &qlge_ethtool_ops;
>         ndev->watchdog_timeo = 10 * HZ;
>
>         err = register_netdev(ndev);
> diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
> index aa1c079..be425ad 100644
> --- a/drivers/net/ethernet/realtek/r8169.c
> +++ b/drivers/net/ethernet/realtek/r8169.c
> @@ -7125,7 +7125,7 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
>         for (i = 0; i < ETH_ALEN; i++)
>                 dev->dev_addr[i] = RTL_R8(MAC0 + i);
>
> -       SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
> +       dev->ethtool_ops = &rtl8169_ethtool_ops;
>         dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
>
>         netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
> diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
> index 6a9509c..967314c 100644
> --- a/drivers/net/ethernet/renesas/sh_eth.c
> +++ b/drivers/net/ethernet/renesas/sh_eth.c
> @@ -2843,7 +2843,7 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
>                 ndev->netdev_ops = &sh_eth_netdev_ops_tsu;
>         else
>                 ndev->netdev_ops = &sh_eth_netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &sh_eth_ethtool_ops);
> +       ndev->ethtool_ops = &sh_eth_ethtool_ops;
>         ndev->watchdog_timeo = TX_TIMEOUT;
>
>         /* debug message level */
> diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
> index 0415fa5..c0981ae 100644
> --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
> +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c
> @@ -520,5 +520,5 @@ static const struct ethtool_ops sxgbe_ethtool_ops = {
>
>  void sxgbe_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &sxgbe_ethtool_ops);
> +       netdev->ethtool_ops = &sxgbe_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c
> index 63d595f..1e27404 100644
> --- a/drivers/net/ethernet/sfc/efx.c
> +++ b/drivers/net/ethernet/sfc/efx.c
> @@ -2248,7 +2248,7 @@ static int efx_register_netdev(struct efx_nic *efx)
>         } else {
>                 net_dev->netdev_ops = &efx_farch_netdev_ops;
>         }
> -       SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops);
> +       net_dev->ethtool_ops = &efx_ethtool_ops;
>         net_dev->gso_max_segs = EFX_TSO_MAX_SEGS;
>
>         rtnl_lock();
> diff --git a/drivers/net/ethernet/sis/sis190.c b/drivers/net/ethernet/sis/sis190.c
> index acbbe48..a863399 100644
> --- a/drivers/net/ethernet/sis/sis190.c
> +++ b/drivers/net/ethernet/sis/sis190.c
> @@ -1877,7 +1877,7 @@ static int sis190_init_one(struct pci_dev *pdev,
>
>         dev->netdev_ops = &sis190_netdev_ops;
>
> -       SET_ETHTOOL_OPS(dev, &sis190_ethtool_ops);
> +       dev->ethtool_ops = &sis190_ethtool_ops;
>         dev->watchdog_timeo = SIS190_TX_TIMEOUT;
>
>         spin_lock_init(&tp->lock);
> diff --git a/drivers/net/ethernet/smsc/smc91c92_cs.c b/drivers/net/ethernet/smsc/smc91c92_cs.c
> index c7a4868..6b33127 100644
> --- a/drivers/net/ethernet/smsc/smc91c92_cs.c
> +++ b/drivers/net/ethernet/smsc/smc91c92_cs.c
> @@ -318,7 +318,7 @@ static int smc91c92_probe(struct pcmcia_device *link)
>
>      /* The SMC91c92-specific entries in the device structure. */
>      dev->netdev_ops = &smc_netdev_ops;
> -    SET_ETHTOOL_OPS(dev, &ethtool_ops);
> +    dev->ethtool_ops = &ethtool_ops;
>      dev->watchdog_timeo = TX_TIMEOUT;
>
>      smc->mii_if.dev = dev;
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
> index c5f9cb8..c963394 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
> @@ -784,5 +784,5 @@ static const struct ethtool_ops stmmac_ethtool_ops = {
>
>  void stmmac_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &stmmac_ethtool_ops);
> +       netdev->ethtool_ops = &stmmac_ethtool_ops;
>  }
> diff --git a/drivers/net/ethernet/tehuti/tehuti.c b/drivers/net/ethernet/tehuti/tehuti.c
> index 2ead877..38da73a 100644
> --- a/drivers/net/ethernet/tehuti/tehuti.c
> +++ b/drivers/net/ethernet/tehuti/tehuti.c
> @@ -2413,7 +2413,7 @@ static void bdx_set_ethtool_ops(struct net_device *netdev)
>                 .get_ethtool_stats = bdx_get_ethtool_stats,
>         };
>
> -       SET_ETHTOOL_OPS(netdev, &bdx_ethtool_ops);
> +       netdev->ethtool_ops = &bdx_ethtool_ops;
>  }
>
>  /**
> diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
> index 36aa109..6ecab3c 100644
> --- a/drivers/net/ethernet/ti/cpsw.c
> +++ b/drivers/net/ethernet/ti/cpsw.c
> @@ -1975,7 +1975,7 @@ static int cpsw_probe_dual_emac(struct platform_device *pdev,
>         ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
>
>         ndev->netdev_ops = &cpsw_netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &cpsw_ethtool_ops);
> +       ndev->ethtool_ops = &cpsw_ethtool_ops;
>         netif_napi_add(ndev, &priv_sl2->napi, cpsw_poll, CPSW_POLL_WEIGHT);
>
>         /* register the network device */
> @@ -2204,7 +2204,7 @@ static int cpsw_probe(struct platform_device *pdev)
>         ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
>
>         ndev->netdev_ops = &cpsw_netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &cpsw_ethtool_ops);
> +       ndev->ethtool_ops = &cpsw_ethtool_ops;
>         netif_napi_add(ndev, &priv->napi, cpsw_poll, CPSW_POLL_WEIGHT);
>
>         /* register the network device */
> diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c
> index 8f0e69c..e76eae5 100644
> --- a/drivers/net/ethernet/ti/davinci_emac.c
> +++ b/drivers/net/ethernet/ti/davinci_emac.c
> @@ -1980,7 +1980,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
>         }
>
>         ndev->netdev_ops = &emac_netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &ethtool_ops);
> +       ndev->ethtool_ops = &ethtool_ops;
>         netif_napi_add(ndev, &priv->napi, emac_poll, EMAC_POLL_WEIGHT);
>
>         /* register the network device */
> diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
> index 31e55fb..2170db5 100644
> --- a/drivers/net/hyperv/netvsc_drv.c
> +++ b/drivers/net/hyperv/netvsc_drv.c
> @@ -715,7 +715,7 @@ static int netvsc_probe(struct hv_device *dev,
>         net->features = NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_SG | NETIF_F_RXCSUM |
>                         NETIF_F_IP_CSUM | NETIF_F_TSO;
>
> -       SET_ETHTOOL_OPS(net, &ethtool_ops);
> +       net->ethtool_ops = &ethtool_ops;
>         SET_NETDEV_DEV(net, &dev->device);
>
>         /* Notify the netvsc driver of the new device */
> diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c
> index 63aa9d9..27536aa 100644
> --- a/drivers/net/ntb_netdev.c
> +++ b/drivers/net/ntb_netdev.c
> @@ -348,7 +348,7 @@ static int ntb_netdev_probe(struct pci_dev *pdev)
>         memcpy(ndev->dev_addr, ndev->perm_addr, ndev->addr_len);
>
>         ndev->netdev_ops = &ntb_netdev_ops;
> -       SET_ETHTOOL_OPS(ndev, &ntb_ethtool_ops);
> +       ndev->ethtool_ops = &ntb_ethtool_ops;
>
>         dev->qp = ntb_transport_create_queue(ndev, pdev, &ntb_netdev_handlers);
>         if (!dev->qp) {
> diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c
> index a849718..dac7a0d 100644
> --- a/drivers/net/rionet.c
> +++ b/drivers/net/rionet.c
> @@ -494,7 +494,7 @@ static int rionet_setup_netdev(struct rio_mport *mport, struct net_device *ndev)
>         ndev->mtu = RIO_MAX_MSG_SIZE - 14;
>         ndev->features = NETIF_F_LLTX;
>         SET_NETDEV_DEV(ndev, &mport->dev);
> -       SET_ETHTOOL_OPS(ndev, &rionet_ethtool_ops);
> +       ndev->ethtool_ops = &rionet_ethtool_ops;
>
>         spin_lock_init(&rnet->lock);
>         spin_lock_init(&rnet->tx_lock);
> diff --git a/drivers/net/usb/catc.c b/drivers/net/usb/catc.c
> index 630caf4..8cfc3bb 100644
> --- a/drivers/net/usb/catc.c
> +++ b/drivers/net/usb/catc.c
> @@ -793,7 +793,7 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id
>
>         netdev->netdev_ops = &catc_netdev_ops;
>         netdev->watchdog_timeo = TX_TIMEOUT;
> -       SET_ETHTOOL_OPS(netdev, &ops);
> +       netdev->ethtool_ops = &ops;
>
>         catc->usbdev = usbdev;
>         catc->netdev = netdev;
> diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
> index 660bd5e..a3a0586 100644
> --- a/drivers/net/usb/hso.c
> +++ b/drivers/net/usb/hso.c
> @@ -2425,7 +2425,7 @@ static void hso_net_init(struct net_device *net)
>         net->type = ARPHRD_NONE;
>         net->mtu = DEFAULT_MTU - 14;
>         net->tx_queue_len = 10;
> -       SET_ETHTOOL_OPS(net, &ops);
> +       net->ethtool_ops = &ops;
>
>         /* and initialize the semaphore */
>         spin_lock_init(&hso_net->net_lock);
> diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c
> index 421934c..f725707 100644
> --- a/drivers/net/usb/ipheth.c
> +++ b/drivers/net/usb/ipheth.c
> @@ -524,7 +524,7 @@ static int ipheth_probe(struct usb_interface *intf,
>         usb_set_intfdata(intf, dev);
>
>         SET_NETDEV_DEV(netdev, &intf->dev);
> -       SET_ETHTOOL_OPS(netdev, &ops);
> +       netdev->ethtool_ops = &ops;
>
>         retval = register_netdev(netdev);
>         if (retval) {
> diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c
> index a359d3b..dcb6d33 100644
> --- a/drivers/net/usb/kaweth.c
> +++ b/drivers/net/usb/kaweth.c
> @@ -1171,7 +1171,7 @@ err_fw:
>         netdev->netdev_ops = &kaweth_netdev_ops;
>         netdev->watchdog_timeo = KAWETH_TX_TIMEOUT;
>         netdev->mtu = le16_to_cpu(kaweth->configuration.segment_size);
> -       SET_ETHTOOL_OPS(netdev, &ops);
> +       netdev->ethtool_ops = &ops;
>
>         /* kaweth is zeroed as part of alloc_netdev */
>         INIT_DELAYED_WORK(&kaweth->lowmem_work, kaweth_resubmit_tl);
> diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c
> index 03e8a15..f840802 100644
> --- a/drivers/net/usb/pegasus.c
> +++ b/drivers/net/usb/pegasus.c
> @@ -1159,7 +1159,7 @@ static int pegasus_probe(struct usb_interface *intf,
>
>         net->watchdog_timeo = PEGASUS_TX_TIMEOUT;
>         net->netdev_ops = &pegasus_netdev_ops;
> -       SET_ETHTOOL_OPS(net, &ops);
> +       net->ethtool_ops = &ops;
>         pegasus->mii.dev = net;
>         pegasus->mii.mdio_read = mdio_read;
>         pegasus->mii.mdio_write = mdio_write;
> diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
> index 3fbfb08..9f91c7a 100644
> --- a/drivers/net/usb/r8152.c
> +++ b/drivers/net/usb/r8152.c
> @@ -3452,7 +3452,7 @@ static int rtl8152_probe(struct usb_interface *intf,
>                               NETIF_F_TSO | NETIF_F_FRAGLIST |
>                               NETIF_F_IPV6_CSUM | NETIF_F_TSO6;
>
> -       SET_ETHTOOL_OPS(netdev, &ops);
> +       netdev->ethtool_ops = &ops;
>         netif_set_gso_max_size(netdev, RTL_LIMITED_TSO_SIZE);
>
>         tp->mii.dev = netdev;
> diff --git a/drivers/net/usb/rtl8150.c b/drivers/net/usb/rtl8150.c
> index da2c458..6e87e57 100644
> --- a/drivers/net/usb/rtl8150.c
> +++ b/drivers/net/usb/rtl8150.c
> @@ -878,7 +878,7 @@ static int rtl8150_probe(struct usb_interface *intf,
>         dev->netdev = netdev;
>         netdev->netdev_ops = &rtl8150_netdev_ops;
>         netdev->watchdog_timeo = RTL8150_TX_TIMEOUT;
> -       SET_ETHTOOL_OPS(netdev, &ops);
> +       netdev->ethtool_ops = &ops;
>         dev->intr_interval = 100;       /* 100ms */
>
>         if (!alloc_all_urbs(dev)) {
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 7b68746..3f83359 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1646,7 +1646,7 @@ static int virtnet_probe(struct virtio_device *vdev)
>         dev->netdev_ops = &virtnet_netdev;
>         dev->features = NETIF_F_HIGHDMA;
>
> -       SET_ETHTOOL_OPS(dev, &virtnet_ethtool_ops);
> +       dev->ethtool_ops = &virtnet_ethtool_ops;
>         SET_NETDEV_DEV(dev, &vdev->dev);
>
>         /* Do we support "hardware" checksums? */
> diff --git a/drivers/net/vmxnet3/vmxnet3_ethtool.c b/drivers/net/vmxnet3/vmxnet3_ethtool.c
> index 600ab56..00e1202 100644
> --- a/drivers/net/vmxnet3/vmxnet3_ethtool.c
> +++ b/drivers/net/vmxnet3/vmxnet3_ethtool.c
> @@ -635,5 +635,5 @@ static const struct ethtool_ops vmxnet3_ethtool_ops = {
>
>  void vmxnet3_set_ethtool_ops(struct net_device *netdev)
>  {
> -       SET_ETHTOOL_OPS(netdev, &vmxnet3_ethtool_ops);
> +       netdev->ethtool_ops = &vmxnet3_ethtool_ops;
>  }
> diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
> index 82355d5..457359c 100644
> --- a/drivers/net/vxlan.c
> +++ b/drivers/net/vxlan.c
> @@ -2706,7 +2706,7 @@ static int vxlan_newlink(struct net *net, struct net_device *dev,
>                 return -EEXIST;
>         }
>
> -       SET_ETHTOOL_OPS(dev, &vxlan_ethtool_ops);
> +       dev->ethtool_ops = &vxlan_ethtool_ops;
>
>         /* create an fdb entry for a valid default destination */
>         if (!vxlan_addr_any(&vxlan->default_dst.remote_ip)) {
> diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c
> index 67db34e..52919ad 100644
> --- a/drivers/net/wireless/hostap/hostap_main.c
> +++ b/drivers/net/wireless/hostap/hostap_main.c
> @@ -882,7 +882,7 @@ void hostap_setup_dev(struct net_device *dev, local_info_t *local,
>         dev->mtu = local->mtu;
>
>
> -       SET_ETHTOOL_OPS(dev, &prism2_ethtool_ops);
> +       dev->ethtool_ops = &prism2_ethtool_ops;
>
>  }
>
> diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
> index ef05c5c..a755733 100644
> --- a/drivers/net/xen-netback/interface.c
> +++ b/drivers/net/xen-netback/interface.c
> @@ -386,7 +386,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
>                 NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
>                 NETIF_F_TSO | NETIF_F_TSO6;
>         dev->features = dev->hw_features | NETIF_F_RXCSUM;
> -       SET_ETHTOOL_OPS(dev, &xenvif_ethtool_ops);
> +       dev->ethtool_ops = &xenvif_ethtool_ops;
>
>         dev->tx_queue_len = XENVIF_QUEUE_LENGTH;
>
> diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
> index 158b5e6..895355d 100644
> --- a/drivers/net/xen-netfront.c
> +++ b/drivers/net/xen-netfront.c
> @@ -1332,7 +1332,7 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
>           */
>         netdev->features |= netdev->hw_features;
>
> -       SET_ETHTOOL_OPS(netdev, &xennet_ethtool_ops);
> +       netdev->ethtool_ops = &xennet_ethtool_ops;
>         SET_NETDEV_DEV(netdev, &dev->dev);
>
>         netif_set_gso_max_size(netdev, XEN_NETIF_MAX_TX_SIZE - MAX_TCP_HEADER);
> diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
> index 8dea3f1..047b4da 100644
> --- a/drivers/s390/net/qeth_l2_main.c
> +++ b/drivers/s390/net/qeth_l2_main.c
> @@ -964,10 +964,9 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
>         card->dev->watchdog_timeo = QETH_TX_TIMEOUT;
>         card->dev->mtu = card->info.initial_mtu;
>         card->dev->netdev_ops = &qeth_l2_netdev_ops;
> -       if (card->info.type != QETH_CARD_TYPE_OSN)
> -               SET_ETHTOOL_OPS(card->dev, &qeth_l2_ethtool_ops);
> -       else
> -               SET_ETHTOOL_OPS(card->dev, &qeth_l2_osn_ops);
> +       card->dev->ethtool_ops =
> +               (card->info.type != QETH_CARD_TYPE_OSN) ?
> +               &qeth_l2_ethtool_ops : &qeth_l2_osn_ops;
>         card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
>         card->info.broadcast_capable = 1;
>         qeth_l2_request_initial_mac(card);
> diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
> index 3524d34..0a59d24 100644
> --- a/drivers/s390/net/qeth_l3_main.c
> +++ b/drivers/s390/net/qeth_l3_main.c
> @@ -3298,7 +3298,7 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)
>         card->dev->ml_priv = card;
>         card->dev->watchdog_timeo = QETH_TX_TIMEOUT;
>         card->dev->mtu = card->info.initial_mtu;
> -       SET_ETHTOOL_OPS(card->dev, &qeth_l3_ethtool_ops);
> +       card->dev->ethtool_ops = &qeth_l3_ethtool_ops;
>         card->dev->features |=  NETIF_F_HW_VLAN_CTAG_TX |
>                                 NETIF_F_HW_VLAN_CTAG_RX |
>                                 NETIF_F_HW_VLAN_CTAG_FILTER;
> diff --git a/drivers/staging/et131x/et131x.c b/drivers/staging/et131x/et131x.c
> index d329cf3..15e0f4d 100644
> --- a/drivers/staging/et131x/et131x.c
> +++ b/drivers/staging/et131x/et131x.c
> @@ -4604,7 +4604,7 @@ static int et131x_pci_setup(struct pci_dev *pdev,
>         netdev->netdev_ops     = &et131x_netdev_ops;
>
>         SET_NETDEV_DEV(netdev, &pdev->dev);
> -       SET_ETHTOOL_OPS(netdev, &et131x_ethtool_ops);
> +       netdev->ethtool_ops = &et131x_ethtool_ops;
>
>         adapter = et131x_adapter_init(netdev, pdev);
>
> diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
> index d6421b9..a6158be 100644
> --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
> +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
> @@ -2249,7 +2249,7 @@ struct net_device *init_ft1000_card(struct pcmcia_device *link,
>
>         ft1000InitProc(dev);
>         ft1000_card_present = 1;
> -       SET_ETHTOOL_OPS(dev, &ops);
> +       dev->ethtool_ops = &ops;
>         printk(KERN_INFO "ft1000: %s: addr 0x%04lx irq %d, MAC addr %pM\n",
>                         dev->name, dev->base_addr, dev->irq, dev->dev_addr);
>         return dev;
> diff --git a/drivers/staging/netlogic/xlr_net.c b/drivers/staging/netlogic/xlr_net.c
> index c83e337..9d95761 100644
> --- a/drivers/staging/netlogic/xlr_net.c
> +++ b/drivers/staging/netlogic/xlr_net.c
> @@ -1066,7 +1066,7 @@ static int xlr_net_probe(struct platform_device *pdev)
>         xlr_set_rx_mode(ndev);
>
>         priv->num_rx_desc += MAX_NUM_DESC_SPILL;
> -       SET_ETHTOOL_OPS(ndev, &xlr_ethtool_ops);
> +       ndev->ethtool_ops = &xlr_ethtool_ops;
>         SET_NETDEV_DEV(ndev, &pdev->dev);
>
>         /* Common registers, do one time initialization */
> diff --git a/drivers/staging/octeon/ethernet.c b/drivers/staging/octeon/ethernet.c
> index ff7214a..da9dd6b 100644
> --- a/drivers/staging/octeon/ethernet.c
> +++ b/drivers/staging/octeon/ethernet.c
> @@ -469,7 +469,7 @@ int cvm_oct_common_init(struct net_device *dev)
>
>         /* We do our own locking, Linux doesn't need to */
>         dev->features |= NETIF_F_LLTX;
> -       SET_ETHTOOL_OPS(dev, &cvm_oct_ethtool_ops);
> +       dev->ethtool_ops = &cvm_oct_ethtool_ops;
>
>         cvm_oct_phy_setup_device(dev);
>         cvm_oct_set_mac_filter(dev);
> diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c
> index b7d4f82..ce8e281 100644
> --- a/drivers/usb/gadget/u_ether.c
> +++ b/drivers/usb/gadget/u_ether.c
> @@ -793,7 +793,7 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g,
>
>         net->netdev_ops = &eth_netdev_ops;
>
> -       SET_ETHTOOL_OPS(net, &ops);
> +       net->ethtool_ops = &ops;
>
>         dev->gadget = g;
>         SET_NETDEV_DEV(net, &g->dev);
> @@ -850,7 +850,7 @@ struct net_device *gether_setup_name_default(const char *netname)
>
>         net->netdev_ops = &eth_netdev_ops;
>
> -       SET_ETHTOOL_OPS(net, &ops);
> +       net->ethtool_ops = &ops;
>         SET_NETDEV_DEVTYPE(net, &gadget_type);
>
>         return net;
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index 7ed3a3a..06071f7 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -56,9 +56,6 @@ struct device;
>  struct phy_device;
>  /* 802.11 specific */
>  struct wireless_dev;
> -                                       /* source back-compat hooks */
> -#define SET_ETHTOOL_OPS(netdev,ops) \
> -       ( (netdev)->ethtool_ops = (ops) )
>
>  void netdev_set_default_ethtool_ops(struct net_device *dev,
>                                     const struct ethtool_ops *ops);
> diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
> index 744a59b..e7ee65d 100644
> --- a/net/batman-adv/soft-interface.c
> +++ b/net/batman-adv/soft-interface.c
> @@ -884,7 +884,7 @@ static void batadv_softif_init_early(struct net_device *dev)
>         /* generate random address */
>         eth_hw_addr_random(dev);
>
> -       SET_ETHTOOL_OPS(dev, &batadv_ethtool_ops);
> +       dev->ethtool_ops = &batadv_ethtool_ops;
>
>         memset(priv, 0, sizeof(*priv));
>  }
> diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
> index 3e2da2c..9212015 100644
> --- a/net/bridge/br_device.c
> +++ b/net/bridge/br_device.c
> @@ -348,7 +348,7 @@ void br_dev_setup(struct net_device *dev)
>
>         dev->netdev_ops = &br_netdev_ops;
>         dev->destructor = br_dev_free;
> -       SET_ETHTOOL_OPS(dev, &br_ethtool_ops);
> +       dev->ethtool_ops = &br_ethtool_ops;
>         SET_NETDEV_DEVTYPE(dev, &br_type);
>         dev->tx_queue_len = 0;
>         dev->priv_flags = IFF_EBRIDGE;
> diff --git a/net/dsa/slave.c b/net/dsa/slave.c
> index 02c0e17..64c5af0 100644
> --- a/net/dsa/slave.c
> +++ b/net/dsa/slave.c
> @@ -346,7 +346,7 @@ dsa_slave_create(struct dsa_switch *ds, struct device *parent,
>                 return slave_dev;
>
>         slave_dev->features = master->vlan_features;
> -       SET_ETHTOOL_OPS(slave_dev, &dsa_slave_ethtool_ops);
> +       slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
>         eth_hw_addr_inherit(slave_dev, master);
>         slave_dev->tx_queue_len = 0;
>
> diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c
> index 729c687..789af92 100644
> --- a/net/openvswitch/vport-internal_dev.c
> +++ b/net/openvswitch/vport-internal_dev.c
> @@ -130,7 +130,7 @@ static void do_setup(struct net_device *netdev)
>         netdev->priv_flags &= ~IFF_TX_SKB_SHARING;
>         netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
>         netdev->destructor = internal_dev_destructor;
> -       SET_ETHTOOL_OPS(netdev, &internal_dev_ethtool_ops);
> +       netdev->ethtool_ops = &internal_dev_ethtool_ops;
>         netdev->tx_queue_len = 0;
>
>         netdev->features = NETIF_F_LLTX | NETIF_F_SG | NETIF_F_FRAGLIST |
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply

* Re: [PATCH] powerpc: irq work racing with timer interrupt can result in timer interrupt hang
From: Preeti U Murthy @ 2014-05-11  8:15 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: paulmck, paulus, Anton Blanchard, linuxppc-dev
In-Reply-To: <1399760754.17624.21.camel@pasglop>

On 05/11/2014 03:55 AM, Benjamin Herrenschmidt wrote:
> On Sat, 2014-05-10 at 21:06 +0530, Preeti U Murthy wrote:
>> On 05/10/2014 09:56 AM, Benjamin Herrenschmidt wrote:
>>> On Fri, 2014-05-09 at 15:22 +0530, Preeti U Murthy wrote:
>>>> in __timer_interrupt() outside the _else_ loop? This will ensure that no
>>>> matter what, before exiting timer interrupt handler we check for pending
>>>> irq work.
>>>
>>> We still need to make sure that set_next_event() doesn't move the
>>> dec beyond the next tick if there is a pending timer... maybe we
>>
>> Sorry, but didn't get this. s/if there is pending timer/if there is
>> pending irq work ?
> 
> Yes, sorry :-) That's what I meant.
> 
>>> can fix it like this:
>>
>> We can call set_next_event() from events like hrtimer_cancel() or
>> hrtimer_forward() as well. In that case we don't come to
>> decrementer_set_next_event() from __timer_interrupt(). Then, if we race
>> with irq work, we *do not do* a set_dec(1) ( I am referring to the patch
>> below ), we might never set the decrementer to fire immediately right?
>>
>> Or does this scenario never arise?
> 
> So my proposed patch handles that no ?
> 
> With that patch, we do the set_dec(1) in two cases:
> 
>  - The existing arch_irq_work_raise() which is unchanged
> 
>  - At the end of __timer_interrupt() if an irq work is still pending
> 
> And the patch also makes decrementer_set_next_event() not modify the
> decrementer if an irq work is pending, but *still* adjust next_tb unlike
> what the code does now.
> 
> Thus the timer interrupt, when it happens, will re-adjust the dec
> properly using next_tb.
> 
> Do we still miss a case ?

I was thinking something like the below in decrementer_set_next_event().
See last line in particular :

 -       /* Don't adjust the decrementer if some irq work is pending */
 -       if (test_irq_work_pending())
 -               return 0;
         __get_cpu_var(decrementers_next_tb) = get_tb_or_rtc() + evt;
 -       set_dec(evt);

 -       /* We may have raced with new irq work */
 -       if (test_irq_work_pending())
 -               set_dec(1);
 +       /* Don't adjust the decrementer if some irq work is pending */
 +       if (!test_irq_work_pending())
 +               set_dec(evt);
 +       else
 +               set_dec(1);

                  ^^^^^ your patch currently does not have this explicit
set_dec(1) here. Will that create a problem? If there is any irq work
pending at this point, will someone set the decrementer to fire
immediately after this point? The current code in
decrementer_set_next_event() sets set_dec(1) explicitly in case of
pending irq work.

Regards
Preeti U Murthy
> 
> Cheers,
> Ben.
> 
>> Regards
>> Preeti U Murthy
>>>
>>> static int decrementer_set_next_event(unsigned long evt,
>>> 				      struct clock_event_device *dev)
>>> {
>>> 	__get_cpu_var(decrementers_next_tb) = get_tb_or_rtc() + evt;
>>>
>>> 	/* Don't adjust the decrementer if some irq work is pending */
>>> 	if (!test_irq_work_pending())
>>> 		set_dec(evt);
>>>
>>> 	return 0;
>>> }
>>>
>>> Along with a single occurrence of:
>>>
>>> 	if (test_irq_work_pending())
>>> 		set_dec(1);
>>>
>>> At the end of __timer_interrupt(), outside if the current else {}
>>> case, this should work, don't you think ?
>>>
>>> What about this completely untested patch ?
>>>
>>> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
>>> index 122a580..ba7e83b 100644
>>> --- a/arch/powerpc/kernel/time.c
>>> +++ b/arch/powerpc/kernel/time.c
>>> @@ -503,12 +503,13 @@ void __timer_interrupt(void)
>>>                 now = *next_tb - now;
>>>                 if (now <= DECREMENTER_MAX)
>>>                         set_dec((int)now);
>>> -               /* We may have raced with new irq work */
>>> -               if (test_irq_work_pending())
>>> -                       set_dec(1);
>>>                 __get_cpu_var(irq_stat).timer_irqs_others++;
>>>         }
>>>
>>> +       /* We may have raced with new irq work */
>>> +       if (test_irq_work_pending())
>>> +               set_dec(1);
>>> +
>>>  #ifdef CONFIG_PPC64
>>>         /* collect purr register values often, for accurate calculations */
>>>         if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
>>> @@ -813,15 +814,11 @@ static void __init clocksource_init(void)
>>>  static int decrementer_set_next_event(unsigned long evt,
>>>                                       struct clock_event_device *dev)
>>>  {
>>> -       /* Don't adjust the decrementer if some irq work is pending */
>>> -       if (test_irq_work_pending())
>>> -               return 0;
>>>         __get_cpu_var(decrementers_next_tb) = get_tb_or_rtc() + evt;
>>> -       set_dec(evt);
>>>
>>> -       /* We may have raced with new irq work */
>>> -       if (test_irq_work_pending())
>>> -               set_dec(1);
>>> +       /* Don't adjust the decrementer if some irq work is pending */
>>> +       if (!test_irq_work_pending())
>>> +               set_dec(evt);
>>>
>>>         return 0;
>>>  }
>>>
>>>
>>>
>>>
> 
> 

^ permalink raw reply

* Re: [PATCH] powerpc: irq work racing with timer interrupt can result in timer interrupt hang
From: Benjamin Herrenschmidt @ 2014-05-11  8:37 UTC (permalink / raw)
  To: Preeti U Murthy; +Cc: paulmck, paulus, Anton Blanchard, linuxppc-dev
In-Reply-To: <536F3192.2050004@linux.vnet.ibm.com>

On Sun, 2014-05-11 at 13:45 +0530, Preeti U Murthy wrote:
>  +       /* Don't adjust the decrementer if some irq work is pending
> */
>  +       if (!test_irq_work_pending())
>  +               set_dec(evt);
>  +       else
>  +               set_dec(1);
> 
>                   ^^^^^ your patch currently does not have this
> explicit
> set_dec(1) here. Will that create a problem? 
>
> If there is any irq work pending at this point, will someone set the
> decrementer to fire immediately after this point? The current code in
> decrementer_set_next_event() sets set_dec(1) explicitly in case of
> pending irq work.

Hrm, actually this is an interesting point. The problem isn't that
*someone* will do a set_dec, nobody else should that matters.

The problem is that irq_work can be triggered typically by NMIs or
similar, which means that it might be queued between the
test_irq_work_pending() and the set_dec(), thus causing a race.

So basically Anton's original patch is fine :-) I had missed that
we did a post-set_dec() test already in decrementer_next_event()
so as far as I can tell, removing the pre-test, which is what Anton
does, is really all we need.

Cheers,
Ben.

^ permalink raw reply

* Re: [PATCH] powerpc: irq work racing with timer interrupt can result in timer interrupt hang
From: Preeti U Murthy @ 2014-05-11  8:43 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: paulmck, paulus, Anton Blanchard, linuxppc-dev
In-Reply-To: <1399797477.17624.40.camel@pasglop>

On 05/11/2014 02:07 PM, Benjamin Herrenschmidt wrote:
> On Sun, 2014-05-11 at 13:45 +0530, Preeti U Murthy wrote:
>>  +       /* Don't adjust the decrementer if some irq work is pending
>> */
>>  +       if (!test_irq_work_pending())
>>  +               set_dec(evt);
>>  +       else
>>  +               set_dec(1);
>>
>>                   ^^^^^ your patch currently does not have this
>> explicit
>> set_dec(1) here. Will that create a problem? 
>>
>> If there is any irq work pending at this point, will someone set the
>> decrementer to fire immediately after this point? The current code in
>> decrementer_set_next_event() sets set_dec(1) explicitly in case of
>> pending irq work.
> 
> Hrm, actually this is an interesting point. The problem isn't that
> *someone* will do a set_dec, nobody else should that matters.
> 
> The problem is that irq_work can be triggered typically by NMIs or
> similar, which means that it might be queued between the
> test_irq_work_pending() and the set_dec(), thus causing a race.
> 
> So basically Anton's original patch is fine :-) I had missed that
> we did a post-set_dec() test already in decrementer_next_event()
> so as far as I can tell, removing the pre-test, which is what Anton
> does, is really all we need.

Isn't this patch required too?

@@ -503,12 +503,13 @@ void __timer_interrupt(void)
                now = *next_tb - now;
                if (now <= DECREMENTER_MAX)
                        set_dec((int)now);
-               /* We may have raced with new irq work */
-               if (test_irq_work_pending())
-                       set_dec(1);
                __get_cpu_var(irq_stat).timer_irqs_others++;
        }

+       /* We may have raced with new irq work */
+       if (test_irq_work_pending())
+               set_dec(1);
+

The event_handler cannot be relied upon to call
decrementer_set_next_event() all the time. This is in the case where
there are no pending timers. In that case we need to have the check on
irq work pending at the end of __timer_interrupt() no?

Regards
Preeti U Murthy
> 
> Cheers,
> Ben.
> 
> 

^ permalink raw reply

* Re: [PATCH] powerpc: irq work racing with timer interrupt can result in timer interrupt hang
From: Benjamin Herrenschmidt @ 2014-05-11  9:03 UTC (permalink / raw)
  To: Preeti U Murthy; +Cc: paulmck, paulus, Anton Blanchard, linuxppc-dev
In-Reply-To: <536F384C.3070409@linux.vnet.ibm.com>

On Sun, 2014-05-11 at 14:13 +0530, Preeti U Murthy wrote:
> 
> Isn't this patch required too?
> 
> @@ -503,12 +503,13 @@ void __timer_interrupt(void)
>                 now = *next_tb - now;
>                 if (now <= DECREMENTER_MAX)
>                         set_dec((int)now);
> -               /* We may have raced with new irq work */
> -               if (test_irq_work_pending())
> -                       set_dec(1);
>                 __get_cpu_var(irq_stat).timer_irqs_others++;
>         }
>
> +       /* We may have raced with new irq work */
> +       if (test_irq_work_pending())
> +               set_dec(1);
> +
> 
> The event_handler cannot be relied upon to call
> decrementer_set_next_event() all the time. This is in the case where
> there are no pending timers. In that case we need to have the check on
> irq work pending at the end of __timer_interrupt() no?

I don't think we need to move the test no. If there's a pending
irq_work, at that point, it will have done set_dec when being queued up.
So we only care about cases where we might change the decrementer.

If the event handler doesn't call decrementer_set_next_event() then
nothing will modify the decrementer and it will still trigger soon.

Cheers,
Ben.

^ permalink raw reply

* Re: [PATCH] powerpc: irq work racing with timer interrupt can result in timer interrupt hang
From: Preeti U Murthy @ 2014-05-11  9:07 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: paulmck, paulus, Anton Blanchard, linuxppc-dev
In-Reply-To: <1399799008.17624.43.camel@pasglop>

On 05/11/2014 02:33 PM, Benjamin Herrenschmidt wrote:
> On Sun, 2014-05-11 at 14:13 +0530, Preeti U Murthy wrote:
>>
>> Isn't this patch required too?
>>
>> @@ -503,12 +503,13 @@ void __timer_interrupt(void)
>>                 now = *next_tb - now;
>>                 if (now <= DECREMENTER_MAX)
>>                         set_dec((int)now);
>> -               /* We may have raced with new irq work */
>> -               if (test_irq_work_pending())
>> -                       set_dec(1);
>>                 __get_cpu_var(irq_stat).timer_irqs_others++;
>>         }
>>
>> +       /* We may have raced with new irq work */
>> +       if (test_irq_work_pending())
>> +               set_dec(1);
>> +
>>
>> The event_handler cannot be relied upon to call
>> decrementer_set_next_event() all the time. This is in the case where
>> there are no pending timers. In that case we need to have the check on
>> irq work pending at the end of __timer_interrupt() no?
> 
> I don't think we need to move the test no. If there's a pending
> irq_work, at that point, it will have done set_dec when being queued up.
> So we only care about cases where we might change the decrementer.
> 
> If the event handler doesn't call decrementer_set_next_event() then
> nothing will modify the decrementer and it will still trigger soon.

Hmm ok. Then Anton's patch covers all cases :)

Thanks!

Reviewed-by: Preeti U Murthy <preeti@linux.vnet.ibm.com>

Regards
Preeti U Murthy
> 
> Cheers,
> Ben.
> 
> 

^ permalink raw reply

* Re: [PATCH] [resend] net: get rid of SET_ETHTOOL_OPS
From: Wilfried Klaebe @ 2014-05-11 12:46 UTC (permalink / raw)
  To: Anish Khurana
  Cc: devel, linux-s390, b.a.t.m.a.n, dev, xen-devel, linux-rdma,
	netdev@vger.kernel.org, linux-usb, linux-wireless,
	linux-kernel@vger.kernel.org, linux-acenic, trivial, e1000-devel,
	bridge, devel, nios2-dev, virtualization, linuxppc-dev,
	David S. Miller
In-Reply-To: <CANKiNjV7qrx-556DJk0qcOopnBs4NnKy51POEeZ7LpbdjX35OQ@mail.gmail.com>

Am Sun, May 11, 2014 at 01:13:47PM +0530 schrieb Anish Khurana:
> SET_ETHTOOL_OPS is equivalent to :
> #define SET_ETHTOOL_OPS(netdev,ops) \
>     ( (netdev)->ethtool_ops =3D (ops) )
>=20
> how it makes difference  removing this code and replacing with the
> code mentioned ?

It doesn't change anything in the resulting binaries. The whole point
is to remove the macro, which is something Dave wants to happen.

Kind regards,
Wilfried

^ permalink raw reply

* Re: linux-next: add scottwood/linux.git
From: Stephen Rothwell @ 2014-05-11 22:23 UTC (permalink / raw)
  To: Scott Wood; +Cc: linux-next, linuxppc-dev
In-Reply-To: <1399670133.15726.440.camel@snotra.buserror.net>

[-- Attachment #1: Type: text/plain, Size: 1514 bytes --]

Hi Scott,

On Fri, 9 May 2014 16:15:33 -0500 Scott Wood <scottwood@freescale.com> wrote:
>
> On Mon, 2014-03-24 at 20:09 -0500, Scott Wood wrote:
> > On Mon, 2014-03-24 at 10:33 +1100, Benjamin Herrenschmidt wrote:
> > > On Mon, 2014-03-24 at 10:16 +1100, Benjamin Herrenschmidt wrote:
> > > > On Wed, 2014-03-19 at 23:25 -0500, Scott Wood wrote:
> > > > > The following changes since commit c7e64b9ce04aa2e3fad7396d92b5cb92056d16ac:
> > > > > 
> > > > >   powerpc/powernv Platform dump interface (2014-03-07 16:19:10 +1100)
> > > > > 
> > > > > are available in the git repository at:
> > > > > 
> > > > >   git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux.git next
> > > > > 
> > > > > for you to fetch changes up to 48b16180d0d91324e5d2423c6d53d97bbe3dcc14:
> > > > > 
> > > > >   fsl/pci: The new pci suspend/resume implementation (2014-03-19 22:37:44 -0500)
> > > > 
> > > > Stephen just informed me that your tree wasn't in -next ... Kumar's
> > > > still is.
> > > > 
> > > > Can you guys fix that up ? I somewhat rely on the FSL stuff to simmer
> > > > in -next on its own.
> > 
> > Stephen, what's the process for adding a tree?
> 
> ping

Sorry, for the delay.

Just send me a git URL for your tree, and a list of the people I should
contact in case of conflicts/build/fetch problems and cc the
appropriate people/lists.

I also assume that this will actually replace Kumar's tree?
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply

* Re: linux-next: add scottwood/linux.git
From: Stephen Rothwell @ 2014-05-12  0:19 UTC (permalink / raw)
  To: Stephen Rothwell; +Cc: Scott Wood, linux-next, linuxppc-dev
In-Reply-To: <20140512082336.501fa8a2@canb.auug.org.au>

[-- Attachment #1: Type: text/plain, Size: 2671 bytes --]

Hi Scott,

On Mon, 12 May 2014 08:23:36 +1000 Stephen Rothwell <sfr@canb.auug.org.au> wrote:
>
> On Fri, 9 May 2014 16:15:33 -0500 Scott Wood <scottwood@freescale.com> wrote:
> >
> > On Mon, 2014-03-24 at 20:09 -0500, Scott Wood wrote:
> > > On Mon, 2014-03-24 at 10:33 +1100, Benjamin Herrenschmidt wrote:
> > > > On Mon, 2014-03-24 at 10:16 +1100, Benjamin Herrenschmidt wrote:
> > > > > On Wed, 2014-03-19 at 23:25 -0500, Scott Wood wrote:
> > > > > > The following changes since commit c7e64b9ce04aa2e3fad7396d92b5cb92056d16ac:
> > > > > > 
> > > > > >   powerpc/powernv Platform dump interface (2014-03-07 16:19:10 +1100)
> > > > > > 
> > > > > > are available in the git repository at:
> > > > > > 
> > > > > >   git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux.git next
> > > > > > 
> > > > > > for you to fetch changes up to 48b16180d0d91324e5d2423c6d53d97bbe3dcc14:
> > > > > > 
> > > > > >   fsl/pci: The new pci suspend/resume implementation (2014-03-19 22:37:44 -0500)
> > > > > 
> > > > > Stephen just informed me that your tree wasn't in -next ... Kumar's
> > > > > still is.
> > > > > 
> > > > > Can you guys fix that up ? I somewhat rely on the FSL stuff to simmer
> > > > > in -next on its own.
> > > 
> > > Stephen, what's the process for adding a tree?
> > 
> > ping
> 
> Sorry, for the delay.
> 
> Just send me a git URL for your tree, and a list of the people I should
> contact in case of conflicts/build/fetch problems and cc the
> appropriate people/lists.
> 
> I also assume that this will actually replace Kumar's tree?

[Preempting your reply :-)]

I have added the above tree from today (and called it "fsl") with you
as the sole contact.  Let me know if you need anything different.  I
have also removed the galak tree.

Thanks for adding your subsystem tree as a participant of linux-next.  As
you may know, this is not a judgment of your code.  The purpose of
linux-next is for integration testing and to lower the impact of
conflicts between subsystems in the next merge window. 

You will need to ensure that the patches/commits in your tree/series have
been:
     * submitted under GPL v2 (or later) and include the Contributor's
        Signed-off-by,
     * posted to the relevant mailing list,
     * reviewed by you (or another maintainer of your subsystem tree),
     * successfully unit tested, and 
     * destined for the current or next Linux merge window.

Basically, this should be just what you would send to Linus (or ask him
to fetch).  It is allowed to be rebased if you deem it necessary.

-- 
Cheers,
Stephen Rothwell 
sfr@canb.auug.org.au

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply

* Re: [PATCH] powerpc: fix skipping call to early_init_fdt_scan_reserved_mem
From: Benjamin Herrenschmidt @ 2014-05-12  0:42 UTC (permalink / raw)
  To: Rob Herring
  Cc: devicetree, Rob Herring, linux-kernel, Paul Mackerras,
	Grant Likely, linuxppc-dev, Marek Szyprowski
In-Reply-To: <1398837832-30052-1-git-send-email-robherring2@gmail.com>

On Wed, 2014-04-30 at 01:03 -0500, Rob Herring wrote:
> From: Rob Herring <robh@kernel.org>
> 
> The call to early_init_fdt_scan_reserved_mem will be skipped if
> reserved-ranges is not found. Move the call earlier so that it is called
> unconditionally.
> 
> Signed-off-by: Rob Herring <robh@kernel.org>
> Cc: Marek Szyprowski <m.szyprowski@samsung.com>

Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

> Cc: Paul Mackerras <paulus@samba.org>
> Cc: linuxppc-dev@lists.ozlabs.org
> Tested-by: Stephen Chivers <schivers@csc.com>
> ---
> I found this issue in testing of my fdt clean-up series (thanks to 
> Stephen). Since the reserved memory support is new, I don't think it is 
> critical to fix this for 3.15. I plan to include this with my fdt series 
> for 3.16 unless I hear otherwise.

Sure, go for it.

Cheers,
Ben.

> Rob
> 
>  arch/powerpc/kernel/prom.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
> index 668aa47..d657549 100644
> --- a/arch/powerpc/kernel/prom.c
> +++ b/arch/powerpc/kernel/prom.c
> @@ -567,6 +567,8 @@ static void __init early_reserve_mem_dt(void)
>  	unsigned long i, len, dt_root;
>  	const __be32 *prop;
>  
> +	early_init_fdt_scan_reserved_mem();
> +
>  	dt_root = of_get_flat_dt_root();
>  
>  	prop = of_get_flat_dt_prop(dt_root, "reserved-ranges", &len);
> @@ -589,8 +591,6 @@ static void __init early_reserve_mem_dt(void)
>  			memblock_reserve(base, size);
>  		}
>  	}
> -
> -	early_init_fdt_scan_reserved_mem();
>  }
>  
>  static void __init early_reserve_mem(void)

^ permalink raw reply

* Re: [PATCH] powerpc: reduce multi-hit of pcibios_setup_device() in hotplug
From: Benjamin Herrenschmidt @ 2014-05-12  2:59 UTC (permalink / raw)
  To: Wei Yang; +Cc: Bjorn Helgaas, linuxppc-dev, aik, gwshan
In-Reply-To: <1399530602-4231-1-git-send-email-weiyang@linux.vnet.ibm.com>

On Thu, 2014-05-08 at 14:30 +0800, Wei Yang wrote:
> During the EEH hotplug event, pcibios_setup_device() will be invoked two
> times. And the last time will trigger a warning of re-attachment of iommu
> group.
> 
> The two times are:
> 
>     pci_device_add
>         ...
>         pcibios_add_device
>         pcibios_setup_device   <- 1st time
>     pcibios_add_pci_devices
>         ...
>         pcibios_setup_bus_devices
>         pcibios_setup_device   <- 2rd time
> 
> As we see, in pcibios_add_pci_devices() the pci_bus passed in as a parameter
> is initialized and already added in the system. Which means the
> pcibios_setup_device() in pcibios_add_device() will be called. Then the
> pcibios_setup_device() in pcibios_setup_bus_devices() is the 2nd time to be
> called on the same pci_dev.

(CC'ing Bjorn to make sure I get the mess right :-)

So the patch makes me a bit nervous because we have convoluted
dependencies on some of that in the actual PCI hotplug code (the
real thing which rescans busses etc...).

I *think* the patch might be right (though incomplete) on those
grounds, but I'd like you to verify and test the various hotplug
cases in pHyp and I think issue comes from pcibios_add_device() being
somewhat a late addition.

Basically, what happens I think is at boot time:

 - bus->is_added is false, dev->is_added is false during initial probe
   of a given device. So pcibios_add_device() does nothing.

 - shortly afterward, the core calls pcibios_fixup_bus(), still with
bus->is_added set to false, which *will* do the setup because
dev->is_added is also false for all devices.

 - we set bus->is_added

 - we call pci_bus_add_devices() which sets all the dev->is_added

So far so good. Now, when we hotplug something (and there are some
distinction here depending on what hotplug path we take which is why I'd
like you to scrutinize things a bit more), we mostly hit powerpc's
pcibios_add_pci_devices().

Now this function will operate differently on a "devtree" style probe
(phyp/kvm guest) vs. a "normal" probe (other bare metal machines).

The normal case is what you are trying to fix here. It does an explicit
pcibios_setup_bus_devices() on the bus being rescanned. I think you are
right this isn't necessary. This bus has bus->is_added set to true and
thus pcibios_add_device() will do the setup for any new devices. 

That makes me think that we need a similar fix in pci_of_scan.c for
when we call of_rescan_bus(). The fix would be probably in
__of_scan_bus(), to move the call to pcibios_setup_bus_devices() inside
the if (!rescan_existing) statement, since if we are scanning an
existing bus (which thus has bus->is_added set), we know
pcibios_add_devices() will have done the updates.

In fact I wonder if we could just use bus->is_added for the test in
there and get rid of the "rescan_existing" argument completely. Worth
adding something like WARN_ON(rescan_existing != bus->is_added); and
do a few tests of hotplug to see what it looks like.

Now there are two different hotplug path at least in the pseries code,
so have a look make sure we aren't missing anything here and please test
all cases !

Cheers,
Ben.

^ permalink raw reply

* Re: [PATCH] powerpc: Fix "attempt to move .org backwards" error (again)
From: Benjamin Herrenschmidt @ 2014-05-12  4:12 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Paul Mackerras, linuxppc-dev, linux-kernel
In-Reply-To: <1399680478-4970-1-git-send-email-linux@roeck-us.net>

On Fri, 2014-05-09 at 17:07 -0700, Guenter Roeck wrote:
> Commit 4e243b7 (powerpc: Fix "attempt to move .org backwards" error) fixes the
> allyesconfig build by moving machine_check_common to a different location.
> While this fixes most of the errors, both allmodconfig and allyesconfig still
> fail as follows.
> 
> arch/powerpc/kernel/exceptions-64s.S:1315: Error: attempt to move .org backwards
> 
> Fix by moving machine_check_common after the offending address.

This suffers from the same problem as previous attempts, on some of my
test configs I get:

arch/powerpc/kernel/head_64.o:(__ftr_alt_97+0xb0): relocation truncated to fit: R_PPC64_REL14 against `.text'+1c90
make[1]: *** [vmlinux] Error 1
make: *** [sub-make] Error 2

IE, it breaks currently working configs.

So we need to move more things around and I haven't had a chance to
sort it out.

Cheers,
Ben.

^ permalink raw reply

* Re: [PATCH] powerpc: Fix "attempt to move .org backwards" error (again)
From: Guenter Roeck @ 2014-05-12  4:52 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: Paul Mackerras, linuxppc-dev, linux-kernel
In-Reply-To: <1399867920.17624.73.camel@pasglop>

On 05/11/2014 09:12 PM, Benjamin Herrenschmidt wrote:
> On Fri, 2014-05-09 at 17:07 -0700, Guenter Roeck wrote:
>> Commit 4e243b7 (powerpc: Fix "attempt to move .org backwards" error) fixes the
>> allyesconfig build by moving machine_check_common to a different location.
>> While this fixes most of the errors, both allmodconfig and allyesconfig still
>> fail as follows.
>>
>> arch/powerpc/kernel/exceptions-64s.S:1315: Error: attempt to move .org backwards
>>
>> Fix by moving machine_check_common after the offending address.
>
> This suffers from the same problem as previous attempts, on some of my
> test configs I get:
>
> arch/powerpc/kernel/head_64.o:(__ftr_alt_97+0xb0): relocation truncated to fit: R_PPC64_REL14 against `.text'+1c90
> make[1]: *** [vmlinux] Error 1
> make: *** [sub-make] Error 2
>
> IE, it breaks currently working configs.
>
Oh well, it was worth a try. Can you give me an example for a failing configuration ?

Thanks,
Guenter

^ permalink raw reply

* Re: [PATCH] powerpc: Fix "attempt to move .org backwards" error (again)
From: Benjamin Herrenschmidt @ 2014-05-12  5:37 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Paul Mackerras, linuxppc-dev, linux-kernel
In-Reply-To: <1399867920.17624.73.camel@pasglop>

On Mon, 2014-05-12 at 14:12 +1000, Benjamin Herrenschmidt wrote:
> On Fri, 2014-05-09 at 17:07 -0700, Guenter Roeck wrote:
> > Commit 4e243b7 (powerpc: Fix "attempt to move .org backwards" error) fixes the
> > allyesconfig build by moving machine_check_common to a different location.
> > While this fixes most of the errors, both allmodconfig and allyesconfig still
> > fail as follows.
> > 
> > arch/powerpc/kernel/exceptions-64s.S:1315: Error: attempt to move .org backwards
> > 
> > Fix by moving machine_check_common after the offending address.
> 
> This suffers from the same problem as previous attempts, on some of my
> test configs I get:
> 
> arch/powerpc/kernel/head_64.o:(__ftr_alt_97+0xb0): relocation truncated to fit: R_PPC64_REL14 against `.text'+1c90
> make[1]: *** [vmlinux] Error 1
> make: *** [sub-make] Error 2
> 
> IE, it breaks currently working configs.
> 
> So we need to move more things around and I haven't had a chance to
> sort it out.

Ok, I think I sorted it out for now. It's a mess and likely to break
again until we do something more drastic like moving everything that's
after 0x8000 to a separate file but for now that will do. Patch on its
way, I'll also shoot it to Linus today along with a few other things.

Cheers,
Ben.

^ permalink raw reply

* Re: [PATCH] powerpc: Fix "attempt to move .org backwards" error (again)
From: Guenter Roeck @ 2014-05-12  5:39 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: Paul Mackerras, linuxppc-dev, linux-kernel
In-Reply-To: <1399873020.17624.79.camel@pasglop>

On 05/11/2014 10:37 PM, Benjamin Herrenschmidt wrote:
> On Mon, 2014-05-12 at 14:12 +1000, Benjamin Herrenschmidt wrote:
>> On Fri, 2014-05-09 at 17:07 -0700, Guenter Roeck wrote:
>>> Commit 4e243b7 (powerpc: Fix "attempt to move .org backwards" error) fixes the
>>> allyesconfig build by moving machine_check_common to a different location.
>>> While this fixes most of the errors, both allmodconfig and allyesconfig still
>>> fail as follows.
>>>
>>> arch/powerpc/kernel/exceptions-64s.S:1315: Error: attempt to move .org backwards
>>>
>>> Fix by moving machine_check_common after the offending address.
>>
>> This suffers from the same problem as previous attempts, on some of my
>> test configs I get:
>>
>> arch/powerpc/kernel/head_64.o:(__ftr_alt_97+0xb0): relocation truncated to fit: R_PPC64_REL14 against `.text'+1c90
>> make[1]: *** [vmlinux] Error 1
>> make: *** [sub-make] Error 2
>>
>> IE, it breaks currently working configs.
>>
>> So we need to move more things around and I haven't had a chance to
>> sort it out.
>
> Ok, I think I sorted it out for now. It's a mess and likely to break
> again until we do something more drastic like moving everything that's
> after 0x8000 to a separate file but for now that will do. Patch on its
> way, I'll also shoot it to Linus today along with a few other things.
>

Great, thanks a lot!

Guenter

^ permalink raw reply

* Re: [PATCH] powerpc: Fix "attempt to move .org backwards" error (again)
From: Benjamin Herrenschmidt @ 2014-05-12  5:48 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Paul Mackerras, linuxppc-dev, linux-kernel
In-Reply-To: <5370537F.8020901@roeck-us.net>

On Sun, 2014-05-11 at 21:52 -0700, Guenter Roeck wrote:
> Oh well, it was worth a try. Can you give me an example for a failing
> configuration ?

My g5 config which is close to g5_defconfig with PR KVM enabled.

In any case, see my other messages. I'm waiting for all my test builders
to come back and if it's clear I'll post a new patch.

Cheers,
Ben.

^ permalink raw reply

* [PATCH] powerpc/ppc64: Allow allmodconfig to build (finally !)
From: Benjamin Herrenschmidt @ 2014-05-12  5:57 UTC (permalink / raw)
  To: linuxppc-dev

This shuffles code around in exceptions-64s.S in order to
allow an allmodconfig build to succeed.

The main problems were:

 - We have a fixed hole from 0x7000 to 0x8000 for use by FW,
under some circumstances the code before that would grow too
big and hit the . = 0x7000

 - The various attempts at making space in there would trigger
cases where short conditional branches from assembly would no
longer be able to reach their target. This is especially nasty
when these branches reside in alternate feature sections which
are appended at the end of each .o file

This fixes it by essentially moving all the "second level"
exception handlers to after the hole and moving a couple of
functions near the hole itself so they sit at reachable distance
of both the first level handlers (before the hole) and the alternate
feature sections (end of file).

In the long run, if we start hitting this again, we'll probably
have to split the file in two, probably at the hole location,
to keep the alt sections used by the first level handlers close
to them, and move everything else further away.

But for now, this will do.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---

diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 3afd391..833a68d 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -533,70 +533,6 @@ do_stab_bolted_pSeries:
 	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x900)
 	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x982)
 
-#ifdef CONFIG_PPC_DENORMALISATION
-denorm_assist:
-BEGIN_FTR_SECTION
-/*
- * To denormalise we need to move a copy of the register to itself.
- * For POWER6 do that here for all FP regs.
- */
-	mfmsr	r10
-	ori	r10,r10,(MSR_FP|MSR_FE0|MSR_FE1)
-	xori	r10,r10,(MSR_FE0|MSR_FE1)
-	mtmsrd	r10
-	sync
-
-#define FMR2(n)  fmr (n), (n) ; fmr n+1, n+1
-#define FMR4(n)  FMR2(n) ; FMR2(n+2)
-#define FMR8(n)  FMR4(n) ; FMR4(n+4)
-#define FMR16(n) FMR8(n) ; FMR8(n+8)
-#define FMR32(n) FMR16(n) ; FMR16(n+16)
-	FMR32(0)
-
-FTR_SECTION_ELSE
-/*
- * To denormalise we need to move a copy of the register to itself.
- * For POWER7 do that here for the first 32 VSX registers only.
- */
-	mfmsr	r10
-	oris	r10,r10,MSR_VSX@h
-	mtmsrd	r10
-	sync
-
-#define XVCPSGNDP2(n) XVCPSGNDP(n,n,n) ; XVCPSGNDP(n+1,n+1,n+1)
-#define XVCPSGNDP4(n) XVCPSGNDP2(n) ; XVCPSGNDP2(n+2)
-#define XVCPSGNDP8(n) XVCPSGNDP4(n) ; XVCPSGNDP4(n+4)
-#define XVCPSGNDP16(n) XVCPSGNDP8(n) ; XVCPSGNDP8(n+8)
-#define XVCPSGNDP32(n) XVCPSGNDP16(n) ; XVCPSGNDP16(n+16)
-	XVCPSGNDP32(0)
-
-ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206)
-
-BEGIN_FTR_SECTION
-	b	denorm_done
-END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
-/*
- * To denormalise we need to move a copy of the register to itself.
- * For POWER8 we need to do that for all 64 VSX registers
- */
-	XVCPSGNDP32(32)
-denorm_done:
-	mtspr	SPRN_HSRR0,r11
-	mtcrf	0x80,r9
-	ld	r9,PACA_EXGEN+EX_R9(r13)
-	RESTORE_PPR_PACA(PACA_EXGEN, r10)
-BEGIN_FTR_SECTION
-	ld	r10,PACA_EXGEN+EX_CFAR(r13)
-	mtspr	SPRN_CFAR,r10
-END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
-	ld	r10,PACA_EXGEN+EX_R10(r13)
-	ld	r11,PACA_EXGEN+EX_R11(r13)
-	ld	r12,PACA_EXGEN+EX_R12(r13)
-	ld	r13,PACA_EXGEN+EX_R13(r13)
-	HRFID
-	b	.
-#endif
-
 	.align	7
 	/* moved from 0xe00 */
 	STD_EXCEPTION_HV_OOL(0xe02, h_data_storage)
@@ -623,43 +559,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
 	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xf82)
 
 /*
- * An interrupt came in while soft-disabled. We set paca->irq_happened, then:
- * - If it was a decrementer interrupt, we bump the dec to max and and return.
- * - If it was a doorbell we return immediately since doorbells are edge
- *   triggered and won't automatically refire.
- * - else we hard disable and return.
- * This is called with r10 containing the value to OR to the paca field.
- */
-#define MASKED_INTERRUPT(_H)				\
-masked_##_H##interrupt:					\
-	std	r11,PACA_EXGEN+EX_R11(r13);		\
-	lbz	r11,PACAIRQHAPPENED(r13);		\
-	or	r11,r11,r10;				\
-	stb	r11,PACAIRQHAPPENED(r13);		\
-	cmpwi	r10,PACA_IRQ_DEC;			\
-	bne	1f;					\
-	lis	r10,0x7fff;				\
-	ori	r10,r10,0xffff;				\
-	mtspr	SPRN_DEC,r10;				\
-	b	2f;					\
-1:	cmpwi	r10,PACA_IRQ_DBELL;			\
-	beq	2f;					\
-	mfspr	r10,SPRN_##_H##SRR1;			\
-	rldicl	r10,r10,48,1; /* clear MSR_EE */	\
-	rotldi	r10,r10,16;				\
-	mtspr	SPRN_##_H##SRR1,r10;			\
-2:	mtcrf	0x80,r9;				\
-	ld	r9,PACA_EXGEN+EX_R9(r13);		\
-	ld	r10,PACA_EXGEN+EX_R10(r13);		\
-	ld	r11,PACA_EXGEN+EX_R11(r13);		\
-	GET_SCRATCH0(r13);				\
-	##_H##rfid;					\
-	b	.
-	
-	MASKED_INTERRUPT()
-	MASKED_INTERRUPT(H)
-
-/*
  * Called from arch_local_irq_enable when an interrupt needs
  * to be resent. r3 contains 0x500, 0x900, 0xa00 or 0xe80 to indicate
  * which kind of interrupt. MSR:EE is already off. We generate a
@@ -759,50 +658,6 @@ kvmppc_skip_Hinterrupt:
 	b	.
 #endif
 
-/*
- * Code from here down to __end_handlers is invoked from the
- * exception prologs above.  Because the prologs assemble the
- * addresses of these handlers using the LOAD_HANDLER macro,
- * which uses an ori instruction, these handlers must be in
- * the first 64k of the kernel image.
- */
-
-/*** Common interrupt handlers ***/
-
-	STD_EXCEPTION_COMMON(0x100, system_reset, .system_reset_exception)
-
-	STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ)
-	STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt)
-	STD_EXCEPTION_COMMON(0x980, hdecrementer, .hdec_interrupt)
-#ifdef CONFIG_PPC_DOORBELL
-	STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .doorbell_exception)
-#else
-	STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .unknown_exception)
-#endif
-	STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)
-	STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)
-	STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception)
-	STD_EXCEPTION_COMMON(0xe40, emulation_assist, .emulation_assist_interrupt)
-	STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception)
-#ifdef CONFIG_PPC_DOORBELL
-	STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception)
-#else
-	STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .unknown_exception)
-#endif
-	STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception)
-	STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception)
-	STD_EXCEPTION_COMMON(0x1502, denorm, .unknown_exception)
-#ifdef CONFIG_ALTIVEC
-	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .altivec_assist_exception)
-#else
-	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception)
-#endif
-#ifdef CONFIG_CBE_RAS
-	STD_EXCEPTION_COMMON(0x1200, cbe_system_error, .cbe_system_error_exception)
-	STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, .cbe_maintenance_exception)
-	STD_EXCEPTION_COMMON(0x1800, cbe_thermal, .cbe_thermal_exception)
-#endif /* CONFIG_CBE_RAS */
-
 	/*
 	 * Relocation-on interrupts: A subset of the interrupts can be delivered
 	 * with IR=1/DR=1, if AIL==2 and MSR.HV won't be changed by delivering
@@ -949,6 +804,17 @@ hv_facility_unavailable_relon_trampoline:
 #endif
 	STD_RELON_EXCEPTION_PSERIES(0x5700, 0x1700, altivec_assist)
 
+	/* Equivalents to the above handlers for relocation-on interrupt vectors */
+	STD_RELON_EXCEPTION_HV_OOL(0xe40, emulation_assist)
+	MASKABLE_RELON_EXCEPTION_HV_OOL(0xe80, h_doorbell)
+
+	STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor)
+	STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable)
+	STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable)
+	STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, facility_unavailable)
+	STD_RELON_EXCEPTION_HV_OOL(0xf80, hv_facility_unavailable)
+
+
 	/* Other future vectors */
 	.align	7
 	.globl	__end_interrupts
@@ -1028,11 +894,183 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
 	bl	.kernel_bad_stack
 	b	1b
 
+
+#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
 /*
- * Here r13 points to the paca, r9 contains the saved CR,
- * SRR0 and SRR1 are saved in r11 and r12,
- * r9 - r13 are saved in paca->exgen.
+ * Data area reserved for FWNMI option.
+ * This address (0x7000) is fixed by the RPA.
  */
+	.= 0x7000
+	.globl fwnmi_data_area
+fwnmi_data_area:
+
+	/* pseries and powernv need to keep the whole page from
+	 * 0x7000 to 0x8000 free for use by the firmware
+	 */
+	. = 0x8000
+#endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */
+
+/*
+ * Denorm interrupt assist moved out of line to here, where it remains
+ * close enough to the call site which uses a small conditional branch
+ */
+#ifdef CONFIG_PPC_DENORMALISATION
+denorm_assist:
+BEGIN_FTR_SECTION
+/*
+ * To denormalise we need to move a copy of the register to itself.
+ * For POWER6 do that here for all FP regs.
+ */
+	mfmsr	r10
+	ori	r10,r10,(MSR_FP|MSR_FE0|MSR_FE1)
+	xori	r10,r10,(MSR_FE0|MSR_FE1)
+	mtmsrd	r10
+	sync
+
+#define FMR2(n)  fmr (n), (n) ; fmr n+1, n+1
+#define FMR4(n)  FMR2(n) ; FMR2(n+2)
+#define FMR8(n)  FMR4(n) ; FMR4(n+4)
+#define FMR16(n) FMR8(n) ; FMR8(n+8)
+#define FMR32(n) FMR16(n) ; FMR16(n+16)
+	FMR32(0)
+
+FTR_SECTION_ELSE
+/*
+ * To denormalise we need to move a copy of the register to itself.
+ * For POWER7 do that here for the first 32 VSX registers only.
+ */
+	mfmsr	r10
+	oris	r10,r10,MSR_VSX@h
+	mtmsrd	r10
+	sync
+
+#define XVCPSGNDP2(n) XVCPSGNDP(n,n,n) ; XVCPSGNDP(n+1,n+1,n+1)
+#define XVCPSGNDP4(n) XVCPSGNDP2(n) ; XVCPSGNDP2(n+2)
+#define XVCPSGNDP8(n) XVCPSGNDP4(n) ; XVCPSGNDP4(n+4)
+#define XVCPSGNDP16(n) XVCPSGNDP8(n) ; XVCPSGNDP8(n+8)
+#define XVCPSGNDP32(n) XVCPSGNDP16(n) ; XVCPSGNDP16(n+16)
+	XVCPSGNDP32(0)
+
+ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206)
+
+BEGIN_FTR_SECTION
+	b	denorm_done
+END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
+/*
+ * To denormalise we need to move a copy of the register to itself.
+ * For POWER8 we need to do that for all 64 VSX registers
+ */
+	XVCPSGNDP32(32)
+denorm_done:
+	mtspr	SPRN_HSRR0,r11
+	mtcrf	0x80,r9
+	ld	r9,PACA_EXGEN+EX_R9(r13)
+	RESTORE_PPR_PACA(PACA_EXGEN, r10)
+BEGIN_FTR_SECTION
+	ld	r10,PACA_EXGEN+EX_CFAR(r13)
+	mtspr	SPRN_CFAR,r10
+END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
+	ld	r10,PACA_EXGEN+EX_R10(r13)
+	ld	r11,PACA_EXGEN+EX_R11(r13)
+	ld	r12,PACA_EXGEN+EX_R12(r13)
+	ld	r13,PACA_EXGEN+EX_R13(r13)
+	HRFID
+	b	.
+#endif
+
+/*
+ * An interrupt came in while soft-disabled. We set paca->irq_happened, then:
+ * - If it was a decrementer interrupt, we bump the dec to max and and return.
+ * - If it was a doorbell we return immediately since doorbells are edge
+ *   triggered and won't automatically refire.
+ * - else we hard disable and return.
+ * This is called with r10 containing the value to OR to the paca field.
+ *
+ * Warning: This code is reached using a (small) conditional branch from both
+ * the 1st level exception handlers below 0x8000 and the alternate feature
+ * sections of that file which the linker puts right after the text in here.
+ *
+ * For that to work, we thus need this code to be roughly near the "middle"
+ * so that we can reach it with <32k offsets. Here works... for now.
+ */
+#define MASKED_INTERRUPT(_H)				\
+masked_##_H##interrupt:					\
+	std	r11,PACA_EXGEN+EX_R11(r13);		\
+	lbz	r11,PACAIRQHAPPENED(r13);		\
+	or	r11,r11,r10;				\
+	stb	r11,PACAIRQHAPPENED(r13);		\
+	cmpwi	r10,PACA_IRQ_DEC;			\
+	bne	1f;					\
+	lis	r10,0x7fff;				\
+	ori	r10,r10,0xffff;				\
+	mtspr	SPRN_DEC,r10;				\
+	b	2f;					\
+1:	cmpwi	r10,PACA_IRQ_DBELL;			\
+	beq	2f;					\
+	mfspr	r10,SPRN_##_H##SRR1;			\
+	rldicl	r10,r10,48,1; /* clear MSR_EE */	\
+	rotldi	r10,r10,16;				\
+	mtspr	SPRN_##_H##SRR1,r10;			\
+2:	mtcrf	0x80,r9;				\
+	ld	r9,PACA_EXGEN+EX_R9(r13);		\
+	ld	r10,PACA_EXGEN+EX_R10(r13);		\
+	ld	r11,PACA_EXGEN+EX_R11(r13);		\
+	GET_SCRATCH0(r13);				\
+	##_H##rfid;					\
+	b	.
+
+	MASKED_INTERRUPT()
+	MASKED_INTERRUPT(H)
+
+/*
+ * Code from here down to __end_handlers is invoked from the
+ * exception prologs above.  Because the prologs assemble the
+ * addresses of these handlers using the LOAD_HANDLER macro,
+ * which uses an ori instruction, these handlers must be in
+ * the first 64k of the kernel image.
+ */
+
+/*** Common interrupt handlers ***/
+
+	STD_EXCEPTION_COMMON(0x100, system_reset, .system_reset_exception)
+
+	STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ)
+	STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt)
+	STD_EXCEPTION_COMMON(0x980, hdecrementer, .hdec_interrupt)
+#ifdef CONFIG_PPC_DOORBELL
+	STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .doorbell_exception)
+#else
+	STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .unknown_exception)
+#endif
+	STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)
+	STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)
+	STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception)
+	STD_EXCEPTION_COMMON(0xe40, emulation_assist, .emulation_assist_interrupt)
+	STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception)
+#ifdef CONFIG_PPC_DOORBELL
+	STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception)
+#else
+	STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .unknown_exception)
+#endif
+	STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception)
+	STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception)
+	STD_EXCEPTION_COMMON(0x1502, denorm, .unknown_exception)
+#ifdef CONFIG_ALTIVEC
+	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .altivec_assist_exception)
+#else
+	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception)
+#endif
+#ifdef CONFIG_CBE_RAS
+	STD_EXCEPTION_COMMON(0x1200, cbe_system_error, .cbe_system_error_exception)
+	STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, .cbe_maintenance_exception)
+	STD_EXCEPTION_COMMON(0x1800, cbe_thermal, .cbe_thermal_exception)
+#endif /* CONFIG_CBE_RAS */
+
+	/*
+	 * Here r13 points to the paca, r9 contains the saved CR,
+	 * SRR0 and SRR1 are saved in r11 and r12,
+	 * r9 - r13 are saved in paca->exgen.
+	 */
 	.align	7
 	.globl data_access_common
 data_access_common:
@@ -1075,69 +1113,6 @@ instruction_access_common:
 
 	STD_EXCEPTION_COMMON(0xe20, h_instr_storage, .unknown_exception)
 
-/*
- * Here is the common SLB miss user that is used when going to virtual
- * mode for SLB misses, that is currently not used
- */
-#ifdef __DISABLED__
-	.align	7
-	.globl	slb_miss_user_common
-slb_miss_user_common:
-	mflr	r10
-	std	r3,PACA_EXGEN+EX_DAR(r13)
-	stw	r9,PACA_EXGEN+EX_CCR(r13)
-	std	r10,PACA_EXGEN+EX_LR(r13)
-	std	r11,PACA_EXGEN+EX_SRR0(r13)
-	bl	.slb_allocate_user
-
-	ld	r10,PACA_EXGEN+EX_LR(r13)
-	ld	r3,PACA_EXGEN+EX_R3(r13)
-	lwz	r9,PACA_EXGEN+EX_CCR(r13)
-	ld	r11,PACA_EXGEN+EX_SRR0(r13)
-	mtlr	r10
-	beq-	slb_miss_fault
-
-	andi.	r10,r12,MSR_RI		/* check for unrecoverable exception */
-	beq-	unrecov_user_slb
-	mfmsr	r10
-
-.machine push
-.machine "power4"
-	mtcrf	0x80,r9
-.machine pop
-
-	clrrdi	r10,r10,2		/* clear RI before setting SRR0/1 */
-	mtmsrd	r10,1
-
-	mtspr	SRR0,r11
-	mtspr	SRR1,r12
-
-	ld	r9,PACA_EXGEN+EX_R9(r13)
-	ld	r10,PACA_EXGEN+EX_R10(r13)
-	ld	r11,PACA_EXGEN+EX_R11(r13)
-	ld	r12,PACA_EXGEN+EX_R12(r13)
-	ld	r13,PACA_EXGEN+EX_R13(r13)
-	rfid
-	b	.
-
-slb_miss_fault:
-	EXCEPTION_PROLOG_COMMON(0x380, PACA_EXGEN)
-	ld	r4,PACA_EXGEN+EX_DAR(r13)
-	li	r5,0
-	std	r4,_DAR(r1)
-	std	r5,_DSISR(r1)
-	b	handle_page_fault
-
-unrecov_user_slb:
-	EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN)
-	DISABLE_INTS
-	bl	.save_nvgprs
-1:	addi	r3,r1,STACK_FRAME_OVERHEAD
-	bl	.unrecoverable_exception
-	b	1b
-
-#endif /* __DISABLED__ */
-
 
 	/*
 	 * Machine check is different because we use a different
@@ -1297,30 +1272,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
 	.globl	__end_handlers
 __end_handlers:
 
-	/* Equivalents to the above handlers for relocation-on interrupt vectors */
-	STD_RELON_EXCEPTION_HV_OOL(0xe40, emulation_assist)
-	MASKABLE_RELON_EXCEPTION_HV_OOL(0xe80, h_doorbell)
-
-	STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor)
-	STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable)
-	STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable)
-	STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, facility_unavailable)
-	STD_RELON_EXCEPTION_HV_OOL(0xf80, hv_facility_unavailable)
-
-#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
-/*
- * Data area reserved for FWNMI option.
- * This address (0x7000) is fixed by the RPA.
- */
-	.= 0x7000
-	.globl fwnmi_data_area
-fwnmi_data_area:
-
-	/* pseries and powernv need to keep the whole page from
-	 * 0x7000 to 0x8000 free for use by the firmware
-	 */
-	. = 0x8000
-#endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */
 
 /* Space for CPU0's segment table */
 	.balign 4096

^ permalink raw reply related

* [PATCH] powerpc: module: fix stubs for BE
From: Rusty Russell @ 2014-05-12  7:45 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: Alistair Popple, Anton Blanchard, linuxppc-dev

A simple patch which was supposed to swap r12 and r11 also
inexplicably changed the offset by two bytes.  This instruction
(to load r2) isn't used in LE, so it wasn't noticed.

Fixes: b1ce369e82 ("powerpc: modules: use r12 for stub jump address.)
Reported-by: Alistair Popple <alistair@popple.id.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Tested-by: Alistair Popple <alistair@popple.id.au>

diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
index ef349d0..077d2ce 100644
--- a/arch/powerpc/kernel/module_64.c
+++ b/arch/powerpc/kernel/module_64.c
@@ -134,7 +134,7 @@ static u32 ppc64_stub_insns[] = {
 	0xe98b0020,			/* ld      r12,32(r11) */
 #if !defined(_CALL_ELF) || _CALL_ELF != 2
 	/* Set up new r2 from function descriptor */
-	0xe84b0026,			/* ld      r2,40(r11) */
+	0xe84b0028,			/* ld      r2,40(r11) */
 #endif
 	0x7d8903a6,			/* mtctr   r12 */
 	0x4e800420			/* bctr */

^ permalink raw reply related

* Re: [PATCH] printk/of_serial: fix serial console cessation part way through boot.
From: Geert Uytterhoeven @ 2014-05-12  9:33 UTC (permalink / raw)
  To: Stephen Chivers
  Cc: devicetree@vger.kernel.org, linux-serial, Greg KH,
	linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org,
	rob+dt, Grant Likely, Jiri Slaby, Chris Proctor
In-Reply-To: <20140510053734.AF4E9E0692@canberra.localdomain>

Hi Stephen,

On Sat, May 10, 2014 at 7:37 AM, Stephen Chivers <schivers@csc.com> wrote:
> Commit 5f5c9ae56c38942623f69c3e6dc6ec78e4da2076
> "serial_core: Unregister console in uart_remove_one_port()"
> fixed a crash where a serial port was removed but
> not deregistered as a console.
>
> There is a side effect of that commit for platforms having serial consoles
> and of_serial configured (CONFIG_SERIAL_OF_PLATFORM). The serial console
> is disabled midway through the boot process.
>
> This cessation of the serial console affects PowerPC computers
> such as the MVME5100 and SAM440EP.
>
> The sequence is:
>
>         bootconsole [udbg0] enabled
>         ....
>         serial8250/16550 driver initialises and registers its UARTS,
>         one of these is the serial console.
>         console [ttyS0] enabled
>         ....
>         of_serial probes "platform" devices, registering them as it goes.
>         One of these is the serial console.
>         console [ttyS0] disabled.
>
> The disabling of the serial console is due to:
>
>         a.  unregister_console in printk not clearing the
>             CONS_ENABLED bit in the console flags,
>             even though it has announced that the console is disabled; and

This part re-attaches the serial console on unbind/bind with the sh-sci driver,
too, which didn't work before. Cool, thanks!

>         b.  of_platform_serial_probe in of_serial not setting the port type
>             before it registers with serial8250_register_8250_port.

This part I couldn't test.

> This patch ensures that the serial console is re-enabled when of_serial
> registers a serial port that corresponds to the designated console.
>
> Signed-off-by: Stephen Chivers <schivers@csc.com>
> Tested-by: Stephen Chivers <schivers@csc.com>

Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> [unregister_console]

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply

* [PATCH] powerpc/corenet64_smp_defconfig: enable CONFIG_I2C_MUX and CONFIG_I2C_MUX_PCA954x
From: Shengzhou Liu @ 2014-05-12 10:31 UTC (permalink / raw)
  To: linuxppc-dev, scottwood; +Cc: Shengzhou Liu

By default we enable CONFIG_I2C_MUX and CONFIG_I2C_MUX_PCA954x,
which are needed on T2080QDS, T4240QDS, B4860QDS, etc.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
---
 arch/powerpc/configs/corenet64_smp_defconfig | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/powerpc/configs/corenet64_smp_defconfig b/arch/powerpc/configs/corenet64_smp_defconfig
index 63508dd..bbd70bb 100644
--- a/arch/powerpc/configs/corenet64_smp_defconfig
+++ b/arch/powerpc/configs/corenet64_smp_defconfig
@@ -111,6 +111,8 @@ CONFIG_SERIAL_8250_RSA=y
 CONFIG_I2C=y
 CONFIG_I2C_CHARDEV=y
 CONFIG_I2C_MPC=y
+CONFIG_I2C_MUX=y
+CONFIG_I2C_MUX_PCA954x=y
 CONFIG_SPI=y
 CONFIG_SPI_GPIO=y
 CONFIG_SPI_FSL_SPI=y
-- 
1.8.0

^ permalink raw reply related

* [PATCH V6 1/2] KVM: PPC: BOOK3S: Always use the saved DAR value
From: Aneesh Kumar K.V @ 2014-05-12 11:34 UTC (permalink / raw)
  To: agraf, benh, paulus; +Cc: linuxppc-dev, kvm, kvm-ppc, Aneesh Kumar K.V

Although it's optional, IBM POWER cpus always had DAR value set on
alignment interrupt. So don't try to compute these values.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
Changes from V5:
* Split the patch to two and also update commit message

 arch/powerpc/kvm/book3s_emulate.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
index 99d40f8977e8..5d0f71663b99 100644
--- a/arch/powerpc/kvm/book3s_emulate.c
+++ b/arch/powerpc/kvm/book3s_emulate.c
@@ -611,6 +611,12 @@ u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst)
 
 ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst)
 {
+#ifdef CONFIG_PPC_BOOK3S_64
+	/*
+	 * Linux's fix_alignment() assumes that DAR is valid, so can we
+	 */
+	return vcpu->arch.fault_dar;
+#else
 	ulong dar = 0;
 	ulong ra = get_ra(inst);
 	ulong rb = get_rb(inst);
@@ -635,4 +641,5 @@ ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst)
 	}
 
 	return dar;
+#endif
 }
-- 
1.9.1

^ permalink raw reply related

* [PATCH V6 2/2] KVM: PPC: BOOK3S: Remove open coded make_dsisr in alignment handler
From: Aneesh Kumar K.V @ 2014-05-12 11:34 UTC (permalink / raw)
  To: agraf, benh, paulus; +Cc: linuxppc-dev, kvm, kvm-ppc, Aneesh Kumar K.V
In-Reply-To: <1399894447-11322-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

Use make_dsisr instead of open coding it. This also have
the added benefit of handling alignment interrupt on additional
instructions.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/disassemble.h | 34 +++++++++++++++++++++++++++++
 arch/powerpc/kernel/align.c            | 34 +----------------------------
 arch/powerpc/kvm/book3s_emulate.c      | 39 +---------------------------------
 3 files changed, 36 insertions(+), 71 deletions(-)

diff --git a/arch/powerpc/include/asm/disassemble.h b/arch/powerpc/include/asm/disassemble.h
index 856f8deb557a..6330a61b875a 100644
--- a/arch/powerpc/include/asm/disassemble.h
+++ b/arch/powerpc/include/asm/disassemble.h
@@ -81,4 +81,38 @@ static inline unsigned int get_oc(u32 inst)
 {
 	return (inst >> 11) & 0x7fff;
 }
+
+#define IS_XFORM(inst)	(get_op(inst)  == 31)
+#define IS_DSFORM(inst)	(get_op(inst) >= 56)
+
+/*
+ * Create a DSISR value from the instruction
+ */
+static inline unsigned make_dsisr(unsigned instr)
+{
+	unsigned dsisr;
+
+
+	/* bits  6:15 --> 22:31 */
+	dsisr = (instr & 0x03ff0000) >> 16;
+
+	if (IS_XFORM(instr)) {
+		/* bits 29:30 --> 15:16 */
+		dsisr |= (instr & 0x00000006) << 14;
+		/* bit     25 -->    17 */
+		dsisr |= (instr & 0x00000040) << 8;
+		/* bits 21:24 --> 18:21 */
+		dsisr |= (instr & 0x00000780) << 3;
+	} else {
+		/* bit      5 -->    17 */
+		dsisr |= (instr & 0x04000000) >> 12;
+		/* bits  1: 4 --> 18:21 */
+		dsisr |= (instr & 0x78000000) >> 17;
+		/* bits 30:31 --> 12:13 */
+		if (IS_DSFORM(instr))
+			dsisr |= (instr & 0x00000003) << 18;
+	}
+
+	return dsisr;
+}
 #endif /* __ASM_PPC_DISASSEMBLE_H__ */
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c
index 94908af308d8..34f55524d456 100644
--- a/arch/powerpc/kernel/align.c
+++ b/arch/powerpc/kernel/align.c
@@ -25,14 +25,13 @@
 #include <asm/cputable.h>
 #include <asm/emulated_ops.h>
 #include <asm/switch_to.h>
+#include <asm/disassemble.h>
 
 struct aligninfo {
 	unsigned char len;
 	unsigned char flags;
 };
 
-#define IS_XFORM(inst)	(((inst) >> 26) == 31)
-#define IS_DSFORM(inst)	(((inst) >> 26) >= 56)
 
 #define INVALID	{ 0, 0 }
 
@@ -192,37 +191,6 @@ static struct aligninfo aligninfo[128] = {
 };
 
 /*
- * Create a DSISR value from the instruction
- */
-static inline unsigned make_dsisr(unsigned instr)
-{
-	unsigned dsisr;
-
-
-	/* bits  6:15 --> 22:31 */
-	dsisr = (instr & 0x03ff0000) >> 16;
-
-	if (IS_XFORM(instr)) {
-		/* bits 29:30 --> 15:16 */
-		dsisr |= (instr & 0x00000006) << 14;
-		/* bit     25 -->    17 */
-		dsisr |= (instr & 0x00000040) << 8;
-		/* bits 21:24 --> 18:21 */
-		dsisr |= (instr & 0x00000780) << 3;
-	} else {
-		/* bit      5 -->    17 */
-		dsisr |= (instr & 0x04000000) >> 12;
-		/* bits  1: 4 --> 18:21 */
-		dsisr |= (instr & 0x78000000) >> 17;
-		/* bits 30:31 --> 12:13 */
-		if (IS_DSFORM(instr))
-			dsisr |= (instr & 0x00000003) << 18;
-	}
-
-	return dsisr;
-}
-
-/*
  * The dcbz (data cache block zero) instruction
  * gives an alignment fault if used on non-cacheable
  * memory.  We handle the fault mainly for the
diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
index 5d0f71663b99..6bbdb3d1ec77 100644
--- a/arch/powerpc/kvm/book3s_emulate.c
+++ b/arch/powerpc/kvm/book3s_emulate.c
@@ -569,44 +569,7 @@ unprivileged:
 
 u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst)
 {
-	u32 dsisr = 0;
-
-	/*
-	 * This is what the spec says about DSISR bits (not mentioned = 0):
-	 *
-	 * 12:13		[DS]	Set to bits 30:31
-	 * 15:16		[X]	Set to bits 29:30
-	 * 17			[X]	Set to bit 25
-	 *			[D/DS]	Set to bit 5
-	 * 18:21		[X]	Set to bits 21:24
-	 *			[D/DS]	Set to bits 1:4
-	 * 22:26			Set to bits 6:10 (RT/RS/FRT/FRS)
-	 * 27:31			Set to bits 11:15 (RA)
-	 */
-
-	switch (get_op(inst)) {
-	/* D-form */
-	case OP_LFS:
-	case OP_LFD:
-	case OP_STFD:
-	case OP_STFS:
-		dsisr |= (inst >> 12) & 0x4000;	/* bit 17 */
-		dsisr |= (inst >> 17) & 0x3c00; /* bits 18:21 */
-		break;
-	/* X-form */
-	case 31:
-		dsisr |= (inst << 14) & 0x18000; /* bits 15:16 */
-		dsisr |= (inst << 8)  & 0x04000; /* bit 17 */
-		dsisr |= (inst << 3)  & 0x03c00; /* bits 18:21 */
-		break;
-	default:
-		printk(KERN_INFO "KVM: Unaligned instruction 0x%x\n", inst);
-		break;
-	}
-
-	dsisr |= (inst >> 16) & 0x03ff; /* bits 22:31 */
-
-	return dsisr;
+	return make_dsisr(inst);
 }
 
 ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst)
-- 
1.9.1

^ permalink raw reply related

* Re: [PATCH V6 1/2] KVM: PPC: BOOK3S: Always use the saved DAR value
From: Alexander Graf @ 2014-05-12 13:01 UTC (permalink / raw)
  To: Aneesh Kumar K.V, benh, paulus; +Cc: linuxppc-dev, kvm, kvm-ppc
In-Reply-To: <1399894447-11322-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>


On 12.05.14 13:34, Aneesh Kumar K.V wrote:
> Although it's optional, IBM POWER cpus always had DAR value set on
> alignment interrupt. So don't try to compute these values.
>
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Thanks, applied both to kvm-ppc-queue.


Alex

^ permalink raw reply

* Re: [PATCH] [resend] net: get rid of SET_ETHTOOL_OPS
From: Felipe Balbi @ 2014-05-12 14:49 UTC (permalink / raw)
  To: netdev, David S. Miller, linux-rdma, linux-acenic, nios2-dev,
	linuxppc-dev, e1000-devel, devel, linux-usb, virtualization,
	linux-wireless, xen-devel, linux-s390, devel, b.a.t.m.a.n, bridge,
	dev, trivial, linux-kernel
In-Reply-To: <20140511001231.GC7875@kaos.lebenslange-mailadresse.de>

[-- Attachment #1: Type: text/plain, Size: 655 bytes --]

On Sun, May 11, 2014 at 12:12:32AM +0000, Wilfried Klaebe wrote:
> net: get rid of SET_ETHTOOL_OPS
> 
> Dave Miller mentioned he'd like to see SET_ETHTOOL_OPS gone.
> This does that.
> 
> Mostly done via coccinelle script:
> @@
> struct ethtool_ops *ops;
> struct net_device *dev;
> @@
> -       SET_ETHTOOL_OPS(dev, ops);
> +       dev->ethtool_ops = ops;
> 
> Compile tested only, but I'd seriously wonder if this broke anything.
> 
> Suggested-by: Dave Miller <davem@davemloft.net>
> Signed-off-by: Wilfried Klaebe <w-lkml@lebenslange-mailadresse.de>

for drivers/usb/gadget/:

Acked-by: Felipe Balbi <balbi@ti.com>

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply

* [PATCH] powerpc: fix build of epapr_paravirt on 64-bit book3s
From: Scott Wood @ 2014-05-12 15:31 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Scott Wood, Stuart Yoder

This fixes an allyesconfig build break introduced by commit
7762b1ed7aaee223230793fcee80672e2e3aa7a8 "powerpc: move epapr paravirt
init of power_save to an initcall".

Signed-off-by: Scott Wood <scottwood@freescale.com>
Cc: Stuart Yoder <stuart.yoder@freescale.com>
---
 arch/powerpc/kernel/epapr_paravirt.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/powerpc/kernel/epapr_paravirt.c b/arch/powerpc/kernel/epapr_paravirt.c
index 8a7a62c..eab2f2a 100644
--- a/arch/powerpc/kernel/epapr_paravirt.c
+++ b/arch/powerpc/kernel/epapr_paravirt.c
@@ -73,8 +73,10 @@ int __init epapr_paravirt_early_init(void)
 
 static int __init epapr_idle_init(void)
 {
+#if !defined(CONFIG_64BIT) || defined(CONFIG_PPC_BOOK3E_64)
 	if (epapr_has_idle)
 		ppc_md.power_save = epapr_ev_idle;
+#endif
 
 	return 0;
 }
-- 
1.9.1

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox