All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ben Hutchings <bhutchings@solarflare.com>
To: "L. Alberto Giménez" <agimenez@sysvalve.es>
Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	linux-usb@vger.kernel.org, oliver@neukum.org,
	linville@tuxdriver.com, j.dumon@option.com,
	steve.glendinning@smsc.com, davem@davemloft.net, gregkh@suse.de,
	dgiagio@gmail.com, dborca@yahoo.com
Subject: Re: [PATCHv3] drivers/net/usb: Add new driver ipheth
Date: Thu, 01 Apr 2010 00:18:58 +0100	[thread overview]
Message-ID: <1270077538.8653.484.camel@localhost> (raw)
In-Reply-To: <1270064527-8485-1-git-send-email-agimenez@sysvalve.es>

On Wed, 2010-03-31 at 21:42 +0200, L. Alberto Giménez wrote:
[...]
> --- /dev/null
> +++ b/drivers/net/usb/ipheth.c
[...]
> +#include <linux/kernel.h>
> +#include <linux/errno.h>
> +#include <linux/init.h>
> +#include <linux/slab.h>
> +#include <linux/module.h>
> +#include <linux/netdevice.h>
> +#include <linux/etherdevice.h>
> +#include <linux/ethtool.h>
> +#include <linux/uaccess.h>

I don't think you need this header.

> +#include <linux/usb.h>
> +#include <linux/workqueue.h>
> +
> +#define USB_VENDOR_APPLE        0x05ac
> +#define USB_PRODUCT_IPHETH     0x1290
> +#define USB_PRODUCT_IPHETH_3G   0x1292
> +#define USB_PRODUCT_IPHETH_3GS  0x1294

Apple doesn't assign device ids to ipheth so either the names are
incorrect or you should get proper device ids.  I believe the Linux
Foundation has a USB vendor id and could assign device ids under that.

> +struct ipheth_device {
> +	struct usb_device *udev;
> +	struct usb_interface *intf;
> +	struct net_device *net;
> +	struct net_device_stats stats;

You can store stats in the net_device.

> +	struct sk_buff *tx_skb;
> +	struct urb *tx_urb;
> +	struct urb *rx_urb;
> +	unsigned char *tx_buf;
> +	unsigned char *rx_buf;
> +	unsigned char *ctrl_buf;
> +	__u8 bulk_in;
> +	__u8 bulk_out;

No need for the double-underscores; that's a convention for use in
definitions shared with user-space.

> +	struct delayed_work carrier_work;
> +};
[...]
> +static int ipheth_open(struct net_device *net)
> +{
> +	struct ipheth_device *dev = netdev_priv(net);
> +	struct usb_device *udev = dev->udev;
> +	int retval = 0;
> +
> +	usb_set_interface(udev, IPHETH_INTFNUM, IPHETH_ALT_INTFNUM);
> +	usb_clear_halt(udev, usb_rcvbulkpipe(udev, dev->bulk_in));
> +	usb_clear_halt(udev, usb_sndbulkpipe(udev, dev->bulk_out));
> +
> +	retval = ipheth_carrier_set(dev);
> +	if (retval)
> +		goto error;
> +
> +	retval = ipheth_rx_submit(dev, GFP_KERNEL);
> +	if (retval)
> +		goto error;
> +
> +	schedule_delayed_work(&dev->carrier_work, IPHETH_CARRIER_CHECK_TIMEOUT);
> +	netif_start_queue(net);
> +error:
> +	return retval;
> +}

There is no cleanup here (and none appears to be needed) so you could
take out the label and replace the gotos with returns.

> +static int ipheth_tx(struct sk_buff *skb, struct net_device *net)
> +{
> +	struct ipheth_device *dev = netdev_priv(net);
> +	struct usb_device *udev = dev->udev;
> +	int retval;
> +
> +	/* Paranoid */
> +	if (skb->len > IPHETH_BUF_SIZE) {
> +		err("%s: skb too large: %d bytes", __func__, skb->len);
> +		dev->stats.tx_dropped++;
> +		dev_kfree_skb_irq(skb);
> +		goto exit;
> +	}

Use WARN here as this would indicate a bug.

Again the goto is unnecessary.

> +	memset(dev->tx_buf, 0, IPHETH_BUF_SIZE);
> +	memcpy(dev->tx_buf, skb->data, skb->len);

This is wasteful.  If you really must pad the buffer then do so, but
don't clear the area that is going to be filled with real data.

> +	usb_fill_bulk_urb(dev->tx_urb, udev,
> +			  usb_sndbulkpipe(udev, dev->bulk_out),
> +			  dev->tx_buf, IPHETH_BUF_SIZE,
> +			  ipheth_sndbulk_callback,
> +			  dev);
> +	dev->tx_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
> +
> +	retval = usb_submit_urb(dev->tx_urb, GFP_ATOMIC);
> +	if (retval) {
> +		err("%s: usb_submit_urb: %d", __func__, retval);
> +		dev->stats.tx_errors++;
> +		dev_kfree_skb_irq(skb);
> +	} else {
> +		net->trans_start = jiffies;

No longer needed.

> +		dev->tx_skb = skb;
> +
> +		dev->stats.tx_packets++;
> +		dev->stats.tx_bytes += skb->len;
> +		netif_stop_queue(net);
> +	}
> +exit:
> +	return NETDEV_TX_OK;
> +}
[...]
> +#ifdef HAVE_NET_DEVICE_OPS
> +static const struct net_device_ops ipheth_netdev_ops = {
> +       .ndo_open = &ipheth_open,
> +       .ndo_stop = &ipheth_close,
> +       .ndo_start_xmit = &ipheth_tx,
> +       .ndo_tx_timeout = &ipheth_tx_timeout,
> +       .ndo_get_stats = &ipheth_stats,
> +};
> +#endif

