1 From 7ed85b65ab611ba841d508ae4ff8c45fa0c48c80 Mon Sep 17 00:00:00 2001
2 From: Stanislav Yakovlev <stas.yakovlev@gmail.com>
3 Date: Mon, 16 Apr 2012 06:38:30 -0400
4 Subject: net/wireless: ipw2200: Fix WARN_ON occurring in wiphy_register called by ipw_pci_probe
6 From: Stanislav Yakovlev <stas.yakovlev@gmail.com>
8 commit 7ed85b65ab611ba841d508ae4ff8c45fa0c48c80 upstream.
10 The problem was found by Stefan Lippers-Hollmann
11 http://marc.info/?l=linux-wireless&m=132720334512946&w=2
13 WARNING: at /tmp/buildd/linux-aptosid-3.2/debian/build/source_i386_none/net/wireless/core.c:562 wiphy_register+0x45/0x38d [cfg80211]()
14 Hardware name: TravelMate 290 \xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff
15 Modules linked in: ipw2200(+) iTCO_wdt libipw joydev drm snd_seq snd_timer snd_seq_device iTCO_vendor_support yenta_socket snd intel_agp i2c_i801 pcmcia_rsrc cfg80211 soundcore parport_pc psmouse parport rng_core snd_page_alloc serio_raw pcspkr i2c_algo_bit intel_gtt pcmcia_core evdev irda crc_ccitt rfkill lib80211 processor container ac battery shpchp pci_hotplug button ext4 mbcache jbd2 crc16 dm_mod sd_mod sr_mod crc_t10dif cdrom ata_generic pata_acpi ata_piix libata scsi_mod firewire_ohci firewire_core crc_itu_t 8139too 8139cp mii uhci_hcd ehci_hcd usbcore usb_common [last unloaded: scsi_wait_scan]
16 Pid: 328, comm: modprobe Not tainted 3.2-1.slh.4-aptosid-686 #1
18 [<c012eaf4>] ? warn_slowpath_common+0x7c/0x8f
19 [<e0ff0b3e>] ? wiphy_register+0x45/0x38d [cfg80211]
20 [<e0ff0b3e>] ? wiphy_register+0x45/0x38d [cfg80211]
21 [<c012eb22>] ? warn_slowpath_null+0x1b/0x1f
22 [<e0ff0b3e>] ? wiphy_register+0x45/0x38d [cfg80211]
23 [<c01f89d7>] ? internal_create_group+0xf5/0xff
24 [<e0a2de1c>] ? ipw_pci_probe+0xa9a/0xbd0 [ipw2200]
25 [<c01519f4>] ? arch_local_irq_save+0xf/0x14
26 [<c0252986>] ? pci_device_probe+0x53/0x9a
27 [<c02c2820>] ? driver_probe_device+0x94/0x124
28 [<c0252871>] ? pci_match_id+0x15/0x34
29 [<c02c28f0>] ? __driver_attach+0x40/0x5b
30 [<c02c1d81>] ? bus_for_each_dev+0x37/0x60
31 [<c02c25aa>] ? driver_attach+0x17/0x1a
32 [<c02c28b0>] ? driver_probe_device+0x124/0x124
33 [<c02c22c4>] ? bus_add_driver+0x92/0x1d1
34 [<e099d000>] ? 0xe099cfff
35 [<c02c2cb8>] ? driver_register+0x7d/0xd4
36 [<c017cd50>] ? jump_label_module_notify+0xec/0x167
37 [<e099d000>] ? 0xe099cfff
38 [<c0253017>] ? __pci_register_driver+0x32/0x87
39 [<e099d000>] ? 0xe099cfff
40 [<e099d02e>] ? ipw_init+0x2e/0x72 [ipw2200]
41 [<c0101173>] ? do_one_initcall+0x7d/0x132
42 [<c0145016>] ? __blocking_notifier_call_chain+0x47/0x4f
43 [<c0154a73>] ? sys_init_module+0x13a4/0x159c
44 [<c03a639f>] ? sysenter_do_call+0x12/0x28
46 This warning appears only if we apply Ben Hutchings' fix
47 http://marc.info/?l=linux-wireless&m=132720195012653&w=2
48 for the bug reported by Cesare Leonardi
49 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=656813
50 with cfg80211 warning during device registration
51 ("cfg80211: failed to add phy80211 symlink to netdev!").
53 We separate device bring up and registration with network stack
56 After that Ben Hutchings' fix can be applied to fix the bug.
58 Signed-off-by: Stanislav Yakovlev <stas.yakovlev@gmail.com>
59 Tested-by: Stefan Lippers-Hollmann <s.l-h@gmx.de>
60 Signed-off-by: John W. Linville <linville@tuxdriver.com>
61 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
64 drivers/net/wireless/ipw2x00/ipw2200.c | 21 ++++++---------------
65 1 file changed, 6 insertions(+), 15 deletions(-)
67 --- a/drivers/net/wireless/ipw2x00/ipw2200.c
68 +++ b/drivers/net/wireless/ipw2x00/ipw2200.c
69 @@ -11443,20 +11443,6 @@ static void ipw_bg_down(struct work_stru
70 mutex_unlock(&priv->mutex);
73 -/* Called by register_netdev() */
74 -static int ipw_net_init(struct net_device *dev)
77 - struct ipw_priv *priv = libipw_priv(dev);
79 - mutex_lock(&priv->mutex);
82 - mutex_unlock(&priv->mutex);
87 static int ipw_wdev_init(struct net_device *dev)
90 @@ -11722,7 +11708,6 @@ static void ipw_prom_free(struct ipw_pri
93 static const struct net_device_ops ipw_netdev_ops = {
94 - .ndo_init = ipw_net_init,
95 .ndo_open = ipw_net_open,
96 .ndo_stop = ipw_net_stop,
97 .ndo_set_rx_mode = ipw_net_set_multicast_list,
98 @@ -11849,6 +11834,12 @@ static int __devinit ipw_pci_probe(struc
102 + if (ipw_up(priv)) {
103 + mutex_unlock(&priv->mutex);
105 + goto out_remove_sysfs;
108 mutex_unlock(&priv->mutex);
109 err = register_netdev(net_dev);