2009-11-25 15:27:21

by Michael Büsch

[permalink] [raw]
Subject: RTL8187 warnings on suspend



[ 76.758422] queueing ieee80211 work while going to suspend
[ 76.758768] ------------[ cut here ]------------
[ 76.758927] Badness at net/mac80211/util.c:524
[ 76.759080] NIP: f244c71c LR: f244c71c CTR: 00000000
[ 76.759249] REGS: ee95bbb0 TRAP: 0700 Not tainted (2.6.32-rc8-wl-wltest)
[ 76.759476] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 22082444 XER: 00000000
[ 76.759856] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
[ 76.760052] GPR00: f244c71c ee95bc60 efb46000 00000041 00000001 c0041078 00000000 00000002
[ 76.760490] GPR08: 00000000 00000000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
[ 76.760927] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
[ 76.761364] GPR24: ee95bdd8 00000005 c0aa2b74 eebcd114 00000000 eebccc20 ed520800 eebcc300
[ 76.761858] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.762093] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.762318] Call Trace:
[ 76.762415] [ee95bc60] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
[ 76.762738] [ee95bc70] [f26370f8] rtl8187_leds_exit+0x28/0x64 [rtl8187]
[ 76.762972] [ee95bc90] [f2637b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
[ 76.763211] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
[ 76.763436] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
[ 76.763658] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
[ 76.763875] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
[ 76.764110] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
[ 76.764329] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
[ 76.764532] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
[ 76.764764] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
[ 76.764957] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
[ 76.765160] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
[ 76.765339] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
[ 76.765555] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
[ 76.765784] [ee95be50] [c0087304] enter_state+0xe4/0xf4
[ 76.765978] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
[ 76.766167] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
[ 76.766352] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
[ 76.766547] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
[ 76.766734] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
[ 76.766935] --- Exception: c01 at 0xfaab878
[ 76.766937] LR = 0xfaab7dc
[ 76.767183] Instruction dump:
[ 76.767305] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
[ 76.767707] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6
[ 76.768225] queueing ieee80211 work while going to suspend
[ 76.768458] ------------[ cut here ]------------
[ 76.768615] Badness at net/mac80211/util.c:524
[ 76.768766] NIP: f244c71c LR: f244c71c CTR: 00000000
[ 76.768934] REGS: ee95bb60 TRAP: 0700 Tainted: G W (2.6.32-rc8-wl-wltest)
[ 76.769185] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 42082444 XER: 00000000
[ 76.769554] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
[ 76.769749] GPR00: f244c71c ee95bc10 efb46000 00000041 00000001 c0041078 00000000 00000002
[ 76.770190] GPR08: 00000000 ee95a000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
[ 76.770631] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
[ 76.771072] GPR24: ee95bdd8 00000005 c0aa2b74 eebcd114 00000000 00009032 eebccc20 eebcc300
[ 76.772462] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.773622] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.774769] Call Trace:
[ 76.775784] [ee95bc10] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
[ 76.777026] [ee95bc20] [f26370ac] rtl8187_led_brightness_set+0x54/0x78 [rtl8187]
[ 76.778221] [ee95bc30] [c05306f8] led_trigger_set+0xf4/0xf8
[ 76.779362] [ee95bc50] [c05301fc] led_classdev_unregister+0x64/0xa8
[ 76.780527] [ee95bc70] [f2637100] rtl8187_leds_exit+0x30/0x64 [rtl8187]
[ 76.781706] [ee95bc90] [f2637b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
[ 76.782877] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
[ 76.784016] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
[ 76.785130] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
[ 76.786229] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
[ 76.787329] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
[ 76.788419] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
[ 76.789486] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
[ 76.790579] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
[ 76.791630] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
[ 76.792691] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
[ 76.793729] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
[ 76.794811] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
[ 76.795907] [ee95be50] [c0087304] enter_state+0xe4/0xf4
[ 76.796965] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
[ 76.798009] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
[ 76.799057] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
[ 76.800118] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
[ 76.801161] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
[ 76.802227] --- Exception: c01 at 0xfaab878
[ 76.802229] LR = 0xfaab7dc
[ 76.804203] Instruction dump:
[ 76.805180] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
[ 76.806438] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6
[ 76.807821] queueing ieee80211 work while going to suspend
[ 76.808949] ------------[ cut here ]------------
[ 76.809998] Badness at net/mac80211/util.c:524
[ 76.811032] NIP: f244c71c LR: f244c71c CTR: 00000000
[ 76.812082] REGS: ee95bb60 TRAP: 0700 Tainted: G W (2.6.32-rc8-wl-wltest)
[ 76.813220] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 42082444 XER: 00000000
[ 76.814480] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
[ 76.814673] GPR00: f244c71c ee95bc10 efb46000 00000041 00000001 c0041078 00000000 00000002
[ 76.815997] GPR08: 00000000 ee95a000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
[ 76.817323] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
[ 76.818653] GPR24: ee95bdd8 00000005 c0aa2b74 eebcd114 00000000 00009032 eebccc20 eebcc300
[ 76.820935] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.822113] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.823294] Call Trace:
[ 76.824336] [ee95bc10] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
[ 76.825599] [ee95bc20] [f26370bc] rtl8187_led_brightness_set+0x64/0x78 [rtl8187]
[ 76.826802] [ee95bc30] [c05306f8] led_trigger_set+0xf4/0xf8
[ 76.827952] [ee95bc50] [c05301fc] led_classdev_unregister+0x64/0xa8
[ 76.829102] [ee95bc70] [f2637100] rtl8187_leds_exit+0x30/0x64 [rtl8187]
[ 76.830253] [ee95bc90] [f2637b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
[ 76.831391] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
[ 76.832512] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
[ 76.833632] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
[ 76.834737] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
[ 76.835859] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
[ 76.836963] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
[ 76.838038] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
[ 76.839142] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
[ 76.840198] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
[ 76.841263] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
[ 76.842314] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
[ 76.843405] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
[ 76.844505] [ee95be50] [c0087304] enter_state+0xe4/0xf4
[ 76.845563] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
[ 76.846633] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
[ 76.847688] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
[ 76.848748] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
[ 76.849805] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
[ 76.850875] --- Exception: c01 at 0xfaab878
[ 76.850877] LR = 0xfaab7dc
[ 76.852862] Instruction dump:
[ 76.853850] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
[ 76.855130] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6
[ 76.856785] queueing ieee80211 work while going to suspend
[ 76.857926] ------------[ cut here ]------------
[ 76.858980] Badness at net/mac80211/util.c:524
[ 76.860012] NIP: f244c71c LR: f244c71c CTR: 00000000
[ 76.861062] REGS: ee95bb60 TRAP: 0700 Tainted: G W (2.6.32-rc8-wl-wltest)
[ 76.862201] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 42082444 XER: 00000000
[ 76.863463] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
[ 76.863656] GPR00: f244c71c ee95bc10 efb46000 00000041 00000001 c0041078 00000000 00000002
[ 76.864980] GPR08: 00000000 ee95a000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
[ 76.866306] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
[ 76.867639] GPR24: ee95bdd8 00000005 c0aa2b74 eebcd114 00000000 00009032 eebccc20 eebcc300
[ 76.869924] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.871111] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.872286] Call Trace:
[ 76.873334] [ee95bc10] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
[ 76.874603] [ee95bc20] [f26370ac] rtl8187_led_brightness_set+0x54/0x78 [rtl8187]
[ 76.875811] [ee95bc30] [c05306f8] led_trigger_set+0xf4/0xf8
[ 76.876961] [ee95bc50] [c05301fc] led_classdev_unregister+0x64/0xa8
[ 76.878111] [ee95bc70] [f263710c] rtl8187_leds_exit+0x3c/0x64 [rtl8187]
[ 76.879260] [ee95bc90] [f2637b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
[ 76.880398] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
[ 76.881504] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
[ 76.882619] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
[ 76.883720] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
[ 76.884838] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
[ 76.885937] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
[ 76.887019] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
[ 76.888125] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
[ 76.889193] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
[ 76.890268] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
[ 76.891328] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
[ 76.892421] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
[ 76.893523] [ee95be50] [c0087304] enter_state+0xe4/0xf4
[ 76.894586] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
[ 76.895645] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
[ 76.896705] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
[ 76.897771] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
[ 76.898833] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
[ 76.899905] --- Exception: c01 at 0xfaab878
[ 76.899907] LR = 0xfaab7dc
[ 76.901921] Instruction dump:
[ 76.902910] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
[ 76.904199] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6
[ 76.905582] queueing ieee80211 work while going to suspend
[ 76.906707] ------------[ cut here ]------------
[ 76.907764] Badness at net/mac80211/util.c:524
[ 76.908817] NIP: f244c71c LR: f244c71c CTR: 00000000
[ 76.909879] REGS: ee95bb60 TRAP: 0700 Tainted: G W (2.6.32-rc8-wl-wltest)
[ 76.911025] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 42082444 XER: 00000000
[ 76.912300] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
[ 76.912493] GPR00: f244c71c ee95bc10 efb46000 00000041 00000001 c0041078 00000000 00000002
[ 76.913826] GPR08: 00000000 ee95a000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
[ 76.915154] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
[ 76.916486] GPR24: ee95bdd8 00000005 c0aa2b74 eebcd114 00000000 00009032 eebccc20 eebcc300
[ 76.918770] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.919961] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[ 76.921137] Call Trace:
[ 76.922186] [ee95bc10] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
[ 76.923457] [ee95bc20] [f26370bc] rtl8187_led_brightness_set+0x64/0x78 [rtl8187]
[ 76.924665] [ee95bc30] [c05306f8] led_trigger_set+0xf4/0xf8
[ 76.925817] [ee95bc50] [c05301fc] led_classdev_unregister+0x64/0xa8
[ 76.926969] [ee95bc70] [f263710c] rtl8187_leds_exit+0x3c/0x64 [rtl8187]
[ 76.928136] [ee95bc90] [f2637b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
[ 76.929264] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
[ 76.930383] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
[ 76.931503] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
[ 76.932606] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
[ 76.933731] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
[ 76.934845] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
[ 76.935935] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
[ 76.937046] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
[ 76.938116] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
[ 76.939190] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
[ 76.940249] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
[ 76.941343] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
[ 76.942449] [ee95be50] [c0087304] enter_state+0xe4/0xf4
[ 76.943528] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
[ 76.944592] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
[ 76.945656] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
[ 76.946725] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
[ 76.947785] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
[ 76.948872] --- Exception: c01 at 0xfaab878
[ 76.948873] LR = 0xfaab7dc
[ 76.950883] Instruction dump:
[ 76.951877] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
[ 76.953154] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6

--
Greetings, Michael.


2009-11-27 12:33:48

by Hin-Tak Leung

[permalink] [raw]
Subject: Re: RTL8187 warnings on suspend



--- On Fri, 27/11/09, Herton Ronaldo Krzesinski <[email protected]> wrote:

>
> _stop will always be called first in suspend, mac80211
> calls everything in
> right order. The problem here is that in suspend the device
> is disconnected
> (probably because we don't have any reset/resume support),

Hmm, that reminds me - I thought hibernate (suspend to disk) works, but suspend to ram doesn't? That's why I have unload on suspend configured - that used to work on fedora 11 until I upgraded to fedora 12 a few days ago (my machine now crashes on resume but presumably unrelated).

Maybe we should re-visit the issue of adding suspend()/resume() ?





2009-11-25 20:57:44

by Michael Büsch

[permalink] [raw]
Subject: Re: RTL8187 warnings on suspend

On Wednesday 25 November 2009 20:55:00 Herton Ronaldo Krzesinski wrote:
> Em Qua 25 Nov 2009, ?s 17:29:21, Michael Buesch escreveu:
> > On Wednesday 25 November 2009 19:25:39 Herton Ronaldo Krzesinski wrote:
> > > of the led inside rtl8187_leds_exit, like the patch below, could you try it?
> >
> > Does not completely fix it
>
> Indeed, ieee80211_queue_delayed_work run also in rtl8187_led_brightness_set...
> my patch didn't fix anything... I think the only way is starting and stopping
> leds in start and stop, the following patch should do it:

That completely crashes the machine on suspend. I can take a picture of the crash,
but I guess you can easily reproduce it...

--
Greetings, Michael.

2009-11-25 19:30:59

by Michael Büsch

[permalink] [raw]
Subject: Re: RTL8187 warnings on suspend

On Wednesday 25 November 2009 19:25:39 Herton Ronaldo Krzesinski wrote:
> of the led inside rtl8187_leds_exit, like the patch below, could you try it?

Does not completely fix it

[14727.733053] Freezing user space processes ... (elapsed 0.00 seconds) done.
[14727.735205] Freezing remaining freezable tasks ... (elapsed 1.15 seconds) done.
[14728.918070] queueing ieee80211 work while going to suspend
[14728.919327] ------------[ cut here ]------------
[14728.920372] Badness at net/mac80211/util.c:524
[14728.921401] NIP: f244c71c LR: f244c71c CTR: 00000000
[14728.922441] REGS: ee95bb50 TRAP: 0700 Tainted: G W (2.6.32-rc8-wl-wltest)
[14728.923562] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 22082444 XER: 00000000
[14728.924787] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
[14728.924980] GPR00: f244c71c ee95bc00 efb46000 00000041 00000001 c0041078 00000000 00000002
[14728.926257] GPR08: 00000000 00000000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
[14728.927536] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
[14728.928836] GPR24: ee95bdd8 00000005 c0aa2b74 00000000 00000000 ed7db04c ed7dac20 ed7da300
[14728.931137] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[14728.932305] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[14728.933462] Call Trace:
[14728.934487] [ee95bc00] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
[14728.935735] [ee95bc10] [f2d480e0] rtl8187_led_brightness_set+0x34/0x88 [rtl8187]
[14728.936930] [ee95bc30] [c05306f8] led_trigger_set+0xf4/0xf8
[14728.938071] [ee95bc50] [c05301fc] led_classdev_unregister+0x64/0xa8
[14728.939236] [ee95bc70] [f2d48078] rtl8187_leds_exit+0x20/0x54 [rtl8187]
[14728.940411] [ee95bc90] [f2d48b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
[14728.941588] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
[14728.942752] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
[14728.943910] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
[14728.945065] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
[14728.946231] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
[14728.947387] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
[14728.948526] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
[14728.949691] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
[14728.950822] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
[14728.951963] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
[14728.953085] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
[14728.954230] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
[14728.955372] [ee95be50] [c0087304] enter_state+0xe4/0xf4
[14728.956475] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
[14728.957565] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
[14728.958637] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
[14728.959712] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
[14728.960771] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
[14728.961832] --- Exception: c01 at 0xfaab878
[14728.961834] LR = 0xfaab7dc
[14728.963792] Instruction dump:
[14728.964761] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
[14728.966006] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6
[14728.967624] queueing ieee80211 work while going to suspend
[14728.968740] ------------[ cut here ]------------
[14728.969762] Badness at net/mac80211/util.c:524
[14728.970769] NIP: f244c71c LR: f244c71c CTR: 00000000
[14728.971797] REGS: ee95bb50 TRAP: 0700 Tainted: G W (2.6.32-rc8-wl-wltest)
[14728.972919] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 42082444 XER: 00000000
[14728.974155] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
[14728.974347] GPR00: f244c71c ee95bc00 efb46000 00000041 00000001 c0041078 00000000 00000002
[14728.975641] GPR08: 00000000 ee95a000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
[14728.976929] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
[14728.978240] GPR24: ee95bdd8 00000005 c0aa2b74 00000000 00000000 ed7dafc0 ed7dac20 ed7da300
[14728.980501] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[14728.981667] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
[14728.982831] Call Trace:
[14728.983858] [ee95bc00] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
[14728.985116] [ee95bc10] [f2d480e0] rtl8187_led_brightness_set+0x34/0x88 [rtl8187]
[14728.986322] [ee95bc30] [c05306f8] led_trigger_set+0xf4/0xf8
[14728.987464] [ee95bc50] [c05301fc] led_classdev_unregister+0x64/0xa8
[14728.988610] [ee95bc70] [f2d48084] rtl8187_leds_exit+0x2c/0x54 [rtl8187]
[14728.989749] [ee95bc90] [f2d48b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
[14728.990866] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
[14728.991962] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
[14728.993057] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
[14728.994146] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
[14728.995249] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
[14728.996338] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
[14728.997402] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
[14728.998497] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
[14728.999550] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
[14729.000612] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
[14729.001659] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
[14729.002743] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
[14729.003840] [ee95be50] [c0087304] enter_state+0xe4/0xf4
[14729.004899] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
[14729.005952] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
[14729.007008] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
[14729.008071] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
[14729.009126] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
[14729.010200] --- Exception: c01 at 0xfaab878
[14729.010202] LR = 0xfaab7dc
[14729.012189] Instruction dump:
[14729.013175] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
[14729.014444] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6

--
Greetings, Michael.

2009-11-27 00:10:05

by Hin-Tak Leung

[permalink] [raw]
Subject: Re: RTL8187 warnings on suspend

--- On Thu, 26/11/09, Herton Ronaldo Krzesinski <[email protected]> wrote:

> > My approach wasn't good, I have another try, this one
> I couldn't test yet
> > as I'm away from the laptop with rtl8187 until
> tomorrow, but I decided to post
> > it now (sorry for another patch dump, this I hope
> should work):
>
> There were some missing bits, this worked in my tests:
>
> diff --git a/drivers/net/wireless/rtl818x/rtl8187.h
> b/drivers/net/wireless/rtl818x/rtl8187.h
> index bf9175a..6d4bd5c 100644
> --- a/drivers/net/wireless/rtl818x/rtl8187.h
> +++ b/drivers/net/wireless/rtl818x/rtl8187.h
> @@ -134,6 +134,7 @@ struct rtl8187_priv {
> ??? ??? __le32 bits32;
> ??? } *io_dmabuf;
> ??? bool rfkill_off;
> +??? bool stopped;
> };
>
> void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr,
> u32 data);
> diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c
> b/drivers/net/wireless/rtl818x/rtl8187_dev.c
> index 2017ccc..159e5bf 100644
> --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c
> +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c
> @@ -990,6 +990,7 @@ static int rtl8187_start(struct
> ieee80211_hw *dev)
>
> rtl8187_start_exit:
> ???
> mutex_unlock(&priv->conf_mutex);
> +??? priv->stopped = false;
> ??? return ret;
> }
>
> @@ -1022,6 +1023,14 @@ static void rtl8187_stop(struct
> ieee80211_hw *dev)
>
> ??? if (!priv->is_rtl8187b)
> ??? ???
> cancel_delayed_work_sync(&priv->work);
> +
> +#ifdef CONFIG_RTL8187_LEDS
> +??? /* XXX: turn the LED off */
> +???
> cancel_delayed_work_sync(&priv->led_on);
> +??? ieee80211_queue_delayed_work(dev,
> &priv->led_off, 0);
> +???
> flush_delayed_work(&priv->led_off);
> +#endif
> +??? priv->stopped = true;
> }
>
> static int rtl8187_add_interface(struct ieee80211_hw
> *dev,
> diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c
> b/drivers/net/wireless/rtl818x/rtl8187_leds.c
> index cf8a4a4..fd07235 100644
> --- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
> +++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
> @@ -107,6 +107,9 @@ static void
> rtl8187_led_brightness_set(struct led_classdev *led_dev,
> ??? struct ieee80211_hw *hw = led->dev;
> ??? struct rtl8187_priv *priv =
> hw->priv;
>
> +??? if (priv->stopped)
> +??? ??? return;
> +
> ??? if (brightness == LED_OFF) {
> ??? ???
> ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
> ??? ??? /* The LED is off
> for 1/20 sec so that it just blinks. */
> @@ -192,10 +195,8 @@ void rtl8187_leds_init(struct
> ieee80211_hw *dev, u16 custid)
> ???
> ?????"rtl8187-%s::rx",
> wiphy_name(dev->wiphy));
> ??? err = rtl8187_register_led(dev,
> &priv->led_rx, name,
> ??? ???
> ?????ieee80211_get_rx_led_name(dev),
> ledpin);
> -??? if (!err) {
> -??? ???
> ieee80211_queue_delayed_work(dev, &priv->led_on, 0);
> +??? if (!err)
> ??? ??? return;
> -??? }
> ??? /* registration of RX LED failed -
> unregister TX */
> ???
> rtl8187_unregister_led(&priv->led_tx);
> error:
> @@ -208,8 +209,6 @@ void rtl8187_leds_exit(struct
> ieee80211_hw *dev)
> {
> ??? struct rtl8187_priv *priv =
> dev->priv;
>
> -??? /* turn the LED off before exiting */
> -??? ieee80211_queue_delayed_work(dev,
> &priv->led_off, 0);
> ???
> rtl8187_unregister_led(&priv->led_rx);
> ???
> rtl8187_unregister_led(&priv->led_tx);
> ???
> cancel_delayed_work_sync(&priv->led_off);
>
>
> But it is a bit of a hack, I think we should change
> LEDS_OFF case to not have
> to turn the led off on stop/exit (mac80211 already calls
> led off on stop, but
> on rtl8187 because the LEDS_OFF treatment in
> rtl8187_led_brightness_set
> we have to turn it off on exit). I'll see if I can make a
> better patch.
>
> --
> []'s
> Herton
>


Apologies for being not very responsive. This looks a bit ugly - you are trying to set a flag so that if _stop() is called first, most of _led_set() is by-passed... is there a better way?

Hin-Tak




Subject: Re: RTL8187 warnings on suspend

Em Qua 25 Nov 2009, ?s 13:26:15, Michael Buesch escreveu:
>
> [ 76.758422] queueing ieee80211 work while going to suspend
> [ 76.758768] ------------[ cut here ]------------
> [ 76.758927] Badness at net/mac80211/util.c:524
> [ 76.759080] NIP: f244c71c LR: f244c71c CTR: 00000000
> [ 76.759249] REGS: ee95bbb0 TRAP: 0700 Not tainted (2.6.32-rc8-wl-wltest)
> [ 76.759476] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 22082444 XER: 00000000
> [ 76.759856] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
> [ 76.760052] GPR00: f244c71c ee95bc60 efb46000 00000041 00000001 c0041078 00000000 00000002
> [ 76.760490] GPR08: 00000000 00000000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
> [ 76.760927] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
> [ 76.761364] GPR24: ee95bdd8 00000005 c0aa2b74 eebcd114 00000000 eebccc20 ed520800 eebcc300
> [ 76.761858] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
> [ 76.762093] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
> [ 76.762318] Call Trace:
> [ 76.762415] [ee95bc60] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
> [ 76.762738] [ee95bc70] [f26370f8] rtl8187_leds_exit+0x28/0x64 [rtl8187]
> [ 76.762972] [ee95bc90] [f2637b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
> [ 76.763211] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
> [ 76.763436] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
> [ 76.763658] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
> [ 76.763875] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
> [ 76.764110] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
> [ 76.764329] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
> [ 76.764532] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
> [ 76.764764] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
> [ 76.764957] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
> [ 76.765160] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
> [ 76.765339] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
> [ 76.765555] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
> [ 76.765784] [ee95be50] [c0087304] enter_state+0xe4/0xf4
> [ 76.765978] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
> [ 76.766167] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
> [ 76.766352] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
> [ 76.766547] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
> [ 76.766734] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
> [ 76.766935] --- Exception: c01 at 0xfaab878
> [ 76.766937] LR = 0xfaab7dc
> [ 76.767183] Instruction dump:
> [ 76.767305] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
> [ 76.767707] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6
> [ 76.768225] queueing ieee80211 work while going to suspend
<snip>

I think the problem is the call to rtl8187_leds_exit after rtl8187_stop,
because rtl8187_leds_exit calls ieee80211_queue_delayed_work. We can avoid
calling ieee80211_queue_delayed_work, replacing it with simple
queue_delayed_work as was before just to avoid the warning, or may be just
relying on current leds code and check if trigger is NULL, avoid having to turn
of the led inside rtl8187_leds_exit, like the patch below, could you try it?
(patch untested, hope it works)

diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c
index cf8a4a4..7591e3d 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
@@ -109,8 +109,12 @@ static void rtl8187_led_brightness_set(struct led_classdev *led_dev,

if (brightness == LED_OFF) {
ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
- /* The LED is off for 1/20 sec so that it just blinks. */
- ieee80211_queue_delayed_work(hw, &priv->led_on, HZ / 20);
+ /* The LED is off for 1/20 sec so that it just blinks.
+ * If trigger is null it means we are unregistering leds,
+ * so avoid turning it on. */
+ if (led_dev->trigger)
+ ieee80211_queue_delayed_work(hw, &priv->led_on,
+ HZ / 20);
} else
ieee80211_queue_delayed_work(hw, &priv->led_on, 0);
}
@@ -209,7 +213,6 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
struct rtl8187_priv *priv = dev->priv;

/* turn the LED off before exiting */
- ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
rtl8187_unregister_led(&priv->led_rx);
rtl8187_unregister_led(&priv->led_tx);
cancel_delayed_work_sync(&priv->led_off);


--
[]'s
Herton

2009-11-25 22:18:25

by Michael Büsch

[permalink] [raw]
Subject: Re: RTL8187 warnings on suspend

On Wednesday 25 November 2009 22:44:25 Herton Ronaldo Krzesinski wrote:
> Hmm strange, reviewing it now I only see a missing #ifdef CONFIG_RTL8187_LEDS
> around rtl8187_leds_start inside rtl8187_start. Despite it, the patch worked
> here, may be something I'm not seeing...

http://bu3sch.de/misc/rtl8187.JPG

--
Greetings, Michael.

Subject: Re: RTL8187 warnings on suspend

Em Qua 25 Nov 2009, ?s 21:18:05, Herton Ronaldo Krzesinski escreveu:
> Em Qua 25 Nov 2009, ?s 20:18:14, Michael Buesch escreveu:
> > On Wednesday 25 November 2009 22:44:25 Herton Ronaldo Krzesinski wrote:
> > > Hmm strange, reviewing it now I only see a missing #ifdef CONFIG_RTL8187_LEDS
> > > around rtl8187_leds_start inside rtl8187_start. Despite it, the patch worked
> > > here, may be something I'm not seeing...
> >
> > http://bu3sch.de/misc/rtl8187.JPG
>
> My approach wasn't good, I have another try, this one I couldn't test yet
> as I'm away from the laptop with rtl8187 until tomorrow, but I decided to post
> it now (sorry for another patch dump, this I hope should work):

There were some missing bits, this worked in my tests:

diff --git a/drivers/net/wireless/rtl818x/rtl8187.h b/drivers/net/wireless/rtl818x/rtl8187.h
index bf9175a..6d4bd5c 100644
--- a/drivers/net/wireless/rtl818x/rtl8187.h
+++ b/drivers/net/wireless/rtl818x/rtl8187.h
@@ -134,6 +134,7 @@ struct rtl8187_priv {
__le32 bits32;
} *io_dmabuf;
bool rfkill_off;
+ bool stopped;
};

void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data);
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c
index 2017ccc..159e5bf 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c
@@ -990,6 +990,7 @@ static int rtl8187_start(struct ieee80211_hw *dev)

rtl8187_start_exit:
mutex_unlock(&priv->conf_mutex);
+ priv->stopped = false;
return ret;
}

@@ -1022,6 +1023,14 @@ static void rtl8187_stop(struct ieee80211_hw *dev)

if (!priv->is_rtl8187b)
cancel_delayed_work_sync(&priv->work);
+
+#ifdef CONFIG_RTL8187_LEDS
+ /* XXX: turn the LED off */
+ cancel_delayed_work_sync(&priv->led_on);
+ ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
+ flush_delayed_work(&priv->led_off);
+#endif
+ priv->stopped = true;
}