Remove the #ifdef, there is no question whether we have net_device_ops.

> +static int ipheth_probe(struct usb_interface *intf,
> +			 const struct usb_device_id *id)
> +{
[...]
> +#ifdef HAVE_NET_DEVICE_OPS
> +	netdev->netdev_ops = &ipheth_netdev_ops;
> +#else /* CONFIG_COMPAT_NET_DEV_OPS */
> +	netdev->open = &ipheth_open;
> +	netdev->stop = &ipheth_close;
> +	netdev->hard_start_xmit = &ipheth_tx;
> +	netdev->tx_timeout = &ipheth_tx_timeout;
> +	netdev->get_stats = &ipheth_stats;
> +#endif
[...]

Similarly here.

As a general point, you should now be using netdev_err(), netdev_info(),
etc. for logging messages related to net devices.

I have no idea about USB so I haven't checked the USB API usage at all.

Ben.

-- 
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.


  parent reply	other threads:[~2010-03-31 23:19 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-30 21:34 [PATCH] Staging: Add new driver ipheth L. Alberto Giménez
2010-03-30 21:34 ` L. Alberto Giménez
2010-03-30 21:45   ` Greg KH
2010-03-30 21:58     ` "L. Alberto Giménez"
2010-03-30 22:11       ` Greg KH
2010-03-31 14:33       ` Pavel Machek
2010-03-31 14:44         ` Matthew Garrett
2010-03-31 19:47         ` "L. Alberto Giménez"
2010-03-30 23:01   ` [PATCH] drivers/net/usb: " L. Alberto Giménez
2010-03-30 23:25     ` Greg KH
2010-03-31 19:42 ` [PATCHv3] " L. Alberto Giménez
2010-03-31 20:33   ` Oliver Neukum
2010-03-31 21:38     ` "L. Alberto Giménez"
2010-04-02 18:23     ` "L. Alberto Giménez"
2010-04-04  7:24       ` Oliver Neukum
2010-04-05 18:51         ` "L. Alberto Giménez"
2010-03-31 23:18   ` Ben Hutchings [this message]
2010-03-31 23:25     ` Greg KH
2010-03-31 23:28       ` Ben Hutchings
2010-04-02 17:15     ` "L. Alberto Giménez"
2010-04-02 17:21       ` Ben Hutchings
2010-04-02 17:53         ` "L. Alberto Giménez"
2010-04-02 18:35           ` Ben Hutchings
2010-04-07 22:11 ` [PATCH Resubmission] " L. Alberto Giménez
2010-04-07 22:37   ` Roland Dreier
2010-04-08  6:35   ` Oliver Neukum
2010-04-13  8:15   ` David Miller
2010-04-13 19:03     ` "L. Alberto Giménez"
2010-04-13 21:29       ` David Miller
2010-04-15 19:46 ` [PATCH Resubmission v2] " L. Alberto Giménez
2010-04-16  6:44   ` David Miller
2010-04-18 18:35 ` [PATCH] " L. Alberto Giménez
2010-04-21 14:15   ` Diego Giagio
2010-04-22  5:44     ` David Miller
  -- strict thread matches above, loose matches on Subject: below --
2010-03-31 22:10 [PATCHv3] " Daniel Borca

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1270077538.8653.484.camel@localhost \
    --to=bhutchings@solarflare.com \
    --cc=agimenez@sysvalve.es \
    --cc=davem@davemloft.net \
    --cc=dborca@yahoo.com \
    --cc=dgiagio@gmail.com \
    --cc=gregkh@suse.de \
    --cc=j.dumon@option.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=netdev@vger.kernel.org \
    --cc=oliver@neukum.org \
    --cc=steve.glendinning@smsc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.