[LEDE-DEV] [PATCH v2 4/5] base-files, mac80211, broadcom-wl: plug-and-play wifi detection
Jonas Gorski
jonas.gorski at gmail.com
Wed Oct 12 04:32:38 PDT 2016
Hi,
On 11 October 2016 at 13:37, Christian Lamparter
<chunkeey at googlemail.com> wrote:
> Currently, the wifi detection script is executed as part of
> the (early) boot process. Pluggable wifi USB devices, which
> are inserted at a later time are not automatically
> detected and therefore they don't show up in LuCI.
>
> A user has to deal with wifi detection manually, or restart
> the router.
>
> However, the current "sleep 1" window - which the boot
> process waits for wifi devices to "settle down" - is too
> short to detect wifi devices for some routers anyway.
>
> For example, this can happen with USB WLAN devices on the
> WNDR4700. This is because the usb controller needs to load
> its firmware from UBI and initialize, before it can operate.
>
> The issue can be seen on a BT HomeHub 5A as well as soon as
> the caldata are on an ubi volume. This is because the ath9k
> card has to be initialized by owl-loader first. Which has to
> wait for the firmware extraction script to retrieve the pci
> initialization values inside the caldata.
>
> This patch moves the wifi detection to hotplug scripts.
> For mac80211, the wifi detection will now automatically
> run any time a "ieee80211" device is added. Likewise
> broadcom-wl's script checks for new "net" devices which
> have the "wl$NUMBERS" moniker.
>
> File locking has been added to the detection scripts in
> order to prevent races during discovery. The locking code
> will protect against adding more open wireless network
> configurations. In case "wifi detect" is run manually
> by the user at a bad time.
>
> All changes to base-files, mac80211 and broadcom-wl packages
> have been integrated into a single patch to play nice with
> git bisect.
>
> Thanks to Martin Blumenstingl for helping with the implementation
> and testing of the patch.
Funny enough I did something similar recently, but didn't submit it
here yet because there is some ugliness. A few comments ...
>
> Acked-by: Jo-Philipp Wich <jo at mein.io>
> Signed-off-by: Mathias Kresin <dev at kresin.me>
> Signed-off-by: Christian Lamparter <chunkeey at gmail.com>
>
> ---
> v1 -> v2:
> - filter for broadcom devices (Mathias)
> - integrate uci changes (no more /tmp/wireless.tmp)
> - move locking to detect_mac80211 and detect_broadcom
> ---
> ---
> package/base-files/files/etc/init.d/boot | 9 ---------
> .../broadcom-wl/files/etc/hotplug.d/net/00-broadcom-wifi-detect | 5 +++++
> package/kernel/broadcom-wl/files/lib/wifi/broadcom.sh | 6 ++++++
> package/kernel/mac80211/Makefile | 2 ++
> package/kernel/mac80211/files/lib/wifi/mac80211.sh | 7 +++++++
> package/kernel/mac80211/files/mac80211.hotplug | 5 +++++
> 6 files changed, 25 insertions(+), 9 deletions(-)
> create mode 100644 package/kernel/broadcom-wl/files/etc/hotplug.d/net/00-broadcom-wifi-detect
> create mode 100644 package/kernel/mac80211/files/mac80211.hotplug
>
> diff --git a/package/base-files/files/etc/init.d/boot b/package/base-files/files/etc/init.d/boot
> index 904f7db..1d61f2f 100755
> --- a/package/base-files/files/etc/init.d/boot
> +++ b/package/base-files/files/etc/init.d/boot
> @@ -38,15 +38,6 @@ boot() {
>
> /sbin/kmodloader
>
> - # allow wifi modules time to settle
> - sleep 1
> -
> - /sbin/wifi detect > /tmp/wireless.tmp
> - [ -s /tmp/wireless.tmp ] && {
> - cat /tmp/wireless.tmp >> /etc/config/wireless
> - }
> - rm -f /tmp/wireless.tmp
> -
> /bin/config_generate
> uci_apply_defaults
>
> diff --git a/package/kernel/broadcom-wl/files/etc/hotplug.d/net/00-broadcom-wifi-detect b/package/kernel/broadcom-wl/files/etc/hotplug.d/net/00-broadcom-wifi-detect
> new file mode 100644
> index 0000000..6ced270
> --- /dev/null
> +++ b/package/kernel/broadcom-wl/files/etc/hotplug.d/net/00-broadcom-wifi-detect
> @@ -0,0 +1,5 @@
> +#!/bin/sh
> +
> +[ "${ACTION}" = "add" ] && [ "${INTERFACE%%[0-9]*}" = "wl" ] {
> + /sbin/wifi detect
> +}
> diff --git a/package/kernel/broadcom-wl/files/lib/wifi/broadcom.sh b/package/kernel/broadcom-wl/files/lib/wifi/broadcom.sh
> index 1881b46..264e01b 100644
> --- a/package/kernel/broadcom-wl/files/lib/wifi/broadcom.sh
> +++ b/package/kernel/broadcom-wl/files/lib/wifi/broadcom.sh
> @@ -446,10 +446,16 @@ EOF
> eval "$nas_cmd"
> }
>
> +detect_unlock_broadcom_trap() {
> + lock -u /var/lock/wifi-detect-broadcom.lock
> +}
>
> detect_broadcom() {
> local i=-1
>
> + trap detect_unlock_broadcom_trap EXIT
> + lock /var/lock/wifi-detect-broadcom.lock
> +
> while grep -qs "^ *wl$((++i)):" /proc/net/dev; do
> local channel type
>
> diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
> index 91c9362..f320326 100644
> --- a/package/kernel/mac80211/Makefile
> +++ b/package/kernel/mac80211/Makefile
> @@ -1732,6 +1732,8 @@ define KernelPackage/cfg80211/install
> $(INSTALL_DIR) $(1)/lib/wifi $(1)/lib/netifd/wireless
> $(INSTALL_DATA) ./files/lib/wifi/mac80211.sh $(1)/lib/wifi
> $(INSTALL_BIN) ./files/lib/netifd/wireless/mac80211.sh $(1)/lib/netifd/wireless
> + $(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211
Don't you also need to update /etc/hotplug.json to pass through
ieee80211 events?
> + $(INSTALL_DATA) ./files/mac80211.hotplug $(1)/etc/hotplug.d/ieee80211/00-wifi-detect
> endef
>
> define KernelPackage/ipw2100/install
> diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
> index 253de40..44ba511 100644
> --- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh
> +++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
> @@ -58,7 +58,14 @@ check_mac80211_device() {
> [ "$phy" = "$dev" ] && found=1
> }
>
> +detect_mac80211_unlock_trap() {
> + lock -u /var/lock/wifi-detect-mac80211.lock
> +}
> +
> detect_mac80211() {
> + trap detect_mac80211_unlock_trap EXIT
> + lock /var/lock/wifi-detect-mac80211.lock
> +
> devidx=0
> config_load wireless
> while :; do
> diff --git a/package/kernel/mac80211/files/mac80211.hotplug b/package/kernel/mac80211/files/mac80211.hotplug
> new file mode 100644
> index 0000000..581be3d
> --- /dev/null
> +++ b/package/kernel/mac80211/files/mac80211.hotplug
> @@ -0,0 +1,5 @@
> +#!/bin/sh
> +
> +[ "${ACTION}" = "add" ] && {
> + /sbin/wifi detect
You need to fork here, else you will get a deadlock with wifi drivers
that request firmware on interface up instead of probe time, e.g.
rt2x00-usb.
> +}
> --
> 2.9.3
Regards
Jonas
More information about the Lede-dev
mailing list