static int rtl8187_add_interface(struct ieee80211_hw *dev,
diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c
index cf8a4a4..fd07235 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
@@ -107,6 +107,9 @@ static void rtl8187_led_brightness_set(struct led_classdev *led_dev,
struct ieee80211_hw *hw = led->dev;
struct rtl8187_priv *priv = hw->priv;

+ if (priv->stopped)
+ return;
+
if (brightness == LED_OFF) {
ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
/* The LED is off for 1/20 sec so that it just blinks. */
@@ -192,10 +195,8 @@ void rtl8187_leds_init(struct ieee80211_hw *dev, u16 custid)
"rtl8187-%s::rx", wiphy_name(dev->wiphy));
err = rtl8187_register_led(dev, &priv->led_rx, name,
ieee80211_get_rx_led_name(dev), ledpin);
- if (!err) {
- ieee80211_queue_delayed_work(dev, &priv->led_on, 0);
+ if (!err)
return;
- }
/* registration of RX LED failed - unregister TX */
rtl8187_unregister_led(&priv->led_tx);
error:
@@ -208,8 +209,6 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
{
struct rtl8187_priv *priv = dev->priv;

- /* turn the LED off before exiting */
- ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
rtl8187_unregister_led(&priv->led_rx);
rtl8187_unregister_led(&priv->led_tx);
cancel_delayed_work_sync(&priv->led_off);


But it is a bit of a hack, I think we should change LEDS_OFF case to not have
to turn the led off on stop/exit (mac80211 already calls led off on stop, but
on rtl8187 because the LEDS_OFF treatment in rtl8187_led_brightness_set
we have to turn it off on exit). I'll see if I can make a better patch.

--
[]'s
Herton

2009-11-27 17:48:58

by Larry Finger

[permalink] [raw]
Subject: Re: RTL8187 warnings on suspend

On 11/27/2009 05:45 AM, Herton Ronaldo Krzesinski wrote:
>
> Also because we don't register assoc/radio leds, we end up now having to put
> led switch code in rtl8187_stop, and assume led always on in tx/rx, this is
> something now worth to look and fix.
>
> A better patch is below, tested here now too, avoiding adding the extra stopped
> flag:

I cannot test with suspend to RAM as it fails on my computer even without
rtl8187 being loaded. This patch survived my load/unload tests, but failed when
I tried unplugging/plugging the device - it crashed KDE and I ended up at the X
login screen. Without the patch, I have not seen that failure.

Larry

Subject: Re: RTL8187 warnings on suspend

Em Qui 26 Nov 2009, ?s 22:10:10, Hin-Tak Leung escreveu:
> --- On Thu, 26/11/09, Herton Ronaldo Krzesinski <[email protected]> wrote:
>
> > > My approach wasn't good, I have another try, this one
> > I couldn't test yet
> > > as I'm away from the laptop with rtl8187 until
> > tomorrow, but I decided to post
> > > it now (sorry for another patch dump, this I hope
> > should work):
> >
> > There were some missing bits, this worked in my tests:
> >
> > diff --git a/drivers/net/wireless/rtl818x/rtl8187.h
> > b/drivers/net/wireless/rtl818x/rtl8187.h
> > index bf9175a..6d4bd5c 100644
> > --- a/drivers/net/wireless/rtl818x/rtl8187.h
> > +++ b/drivers/net/wireless/rtl818x/rtl8187.h
> > @@ -134,6 +134,7 @@ struct rtl8187_priv {
> > __le32 bits32;
> > } *io_dmabuf;
> > bool rfkill_off;
> > + bool stopped;
> > };
> >
> > void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr,
> > u32 data);
> > diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c
> > b/drivers/net/wireless/rtl818x/rtl8187_dev.c
> > index 2017ccc..159e5bf 100644
> > --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c
> > +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c
> > @@ -990,6 +990,7 @@ static int rtl8187_start(struct
> > ieee80211_hw *dev)
> >
> > rtl8187_start_exit:
> >
> > mutex_unlock(&priv->conf_mutex);
> > + priv->stopped = false;
> > return ret;
> > }
> >
> > @@ -1022,6 +1023,14 @@ static void rtl8187_stop(struct
> > ieee80211_hw *dev)
> >
> > if (!priv->is_rtl8187b)
> >
> > cancel_delayed_work_sync(&priv->work);
> > +
> > +#ifdef CONFIG_RTL8187_LEDS
> > + /* XXX: turn the LED off */
> > +
> > cancel_delayed_work_sync(&priv->led_on);
> > + ieee80211_queue_delayed_work(dev,
> > &priv->led_off, 0);
> > +
> > flush_delayed_work(&priv->led_off);
> > +#endif
> > + priv->stopped = true;
> > }
> >
> > static int rtl8187_add_interface(struct ieee80211_hw
> > *dev,
> > diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c
> > b/drivers/net/wireless/rtl818x/rtl8187_leds.c
> > index cf8a4a4..fd07235 100644
> > --- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
> > +++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
> > @@ -107,6 +107,9 @@ static void
> > rtl8187_led_brightness_set(struct led_classdev *led_dev,
> > struct ieee80211_hw *hw = led->dev;
> > struct rtl8187_priv *priv =
> > hw->priv;
> >
> > + if (priv->stopped)
> > + return;
> > +
> > if (brightness == LED_OFF) {
> >
> > ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
> > /* The LED is off
> > for 1/20 sec so that it just blinks. */
> > @@ -192,10 +195,8 @@ void rtl8187_leds_init(struct
> > ieee80211_hw *dev, u16 custid)
> >
> > "rtl8187-%s::rx",
> > wiphy_name(dev->wiphy));
> > err = rtl8187_register_led(dev,
> > &priv->led_rx, name,
> >
> > ieee80211_get_rx_led_name(dev),
> > ledpin);
> > - if (!err) {
> > -
> > ieee80211_queue_delayed_work(dev, &priv->led_on, 0);
> > + if (!err)
> > return;
> > - }
> > /* registration of RX LED failed -
> > unregister TX */
> >
> > rtl8187_unregister_led(&priv->led_tx);
> > error:
> > @@ -208,8 +209,6 @@ void rtl8187_leds_exit(struct
> > ieee80211_hw *dev)
> > {
> > struct rtl8187_priv *priv =
> > dev->priv;
> >
> > - /* turn the LED off before exiting */
> > - ieee80211_queue_delayed_work(dev,
> > &priv->led_off, 0);
> >
> > rtl8187_unregister_led(&priv->led_rx);
> >
> > rtl8187_unregister_led(&priv->led_tx);
> >
> > cancel_delayed_work_sync(&priv->led_off);
> >
> >
> > But it is a bit of a hack, I think we should change
> > LEDS_OFF case to not have
> > to turn the led off on stop/exit (mac80211 already calls
> > led off on stop, but
> > on rtl8187 because the LEDS_OFF treatment in
> > rtl8187_led_brightness_set
> > we have to turn it off on exit). I'll see if I can make a
> > better patch.
> >
>
>
> Apologies for being not very responsive. This looks a bit ugly - you are trying to set a flag so that if _stop() is called first, most of _led_set() is by-passed... is there a better way?

_stop will always be called first in suspend, mac80211 calls everything in
right order. The problem here is that in suspend the device is disconnected
(probably because we don't have any reset/resume support), so
rtl8187_disconnect is called while mac80211 is already suspended.
In rtl8187_disconnect we unregister the leds, and the leds subsystem calls
rtl8187_led_brightness_set to turn the led off again, which calls
ieee80211_queue_delayed_work and thus the warning.

Also because we don't register assoc/radio leds, we end up now having to put
led switch code in rtl8187_stop, and assume led always on in tx/rx, this is
something now worth to look and fix.

A better patch is below, tested here now too, avoiding adding the extra stopped
flag:

diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c
index 2017ccc..25cd10c 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c
@@ -1022,6 +1022,13 @@ static void rtl8187_stop(struct ieee80211_hw *dev)

if (!priv->is_rtl8187b)
cancel_delayed_work_sync(&priv->work);
+
+#ifdef CONFIG_RTL8187_LEDS
+ /* XXX: turn the LED off */
+ cancel_delayed_work_sync(&priv->led_on);
+ ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
+ flush_delayed_work(&priv->led_off);
+#endif
}

static int rtl8187_add_interface(struct ieee80211_hw *dev,
diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c
index cf8a4a4..f7f43c6 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
@@ -107,6 +107,16 @@ static void rtl8187_led_brightness_set(struct led_classdev *led_dev,
struct ieee80211_hw *hw = led->dev;
struct rtl8187_priv *priv = hw->priv;

+ /* Don't queue led work if we are unregistering, we and mac80211 already
+ * turns led off on rtl8187 stop, and we get warnings on suspend without
+ * this, as interface is already suspended and we can't call anymore
+ * ieee80211_queue_delayed_work. We depend here on the fact that
+ * led_classdev_unregister calls led_trigger_set(led_dev, NULL), and
+ * trigger is set to NULL before led_set_brightness inside
+ * led_trigger_set */
+ if (!led_dev->trigger)
+ return;
+
if (brightness == LED_OFF) {
ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
/* The LED is off for 1/20 sec so that it just blinks. */
@@ -208,8 +218,6 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
{
struct rtl8187_priv *priv = dev->priv;

- /* turn the LED off before exiting */
- ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
rtl8187_unregister_led(&priv->led_rx);
rtl8187_unregister_led(&priv->led_tx);
cancel_delayed_work_sync(&priv->led_off);


>
> Hin-Tak
>
>
>
>

--
[]'s
Herton

Subject: Re: RTL8187 warnings on suspend

Em Qua 25 Nov 2009, ?s 18:57:40, Michael Buesch escreveu:
> On Wednesday 25 November 2009 20:55:00 Herton Ronaldo Krzesinski wrote:
> > Em Qua 25 Nov 2009, ?s 17:29:21, Michael Buesch escreveu:
> > > On Wednesday 25 November 2009 19:25:39 Herton Ronaldo Krzesinski wrote:
> > > > of the led inside rtl8187_leds_exit, like the patch below, could you try it?
> > >
> > > Does not completely fix it
> >
> > Indeed, ieee80211_queue_delayed_work run also in rtl8187_led_brightness_set...
> > my patch didn't fix anything... I think the only way is starting and stopping
> > leds in start and stop, the following patch should do it:
>
> That completely crashes the machine on suspend. I can take a picture of the crash,
> but I guess you can easily reproduce it...

Hmm strange, reviewing it now I only see a missing #ifdef CONFIG_RTL8187_LEDS
around rtl8187_leds_start inside rtl8187_start. Despite it, the patch worked
here, may be something I'm not seeing...

--
[]'s
Herton

Subject: Re: RTL8187 warnings on suspend

Em Qua 25 Nov 2009, ?s 20:18:14, Michael Buesch escreveu:
> On Wednesday 25 November 2009 22:44:25 Herton Ronaldo Krzesinski wrote:
> > Hmm strange, reviewing it now I only see a missing #ifdef CONFIG_RTL8187_LEDS
> > around rtl8187_leds_start inside rtl8187_start. Despite it, the patch worked
> > here, may be something I'm not seeing...
>
> http://bu3sch.de/misc/rtl8187.JPG

My approach wasn't good, I have another try, this one I couldn't test yet
as I'm away from the laptop with rtl8187 until tomorrow, but I decided to post
it now (sorry for another patch dump, this I hope should work):

diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c
index 2017ccc..25cd10c 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c
@@ -1022,6 +1022,13 @@ static void rtl8187_stop(struct ieee80211_hw *dev)

if (!priv->is_rtl8187b)
cancel_delayed_work_sync(&priv->work);
+
+#ifdef CONFIG_RTL8187_LEDS
+ /* XXX: turn the LED off */
+ cancel_delayed_work_sync(&priv->led_on);
+ ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
+ flush_delayed_work(&priv->led_off);
+#endif
}

static int rtl8187_add_interface(struct ieee80211_hw *dev,
diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c
index cf8a4a4..40419b3 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
@@ -107,6 +107,10 @@ static void rtl8187_led_brightness_set(struct led_classdev *led_dev,
struct ieee80211_hw *hw = led->dev;
struct rtl8187_priv *priv = hw->priv;

+ /* Don't change the LED, when the device is down. */
+ if (priv->mode == NL80211_IFTYPE_UNSPECIFIED)
+ return;
+
if (brightness == LED_OFF) {
ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
/* The LED is off for 1/20 sec so that it just blinks. */
@@ -208,8 +212,6 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
{
struct rtl8187_priv *priv = dev->priv;

- /* turn the LED off before exiting */
- ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
rtl8187_unregister_led(&priv->led_rx);
rtl8187_unregister_led(&priv->led_tx);
cancel_delayed_work_sync(&priv->led_off);


--
[]'s
Herton

Subject: Re: RTL8187 warnings on suspend

Em Qua 25 Nov 2009, ?s 17:29:21, Michael Buesch escreveu:
> On Wednesday 25 November 2009 19:25:39 Herton Ronaldo Krzesinski wrote:
> > of the led inside rtl8187_leds_exit, like the patch below, could you try it?
>
> Does not completely fix it

Indeed, ieee80211_queue_delayed_work run also in rtl8187_led_brightness_set...
my patch didn't fix anything... I think the only way is starting and stopping
leds in start and stop, the following patch should do it:

diff --git a/drivers/net/wireless/rtl818x/rtl8187.h b/drivers/net/wireless/rtl818x/rtl8187.h
index bf9175a..4b85a77 100644
--- a/drivers/net/wireless/rtl818x/rtl8187.h
+++ b/drivers/net/wireless/rtl818x/rtl8187.h
@@ -133,6 +133,9 @@ struct rtl8187_priv {
__le16 bits16;
__le32 bits32;
} *io_dmabuf;
+#ifdef CONFIG_RTL8187_LEDS
+ u16 custid;
+#endif
bool rfkill_off;
};

diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c
index 2017ccc..ad95bdd 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c
@@ -990,6 +990,7 @@ static int rtl8187_start(struct ieee80211_hw *dev)

rtl8187_start_exit:
mutex_unlock(&priv->conf_mutex);
+ rtl8187_leds_start(dev);
return ret;
}

@@ -1022,6 +1023,10 @@ static void rtl8187_stop(struct ieee80211_hw *dev)

if (!priv->is_rtl8187b)
cancel_delayed_work_sync(&priv->work);
+
+#ifdef CONFIG_RTL8187_LEDS
+ rtl8187_leds_stop(dev);
+#endif
}

static int rtl8187_add_interface(struct ieee80211_hw *dev,
@@ -1522,8 +1527,7 @@ static int __devinit rtl8187_probe(struct usb_interface *intf,

#ifdef CONFIG_RTL8187_LEDS
eeprom_93cx6_read(&eeprom, 0x3F, &reg);
- reg &= 0xFF;
- rtl8187_leds_init(dev, reg);
+ priv->custid = reg & 0xFF;
#endif
rtl8187_rfkill_init(dev);

@@ -1546,9 +1550,6 @@ static void __devexit rtl8187_disconnect(struct usb_interface *intf)
if (!dev)
return;

-#ifdef CONFIG_RTL8187_LEDS
- rtl8187_leds_exit(dev);
-#endif
rtl8187_rfkill_exit(dev);
ieee80211_unregister_hw(dev);

diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c
index cf8a4a4..a48407f 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
@@ -149,7 +149,7 @@ static void rtl8187_unregister_led(struct rtl8187_led *led)
led->dev = NULL;
}

-void rtl8187_leds_init(struct ieee80211_hw *dev, u16 custid)
+void rtl8187_leds_start(struct ieee80211_hw *dev)
{
struct rtl8187_priv *priv = dev->priv;
char name[RTL8187_LED_MAX_NAME_LEN + 1];
@@ -159,8 +159,8 @@ void rtl8187_leds_init(struct ieee80211_hw *dev, u16 custid)
/* According to the vendor driver, the LED operation depends on the
* customer ID encoded in the EEPROM
*/
- printk(KERN_INFO "rtl8187: Customer ID is 0x%02X\n", custid);
- switch (custid) {
+ printk(KERN_INFO "rtl8187: Customer ID is 0x%02X\n", priv->custid);
+ switch (priv->custid) {
case EEPROM_CID_RSVD0:
case EEPROM_CID_RSVD1:
case EEPROM_CID_SERCOMM_PS:
@@ -204,7 +204,7 @@ error:
cancel_delayed_work_sync(&priv->led_on);
}

-void rtl8187_leds_exit(struct ieee80211_hw *dev)
+void rtl8187_leds_stop(struct ieee80211_hw *dev)
{
struct rtl8187_priv *priv = dev->priv;

diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.h b/drivers/net/wireless/rtl818x/rtl8187_leds.h
index a033202..2751430 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_leds.h
+++ b/drivers/net/wireless/rtl818x/rtl8187_leds.h
@@ -49,8 +49,8 @@ struct rtl8187_led {
char name[RTL8187_LED_MAX_NAME_LEN + 1];
};

-void rtl8187_leds_init(struct ieee80211_hw *dev, u16 code);
-void rtl8187_leds_exit(struct ieee80211_hw *dev);
+void rtl8187_leds_start(struct ieee80211_hw *dev);
+void rtl8187_leds_stop(struct ieee80211_hw *dev);

#endif /* def CONFIG_RTL8187_LED */



>
> [14727.733053] Freezing user space processes ... (elapsed 0.00 seconds) done.
> [14727.735205] Freezing remaining freezable tasks ... (elapsed 1.15 seconds) done.
> [14728.918070] queueing ieee80211 work while going to suspend
> [14728.919327] ------------[ cut here ]------------
> [14728.920372] Badness at net/mac80211/util.c:524
> [14728.921401] NIP: f244c71c LR: f244c71c CTR: 00000000
> [14728.922441] REGS: ee95bb50 TRAP: 0700 Tainted: G W (2.6.32-rc8-wl-wltest)
> [14728.923562] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 22082444 XER: 00000000
> [14728.924787] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
> [14728.924980] GPR00: f244c71c ee95bc00 efb46000 00000041 00000001 c0041078 00000000 00000002
> [14728.926257] GPR08: 00000000 00000000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
> [14728.927536] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
> [14728.928836] GPR24: ee95bdd8 00000005 c0aa2b74 00000000 00000000 ed7db04c ed7dac20 ed7da300
> [14728.931137] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
> [14728.932305] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
> [14728.933462] Call Trace:
> [14728.934487] [ee95bc00] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
> [14728.935735] [ee95bc10] [f2d480e0] rtl8187_led_brightness_set+0x34/0x88 [rtl8187]
> [14728.936930] [ee95bc30] [c05306f8] led_trigger_set+0xf4/0xf8
> [14728.938071] [ee95bc50] [c05301fc] led_classdev_unregister+0x64/0xa8
> [14728.939236] [ee95bc70] [f2d48078] rtl8187_leds_exit+0x20/0x54 [rtl8187]
> [14728.940411] [ee95bc90] [f2d48b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
> [14728.941588] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
> [14728.942752] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
> [14728.943910] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
> [14728.945065] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
> [14728.946231] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
> [14728.947387] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
> [14728.948526] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
> [14728.949691] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
> [14728.950822] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
> [14728.951963] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
> [14728.953085] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
> [14728.954230] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
> [14728.955372] [ee95be50] [c0087304] enter_state+0xe4/0xf4
> [14728.956475] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
> [14728.957565] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
> [14728.958637] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
> [14728.959712] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
> [14728.960771] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
> [14728.961832] --- Exception: c01 at 0xfaab878
> [14728.961834] LR = 0xfaab7dc
> [14728.963792] Instruction dump:
> [14728.964761] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
> [14728.966006] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6
> [14728.967624] queueing ieee80211 work while going to suspend
> [14728.968740] ------------[ cut here ]------------
> [14728.969762] Badness at net/mac80211/util.c:524
> [14728.970769] NIP: f244c71c LR: f244c71c CTR: 00000000
> [14728.971797] REGS: ee95bb50 TRAP: 0700 Tainted: G W (2.6.32-rc8-wl-wltest)
> [14728.972919] MSR: 00029032 <EE,ME,CE,IR,DR> CR: 42082444 XER: 00000000
> [14728.974155] TASK = efb46000[2479] 'pbbuttonsd' THREAD: ee95a000
> [14728.974347] GPR00: f244c71c ee95bc00 efb46000 00000041 00000001 c0041078 00000000 00000002
> [14728.975641] GPR08: 00000000 ee95a000 efb46000 00009032 22082444 100351d0 bff9c428 bff9c42c
> [14728.976929] GPR16: 0fc6fb2c 0fc6fa88 c0811598 c0983594 c0aa0000 00000002 00000004 00000001
> [14728.978240] GPR24: ee95bdd8 00000005 c0aa2b74 00000000 00000000 ed7dafc0 ed7dac20 ed7da300
> [14728.980501] NIP [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
> [14728.981667] LR [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211]
> [14728.982831] Call Trace:
> [14728.983858] [ee95bc00] [f244c71c] ieee80211_queue_delayed_work+0x48/0x5c [mac80211] (unreliable)
> [14728.985116] [ee95bc10] [f2d480e0] rtl8187_led_brightness_set+0x34/0x88 [rtl8187]
> [14728.986322] [ee95bc30] [c05306f8] led_trigger_set+0xf4/0xf8
> [14728.987464] [ee95bc50] [c05301fc] led_classdev_unregister+0x64/0xa8
> [14728.988610] [ee95bc70] [f2d48084] rtl8187_leds_exit+0x2c/0x54 [rtl8187]
> [14728.989749] [ee95bc90] [f2d48b84] rtl8187_disconnect+0x28/0x74 [rtl8187]
> [14728.990866] [ee95bcb0] [c04aa084] usb_unbind_interface+0x170/0x1bc
> [14728.991962] [ee95bcd0] [c0417a14] __device_release_driver+0x84/0xe4
> [14728.993057] [ee95bcf0] [c0417b68] device_release_driver+0x28/0x44
> [14728.994146] [ee95bd10] [c04aa308] usb_driver_release_interface+0x90/0x94
> [14728.995249] [ee95bd30] [c04aa3c4] usb_forced_unbind_intf+0x24/0x48
> [14728.996338] [ee95bd50] [c04aa4c0] do_unbind_rebind+0xd8/0xe0
> [14728.997402] [ee95bd70] [c04aa5f0] usb_external_suspend_device+0x24/0x74
> [14728.998497] [ee95bda0] [c04aa6b0] usb_suspend+0x70/0x9c
> [14728.999550] [ee95bdb0] [c049ced8] usb_dev_suspend+0x1c/0x2c
> [14729.000612] [ee95bdc0] [c041c8ec] pm_op+0x19c/0x1f8
> [14729.001659] [ee95bdd0] [c041d1ec] dpm_suspend_start+0x384/0x4e8
> [14729.002743] [ee95be30] [c00870b0] suspend_devices_and_enter+0x5c/0x1cc
> [14729.003840] [ee95be50] [c0087304] enter_state+0xe4/0xf4
> [14729.004899] [ee95be70] [c0424e54] pmu_ioctl+0x84/0x1e0
> [14729.005952] [ee95be80] [c00fc8dc] vfs_ioctl+0xb8/0xc4
> [14729.007008] [ee95bea0] [c00fcab8] do_vfs_ioctl+0x84/0x7ec
> [14729.008071] [ee95bf10] [c00fd260] sys_ioctl+0x40/0x88
> [14729.009126] [ee95bf40] [c0017334] ret_from_syscall+0x0/0x38
> [14729.010200] --- Exception: c01 at 0xfaab878
> [14729.010202] LR = 0xfaab7dc
> [14729.012189] Instruction dump:
> [14729.013175] 880300de 2f800000 419e001c 80630048 4800914d 80010014 38210010 7c0803a6
> [14729.014444] 4e800020 3c60f246 38638bb0 48008bb1 <0fe00000> 80010014 38210010 7c0803a6
>
>

--
[]'s
Herton

2009-12-08 22:07:18

by Larry Finger

[permalink] [raw]
Subject: Re: RTL8187 warnings on suspend

On 12/01/2009 07:49 AM, Herton Ronaldo Krzesinski wrote:
> Subject: [PATCH] rtl8187: add radio led and fix warnings on suspend
>
> Michael Buesch reports that his rtl8187 gives warnings on suspend
> ("queueing ieee80211 work while going to suspend" warnings), as rtl8187
> can call ieee80211_queue_delayed_work after mac80211 is suspended.
>
> This change enhances rtl8187 led code so we can avoid queuing work after
> mac80211 is suspended: now we register a radio led and make additional
> checks to ensure led is off/on properly as mac80211 wants.
>
> Signed-off-by: Herton Ronaldo Krzesinski <[email protected]>
> ---
> drivers/net/wireless/rtl818x/rtl8187.h | 1 +
> drivers/net/wireless/rtl818x/rtl8187_leds.c | 66 +++++++++++++++++---------
> drivers/net/wireless/rtl818x/rtl8187_leds.h | 2 +
> 3 files changed, 46 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/net/wireless/rtl818x/rtl8187.h b/drivers/net/wireless/rtl818x/rtl8187.h
> index bf9175a..861ab0b 100644
> --- a/drivers/net/wireless/rtl818x/rtl8187.h
> +++ b/drivers/net/wireless/rtl818x/rtl8187.h
> @@ -104,6 +104,7 @@ struct rtl8187_priv {
> struct delayed_work work;
> struct ieee80211_hw *dev;
> #ifdef CONFIG_RTL8187_LEDS
> + struct rtl8187_led led_radio;
> struct rtl8187_led led_tx;
> struct rtl8187_led led_rx;
> struct delayed_work led_on;
> diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c
> index cf8a4a4..84fdcdb 100644
> --- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
> +++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
> @@ -106,18 +106,31 @@ static void rtl8187_led_brightness_set(struct led_classdev *led_dev,
> led_dev);
> struct ieee80211_hw *hw = led->dev;
> struct rtl8187_priv *priv = hw->priv;
> -
> - if (brightness == LED_OFF) {
> - ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
> - /* The LED is off for 1/20 sec so that it just blinks. */
> - ieee80211_queue_delayed_work(hw, &priv->led_on, HZ / 20);
> - } else
> - ieee80211_queue_delayed_work(hw, &priv->led_on, 0);
> + static bool radio_on;
> +

if (!hw)
return;

> + if (led->is_radio) {
> + if (brightness == LED_FULL) {
> + ieee80211_queue_delayed_work(hw, &priv->led_on, 0);

After adding the above change to stop processing for any LED that has
been deleted, the rmmod/insmod loop is running on my system. Still
testing, the the cycle count is nearing 200. After 4-500 cycles, I'll
try physically removing the device while active, and some of the
suspend to disk cycles as well.

Larry

2009-12-01 20:11:07

by Larry Finger

[permalink] [raw]
Subject: Re: RTL8187 warnings on suspend

On 12/01/2009 07:49 AM, Herton Ronaldo Krzesinski wrote:
> Michael Buesch reports that his rtl8187 gives warnings on suspend
> ("queueing ieee80211 work while going to suspend" warnings), as rtl8187
> can call ieee80211_queue_delayed_work after mac80211 is suspended.
>
> This change enhances rtl8187 led code so we can avoid queuing work after
> mac80211 is suspended: now we register a radio led and make additional
> checks to ensure led is off/on properly as mac80211 wants.
>
> Signed-off-by: Herton Ronaldo Krzesinski <[email protected]>
> ---

NACK. After a few minutes of a rmmod/insmod infinite loop, I go a kernel
oops. I did not capture any of the details.

Larry




Subject: Re: RTL8187 warnings on suspend

Em Sex 27 Nov 2009, ?s 15:49:02, Larry Finger escreveu:
> On 11/27/2009 05:45 AM, Herton Ronaldo Krzesinski wrote:
> >
> > Also because we don't register assoc/radio leds, we end up now having to put
> > led switch code in rtl8187_stop, and assume led always on in tx/rx, this is
> > something now worth to look and fix.
> >
> > A better patch is below, tested here now too, avoiding adding the extra stopped
> > flag:
>
> I cannot test with suspend to RAM as it fails on my computer even without
> rtl8187 being loaded. This patch survived my load/unload tests, but failed when
> I tried unplugging/plugging the device - it crashed KDE and I ended up at the X
> login screen. Without the patch, I have not seen that failure.

Please review and test patch below, should be the proper/final fix for the
issue. As far as I could test, leds are working better (turning on/off now as
requested by mac80211) and no warnings anymore on suspend. If no problems
are found, I'll resend it to be included in the kernel:

>From 3cb2ee681914b3388de82194df63af016c68bec3 Mon Sep 17 00:00:00 2001
From: Herton Ronaldo Krzesinski <[email protected]>
Date: Tue, 1 Dec 2009 11:35:53 -0200
Subject: [PATCH] rtl8187: add radio led and fix warnings on suspend

Michael Buesch reports that his rtl8187 gives warnings on suspend
("queueing ieee80211 work while going to suspend" warnings), as rtl8187
can call ieee80211_queue_delayed_work after mac80211 is suspended.

This change enhances rtl8187 led code so we can avoid queuing work after
mac80211 is suspended: now we register a radio led and make additional
checks to ensure led is off/on properly as mac80211 wants.

Signed-off-by: Herton Ronaldo Krzesinski <[email protected]>
---
drivers/net/wireless/rtl818x/rtl8187.h | 1 +
drivers/net/wireless/rtl818x/rtl8187_leds.c | 66 +++++++++++++++++---------
drivers/net/wireless/rtl818x/rtl8187_leds.h | 2 +
3 files changed, 46 insertions(+), 23 deletions(-)

diff --git a/drivers/net/wireless/rtl818x/rtl8187.h b/drivers/net/wireless/rtl818x/rtl8187.h
index bf9175a..861ab0b 100644
--- a/drivers/net/wireless/rtl818x/rtl8187.h
+++ b/drivers/net/wireless/rtl818x/rtl8187.h
@@ -104,6 +104,7 @@ struct rtl8187_priv {
struct delayed_work work;
struct ieee80211_hw *dev;
#ifdef CONFIG_RTL8187_LEDS
+ struct rtl8187_led led_radio;
struct rtl8187_led led_tx;
struct rtl8187_led led_rx;
struct delayed_work led_on;
diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c
index cf8a4a4..84fdcdb 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_leds.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c
@@ -106,18 +106,31 @@ static void rtl8187_led_brightness_set(struct led_classdev *led_dev,
led_dev);
struct ieee80211_hw *hw = led->dev;
struct rtl8187_priv *priv = hw->priv;
-
- if (brightness == LED_OFF) {
- ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
- /* The LED is off for 1/20 sec so that it just blinks. */
- ieee80211_queue_delayed_work(hw, &priv->led_on, HZ / 20);
- } else
- ieee80211_queue_delayed_work(hw, &priv->led_on, 0);
+ static bool radio_on;
+
+ if (led->is_radio) {
+ if (brightness == LED_FULL) {
+ ieee80211_queue_delayed_work(hw, &priv->led_on, 0);
+ radio_on = true;
+ } else if (radio_on) {
+ radio_on = false;
+ cancel_delayed_work_sync(&priv->led_on);
+ ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
+ }
+ } else if (radio_on) {
+ if (brightness == LED_OFF) {
+ ieee80211_queue_delayed_work(hw, &priv->led_off, 0);
+ /* The LED is off for 1/20 sec so that it just blinks. */
+ ieee80211_queue_delayed_work(hw, &priv->led_on, HZ / 20);
+ } else
+ ieee80211_queue_delayed_work(hw, &priv->led_on, 0);
+ }
}

static int rtl8187_register_led(struct ieee80211_hw *dev,
struct rtl8187_led *led, const char *name,
- const char *default_trigger, u8 ledpin)
+ const char *default_trigger, u8 ledpin,
+ bool is_radio)
{
int err;
struct rtl8187_priv *priv = dev->priv;
@@ -128,6 +141,7 @@ static int rtl8187_register_led(struct ieee80211_hw *dev,
return -EINVAL;
led->dev = dev;
led->ledpin = ledpin;
+ led->is_radio = is_radio;
strncpy(led->name, name, sizeof(led->name));

led->led_dev.name = led->name;
@@ -145,7 +159,11 @@ static int rtl8187_register_led(struct ieee80211_hw *dev,

static void rtl8187_unregister_led(struct rtl8187_led *led)
{
+ struct ieee80211_hw *hw = led->dev;
+ struct rtl8187_priv *priv = hw->priv;
+
led_classdev_unregister(&led->led_dev);
+ flush_delayed_work(&priv->led_off);
led->dev = NULL;
}

@@ -183,37 +201,39 @@ void rtl8187_leds_init(struct ieee80211_hw *dev, u16 custid)
INIT_DELAYED_WORK(&priv->led_off, led_turn_off);

snprintf(name, sizeof(name),
+ "rtl8187-%s::radio", wiphy_name(dev->wiphy));
+ err = rtl8187_register_led(dev, &priv->led_radio, name,
+ ieee80211_get_radio_led_name(dev), ledpin, true);
+ if (err)
+ return;
+
+ snprintf(name, sizeof(name),
"rtl8187-%s::tx", wiphy_name(dev->wiphy));
err = rtl8187_register_led(dev, &priv->led_tx, name,
- ieee80211_get_tx_led_name(dev), ledpin);
+ ieee80211_get_tx_led_name(dev), ledpin, false);
if (err)
- goto error;
+ goto err_tx;
+
snprintf(name, sizeof(name),
"rtl8187-%s::rx", wiphy_name(dev->wiphy));
err = rtl8187_register_led(dev, &priv->led_rx, name,
- ieee80211_get_rx_led_name(dev), ledpin);
- if (!err) {
- ieee80211_queue_delayed_work(dev, &priv->led_on, 0);
+ ieee80211_get_rx_led_name(dev), ledpin, false);
+ if (!err)
return;
- }
- /* registration of RX LED failed - unregister TX */
+
+ /* registration of LED failed - unregister */
rtl8187_unregister_led(&priv->led_tx);
-error:
- /* If registration of either failed, cancel delayed work */
- cancel_delayed_work_sync(&priv->led_off);
- cancel_delayed_work_sync(&priv->led_on);
+err_tx:
+ rtl8187_unregister_led(&priv->led_radio);
}

void rtl8187_leds_exit(struct ieee80211_hw *dev)
{
struct rtl8187_priv *priv = dev->priv;

- /* turn the LED off before exiting */
- ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
+ rtl8187_unregister_led(&priv->led_radio);
rtl8187_unregister_led(&priv->led_rx);
rtl8187_unregister_led(&priv->led_tx);
- cancel_delayed_work_sync(&priv->led_off);
- cancel_delayed_work_sync(&priv->led_on);
}
#endif /* def CONFIG_RTL8187_LED */

diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.h b/drivers/net/wireless/rtl818x/rtl8187_leds.h
index a033202..efe8041 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_leds.h
+++ b/drivers/net/wireless/rtl818x/rtl8187_leds.h
@@ -47,6 +47,8 @@ struct rtl8187_led {
u8 ledpin;
/* The unique name string for this LED device. */
char name[RTL8187_LED_MAX_NAME_LEN + 1];
+ /* If the LED is radio or tx/rx */
+ bool is_radio;
};

void rtl8187_leds_init(struct ieee80211_hw *dev, u16 code);
--
1.6.5.3



>
> Larry

--
[]'s
Herton

2009-12-01 22:21:50

by Larry Finger

[permalink] [raw]
Subject: Re: RTL8187 warnings on suspend

On 12/01/2009 03:26 PM, Herton Ronaldo Krzesinski wrote:
> Em Ter 01 Dez 2009, ?s 18:11:08, Larry Finger escreveu:
>> On 12/01/2009 07:49 AM, Herton Ronaldo Krzesinski wrote:
>>> Michael Buesch reports that his rtl8187 gives warnings on suspend
>>> ("queueing ieee80211 work while going to suspend" warnings), as rtl8187
>>> can call ieee80211_queue_delayed_work after mac80211 is suspended.
>>>
>>> This change enhances rtl8187 led code so we can avoid queuing work after
>>> mac80211 is suspended: now we register a radio led and make additional
>>> checks to ensure led is off/on properly as mac80211 wants.
>>>
>>> Signed-off-by: Herton Ronaldo Krzesinski <[email protected]>
>>> ---
>>
>> NACK. After a few minutes of a rmmod/insmod infinite loop, I go a kernel
>> oops. I did not capture any of the details.
>
> I can't reproduce here, can you get the oops? Currently I can't guess which is
> missing, I reviewed patch again and can't found anything which could cause the
> issue. Also how is your rmmod/insmod (with ifconfig up involved etc.)?

I'll try to reproduce the panic.

I'm using NetworkManager. As soon as it recognizes the creation of the
wlanX interface, it starts bringing the device up.

My loop is

modprobe -v rtl8187 ; sleep 1 ; modprobe rtl8187 ; echo -n "a" ; sleep 1

Larry


Larry

Subject: Re: RTL8187 warnings on suspend

Em Ter 01 Dez 2009, ?s 18:11:08, Larry Finger escreveu:
> On 12/01/2009 07:49 AM, Herton Ronaldo Krzesinski wrote:
> > Michael Buesch reports that his rtl8187 gives warnings on suspend
> > ("queueing ieee80211 work while going to suspend" warnings), as rtl8187
> > can call ieee80211_queue_delayed_work after mac80211 is suspended.
> >
> > This change enhances rtl8187 led code so we can avoid queuing work after
> > mac80211 is suspended: now we register a radio led and make additional
> > checks to ensure led is off/on properly as mac80211 wants.
> >
> > Signed-off-by: Herton Ronaldo Krzesinski <[email protected]>
> > ---
>
> NACK. After a few minutes of a rmmod/insmod infinite loop, I go a kernel
> oops. I did not capture any of the details.

I can't reproduce here, can you get the oops? Currently I can't guess which is
missing, I reviewed patch again and can't found anything which could cause the
issue. Also how is your rmmod/insmod (with ifconfig up involved etc.)?

>
> Larry
>

--
[]'s
Herton