Re: [PATCH v5 2/2] Ethernet driver for the WIZnet W5100 chip

From: Mark Brown
Date: Mon Apr 02 2012 - 07:21:40 EST


On Mon, Apr 02, 2012 at 03:40:18PM +0600, Mike Sinkovsky wrote:
> 01.04.2012 3:23, Mark Brown wrote:
> >On Fri, Mar 30, 2012 at 01:00:06PM +0600, Mike Sinkovsky wrote:

> >>+config WIZNET_W5100
> >>+ tristate "WIZnet W5100 Ethernet support"
> >>+ depends on ARM || BLACKFIN

> >What are the architecture dependencies here?

> Original driver from chip manufacturer was written for ARM, and now
> we use it on Blackfin.
> Completely untested on other arch's, but should work. Maybe.

Remove the dependency then. If there's an issue people can fix it.

> >>+static irqreturn_t w5100_interrupt(int irq, void *ndev_instance)
> >>+{
> >>+ struct net_device *ndev = ndev_instance;
> >>+ struct w5100_priv *priv = netdev_priv(ndev);
> >>+
> >>+ int ir = w5100_read(priv, W5100_S0_IR);
> >>+ w5100_write(priv, W5100_S0_IR, ir);
> >>+
> >>+ if (ir& S0_IR_RECV) {
> >>+ if (napi_schedule_prep(&priv->napi)) {
> >>+ w5100_write(priv, W5100_IMR, 0);
> >>+ mmiowb();
> >>+ __napi_schedule(&priv->napi);
> >>+ }
> >>+ }
> >>+
> >>+ if (ir& S0_IR_SENDOK) {
> >>+ if (unlikely(netif_queue_stopped(ndev)))
> >>+ netif_wake_queue(ndev);
> >>+ }
> >>+
> >>+ return IRQ_HANDLED;

> >This unconditionally acknowledges the interrupt even if one wasn't
> >reported by the device.

> Hm? Don't get you.
> W5100_S0_IR register is R/W1C - writing back clears it.
> Or what do you mean?

If you read back and no interrupts are flagged (all bits in the IRQ
status register clear) you'll still return IRQ_HANDLED.

> >This is rather an abuse of the resource API and will run into trouble on
> >device tree based systems. You should use platform data for non-DT
> >systems.

> Ok, will move it to struct wiznet_platform_data.
> But here is downside - this gpio is optional, and if board doesn't
> have it - it must be initialized as negative value, not just
> omitted.

Sure, this is all totally standard to the Linux GPIO framework.
Realistically treating 0 as an invalid GPIO should be fine.

> >>+ if (request_irq(priv->link_irq, w5100_detect_link,
> >>+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
> >>+ link_name, priv->ndev)< 0)

> >Suggest using request_any_context_irq() to increase the range of
> >supported interrupt controllers.

> Could it be anything but hard irq?

It could be a threaded IRQ (if the interrupt controller can't be
accessed from hard IRQ context).

> >>+ platform_set_drvdata(pdev, NULL);
> >>+ dev_info(&pdev->dev, "probe failed (%d)\n", err);

> >This will be done for you by the driver core.

> You mean platform_set_drvdata() and dev_info()? Maybe.
> I'm sure platform_driver will not do free_netdev() for me.

The error logging.

Attachment: signature.asc
Description: Digital signature