[ping] Re: eeepc: rfkill on 900A defunct
On 03/09/2011 01:50 PM, Woody Suwalski wrote: > Jiri Slaby wrote: >> On 03/08/2011 11:22 AM, Corentin Chary wrote: >> >>> On Tue, Mar 8, 2011 at 10:06 AM, Jiri Slaby wrote: >>> On 02/28/2011 10:49 AM, Jiri Slaby wrote: > On 11/24/2010 09:18 PM, Matthew Garrett wrote: > >> 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) ? >>> >> 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? -- js -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: eeepc: rfkill on 900A defunct
Jiri Slaby wrote: On 03/08/2011 11:22 AM, Corentin Chary wrote: On Tue, Mar 8, 2011 at 10:06 AM, Jiri Slaby wrote: On 02/28/2011 10:49 AM, Jiri Slaby wrote: On 11/24/2010 09:18 PM, Matthew Garrett wrote: 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) ? 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 -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: eeepc: rfkill on 900A defunct
On 03/08/2011 11:22 AM, Corentin Chary wrote: > On Tue, Mar 8, 2011 at 10:06 AM, Jiri Slaby wrote: >> On 02/28/2011 10:49 AM, Jiri Slaby wrote: >>> On 11/24/2010 09:18 PM, Matthew Garrett wrote: 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) ? It was 900A. thanks, -- js -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: eeepc: rfkill on 900A defunct
On Tue, Mar 8, 2011 at 10:06 AM, Jiri Slaby wrote: > On 02/28/2011 10:49 AM, Jiri Slaby wrote: >> On 11/24/2010 09:18 PM, Matthew Garrett wrote: >>> 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, -- Corentin Chary http://xf.iksaif.net -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: eeepc: rfkill on 900A defunct
On 02/28/2011 10:49 AM, Jiri Slaby wrote:
> On 11/24/2010 09:18 PM, Matthew Garrett wrote:
>> 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.
>> diff --git a/drivers/platform/x86/eeepc-laptop.c
>> b/drivers/platform/x86/eeepc-laptop.c
>> index b2edfdc..8f817d6 100644
>> --- a/drivers/platform/x86/eeepc-laptop.c
>> +++ b/drivers/platform/x86/eeepc-laptop.c
>> @@ -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");
>> +
Re: eeepc: rfkill on 900A defunct
On 11/24/2010 09:18 PM, Matthew Garrett wrote:
> Hm. As a shorter term fix, can you try this (entirely untested!)
> approach?
What is the status of this? Was there any alternative merged?
> diff --git a/drivers/platform/x86/eeepc-laptop.c
> b/drivers/platform/x86/eeepc-laptop.c
> index b2edfdc..8f817d6 100644
> --- a/drivers/platform/x86/eeepc-laptop.c
> +++ b/drivers/platform/x86/eeepc-laptop.c
> @@ -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)
>
Re: eeepc: rfkill on 900A defunct
On 11/24/2010 09:18 PM, Matthew Garrett wrote:
> 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
> diff --git a/drivers/platform/x86/eeepc-laptop.c
> b/drivers/platform/x86/eeepc-laptop.c
> index b2edfdc..8f817d6 100644
> --- a/drivers/platform/x86/eeepc-laptop.c
> +++ b/drivers/platform/x86/eeepc-laptop.c
> @@ -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_rf
Re: eeepc: rfkill on 900A defunct
Matthew Garrett wrote:
Hm. As a shorter term fix, can you try this (entirely untested!)
approach?
diff --git a/drivers/platform/x86/eeepc-laptop.c
b/drivers/platform/x86/eeepc-laptop.c
index b2edfdc..8f817d6 100644
--- a/drivers/platform/x86/eeepc-laptop.c
+++ b/drivers/platform/x86/eeepc-laptop.c
@@ -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,
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
Re: eeepc: rfkill on 900A defunct
Hm. As a shorter term fix, can you try this (entirely untested!)
approach?
diff --git a/drivers/platform/x86/eeepc-laptop.c
b/drivers/platform/x86/eeepc-laptop.c
index b2edfdc..8f817d6 100644
--- a/drivers/platform/x86/eeepc-laptop.c
+++ b/drivers/platform/x86/eeepc-laptop.c
@@ -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,
--
Matthew Garrett | [email protected]
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86"
in
the body of a message to [email protected]
Re: eeepc: rfkill on 900A defunct
On Wed, Nov 24, 2010 at 03:53:35PM +0100, Jiri Slaby wrote: > 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. -- Matthew Garrett | [email protected] -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
