Subject: Re: Netpoll controller support for PPC EMAC driver

From: "John W. Linville" <[email-masked]>
Date: Thu, 8 Dec 2005 09:57:18 -0500

On Thu, Dec 08, 2005 at 03:34:15PM +0300, Ruslan V. Sushko wrote:
> This patch adds netpoll controller support for PPC EMAC driver
> 
> Signed-off-by: Ruslan V. Sushko <[email-masked]>

Patches in-line are easier to review... :-)

> @@ -1071,8 +1071,16 @@ static int emac_start_xmit(struct sk_buf
>  	struct ocp_enet_private *dev = ndev->priv;
>  	unsigned int len = skb->len;
>  	int slot;
> +	u16 ctrl;
>  
> -	u16 ctrl = EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP | MAL_TX_CTRL_READY |
> +#ifdef CONFIG_NET_POLL_CONTROLLER
> +	if (unlikely(dev->tx_cnt == NUM_TX_BUFF)) {
> +		netif_stop_queue(ndev);
> +		return -EBUSY;
> +	}
> +#endif

Why is this necessary?

> +
> +	ctrl = EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP | MAL_TX_CTRL_READY |
>  	    MAL_TX_CTRL_LAST | emac_tx_csum(dev, skb);
>  
>  	slot = dev->tx_slot++;
> @@ -1938,6 +1946,33 @@ static int emac_ioctl(struct net_device 
>  		return -EOPNOTSUPP;
>  	}
>  }
> +#ifdef CONFIG_NET_POLL_CONTROLLER
> +void
> +poll_ctrl(struct net_device *dev)
> +{
> +	int budget = 16;
> +	struct ibm_ocp_mal *mal = ((struct ocp_enet_private*)(dev->priv))->mal;
> +	struct net_device *poll_dev = &(mal->poll_dev);
> +
> +	/* disable  MAL interrupts */
> +	mal_disable_eob_irq(mal);
> +	netif_poll_disable(poll_dev);

Is the call to netif_poll_disable necessary?  Aren't NAPI and netpoll
aware of each other?

> +
> +	emac_poll_rx(dev->priv, budget);
> +	emac_poll_tx(dev->priv);
> +
> +	netif_poll_enable(poll_dev);
> +	/* Enable mal interrupts */
> +	mal_enable_eob_irq(mal);
> +}
> +
> +int
> +poll_fake(struct net_device *dev, int *budget)
> +{
> +	/* It will be never invoked */
> +	return 0;
> +}
> +#endif

If it's never invoked, then why define it?

>  
>  static int __init emac_probe(struct ocp_device *ocpdev)
>  {
> @@ -2188,6 +2223,11 @@ static int __init emac_probe(struct ocp_
>  	netif_carrier_off(ndev);
>  	netif_stop_queue(ndev);
>  
> +#ifdef CONFIG_NET_POLL_CONTROLLER
> +	ndev->poll_controller = poll_ctrl;
> +	ndev->poll = poll_fake;
> +#endif
> +

->poll is not related to ->poll_controller.  It is for NAPI, not
netpoll.

I'll defer to others to comment on the IBM EMAC manipulation code.
It looked reasonable to me at first glance.

John
-- 
John W. Linville
[email-masked]