From: David Miller <davem@davemloft.net>
To: ellyjones@google.com
Cc: netdev@vger.kernel.org, dcbw@redhat.com, mjg59@redhat.com,
jglasgow@google.com, trond@google.com
Subject: Re: [PATCH] Add Qualcomm Gobi 2000/3000 driver.
Date: Wed, 13 Apr 2011 13:37:23 -0700 (PDT) [thread overview]
Message-ID: <20110413.133723.70211873.davem@davemloft.net> (raw)
In-Reply-To: <20110413190023.GC1652@google.com>
From: Elly Jones <ellyjones@google.com>
Date: Wed, 13 Apr 2011 15:00:24 -0400
> +void qcusbnet_put(struct qcusbnet *dev)
> +{
> + mutex_lock(&qcusbnet_lock);
> + kref_put(&dev->refcount, free_dev);
> + mutex_unlock(&qcusbnet_lock);
> +}
This locking looks excessive, and shouldn't be needed simply to
release a reference to an object.
> +int qc_suspend(struct usb_interface *iface, pm_message_t event)
> +{
> + struct usbnet *usbnet;
> + struct qcusbnet *dev;
> +
> + if (!iface)
> + return -ENOMEM;
When is qc_suspend() called with a NULL iface arguemnt?
> +static int qc_resume(struct usb_interface *iface)
> +{
> + struct usbnet *usbnet;
> + struct qcusbnet *dev;
> + int ret;
> + int oldstate;
> +
> + if (iface == 0)
> + return -ENOMEM;
Likewise, and if it is needed use consistent tests for NULL. Testing
against the integer "0" is definitely the wrong way.
> + if (usb_endpoint_dir_in(&endpoint->desc)
> + && !usb_endpoint_xfer_int(&endpoint->desc)) {
Please do it like this:
if (A &&
B) {
Not like:
if (A
&& B
the latter looks awful at best.
> + if (!usbnet || !usbnet->net) {
> + DBG("failed to get usbnet device\n");
> + return;
> + }
> +
> + dev = (struct qcusbnet *)usbnet->data[0];
> + if (!dev) {
> + DBG("failed to get QMIDevice\n");
> + return;
> + }
These NULL checks are everywhere! Do we really _ever_ create a full
registered netdev with any of these things being NULL? I severely
doubt it.
> +static int qcnet_worker(void *arg)
> +{
> + struct list_head *node, *tmp;
> + unsigned long activeflags, listflags;
> + struct urbreq *req;
> + int status;
> + struct usb_device *usbdev;
> + struct worker *worker = arg;
> + if (!worker) {
> + DBG("passed null pointer\n");
> + return -EINVAL;
> + }
This NULL check is impossible, you register the worker function with an
explicit &dev->worker argument, so seeing NULL here is impossible.
> +static int qcnet_startxmit(struct sk_buff *skb, struct net_device *netdev)
> +{
> + unsigned long listflags;
> + struct qcusbnet *dev;
> + struct worker *worker;
> + struct urbreq *req;
> + void *data;
> + struct usbnet *usbnet = netdev_priv(netdev);
> +
> + DBG("\n");
> +
> + if (!usbnet || !usbnet->net) {
> + DBG("failed to get usbnet device\n");
> + return NETDEV_TX_BUSY;
> + }
> +
> + dev = (struct qcusbnet *)usbnet->data[0];
> + if (!dev) {
Again, kill this NULL check noise, all of it can't be necessary.
> + netdev->trans_start = jiffies;
Setting netdev->trans_start in drivers is expensive and deprecated,
please set netdev_queue->trans_start instead.
> +static int qcnet_open(struct net_device *netdev)
> +{
> + int status = 0;
> + struct qcusbnet *dev;
> + struct usbnet *usbnet = netdev_priv(netdev);
> +
> + if (!usbnet) {
> + DBG("failed to get usbnet device\n");
> + return -ENXIO;
> + }
> +
> + dev = (struct qcusbnet *)usbnet->data[0];
> + if (!dev) {
> + DBG("failed to get QMIDevice\n");
> + return -ENXIO;
> + }
Again, excessive NULL checks.
> +int qcnet_stop(struct net_device *netdev)
> +{
> + struct qcusbnet *dev;
> + struct usbnet *usbnet = netdev_priv(netdev);
> +
> + if (!usbnet || !usbnet->net) {
> + DBG("failed to get netdevice\n");
> + return -ENXIO;
> + }
> +
> + dev = (struct qcusbnet *)usbnet->data[0];
> + if (!dev) {
> + DBG("failed to get QMIDevice\n");
> + return -ENXIO;
> + }
Here too.
> +static u8 nibble(unsigned char c)
> +{
> + if (likely(isdigit(c)))
> + return c - '0';
> + c = toupper(c);
> + if (likely(isxdigit(c)))
> + return 10 + c - 'A';
> + return 0;
> +}
Remove this function and use hex_to_bin() instead.
prev parent reply other threads:[~2011-04-13 20:37 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-13 19:00 [PATCH] Add Qualcomm Gobi 2000/3000 driver Elly Jones
2011-04-13 20:37 ` David Miller [this message]
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=20110413.133723.70211873.davem@davemloft.net \
--to=davem@davemloft.net \
--cc=dcbw@redhat.com \
--cc=ellyjones@google.com \
--cc=jglasgow@google.com \
--cc=mjg59@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=trond@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).