[PATCH] Cleanup hso rfkill error handling [was: 2.6.28-rc2 / hso driver oops]



On Wed, Oct 29, 2008 at 07:40:11PM +0000, Ben Hutchings wrote:
On Wed, 2008-10-29 at 16:40 +0000, Jonathan McDowell wrote:
Hi.

Tried out 2.6.28-rc2 today on my EEE 901 and my Option Icon 225 and got
the following oops:

hso: drivers/net/usb/hso.c: 1.2 Option Wireless
usbcore: registered new interface driver hso
usb 2-2: new full speed USB device using uhci_hcd and address 3
usb 2-2: configuration #1 chosen from 1 choice
hso0: Disabled Privacy Extensions
BUG: unable to handle kernel NULL pointer dereference at 000000d0
IP: [<c03589b9>] dev_driver_string+0x1/0x2a

Something passed a null device pointer to dev_printk().

[...]
[<f81b8265>] ? hso_create_net_device+0x305/0x32d [hso]
[...]

I think that hso_create_rfkill() is the culprit here (and has been
inlined into hso_create_net_device()). It's using hso_dev->dev as the
first argument to dev_err() and it doesn't look like that field is
initialised except by kzalloc. At a guess, it should be using
&hso_dev->usb->dev.

Yup, this appears to be the problem, thanks. I think &hso_net->net->dev
is more intuitive for the error message, so I've used that. I've also
added missing line endings on the error messages and set our local
rfkill structure element to NULL on failure so we don't try to call
rfkill_unregister on driver removal if we failed to register at all.

The patch below Works For Me (TM); the device is detected fine, can be
removed without problems and connects ok. I'll have a prod at why the
rfkill stuff isn't working next, but I believe this cleanup of the error
handling is appropriate no matter what the issue with registration is.

Signed-Off-By: Jonathan McDowell <noodles@xxxxxxxx>

-----
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index 1164c52..9d9622b 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -2184,19 +2184,20 @@ static void hso_create_rfkill(struct hso_device *hso_dev,
struct usb_interface *interface)
{
struct hso_net *hso_net = dev2net(hso_dev);
- struct device *dev = hso_dev->dev;
+ struct device *dev = &hso_net->net->dev;
char *rfkn;

hso_net->rfkill = rfkill_allocate(&interface_to_usbdev(interface)->dev,
RFKILL_TYPE_WLAN);
if (!hso_net->rfkill) {
- dev_err(dev, "%s - Out of memory", __func__);
+ dev_err(dev, "%s - Out of memory\n", __func__);
return;
}
rfkn = kzalloc(20, GFP_KERNEL);
if (!rfkn) {
rfkill_free(hso_net->rfkill);
- dev_err(dev, "%s - Out of memory", __func__);
+ hso_net->rfkill = NULL;
+ dev_err(dev, "%s - Out of memory\n", __func__);
return;
}
snprintf(rfkn, 20, "hso-%d",
@@ -2209,7 +2210,8 @@ static void hso_create_rfkill(struct hso_device *hso_dev,
kfree(rfkn);
hso_net->rfkill->name = NULL;
rfkill_free(hso_net->rfkill);
- dev_err(dev, "%s - Failed to register rfkill", __func__);
+ hso_net->rfkill = NULL;
+ dev_err(dev, "%s - Failed to register rfkill\n", __func__);
return;
}
}
-----

J.

--
/-\ | 101 things you can't have too much
|@/ Debian GNU/Linux Developer | of : 32 - Answers.
\- |
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • Re: [linux-dvb] Re: More than 2Gb problem (dvb related) ?
    ... Using ACPI for SMP configuration information ... registered new interface driver hub ... USB Universal Host Controller Interface driver v3.0 ... saa7146: register extension 'budget_ci dvb'. ...
    (Linux-Kernel)
  • BUG: soft lockup detected on CPU#0!
    ... ACPI: bus type pci registered ... USB Universal Host Controller Interface driver v3.0 ... saa7146: register extension 'dvb'. ... hdc: timeout waiting for DMA ...
    (Linux-Kernel)
  • Re: What breaks aic7xxx in post 2.6.12-rc2 ?
    ... usbcore: registered new driver hub ... target0:0:0: Domain Validation skipping write tests ... ehci_hcd 0000:00:10.4: new USB bus registered, ... saa7146: register extension 'budget dvb'. ...
    (Linux-Kernel)
  • Re: [patch] lockdep: annotate pktcdvd natural device hierarchy
    ... trying to register non-static key. ... ACPI: PM-Timer IO Port: 0xe408 ... ACPI: bus type pci registered ... USB Universal Host Controller Interface driver v3.0 ...
    (Linux-Kernel)
  • Freeze with HPT370 2.4.22-rc2 and dxr3
    ... However now that I use a software raid (one via ide on asus a7v8x and 2 ... hdc: attached ide-scsi driver. ... usb.c: new USB bus registered, ... ALSA seq_oss.c:223: can't register device seq ...
    (Linux-Kernel)