aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@atheros.com>2009-10-06 21:19:10 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-10-07 16:39:53 -0400
commitbd96d3909549a0c09388987810e3e81397b500a9 (patch)
treef8376a4bca5e2742e40c8bc300bf2b283b184098 /drivers/net/wireless/ath
parent2568835cb44d6fe976e977d96aeca73c9fe1642c (diff)
ath9k: move ath_cleanup() below helpers to avoid forward declarations
This should fix the oops which occurs during module unload due to the dereferencig of ah upon debugfs exit. IP: [<46412d6b>] 0x46412d6b *pde = 00000000 Oops: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC last sysfs file: /sys/class/power_supply/BAT0/energy_full Modules linked in: ath9k(-) ath9k_hw mac80211 ath cfg80211 <bleh> Pid: 3112, comm: rmmod Not tainted (2.6.32-rc2-wl #101) 9461DUU EIP: 0060:[<46412d6b>] EFLAGS: 00010246 CPU: 0 EIP is at 0x46412d6b EAX: f5870004 EBX: f6700d94 ECX: 00000000 EDX: c14313a7 ESI: f5870000 EDI: fb58ce70 EBP: f6661eb4 ESP: f6661ea8 DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 Process rmmod (pid: 3112, ti=f6660000 task=f6579380 task.ti=f6660000) Stack: fb57e5e5 f5ca5d50 fb58ce70 f6661ebc fb58629a f6661ec8 c11b715e f5ca5da8 <0> f6661ed8 c1223d98 f5ca5da8 f5ca5ddc f6661eec c1223e6f fb58ce70 fb58ce70 <0> c14958a0 f6661f00 c1222edb fb58ce70 fb58ce70 fb58cebc f6661f1c c12243c9 Call Trace: [<fb57e5e5>] ? ath_cleanup+0x35/0x50 [ath9k] [<fb58629a>] ? ath_pci_remove+0x1a/0x20 [ath9k] [<c11b715e>] ? pci_device_remove+0x1e/0x40 [<c1223d98>] ? __device_release_driver+0x58/0xa0 [<c1223e6f>] ? driver_detach+0x8f/0xa0 [<c1222edb>] ? bus_remove_driver+0x7b/0xb0 [<c12243c9>] ? driver_unregister+0x49/0x80 [<c1158cf2>] ? sysfs_remove_file+0x12/0x20 [<c11b73b5>] ? pci_unregister_driver+0x35/0x90 [<fb586172>] ? ath_pci_exit+0x12/0x20 [ath9k] [<fb5883ec>] ? ath9k_exit+0x10/0x3d [ath9k] [<c131971d>] ? mutex_unlock+0xd/0x10 [<c1088c0f>] ? sys_delete_module+0x16f/0x220 [<c10e3d5d>] ? do_munmap+0x23d/0x290 [<c11a629c>] ? trace_hardirqs_off_thunk+0xc/0x10 [<c11a628c>] ? trace_hardirqs_on_thunk+0xc/0x10 [<c1003b41>] ? sysenter_exit+0xf/0x1a [<c1003b08>] ? sysenter_do_call+0x12/0x3c Code: Bad EIP value. EIP: [<46412d6b>] 0x46412d6b SS:ESP 0068:f6661ea8 CR2: 0000000046412d6b ---[ end trace 847f3b05ff3dcb19 ]--- Reported-by: Vasanthakumar Thiagarajan <vasanth@atheros.com> Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 39b278053056..c541516a2e9d 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1313,23 +1313,6 @@ static void ath_start_rfkill_poll(struct ath_softc *sc)
1313 wiphy_rfkill_start_polling(sc->hw->wiphy); 1313 wiphy_rfkill_start_polling(sc->hw->wiphy);
1314} 1314}
1315 1315
1316static void ath_clean_core(struct ath_softc *sc);
1317static void ath9k_uninit_hw(struct ath_softc *sc);
1318
1319void ath_cleanup(struct ath_softc *sc)
1320{
1321 struct ath_hw *ah = sc->sc_ah;
1322 struct ath_common *common = ath9k_hw_common(ah);
1323
1324 ath_clean_core(sc);
1325 free_irq(sc->irq, sc);
1326 ath_bus_cleanup(common);
1327 kfree(sc->sec_wiphy);
1328 ieee80211_free_hw(sc->hw);
1329
1330 ath9k_uninit_hw(sc);
1331}
1332
1333static void ath9k_uninit_hw(struct ath_softc *sc) 1316static void ath9k_uninit_hw(struct ath_softc *sc)
1334{ 1317{
1335 struct ath_hw *ah = sc->sc_ah; 1318 struct ath_hw *ah = sc->sc_ah;
@@ -1388,6 +1371,20 @@ void ath_detach(struct ath_softc *sc)
1388 ath9k_uninit_hw(sc); 1371 ath9k_uninit_hw(sc);
1389} 1372}
1390 1373
1374void ath_cleanup(struct ath_softc *sc)
1375{
1376 struct ath_hw *ah = sc->sc_ah;
1377 struct ath_common *common = ath9k_hw_common(ah);
1378
1379 ath_clean_core(sc);
1380 free_irq(sc->irq, sc);
1381 ath_bus_cleanup(common);
1382 kfree(sc->sec_wiphy);
1383 ieee80211_free_hw(sc->hw);
1384
1385 ath9k_uninit_hw(sc);
1386}
1387
1391static int ath9k_reg_notifier(struct wiphy *wiphy, 1388static int ath9k_reg_notifier(struct wiphy *wiphy,
1392 struct regulatory_request *request) 1389 struct regulatory_request *request)
1393{ 1390{