Re: [PATCH 6/8] eeepc-laptop: Prevent a panic when disabling RT2860 wireless when associated

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Oct 15, 2009 at 4:59 AM, Len Brown <lenb@xxxxxxxxxx> wrote:
> From: Darren Salt <linux@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
>
> This works around what I think is actually a bug in rt2860sta which is
> triggered when the hardware "disappears" from beneath the driver, i.e. when
> wireless is toggled off via ACPI. It does so by ensuring that the rfkill
> soft-block flag is set before the hardware is disabled.
>
> I do not know whether this patch is required if rt2800pci is in use instead
> of rt2860sta; at the time of submission of this patch, I've not been able to
> test this.
>
> (Ref. http://bugzilla.kernel.org/show_bug.cgi?id=13390)
>
> Signed-off-by: Darren Salt <linux@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Len Brown <len.brown@xxxxxxxxx>
> ---
>  drivers/platform/x86/eeepc-laptop.c |   27 +++++++++++++++++++--------
>  1 files changed, 19 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c
> index 789d6ae..d379e74 100644
> --- a/drivers/platform/x86/eeepc-laptop.c
> +++ b/drivers/platform/x86/eeepc-laptop.c
> @@ -150,6 +150,8 @@ struct eeepc_hotk {
>  /* The actual device the driver binds to */
>  static struct eeepc_hotk *ehotk;
>
> +static void eeepc_rfkill_hotplug(bool real);
> +
>  /* Platform device/driver */
>  static int eeepc_hotk_thaw(struct device *device);
>  static int eeepc_hotk_restore(struct device *device);
> @@ -343,7 +345,16 @@ static bool eeepc_wlan_rfkill_blocked(void)
>  static int eeepc_rfkill_set(void *data, bool blocked)
>  {
>        unsigned long asl = (unsigned long)data;
> -       return set_acpi(asl, !blocked);
> +       int ret;
> +
> +       if (asl != CM_ASL_WLAN)
> +               return set_acpi(asl, !blocked);
> +
> +       /* hack to avoid panic with rt2860sta */
> +       if (blocked)
> +               eeepc_rfkill_hotplug(false);
> +       ret = set_acpi(asl, !blocked);
> +       return ret;
>  }
>
>  static const struct rfkill_ops eeepc_rfkill_ops = {
> @@ -643,13 +654,13 @@ static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
>        return 0;
>  }
>
> -static void eeepc_rfkill_hotplug(void)
> +static void eeepc_rfkill_hotplug(bool real)
>  {
>        struct pci_dev *dev;
>        struct pci_bus *bus;
> -       bool blocked = eeepc_wlan_rfkill_blocked();
> +       bool blocked = real ? eeepc_wlan_rfkill_blocked() : true;
>
> -       if (ehotk->wlan_rfkill)
> +       if (real && ehotk->wlan_rfkill)
>                rfkill_set_sw_state(ehotk->wlan_rfkill, blocked);
>
>        mutex_lock(&ehotk->hotplug_lock);
> @@ -692,7 +703,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
>        if (event != ACPI_NOTIFY_BUS_CHECK)
>                return;
>
> -       eeepc_rfkill_hotplug();
> +       eeepc_rfkill_hotplug(true);
>  }
>
>  static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
> @@ -850,7 +861,7 @@ static int eeepc_hotk_restore(struct device *device)
>  {
>        /* Refresh both wlan rfkill state and pci hotplug */
>        if (ehotk->wlan_rfkill)
> -               eeepc_rfkill_hotplug();
> +               eeepc_rfkill_hotplug(true);
>
>        if (ehotk->bluetooth_rfkill)
>                rfkill_set_sw_state(ehotk->bluetooth_rfkill,
> @@ -993,7 +1004,7 @@ static void eeepc_rfkill_exit(void)
>         * Refresh pci hotplug in case the rfkill state was changed after
>         * eeepc_unregister_rfkill_notifier()
>         */
> -       eeepc_rfkill_hotplug();
> +       eeepc_rfkill_hotplug(true);
>        if (ehotk->hotplug_slot)
>                pci_hp_deregister(ehotk->hotplug_slot);
>
> @@ -1109,7 +1120,7 @@ static int eeepc_rfkill_init(struct device *dev)
>         * Refresh pci hotplug in case the rfkill state was changed during
>         * setup.
>         */
> -       eeepc_rfkill_hotplug();
> +       eeepc_rfkill_hotplug(true);
>
>  exit:
>        if (result && result != -ENODEV)
> --
> 1.6.0.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

Hi Len,
I sent you a revert request 2 days ago for this patch, Darren reported
some problems with it.
You may have missed it, it can be found at:
http://marc.info/?l=linux-acpi&m=125542258501548&w=2 .
Is it still time to revert ?
Thanks,

-- 
Corentin Chary
http://xf.iksaif.net
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux