eeepc: rfkill on 900A defunct
Hi,
there is a 900A model out there with wifi at the 2nd bus:
02:00.0 Ethernet controller [0200]: Atheros Communications Inc. AR5001 Wireless Network Adapter [168c:001c] (rev 01)
but without hotplug support (pciehp cannot be bound to it). However the eeepc-laptop driver expects the wifi on the 1st bus (pci_find_bus(0, 1)), so it operates on a NIC on this machine instead of wifi.
Changing the code to pci_find_bus(0, 2) indeed fixes the problem, but I see no way how to determine when to do this. model == "900A" seems to be wrong, because there are other 900A devices which work OK with bus == 1.
Any ideas?
lspci -vvnnxxx:
https://bugzillafiles.novell.org/attachment.cgi?id=370529
dmidecode:
https://bugzillafiles.novell.org/attachment.cgi?id=401633
dmesg:
https://bugzillafiles.novell.org/attachment.cgi?id=370538
The workaround for such machines:
drivers/platform/x86/eeepc-laptop.c +0 -0
@@ -588,7 +588,7 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop
*eeepc)
mutex_lock(&eeepc->hotplug_lock);
if (eeepc->hotplug_slot) {
- bus = pci_find_bus(0, 1);
+ bus = pci_find_bus(0, 2);
if (!bus) {
pr_warning("Unable to find PCI bus 1?\n");
goto out_unlock;
@@ -714,7 +714,7 @@ static struct hotplug_slot_ops
eeepc_hotplug_slot_ops = {
static int eeepc_setup_pci_hotplug(struct eeepc_laptop *eeepc)
{
int ret = -ENOMEM;- struct pci_bus *bus = pci_find_bus(0, 1);
+ struct pci_bus *bus = pci_find_bus(0, 2);
if (!bus) {
pr_err("Unable to find wifi PCI bus\n");thanks,
Signature · 2 lines
js suse labs
Quoted 3 lines · Jiri Slaby
but without hotplug support (pciehp cannot be bound to it). However the eeepc-laptop driver expects the wifi on the 1st bus (
pci_find_bus(0, 1)), so it operates on a NIC on this machine instead of wifi.
Yeah, this really needs to be fixed. We need to shift this code out of eeepc-laptop and just have the PCI core handle it - that is, if we get a hotplug notification, we need to rescan the slot even if we don't have a hotplug driver bound to it. Let me look into that.
Signature · 1 line
Matthew Garrett | [email protected]
Hm. As a shorter term fix, can you try this (entirely untested!) approach?
drivers/platform/x86/eeepc-laptop.c +41 -16
@@ -574,8 +574,9 @@ static bool eeepc_wlan_rfkill_blocked(struct eeepc_laptop *eeepc)return true; } -static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc) +static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc,acpi_handle handle) { +struct pci_dev *port;struct pci_dev *dev;struct pci_bus *bus;bool blocked =eeepc_wlan_rfkill_blocked (eeepc);
@@ -588,9 +589,17 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc)mutex_lock (&eeepc->hotplug_lock);if (eeepc->hotplug_slot) { - bus =pci_find_bus (0 ,1 ); + port =acpi_get_pci_dev (handle); + +if (!port) { +pr_warning ("Unable to find port\n" ); + goto out_unlock; + } + + bus = port->subordinate; +if (!bus) { -pr_warning ("Unable to find PCI bus 1?\n" ); +pr_warning ("Unable to find PCI bus?\n" ); goto out_unlock; }
@@ -636,6 +645,17 @@ out_unlock:mutex_unlock (&eeepc->hotplug_lock); } +static void eeepc_rfkill_hotplug_update (struct eeepc_laptop *eeepc,char *node) +{ +acpi_status status =AE_OK ; +acpi_handle handle; + + status =acpi_get_handle (NULL , node, &handle); + +if (ACPI_SUCCESS (status)) +eeepc_rfkill_hotplug (eeepc, handle); +} +static void eeepc_rfkill_notify (acpi_handle handle,u32 event,void *data) {struct eeepc_laptop *eeepc = data;
@@ -643,7 +663,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)if (event !=ACPI_NOTIFY_BUS_CHECK )return ; -eeepc_rfkill_hotplug (eeepc); +eeepc_rfkill_hotplug (eeepc, handle); } static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc,
@@ -661,6 +681,11 @@ static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc, eeepc);if (ACPI_FAILURE (status))pr_warning ("Failed to register notify on %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill state was +* changed during setup. +*/ +eeepc_rfkill_hotplug (eeepc, handle); }else return -ENODEV ;
@@ -682,6 +707,12 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop *eeepc,if (ACPI_FAILURE (status))pr_err ("Error removing rfkill notify handler %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill +* state was changed after +* eeepc_unregister_rfkill_notifier() +*/ +eeepc_rfkill_hotplug (eeepc, handle); } }
@@ -805,11 +836,7 @@ static void eeepc_rfkill_exit(struct eeepc_laptop *eeepc)rfkill_destroy (eeepc->wlan_rfkill); eeepc->wlan_rfkill =NULL ; } -/* -* Refresh pci hotplug in case the rfkill state was changed after -* eeepc_unregister_rfkill_notifier() -*/ -eeepc_rfkill_hotplug (eeepc); +if (eeepc->hotplug_slot)pci_hp_deregister (eeepc->hotplug_slot);
@@ -878,11 +905,6 @@ static int eeepc_rfkill_init(struct eeepc_laptop *eeepc)eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P5" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P6" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P7" ); -/* -* Refresh pci hotplug in case the rfkill state was changed during -* setup. -*/ -eeepc_rfkill_hotplug (eeepc); exit:if (result && result != -ENODEV )
@@ -917,8 +939,11 @@ static int eeepc_hotk_restore(struct device *device)struct eeepc_laptop *eeepc =dev_get_drvdata (device);/* Refresh both wlan rfkill state and pci hotplug */ -if (eeepc->wlan_rfkill) -eeepc_rfkill_hotplug (eeepc); +if (eeepc->wlan_rfkill) { +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P5" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P6" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P7" ); + }if (eeepc->bluetooth_rfkill) rfkill_set_sw_state(eeepc->bluetooth_rfkill,
Signature · 1 line
Matthew Garrett | [email protected]
Quoted 120 lines · Matthew Garrett
Hm. As a shorter term fix, can you try this (entirely untested!) approach?
drivers/platform/x86/eeepc-laptop.c +36
-14@@ -574,8 +574,9 @@ static bool eeepc_wlan_rfkill_blocked(struct eeepc_laptop *eeepc)return true; } -static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc) +static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc,acpi_handle handle) { +struct pci_dev *port;struct pci_dev *dev;struct pci_bus *bus;bool blocked =eeepc_wlan_rfkill_blocked (eeepc);@@ -588,9 +589,17 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc)mutex_lock (&eeepc->hotplug_lock);if (eeepc->hotplug_slot) { - bus =pci_find_bus (0 ,1 ); + port =acpi_get_pci_dev (handle); + +if (!port) { +pr_warning ("Unable to find port\n" ); + goto out_unlock; + } + + bus = port->subordinate; +if (!bus) { -pr_warning ("Unable to find PCI bus 1?\n" ); +pr_warning ("Unable to find PCI bus?\n" ); goto out_unlock; }@@ -636,6 +645,17 @@ out_unlock:mutex_unlock (&eeepc->hotplug_lock); } +static void eeepc_rfkill_hotplug_update (struct eeepc_laptop *eeepc,char *node) +{ +acpi_status status =AE_OK ; +acpi_handle handle; + + status =acpi_get_handle (NULL , node,&handle); + +if (ACPI_SUCCESS (status)) +eeepc_rfkill_hotplug (eeepc, handle); +} +static void eeepc_rfkill_notify (acpi_handle handle,u32 event,void *data) {struct eeepc_laptop *eeepc = data;@@ -643,7 +663,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)if (event !=ACPI_NOTIFY_BUS_CHECK )return ; -eeepc_rfkill_hotplug (eeepc); +eeepc_rfkill_hotplug (eeepc, handle); } static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc,@@ -661,6 +681,11 @@ static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc, eeepc);if (ACPI_FAILURE (status))pr_warning ("Failed to register notify on %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill state was +* changed during setup. +*/ +eeepc_rfkill_hotplug (eeepc, handle); }else return -ENODEV ;@@ -682,6 +707,12 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop *eeepc,if (ACPI_FAILURE (status))pr_err ("Error removing rfkill notify handler %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill +* state was changed after +* eeepc_unregister_rfkill_notifier() +*/ +eeepc_rfkill_hotplug (eeepc, handle); } }@@ -805,11 +836,7 @@ static void eeepc_rfkill_exit(struct eeepc_laptop *eeepc)rfkill_destroy (eeepc->wlan_rfkill); eeepc->wlan_rfkill =NULL ; } -/* -* Refresh pci hotplug in case the rfkill state was changed after -* eeepc_unregister_rfkill_notifier() -*/ -eeepc_rfkill_hotplug (eeepc); +if (eeepc->hotplug_slot)pci_hp_deregister (eeepc->hotplug_slot);@@ -878,11 +905,6 @@ static int eeepc_rfkill_init(struct eeepc_laptop *eeepc)eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P5" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P6" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P7" ); -/* -* Refresh pci hotplug in case the rfkill state was changed during -* setup. -*/ -eeepc_rfkill_hotplug (eeepc); exit:if (result&& result != -ENODEV )@@ -917,8 +939,11 @@ static int eeepc_hotk_restore(struct device *device)struct eeepc_laptop *eeepc =dev_get_drvdata (device);/* Refresh both wlan rfkill state and pci hotplug */
drivers/platform/x86/eeepc-laptop.c static int eeepc_hotk_restore(struct device *device) · line 949
Quoted 10 lines
drivers/platform/x86/eeepc-laptop.c +5
-2-if (eeepc->wlan_rfkill) -eeepc_rfkill_hotplug (eeepc); +if (eeepc->wlan_rfkill) { +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P5" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P6" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P7" ); + }if (eeepc->bluetooth_rfkill) rfkill_set_sw_state(eeepc->bluetooth_rfkill,
Did a quick test. The 900A seems printing the "Port not found" warning, but the ath5k comes down and then up OK. Mind you, I think they are doing some magic in the BIOS as well, so more testing would be nice ;-) If it works, it may be a good candidate for 2.6.36 as well...
Thanks, Woody
Quoted 2 lines · Matthew Garrett
Hm. As a shorter term fix, can you try this (entirely untested!) approach?
Yes, this one works:
https://bugzilla.novell.com/show_bug.cgi?id=595586#c27
Quoted 126 lines
drivers/platform/x86/eeepc-laptop.c +41
-16@@ -574,8 +574,9 @@ static bool eeepc_wlan_rfkill_blocked(struct eeepc_laptop *eeepc)return true; } -static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc) +static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc,acpi_handle handle) { +struct pci_dev *port;struct pci_dev *dev;struct pci_bus *bus;bool blocked =eeepc_wlan_rfkill_blocked (eeepc);@@ -588,9 +589,17 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc)mutex_lock (&eeepc->hotplug_lock);if (eeepc->hotplug_slot) { - bus =pci_find_bus (0 ,1 ); + port =acpi_get_pci_dev (handle); + +if (!port) { +pr_warning ("Unable to find port\n" ); + goto out_unlock; + } + + bus = port->subordinate; +if (!bus) { -pr_warning ("Unable to find PCI bus 1?\n" ); +pr_warning ("Unable to find PCI bus?\n" ); goto out_unlock; }@@ -636,6 +645,17 @@ out_unlock:mutex_unlock (&eeepc->hotplug_lock); } +static void eeepc_rfkill_hotplug_update (struct eeepc_laptop *eeepc,char *node) +{ +acpi_status status =AE_OK ; +acpi_handle handle; + + status =acpi_get_handle (NULL , node, &handle); + +if (ACPI_SUCCESS (status)) +eeepc_rfkill_hotplug (eeepc, handle); +} +static void eeepc_rfkill_notify (acpi_handle handle,u32 event,void *data) {struct eeepc_laptop *eeepc = data;@@ -643,7 +663,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)if (event !=ACPI_NOTIFY_BUS_CHECK )return ; -eeepc_rfkill_hotplug (eeepc); +eeepc_rfkill_hotplug (eeepc, handle); } static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc,@@ -661,6 +681,11 @@ static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc, eeepc);if (ACPI_FAILURE (status))pr_warning ("Failed to register notify on %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill state was +* changed during setup. +*/ +eeepc_rfkill_hotplug (eeepc, handle); }else return -ENODEV ;@@ -682,6 +707,12 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop *eeepc,if (ACPI_FAILURE (status))pr_err ("Error removing rfkill notify handler %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill +* state was changed after +* eeepc_unregister_rfkill_notifier() +*/ +eeepc_rfkill_hotplug (eeepc, handle); } }@@ -805,11 +836,7 @@ static void eeepc_rfkill_exit(struct eeepc_laptop *eeepc)rfkill_destroy (eeepc->wlan_rfkill); eeepc->wlan_rfkill =NULL ; } -/* -* Refresh pci hotplug in case the rfkill state was changed after -* eeepc_unregister_rfkill_notifier() -*/ -eeepc_rfkill_hotplug (eeepc); +if (eeepc->hotplug_slot)pci_hp_deregister (eeepc->hotplug_slot);@@ -878,11 +905,6 @@ static int eeepc_rfkill_init(struct eeepc_laptop *eeepc)eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P5" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P6" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P7" ); -/* -* Refresh pci hotplug in case the rfkill state was changed during -* setup. -*/ -eeepc_rfkill_hotplug (eeepc); exit:if (result && result != -ENODEV )@@ -917,8 +939,11 @@ static int eeepc_hotk_restore(struct device *device)struct eeepc_laptop *eeepc =dev_get_drvdata (device);/* Refresh both wlan rfkill state and pci hotplug */ -if (eeepc->wlan_rfkill) -eeepc_rfkill_hotplug (eeepc); +if (eeepc->wlan_rfkill) { +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P5" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P6" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P7" ); + }if (eeepc->bluetooth_rfkill) rfkill_set_sw_state(eeepc->bluetooth_rfkill,
Signature · 2 lines
js suse labs
Quoted 2 lines · Matthew Garrett
Hm. As a shorter term fix, can you try this (entirely untested!) approach?
What is the status of this? Was there any alternative merged?
Quoted 116 lines
drivers/platform/x86/eeepc-laptop.c +36
-14@@ -574,8 +574,9 @@ static bool eeepc_wlan_rfkill_blocked(struct eeepc_laptop *eeepc)return true; } -static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc) +static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc,acpi_handle handle) { +struct pci_dev *port;struct pci_dev *dev;struct pci_bus *bus;bool blocked =eeepc_wlan_rfkill_blocked (eeepc);@@ -588,9 +589,17 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc)mutex_lock (&eeepc->hotplug_lock);if (eeepc->hotplug_slot) { - bus =pci_find_bus (0 ,1 ); + port =acpi_get_pci_dev (handle); + +if (!port) { +pr_warning ("Unable to find port\n" ); + goto out_unlock; + } + + bus = port->subordinate; +if (!bus) { -pr_warning ("Unable to find PCI bus 1?\n" ); +pr_warning ("Unable to find PCI bus?\n" ); goto out_unlock; }@@ -636,6 +645,17 @@ out_unlock:mutex_unlock (&eeepc->hotplug_lock); } +static void eeepc_rfkill_hotplug_update (struct eeepc_laptop *eeepc,char *node) +{ +acpi_status status =AE_OK ; +acpi_handle handle; + + status =acpi_get_handle (NULL , node, &handle); + +if (ACPI_SUCCESS (status)) +eeepc_rfkill_hotplug (eeepc, handle); +} +static void eeepc_rfkill_notify (acpi_handle handle,u32 event,void *data) {struct eeepc_laptop *eeepc = data;@@ -643,7 +663,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)if (event !=ACPI_NOTIFY_BUS_CHECK )return ; -eeepc_rfkill_hotplug (eeepc); +eeepc_rfkill_hotplug (eeepc, handle); } static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc,@@ -661,6 +681,11 @@ static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc, eeepc);if (ACPI_FAILURE (status))pr_warning ("Failed to register notify on %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill state was +* changed during setup. +*/ +eeepc_rfkill_hotplug (eeepc, handle); }else return -ENODEV ;@@ -682,6 +707,12 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop *eeepc,if (ACPI_FAILURE (status))pr_err ("Error removing rfkill notify handler %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill +* state was changed after +* eeepc_unregister_rfkill_notifier() +*/ +eeepc_rfkill_hotplug (eeepc, handle); } }@@ -805,11 +836,7 @@ static void eeepc_rfkill_exit(struct eeepc_laptop *eeepc)rfkill_destroy (eeepc->wlan_rfkill); eeepc->wlan_rfkill =NULL ; } -/* -* Refresh pci hotplug in case the rfkill state was changed after -* eeepc_unregister_rfkill_notifier() -*/ -eeepc_rfkill_hotplug (eeepc); +if (eeepc->hotplug_slot)pci_hp_deregister (eeepc->hotplug_slot);@@ -878,11 +905,6 @@ static int eeepc_rfkill_init(struct eeepc_laptop *eeepc)eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P5" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P6" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P7" ); -/* -* Refresh pci hotplug in case the rfkill state was changed during -* setup. -*/ -eeepc_rfkill_hotplug (eeepc); exit:if (result && result != -ENODEV )@@ -917,8 +939,11 @@ static int eeepc_hotk_restore(struct device *device)struct eeepc_laptop *eeepc =dev_get_drvdata (device);/* Refresh both wlan rfkill state and pci hotplug */
drivers/platform/x86/eeepc-laptop.c static int eeepc_hotk_restore(struct device *device) · line 949
Quoted 10 lines
drivers/platform/x86/eeepc-laptop.c +5
-2-if (eeepc->wlan_rfkill) -eeepc_rfkill_hotplug (eeepc); +if (eeepc->wlan_rfkill) { +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P5" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P6" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P7" ); + }if (eeepc->bluetooth_rfkill) rfkill_set_sw_state(eeepc->bluetooth_rfkill,
thanks,
Signature · 1 line
js
Quoted 5 lines · Jiri Slaby
Quoted 2 lines · Matthew Garrett
Hm. As a shorter term fix, can you try this (entirely untested!) approach?
What is the status of this? Was there any alternative merged?
Ping.
Quoted 128 lines
Quoted 116 lines
drivers/platform/x86/eeepc-laptop.c +36
-14@@ -574,8 +574,9 @@ static bool eeepc_wlan_rfkill_blocked(struct eeepc_laptop *eeepc)return true; } -static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc) +static void eeepc_rfkill_hotplug (struct eeepc_laptop *eeepc,acpi_handle handle) { +struct pci_dev *port;struct pci_dev *dev;struct pci_bus *bus;bool blocked =eeepc_wlan_rfkill_blocked (eeepc);@@ -588,9 +589,17 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc)mutex_lock (&eeepc->hotplug_lock);if (eeepc->hotplug_slot) { - bus =pci_find_bus (0 ,1 ); + port =acpi_get_pci_dev (handle); + +if (!port) { +pr_warning ("Unable to find port\n" ); + goto out_unlock; + } + + bus = port->subordinate; +if (!bus) { -pr_warning ("Unable to find PCI bus 1?\n" ); +pr_warning ("Unable to find PCI bus?\n" ); goto out_unlock; }@@ -636,6 +645,17 @@ out_unlock:mutex_unlock (&eeepc->hotplug_lock); } +static void eeepc_rfkill_hotplug_update (struct eeepc_laptop *eeepc,char *node) +{ +acpi_status status =AE_OK ; +acpi_handle handle; + + status =acpi_get_handle (NULL , node, &handle); + +if (ACPI_SUCCESS (status)) +eeepc_rfkill_hotplug (eeepc, handle); +} +static void eeepc_rfkill_notify (acpi_handle handle,u32 event,void *data) {struct eeepc_laptop *eeepc = data;@@ -643,7 +663,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)if (event !=ACPI_NOTIFY_BUS_CHECK )return ; -eeepc_rfkill_hotplug (eeepc); +eeepc_rfkill_hotplug (eeepc, handle); } static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc,@@ -661,6 +681,11 @@ static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc, eeepc);if (ACPI_FAILURE (status))pr_warning ("Failed to register notify on %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill state was +* changed during setup. +*/ +eeepc_rfkill_hotplug (eeepc, handle); }else return -ENODEV ;@@ -682,6 +707,12 @@ static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop *eeepc,if (ACPI_FAILURE (status))pr_err ("Error removing rfkill notify handler %s\n" , node); +/* +* Refresh pci hotplug in case the rfkill +* state was changed after +* eeepc_unregister_rfkill_notifier() +*/ +eeepc_rfkill_hotplug (eeepc, handle); } }@@ -805,11 +836,7 @@ static void eeepc_rfkill_exit(struct eeepc_laptop *eeepc)rfkill_destroy (eeepc->wlan_rfkill); eeepc->wlan_rfkill =NULL ; } -/* -* Refresh pci hotplug in case the rfkill state was changed after -* eeepc_unregister_rfkill_notifier() -*/ -eeepc_rfkill_hotplug (eeepc); +if (eeepc->hotplug_slot)pci_hp_deregister (eeepc->hotplug_slot);@@ -878,11 +905,6 @@ static int eeepc_rfkill_init(struct eeepc_laptop *eeepc)eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P5" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P6" );eeepc_register_rfkill_notifier (eeepc,"\\_SB.PCI0.P0P7" ); -/* -* Refresh pci hotplug in case the rfkill state was changed during -* setup. -*/ -eeepc_rfkill_hotplug (eeepc); exit:if (result && result != -ENODEV )@@ -917,8 +939,11 @@ static int eeepc_hotk_restore(struct device *device)struct eeepc_laptop *eeepc =dev_get_drvdata (device);/* Refresh both wlan rfkill state and pci hotplug */ drivers/platform/x86/eeepc-laptop.c static int eeepc_hotk_restore(struct device *device) · line 949
Quoted 10 lines
drivers/platform/x86/eeepc-laptop.c +5
-2-if (eeepc->wlan_rfkill) -eeepc_rfkill_hotplug (eeepc); +if (eeepc->wlan_rfkill) { +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P5" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P6" ); +eeepc_rfkill_hotplug_update (eeepc,"\\_SB.PCI0.P0P7" ); + }if (eeepc->bluetooth_rfkill) rfkill_set_sw_state(eeepc->bluetooth_rfkill,thanks,
Signature · 1 line
js
Corentin Chary
maintainerQuoted 8 lines · Jiri Slaby
Quoted 5 lines · Jiri Slaby
Quoted 2 lines · Matthew Garrett
Hm. As a shorter term fix, can you try this (entirely untested!) approach?
What is the status of this? Was there any alternative merged?
Ping.
Because this is Matthew's patch, and I have no hardware to test that patch, I'm not touching it.
Jiri, on what models was this patch tested (only got 701 and 901 here) ? Matthew, will you merge this patch in your tree ?
Thanks,
Signature · 2 lines
Corentin Chary http://xf.iksaif.net
Quoted 6 lines · Corentin Chary
Quoted 5 lines · Jiri Slaby
Quoted 4 lines · Jiri Slaby
Quoted 2 lines · Matthew Garrett
Hm. As a shorter term fix, can you try this (entirely untested!) approach?
Quoted 8 lines
Quoted 3 lines
Quoted 1 line
What is the status of this? Was there any alternative merged?
Ping.
Because this is Matthew's patch, and I have no hardware to test that patch, I'm not touching it.
Jiri, on what models was this patch tested (only got 701 and 901 here) ?
It was 900A.
thanks,
Signature · 1 line
js
Quoted 15 lines · Jiri Slaby
Quoted 13 lines · Corentin Chary
Quoted 11 lines · Jiri Slaby
Quoted 7 lines · Jiri Slaby
Quoted 3 lines · Matthew Garrett
Hm. As a shorter term fix, can you try this (entirely untested!) approach?
What is the status of this? Was there any alternative merged?
Ping.
Quoted 9 lines
Quoted 5 lines
Because this is Matthew's patch, and I have no hardware to test that patch, I'm not touching it.
Jiri, on what models was this patch tested (only got 701 and 901 here) ?
It was 900A.
thanks,
I have tested it on 900A and it does the trick.
wlan can now be turned off/on (did not notice the problem before Jiri posted the patch ;-) ). So it should go in...
Woody
Quoted 21 lines · Woody Suwalski
Quoted 20 lines · Jiri Slaby
Quoted 18 lines · Corentin Chary
Quoted 11 lines · Jiri Slaby
Quoted 7 lines · Jiri Slaby
Quoted 3 lines · Matthew Garrett
Hm. As a shorter term fix, can you try this (entirely untested!) approach?
What is the status of this? Was there any alternative merged?
Ping.
Because this is Matthew's patch, and I have no hardware to test that patch, I'm not touching it.
Jiri, on what models was this patch tested (only got 701 and 901 here) ?
Quoted 7 lines
Quoted 4 lines
It was 900A.
thanks,
I have tested it on 900A and it does the trick.
wlan can now be turned off/on (did not notice the problem before Jiri posted the patch ;-) ). So it should go in...
Any updates? Matthew?
Signature · 1 line
js