Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 May 2020 02:07:25 +0300
From:      Andriy Gapon <avg@FreeBSD.org>
To:        Adrian Chadd <adrian.chadd@gmail.com>, "freebsd-wireless@freebsd.org" <wireless@freebsd.org>
Subject:   Re: iwm rfkill
Message-ID:  <eebda8cc-b61e-1f53-f124-5217d51f6fc0@FreeBSD.org>
In-Reply-To: <9d55db0d-fe7a-2695-ac3e-6668eab43622@FreeBSD.org>
References:  <15021eed-2d82-5391-0edc-8d328e3ba31d@FreeBSD.org> <CAJ-VmonCxXxS-6WD=mxW1gdazZXHAyYdhTF9LrT%2BaqUrksR14g@mail.gmail.com> <9d55db0d-fe7a-2695-ac3e-6668eab43622@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 20/05/2020 01:40, Andriy Gapon wrote:
> On 18/05/2020 18:42, Adrian Chadd wrote:
>> On Mon, 18 May 2020 at 00:57, Andriy Gapon <avg@freebsd.org> wrote:
>>>
>>>
>>> I am trying to get my laptop fully functional and one of the things that
>>> currently does not work as expected is a Wi-Fi / Radio special key.
>>> It seems to be handled fully in hardware (but not 100% sure), but when I press
>>> it only bluetooth is turned off, but Wi-Fi stays on.
>>>
>>> This is the hardware:
>>> iwm0: <Intel(R) Dual Band Wireless AC 3168> mem 0xfe800000-0xfe801fff at device
>>> 0.0 on pci3
>>> iwm0: hw rev 0x220, fw ver 22.361476.0, address xx
>>>
>>> When I press the key I see these messages:
>>> iwm0: iwm_intr: rfkill switch, disabling interface
>>> ugen0.6: <vendor 0x8087 product 0x0aa7> at usbus0 (disconnected)
>>> ubt0: at uhub1, port 4, addr 5 (disconnected)
>>> ubt0: detached
>>>
>>> However, ifconfig still shows that wlan0 is UP and RUNNING and the traffic keeps
>>> flowing.
>>>
>>> So, it seems that the RF KILL bit gets set and it's detected by the driver, but
>>> whatever the driver does is not enough to turn off the Wi-Fi.
>>> Does anyone have any patches or suggestions or pointers (documentation, etc) ?
>>
>> It should be pretty easy to hack in; look at what iwn does? It should
>> just do a software thing to disable the interface in software.
> 
> Adrian, thank you very much for your suggestion.
> Being a complete noob in this area, this is my stab at it:
> https://reviews.freebsd.org/D24923

Also, I see that there is some friction between how rfkill is handled at the
driver / kernel level and how it gets (or doesn't get) known to userland.
First, at least Intel wireless drivers use ieee80211_suspend_all /
ieee80211_resume_all KPI when handling rfkill.  Those calls end up clearing or
setting IFF_DRV_RUNNING while userland mostly checks for IFF_UP.  But that's not
an issue actually -- I think that it's userland code that needs fixing.  The
issue is that the IFF_DRV_RUNNING changes become known to userland only by
accident if at all.

Specifically, if we consider wpa_supplicant, it listens for notifications coming
via PF_ROUTE socket such as RTM_IFINFO.  So, wpa_supplicant depends on (a) a
notification getting generated in the first place; (b) the notification
conveying correct information about an interface's state.
As far as I can tell, net80211 layer does not try to do either of the above.
E.g., in the case of ieee80211_stop_locked there is an RTM_IFINFO notification
because of a link status change, but that notification by the state change
that's performed before IFF_DRV_RUNNING is cleared.
In the case of ieee80211_start_locked the situation is even worse.

I wonder if ieee80211 should explicitly use rt_ifmsg() to post right
notifications at right times.
FWIW, I already have a patch for that and it seems to work.


-- 
Andriy Gapon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?eebda8cc-b61e-1f53-f124-5217d51f6fc0>