diff options
Diffstat (limited to 'package/broadcom-wl')
22 files changed, 0 insertions, 2675 deletions
diff --git a/package/broadcom-wl/Makefile b/package/broadcom-wl/Makefile deleted file mode 100644 index 1a7da0f89d..0000000000 --- a/package/broadcom-wl/Makefile +++ /dev/null @@ -1,175 +0,0 @@ -# -# Copyright (C) 2006-2012 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/kernel.mk - -PKG_NAME:=broadcom-wl -PKG_VERSION:=5.10.56.27.3 -PKG_RELEASE:=5 - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(ARCH).tar.bz2 -PKG_SOURCE_URL:=http://downloads.openwrt.org/sources - -PKG_MD5SUM.mipsel:=3363e3a6b3d9d73c49dea870c7834eac -PKG_MD5SUM.mips:=f8de63debc75333d6b4e28193eb051ff -PKG_MD5SUM:=$(PKG_MD5SUM.$(ARCH)) - -include $(INCLUDE_DIR)/package.mk - -define Package/broadcom-wl/Default - SECTION:=kernel - CATEGORY:=Kernel modules - DEPENDS:=@PACKAGE_kmod-brcm-wl||PACKAGE_kmod-brcm-wl-mini - SUBMENU:=Proprietary BCM43xx WiFi driver - SUBMENUDEP:=@TARGET_brcm47xx||TARGET_brcm63xx -endef - -define KernelPackage/brcm-wl/Default - $(call Package/broadcom-wl/Default) - SECTION:=kernel - DEPENDS:=@TARGET_brcm47xx||TARGET_brcm63xx +wireless-tools - TITLE:=Kernel driver for BCM43xx chipsets - FILES:=$(PKG_BUILD_DIR)/driver$(1)/wl.ko $(PKG_BUILD_DIR)/glue/wl_glue.ko - AUTOLOAD:=$(call AutoLoad,30,wl_glue wl) -endef - -define KernelPackage/brcm-wl/Default/description - This package contains the proprietary wireless driver for the Broadcom - BCM43xx chipset. -endef - -define KernelPackage/brcm-wl -$(call KernelPackage/brcm-wl/Default,) - TITLE+= (normal version) -endef - -define KernelPackage/brcm-wl/description -$(call KernelPackage/brcm-wl/Default/description) -endef - -define KernelPackage/brcm-wl-mini -$(call KernelPackage/brcm-wl/Default,-mini) - TITLE+= (Legacy version) -endef - -define KernelPackage/brcm-wl-mini/description -$(call KernelPackage/brcm-wl/Default/description) -endef - -define Package/wlc -$(call Package/broadcom-wl/Default) - TITLE:=wl driver setup utility -endef - -define Package/wlc/description - This package contains an utility for initializing the proprietary Broadcom - wl driver. -endef - -define Package/wl -$(call Package/broadcom-wl/Default) - TITLE:=Proprietary Broadcom wl driver config utility -endef - -define Package/wl/description - This package contains the proprietary utility (wl) for configuring the - proprietary Broadcom wl driver. -endef - -define Package/nas -$(call Package/broadcom-wl/Default) - TITLE:=Proprietary Broadcom WPA/WPA2 authenticator -endef - -define Package/nas/description - This package contains the proprietary WPA/WPA2 authenticator (nas) for the - proprietary Broadcom wl driver. -endef - -MAKE_KMOD := $(MAKE) -C "$(LINUX_DIR)" \ - CROSS_COMPILE="$(TARGET_CROSS)" \ - ARCH="$(LINUX_KARCH)" \ - PATH="$(TARGET_PATH)" \ - SUBDIRS="$(PKG_BUILD_DIR)/kmod" \ - -define Build/Prepare - $(call Build/Prepare/Default) - $(CP) $(PKG_BUILD_DIR)/driver $(PKG_BUILD_DIR)/driver-mini - $(CP) ./src/glue $(PKG_BUILD_DIR)/glue -endef - -define Build/Compile - # Compile the kernel part - $(MAKE_KMOD) \ - SUBDIRS="$(PKG_BUILD_DIR)/driver" \ - MODFLAGS="-DMODULE -mlong-calls" \ - modules - - $(MAKE_KMOD) \ - SUBDIRS="$(PKG_BUILD_DIR)/driver-mini" \ - MODFLAGS="-DMODULE -mlong-calls" \ - BUILD_TYPE="wl_apsta_mini" \ - modules - - # Compile glue driver - $(MAKE_KMOD) -C "$(LINUX_DIR)" \ - SUBDIRS="$(PKG_BUILD_DIR)/glue" \ - modules - - # Compile libshared - $(MAKE) -C $(PKG_BUILD_DIR)/shared \ - $(TARGET_CONFIGURE_OPTS) \ - CFLAGS="$(TARGET_CFLAGS) -I. -I$(PKG_BUILD_DIR)/driver/include" \ - all - - $(TARGET_CC) -o $(PKG_BUILD_DIR)/wlc \ - -I$(PKG_BUILD_DIR)/shared -I$(PKG_BUILD_DIR)/driver/include \ - ./src/wlc.c $(PKG_BUILD_DIR)/shared/libshared.a - - $(TARGET_CC) -o $(PKG_BUILD_DIR)/nas \ - $(PKG_BUILD_DIR)/nas_exe.o \ - $(PKG_BUILD_DIR)/shared/libshared.a - - $(TARGET_CC) -o $(PKG_BUILD_DIR)/wl \ - $(PKG_BUILD_DIR)/wl_exe.o \ - $(PKG_BUILD_DIR)/shared/libshared.a -endef - -define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_BUILD_DIR)/shared/libshared.a $(1)/usr/lib/ -endef - -define Package/wlc/install - $(CP) ./files/* $(1)/ - $(INSTALL_DIR) $(1)/sbin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/wlc $(1)/sbin/ -endef - -define Package/wlc/postinst -#!/bin/sh -[ -n "$${IPKG_INSTROOT}" ] || /etc/init.d/wlunbind enable || true -endef - -define Package/wl/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/wl $(1)/usr/sbin/ -endef - -define Package/nas/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/nas $(1)/usr/sbin/ - ln -sf nas $(1)/usr/sbin/nas4not - ln -sf nas $(1)/usr/sbin/nas4wds -endef - -$(eval $(call KernelPackage,brcm-wl)) -$(eval $(call KernelPackage,brcm-wl-mini)) -$(eval $(call BuildPackage,wlc)) -$(eval $(call BuildPackage,wl)) -$(eval $(call BuildPackage,nas)) diff --git a/package/broadcom-wl/files/etc/hotplug.d/net/20-broadcom_wds b/package/broadcom-wl/files/etc/hotplug.d/net/20-broadcom_wds deleted file mode 100644 index 0a563c2dbd..0000000000 --- a/package/broadcom-wl/files/etc/hotplug.d/net/20-broadcom_wds +++ /dev/null @@ -1,61 +0,0 @@ -include /lib/wifi - -setup_broadcom_wds() { - local iface="$1" - local remote="$(wlc ifname "$iface" wdsmac)" - - [ -z "$remote" ] && return - - config_cb() { - [ -z "$CONFIG_SECTION" ] && return - - config_get type "$CONFIG_SECTION" TYPE - [ "$type" = "wifi-iface" ] || return - - config_get network "$CONFIG_SECTION" network - [ -z "$network" ] && return - - config_get addr "$CONFIG_SECTION" bssid - addr=$(echo "$addr" | tr 'A-F' 'a-f') - [ "$addr" = "$remote" ] && { - local cfg="$CONFIG_SECTION" - - include /lib/network - scan_interfaces - - for network in $network; do - setup_interface "$iface" "$network" - done - - config_get encryption "$cfg" encryption - config_get key "$cfg" key - config_get ssid "$cfg" ssid - - [ "$encryption" != "none" ] && { - sleep 5 - case "$encryption" in - psk|PSK) - nas4not "$network" "$iface" up auto tkip psk "$key" "$ssid" - ;; - psk2|PSK2) - nas4not "$network" "$iface" up auto aes psk "$key" "$ssid" - ;; - psk+psk2|psk2+psk|PSK+PSK2|PSK2+PSK) - nas4not "$network" "$iface" up auto aes+tkip psk "$key" "$ssid" - ;; - *) - nas4not lan "$iface" up auto aes "$encryption" "$key" "$ssid" - ;; - esac - } - } - } - - config_load wireless -} - -case "$ACTION" in - add|register) - [ "${INTERFACE%%0.*}" = wds ] && setup_broadcom_wds "$INTERFACE" - ;; -esac diff --git a/package/broadcom-wl/files/etc/init.d/wlunbind b/package/broadcom-wl/files/etc/init.d/wlunbind deleted file mode 100755 index 0a29db565f..0000000000 --- a/package/broadcom-wl/files/etc/init.d/wlunbind +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2010-2011 OpenWrt.org - -START=09 - -unbind_driver() { - local driver="$1" - local sysfs="/sys/bus/pci/drivers/$driver" - if [ -d "$sysfs" ]; then - local lnk - for lnk in $sysfs/*; do - [ -h "$lnk" ] || continue - case "${lnk##*/}" in - *:*:*.*) - logger "Unbinding WL PCI device ${lnk##*/} from $driver" - echo -n "${lnk##*/}" > "$sysfs/unbind" - ;; - esac - done - fi -} - -boot() { - unbind_driver b43-pci-bridge - unbind_driver bcma-pci-bridge -} - -start() { :; } -stop() { :; } diff --git a/package/broadcom-wl/files/lib/wifi/broadcom.sh b/package/broadcom-wl/files/lib/wifi/broadcom.sh deleted file mode 100644 index 72b85aaf88..0000000000 --- a/package/broadcom-wl/files/lib/wifi/broadcom.sh +++ /dev/null @@ -1,395 +0,0 @@ -append DRIVERS "broadcom" - -scan_broadcom() { - local device="$1" - local wds - local adhoc sta apmode mon disabled - local adhoc_if sta_if ap_if mon_if - local _c=0 - - config_get vifs "$device" vifs - for vif in $vifs; do - config_get_bool disabled "$vif" disabled 0 - [ $disabled -eq 0 ] || continue - - config_get mode "$vif" mode - _c=$(($_c + 1)) - case "$mode" in - adhoc) - adhoc=1 - adhoc_if="$vif" - ;; - sta) - sta=1 - sta_if="$vif" - ;; - ap) - apmode=1 - ap_if="${ap_if:+$ap_if }$vif" - ;; - wds) - config_get addr "$vif" bssid - [ -z "$addr" ] || { - addr=$(echo "$addr" | tr 'A-F' 'a-f') - append wds "$addr" - } - ;; - monitor) - mon=1 - mon_if="$vif" - ;; - *) echo "$device($vif): Invalid mode";; - esac - done - config_set "$device" wds "$wds" - - local _c= - for vif in ${adhoc_if:-$sta_if $ap_if $mon_if}; do - config_set "$vif" ifname "${device}${_c:+.$_c}" - _c=$((${_c:-0} + 1)) - done - config_set "$device" vifs "${adhoc_if:-$sta_if $ap_if $mon_if}" - - ifdown="down" - for vif in 0 1 2 3; do - append ifdown "vif $vif" "$N" - append ifdown "enabled 0" "$N" - done - - ap=1 - infra=1 - if [ "$_c" -gt 1 ]; then - mssid=1 - else - mssid= - fi - apsta=0 - radio=1 - monitor=0 - case "$adhoc:$sta:$apmode:$mon" in - 1*) - ap=0 - mssid= - infra=0 - ;; - :1:1:) - apsta=1 - wet=1 - ;; - :1::) - wet=1 - ap=0 - mssid= - ;; - :::1) - wet=1 - ap=0 - mssid= - monitor=1 - ;; - ::) - radio=0 - ;; - esac -} - -disable_broadcom() { - local device="$1" - set_wifi_down "$device" - wlc ifname "$device" down - wlc ifname "$device" bssid `wlc ifname "$device" default_bssid` - ( - include /lib/network - - # make sure the interfaces are down and removed from all bridges - for dev in $device ${device}.1 ${device}.2 ${device}.3; do - ifconfig "$dev" down 2>/dev/null >/dev/null && { - unbridge "$dev" - } - done - ) - true -} - -enable_broadcom() { - local device="$1" - local _c - config_get channel "$device" channel - config_get country "$device" country - config_get maxassoc "$device" maxassoc - config_get wds "$device" wds - config_get vifs "$device" vifs - config_get distance "$device" distance - config_get slottime "$device" slottime - config_get rxantenna "$device" rxantenna - config_get txantenna "$device" txantenna - config_get_bool frameburst "$device" frameburst - config_get macfilter "$device" macfilter - config_get maclist "$device" maclist - config_get macaddr "$device" macaddr - config_get txpower "$device" txpower - config_get frag "$device" frag - config_get rts "$device" rts - config_get hwmode "$device" hwmode - local vif_pre_up vif_post_up vif_do_up vif_txpower - local doth=0 - local wmm=1 - - _c=0 - nas="$(which nas)" - nas_cmd= - if_up= - - [ -z "$slottime" ] && { - [ -n "$distance" ] && { - # slottime = 9 + (distance / 150) + (distance % 150 ? 1 : 0) - slottime="$((9 + ($distance / 150) + 1 - (150 - ($distance % 150)) / 150 ))" - } - } || { - slottime="${slottime:--1}" - } - - case "$macfilter" in - allow|2) - macfilter=2; - ;; - deny|1) - macfilter=1; - ;; - disable|none|0) - macfilter=0; - ;; - esac - - case "$hwmode" in - *b) hwmode=0;; - *bg) hwmode=1;; - *g) hwmode=2;; - *gst) hwmode=4;; - *lrs) hwmode=5;; - *) hwmode=1;; - esac - - for vif in $vifs; do - config_get vif_txpower "$vif" txpower - - config_get mode "$vif" mode - append vif_pre_up "vif $_c" "$N" - append vif_post_up "vif $_c" "$N" - append vif_do_up "vif $_c" "$N" - - config_get_bool wmm "$vif" wmm "$wmm" - config_get_bool doth "$vif" doth "$doth" - - [ "$mode" = "sta" ] || { - config_get_bool hidden "$vif" hidden 0 - append vif_pre_up "closed $hidden" "$N" - config_get_bool isolate "$vif" isolate 0 - append vif_pre_up "ap_isolate $isolate" "$N" - } - - wsec_r=0 - eap_r=0 - wsec=0 - auth=0 - nasopts= - config_get enc "$vif" encryption - case "$enc" in - *wep*) - wsec_r=1 - wsec=1 - defkey=1 - config_get key "$vif" key - case "$enc" in - *shared*) append vif_do_up "wepauth 1" "$N";; - *) append vif_do_up "wepauth 0" "$N";; - esac - case "$key" in - [1234]) - defkey="$key" - for knr in 1 2 3 4; do - config_get k "$vif" key$knr - [ -n "$k" ] || continue - [ "$defkey" = "$knr" ] && def="=" || def="" - append vif_do_up "wepkey $def$knr,$k" "$N" - done - ;; - "");; - *) append vif_do_up "wepkey =1,$key" "$N";; - esac - ;; - *psk*) - wsec_r=1 - config_get key "$vif" key - - # psk version + default cipher - case "$enc" in - *mixed*|*psk+psk2*) auth=132; wsec=6;; - *psk2*) auth=128; wsec=4;; - *) auth=4; wsec=2;; - esac - - # cipher override - case "$enc" in - *tkip+aes*|*tkip+ccmp*|*aes+tkip*|*ccmp+tkip*) wsec=6;; - *aes*|*ccmp*) wsec=4;; - *tkip*) wsec=2;; - esac - - # group rekey interval - config_get rekey "$vif" wpa_group_rekey - - eval "${vif}_key=\"\$key\"" - nasopts="-k \"\$${vif}_key\"${rekey:+ -g $rekey}" - ;; - *wpa*) - wsec_r=1 - eap_r=1 - config_get auth_server "$vif" auth_server - [ -z "$auth_server" ] && config_get auth_server "$vif" server - config_get auth_port "$vif" auth_port - [ -z "$auth_port" ] && config_get auth_port "$vif" port - config_get auth_secret "$vif" auth_secret - [ -z "$auth_secret" ] && config_get auth_secret "$vif" key - - # wpa version + default cipher - case "$enc" in - *mixed*|*wpa+wpa2*) auth=66; wsec=6;; - *wpa2*) auth=64; wsec=4;; - *) auth=2; wsec=2;; - esac - - # cipher override - case "$enc" in - *tkip+aes*|*tkip+ccmp*|*aes+tkip*|*ccmp+tkip*) wsec=6;; - *aes*|*ccmp*) wsec=4;; - *tkip*) wsec=2;; - esac - - # group rekey interval - config_get rekey "$vif" wpa_group_rekey - - eval "${vif}_key=\"\$auth_secret\"" - nasopts="-r \"\$${vif}_key\" -h $auth_server -p ${auth_port:-1812}${rekey:+ -g $rekey}" - ;; - esac - append vif_do_up "wsec $wsec" "$N" - append vif_do_up "wpa_auth $auth" "$N" - append vif_do_up "wsec_restrict $wsec_r" "$N" - append vif_do_up "eap_restrict $eap_r" "$N" - - config_get ssid "$vif" ssid - append vif_post_up "vlan_mode 0" "$N" - append vif_post_up "ssid $ssid" "$N" - append vif_do_up "ssid $ssid" "$N" - - [ "$mode" = "monitor" ] && { - append vif_post_up "monitor $monitor" "$N" - } - - [ "$mode" = "adhoc" ] && { - config_get bssid "$vif" bssid - [ -n "$bssid" ] && { - append vif_pre_up "bssid $bssid" "$N" - append vif_pre_up "ibss_merge 0" "$N" - } || { - append vif_pre_up "ibss_merge 1" "$N" - } - } - - append vif_post_up "enabled 1" "$N" - - config_get ifname "$vif" ifname - #append if_up "ifconfig $ifname up" ";$N" - - local net_cfg - net_cfg="$(find_net_config "$vif")" - [ -z "$net_cfg" ] || { - append if_up "set_wifi_up '$vif' '$ifname'" ";$N" - append if_up "start_net '$ifname' '$net_cfg'" ";$N" - } - [ -z "$nasopts" ] || { - eval "${vif}_ssid=\"\$ssid\"" - nas_mode="-A" - [ "$mode" = "sta" ] && nas_mode="-S" - [ -z "$nas" ] || { - nas_cmd="${nas_cmd:+$nas_cmd$N}start-stop-daemon -S -b -p /var/run/nas.$ifname.pid -x $nas -- -P /var/run/nas.$ifname.pid -H 34954 -i $ifname $nas_mode -m $auth -w $wsec -s \"\$${vif}_ssid\" -g 3600 -F $nasopts" - } - } - _c=$(($_c + 1)) - done - killall -KILL nas >&- 2>&- - wlc ifname "$device" stdin <<EOF -$ifdown - -gmode ${hwmode:-1} -apsta $apsta -ap $ap -${mssid:+mssid $mssid} -infra $infra -${wet:+wet 1} -802.11d 0 -802.11h ${doth:-0} -wme ${wmm:-1} -rxant ${rxantenna:-3} -txant ${txantenna:-3} -fragthresh ${frag:-2346} -rtsthresh ${rts:-2347} -monitor ${monitor:-0} - -radio ${radio:-1} -macfilter ${macfilter:-0} -maclist ${maclist:-none} -wds none -${wds:+wds $wds} -country ${country:-US} -${channel:+channel $channel} -maxassoc ${maxassoc:-128} -slottime ${slottime:--1} -${frameburst:+frameburst $frameburst} - -$vif_pre_up -up -$vif_post_up -EOF - eval "$if_up" - wlc ifname "$device" stdin <<EOF -$vif_do_up -EOF - - # use vif_txpower (from last wifi-iface) instead of txpower (from - # wifi-device) if the latter does not exist - txpower=${txpower:-$vif_txpower} - [ -z "$txpower" ] || iwconfig $device txpower ${txpower}dBm - - eval "$nas_cmd" -} - - -detect_broadcom() { - local i=-1 - - while grep -qs "^ *wl$((++i)):" /proc/net/dev; do - local channel - - config_get type wl${i} type - [ "$type" = broadcom ] && continue - channel=`wlc ifname wl${i} channel` - cat <<EOF -config wifi-device wl${i} - option type broadcom - option channel ${channel:-11} - - # REMOVE THIS LINE TO ENABLE WIFI: - option disabled 1 - -config wifi-iface - option device wl${i} - option network lan - option mode ap - option ssid OpenWrt${i#0} - option encryption none - -EOF - done -} diff --git a/package/broadcom-wl/patches/003-compat-2.6.35.patch b/package/broadcom-wl/patches/003-compat-2.6.35.patch deleted file mode 100644 index 89b665371d..0000000000 --- a/package/broadcom-wl/patches/003-compat-2.6.35.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- a/driver/wl_linux.c -+++ b/driver/wl_linux.c -@@ -2082,7 +2082,11 @@ static void - _wl_set_multicast_list(struct net_device *dev) - { - wl_info_t *wl; -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,34) - struct dev_mc_list *mclist; -+#else -+ struct netdev_hw_addr *ha; -+#endif - int i; - - if (!dev) -@@ -2098,14 +2102,24 @@ _wl_set_multicast_list(struct net_device - wl->pub->allmulti = (dev->flags & IFF_ALLMULTI)? TRUE: FALSE; - - /* copy the list of multicasts into our private table */ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,34) - for (i = 0, mclist = dev->mc_list; mclist && (i < dev->mc_count); - i++, mclist = mclist->next) { -+#else -+ i = 0; -+ netdev_for_each_mc_addr(ha, dev) { -+#endif - if (i >= MAXMULTILIST) { - wl->pub->allmulti = TRUE; - i = 0; - break; - } -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,34) - wl->pub->multicast[i] = *((struct ether_addr*) mclist->dmi_addr); -+#else -+ wl->pub->multicast[i] = *((struct ether_addr*) ha->addr); -+ i++; -+#endif - } - wl->pub->nmulticast = i; - wlc_set(wl->wlc, WLC_SET_PROMISC, (dev->flags & IFF_PROMISC)); diff --git a/package/broadcom-wl/patches/004-remove-pcmcia.patch b/package/broadcom-wl/patches/004-remove-pcmcia.patch deleted file mode 100644 index 36dda47e10..0000000000 --- a/package/broadcom-wl/patches/004-remove-pcmcia.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/driver/include/linuxver.h -+++ b/driver/include/linuxver.h -@@ -111,7 +111,7 @@ typedef irqreturn_t(*FN_ISR) (int irq, v - #endif /* not SANDGATE2G */ - #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 67) */ - --#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE) -+#if 0 - - #include <pcmcia/cs_types.h> - #include <pcmcia/cs.h> ---- a/driver/linux_osl.c -+++ b/driver/linux_osl.c -@@ -62,7 +62,7 @@ struct osl_info { - }; - - /* PCMCIA attribute space access macros */ --#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE) -+#if 0 - struct pcmcia_dev { - dev_link_t link; /* PCMCIA device pointer */ - dev_node_t node; /* PCMCIA node structure */ diff --git a/package/broadcom-wl/patches/005-fix-mem-leak-on-unload.patch b/package/broadcom-wl/patches/005-fix-mem-leak-on-unload.patch deleted file mode 100644 index 41c246ff80..0000000000 --- a/package/broadcom-wl/patches/005-fix-mem-leak-on-unload.patch +++ /dev/null @@ -1,31 +0,0 @@ -From: George Kashperko <george@znau.edu.ua> - -Release nvram variables buffer. -Prevent block reserved by alloc_etherdev from being freed. -Signed-off-by: George Kashperko <george@znau.edu.ua> ---- ---- ---- a/driver/siutils.c -+++ b/driver/siutils.c -@@ -647,7 +647,10 @@ si_detach(si_t *sih) - #if !defined(BCMBUSTYPE) || (BCMBUSTYPE == SI_BUS) - if (sii != &ksii) - #endif /* !BCMBUSTYPE || (BCMBUSTYPE == SI_BUS) */ -- MFREE(sii->osh, sii, sizeof(si_info_t)); -+ do { -+ MFREE(sii->osh, sii, sizeof(si_info_t)); -+ nvram_exit((void *)&(sii->pub)); -+ } while (0); - } - - void * ---- a/driver/wl_linux.c -+++ b/driver/wl_linux.c -@@ -1477,7 +1477,6 @@ wl_free_if(wl_info_t *wl, wl_if_t *wlif) - free_netdev(wlif->dev); - #endif - } -- MFREE(wl->osh, wlif, sizeof(wl_if_t)); - } - - #ifdef AP diff --git a/package/broadcom-wl/patches/006-generic-dma-api.patch b/package/broadcom-wl/patches/006-generic-dma-api.patch deleted file mode 100644 index a90bbe1f96..0000000000 --- a/package/broadcom-wl/patches/006-generic-dma-api.patch +++ /dev/null @@ -1,88 +0,0 @@ -From: George Kashperko <george@znau.edu.ua> - -broadcom-wl driver bound to ssb device with ssb driver probe -have osh handle struct pdev pointer value initialized with -ssb_device pointer. Later on pdev is used with legacy pci -dma api as pci_dev thus causing oops sometimes. - -The patch replaces legacy pci dma api and pass relevant -device struct pointer to avoid crashes. -Signed-off-by: George Kashperko <george@znau.edu.ua> ---- - driver/linux_osl.c | 28 +++++++++++++++++++++++----- - 1 file changed, 23 insertions(+), 5 deletions(-) ---- a/driver/linux_osl.c -+++ b/driver/linux_osl.c -@@ -25,6 +25,9 @@ - #include <asm/paccess.h> - #endif /* mips */ - #include <pcicfg.h> -+#ifdef CONFIG_SSB -+#include <linux/ssb/ssb.h> -+#endif - - #define PCI_CFG_RETRY 10 - -@@ -364,12 +367,27 @@ osl_dma_consistent_align(void) - return (PAGE_SIZE); - } - -+static struct device * -+osl_get_dmadev(osl_t *osh) -+{ -+#ifdef CONFIG_SSB -+ if (osh->bustype == SI_BUS) { -+ /* This can be SiliconBackplane emulated as pci with Broadcom or -+ * ssb device. Less harmful is to check for pci_bus_type and if -+ * no match then assume we got ssb */ -+ if (((struct pci_dev *)osh->pdev)->dev.bus != &pci_bus_type) -+ return ((struct ssb_device *)osh->pdev)->dma_dev; -+ } -+#endif -+ return &((struct pci_dev *)osh->pdev)->dev; -+} -+ - void* - osl_dma_alloc_consistent(osl_t *osh, uint size, ulong *pap) - { - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - -- return (pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap)); -+ return (dma_alloc_coherent(osl_get_dmadev(osh), size, (dma_addr_t*)pap, GFP_ATOMIC)); - } - - void -@@ -377,7 +395,7 @@ osl_dma_free_consistent(osl_t *osh, void - { - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - -- pci_free_consistent(osh->pdev, size, va, (dma_addr_t)pa); -+ dma_free_coherent(osl_get_dmadev(osh), size, va, (dma_addr_t)pa); - } - - uint BCMFASTPATH -@@ -386,13 +404,13 @@ osl_dma_map(osl_t *osh, void *va, uint s - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - - if (direction == DMA_TX) -- return (pci_map_single(osh->pdev, va, size, PCI_DMA_TODEVICE)); -+ return (dma_map_single(osl_get_dmadev(osh), va, size, PCI_DMA_TODEVICE)); - else { - #ifdef mips - dma_cache_inv((uint)va, size); - return (virt_to_phys(va)); - #else /* mips */ -- return (pci_map_single(osh->pdev, va, size, PCI_DMA_FROMDEVICE)); -+ return (dma_map_single(osl_get_dmadev(osh), va, size, PCI_DMA_FROMDEVICE)); - #endif /* mips */ - } - } -@@ -404,7 +422,7 @@ osl_dma_unmap(osl_t *osh, uint pa, uint - - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE; -- pci_unmap_single(osh->pdev, (uint32)pa, size, dir); -+ dma_unmap_single(osl_get_dmadev(osh), (uint32)pa, size, dir); - } - - diff --git a/package/broadcom-wl/patches/007-use-glue-driver.patch b/package/broadcom-wl/patches/007-use-glue-driver.patch deleted file mode 100644 index 2639abcf6a..0000000000 --- a/package/broadcom-wl/patches/007-use-glue-driver.patch +++ /dev/null @@ -1,184 +0,0 @@ ---- a/driver/wl_linux.c -+++ b/driver/wl_linux.c -@@ -85,10 +85,9 @@ typedef void wlc_hw_info_t; - #include <bcmjtag.h> - #endif /* BCMJTAG */ - -- --#ifdef CONFIG_SSB --#include <linux/ssb/ssb.h> --#endif -+#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) -+#include <wl_glue.h> -+#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ - - /* Linux wireless extension support */ - #ifdef CONFIG_WIRELESS_EXT -@@ -997,62 +996,32 @@ static struct pci_driver wl_pci_driver = - #endif /* CONFIG_PCI */ - #endif - -+#ifdef BCMJTAG -+static bcmjtag_driver_t wl_jtag_driver = { -+ wl_jtag_probe, -+ wl_jtag_detach, -+ wl_jtag_poll, -+ }; -+#endif /* BCMJTAG */ - --static int wl_ssb_probe(struct ssb_device *dev, const struct ssb_device_id *id) -+#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) -+static void * glue_attach_cb(u16 vendor, u16 device, -+ ulong mmio, void *dev, u32 irq) - { -- wl_info_t *wl; -- void *mmio; -- -- if (dev->bus->bustype != SSB_BUSTYPE_SSB) { -- printk("Attaching to SSB behind PCI is not supported. Please remove the b43 ssb bridge\n"); -- return -EINVAL; -- } -- -- mmio = (void *) 0x18000000 + dev->core_index * 0x1000; -- wl = wl_attach(id->vendor, id->coreid, (ulong) mmio, SI_BUS, dev, dev->irq); -- if (!wl) { -- printk("wl_attach failed\n"); -- return -ENODEV; -- } -- -- ssb_set_drvdata(dev, wl); -- -- return 0; -+ return wl_attach(vendor, device, mmio, SI_BUS, dev, irq); - } - --static void wl_ssb_remove(struct ssb_device *dev) -+static void glue_remove_cb(void *wldev) - { -- wl_info_t *wl = (wl_info_t *) ssb_get_drvdata(dev); -+ wl_info_t *wl = (wl_info_t *)wldev; - - WL_LOCK(wl); - WL_APSTA_UPDN(("wl%d (%s): wl_remove() -> wl_down()\n", wl->pub->unit, wl->dev->name)); - wl_down(wl); - WL_UNLOCK(wl); - wl_free(wl); -- ssb_set_drvdata(dev, NULL); - } -- --static const struct ssb_device_id wl_ssb_tbl[] = { -- SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, SSB_ANY_REV), -- SSB_DEVTABLE_END --}; -- --#ifdef CONFIG_SSB --static struct ssb_driver wl_ssb_driver = { -- .name = KBUILD_MODNAME, -- .id_table = wl_ssb_tbl, -- .probe = wl_ssb_probe, -- .remove = wl_ssb_remove, --}; --#endif -- --#ifdef BCMJTAG --static bcmjtag_driver_t wl_jtag_driver = { -- wl_jtag_probe, -- wl_jtag_detach, -- wl_jtag_poll, -- }; --#endif /* BCMJTAG */ -+#endif/* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ - - - /** -@@ -1067,11 +1036,13 @@ wl_module_init(void) - { - int error = -ENODEV; - --#ifdef CONFIG_SSB -- error = ssb_driver_register(&wl_ssb_driver); -+#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) -+ wl_glue_set_attach_callback(&glue_attach_cb); -+ wl_glue_set_remove_callback(&glue_remove_cb); -+ error = wl_glue_register(); - if (error) - return error; --#endif /* CONFIG_SSB */ -+#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ - - #ifdef CONFIG_PCI - error = pci_register_driver(&wl_pci_driver); -@@ -1082,7 +1053,9 @@ wl_module_init(void) - return 0; - - error_pci: -- ssb_driver_unregister(&wl_ssb_driver); -+#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) -+ wl_glue_unregister(); -+#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ - return error; - } - -@@ -1099,9 +1072,9 @@ wl_module_exit(void) - #ifdef CONFIG_PCI - pci_unregister_driver(&wl_pci_driver); - #endif /* CONFIG_PCI */ --#ifdef CONFIG_SSB -- ssb_driver_unregister(&wl_ssb_driver); --#endif /* CONFIG_SSB */ -+#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) -+ wl_glue_unregister(); -+#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ - } - - module_init(wl_module_init); ---- a/driver/linux_osl.c -+++ b/driver/linux_osl.c -@@ -25,9 +25,9 @@ - #include <asm/paccess.h> - #endif /* mips */ - #include <pcicfg.h> --#ifdef CONFIG_SSB --#include <linux/ssb/ssb.h> --#endif -+#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) -+#include <wl_glue.h> -+#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ - - #define PCI_CFG_RETRY 10 - -@@ -370,15 +370,17 @@ osl_dma_consistent_align(void) - static struct device * - osl_get_dmadev(osl_t *osh) - { --#ifdef CONFIG_SSB -+#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) - if (osh->bustype == SI_BUS) { -- /* This can be SiliconBackplane emulated as pci with Broadcom or -- * ssb device. Less harmful is to check for pci_bus_type and if -- * no match then assume we got ssb */ -+ /* This can be SiliconBackplane emulated as pci with Broadcom, -+ * ssb or bcma device. Less harmful is to check for pci_bus_type and if -+ * no match then assume we got either ssb or bcma */ - if (((struct pci_dev *)osh->pdev)->dev.bus != &pci_bus_type) -- return ((struct ssb_device *)osh->pdev)->dma_dev; -+ { -+ return wl_glue_get_dmadev(osh->pdev); -+ } - } --#endif -+#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ - return &((struct pci_dev *)osh->pdev)->dev; - } - ---- a/driver/Makefile -+++ b/driver/Makefile -@@ -1,7 +1,7 @@ - BUILD_TYPE=wl_apsta - include $(src)/$(BUILD_TYPE)/buildflags.mk - --EXTRA_CFLAGS += -I$(src)/include -I$(src) -DBCMDRIVER $(WLFLAGS) -+EXTRA_CFLAGS += -I$(src)/include -I$(src) -I$(realpath $(src)/../glue) -DBCMDRIVER $(WLFLAGS) - - wl-objs := $(BUILD_TYPE)/wl_prebuilt.o wl_iw.o wl_linux.o linux_osl.o siutils.o aiutils.o hndpmu.o bcmutils.o sbutils.o nicpci.o hnddma.o bcmsrom.o nvram_stub.o - diff --git a/package/broadcom-wl/patches/008-fix_virtual_interfaces.patch b/package/broadcom-wl/patches/008-fix_virtual_interfaces.patch deleted file mode 100644 index 6cffa27810..0000000000 --- a/package/broadcom-wl/patches/008-fix_virtual_interfaces.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/driver/wl_linux.c -+++ b/driver/wl_linux.c -@@ -1541,6 +1541,8 @@ wl_add_if(wl_info_t *wl, struct wlc_if* - return NULL; - } - -+ wl_if_setup(wlif->dev); -+ - sprintf(wlif->dev->name, "%s%d.%d", devname, wl->pub->unit, wlif->subunit); - if (remote) - bcopy(remote, &wlif->remote, ETHER_ADDR_LEN); diff --git a/package/broadcom-wl/patches/009-fix_compile_3_2.patch b/package/broadcom-wl/patches/009-fix_compile_3_2.patch deleted file mode 100644 index 628f2fdf25..0000000000 --- a/package/broadcom-wl/patches/009-fix_compile_3_2.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- a/driver/wl_linux.c -+++ b/driver/wl_linux.c -@@ -462,6 +462,16 @@ wl_schedule_fn(wl_info_t *wl, void (*fn) - } - #endif /* DSLCPE_DELAY */ - -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) -+#define WL_DEFAULT_OPS \ -+ .ndo_open = wl_open, \ -+ .ndo_stop = wl_close, \ -+ .ndo_start_xmit = wl_start, \ -+ .ndo_get_stats = wl_get_stats, \ -+ .ndo_set_mac_address = wl_set_mac_address, \ -+ .ndo_set_rx_mode = wl_set_multicast_list, \ -+ .ndo_do_ioctl = wl_ioctl -+#else - #define WL_DEFAULT_OPS \ - .ndo_open = wl_open, \ - .ndo_stop = wl_close, \ -@@ -470,6 +480,7 @@ wl_schedule_fn(wl_info_t *wl, void (*fn) - .ndo_set_mac_address = wl_set_mac_address, \ - .ndo_set_multicast_list = wl_set_multicast_list, \ - .ndo_do_ioctl = wl_ioctl -+#endif - - static const struct net_device_ops wl_ops = { - WL_DEFAULT_OPS, diff --git a/package/broadcom-wl/patches/010-remove_irqf_samble_random.patch b/package/broadcom-wl/patches/010-remove_irqf_samble_random.patch deleted file mode 100644 index 27b132d115..0000000000 --- a/package/broadcom-wl/patches/010-remove_irqf_samble_random.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/driver/wl_linux.c 2012-09-26 20:51:48.099454971 -0400 -+++ b/driver/wl_linux.c 2012-09-26 20:53:24.115453441 -0400 -@@ -691,7 +691,7 @@ - if (wl->bustype != JTAG_BUS) - #endif /* BCMJTAG */ - { -- if (request_irq(irq, wl_isr, IRQF_SHARED|IRQF_SAMPLE_RANDOM, dev->name, wl)) { -+ if (request_irq(irq, wl_isr, IRQF_SHARED, dev->name, wl)) { - WL_ERROR(("wl%d: request_irq() failed\n", unit)); - goto fail; - } diff --git a/package/broadcom-wl/patches/011-fix_compile_3_4.patch b/package/broadcom-wl/patches/011-fix_compile_3_4.patch deleted file mode 100644 index 585d53c7df..0000000000 --- a/package/broadcom-wl/patches/011-fix_compile_3_4.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/driver/wl_linux.c -+++ b/driver/wl_linux.c -@@ -49,7 +49,9 @@ - #include <linux/ieee80211.h> - #endif - -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0) - #include <asm/system.h> -+#endif - #include <asm/io.h> - #include <asm/irq.h> - #include <asm/pgtable.h> diff --git a/package/broadcom-wl/patches/100-fix_nvram_two_devices.patch b/package/broadcom-wl/patches/100-fix_nvram_two_devices.patch deleted file mode 100644 index 5650862f83..0000000000 --- a/package/broadcom-wl/patches/100-fix_nvram_two_devices.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/driver/nvram_stub.c -+++ b/driver/nvram_stub.c -@@ -22,6 +22,7 @@ typedef struct _vars { - #define VARS_T_OH sizeof(vars_t) - - static vars_t *vars = NULL; -+static int nvram_init_done = 0; - extern char *nvram_buf[]; - - int -@@ -33,6 +34,10 @@ BCMATTACHFN(nvram_init)(void *si) - uint nvs, bufsz; - vars_t *new; - -+ nvram_init_done++; -+ if (nvram_init_done != 1) -+ return 0; -+ - osh = si_osh(sih); - - nvs = R_REG(osh, &nvh->len) - sizeof(struct nvram_header); -@@ -79,6 +84,10 @@ BCMATTACHFN(nvram_exit)(void *si) - vars_t *this, *next; - si_t *sih; - -+ nvram_init_done--; -+ if (nvram_init_done != 0) -+ return 0; -+ - sih = (si_t *)si; - this = vars; - while (this) { diff --git a/package/broadcom-wl/patches/110-add_number_to_dev_name.patch b/package/broadcom-wl/patches/110-add_number_to_dev_name.patch deleted file mode 100644 index 13ce72741e..0000000000 --- a/package/broadcom-wl/patches/110-add_number_to_dev_name.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/driver/wl_linux.c -+++ b/driver/wl_linux.c -@@ -1412,7 +1412,7 @@ wl_alloc_if(wl_info_t *wl, int iftype, u - dev = alloc_etherdev(sizeof(wl_if_t)); - wlif = netdev_priv(dev); - bzero(wlif, sizeof(wl_if_t)); -- strncpy(dev->name, name, IFNAMSIZ); -+ snprintf(dev->name, IFNAMSIZ, name, subunit); - - wlif->type = iftype; - wlif->dev = dev; diff --git a/package/broadcom-wl/patches/910-fallback-sprom.patch b/package/broadcom-wl/patches/910-fallback-sprom.patch deleted file mode 100644 index 749ecbf31f..0000000000 --- a/package/broadcom-wl/patches/910-fallback-sprom.patch +++ /dev/null @@ -1,84 +0,0 @@ ---- a/driver/bcmsrom.c -+++ b/driver/bcmsrom.c -@@ -39,6 +39,11 @@ - #include <sbsdpcmdev.h> - #endif - -+#if defined(CONFIG_SSB_PCIHOST) && defined(CONFIG_BOARD_BCM963XX) -+#include <linux/ssb/ssb.h> -+extern struct ssb_sprom bcm63xx_sprom; -+#endif -+ - #ifdef WLTEST - #include <sbsprom.h> - #endif /* WLTEST */ -@@ -2058,6 +2063,10 @@ BCMATTACHFN(initvars_srom_pci)(si_t *sih - bool flash = FALSE; - int err = 0; - -+#if defined(CONFIG_SSB_PCIHOST) && defined(CONFIG_BOARD_BCM963XX) -+ char eabuf[18]; -+#endif -+ - /* - * Apply CRC over SROM content regardless SROM is present or not, - * and use variable <devpath>sromrev's existance in flash to decide -@@ -2120,6 +2129,58 @@ BCMATTACHFN(initvars_srom_pci)(si_t *sih - goto varscont; - } - -+#if defined(CONFIG_SSB_PCIHOST) && defined(CONFIG_BOARD_BCM963XX) -+ base = vp = MALLOC(osh, MAXSZ_NVRAM_VARS); -+ -+ if( base != NULL ) -+ { -+ varbuf_init(&b, base, MAXSZ_NVRAM_VARS); -+ -+ printk("Got version %i SPROM from SSB\n", bcm63xx_sprom.revision); -+ -+ varbuf_append(&b, vstr_sromrev, bcm63xx_sprom.revision); -+ varbuf_append(&b, vstr_boardrev, bcm63xx_sprom.board_rev); -+ -+ /* ToDo: map bcm63xx_sprom.country_code */ -+ varbuf_append(&b, vstr_noccode); -+ -+ varbuf_append(&b, vstr_aa2g, bcm63xx_sprom.ant_available_bg); -+ -+ varbuf_append(&b, vstr_pa0b[0], bcm63xx_sprom.pa0b0); -+ varbuf_append(&b, vstr_pa1b[0], bcm63xx_sprom.pa1b0); -+ varbuf_append(&b, vstr_pa0b[1], bcm63xx_sprom.pa0b1); -+ varbuf_append(&b, vstr_pa1b[1], bcm63xx_sprom.pa1b1); -+ varbuf_append(&b, vstr_pa0b[2], bcm63xx_sprom.pa0b2); -+ varbuf_append(&b, vstr_pa1b[2], bcm63xx_sprom.pa1b2); -+ -+ varbuf_append(&b, vstr_pa0maxpwr, bcm63xx_sprom.maxpwr_bg); -+ varbuf_append(&b, vstr_pa0itssit, bcm63xx_sprom.itssi_bg); -+ -+ varbuf_append(&b, vstr_boardflags, (bcm63xx_sprom.boardflags_hi << 16) | bcm63xx_sprom.boardflags_lo); -+ varbuf_append(&b, vstr_boardflags2, (bcm63xx_sprom.boardflags2_hi << 16) | bcm63xx_sprom.boardflags2_lo); -+ -+ snprintf(eabuf, sizeof(eabuf), "%02x:%02x:%02x:%02x:%02x:%02x", -+ bcm63xx_sprom.il0mac[0], bcm63xx_sprom.il0mac[1], bcm63xx_sprom.il0mac[2], -+ bcm63xx_sprom.il0mac[3], bcm63xx_sprom.il0mac[4], bcm63xx_sprom.il0mac[5] -+ ); -+ -+ varbuf_append(&b, vstr_macaddr, eabuf); -+ -+ /* final nullbyte terminator */ -+ ASSERT(b.size >= 1); -+ vp = b.buf; -+ *vp++ = '\0'; -+ -+ ASSERT((vp - base) <= MAXSZ_NVRAM_VARS); -+ goto varsdone; -+ } -+ else -+ { -+ err = -2; -+ goto errout; -+ } -+#endif -+ - BS_ERROR(("SROM CRC Error\n")); - - #if defined(WLTEST) diff --git a/package/broadcom-wl/patches/912-pci-bus-nvram-hack.patch b/package/broadcom-wl/patches/912-pci-bus-nvram-hack.patch deleted file mode 100644 index 65e8bd3958..0000000000 --- a/package/broadcom-wl/patches/912-pci-bus-nvram-hack.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/driver/siutils.c -+++ b/driver/siutils.c -@@ -1859,7 +1859,7 @@ BCMINITFN(si_devpath)(si_t *sih, char *p - case PCI_BUS: - ASSERT((SI_INFO(sih))->osh != NULL); - slen = snprintf(path, (size_t)size, "pci/%u/%u/", -- OSL_PCI_BUS((SI_INFO(sih))->osh), -+ OSL_PCI_BUS((SI_INFO(sih))->osh) + 1, - OSL_PCI_SLOT((SI_INFO(sih))->osh)); - break; - case PCMCIA_BUS: diff --git a/package/broadcom-wl/patches/913-avoid-dbe-on-ifs_ctl-readw-hack.patch b/package/broadcom-wl/patches/913-avoid-dbe-on-ifs_ctl-readw-hack.patch deleted file mode 100644 index 412bce92c8..0000000000 --- a/package/broadcom-wl/patches/913-avoid-dbe-on-ifs_ctl-readw-hack.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/driver/linux_osl.c -+++ b/driver/linux_osl.c -@@ -723,6 +723,9 @@ osl_readl(volatile uint32 *r) - uint16 - osl_readw(volatile uint16 *r) - { -+ uint32 addr = (uintptr)r & 0xffff3fff; -+ if (addr == 0xa8000688) /* ifs_ctl */ -+ readl(r); - return (readw(r)); - } - diff --git a/package/broadcom-wl/src/glue/Makefile b/package/broadcom-wl/src/glue/Makefile deleted file mode 100644 index 81f0c8acfd..0000000000 --- a/package/broadcom-wl/src/glue/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -# -# Makefile for wl_glue driver -# -# Copyright (C) 2011 Jo-Philipp Wich <jow@openwrt.org> -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version -# 2 of the License, or (at your option) any later version. -# - -obj-m := wl_glue.o - -ifeq ($(MAKING_MODULES),1) --include $(TOPDIR)/Rules.make -endif - diff --git a/package/broadcom-wl/src/glue/wl_glue.c b/package/broadcom-wl/src/glue/wl_glue.c deleted file mode 100644 index fc94ac0b25..0000000000 --- a/package/broadcom-wl/src/glue/wl_glue.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * wl_glue.c: Broadcom WL support module providing a unified SSB/BCMA handling. - * Copyright (C) 2011 Jo-Philipp Wich <jow@openwrt.org> - */ - -#include "wl_glue.h" - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> - -#ifdef CONFIG_BCM47XX -#include <bcm47xx.h> -#endif - -#ifdef CONFIG_SSB -#include <linux/ssb/ssb.h> -#endif - -#ifdef CONFIG_BCMA -#include <linux/bcma/bcma.h> -#endif - -MODULE_AUTHOR("Jo-Philipp Wich (jow@openwrt.org)"); -MODULE_DESCRIPTION("Broadcom WL SSB/BCMA compatibility layer"); -MODULE_LICENSE("GPL"); - -static wl_glue_attach_cb_t attach_cb = NULL; -static wl_glue_remove_cb_t remove_cb = NULL; -static enum wl_glue_bus_type active_bus_type = WL_GLUE_BUS_TYPE_UNSPEC; -static int wl_glue_attached = 0; - - -#ifdef CONFIG_SSB -static int wl_glue_ssb_probe(struct ssb_device *dev, const struct ssb_device_id *id) -{ - void *mmio; - void *wldev; - - if (!attach_cb) - { - pr_err("No attach callback registered\n"); - return -ENOSYS; - } - - if (dev->bus->bustype != SSB_BUSTYPE_SSB) - { - pr_err("Attaching to SSB behind PCI is not supported. Please remove the b43 ssb bridge\n"); - return -EINVAL; - } - - mmio = (void *) 0x18000000 + dev->core_index * 0x1000; - wldev = attach_cb(id->vendor, id->coreid, (ulong)mmio, dev, dev->irq); - - if (!wldev) - { - pr_err("The attach callback failed, SSB probe aborted\n"); - return -ENODEV; - } - - ssb_set_drvdata(dev, wldev); - return 0; -} - -static void wl_glue_ssb_remove(struct ssb_device *dev) -{ - void *wldev = ssb_get_drvdata(dev); - - if (remove_cb) - remove_cb(wldev); - - ssb_set_drvdata(dev, NULL); -} - -static const struct ssb_device_id wl_glue_ssb_tbl[] = { - SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, SSB_ANY_REV), - SSB_DEVTABLE_END -}; - -static struct ssb_driver wl_glue_ssb_driver = { - .name = KBUILD_MODNAME, - .id_table = wl_glue_ssb_tbl, - .probe = wl_glue_ssb_probe, - .remove = wl_glue_ssb_remove, -}; -#endif /* CONFIG_SSB */ - -#ifdef CONFIG_BCMA -static int wl_glue_bcma_probe(struct bcma_device *dev) -{ - void *wldev; - - if (!attach_cb) - { - pr_err("No attach callback registered\n"); - return -ENOSYS; - } - - if (dev->bus->hosttype != BCMA_HOSTTYPE_SOC) - { - pr_err("Unsupported BCMA bus type %d\n", dev->bus->hosttype); - return -EINVAL; - } - - /* - * NB: - * 0x18000000 = BCMA_ADDR_BASE - * 0x1000 = BCMA_CORE_SIZE - */ - - wldev = attach_cb(dev->id.manuf, dev->id.id, (ulong)dev->addr, dev, dev->irq); - - if (!wldev) - { - pr_err("The attach callback failed, BCMA probe aborted\n"); - return -ENODEV; - } - - bcma_set_drvdata(dev, wldev); - return 0; -} - -static void wl_glue_bcma_remove(struct bcma_device *dev) -{ - void *wldev = bcma_get_drvdata(dev); - - if (remove_cb) - remove_cb(wldev); - - bcma_set_drvdata(dev, NULL); -} - -static const struct bcma_device_id wl_glue_bcma_tbl[] = { - BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, BCMA_ANY_REV, BCMA_ANY_CLASS), - BCMA_CORETABLE_END -}; - -static struct bcma_driver wl_glue_bcma_driver = { - .name = KBUILD_MODNAME, - .id_table = wl_glue_bcma_tbl, - .probe = wl_glue_bcma_probe, - .remove = wl_glue_bcma_remove, -}; -#endif /* CONFIG_BCMA */ - - -void wl_glue_set_attach_callback(wl_glue_attach_cb_t cb) -{ - attach_cb = cb; -} -EXPORT_SYMBOL(wl_glue_set_attach_callback); - -void wl_glue_set_remove_callback(wl_glue_remove_cb_t cb) -{ - remove_cb = cb; -} -EXPORT_SYMBOL(wl_glue_set_remove_callback); - -int wl_glue_register(void) -{ - int err; - - switch(active_bus_type) - { -#ifdef CONFIG_SSB - case WL_GLUE_BUS_TYPE_SSB: - err = ssb_driver_register(&wl_glue_ssb_driver); - break; -#endif /* CONFIG_SSB */ - -#ifdef CONFIG_BCMA - case WL_GLUE_BUS_TYPE_BCMA: - err = bcma_driver_register(&wl_glue_bcma_driver); - break; -#endif /* CONFIG_BCMA */ - - default: - pr_err("Not attaching through glue driver due to unsupported bus\n"); - err = -ENOSYS; - break; - } - - if (!err) - { - pr_info("SSB/BCMA glue driver successfully attached\n"); - wl_glue_attached = 1; - } - - return err; -} -EXPORT_SYMBOL(wl_glue_register); - -int wl_glue_unregister(void) -{ - int err; - - if (!wl_glue_attached) - return -ENOSYS; - - switch (active_bus_type) - { -#ifdef CONFIG_SSB - case WL_GLUE_BUS_TYPE_SSB: - ssb_driver_unregister(&wl_glue_ssb_driver); - err = 0; - break; -#endif /* CONFIG_SSB */ - -#ifdef CONFIG_BCMA - case WL_GLUE_BUS_TYPE_BCMA: - bcma_driver_unregister(&wl_glue_bcma_driver); - err = 0; - break; -#endif /* CONFIG_BCMA */ - - default: - pr_err("Not removing glue driver due to unsupported bus\n"); - err = -ENOSYS; - break; - } - - if (!err) - { - pr_info("SSB/BCMA glue driver successfully detached\n"); - wl_glue_attached = 0; - } - - return err; -} -EXPORT_SYMBOL(wl_glue_unregister); - -struct device * wl_glue_get_dmadev(void *dev) -{ - struct device *dma_dev; - - switch (active_bus_type) - { -#ifdef CONFIG_SSB - case WL_GLUE_BUS_TYPE_SSB: - dma_dev = ((struct ssb_device *)dev)->dma_dev; - break; -#endif /* CONFIG_SSB */ - -#ifdef CONFIG_BCMA - case WL_GLUE_BUS_TYPE_BCMA: - dma_dev = ((struct bcma_device *)dev)->dma_dev; - break; -#endif /* CONFIG_BCMA */ - - default: - BUG(); - dma_dev = NULL; - break; - } - - return dma_dev; -} -EXPORT_SYMBOL(wl_glue_get_dmadev); - - -static int __init wl_glue_init(void) -{ -#ifdef CONFIG_BCM47XX - /* - * BCM47xx currently supports either SSB or BCMA bus, - * determine the used one from the info set by the - * platform setup code. - */ - switch (bcm47xx_bus_type) - { -#ifdef CONFIG_SSB - case BCM47XX_BUS_TYPE_SSB: - active_bus_type = WL_GLUE_BUS_TYPE_SSB; - break; -#endif /* CONFIG_SSB */ - -#ifdef CONFIG_BCMA - case BCM47XX_BUS_TYPE_BCMA: - active_bus_type = WL_GLUE_BUS_TYPE_BCMA; - break; -#endif /* CONFIG_BCMA */ - } -#endif /* CONFIG_BCM47XX */ - -#ifdef CONFIG_BCM63XX -#ifdef CONFIG_SSB - /* - * BCM63xx currently only uses SSB, so assume that. - */ - active_bus_type = WL_GLUE_BUS_TYPE_SSB; -#endif /* CONFIG_SSB */ -#endif /* CONFIG_BCM63XX */ - - /* do not fail here, let wl_glue_register() return -ENOSYS later */ - if (active_bus_type == WL_GLUE_BUS_TYPE_UNSPEC) - pr_err("Unable to determine used system bus type\n"); - - return 0; -} - -static void __exit wl_glue_exit(void) -{ - if (wl_glue_attached) - { - if (wl_glue_unregister()) - pr_err("Failed to unregister glue driver\n"); - - wl_glue_attached = 0; - } - - return; -} - -module_init(wl_glue_init); -module_exit(wl_glue_exit); diff --git a/package/broadcom-wl/src/glue/wl_glue.h b/package/broadcom-wl/src/glue/wl_glue.h deleted file mode 100644 index b3c8aa3b6a..0000000000 --- a/package/broadcom-wl/src/glue/wl_glue.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * wl_glue.h: Broadcom WL support module providing a unified SSB/BCMA handling. - * Copyright (C) 2011 Jo-Philipp Wich <jow@openwrt.org> - */ - -#include <linux/types.h> - -typedef void * (*wl_glue_attach_cb_t)(u16, u16, ulong, void *, u32); -typedef void (*wl_glue_remove_cb_t)(void *); - -enum wl_glue_bus_type { - WL_GLUE_BUS_TYPE_UNSPEC, - WL_GLUE_BUS_TYPE_SSB, - WL_GLUE_BUS_TYPE_BCMA -}; - -extern void wl_glue_set_attach_callback(wl_glue_attach_cb_t cb); -extern void wl_glue_set_remove_callback(wl_glue_remove_cb_t cb); -extern int wl_glue_register(void); -extern int wl_glue_unregister(void); -extern struct device * wl_glue_get_dmadev(void *); - diff --git a/package/broadcom-wl/src/wlc.c b/package/broadcom-wl/src/wlc.c deleted file mode 100644 index 253809c9a3..0000000000 --- a/package/broadcom-wl/src/wlc.c +++ /dev/null @@ -1,1086 +0,0 @@ -/* - * wlc - Broadcom Wireless Driver Control Utility - * - * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> -#include <glob.h> -#include <ctype.h> - -#include <typedefs.h> -#include <wlutils.h> -#include <proto/802.11.h> - -#define VERSION "0.1" -#define BUFSIZE 8192 -#define PTABLE_MAGIC 0xbadc0ded -#define PTABLE_SLT1 1 -#define PTABLE_SLT2 2 -#define PTABLE_ACKW 3 -#define PTABLE_ADHM 4 -#define PTABLE_END 0xffffffff - -/* - * Copy each token in wordlist delimited by space into word - * Taken from Broadcom shutils.h - */ -#define foreach(word, wordlist, next) \ - for (next = &wordlist[strspn(wordlist, " ")], \ - strncpy(word, next, sizeof(word)), \ - word[strcspn(word, " ")] = '\0', \ - word[sizeof(word) - 1] = '\0', \ - next = strchr(next, ' '); \ - strlen(word); \ - next = next ? &next[strspn(next, " ")] : "", \ - strncpy(word, next, sizeof(word)), \ - word[strcspn(word, " ")] = '\0', \ - word[sizeof(word) - 1] = '\0', \ - next = strchr(next, ' ')) - -static char wlbuf[8192]; -static char interface[16] = "wl0"; -static unsigned long kmem_offset = 0; -static int vif = 0, debug = 1, fromstdin = 0; - -typedef enum { - NONE = 0x00, - - /* types */ - PARAM_TYPE = 0x00f, - INT = 0x001, - STRING = 0x002, - MAC = 0x003, - - /* options */ - PARAM_OPTIONS = 0x0f0, - NOARG = 0x010, - - /* modes */ - PARAM_MODE = 0xf00, - GET = 0x100, - SET = 0x200, -} wlc_param; - -struct wlc_call { - const char *name; - wlc_param param; - int (*handler)(wlc_param param, void *data, void *value); - union { - int num; - char *str; - void *ptr; - } data; - const char *desc; -}; - -/* can't use the system include because of the stupid broadcom header files */ -extern struct ether_addr *ether_aton(const char *asc); -static inline int my_ether_ntoa(unsigned char *ea, char *buf) -{ - return sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x", - ea[0], ea[1], ea[2], ea[3], ea[4], ea[5]); -} - -static int wlc_ioctl(wlc_param param, void *data, void *value) -{ - unsigned int *var = ((unsigned int *) data); - unsigned int ioc = *var; - - if (param & NOARG) { - return wl_ioctl(interface, ioc, NULL, 0); - } - switch(param & PARAM_TYPE) { - case MAC: - return wl_ioctl(interface, ((param & SET) ? (ioc) : (ioc >> 16)) & 0xffff, value, 6); - case INT: - return wl_ioctl(interface, ((param & SET) ? (ioc) : (ioc >> 16)) & 0xffff, value, sizeof(int)); - case STRING: - return wl_ioctl(interface, ((param & SET) ? (ioc) : (ioc >> 16)) & 0xffff, value, BUFSIZE); - } - return 0; -} - -static int wlc_iovar(wlc_param param, void *data, void *value) -{ - int *val = (int *) value; - char *iov = *((char **) data); - int ret = 0; - - if (param & SET) { - switch(param & PARAM_TYPE) { - case INT: - ret = wl_iovar_setint(interface, iov, *val); - break; - case MAC: - ret = wl_iovar_set(interface, iov, value, 6); - break; - } - } - if (param & GET) { - switch(param & PARAM_TYPE) { - case INT: - ret = wl_iovar_get(interface, iov, val, sizeof(int)); - break; - case MAC: - ret = wl_iovar_get(interface, iov, value, 6); - break; - } - } - - return ret; -} - -static int wlc_bssiovar(wlc_param param, void *data, void *value) -{ - int *val = (int *) value; - char *iov = *((char **) data); - int ret = 0; - - if (param & SET) { - switch(param & PARAM_TYPE) { - case INT: - ret = wl_bssiovar_setint(interface, iov, vif, *val); - } - } - if (param & GET) { - switch(param & PARAM_TYPE) { - case INT: - ret = wl_bssiovar_get(interface, iov, vif, val, sizeof(int)); - } - } - - return ret; -} - -static int wlc_vif_enabled(wlc_param param, void *data, void *value) -{ - int *val = (int *) value; - int buf[3]; - int ret = 0; - - sprintf((char *) buf, "bss"); - buf[1] = vif; - if (param & SET) { - buf[2] = (*val ? 1 : 0); - ret = wl_ioctl(interface, WLC_SET_VAR, buf, sizeof(buf)); - } else if (param & GET) { - ret = wl_ioctl(interface, WLC_GET_VAR, buf, sizeof(buf)); - *val = buf[0]; - } - - return ret; -} - -static int wlc_ssid(wlc_param param, void *data, void *value) -{ - int ret = -1, ret2 = -1; - char *dest = (char *) value; - wlc_ssid_t ssid; - - if ((param & PARAM_MODE) == GET) { - ret = wl_bssiovar_get(interface, "ssid", vif, &ssid, sizeof(ssid)); - - if (ret) - /* if we can't get the ssid through the bssiovar, try WLC_GET_SSID */ - ret = wl_ioctl(interface, WLC_GET_SSID, &ssid, sizeof(ssid)); - - if (!ret) { - memcpy(dest, ssid.SSID, ssid.SSID_len); - dest[ssid.SSID_len] = 0; - } - } else if ((param & PARAM_MODE) == SET) { - strncpy(ssid.SSID, value, 32); - ssid.SSID_len = strlen(value); - - if (ssid.SSID_len > 32) - ssid.SSID_len = 32; - - if (vif == 0) { - /* for the main interface, also try the WLC_SET_SSID call */ - ret2 = wl_ioctl(interface, WLC_SET_SSID, &ssid, sizeof(ssid)); - } - - ret = wl_bssiovar_set(interface, "ssid", vif, &ssid, sizeof(ssid)); - ret = (!ret2 ? 0 : ret); - } - - return ret; -} - -static int wlc_int(wlc_param param, void *data, void *value) -{ - int *var = *((int **) data); - int *val = (int *) value; - - if ((param & PARAM_MODE) == SET) { - *var = *val; - } else if ((param & PARAM_MODE) == GET) { - *val = *var; - } - - return 0; -} - -static int wlc_flag(wlc_param param, void *data, void *value) -{ - int *var = *((int **) data); - - *var = 1; - - return 0; -} - -static int wlc_string(wlc_param param, void *data, void *value) -{ - char *var = *((char **) data); - - if ((param & PARAM_MODE) == GET) { - strcpy(value, var); - } - - return 0; -} - -static int wlc_afterburner(wlc_param param, void *data, void *value) -{ - int *val = (int *) value; - int ret = 0; - - if ((param & PARAM_MODE) == GET) { - ret = wl_iovar_get(interface, "afterburner", val, sizeof(int)); - } else { - wl_iovar_setint(interface, "wlfeatureflag", (*val ? 3 : 0)); - ret = wl_iovar_setint(interface, "afterburner", (*val ? 1 : 0)); - wl_iovar_setint(interface, "afterburner_override", *val); - } - - return ret; -} - -static int wlc_maclist(wlc_param param, void *data, void *value) -{ - unsigned int *var = ((unsigned int *) data); - unsigned int ioc = *var; - int limit = (sizeof(wlbuf) - 4) / sizeof(struct ether_addr); - struct maclist *list = (struct maclist *) wlbuf; - char *str = (char *) value; - char astr[30], *p; - struct ether_addr *addr; - int isset = 0; - int ret; - - if ((param & PARAM_MODE) == GET) { - list->count = limit; - ret = wl_ioctl(interface, (ioc >> 16) & 0xffff, wlbuf, sizeof(wlbuf)); - - if (!ret) - while (list->count) { - str += sprintf(str, "%s", ((((char *) value) == str) ? "" : " ")); - str += my_ether_ntoa((unsigned char *) &list->ea[list->count-- - 1], str); - } - - return ret; - } else { - while (*str && isspace(*str)) - *str++; - - if (*str == '+') { - str++; - - list->count = limit; - if (wl_ioctl(interface, (ioc >> 16) & 0xffff, wlbuf, sizeof(wlbuf)) == 0) - isset = 1; - - while (*str && isspace(*str)) - str++; - } - - if (!isset) - memset(wlbuf, 0, sizeof(wlbuf)); - - foreach(astr, str, p) { - if (list->count >= limit) - break; - - if ((addr = ether_aton(astr)) != NULL) - memcpy(&list->ea[list->count++], addr, sizeof(struct ether_addr)); - } - - return wl_ioctl(interface, ioc & 0xffff, wlbuf, sizeof(wlbuf)); - } -} - -static int wlc_radio(wlc_param param, void *data, void *value) -{ - int *val = (int *) value; - int ret; - - if ((param & PARAM_MODE) == GET) { - ret = wl_ioctl(interface, WLC_GET_RADIO, val, sizeof(int)); - *val = ((*val & 1) ? 0 : 1); - } else { - *val = (1 << 16) | (*val ? 0 : 1); - ret = wl_ioctl(interface, WLC_SET_RADIO, val, sizeof(int)); - } - - return ret; -} - -static int wlc_wsec_key(wlc_param param, void *null, void *value) -{ - wl_wsec_key_t wsec_key; - unsigned char *index = value; - unsigned char *key; - unsigned char *data; - unsigned char hex[3]; - - if ((param & PARAM_MODE) != SET) - return 0; - - memset(&wsec_key, 0, sizeof(wsec_key)); - if (index[0] == '=') { - wsec_key.flags = WL_PRIMARY_KEY; - index++; - } - - if ((index[0] < '1') || (index[0] > '4') || (index[1] != ',')) - return -1; - - key = index + 2; - if (strncmp(key, "d:", 2) == 0) { /* delete key */ - } else if (strncmp(key, "s:", 2) == 0) { /* ascii key */ - key += 2; - wsec_key.len = strlen(key); - - if ((wsec_key.len != 5) && (wsec_key.len != 13)) - return -1; - - strcpy(wsec_key.data, key); - } else { /* hex key */ - wsec_key.len = strlen(key); - if ((wsec_key.len != 10) && (wsec_key.len != 26)) - return -1; - - wsec_key.len /= 2; - data = wsec_key.data; - hex[2] = 0; - do { - hex[0] = *(key++); - hex[1] = *(key++); - *(data++) = (unsigned char) strtoul(hex, NULL, 16); - } while (*key != 0); - } - - return wl_bssiovar_set(interface, "wsec_key", vif, &wsec_key, sizeof(wsec_key)); -} - -static inline int cw2ecw(int cw) -{ - int i; - for (cw++, i = 0; cw; i++) cw >>=1; - return i - 1; -} - -static int wlc_wme_ac(wlc_param param, void *data, void *value) -{ - char *type = *((char **) data); - char *settings = (char *) value; - char cmd[100], *p, *val; - edcf_acparam_t params[AC_COUNT]; - int ret; - int intval; - int cur = -1; - char *buf = wlbuf; - - if ((param & PARAM_MODE) != SET) - return -1; - - memset(params, 0, sizeof(params)); - ret = wl_iovar_get(interface, type, params, sizeof(params)); - memset(buf, 0, BUFSIZE); - strcpy(buf, type); - buf += strlen(buf) + 1; - - foreach(cmd, settings, p) { - val = strchr(cmd, '='); - if (val == NULL) { - if (strcmp(cmd, "be") == 0) - cur = AC_BE; - else if (strcmp(cmd, "bk") == 0) - cur = AC_BK; - else if (strcmp(cmd, "vi") == 0) - cur = AC_VI; - else if (strcmp(cmd, "vo") == 0) - cur = AC_VO; - else - return -1; - - /* just in case */ - params[cur].ACI = (params[cur].ACI & (0x3 << 5)) | (cur << 5); - } else { - *(val++) = 0; - - intval = strtoul(val, NULL, 10); - if (strcmp(cmd, "cwmin") == 0) - params[cur].ECW = (params[cur].ECW & ~(0xf)) | cw2ecw(intval); - else if (strcmp(cmd, "ecwmin") == 0) - params[cur].ECW = (params[cur].ECW & ~(0xf)) | (intval & 0xf); - else if (strcmp(cmd, "cwmax") == 0) - params[cur].ECW = (params[cur].ECW & ~(0xf << 4)) | (cw2ecw(intval) << 4); - else if (strcmp(cmd, "ecwmax") == 0) - params[cur].ECW = (params[cur].ECW & ~(0xf << 4)) | ((intval & 0xf) << 4); - else if (strcmp(cmd, "aifsn") == 0) - params[cur].ACI = (params[cur].ACI & ~(0xf)) | (intval & 0xf); - else if (strcmp(cmd, "txop") == 0) - params[cur].TXOP = intval >> 5; - else if (strcmp(cmd, "force") == 0) - params[cur].ACI = (params[cur].ACI & ~(1 << 4)) | ((intval) ? (1 << 4) : 0); - else return -1; - - memcpy(buf, ¶ms[cur], sizeof(edcf_acparam_t)); - wl_ioctl(interface, WLC_SET_VAR, wlbuf, BUFSIZE); - } - } - return ret; -} - -static int wlc_ifname(wlc_param param, void *data, void *value) -{ - char *val = (char *) value; - int ret = 0; - - if (param & SET) { - if (strlen(val) < 16) - strcpy(interface, val); - else ret = -1; - } - if (param & GET) { - strcpy(val, interface); - } - - return ret; -} - -static int wlc_wdsmac(wlc_param param, void *data, void *value) -{ - unsigned char mac[6]; - int ret = 0; - - ret = wl_ioctl(interface, WLC_WDS_GET_REMOTE_HWADDR, &mac, 6); - if (ret == 0) - my_ether_ntoa(mac, value); - - return ret; -} - -static int wlc_pmk(wlc_param param, void *data, void *value) -{ - int ret = -1; - char *str = (char *) value; - wsec_pmk_t pmk; - - /* driver doesn't support GET */ - - if ((param & PARAM_MODE) == SET) { - strncpy(pmk.key, value, WSEC_MAX_PSK_LEN); - pmk.key_len = strlen(value); - - if (pmk.key_len > WSEC_MAX_PSK_LEN) - pmk.key_len = WSEC_MAX_PSK_LEN; - - pmk.flags = WSEC_PASSPHRASE; - - ret = wl_ioctl(interface, WLC_SET_WSEC_PMK, &pmk, sizeof(pmk)); - } - - return ret; -} - -static const struct wlc_call wlc_calls[] = { - { - .name = "version", - .param = STRING|NOARG, - .handler = wlc_string, - .data.str = VERSION, - .desc = "Version of this program" - }, - { - .name = "debug", - .param = INT, - .handler = wlc_int, - .data.ptr = &debug, - .desc = "wlc debug level" - }, - { - .name = "stdin", - .param = NOARG, - .handler = wlc_flag, - .data.ptr = &fromstdin, - .desc = "Accept input from stdin" - }, - { - .name = "ifname", - .param = STRING, - .handler = wlc_ifname, - .desc = "interface to send commands to" - }, - { - .name = "up", - .param = NOARG, - .handler = wlc_ioctl, - .data.num = WLC_UP, - .desc = "Bring the interface up" - }, - { - .name = "down", - .param = NOARG, - .handler = wlc_ioctl, - .data.num = WLC_DOWN, - .desc = "Bring the interface down" - }, - { - .name = "radio", - .param = INT, - .handler = wlc_radio, - .desc = "Radio enabled flag" - }, - { - .name = "ap", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_AP << 16) | WLC_SET_AP), - .desc = "Access Point mode" - }, - { - .name = "mssid", - .param = INT, - .handler = wlc_iovar, - .data.str = "mbss", - .desc = "Multi-ssid mode" - }, - { - .name = "apsta", - .param = INT, - .handler = wlc_iovar, - .data.str = "apsta", - .desc = "AP+STA mode" - }, - { - .name = "infra", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_INFRA << 16) | WLC_SET_INFRA), - .desc = "Infrastructure mode" - }, - { - .name = "wet", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_WET << 16) | WLC_SET_WET), - .desc = "Wireless repeater mode", - }, - { - .name = "statimeout", - .param = INT, - .handler = wlc_iovar, - .data.str = "sta_retry_time", - .desc = "STA connection timeout" - }, - { - .name = "country", - .param = STRING, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_COUNTRY << 16) | WLC_SET_COUNTRY), - .desc = "Country code" - }, - { - .name = "channel", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_CHANNEL << 16) | WLC_SET_CHANNEL), - .desc = "Channel", - }, - { - .name = "vlan_mode", - .param = INT, - .handler = wlc_bssiovar, - .data.str = "vlan_mode", - .desc = "Parse 802.1Q tags", - }, - { - .name = "vif", - .param = INT, - .handler = wlc_int, - .data.ptr = &vif, - .desc = "Current vif index" - }, - { - .name = "enabled", - .param = INT, - .handler = wlc_vif_enabled, - .desc = "vif enabled flag" - }, - { - .name = "ssid", - .param = STRING, - .handler = wlc_ssid, - .desc = "Interface ESSID" - }, - { - .name = "closed", - .param = INT, - .handler = wlc_bssiovar, - .data.str = "closednet", - .desc = "Hidden ESSID flag" - }, - { - .name = "wsec", - .param = INT, - .handler = wlc_bssiovar, - .data.str = "wsec", - .desc = "Security mode flags" - }, - { - .name = "wepkey", - .param = STRING, - .handler = wlc_wsec_key, - .desc = "Set/Remove WEP keys" - }, - { - .name = "wepauth", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_AUTH << 16) | WLC_SET_AUTH), - .desc = "WEP authentication type. 0 = OpenSystem, 1 = SharedKey" - }, - { - .name = "wsec_restrict", - .param = INT, - .handler = wlc_bssiovar, - .data.str = "wsec_restrict", - .desc = "Drop unencrypted traffic" - }, - { - .name = "eap_restrict", - .param = INT, - .handler = wlc_bssiovar, - .data.str = "eap_restrict", - .desc = "Only allow 802.1X traffic until 802.1X authorized" - }, - { - .name = "wpa_auth", - .param = INT, - .handler = wlc_bssiovar, - .data.str = "wpa_auth", - .desc = "WPA authentication modes" - }, - { - .name = "ap_isolate", - .param = INT, - .handler = wlc_bssiovar, - .data.str = "ap_isolate", - .desc = "Isolate connected clients" - }, - { - .name = "supplicant", - .param = INT, - .handler = wlc_iovar, - .data.str = "sup_wpa", - .desc = "Built-in WPA supplicant" - }, - { - .name = "passphrase", - .param = STRING, - .handler = wlc_pmk, - .desc = "Passphrase for built-in WPA supplicant", - }, - { - .name = "maxassoc", - .param = INT, - .handler = wlc_iovar, - .data.str = "maxassoc", - .desc = "Max. number of associated clients", - }, - { - .name = "wme", - .param = INT, - .handler = wlc_iovar, - .data.str = "wme", - .desc = "WME enabled" - }, - { - .name = "wme_ac_ap", - .param = STRING, - .handler = wlc_wme_ac, - .data.str = "wme_ac_ap", - .desc = "Set WME AC options for AP mode", - }, - { - .name = "wme_ac_sta", - .param = STRING, - .handler = wlc_wme_ac, - .data.str = "wme_ac_sta", - .desc = "Set WME AC options for STA mode", - }, - { - .name = "wme_noack", - .param = INT, - .handler = wlc_iovar, - .data.str = "wme_noack", - .desc = "WME ACK disable request", - }, - { - .name = "802.11d", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_REGULATORY << 16) | WLC_SET_REGULATORY), - .desc = "Enable/disable 802.11d regulatory management", - }, - { - .name = "802.11h", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_SPECT_MANAGMENT << 16) | WLC_SET_SPECT_MANAGMENT), - .desc = "Enable/disable 802.11h spectrum management", - }, - { - .name = "fragthresh", - .param = INT, - .handler = wlc_iovar, - .data.str = "fragthresh", - .desc = "Fragmentation threshold", - }, - { - .name = "rtsthresh", - .param = INT, - .handler = wlc_iovar, - .data.str = "rtsthresh", - .desc = "RTS threshold" - }, - { - .name = "slottime", - .param = INT, - .handler = wlc_iovar, - .data.str = "acktiming", - .desc = "Slot time" - }, - { - .name = "rxant", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_ANTDIV << 16) | WLC_SET_ANTDIV), - .desc = "Rx antenna selection" - }, - { - .name = "txant", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_TXANT << 16) | WLC_SET_TXANT), - .desc = "Tx antenna selection" - }, - { - .name = "dtim", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_DTIMPRD << 16) | WLC_SET_DTIMPRD), - .desc = "DTIM period", - }, - { - .name = "bcn", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_BCNPRD << 16) | WLC_SET_BCNPRD), - .desc = "Beacon interval" - }, - { - .name = "frameburst", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_FAKEFRAG << 16) | WLC_SET_FAKEFRAG), - .desc = "Framebursting" - }, - { - .name = "monitor", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_MONITOR << 16) | WLC_SET_MONITOR), - .desc = "Monitor mode" - }, - { - .name = "passive_scan", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_PASSIVE_SCAN << 16) | WLC_SET_PASSIVE_SCAN), - .desc = "Passive scan mode" - }, - { - .name = "macfilter", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_MACMODE << 16) | WLC_SET_MACMODE), - .desc = "MAC filter mode (0:disabled, 1:deny, 2:allow)" - }, - { - .name = "maclist", - .param = STRING, - .data.num = ((WLC_GET_MACLIST << 16) | WLC_SET_MACLIST), - .handler = wlc_maclist, - .desc = "MAC filter list" - }, - { - .name = "autowds", - .param = INT, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_LAZYWDS << 16) | WLC_SET_LAZYWDS), - .desc = "Automatic WDS" - }, - { - .name = "wds", - .param = STRING, - .data.num = ((WLC_GET_WDSLIST << 16) | WLC_SET_WDSLIST), - .handler = wlc_maclist, - .desc = "WDS connection list" - }, - { - .name = "wdstimeout", - .param = INT, - .handler = wlc_iovar, - .data.str = "wdstimeout", - .desc = "WDS link detection timeout" - }, - { - .name = "wdsmac", - .param = STRING|NOARG, - .handler = wlc_wdsmac, - .desc = "MAC of the remote WDS endpoint (only with wds0.* interfaces)" - }, - { - .name = "afterburner", - .param = INT, - .handler = wlc_afterburner, - .desc = "Broadcom Afterburner" - }, - { - .name = "ibss_merge", - .param = INT, - .handler = wlc_iovar, - .data.str = "ibss_coalesce_allowed", - .desc = "Allow IBSS merges" - }, - { - .name = "bssid", - .param = MAC, - .handler = wlc_ioctl, - .data.num = ((WLC_GET_BSSID << 16) | WLC_SET_BSSID), - .desc = "BSSID" - }, - { - .name = "default_bssid", - .param = MAC, - .handler = wlc_iovar, - .data.str = "perm_etheraddr", - .desc = "Default BSSID (read-only)" - }, - { - .name = "assoclist", - .param = STRING, - .data.num = (WLC_GET_ASSOCLIST << 16), - .handler = wlc_maclist, - .desc = "MACs of associated stations" - }, - { - .name = "gmode", - .param = INT, - .data.num = ((WLC_GET_GMODE << 16) | WLC_SET_GMODE), - .handler = wlc_ioctl, - .desc = "G Mode" - }, -}; -#define wlc_calls_size (sizeof(wlc_calls) / sizeof(struct wlc_call)) - -static void usage(char *cmd) -{ - int i; - fprintf(stderr, "Usage: %s <command> [<argument> ...]\n" - "\n" - "Available commands:\n", cmd); - for (i = 0; i < wlc_calls_size; i++) { - fprintf(stderr, "\t%-16s\t%s\n", wlc_calls[i].name ?: "", wlc_calls[i].desc ?: ""); - } - fprintf(stderr, "\n"); - exit(1); -} - -static int do_command(const struct wlc_call *cmd, char *arg) -{ - static char buf[BUFSIZE]; - int set; - int ret = 0; - char *format, *end; - int intval; - void *ptr = (void *) buf; - - if (debug >= 10) { - fprintf(stderr, "do_command %-16s\t'%s'\n", cmd->name, arg); - } - - if ((arg == NULL) && ((cmd->param & PARAM_TYPE) != NONE)) { - set = 0; - ret = cmd->handler(cmd->param | GET, (void *) &cmd->data, (void *) buf); - if (ret == 0) { - switch(cmd->param & PARAM_TYPE) { - case INT: - intval = *((int *) buf); - - if (intval > 65535) - format = "0x%08x\n"; - else if (intval > 255) - format = "0x%04x\n"; - else - format = "%d\n"; - - fprintf(stdout, format, intval); - break; - case STRING: - fprintf(stdout, "%s\n", buf); - break; - case MAC: - my_ether_ntoa(buf, buf + 6); - fprintf(stdout, "%s\n", buf + 6); - break; - } - } - } else { /* SET */ - set = 1; - switch(cmd->param & PARAM_TYPE) { - case INT: - intval = strtoul(arg, &end, 10); - if (end && !(*end)) { - memcpy(buf, &intval, sizeof(intval)); - } else { - fprintf(stderr, "%s: Invalid argument\n", cmd->name); - return -1; - } - break; - case STRING: - strncpy(buf, arg, BUFSIZE); - buf[BUFSIZE - 1] = 0; - break; - case MAC: - ptr = ether_aton(arg); - if (!ptr) { - fprintf(stderr, "%s: Invalid mac address '%s'\n", cmd->name, arg); - return -1; - } - break; - } - - ret = cmd->handler(cmd->param | SET, (void *) &cmd->data, ptr); - } - - if ((debug > 0) && (ret != 0)) - fprintf(stderr, "Command '%s %s' failed: %d\n", (set == 1 ? "set" : "get"), cmd->name, ret); - - return ret; -} - -static struct wlc_call *find_cmd(char *name) -{ - int found = 0, i = 0; - - while (!found && (i < wlc_calls_size)) { - if (strcmp(name, wlc_calls[i].name) == 0) - found = 1; - else - i++; - } - - return (struct wlc_call *) (found ? &wlc_calls[i] : NULL); -} - -int main(int argc, char **argv) -{ - static char buf[BUFSIZE]; - char *s, *s2; - char *cmd = argv[0]; - struct wlc_call *call; - int ret = 0; - - if (argc < 2) - usage(argv[0]); - - for(interface[2] = '0'; (interface[2] < '3') && (wl_probe(interface) != 0); interface[2]++); - if (interface[2] == '3') { - fprintf(stderr, "No Broadcom wl interface found!\n"); - return -1; - } - - argv++; - argc--; - while ((argc > 0) && (argv[0] != NULL)) { - if ((call = find_cmd(argv[0])) == NULL) { - fprintf(stderr, "Invalid command: %s\n\n", argv[0]); - usage(cmd); - } - if ((argc > 1) && (!(call->param & NOARG))) { - ret = do_command(call, argv[1]); - argv += 2; - argc -= 2; - } else { - ret = do_command(call, NULL); - argv++; - argc--; - } - } - - while (fromstdin && !feof(stdin)) { - *buf = 0; - fgets(buf, BUFSIZE - 1, stdin); - - if (*buf == 0) - continue; - - if ((s = strchr(buf, '\r')) != NULL) - *s = 0; - if ((s = strchr(buf, '\n')) != NULL) - *s = 0; - - s = buf; - while (isspace(*s)) - s++; - - if (!*s) - continue; - - if ((s2 = strchr(buf, ' ')) != NULL) - *(s2++) = 0; - - while (s2 && isspace(*s2)) - s2++; - - if ((call = find_cmd(buf)) == NULL) { - fprintf(stderr, "Invalid command: %s\n", buf); - ret = -1; - } else - ret = do_command(call, ((call->param & NOARG) ? NULL : s2)); - } - - return ret; -} |