remove the old broadcom wl driver for linux 2.4
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@21947 3c298f89-4303-0410-b956-a3cf2f4a3e73master
parent
d3ec4c6f75
commit
15260349e2
|
@ -1,202 +0,0 @@
|
||||||
#
|
|
||||||
# Copyright (C) 2006-2010 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:=4.150.10.5.3
|
|
||||||
PKG_RELEASE:=8
|
|
||||||
WLC_VERSION:=0.2
|
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
|
||||||
PKG_SOURCE_URL:=http://downloads.openwrt.org/sources
|
|
||||||
PKG_MD5SUM:=cc615fd49719eea8bce5b2a8813783f3
|
|
||||||
|
|
||||||
WL_WEXT=1
|
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
|
||||||
|
|
||||||
define Package/broadcom-wl-old/Default
|
|
||||||
SECTION:=kernel
|
|
||||||
CATEGORY:=Kernel modules
|
|
||||||
DEPENDS:=@PACKAGE_kmod-brcm-wl-old||PACKAGE_kmod-brcm-wl-mimo-old
|
|
||||||
SUBMENU:=Proprietary BCM43xx WiFi driver
|
|
||||||
SUBMENUDEP:=@TARGET_brcm_2_4||@TARGET_brcm47xx
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/brcm-wl-old/Default
|
|
||||||
$(call Package/broadcom-wl-old/Default)
|
|
||||||
SECTION:=kernel
|
|
||||||
DEPENDS:=@TARGET_brcm_2_4 +wireless-tools
|
|
||||||
TITLE:=Kernel driver for BCM43xx chipsets
|
|
||||||
FILES:=$(PKG_BUILD_DIR)/driver/wl$(1).o
|
|
||||||
AUTOLOAD:=$(call AutoLoad,30,wl$(1))
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/brcm-wl-old/Default/description
|
|
||||||
This package contains the proprietary wireless driver for the Broadcom
|
|
||||||
BCM43xx chipset.
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/brcm-wl-old
|
|
||||||
$(call KernelPackage/brcm-wl-old/Default,)
|
|
||||||
TITLE+= (normal version)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/brcm-wl-old/description
|
|
||||||
$(call KernelPackage/brcm-wl-old/Default/description)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/brcm-wl-mimo-old
|
|
||||||
$(call KernelPackage/brcm-wl-old/Default,_mimo)
|
|
||||||
TITLE+= (MIMO version)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/brcm-wl-mimo-old/description
|
|
||||||
$(call KernelPackage/brcm-wl-old/Default/description)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/wlcompat/Default
|
|
||||||
$(call KernelPackage/brcm-wl-old/Default,)
|
|
||||||
TITLE:=Kernel driver for BCM43xx chipsets
|
|
||||||
FILES:=$(PKG_BUILD_DIR)/wlcompat/wlcompat$(1).o
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/wlcompat
|
|
||||||
$(call KernelPackage/wlcompat/Default,)
|
|
||||||
AUTOLOAD:=$(call AutoLoad,50,wlcompat)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/wlcompat/description
|
|
||||||
This package contains a wrapper module, that provides Wireless Extension
|
|
||||||
support for the proprietary Broadcom wl module.
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/wlcompat-debug
|
|
||||||
$(call KernelPackage/wlcompat/Default,-debug)
|
|
||||||
TITLE+= (debug)
|
|
||||||
AUTOLOAD:=
|
|
||||||
endef
|
|
||||||
|
|
||||||
define KernelPackage/wlcompat-debug/description
|
|
||||||
$(call KernelPackage/wlcompat/description)
|
|
||||||
This is the debugging version.
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/wlc-old
|
|
||||||
$(call Package/broadcom-wl-old/Default)
|
|
||||||
TITLE:=wl driver setup utility
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/wlc-old/description
|
|
||||||
This package contains an utility for initializing the proprietary Broadcom
|
|
||||||
wl driver.
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/wl-old
|
|
||||||
$(call Package/broadcom-wl-old/Default)
|
|
||||||
TITLE:=Proprietary Broadcom wl driver config utility
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/wl-old/description
|
|
||||||
This package contains the proprietary utility (wl) for configuring the
|
|
||||||
proprietary Broadcom wl driver.
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/nas-old
|
|
||||||
$(call Package/broadcom-wl-old/Default)
|
|
||||||
TITLE:=Proprietary Broadcom WPA/WPA2 authenticator
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/nas-old/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) src/* $(PKG_BUILD_DIR)/
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Build/Compile
|
|
||||||
# Compile the kernel part
|
|
||||||
$(MAKE_KMOD) \
|
|
||||||
SUBDIRS="$(PKG_BUILD_DIR)/driver" \
|
|
||||||
modules
|
|
||||||
$(MAKE_KMOD) \
|
|
||||||
SUBDIRS="$(PKG_BUILD_DIR)/driver" \
|
|
||||||
MOD_NAME="_mimo" \
|
|
||||||
modules
|
|
||||||
$(MAKE_KMOD) \
|
|
||||||
SUBDIRS="$(PKG_BUILD_DIR)/wlcompat" \
|
|
||||||
$(if $(WL_WEXT),WL_WEXT=1) \
|
|
||||||
modules
|
|
||||||
$(MAKE_KMOD) \
|
|
||||||
SUBDIRS="$(PKG_BUILD_DIR)/wlcompat" \
|
|
||||||
DEBUG=1 \
|
|
||||||
$(if $(WL_WEXT),WL_WEXT=1) \
|
|
||||||
modules
|
|
||||||
|
|
||||||
# NVRAM stub
|
|
||||||
$(TARGET_CC) $(TARGET_CFLAGS) -c -o $(PKG_BUILD_DIR)/nvram/nvram_stub.o $(PKG_BUILD_DIR)/nvram/nvram_stub.c
|
|
||||||
|
|
||||||
# Compile wlc
|
|
||||||
$(MAKE) -C $(PKG_BUILD_DIR)/wlc \
|
|
||||||
$(TARGET_CONFIGURE_OPTS) \
|
|
||||||
CFLAGS="$(TARGET_CFLAGS)" \
|
|
||||||
all
|
|
||||||
|
|
||||||
# Compile libshared
|
|
||||||
$(MAKE) -C $(PKG_BUILD_DIR)/router/shared \
|
|
||||||
$(TARGET_CONFIGURE_OPTS) \
|
|
||||||
CFLAGS="$(TARGET_CFLAGS) -I. -I$(PKG_BUILD_DIR)/include -Dlinux=1" \
|
|
||||||
all
|
|
||||||
$(TARGET_CC) -o $(PKG_BUILD_DIR)/nas \
|
|
||||||
$(PKG_BUILD_DIR)/nas_exe.o \
|
|
||||||
$(PKG_BUILD_DIR)/nvram/nvram_stub.o \
|
|
||||||
$(TARGET_LDFLAGS) \
|
|
||||||
$(PKG_BUILD_DIR)/router/shared/libshared.a
|
|
||||||
$(TARGET_CC) -o $(PKG_BUILD_DIR)/wl $(PKG_BUILD_DIR)/wl_exe.o
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Build/InstallDev
|
|
||||||
$(INSTALL_DIR) $(1)/usr/lib
|
|
||||||
$(CP) $(PKG_BUILD_DIR)/router/shared/libshared.a $(1)/usr/lib/
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/wlc-old/install
|
|
||||||
$(CP) ./files/* $(1)/
|
|
||||||
$(INSTALL_DIR) $(1)/sbin
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/wlc/wlc $(1)/sbin/
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/wl-old/install
|
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/wl $(1)/usr/sbin/
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/nas-old/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-old))
|
|
||||||
$(eval $(call KernelPackage,brcm-wl-mimo-old))
|
|
||||||
$(eval $(call KernelPackage,wlcompat))
|
|
||||||
$(eval $(call KernelPackage,wlcompat-debug))
|
|
||||||
$(eval $(call BuildPackage,wlc-old))
|
|
||||||
$(eval $(call BuildPackage,wl-old))
|
|
||||||
$(eval $(call BuildPackage,nas-old))
|
|
|
@ -1,59 +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
|
|
||||||
|
|
||||||
setup_interface "$iface" "$network"
|
|
||||||
|
|
||||||
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
|
|
|
@ -1,372 +0,0 @@
|
||||||
append DRIVERS "broadcom"
|
|
||||||
|
|
||||||
scan_broadcom() {
|
|
||||||
local device="$1"
|
|
||||||
local wds
|
|
||||||
local adhoc sta apmode mon
|
|
||||||
local adhoc_if sta_if ap_if mon_if
|
|
||||||
local _c=0
|
|
||||||
|
|
||||||
config_get vifs "$device" vifs
|
|
||||||
for vif in $vifs; do
|
|
||||||
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
|
|
||||||
passive=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
|
|
||||||
passive=1
|
|
||||||
;;
|
|
||||||
::)
|
|
||||||
radio=0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
disable_broadcom() {
|
|
||||||
local device="$1"
|
|
||||||
set_wifi_down "$device"
|
|
||||||
wlc ifname "$device" down
|
|
||||||
(
|
|
||||||
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=0
|
|
||||||
|
|
||||||
_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*|*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*|*PSK*)
|
|
||||||
wsec_r=1
|
|
||||||
config_get key "$vif" key
|
|
||||||
case "$enc" in
|
|
||||||
wpa*+wpa2*|WPA*+WPA2*|*psk+*psk2|*PSK+*PSK2) auth=132; wsec=6;;
|
|
||||||
wpa2*|WPA2*|*PSK2|*psk2) auth=128; wsec=4;;
|
|
||||||
*aes|*AES) auth=4; wsec=4;;
|
|
||||||
*) auth=4; wsec=2;;
|
|
||||||
esac
|
|
||||||
eval "${vif}_key=\"\$key\""
|
|
||||||
nasopts="-k \"\$${vif}_key\""
|
|
||||||
;;
|
|
||||||
*wpa*|*WPA*)
|
|
||||||
wsec_r=1
|
|
||||||
eap_r=1
|
|
||||||
config_get key "$vif" key
|
|
||||||
config_get server "$vif" server
|
|
||||||
config_get port "$vif" port
|
|
||||||
case "$enc" in
|
|
||||||
wpa*+wpa2*|WPA*+WPA2*) auth=66; wsec=6;;
|
|
||||||
wpa2*|WPA2*) auth=64; wsec=4;;
|
|
||||||
*) auth=2; wsec=2;;
|
|
||||||
esac
|
|
||||||
eval "${vif}_key=\"\$key\""
|
|
||||||
nasopts="-r \"\$${vif}_key\" -h $server -p ${port:-1812}"
|
|
||||||
;;
|
|
||||||
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"
|
|
||||||
append vif_post_up "passive $passive" "$N"
|
|
||||||
}
|
|
||||||
|
|
||||||
[ "$mode" = "adhoc" ] && {
|
|
||||||
config_get bssid "$vif" bssid
|
|
||||||
[ -n "$bssid" ] && {
|
|
||||||
append vif_pre_up "des_bssid $bssid" "$N"
|
|
||||||
append vif_pre_up "allow_mode 1" "$N"
|
|
||||||
}
|
|
||||||
} || append vif_pre_up "allow_mode 0" "$N"
|
|
||||||
|
|
||||||
append vif_post_up "enabled 1" "$N"
|
|
||||||
|
|
||||||
config_get ifname "$vif" ifname
|
|
||||||
#append if_up "ifconfig $ifname up" ";$N"
|
|
||||||
|
|
||||||
local net_cfg bridge
|
|
||||||
net_cfg="$(find_net_config "$vif")"
|
|
||||||
[ -z "$net_cfg" ] || {
|
|
||||||
bridge="$(bridge_interface "$net_cfg")"
|
|
||||||
append if_up "set_wifi_up '$vif' '$ifname'" ";$N"
|
|
||||||
append if_up "start_net '$ifname' '$net_cfg' \$(wlc ifname '$ifname' bssid)" ";$N"
|
|
||||||
}
|
|
||||||
[ -z "$nasopts" ] || {
|
|
||||||
eval "${vif}_ssid=\"\$ssid\""
|
|
||||||
nas_mode="-A"
|
|
||||||
use_nas=1
|
|
||||||
[ "$mode" = "sta" ] && {
|
|
||||||
nas_mode="-S"
|
|
||||||
[ -z "$bridge" ] || {
|
|
||||||
append vif_post_up "supplicant 1" "$N"
|
|
||||||
append vif_post_up "passphrase $key" "$N"
|
|
||||||
|
|
||||||
use_nas=0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[ -z "$nas" -o "$use_nas" = "0" ] || {
|
|
||||||
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 ${bridge:+ -l $bridge} -i $ifname $nas_mode -m $auth -w $wsec -s \"\$${vif}_ssid\" -g 3600 $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:-0}
|
|
||||||
rxant ${rxantenna:-3}
|
|
||||||
txant ${txantenna:-3}
|
|
||||||
fragthresh ${frag:-2346}
|
|
||||||
rtsthresh ${rts:-2347}
|
|
||||||
monitor ${monitor:-0}
|
|
||||||
passive ${passive:-0}
|
|
||||||
|
|
||||||
radio ${radio:-1}
|
|
||||||
macfilter ${macfilter:-0}
|
|
||||||
maclist ${maclist:-none}
|
|
||||||
wds none
|
|
||||||
${wds:+wds $wds}
|
|
||||||
country ${country:-IL0}
|
|
||||||
${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 [ -f /proc/net/wl$((++i)) ]; do
|
|
||||||
config_get type wl${i} type
|
|
||||||
[ "$type" = broadcom ] && continue
|
|
||||||
cat <<EOF
|
|
||||||
config wifi-device wl${i}
|
|
||||||
option type broadcom
|
|
||||||
option channel 5
|
|
||||||
|
|
||||||
# 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
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
--- a/router/shared/linux_timer.c
|
|
||||||
+++ b/router/shared/linux_timer.c
|
|
||||||
@@ -94,6 +94,7 @@ typedef long uclock_t;
|
|
||||||
#define TFLAG_NONE 0
|
|
||||||
#define TFLAG_CANCELLED (1<<0)
|
|
||||||
#define TFLAG_DELETED (1<<1)
|
|
||||||
+#define TFLAG_QUEUED (1<<2)
|
|
||||||
|
|
||||||
struct event {
|
|
||||||
struct timeval it_interval;
|
|
||||||
@@ -207,6 +208,7 @@ int timer_create(
|
|
||||||
|
|
||||||
event_freelist = event->next;
|
|
||||||
event->next = NULL;
|
|
||||||
+ event->flags &= ~TFLAG_QUEUED;
|
|
||||||
|
|
||||||
check_event_queue();
|
|
||||||
|
|
||||||
@@ -387,6 +389,7 @@ int timer_settime
|
|
||||||
}
|
|
||||||
|
|
||||||
event->flags &= ~TFLAG_CANCELLED;
|
|
||||||
+ event->flags |= TFLAG_QUEUED;
|
|
||||||
|
|
||||||
unblock_timer();
|
|
||||||
|
|
||||||
@@ -502,7 +505,15 @@ static void alarm_handler(int i)
|
|
||||||
(*(event->func))((timer_t) event, (int)event->arg);
|
|
||||||
|
|
||||||
/* If the event has been cancelled, do NOT put it back on the queue. */
|
|
||||||
- if (!(event->flags & TFLAG_CANCELLED)) {
|
|
||||||
+ /* Check for TFLAG_QUEUED is to avoid pathologic case, when after
|
|
||||||
+ * dequeueing event handler deletes its own timer and allocates new one
|
|
||||||
+ * which (at least in some cases) gets the same pointer and thus its
|
|
||||||
+ * 'flags' will be rewritten, most notably TFLAG_CANCELLED, and, to
|
|
||||||
+ * complete the disaster, it will be queued. alarm_handler tries to
|
|
||||||
+ * enqueue 'event' (which is on the same memory position as newly
|
|
||||||
+ * allocated timer), which results in queueing the same pointer once
|
|
||||||
+ * more. And this way, loop in event queue is created. */
|
|
||||||
+ if ( !(event->flags & TFLAG_CANCELLED) && !(event->flags & TFLAG_QUEUED) ) {
|
|
||||||
|
|
||||||
/* if the event is a recurring event, reset the timer and
|
|
||||||
* find its correct place in the sorted list of events.
|
|
||||||
@@ -545,6 +556,7 @@ static void alarm_handler(int i)
|
|
||||||
/* link our new event into the pending event queue. */
|
|
||||||
event->next = *ppevent;
|
|
||||||
*ppevent = event;
|
|
||||||
+ event->flags |= TFLAG_QUEUED;
|
|
||||||
} else {
|
|
||||||
/* there is no interval, so recycle the event structure.
|
|
||||||
* timer_delete((timer_t) event);
|
|
|
@ -1,27 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the Broadcom wl driver
|
|
||||||
#
|
|
||||||
# Copyright 2004, Broadcom Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
# KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
# SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
# FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
#
|
|
||||||
|
|
||||||
EXTRA_CFLAGS += -I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER=1 -DBCMDMA64=1
|
|
||||||
|
|
||||||
O_TARGET := wl$(MOD_NAME).o
|
|
||||||
|
|
||||||
obj-y := wl_mod$(MOD_NAME).o
|
|
||||||
obj-y += bcmutils.o hnddma.o linux_osl.o
|
|
||||||
|
|
||||||
obj-m := $(O_TARGET)
|
|
||||||
|
|
||||||
wl_mod$(MOD_NAME).o: wl_apsta$(MOD_NAME).o
|
|
||||||
perl -ne 's,eth%d,wl%d\x00,g,print' < $< > $@
|
|
||||||
|
|
||||||
modules: wl$(MOD_NAME).o
|
|
||||||
|
|
||||||
include $(TOPDIR)/Rules.make
|
|
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* Fundamental constants relating to IP Protocol
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _bcmip_h_
|
|
||||||
#define _bcmip_h_
|
|
||||||
|
|
||||||
/* IPV4 and IPV6 common */
|
|
||||||
#define IP_VER_OFFSET 0x0 /* offset to version field */
|
|
||||||
#define IP_VER_MASK 0xf0 /* version mask */
|
|
||||||
#define IP_VER_SHIFT 4 /* version shift */
|
|
||||||
#define IP_VER_4 4 /* version number for IPV4 */
|
|
||||||
#define IP_VER_6 6 /* version number for IPV6 */
|
|
||||||
|
|
||||||
#define IP_VER(ip_body) \
|
|
||||||
((((uint8 *)(ip_body))[IP_VER_OFFSET] & IP_VER_MASK) >> IP_VER_SHIFT)
|
|
||||||
|
|
||||||
#define IP_PROT_ICMP 0x1 /* ICMP protocol */
|
|
||||||
#define IP_PROT_TCP 0x6 /* TCP protocol */
|
|
||||||
#define IP_PROT_UDP 0x11 /* UDP protocol type */
|
|
||||||
|
|
||||||
/* IPV4 field offsets */
|
|
||||||
#define IPV4_VER_HL_OFFSET 0 /* version and ihl byte offset */
|
|
||||||
#define IPV4_TOS_OFFSET 1 /* type of service offset */
|
|
||||||
#define IPV4_PROT_OFFSET 9 /* protocol type offset */
|
|
||||||
#define IPV4_CHKSUM_OFFSET 10 /* IP header checksum offset */
|
|
||||||
#define IPV4_SRC_IP_OFFSET 12 /* src IP addr offset */
|
|
||||||
#define IPV4_DEST_IP_OFFSET 16 /* dest IP addr offset */
|
|
||||||
|
|
||||||
/* IPV4 field decodes */
|
|
||||||
#define IPV4_VER_MASK 0xf0 /* IPV4 version mask */
|
|
||||||
#define IPV4_VER_SHIFT 4 /* IPV4 version shift */
|
|
||||||
|
|
||||||
#define IPV4_HLEN_MASK 0x0f /* IPV4 header length mask */
|
|
||||||
#define IPV4_HLEN(ipv4_body) (4 * (((uint8 *)(ipv4_body))[IPV4_VER_HL_OFFSET] & IPV4_HLEN_MASK))
|
|
||||||
|
|
||||||
#define IPV4_ADDR_LEN 4 /* IPV4 address length */
|
|
||||||
|
|
||||||
#define IPV4_ADDR_NULL(a) ((((uint8 *)(a))[0] | ((uint8 *)(a))[1] | \
|
|
||||||
((uint8 *)(a))[2] | ((uint8 *)(a))[3]) == 0)
|
|
||||||
|
|
||||||
#define IPV4_TOS_DSCP_MASK 0xfc /* DiffServ codepoint mask */
|
|
||||||
#define IPV4_TOS_DSCP_SHIFT 2 /* DiffServ codepoint shift */
|
|
||||||
|
|
||||||
#define IPV4_TOS(ipv4_body) (((uint8 *)(ipv4_body))[IPV4_TOS_OFFSET])
|
|
||||||
|
|
||||||
#define IPV4_TOS_PREC_MASK 0xe0 /* Historical precedence mask */
|
|
||||||
#define IPV4_TOS_PREC_SHIFT 5 /* Historical precedence shift */
|
|
||||||
|
|
||||||
#define IPV4_TOS_LOWDELAY 0x10 /* Lowest delay requested */
|
|
||||||
#define IPV4_TOS_THROUGHPUT 0x8 /* Best throughput requested */
|
|
||||||
#define IPV4_TOS_RELIABILITY 0x4 /* Most reliable delivery requested */
|
|
||||||
|
|
||||||
#define IPV4_PROT(ipv4_body) (((uint8 *)(ipv4_body))[IPV4_PROT_OFFSET])
|
|
||||||
|
|
||||||
#define IPV4_ADDR_STR_LEN 16 /* Max IP address length in string format */
|
|
||||||
|
|
||||||
/* IPV6 field offsets */
|
|
||||||
#define IPV6_PAYLOAD_LEN_OFFSET 4 /* payload length offset */
|
|
||||||
#define IPV6_NEXT_HDR_OFFSET 6 /* next header/protocol offset */
|
|
||||||
#define IPV6_HOP_LIMIT_OFFSET 7 /* hop limit offset */
|
|
||||||
#define IPV6_SRC_IP_OFFSET 8 /* src IP addr offset */
|
|
||||||
#define IPV6_DEST_IP_OFFSET 24 /* dst IP addr offset */
|
|
||||||
|
|
||||||
/* IPV6 field decodes */
|
|
||||||
#define IPV6_TRAFFIC_CLASS(ipv6_body) \
|
|
||||||
(((((uint8 *)(ipv6_body))[0] & 0x0f) << 4) | \
|
|
||||||
((((uint8 *)(ipv6_body))[1] & 0xf0) >> 4))
|
|
||||||
|
|
||||||
#define IPV6_FLOW_LABEL(ipv6_body) \
|
|
||||||
(((((uint8 *)(ipv6_body))[1] & 0x0f) << 16) | \
|
|
||||||
(((uint8 *)(ipv6_body))[2] << 8) | \
|
|
||||||
(((uint8 *)(ipv6_body))[3]))
|
|
||||||
|
|
||||||
#define IPV6_PAYLOAD_LEN(ipv6_body) \
|
|
||||||
((((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 0] << 8) | \
|
|
||||||
((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 1])
|
|
||||||
|
|
||||||
#define IPV6_NEXT_HDR(ipv6_body) \
|
|
||||||
(((uint8 *)(ipv6_body))[IPV6_NEXT_HDR_OFFSET])
|
|
||||||
|
|
||||||
#define IPV6_PROT(ipv6_body) IPV6_NEXT_HDR(ipv6_body)
|
|
||||||
|
|
||||||
#define IPV6_ADDR_LEN 16 /* IPV6 address length */
|
|
||||||
|
|
||||||
/* IPV4 TOS or IPV6 Traffic Classifier or 0 */
|
|
||||||
#define IP_TOS(ip_body) \
|
|
||||||
(IP_VER(ip_body) == IP_VER_4 ? IPV4_TOS(ip_body) : \
|
|
||||||
IP_VER(ip_body) == IP_VER_6 ? IPV6_TRAFFIC_CLASS(ip_body) : 0)
|
|
||||||
|
|
||||||
#endif /* _bcmip_h_ */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,581 +0,0 @@
|
||||||
/*
|
|
||||||
* Misc useful os-independent macros and functions.
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _bcmutils_h_
|
|
||||||
#define _bcmutils_h_
|
|
||||||
#include "linux_osl.h"
|
|
||||||
|
|
||||||
/* ctype replacement */
|
|
||||||
#define _BCM_U 0x01 /* upper */
|
|
||||||
#define _BCM_L 0x02 /* lower */
|
|
||||||
#define _BCM_D 0x04 /* digit */
|
|
||||||
#define _BCM_C 0x08 /* cntrl */
|
|
||||||
#define _BCM_P 0x10 /* punct */
|
|
||||||
#define _BCM_S 0x20 /* white space (space/lf/tab) */
|
|
||||||
#define _BCM_X 0x40 /* hex digit */
|
|
||||||
#define _BCM_SP 0x80 /* hard space (0x20) */
|
|
||||||
|
|
||||||
extern const unsigned char bcm_ctype[];
|
|
||||||
#define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)])
|
|
||||||
|
|
||||||
#define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)
|
|
||||||
#define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)
|
|
||||||
#define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0)
|
|
||||||
#define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0)
|
|
||||||
#define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)
|
|
||||||
#define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0)
|
|
||||||
#define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)
|
|
||||||
#define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0)
|
|
||||||
#define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0)
|
|
||||||
#define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0)
|
|
||||||
#define bcm_isxdigit(c) ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)
|
|
||||||
#define bcm_tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c))
|
|
||||||
#define bcm_toupper(c) (bcm_islower((c)) ? ((c) + 'A' - 'a') : (c))
|
|
||||||
|
|
||||||
/* Buffer structure for collecting string-formatted data
|
|
||||||
* using bcm_bprintf() API.
|
|
||||||
* Use bcm_binit() to initialize before use
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct bcmstrbuf {
|
|
||||||
char *buf; /* pointer to current position in origbuf */
|
|
||||||
unsigned int size; /* current (residual) size in bytes */
|
|
||||||
char *origbuf; /* unmodified pointer to orignal buffer */
|
|
||||||
unsigned int origsize; /* unmodified orignal buffer size in bytes */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ** driver-only section ** */
|
|
||||||
#include <osl.h>
|
|
||||||
|
|
||||||
#define GPIO_PIN_NOTDEFINED 0x20 /* Pin not defined */
|
|
||||||
|
|
||||||
|
|
||||||
/* osl multi-precedence packet queue */
|
|
||||||
#ifndef PKTQ_LEN_DEFAULT
|
|
||||||
#define PKTQ_LEN_DEFAULT 128 /* Max 128 packets */
|
|
||||||
#endif
|
|
||||||
#ifndef PKTQ_MAX_PREC
|
|
||||||
#define PKTQ_MAX_PREC 16 /* Maximum precedence levels */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct pktq_prec {
|
|
||||||
void *head; /* first packet to dequeue */
|
|
||||||
void *tail; /* last packet to dequeue */
|
|
||||||
uint16 len; /* number of queued packets */
|
|
||||||
uint16 max; /* maximum number of queued packets */
|
|
||||||
} pktq_prec_t;
|
|
||||||
|
|
||||||
|
|
||||||
/* multi-priority pkt queue */
|
|
||||||
struct pktq {
|
|
||||||
uint16 num_prec; /* number of precedences in use */
|
|
||||||
uint16 hi_prec; /* rapid dequeue hint (>= highest non-empty prec) */
|
|
||||||
uint16 max; /* total max packets */
|
|
||||||
uint16 len; /* total number of packets */
|
|
||||||
/* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */
|
|
||||||
struct pktq_prec q[PKTQ_MAX_PREC];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* simple, non-priority pkt queue */
|
|
||||||
struct spktq {
|
|
||||||
uint16 num_prec; /* number of precedences in use (always 1) */
|
|
||||||
uint16 hi_prec; /* rapid dequeue hint (>= highest non-empty prec) */
|
|
||||||
uint16 max; /* total max packets */
|
|
||||||
uint16 len; /* total number of packets */
|
|
||||||
/* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */
|
|
||||||
struct pktq_prec q[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
#define PKTQ_PREC_ITER(pq, prec) for (prec = (pq)->num_prec - 1; prec >= 0; prec--)
|
|
||||||
|
|
||||||
/* forward definition of ether_addr structure used by some function prototypes */
|
|
||||||
struct ether_addr;
|
|
||||||
|
|
||||||
/* operations on a specific precedence in packet queue */
|
|
||||||
|
|
||||||
#define pktq_psetmax(pq, prec, _max) ((pq)->q[prec].max = (_max))
|
|
||||||
#define pktq_plen(pq, prec) ((pq)->q[prec].len)
|
|
||||||
#define pktq_pavail(pq, prec) ((pq)->q[prec].max - (pq)->q[prec].len)
|
|
||||||
#define pktq_pfull(pq, prec) ((pq)->q[prec].len >= (pq)->q[prec].max)
|
|
||||||
#define pktq_pempty(pq, prec) ((pq)->q[prec].len == 0)
|
|
||||||
|
|
||||||
#define pktq_ppeek(pq, prec) ((pq)->q[prec].head)
|
|
||||||
#define pktq_ppeek_tail(pq, prec) ((pq)->q[prec].tail)
|
|
||||||
|
|
||||||
extern void *pktq_penq(struct pktq *pq, int prec, void *p);
|
|
||||||
extern void *pktq_penq_head(struct pktq *pq, int prec, void *p);
|
|
||||||
extern void *pktq_pdeq(struct pktq *pq, int prec);
|
|
||||||
extern void *pktq_pdeq_tail(struct pktq *pq, int prec);
|
|
||||||
/* Empty the queue at particular precedence level */
|
|
||||||
extern void pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir);
|
|
||||||
/* Remove a specified packet from its queue */
|
|
||||||
extern bool pktq_pdel(struct pktq *pq, void *p, int prec);
|
|
||||||
|
|
||||||
/* operations on a set of precedences in packet queue */
|
|
||||||
|
|
||||||
extern int pktq_mlen(struct pktq *pq, uint prec_bmp);
|
|
||||||
extern void *pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out);
|
|
||||||
|
|
||||||
/* operations on packet queue as a whole */
|
|
||||||
|
|
||||||
#define pktq_len(pq) ((int)(pq)->len)
|
|
||||||
#define pktq_max(pq) ((int)(pq)->max)
|
|
||||||
#define pktq_avail(pq) ((int)((pq)->max - (pq)->len))
|
|
||||||
#define pktq_full(pq) ((pq)->len >= (pq)->max)
|
|
||||||
#define pktq_empty(pq) ((pq)->len == 0)
|
|
||||||
|
|
||||||
/* operations for single precedence queues */
|
|
||||||
#define pktenq(pq, p) pktq_penq(((struct pktq *)pq), 0, (p))
|
|
||||||
#define pktenq_head(pq, p) pktq_penq_head(((struct pktq *)pq), 0, (p))
|
|
||||||
#define pktdeq(pq) pktq_pdeq(((struct pktq *)pq), 0)
|
|
||||||
#define pktdeq_tail(pq) pktq_pdeq_tail(((struct pktq *)pq), 0)
|
|
||||||
#define pktqinit(pq, len) pktq_init(((struct pktq *)pq), 1, len)
|
|
||||||
|
|
||||||
extern void pktq_init(struct pktq *pq, int num_prec, int max_len);
|
|
||||||
/* prec_out may be NULL if caller is not interested in return value */
|
|
||||||
extern void *pktq_deq(struct pktq *pq, int *prec_out);
|
|
||||||
extern void *pktq_deq_tail(struct pktq *pq, int *prec_out);
|
|
||||||
extern void *pktq_peek(struct pktq *pq, int *prec_out);
|
|
||||||
extern void *pktq_peek_tail(struct pktq *pq, int *prec_out);
|
|
||||||
extern void pktq_flush(osl_t *osh, struct pktq *pq, bool dir); /* Empty the entire queue */
|
|
||||||
extern int pktq_setmax(struct pktq *pq, int max_len);
|
|
||||||
|
|
||||||
/* externs */
|
|
||||||
/* packet */
|
|
||||||
extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf);
|
|
||||||
extern uint pkttotlen(osl_t *osh, void *p);
|
|
||||||
extern void *pktlast(osl_t *osh, void *p);
|
|
||||||
|
|
||||||
/* Get priority from a packet and pass it back in scb (or equiv) */
|
|
||||||
extern uint pktsetprio(void *pkt, bool update_vtag);
|
|
||||||
#define PKTPRIO_VDSCP 0x100 /* DSCP prio found after VLAN tag */
|
|
||||||
#define PKTPRIO_VLAN 0x200 /* VLAN prio found */
|
|
||||||
#define PKTPRIO_UPD 0x400 /* DSCP used to update VLAN prio */
|
|
||||||
#define PKTPRIO_DSCP 0x800 /* DSCP prio found */
|
|
||||||
|
|
||||||
/* string */
|
|
||||||
extern int BCMROMFN(bcm_atoi)(char *s);
|
|
||||||
extern ulong BCMROMFN(bcm_strtoul)(char *cp, char **endp, uint base);
|
|
||||||
extern char *BCMROMFN(bcmstrstr)(char *haystack, char *needle);
|
|
||||||
extern char *BCMROMFN(bcmstrcat)(char *dest, const char *src);
|
|
||||||
extern char *BCMROMFN(bcmstrncat)(char *dest, const char *src, uint size);
|
|
||||||
extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen);
|
|
||||||
/* ethernet address */
|
|
||||||
extern char *bcm_ether_ntoa(struct ether_addr *ea, char *buf);
|
|
||||||
extern int BCMROMFN(bcm_ether_atoe)(char *p, struct ether_addr *ea);
|
|
||||||
|
|
||||||
/* ip address */
|
|
||||||
struct ipv4_addr;
|
|
||||||
extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf);
|
|
||||||
|
|
||||||
/* delay */
|
|
||||||
extern void bcm_mdelay(uint ms);
|
|
||||||
/* variable access */
|
|
||||||
extern char *getvar(char *vars, const char *name);
|
|
||||||
extern int getintvar(char *vars, const char *name);
|
|
||||||
extern uint getgpiopin(char *vars, char *pin_name, uint def_pin);
|
|
||||||
#ifdef BCMDBG
|
|
||||||
extern void prpkt(const char *msg, osl_t *osh, void *p0);
|
|
||||||
#endif /* BCMDBG */
|
|
||||||
#ifdef BCMPERFSTATS
|
|
||||||
extern void bcm_perf_enable(void);
|
|
||||||
extern void bcmstats(char *fmt);
|
|
||||||
extern void bcmlog(char *fmt, uint a1, uint a2);
|
|
||||||
extern void bcmdumplog(char *buf, int size);
|
|
||||||
extern int bcmdumplogent(char *buf, uint idx);
|
|
||||||
#else
|
|
||||||
#define bcm_perf_enable()
|
|
||||||
#define bcmstats(fmt)
|
|
||||||
#define bcmlog(fmt, a1, a2)
|
|
||||||
#define bcmdumplog(buf, size) *buf = '\0'
|
|
||||||
#define bcmdumplogent(buf, idx) -1
|
|
||||||
#endif /* BCMPERFSTATS */
|
|
||||||
extern char *bcm_nvram_vars(uint *length);
|
|
||||||
extern int bcm_nvram_cache(void *sbh);
|
|
||||||
|
|
||||||
/* Support for sharing code across in-driver iovar implementations.
|
|
||||||
* The intent is that a driver use this structure to map iovar names
|
|
||||||
* to its (private) iovar identifiers, and the lookup function to
|
|
||||||
* find the entry. Macros are provided to map ids and get/set actions
|
|
||||||
* into a single number space for a switch statement.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* iovar structure */
|
|
||||||
typedef struct bcm_iovar {
|
|
||||||
const char *name; /* name for lookup and display */
|
|
||||||
uint16 varid; /* id for switch */
|
|
||||||
uint16 flags; /* driver-specific flag bits */
|
|
||||||
uint16 type; /* base type of argument */
|
|
||||||
uint16 minlen; /* min length for buffer vars */
|
|
||||||
} bcm_iovar_t;
|
|
||||||
|
|
||||||
/* varid definitions are per-driver, may use these get/set bits */
|
|
||||||
|
|
||||||
/* IOVar action bits for id mapping */
|
|
||||||
#define IOV_GET 0 /* Get an iovar */
|
|
||||||
#define IOV_SET 1 /* Set an iovar */
|
|
||||||
|
|
||||||
/* Varid to actionid mapping */
|
|
||||||
#define IOV_GVAL(id) ((id)*2)
|
|
||||||
#define IOV_SVAL(id) (((id)*2)+IOV_SET)
|
|
||||||
#define IOV_ISSET(actionid) ((actionid & IOV_SET) == IOV_SET)
|
|
||||||
|
|
||||||
/* flags are per-driver based on driver attributes */
|
|
||||||
|
|
||||||
extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name);
|
|
||||||
extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set);
|
|
||||||
|
|
||||||
/* Base type definitions */
|
|
||||||
#define IOVT_VOID 0 /* no value (implictly set only) */
|
|
||||||
#define IOVT_BOOL 1 /* any value ok (zero/nonzero) */
|
|
||||||
#define IOVT_INT8 2 /* integer values are range-checked */
|
|
||||||
#define IOVT_UINT8 3 /* unsigned int 8 bits */
|
|
||||||
#define IOVT_INT16 4 /* int 16 bits */
|
|
||||||
#define IOVT_UINT16 5 /* unsigned int 16 bits */
|
|
||||||
#define IOVT_INT32 6 /* int 32 bits */
|
|
||||||
#define IOVT_UINT32 7 /* unsigned int 32 bits */
|
|
||||||
#define IOVT_BUFFER 8 /* buffer is size-checked as per minlen */
|
|
||||||
#define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER)
|
|
||||||
|
|
||||||
/* Initializer for IOV type strings */
|
|
||||||
#define BCM_IOV_TYPE_INIT { \
|
|
||||||
"void", \
|
|
||||||
"bool", \
|
|
||||||
"int8", \
|
|
||||||
"uint8", \
|
|
||||||
"int16", \
|
|
||||||
"uint16", \
|
|
||||||
"int32", \
|
|
||||||
"uint32", \
|
|
||||||
"buffer", \
|
|
||||||
"" }
|
|
||||||
|
|
||||||
#define BCM_IOVT_IS_INT(type) (\
|
|
||||||
(type == IOVT_BOOL) || \
|
|
||||||
(type == IOVT_INT8) || \
|
|
||||||
(type == IOVT_UINT8) || \
|
|
||||||
(type == IOVT_INT16) || \
|
|
||||||
(type == IOVT_UINT16) || \
|
|
||||||
(type == IOVT_INT32) || \
|
|
||||||
(type == IOVT_UINT32))
|
|
||||||
|
|
||||||
/* ** driver/apps-shared section ** */
|
|
||||||
|
|
||||||
#define BCME_STRLEN 64 /* Max string length for BCM errors */
|
|
||||||
#define VALID_BCMERROR(e) ((e <= 0) && (e >= BCME_LAST))
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* error codes could be added but the defined ones shouldn't be changed/deleted
|
|
||||||
* these error codes are exposed to the user code
|
|
||||||
* when ever a new error code is added to this list
|
|
||||||
* please update errorstring table with the related error string and
|
|
||||||
* update osl files with os specific errorcode map
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BCME_OK 0 /* Success */
|
|
||||||
#define BCME_ERROR -1 /* Error generic */
|
|
||||||
#define BCME_BADARG -2 /* Bad Argument */
|
|
||||||
#define BCME_BADOPTION -3 /* Bad option */
|
|
||||||
#define BCME_NOTUP -4 /* Not up */
|
|
||||||
#define BCME_NOTDOWN -5 /* Not down */
|
|
||||||
#define BCME_NOTAP -6 /* Not AP */
|
|
||||||
#define BCME_NOTSTA -7 /* Not STA */
|
|
||||||
#define BCME_BADKEYIDX -8 /* BAD Key Index */
|
|
||||||
#define BCME_RADIOOFF -9 /* Radio Off */
|
|
||||||
#define BCME_NOTBANDLOCKED -10 /* Not band locked */
|
|
||||||
#define BCME_NOCLK -11 /* No Clock */
|
|
||||||
#define BCME_BADRATESET -12 /* BAD Rate valueset */
|
|
||||||
#define BCME_BADBAND -13 /* BAD Band */
|
|
||||||
#define BCME_BUFTOOSHORT -14 /* Buffer too short */
|
|
||||||
#define BCME_BUFTOOLONG -15 /* Buffer too long */
|
|
||||||
#define BCME_BUSY -16 /* Busy */
|
|
||||||
#define BCME_NOTASSOCIATED -17 /* Not Associated */
|
|
||||||
#define BCME_BADSSIDLEN -18 /* Bad SSID len */
|
|
||||||
#define BCME_OUTOFRANGECHAN -19 /* Out of Range Channel */
|
|
||||||
#define BCME_BADCHAN -20 /* Bad Channel */
|
|
||||||
#define BCME_BADADDR -21 /* Bad Address */
|
|
||||||
#define BCME_NORESOURCE -22 /* Not Enough Resources */
|
|
||||||
#define BCME_UNSUPPORTED -23 /* Unsupported */
|
|
||||||
#define BCME_BADLEN -24 /* Bad length */
|
|
||||||
#define BCME_NOTREADY -25 /* Not Ready */
|
|
||||||
#define BCME_EPERM -26 /* Not Permitted */
|
|
||||||
#define BCME_NOMEM -27 /* No Memory */
|
|
||||||
#define BCME_ASSOCIATED -28 /* Associated */
|
|
||||||
#define BCME_RANGE -29 /* Not In Range */
|
|
||||||
#define BCME_NOTFOUND -30 /* Not Found */
|
|
||||||
#define BCME_WME_NOT_ENABLED -31 /* WME Not Enabled */
|
|
||||||
#define BCME_TSPEC_NOTFOUND -32 /* TSPEC Not Found */
|
|
||||||
#define BCME_ACM_NOTSUPPORTED -33 /* ACM Not Supported */
|
|
||||||
#define BCME_NOT_WME_ASSOCIATION -34 /* Not WME Association */
|
|
||||||
#define BCME_SDIO_ERROR -35 /* SDIO Bus Error */
|
|
||||||
#define BCME_DONGLE_DOWN -36 /* Dongle Not Accessible */
|
|
||||||
#define BCME_VERSION -37 /* Incorrect version */
|
|
||||||
#define BCME_LAST BCME_VERSION
|
|
||||||
|
|
||||||
/* These are collection of BCME Error strings */
|
|
||||||
#define BCMERRSTRINGTABLE { \
|
|
||||||
"OK", \
|
|
||||||
"Undefined error", \
|
|
||||||
"Bad Argument", \
|
|
||||||
"Bad Option", \
|
|
||||||
"Not up", \
|
|
||||||
"Not down", \
|
|
||||||
"Not AP", \
|
|
||||||
"Not STA", \
|
|
||||||
"Bad Key Index", \
|
|
||||||
"Radio Off", \
|
|
||||||
"Not band locked", \
|
|
||||||
"No clock", \
|
|
||||||
"Bad Rate valueset", \
|
|
||||||
"Bad Band", \
|
|
||||||
"Buffer too short", \
|
|
||||||
"Buffer too long", \
|
|
||||||
"Busy", \
|
|
||||||
"Not Associated", \
|
|
||||||
"Bad SSID len", \
|
|
||||||
"Out of Range Channel", \
|
|
||||||
"Bad Channel", \
|
|
||||||
"Bad Address", \
|
|
||||||
"Not Enough Resources", \
|
|
||||||
"Unsupported", \
|
|
||||||
"Bad length", \
|
|
||||||
"Not Ready", \
|
|
||||||
"Not Permitted", \
|
|
||||||
"No Memory", \
|
|
||||||
"Associated", \
|
|
||||||
"Not In Range", \
|
|
||||||
"Not Found", \
|
|
||||||
"WME Not Enabled", \
|
|
||||||
"TSPEC Not Found", \
|
|
||||||
"ACM Not Supported", \
|
|
||||||
"Not WME Association", \
|
|
||||||
"SDIO Bus Error", \
|
|
||||||
"Dongle Not Accessible", \
|
|
||||||
"Incorrect version" \
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef ABS
|
|
||||||
#define ABS(a) (((a) < 0)?-(a):(a))
|
|
||||||
#endif /* ABS */
|
|
||||||
|
|
||||||
#ifndef MIN
|
|
||||||
#define MIN(a, b) (((a) < (b))?(a):(b))
|
|
||||||
#endif /* MIN */
|
|
||||||
|
|
||||||
#ifndef MAX
|
|
||||||
#define MAX(a, b) (((a) > (b))?(a):(b))
|
|
||||||
#endif /* MAX */
|
|
||||||
|
|
||||||
#define CEIL(x, y) (((x) + ((y)-1)) / (y))
|
|
||||||
#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
|
|
||||||
#define ISALIGNED(a, x) (((a) & ((x)-1)) == 0)
|
|
||||||
#define ISPOWEROF2(x) ((((x)-1)&(x)) == 0)
|
|
||||||
#define VALID_MASK(mask) !((mask) & ((mask) + 1))
|
|
||||||
#ifndef OFFSETOF
|
|
||||||
#define OFFSETOF(type, member) ((uint)(uintptr)&((type *)0)->member)
|
|
||||||
#endif /* OFFSETOF */
|
|
||||||
#ifndef ARRAYSIZE
|
|
||||||
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* bit map related macros */
|
|
||||||
#ifndef setbit
|
|
||||||
#ifndef NBBY /* the BSD family defines NBBY */
|
|
||||||
#define NBBY 8 /* 8 bits per byte */
|
|
||||||
#endif /* #ifndef NBBY */
|
|
||||||
#define setbit(a, i) (((uint8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY))
|
|
||||||
#define clrbit(a, i) (((uint8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
|
|
||||||
#define isset(a, i) (((const uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY)))
|
|
||||||
#define isclr(a, i) ((((const uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
|
|
||||||
#endif /* setbit */
|
|
||||||
|
|
||||||
#define NBITS(type) (sizeof(type) * 8)
|
|
||||||
#define NBITVAL(nbits) (1 << (nbits))
|
|
||||||
#define MAXBITVAL(nbits) ((1 << (nbits)) - 1)
|
|
||||||
#define NBITMASK(nbits) MAXBITVAL(nbits)
|
|
||||||
#define MAXNBVAL(nbyte) MAXBITVAL((nbyte) * 8)
|
|
||||||
|
|
||||||
/* basic mux operation - can be optimized on several architectures */
|
|
||||||
#define MUX(pred, true, false) ((pred) ? (true) : (false))
|
|
||||||
|
|
||||||
/* modulo inc/dec - assumes x E [0, bound - 1] */
|
|
||||||
#define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1)
|
|
||||||
#define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1)
|
|
||||||
|
|
||||||
/* modulo inc/dec, bound = 2^k */
|
|
||||||
#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))
|
|
||||||
#define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1))
|
|
||||||
|
|
||||||
/* modulo add/sub - assumes x, y E [0, bound - 1] */
|
|
||||||
#define MODADD(x, y, bound) \
|
|
||||||
MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y))
|
|
||||||
#define MODSUB(x, y, bound) \
|
|
||||||
MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y))
|
|
||||||
|
|
||||||
/* module add/sub, bound = 2^k */
|
|
||||||
#define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1))
|
|
||||||
#define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1))
|
|
||||||
|
|
||||||
/* crc defines */
|
|
||||||
#define CRC8_INIT_VALUE 0xff /* Initial CRC8 checksum value */
|
|
||||||
#define CRC8_GOOD_VALUE 0x9f /* Good final CRC8 checksum value */
|
|
||||||
#define CRC16_INIT_VALUE 0xffff /* Initial CRC16 checksum value */
|
|
||||||
#define CRC16_GOOD_VALUE 0xf0b8 /* Good final CRC16 checksum value */
|
|
||||||
#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */
|
|
||||||
#define CRC32_GOOD_VALUE 0xdebb20e3 /* Good final CRC32 checksum value */
|
|
||||||
|
|
||||||
/* bcm_format_flags() bit description structure */
|
|
||||||
typedef struct bcm_bit_desc {
|
|
||||||
uint32 bit;
|
|
||||||
const char* name;
|
|
||||||
} bcm_bit_desc_t;
|
|
||||||
|
|
||||||
/* tag_ID/length/value_buffer tuple */
|
|
||||||
typedef struct bcm_tlv {
|
|
||||||
uint8 id;
|
|
||||||
uint8 len;
|
|
||||||
uint8 data[1];
|
|
||||||
} bcm_tlv_t;
|
|
||||||
|
|
||||||
/* Check that bcm_tlv_t fits into the given buflen */
|
|
||||||
#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
|
|
||||||
|
|
||||||
/* buffer length for ethernet address from bcm_ether_ntoa() */
|
|
||||||
#define ETHER_ADDR_STR_LEN 18 /* 18-bytes of Ethernet address buffer length */
|
|
||||||
|
|
||||||
/* unaligned load and store macros */
|
|
||||||
#ifdef IL_BIGENDIAN
|
|
||||||
static INLINE uint32
|
|
||||||
load32_ua(uint8 *a)
|
|
||||||
{
|
|
||||||
return ((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE void
|
|
||||||
store32_ua(uint8 *a, uint32 v)
|
|
||||||
{
|
|
||||||
a[0] = (v >> 24) & 0xff;
|
|
||||||
a[1] = (v >> 16) & 0xff;
|
|
||||||
a[2] = (v >> 8) & 0xff;
|
|
||||||
a[3] = v & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE uint16
|
|
||||||
load16_ua(uint8 *a)
|
|
||||||
{
|
|
||||||
return ((a[0] << 8) | a[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE void
|
|
||||||
store16_ua(uint8 *a, uint16 v)
|
|
||||||
{
|
|
||||||
a[0] = (v >> 8) & 0xff;
|
|
||||||
a[1] = v & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* IL_BIGENDIAN */
|
|
||||||
|
|
||||||
static INLINE uint32
|
|
||||||
load32_ua(uint8 *a)
|
|
||||||
{
|
|
||||||
return ((a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE void
|
|
||||||
store32_ua(uint8 *a, uint32 v)
|
|
||||||
{
|
|
||||||
a[3] = (v >> 24) & 0xff;
|
|
||||||
a[2] = (v >> 16) & 0xff;
|
|
||||||
a[1] = (v >> 8) & 0xff;
|
|
||||||
a[0] = v & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE uint16
|
|
||||||
load16_ua(uint8 *a)
|
|
||||||
{
|
|
||||||
return ((a[1] << 8) | a[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE void
|
|
||||||
store16_ua(uint8 *a, uint16 v)
|
|
||||||
{
|
|
||||||
a[1] = (v >> 8) & 0xff;
|
|
||||||
a[0] = v & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* IL_BIGENDIAN */
|
|
||||||
|
|
||||||
/* externs */
|
|
||||||
/* crc */
|
|
||||||
extern uint8 BCMROMFN(hndcrc8)(uint8 *p, uint nbytes, uint8 crc);
|
|
||||||
extern uint16 BCMROMFN(hndcrc16)(uint8 *p, uint nbytes, uint16 crc);
|
|
||||||
extern uint32 BCMROMFN(hndcrc32)(uint8 *p, uint nbytes, uint32 crc);
|
|
||||||
/* format/print */
|
|
||||||
#ifdef BCMDBG
|
|
||||||
extern int bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len);
|
|
||||||
extern int bcm_format_hex(char *str, const void *bytes, int len);
|
|
||||||
extern void deadbeef(void *p, uint len);
|
|
||||||
extern void prhex(const char *msg, uchar *buf, uint len);
|
|
||||||
#endif /* BCMDBG */
|
|
||||||
extern char *bcm_brev_str(uint16 brev, char *buf);
|
|
||||||
extern void printfbig(char *buf);
|
|
||||||
|
|
||||||
/* IE parsing */
|
|
||||||
extern bcm_tlv_t *BCMROMFN(bcm_next_tlv)(bcm_tlv_t *elt, int *buflen);
|
|
||||||
extern bcm_tlv_t *BCMROMFN(bcm_parse_tlvs)(void *buf, int buflen, uint key);
|
|
||||||
extern bcm_tlv_t *BCMROMFN(bcm_parse_ordered_tlvs)(void *buf, int buflen, uint key);
|
|
||||||
|
|
||||||
/* bcmerror */
|
|
||||||
extern const char *bcmerrorstr(int bcmerror);
|
|
||||||
|
|
||||||
/* multi-bool data type: set of bools, mbool is true if any is set */
|
|
||||||
typedef uint32 mbool;
|
|
||||||
#define mboolset(mb, bit) ((mb) |= (bit)) /* set one bool */
|
|
||||||
#define mboolclr(mb, bit) ((mb) &= ~(bit)) /* clear one bool */
|
|
||||||
#define mboolisset(mb, bit) (((mb) & (bit)) != 0) /* TRUE if one bool is set */
|
|
||||||
#define mboolmaskset(mb, mask, val) ((mb) = (((mb) & ~(mask)) | (val)))
|
|
||||||
|
|
||||||
/* power conversion */
|
|
||||||
extern uint16 BCMROMFN(bcm_qdbm_to_mw)(uint8 qdbm);
|
|
||||||
extern uint8 BCMROMFN(bcm_mw_to_qdbm)(uint16 mw);
|
|
||||||
|
|
||||||
/* generic datastruct to help dump routines */
|
|
||||||
struct fielddesc {
|
|
||||||
const char *nameandfmt;
|
|
||||||
uint32 offset;
|
|
||||||
uint32 len;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size);
|
|
||||||
extern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...);
|
|
||||||
|
|
||||||
typedef uint32 (*readreg_rtn)(void *arg0, void *arg1, uint32 offset);
|
|
||||||
extern uint bcmdumpfields(readreg_rtn func_ptr, void *arg0, void *arg1, struct fielddesc *str,
|
|
||||||
char *buf, uint32 bufsize);
|
|
||||||
|
|
||||||
extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len);
|
|
||||||
extern uint BCMROMFN(bcm_bitcount)(uint8 *bitmap, uint bytelength);
|
|
||||||
|
|
||||||
#ifdef BCMDBG_PKT /* pkt logging for debugging */
|
|
||||||
#define PKTLIST_SIZE 1000
|
|
||||||
typedef struct {
|
|
||||||
void *list[PKTLIST_SIZE]; /* List of pointers to packets */
|
|
||||||
uint count; /* Total count of the packets */
|
|
||||||
} pktlist_info_t;
|
|
||||||
|
|
||||||
extern void pktlist_add(pktlist_info_t *pktlist, void *p);
|
|
||||||
extern void pktlist_remove(pktlist_info_t *pktlist, void *p);
|
|
||||||
extern char* pktlist_dump(pktlist_info_t *pktlist, char *buf);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
|
|
||||||
#endif /* _bcmutils_h_ */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,159 +0,0 @@
|
||||||
/*
|
|
||||||
* Generic Broadcom Home Networking Division (HND) DMA engine SW interface
|
|
||||||
* This supports the following chips: BCM42xx, 44xx, 47xx .
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _hnddma_h_
|
|
||||||
#define _hnddma_h_
|
|
||||||
|
|
||||||
typedef const struct hnddma_pub hnddma_t;
|
|
||||||
|
|
||||||
/* dma function type */
|
|
||||||
typedef void (*di_detach_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_txreset_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_rxreset_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_rxidle_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_txinit_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_txenabled_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_rxinit_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_txsuspend_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_txresume_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_txsuspended_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_txsuspendedidle_t)(hnddma_t *dmah);
|
|
||||||
typedef int (*di_txfast_t)(hnddma_t *dmah, void *p, bool commit);
|
|
||||||
typedef void (*di_fifoloopbackenable_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_txstopped_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_rxstopped_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_rxenable_t)(hnddma_t *dmah);
|
|
||||||
typedef bool (*di_rxenabled_t)(hnddma_t *dmah);
|
|
||||||
typedef void* (*di_rx_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_rxfill_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_txreclaim_t)(hnddma_t *dmah, bool forceall);
|
|
||||||
typedef void (*di_rxreclaim_t)(hnddma_t *dmah);
|
|
||||||
typedef uintptr (*di_getvar_t)(hnddma_t *dmah, const char *name);
|
|
||||||
typedef void* (*di_getnexttxp_t)(hnddma_t *dmah, bool forceall);
|
|
||||||
typedef void* (*di_getnextrxp_t)(hnddma_t *dmah, bool forceall);
|
|
||||||
typedef void* (*di_peeknexttxp_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_txblock_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_txunblock_t)(hnddma_t *dmah);
|
|
||||||
typedef uint (*di_txactive_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_txrotate_t)(hnddma_t *dmah);
|
|
||||||
typedef void (*di_counterreset_t)(hnddma_t *dmah);
|
|
||||||
typedef char* (*di_dump_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring);
|
|
||||||
typedef char* (*di_dumptx_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring);
|
|
||||||
typedef char* (*di_dumprx_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring);
|
|
||||||
|
|
||||||
/* dma opsvec */
|
|
||||||
typedef struct di_fcn_s {
|
|
||||||
di_detach_t detach;
|
|
||||||
di_txinit_t txinit;
|
|
||||||
di_txreset_t txreset;
|
|
||||||
di_txenabled_t txenabled;
|
|
||||||
di_txsuspend_t txsuspend;
|
|
||||||
di_txresume_t txresume;
|
|
||||||
di_txsuspended_t txsuspended;
|
|
||||||
di_txsuspendedidle_t txsuspendedidle;
|
|
||||||
di_txfast_t txfast;
|
|
||||||
di_txstopped_t txstopped;
|
|
||||||
di_txreclaim_t txreclaim;
|
|
||||||
di_getnexttxp_t getnexttxp;
|
|
||||||
di_peeknexttxp_t peeknexttxp;
|
|
||||||
di_txblock_t txblock;
|
|
||||||
di_txunblock_t txunblock;
|
|
||||||
di_txactive_t txactive;
|
|
||||||
di_txrotate_t txrotate;
|
|
||||||
|
|
||||||
di_rxinit_t rxinit;
|
|
||||||
di_rxreset_t rxreset;
|
|
||||||
di_rxidle_t rxidle;
|
|
||||||
di_rxstopped_t rxstopped;
|
|
||||||
di_rxenable_t rxenable;
|
|
||||||
di_rxenabled_t rxenabled;
|
|
||||||
di_rx_t rx;
|
|
||||||
di_rxfill_t rxfill;
|
|
||||||
di_rxreclaim_t rxreclaim;
|
|
||||||
di_getnextrxp_t getnextrxp;
|
|
||||||
|
|
||||||
di_fifoloopbackenable_t fifoloopbackenable;
|
|
||||||
di_getvar_t d_getvar;
|
|
||||||
di_counterreset_t counterreset;
|
|
||||||
di_dump_t dump;
|
|
||||||
di_dumptx_t dumptx;
|
|
||||||
di_dumprx_t dumprx;
|
|
||||||
uint endnum;
|
|
||||||
} di_fcn_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Exported data structure (read-only)
|
|
||||||
*/
|
|
||||||
/* export structure */
|
|
||||||
struct hnddma_pub {
|
|
||||||
di_fcn_t di_fn; /* DMA function pointers */
|
|
||||||
uint txavail; /* # free tx descriptors */
|
|
||||||
|
|
||||||
/* rx error counters */
|
|
||||||
uint rxgiants; /* rx giant frames */
|
|
||||||
uint rxnobuf; /* rx out of dma descriptors */
|
|
||||||
/* tx error counters */
|
|
||||||
uint txnobuf; /* tx out of dma descriptors */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
extern hnddma_t * dma_attach(osl_t *osh, char *name, sb_t *sbh, void *dmaregstx, void *dmaregsrx,
|
|
||||||
uint ntxd, uint nrxd, uint rxbufsize, uint nrxpost, uint rxoffset,
|
|
||||||
uint *msg_level);
|
|
||||||
#define dma_detach(di) ((di)->di_fn.detach(di))
|
|
||||||
#define dma_txreset(di) ((di)->di_fn.txreset(di))
|
|
||||||
#define dma_rxreset(di) ((di)->di_fn.rxreset(di))
|
|
||||||
#define dma_rxidle(di) ((di)->di_fn.rxidle(di))
|
|
||||||
#define dma_txinit(di) ((di)->di_fn.txinit(di))
|
|
||||||
#define dma_txenabled(di) ((di)->di_fn.txenabled(di))
|
|
||||||
#define dma_rxinit(di) ((di)->di_fn.rxinit(di))
|
|
||||||
#define dma_txsuspend(di) ((di)->di_fn.txsuspend(di))
|
|
||||||
#define dma_txresume(di) ((di)->di_fn.txresume(di))
|
|
||||||
#define dma_txsuspended(di) ((di)->di_fn.txsuspended(di))
|
|
||||||
#define dma_txsuspendedidle(di) ((di)->di_fn.txsuspendedidle(di))
|
|
||||||
#define dma_txfast(di, p, commit) ((di)->di_fn.txfast(di, p, commit))
|
|
||||||
#define dma_fifoloopbackenable(di) ((di)->di_fn.fifoloopbackenable(di))
|
|
||||||
#define dma_txstopped(di) ((di)->di_fn.txstopped(di))
|
|
||||||
#define dma_rxstopped(di) ((di)->di_fn.rxstopped(di))
|
|
||||||
#define dma_rxenable(di) ((di)->di_fn.rxenable(di))
|
|
||||||
#define dma_rxenabled(di) ((di)->di_fn.rxenabled(di))
|
|
||||||
#define dma_rx(di) ((di)->di_fn.rx(di))
|
|
||||||
#define dma_rxfill(di) ((di)->di_fn.rxfill(di))
|
|
||||||
#define dma_txreclaim(di, forceall) ((di)->di_fn.txreclaim(di, forceall))
|
|
||||||
#define dma_rxreclaim(di) ((di)->di_fn.rxreclaim(di))
|
|
||||||
#define dma_getvar(di, name) ((di)->di_fn.d_getvar(di, name))
|
|
||||||
#define dma_getnexttxp(di, forceall) ((di)->di_fn.getnexttxp(di, forceall))
|
|
||||||
#define dma_getnextrxp(di, forceall) ((di)->di_fn.getnextrxp(di, forceall))
|
|
||||||
#define dma_peeknexttxp(di) ((di)->di_fn.peeknexttxp(di))
|
|
||||||
#define dma_txblock(di) ((di)->di_fn.txblock(di))
|
|
||||||
#define dma_txunblock(di) ((di)->di_fn.txunblock(di))
|
|
||||||
#define dma_txactive(di) ((di)->di_fn.txactive(di))
|
|
||||||
#define dma_txrotate(di) ((di)->di_fn.txrotate(di))
|
|
||||||
#define dma_counterreset(di) ((di)->di_fn.counterreset(di))
|
|
||||||
#ifdef BCMDBG
|
|
||||||
#define dma_dump(di, buf, dumpring) ((di)->di_fn.dump(di, buf, dumpring))
|
|
||||||
#define dma_dumptx(di, buf, dumpring) ((di)->di_fn.dumptx(di, buf, dumpring))
|
|
||||||
#define dma_dumprx(di, buf, dumpring) ((di)->di_fn.dumprx(di, buf, dumpring))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* return addresswidth allowed
|
|
||||||
* This needs to be done after SB attach but before dma attach.
|
|
||||||
* SB attach provides ability to probe backplane and dma core capabilities
|
|
||||||
* This info is needed by DMA_ALLOC_CONSISTENT in dma attach
|
|
||||||
*/
|
|
||||||
extern uint dma_addrwidth(sb_t *sbh, void *dmaregs);
|
|
||||||
|
|
||||||
/* pio helpers */
|
|
||||||
void dma_txpioloopback(osl_t *osh, dma32regs_t *);
|
|
||||||
|
|
||||||
#endif /* _hnddma_h_ */
|
|
|
@ -1,889 +0,0 @@
|
||||||
/*
|
|
||||||
* Linux OS Independent Layer
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define LINUX_OSL
|
|
||||||
|
|
||||||
#include <typedefs.h>
|
|
||||||
#include <bcmendian.h>
|
|
||||||
#include <linuxver.h>
|
|
||||||
#include <bcmdefs.h>
|
|
||||||
#include <osl.h>
|
|
||||||
#include "linux_osl.h"
|
|
||||||
#include "bcmutils.h"
|
|
||||||
#include <linux/delay.h>
|
|
||||||
#ifdef mips
|
|
||||||
#include <asm/paccess.h>
|
|
||||||
#endif /* mips */
|
|
||||||
#include <pcicfg.h>
|
|
||||||
|
|
||||||
#define PCI_CFG_RETRY 10
|
|
||||||
|
|
||||||
#define OS_HANDLE_MAGIC 0x1234abcd /* Magic # to recognise osh */
|
|
||||||
#define BCM_MEM_FILENAME_LEN 24 /* Mem. filename length */
|
|
||||||
|
|
||||||
typedef struct bcm_mem_link
|
|
||||||
{
|
|
||||||
struct bcm_mem_link *prev;
|
|
||||||
struct bcm_mem_link *next;
|
|
||||||
uint size;
|
|
||||||
int line;
|
|
||||||
char file[BCM_MEM_FILENAME_LEN];
|
|
||||||
} bcm_mem_link_t;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
struct osl_info
|
|
||||||
{
|
|
||||||
osl_pubinfo_t pub;
|
|
||||||
uint magic;
|
|
||||||
void *pdev;
|
|
||||||
uint malloced;
|
|
||||||
uint failed;
|
|
||||||
uint bustype;
|
|
||||||
bcm_mem_link_t *dbgmem_list;
|
|
||||||
#ifdef BCMDBG_PKT /* pkt logging for debugging */
|
|
||||||
pktlist_info_t pktlist;
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int16 linuxbcmerrormap[] = { 0, /* 0 */
|
|
||||||
-EINVAL, /* BCME_ERROR */
|
|
||||||
-EINVAL, /* BCME_BADARG */
|
|
||||||
-EINVAL, /* BCME_BADOPTION */
|
|
||||||
-EINVAL, /* BCME_NOTUP */
|
|
||||||
-EINVAL, /* BCME_NOTDOWN */
|
|
||||||
-EINVAL, /* BCME_NOTAP */
|
|
||||||
-EINVAL, /* BCME_NOTSTA */
|
|
||||||
-EINVAL, /* BCME_BADKEYIDX */
|
|
||||||
-EINVAL, /* BCME_RADIOOFF */
|
|
||||||
-EINVAL, /* BCME_NOTBANDLOCKED */
|
|
||||||
-EINVAL, /* BCME_NOCLK */
|
|
||||||
-EINVAL, /* BCME_BADRATESET */
|
|
||||||
-EINVAL, /* BCME_BADBAND */
|
|
||||||
-E2BIG, /* BCME_BUFTOOSHORT */
|
|
||||||
-E2BIG, /* BCME_BUFTOOLONG */
|
|
||||||
-EBUSY, /* BCME_BUSY */
|
|
||||||
-EINVAL, /* BCME_NOTASSOCIATED */
|
|
||||||
-EINVAL, /* BCME_BADSSIDLEN */
|
|
||||||
-EINVAL, /* BCME_OUTOFRANGECHAN */
|
|
||||||
-EINVAL, /* BCME_BADCHAN */
|
|
||||||
-EFAULT, /* BCME_BADADDR */
|
|
||||||
-ENOMEM, /* BCME_NORESOURCE */
|
|
||||||
-EOPNOTSUPP, /* BCME_UNSUPPORTED */
|
|
||||||
-EMSGSIZE, /* BCME_BADLENGTH */
|
|
||||||
-EINVAL, /* BCME_NOTREADY */
|
|
||||||
-EPERM, /* BCME_NOTPERMITTED */
|
|
||||||
-ENOMEM, /* BCME_NOMEM */
|
|
||||||
-EINVAL, /* BCME_ASSOCIATED */
|
|
||||||
-ERANGE, /* BCME_RANGE */
|
|
||||||
-EINVAL, /* BCME_NOTFOUND */
|
|
||||||
-EINVAL, /* BCME_WME_NOT_ENABLED */
|
|
||||||
-EINVAL, /* BCME_TSPEC_NOTFOUND */
|
|
||||||
-EINVAL, /* BCME_ACM_NOTSUPPORTED */
|
|
||||||
-EINVAL, /* BCME_NOT_WME_ASSOCIATION */
|
|
||||||
-EIO, /* BCME_SDIO_ERROR */
|
|
||||||
-ENODEV, /* BCME_DONGLE_DOWN */
|
|
||||||
-EINVAL /* BCME_VERSION */
|
|
||||||
/* When an new error code is added to bcmutils.h, add os
|
|
||||||
* spcecific error translation here as well
|
|
||||||
*/
|
|
||||||
/* check if BCME_LAST changed since the last time this function was updated */
|
|
||||||
#if BCME_LAST != -37
|
|
||||||
#error "You need to add a OS error translation in the linuxbcmerrormap \
|
|
||||||
for new error code defined in bcmuitls.h"
|
|
||||||
#endif /* BCME_LAST != -37 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* translate bcmerrors into linux errors */
|
|
||||||
int
|
|
||||||
osl_error (int bcmerror)
|
|
||||||
{
|
|
||||||
if (bcmerror > 0)
|
|
||||||
bcmerror = 0;
|
|
||||||
else if (bcmerror < BCME_LAST)
|
|
||||||
bcmerror = BCME_ERROR;
|
|
||||||
|
|
||||||
/* Array bounds covered by ASSERT in osl_attach */
|
|
||||||
return linuxbcmerrormap[-bcmerror];
|
|
||||||
}
|
|
||||||
|
|
||||||
osl_t *
|
|
||||||
osl_attach (void *pdev, uint bustype, bool pkttag)
|
|
||||||
{
|
|
||||||
osl_t *osh;
|
|
||||||
|
|
||||||
osh = kmalloc (sizeof (osl_t), GFP_ATOMIC);
|
|
||||||
ASSERT (osh);
|
|
||||||
|
|
||||||
bzero (osh, sizeof (osl_t));
|
|
||||||
|
|
||||||
/* Check that error map has the right number of entries in it */
|
|
||||||
ASSERT (ABS (BCME_LAST) == (ARRAYSIZE (linuxbcmerrormap) - 1));
|
|
||||||
|
|
||||||
osh->magic = OS_HANDLE_MAGIC;
|
|
||||||
osh->malloced = 0;
|
|
||||||
osh->failed = 0;
|
|
||||||
osh->dbgmem_list = NULL;
|
|
||||||
osh->pdev = pdev;
|
|
||||||
osh->pub.pkttag = pkttag;
|
|
||||||
osh->bustype = bustype;
|
|
||||||
|
|
||||||
switch (bustype)
|
|
||||||
{
|
|
||||||
case PCI_BUS:
|
|
||||||
case SB_BUS:
|
|
||||||
case PCMCIA_BUS:
|
|
||||||
osh->pub.mmbus = TRUE;
|
|
||||||
break;
|
|
||||||
case JTAG_BUS:
|
|
||||||
case SDIO_BUS:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ASSERT (FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BCMDBG
|
|
||||||
if (pkttag)
|
|
||||||
{
|
|
||||||
struct sk_buff *skb;
|
|
||||||
ASSERT (OSL_PKTTAG_SZ <= sizeof (skb->cb));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return osh;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_detach (osl_t * osh)
|
|
||||||
{
|
|
||||||
if (osh == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ASSERT (osh->magic == OS_HANDLE_MAGIC);
|
|
||||||
kfree (osh);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return a new packet. zero out pkttag */
|
|
||||||
void *
|
|
||||||
osl_pktget (osl_t * osh, uint len)
|
|
||||||
{
|
|
||||||
struct sk_buff *skb;
|
|
||||||
|
|
||||||
if ((skb = dev_alloc_skb (len)))
|
|
||||||
{
|
|
||||||
skb_put (skb, len);
|
|
||||||
skb->priority = 0;
|
|
||||||
|
|
||||||
#ifdef BCMDBG_PKT
|
|
||||||
pktlist_add (&(osh->pktlist), (void *) skb);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
|
|
||||||
osh->pub.pktalloced++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ((void *) skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free the driver packet. Free the tag if present */
|
|
||||||
void
|
|
||||||
osl_pktfree (osl_t * osh, void *p, bool send)
|
|
||||||
{
|
|
||||||
struct sk_buff *skb, *nskb;
|
|
||||||
|
|
||||||
skb = (struct sk_buff *) p;
|
|
||||||
|
|
||||||
if (send && osh->pub.tx_fn)
|
|
||||||
osh->pub.tx_fn (osh->pub.tx_ctx, p, 0);
|
|
||||||
|
|
||||||
/* perversion: we use skb->next to chain multi-skb packets */
|
|
||||||
while (skb)
|
|
||||||
{
|
|
||||||
nskb = skb->next;
|
|
||||||
skb->next = NULL;
|
|
||||||
|
|
||||||
#ifdef BCMDBG_PKT
|
|
||||||
pktlist_remove (&(osh->pktlist), (void *) skb);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
|
|
||||||
if (skb->destructor)
|
|
||||||
{
|
|
||||||
/* cannot kfree_skb() on hard IRQ (net/core/skbuff.c) if destructor exists
|
|
||||||
*/
|
|
||||||
dev_kfree_skb_any (skb);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* can free immediately (even in_irq()) if destructor does not exist */
|
|
||||||
dev_kfree_skb (skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
osh->pub.pktalloced--;
|
|
||||||
|
|
||||||
skb = nskb;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32
|
|
||||||
osl_pci_read_config (osl_t * osh, uint offset, uint size)
|
|
||||||
{
|
|
||||||
uint val;
|
|
||||||
uint retry = PCI_CFG_RETRY;
|
|
||||||
|
|
||||||
ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
|
|
||||||
|
|
||||||
/* only 4byte access supported */
|
|
||||||
ASSERT (size == 4);
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
pci_read_config_dword (osh->pdev, offset, &val);
|
|
||||||
if (val != 0xffffffff)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (retry--);
|
|
||||||
|
|
||||||
#ifdef BCMDBG
|
|
||||||
if (retry < PCI_CFG_RETRY)
|
|
||||||
printk ("PCI CONFIG READ access to %d required %d retries\n", offset,
|
|
||||||
(PCI_CFG_RETRY - retry));
|
|
||||||
#endif /* BCMDBG */
|
|
||||||
|
|
||||||
return (val);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_pci_write_config (osl_t * osh, uint offset, uint size, uint val)
|
|
||||||
{
|
|
||||||
uint retry = PCI_CFG_RETRY;
|
|
||||||
|
|
||||||
ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
|
|
||||||
|
|
||||||
/* only 4byte access supported */
|
|
||||||
ASSERT (size == 4);
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
pci_write_config_dword (osh->pdev, offset, val);
|
|
||||||
if (offset != PCI_BAR0_WIN)
|
|
||||||
break;
|
|
||||||
if (osl_pci_read_config (osh, offset, size) == val)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (retry--);
|
|
||||||
|
|
||||||
#ifdef BCMDBG
|
|
||||||
if (retry < PCI_CFG_RETRY)
|
|
||||||
printk ("PCI CONFIG WRITE access to %d required %d retries\n", offset,
|
|
||||||
(PCI_CFG_RETRY - retry));
|
|
||||||
#endif /* BCMDBG */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return bus # for the pci device pointed by osh->pdev */
|
|
||||||
uint
|
|
||||||
osl_pci_bus (osl_t * osh)
|
|
||||||
{
|
|
||||||
ASSERT (osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev);
|
|
||||||
|
|
||||||
return ((struct pci_dev *) osh->pdev)->bus->number;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return slot # for the pci device pointed by osh->pdev */
|
|
||||||
uint
|
|
||||||
osl_pci_slot (osl_t * osh)
|
|
||||||
{
|
|
||||||
ASSERT (osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev);
|
|
||||||
|
|
||||||
return PCI_SLOT (((struct pci_dev *) osh->pdev)->devfn);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
osl_pcmcia_attr (osl_t * osh, uint offset, char *buf, int size, bool write)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_pcmcia_read_attr (osl_t * osh, uint offset, void *buf, int size)
|
|
||||||
{
|
|
||||||
osl_pcmcia_attr (osh, offset, (char *) buf, size, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_pcmcia_write_attr (osl_t * osh, uint offset, void *buf, int size)
|
|
||||||
{
|
|
||||||
osl_pcmcia_attr (osh, offset, (char *) buf, size, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef BCMDBG_MEM
|
|
||||||
|
|
||||||
void *
|
|
||||||
osl_debug_malloc (osl_t * osh, uint size, int line, char *file)
|
|
||||||
{
|
|
||||||
bcm_mem_link_t *p;
|
|
||||||
char *basename;
|
|
||||||
|
|
||||||
ASSERT (size);
|
|
||||||
|
|
||||||
if ((p =
|
|
||||||
(bcm_mem_link_t *) osl_malloc (osh,
|
|
||||||
sizeof (bcm_mem_link_t) + size)) ==
|
|
||||||
NULL)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
p->size = size;
|
|
||||||
p->line = line;
|
|
||||||
|
|
||||||
basename = strrchr (file, '/');
|
|
||||||
/* skip the '/' */
|
|
||||||
if (basename)
|
|
||||||
basename++;
|
|
||||||
|
|
||||||
if (!basename)
|
|
||||||
basename = file;
|
|
||||||
|
|
||||||
strncpy (p->file, basename, BCM_MEM_FILENAME_LEN);
|
|
||||||
p->file[BCM_MEM_FILENAME_LEN - 1] = '\0';
|
|
||||||
|
|
||||||
/* link this block */
|
|
||||||
p->prev = NULL;
|
|
||||||
p->next = osh->dbgmem_list;
|
|
||||||
if (p->next)
|
|
||||||
p->next->prev = p;
|
|
||||||
osh->dbgmem_list = p;
|
|
||||||
|
|
||||||
return p + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_debug_mfree (osl_t * osh, void *addr, uint size, int line, char *file)
|
|
||||||
{
|
|
||||||
bcm_mem_link_t *p =
|
|
||||||
(bcm_mem_link_t *) ((int8 *) addr - sizeof (bcm_mem_link_t));
|
|
||||||
|
|
||||||
ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
|
|
||||||
|
|
||||||
if (p->size == 0)
|
|
||||||
{
|
|
||||||
printk
|
|
||||||
("osl_debug_mfree: double free on addr %p size %d at line %d file %s\n",
|
|
||||||
addr, size, line, file);
|
|
||||||
ASSERT (p->size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p->size != size)
|
|
||||||
{
|
|
||||||
printk
|
|
||||||
("osl_debug_mfree: dealloc size %d does not match alloc size %d on addr %p"
|
|
||||||
" at line %d file %s\n", size, p->size, addr, line, file);
|
|
||||||
ASSERT (p->size == size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* unlink this block */
|
|
||||||
if (p->prev)
|
|
||||||
p->prev->next = p->next;
|
|
||||||
if (p->next)
|
|
||||||
p->next->prev = p->prev;
|
|
||||||
if (osh->dbgmem_list == p)
|
|
||||||
osh->dbgmem_list = p->next;
|
|
||||||
p->next = p->prev = NULL;
|
|
||||||
|
|
||||||
osl_mfree (osh, p, size + sizeof (bcm_mem_link_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
osl_debug_memdump (osl_t * osh, struct bcmstrbuf *b)
|
|
||||||
{
|
|
||||||
bcm_mem_link_t *p;
|
|
||||||
|
|
||||||
ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
|
|
||||||
|
|
||||||
bcm_bprintf (b, " Address\tSize\tFile:line\n");
|
|
||||||
for (p = osh->dbgmem_list; p; p = p->next)
|
|
||||||
bcm_bprintf (b, "0x%08x\t%5d\t%s:%d\n",
|
|
||||||
(uintptr) p + sizeof (bcm_mem_link_t), p->size, p->file,
|
|
||||||
p->line);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* BCMDBG_MEM */
|
|
||||||
|
|
||||||
void *
|
|
||||||
osl_malloc (osl_t * osh, uint size)
|
|
||||||
{
|
|
||||||
void *addr;
|
|
||||||
|
|
||||||
/* only ASSERT if osh is defined */
|
|
||||||
if (osh)
|
|
||||||
ASSERT (osh->magic == OS_HANDLE_MAGIC);
|
|
||||||
|
|
||||||
if ((addr = kmalloc (size, GFP_ATOMIC)) == NULL)
|
|
||||||
{
|
|
||||||
if (osh)
|
|
||||||
osh->failed++;
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
if (osh)
|
|
||||||
osh->malloced += size;
|
|
||||||
|
|
||||||
return (addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_mfree (osl_t * osh, void *addr, uint size)
|
|
||||||
{
|
|
||||||
if (osh)
|
|
||||||
{
|
|
||||||
ASSERT (osh->magic == OS_HANDLE_MAGIC);
|
|
||||||
osh->malloced -= size;
|
|
||||||
}
|
|
||||||
kfree (addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint
|
|
||||||
osl_malloced (osl_t * osh)
|
|
||||||
{
|
|
||||||
ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
|
|
||||||
return (osh->malloced);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint
|
|
||||||
osl_malloc_failed (osl_t * osh)
|
|
||||||
{
|
|
||||||
ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
|
|
||||||
return (osh->failed);
|
|
||||||
}
|
|
||||||
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_dma_free_consistent (osl_t * osh, void *va, uint size, ulong pa)
|
|
||||||
{
|
|
||||||
ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
|
|
||||||
|
|
||||||
pci_free_consistent (osh->pdev, size, va, (dma_addr_t) pa);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint
|
|
||||||
osl_dma_map (osl_t * osh, void *va, uint size, int direction)
|
|
||||||
{
|
|
||||||
int dir;
|
|
||||||
|
|
||||||
ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
|
|
||||||
dir = (direction == DMA_TX) ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE;
|
|
||||||
return (pci_map_single (osh->pdev, va, size, dir));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_dma_unmap (osl_t * osh, uint pa, uint size, int direction)
|
|
||||||
{
|
|
||||||
int dir;
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(BINOSL) || defined(BCMDBG_ASSERT)
|
|
||||||
void
|
|
||||||
osl_assert (char *exp, char *file, int line)
|
|
||||||
{
|
|
||||||
char tempbuf[255];
|
|
||||||
|
|
||||||
sprintf (tempbuf, "assertion \"%s\" failed: file \"%s\", line %d\n", exp,
|
|
||||||
file, line);
|
|
||||||
panic (tempbuf);
|
|
||||||
}
|
|
||||||
#endif /* BCMDBG_ASSERT || BINOSL */
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_delay (uint usec)
|
|
||||||
{
|
|
||||||
uint d;
|
|
||||||
|
|
||||||
while (usec > 0)
|
|
||||||
{
|
|
||||||
d = MIN (usec, 1000);
|
|
||||||
udelay (d);
|
|
||||||
usec -= d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clone a packet.
|
|
||||||
* The pkttag contents are NOT cloned.
|
|
||||||
*/
|
|
||||||
void *
|
|
||||||
osl_pktdup (osl_t * osh, void *skb)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
if ((p = skb_clone ((struct sk_buff *) skb, GFP_ATOMIC)) == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* skb_clone copies skb->cb.. we don't want that */
|
|
||||||
if (osh->pub.pkttag)
|
|
||||||
bzero ((void *) ((struct sk_buff *) p)->cb, OSL_PKTTAG_SZ);
|
|
||||||
|
|
||||||
/* Increment the packet counter */
|
|
||||||
osh->pub.pktalloced++;
|
|
||||||
#ifdef BCMDBG_PKT
|
|
||||||
pktlist_add (&(osh->pktlist), (void *) p);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
return (p);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint
|
|
||||||
osl_pktalloced (osl_t * osh)
|
|
||||||
{
|
|
||||||
return (osh->pub.pktalloced);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BCMDBG_PKT
|
|
||||||
char *
|
|
||||||
osl_pktlist_dump (osl_t * osh, char *buf)
|
|
||||||
{
|
|
||||||
pktlist_dump (&(osh->pktlist), buf);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_pktlist_add (osl_t * osh, void *p)
|
|
||||||
{
|
|
||||||
pktlist_add (&(osh->pktlist), p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_pktlist_remove (osl_t * osh, void *p)
|
|
||||||
{
|
|
||||||
pktlist_remove (&(osh->pktlist), p);
|
|
||||||
}
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* BINOSL selects the slightly slower function-call-based binary compatible osl.
|
|
||||||
*/
|
|
||||||
#ifdef BINOSL
|
|
||||||
|
|
||||||
int
|
|
||||||
osl_printf (const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
char buf[1024];
|
|
||||||
int len;
|
|
||||||
|
|
||||||
/* sprintf into a local buffer because there *is* no "vprintk()".. */
|
|
||||||
va_start (args, format);
|
|
||||||
len = vsnprintf (buf, 1024, format, args);
|
|
||||||
va_end (args);
|
|
||||||
|
|
||||||
if (len > sizeof (buf))
|
|
||||||
{
|
|
||||||
printk ("osl_printf: buffer overrun\n");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (printk (buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
osl_sprintf (char *buf, const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
va_start (args, format);
|
|
||||||
rc = vsprintf (buf, format, args);
|
|
||||||
va_end (args);
|
|
||||||
return (rc);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
osl_strcmp (const char *s1, const char *s2)
|
|
||||||
{
|
|
||||||
return (strcmp (s1, s2));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
osl_strncmp (const char *s1, const char *s2, uint n)
|
|
||||||
{
|
|
||||||
return (strncmp (s1, s2, n));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
osl_strlen (const char *s)
|
|
||||||
{
|
|
||||||
return (strlen (s));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
osl_strcpy (char *d, const char *s)
|
|
||||||
{
|
|
||||||
return (strcpy (d, s));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
osl_strncpy (char *d, const char *s, uint n)
|
|
||||||
{
|
|
||||||
return (strncpy (d, s, n));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
bcopy (const void *src, void *dst, int len)
|
|
||||||
{
|
|
||||||
memcpy (dst, src, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
bcmp (const void *b1, const void *b2, int len)
|
|
||||||
{
|
|
||||||
return (memcmp (b1, b2, len));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
bzero (void *b, int len)
|
|
||||||
{
|
|
||||||
memset (b, '\0', len);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32
|
|
||||||
osl_readl (volatile uint32 * r)
|
|
||||||
{
|
|
||||||
return (readl (r));
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16
|
|
||||||
osl_readw (volatile uint16 * r)
|
|
||||||
{
|
|
||||||
return (readw (r));
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8
|
|
||||||
osl_readb (volatile uint8 * r)
|
|
||||||
{
|
|
||||||
return (readb (r));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_writel (uint32 v, volatile uint32 * r)
|
|
||||||
{
|
|
||||||
writel (v, r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_writew (uint16 v, volatile uint16 * r)
|
|
||||||
{
|
|
||||||
writew (v, r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_writeb (uint8 v, volatile uint8 * r)
|
|
||||||
{
|
|
||||||
writeb (v, r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
osl_uncached (void *va)
|
|
||||||
{
|
|
||||||
#ifdef mips
|
|
||||||
return ((void *) KSEG1ADDR (va));
|
|
||||||
#else
|
|
||||||
return ((void *) va);
|
|
||||||
#endif /* mips */
|
|
||||||
}
|
|
||||||
|
|
||||||
uint
|
|
||||||
osl_getcycles (void)
|
|
||||||
{
|
|
||||||
uint cycles;
|
|
||||||
|
|
||||||
#if defined(mips)
|
|
||||||
cycles = read_c0_count () * 2;
|
|
||||||
#elif defined(__i386__)
|
|
||||||
rdtscl (cycles);
|
|
||||||
#else
|
|
||||||
cycles = 0;
|
|
||||||
#endif /* defined(mips) */
|
|
||||||
return cycles;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
osl_reg_map (uint32 pa, uint size)
|
|
||||||
{
|
|
||||||
return (ioremap_nocache ((unsigned long) pa, (unsigned long) size));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_reg_unmap (void *va)
|
|
||||||
{
|
|
||||||
iounmap (va);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
osl_busprobe (uint32 * val, uint32 addr)
|
|
||||||
{
|
|
||||||
#ifdef mips
|
|
||||||
return get_dbe (*val, (uint32 *) addr);
|
|
||||||
#else
|
|
||||||
*val = readl ((uint32 *) (uintptr) addr);
|
|
||||||
return 0;
|
|
||||||
#endif /* mips */
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
osl_pktshared (void *skb)
|
|
||||||
{
|
|
||||||
return (((struct sk_buff *) skb)->cloned);
|
|
||||||
}
|
|
||||||
|
|
||||||
uchar *
|
|
||||||
osl_pktdata (osl_t * osh, void *skb)
|
|
||||||
{
|
|
||||||
return (((struct sk_buff *) skb)->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint
|
|
||||||
osl_pktlen (osl_t * osh, void *skb)
|
|
||||||
{
|
|
||||||
return (((struct sk_buff *) skb)->len);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint
|
|
||||||
osl_pktheadroom (osl_t * osh, void *skb)
|
|
||||||
{
|
|
||||||
return (uint) skb_headroom ((struct sk_buff *) skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint
|
|
||||||
osl_pkttailroom (osl_t * osh, void *skb)
|
|
||||||
{
|
|
||||||
return (uint) skb_tailroom ((struct sk_buff *) skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
osl_pktnext (osl_t * osh, void *skb)
|
|
||||||
{
|
|
||||||
return (((struct sk_buff *) skb)->next);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_pktsetnext (void *skb, void *x)
|
|
||||||
{
|
|
||||||
((struct sk_buff *) skb)->next = (struct sk_buff *) x;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_pktsetlen (osl_t * osh, void *skb, uint len)
|
|
||||||
{
|
|
||||||
__skb_trim ((struct sk_buff *) skb, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
uchar *
|
|
||||||
osl_pktpush (osl_t * osh, void *skb, int bytes)
|
|
||||||
{
|
|
||||||
return (skb_push ((struct sk_buff *) skb, bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
uchar *
|
|
||||||
osl_pktpull (osl_t * osh, void *skb, int bytes)
|
|
||||||
{
|
|
||||||
return (skb_pull ((struct sk_buff *) skb, bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
osl_pkttag (void *skb)
|
|
||||||
{
|
|
||||||
return ((void *) (((struct sk_buff *) skb)->cb));
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
osl_pktlink (void *skb)
|
|
||||||
{
|
|
||||||
return (((struct sk_buff *) skb)->prev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_pktsetlink (void *skb, void *x)
|
|
||||||
{
|
|
||||||
((struct sk_buff *) skb)->prev = (struct sk_buff *) x;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint
|
|
||||||
osl_pktprio (void *skb)
|
|
||||||
{
|
|
||||||
return (((struct sk_buff *) skb)->priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
osl_pktsetprio (void *skb, uint x)
|
|
||||||
{
|
|
||||||
((struct sk_buff *) skb)->priority = x;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert a driver packet to native(OS) packet
|
|
||||||
* In the process, packettag is zeroed out before sending up
|
|
||||||
* IP code depends on skb->cb to be setup correctly with various options
|
|
||||||
* In our case, that means it should be 0
|
|
||||||
*/
|
|
||||||
struct sk_buff *
|
|
||||||
osl_pkt_tonative (osl_t * osh, void *pkt)
|
|
||||||
{
|
|
||||||
struct sk_buff *nskb;
|
|
||||||
|
|
||||||
if (osh->pub.pkttag)
|
|
||||||
bzero ((void *) ((struct sk_buff *) pkt)->cb, OSL_PKTTAG_SZ);
|
|
||||||
|
|
||||||
/* Decrement the packet counter */
|
|
||||||
for (nskb = (struct sk_buff *) pkt; nskb; nskb = nskb->next)
|
|
||||||
{
|
|
||||||
#ifdef BCMDBG_PKT
|
|
||||||
pktlist_remove (&(osh->pktlist), (void *) nskb);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
osh->pub.pktalloced--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (struct sk_buff *) pkt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert a native(OS) packet to driver packet.
|
|
||||||
* In the process, native packet is destroyed, there is no copying
|
|
||||||
* Also, a packettag is zeroed out
|
|
||||||
*/
|
|
||||||
void *
|
|
||||||
osl_pkt_frmnative (osl_t * osh, struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
struct sk_buff *nskb;
|
|
||||||
|
|
||||||
if (osh->pub.pkttag)
|
|
||||||
bzero ((void *) skb->cb, OSL_PKTTAG_SZ);
|
|
||||||
|
|
||||||
/* Increment the packet counter */
|
|
||||||
for (nskb = skb; nskb; nskb = nskb->next)
|
|
||||||
{
|
|
||||||
#ifdef BCMDBG_PKT
|
|
||||||
pktlist_add (&(osh->pktlist), (void *) nskb);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
osh->pub.pktalloced++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (void *) skb;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* BINOSL */
|
|
|
@ -1,382 +0,0 @@
|
||||||
/*
|
|
||||||
* Linux OS Independent Layer
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _linux_osl_h_
|
|
||||||
#define _linux_osl_h_
|
|
||||||
|
|
||||||
#include <typedefs.h>
|
|
||||||
#include <linuxver.h>
|
|
||||||
#include <osl.h>
|
|
||||||
|
|
||||||
#define OSL_PKTTAG_SZ 32 /* Size of PktTag */
|
|
||||||
|
|
||||||
/* microsecond delay */
|
|
||||||
extern void osl_delay(uint usec);
|
|
||||||
|
|
||||||
/* OSL initialization */
|
|
||||||
extern osl_t *osl_attach(void *pdev, uint bustype, bool pkttag);
|
|
||||||
extern void osl_detach(osl_t *osh);
|
|
||||||
|
|
||||||
#define PKTFREESETCB(osh, _tx_fn, _tx_ctx) \
|
|
||||||
do { \
|
|
||||||
((osl_pubinfo_t*)osh)->tx_fn = _tx_fn; \
|
|
||||||
((osl_pubinfo_t*)osh)->tx_ctx = _tx_ctx; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* host/bus architecture-specific byte swap */
|
|
||||||
#define BUS_SWAP32(v) (v)
|
|
||||||
|
|
||||||
|
|
||||||
#define MALLOC_FAILED(osh) osl_malloc_failed((osh))
|
|
||||||
|
|
||||||
extern void *osl_malloc(osl_t *osh, uint size);
|
|
||||||
extern void osl_mfree(osl_t *osh, void *addr, uint size);
|
|
||||||
extern uint osl_malloced(osl_t *osh);
|
|
||||||
extern uint osl_malloc_failed(osl_t *osh);
|
|
||||||
|
|
||||||
/* allocate/free shared (dma-able) consistent memory */
|
|
||||||
#define DMA_CONSISTENT_ALIGN PAGE_SIZE
|
|
||||||
#define DMA_ALLOC_CONSISTENT(osh, size, pap, dmah) \
|
|
||||||
osl_dma_alloc_consistent((osh), (size), (pap))
|
|
||||||
#define DMA_FREE_CONSISTENT(osh, va, size, pa, dmah) \
|
|
||||||
osl_dma_free_consistent((osh), (void*)(va), (size), (pa))
|
|
||||||
extern void *osl_dma_alloc_consistent(osl_t *osh, uint size, ulong *pap);
|
|
||||||
extern void osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa);
|
|
||||||
|
|
||||||
/* map/unmap direction */
|
|
||||||
#define DMA_TX 1 /* TX direction for DMA */
|
|
||||||
#define DMA_RX 2 /* RX direction for DMA */
|
|
||||||
|
|
||||||
/* map/unmap shared (dma-able) memory */
|
|
||||||
#define DMA_MAP(osh, va, size, direction, p, dmah) \
|
|
||||||
osl_dma_map((osh), (va), (size), (direction))
|
|
||||||
#define DMA_UNMAP(osh, pa, size, direction, p, dmah) \
|
|
||||||
osl_dma_unmap((osh), (pa), (size), (direction))
|
|
||||||
extern uint osl_dma_map(osl_t *osh, void *va, uint size, int direction);
|
|
||||||
extern void osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction);
|
|
||||||
|
|
||||||
/* API for DMA addressing capability */
|
|
||||||
#define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0)
|
|
||||||
|
|
||||||
/* register access macros */
|
|
||||||
#if defined(BCMJTAG)
|
|
||||||
#include <bcmjtag.h>
|
|
||||||
#define OSL_WRITE_REG(osh, r, v) (bcmjtag_write(NULL, (uintptr)(r), (v), sizeof(*(r))))
|
|
||||||
#define OSL_READ_REG(osh, r) (bcmjtag_read(NULL, (uintptr)(r), sizeof(*(r))))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(BCMJTAG)
|
|
||||||
#define SELECT_BUS_WRITE(osh, mmap_op, bus_op) if (((osl_pubinfo_t*)(osh))->mmbus) \
|
|
||||||
mmap_op else bus_op
|
|
||||||
#define SELECT_BUS_READ(osh, mmap_op, bus_op) (((osl_pubinfo_t*)(osh))->mmbus) ? \
|
|
||||||
mmap_op : bus_op
|
|
||||||
#else
|
|
||||||
#define SELECT_BUS_WRITE(osh, mmap_op, bus_op) mmap_op
|
|
||||||
#define SELECT_BUS_READ(osh, mmap_op, bus_op) mmap_op
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* BINOSL selects the slightly slower function-call-based binary compatible osl.
|
|
||||||
* Macros expand to calls to functions defined in linux_osl.c .
|
|
||||||
*/
|
|
||||||
#ifndef BINOSL
|
|
||||||
|
|
||||||
/* string library, kernel mode */
|
|
||||||
#ifndef printf
|
|
||||||
#define printf(fmt, args...) printk(fmt, ## args)
|
|
||||||
#endif /* printf */
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
|
|
||||||
/* register access macros */
|
|
||||||
#define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v))
|
|
||||||
#define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v))
|
|
||||||
|
|
||||||
/* bcopy, bcmp, and bzero */
|
|
||||||
#define bcopy(src, dst, len) memcpy((dst), (src), (len))
|
|
||||||
#define bcmp(b1, b2, len) memcmp((b1), (b2), (len))
|
|
||||||
#define bzero(b, len) memset((b), '\0', (len))
|
|
||||||
|
|
||||||
/* uncached virtual address */
|
|
||||||
#ifdef mips
|
|
||||||
#define OSL_UNCACHED(va) KSEG1ADDR((va))
|
|
||||||
#include <asm/addrspace.h>
|
|
||||||
#else
|
|
||||||
#define OSL_UNCACHED(va) (va)
|
|
||||||
#endif /* mips */
|
|
||||||
|
|
||||||
/* get processor cycle count */
|
|
||||||
#if defined(mips)
|
|
||||||
#define OSL_GETCYCLES(x) ((x) = read_c0_count() * 2)
|
|
||||||
#elif defined(__i386__)
|
|
||||||
#define OSL_GETCYCLES(x) rdtscl((x))
|
|
||||||
#else
|
|
||||||
#define OSL_GETCYCLES(x) ((x) = 0)
|
|
||||||
#endif /* defined(mips) */
|
|
||||||
|
|
||||||
/* dereference an address that may cause a bus exception */
|
|
||||||
#ifdef mips
|
|
||||||
#if defined(MODULE) && (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 17))
|
|
||||||
#define BUSPROBE(val, addr) panic("get_dbe() will not fixup a bus exception when compiled into"\
|
|
||||||
" a module")
|
|
||||||
#else
|
|
||||||
#define BUSPROBE(val, addr) get_dbe((val), (addr))
|
|
||||||
#include <asm/paccess.h>
|
|
||||||
#endif /* defined(MODULE) && (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 17)) */
|
|
||||||
#else
|
|
||||||
#define BUSPROBE(val, addr) ({ (val) = R_REG(NULL, (addr)); 0; })
|
|
||||||
#endif /* mips */
|
|
||||||
|
|
||||||
/* map/unmap physical to virtual I/O */
|
|
||||||
#define REG_MAP(pa, size) ioremap_nocache((unsigned long)(pa), (unsigned long)(size))
|
|
||||||
#define REG_UNMAP(va) iounmap((void *)(va))
|
|
||||||
|
|
||||||
/* shared (dma-able) memory access macros */
|
|
||||||
#define R_SM(r) *(r)
|
|
||||||
#define W_SM(r, v) (*(r) = (v))
|
|
||||||
#define BZERO_SM(r, len) memset((r), '\0', (len))
|
|
||||||
|
|
||||||
/* packet primitives */
|
|
||||||
#define PKTGET(osh, len, send) osl_pktget((osh), (len))
|
|
||||||
#define PKTFREE(osh, skb, send) osl_pktfree((osh), (skb), (send))
|
|
||||||
#define PKTDATA(osh, skb) (((struct sk_buff*)(skb))->data)
|
|
||||||
#define PKTLEN(osh, skb) (((struct sk_buff*)(skb))->len)
|
|
||||||
#define PKTHEADROOM(osh, skb) (PKTDATA(osh, skb)-(((struct sk_buff*)(skb))->head))
|
|
||||||
#define PKTTAILROOM(osh, skb) ((((struct sk_buff*)(skb))->end)-(((struct sk_buff*)(skb))->tail))
|
|
||||||
#define PKTNEXT(osh, skb) (((struct sk_buff*)(skb))->next)
|
|
||||||
#define PKTSETNEXT(osh, skb, x) (((struct sk_buff*)(skb))->next = (struct sk_buff*)(x))
|
|
||||||
#define PKTSETLEN(osh, skb, len) __skb_trim((struct sk_buff*)(skb), (len))
|
|
||||||
#define PKTPUSH(osh, skb, bytes) skb_push((struct sk_buff*)(skb), (bytes))
|
|
||||||
#define PKTPULL(osh, skb, bytes) skb_pull((struct sk_buff*)(skb), (bytes))
|
|
||||||
#define PKTDUP(osh, skb) osl_pktdup((osh), (skb))
|
|
||||||
#define PKTTAG(skb) ((void*)(((struct sk_buff*)(skb))->cb))
|
|
||||||
#define PKTALLOCED(osh) ((osl_pubinfo_t *)(osh))->pktalloced
|
|
||||||
#ifdef BCMDBG_PKT /* pkt logging for debugging */
|
|
||||||
#define PKTLIST_DUMP(osh, buf) osl_pktlist_dump(osh, buf)
|
|
||||||
#else /* BCMDBG_PKT */
|
|
||||||
#define PKTLIST_DUMP(osh, buf)
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
|
|
||||||
#ifdef BCMDBG_PKT /* pkt logging for debugging */
|
|
||||||
extern void osl_pktlist_add(osl_t *osh, void *p);
|
|
||||||
extern void osl_pktlist_remove(osl_t *osh, void *p);
|
|
||||||
extern char *osl_pktlist_dump(osl_t *osh, char *buf);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
|
|
||||||
/* Convert a native(OS) packet to driver packet.
|
|
||||||
* In the process, native packet is destroyed, there is no copying
|
|
||||||
* Also, a packettag is zeroed out
|
|
||||||
*/
|
|
||||||
static INLINE void *
|
|
||||||
osl_pkt_frmnative(osl_pubinfo_t *osh, struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
struct sk_buff *nskb;
|
|
||||||
|
|
||||||
if (osh->pkttag)
|
|
||||||
bzero((void*)skb->cb, OSL_PKTTAG_SZ);
|
|
||||||
|
|
||||||
/* Increment the packet counter */
|
|
||||||
for (nskb = skb; nskb; nskb = nskb->next) {
|
|
||||||
#ifdef BCMDBG_PKT
|
|
||||||
osl_pktlist_add((osl_t *)osh, (void *) nskb);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
osh->pktalloced++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (void *)skb;
|
|
||||||
}
|
|
||||||
#define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative(((osl_pubinfo_t *)osh), (struct sk_buff*)(skb))
|
|
||||||
|
|
||||||
/* Convert a driver packet to native(OS) packet
|
|
||||||
* In the process, packettag is zeroed out before sending up
|
|
||||||
* IP code depends on skb->cb to be setup correctly with various options
|
|
||||||
* In our case, that means it should be 0
|
|
||||||
*/
|
|
||||||
static INLINE struct sk_buff *
|
|
||||||
osl_pkt_tonative(osl_pubinfo_t *osh, void *pkt)
|
|
||||||
{
|
|
||||||
struct sk_buff *nskb;
|
|
||||||
|
|
||||||
if (osh->pkttag)
|
|
||||||
bzero(((struct sk_buff*)pkt)->cb, OSL_PKTTAG_SZ);
|
|
||||||
|
|
||||||
/* Decrement the packet counter */
|
|
||||||
for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) {
|
|
||||||
#ifdef BCMDBG_PKT
|
|
||||||
osl_pktlist_remove((osl_t *)osh, (void *) nskb);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
osh->pktalloced--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (struct sk_buff *)pkt;
|
|
||||||
}
|
|
||||||
#define PKTTONATIVE(osh, pkt) osl_pkt_tonative((osl_pubinfo_t *)(osh), (pkt))
|
|
||||||
|
|
||||||
#define PKTLINK(skb) (((struct sk_buff*)(skb))->prev)
|
|
||||||
#define PKTSETLINK(skb, x) (((struct sk_buff*)(skb))->prev = (struct sk_buff*)(x))
|
|
||||||
#define PKTPRIO(skb) (((struct sk_buff*)(skb))->priority)
|
|
||||||
#define PKTSETPRIO(skb, x) (((struct sk_buff*)(skb))->priority = (x))
|
|
||||||
#define PKTSUMNEEDED(skb) (((struct sk_buff*)(skb))->ip_summed == CHECKSUM_HW)
|
|
||||||
#define PKTSETSUMGOOD(skb, x) (((struct sk_buff*)(skb))->ip_summed = \
|
|
||||||
((x) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE))
|
|
||||||
/* PKTSETSUMNEEDED and PKTSUMGOOD are not possible because skb->ip_summed is overloaded */
|
|
||||||
#define PKTSHARED(skb) (((struct sk_buff*)(skb))->cloned)
|
|
||||||
|
|
||||||
extern void *osl_pktget(osl_t *osh, uint len);
|
|
||||||
extern void osl_pktfree(osl_t *osh, void *skb, bool send);
|
|
||||||
extern void *osl_pktdup(osl_t *osh, void *skb);
|
|
||||||
#else /* BINOSL */
|
|
||||||
|
|
||||||
/* string library */
|
|
||||||
#ifndef LINUX_OSL
|
|
||||||
#undef printf
|
|
||||||
#define printf(fmt, args...) osl_printf((fmt), ## args)
|
|
||||||
#undef sprintf
|
|
||||||
#define sprintf(buf, fmt, args...) osl_sprintf((buf), (fmt), ## args)
|
|
||||||
#undef strcmp
|
|
||||||
#define strcmp(s1, s2) osl_strcmp((s1), (s2))
|
|
||||||
#undef strncmp
|
|
||||||
#define strncmp(s1, s2, n) osl_strncmp((s1), (s2), (n))
|
|
||||||
#undef strlen
|
|
||||||
#define strlen(s) osl_strlen((s))
|
|
||||||
#undef strcpy
|
|
||||||
#define strcpy(d, s) osl_strcpy((d), (s))
|
|
||||||
#undef strncpy
|
|
||||||
#define strncpy(d, s, n) osl_strncpy((d), (s), (n))
|
|
||||||
#endif /* LINUX_OSL */
|
|
||||||
extern int osl_printf(const char *format, ...);
|
|
||||||
extern int osl_sprintf(char *buf, const char *format, ...);
|
|
||||||
extern int osl_strcmp(const char *s1, const char *s2);
|
|
||||||
extern int osl_strncmp(const char *s1, const char *s2, uint n);
|
|
||||||
extern int osl_strlen(const char *s);
|
|
||||||
extern char* osl_strcpy(char *d, const char *s);
|
|
||||||
extern char* osl_strncpy(char *d, const char *s, uint n);
|
|
||||||
|
|
||||||
/* register access macros */
|
|
||||||
#if !defined(BCMJTAG)
|
|
||||||
#define R_REG(osh, r) (\
|
|
||||||
sizeof(*(r)) == sizeof(uint8) ? osl_readb((volatile uint8*)(r)) : \
|
|
||||||
sizeof(*(r)) == sizeof(uint16) ? osl_readw((volatile uint16*)(r)) : \
|
|
||||||
osl_readl((volatile uint32*)(r)) \
|
|
||||||
)
|
|
||||||
#define W_REG(osh, r, v) do { \
|
|
||||||
switch (sizeof(*(r))) { \
|
|
||||||
case sizeof(uint8): osl_writeb((uint8)(v), (volatile uint8*)(r)); break; \
|
|
||||||
case sizeof(uint16): osl_writew((uint16)(v), (volatile uint16*)(r)); break; \
|
|
||||||
case sizeof(uint32): osl_writel((uint32)(v), (volatile uint32*)(r)); break; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v))
|
|
||||||
#define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v))
|
|
||||||
extern uint8 osl_readb(volatile uint8 *r);
|
|
||||||
extern uint16 osl_readw(volatile uint16 *r);
|
|
||||||
extern uint32 osl_readl(volatile uint32 *r);
|
|
||||||
extern void osl_writeb(uint8 v, volatile uint8 *r);
|
|
||||||
extern void osl_writew(uint16 v, volatile uint16 *r);
|
|
||||||
extern void osl_writel(uint32 v, volatile uint32 *r);
|
|
||||||
|
|
||||||
/* bcopy, bcmp, and bzero */
|
|
||||||
extern void bcopy(const void *src, void *dst, int len);
|
|
||||||
extern int bcmp(const void *b1, const void *b2, int len);
|
|
||||||
extern void bzero(void *b, int len);
|
|
||||||
|
|
||||||
/* uncached virtual address */
|
|
||||||
#define OSL_UNCACHED(va) osl_uncached((va))
|
|
||||||
extern void *osl_uncached(void *va);
|
|
||||||
|
|
||||||
/* get processor cycle count */
|
|
||||||
#define OSL_GETCYCLES(x) ((x) = osl_getcycles())
|
|
||||||
extern uint osl_getcycles(void);
|
|
||||||
|
|
||||||
/* dereference an address that may target abort */
|
|
||||||
#define BUSPROBE(val, addr) osl_busprobe(&(val), (addr))
|
|
||||||
extern int osl_busprobe(uint32 *val, uint32 addr);
|
|
||||||
|
|
||||||
/* map/unmap physical to virtual */
|
|
||||||
#define REG_MAP(pa, size) osl_reg_map((pa), (size))
|
|
||||||
#define REG_UNMAP(va) osl_reg_unmap((va))
|
|
||||||
extern void *osl_reg_map(uint32 pa, uint size);
|
|
||||||
extern void osl_reg_unmap(void *va);
|
|
||||||
|
|
||||||
/* shared (dma-able) memory access macros */
|
|
||||||
#define R_SM(r) *(r)
|
|
||||||
#define W_SM(r, v) (*(r) = (v))
|
|
||||||
#define BZERO_SM(r, len) bzero((r), (len))
|
|
||||||
|
|
||||||
/* packet primitives */
|
|
||||||
#define PKTGET(osh, len, send) osl_pktget((osh), (len))
|
|
||||||
#define PKTFREE(osh, skb, send) osl_pktfree((osh), (skb), (send))
|
|
||||||
#define PKTDATA(osh, skb) osl_pktdata((osh), (skb))
|
|
||||||
#define PKTLEN(osh, skb) osl_pktlen((osh), (skb))
|
|
||||||
#define PKTHEADROOM(osh, skb) osl_pktheadroom((osh), (skb))
|
|
||||||
#define PKTTAILROOM(osh, skb) osl_pkttailroom((osh), (skb))
|
|
||||||
#define PKTNEXT(osh, skb) osl_pktnext((osh), (skb))
|
|
||||||
#define PKTSETNEXT(osh, skb, x) osl_pktsetnext((skb), (x))
|
|
||||||
#define PKTSETLEN(osh, skb, len) osl_pktsetlen((osh), (skb), (len))
|
|
||||||
#define PKTPUSH(osh, skb, bytes) osl_pktpush((osh), (skb), (bytes))
|
|
||||||
#define PKTPULL(osh, skb, bytes) osl_pktpull((osh), (skb), (bytes))
|
|
||||||
#define PKTDUP(osh, skb) osl_pktdup((osh), (skb))
|
|
||||||
#define PKTTAG(skb) osl_pkttag((skb))
|
|
||||||
#define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative((osh), (struct sk_buff*)(skb))
|
|
||||||
#define PKTTONATIVE(osh, pkt) osl_pkt_tonative((osh), (pkt))
|
|
||||||
#define PKTLINK(skb) osl_pktlink((skb))
|
|
||||||
#define PKTSETLINK(skb, x) osl_pktsetlink((skb), (x))
|
|
||||||
#define PKTPRIO(skb) osl_pktprio((skb))
|
|
||||||
#define PKTSETPRIO(skb, x) osl_pktsetprio((skb), (x))
|
|
||||||
#define PKTSHARED(skb) osl_pktshared((skb))
|
|
||||||
#define PKTALLOCED(osh) osl_pktalloced((osh))
|
|
||||||
#ifdef BCMDBG_PKT
|
|
||||||
#define PKTLIST_DUMP(osh, buf) osl_pktlist_dump(osh, buf)
|
|
||||||
#else /* BCMDBG_PKT */
|
|
||||||
#define PKTLIST_DUMP(osh, buf)
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
|
|
||||||
extern void *osl_pktget(osl_t *osh, uint len);
|
|
||||||
extern void osl_pktfree(osl_t *osh, void *skb, bool send);
|
|
||||||
extern uchar *osl_pktdata(osl_t *osh, void *skb);
|
|
||||||
extern uint osl_pktlen(osl_t *osh, void *skb);
|
|
||||||
extern uint osl_pktheadroom(osl_t *osh, void *skb);
|
|
||||||
extern uint osl_pkttailroom(osl_t *osh, void *skb);
|
|
||||||
extern void *osl_pktnext(osl_t *osh, void *skb);
|
|
||||||
extern void osl_pktsetnext(void *skb, void *x);
|
|
||||||
extern void osl_pktsetlen(osl_t *osh, void *skb, uint len);
|
|
||||||
extern uchar *osl_pktpush(osl_t *osh, void *skb, int bytes);
|
|
||||||
extern uchar *osl_pktpull(osl_t *osh, void *skb, int bytes);
|
|
||||||
extern void *osl_pktdup(osl_t *osh, void *skb);
|
|
||||||
extern void *osl_pkttag(void *skb);
|
|
||||||
extern void *osl_pktlink(void *skb);
|
|
||||||
extern void osl_pktsetlink(void *skb, void *x);
|
|
||||||
extern uint osl_pktprio(void *skb);
|
|
||||||
extern void osl_pktsetprio(void *skb, uint x);
|
|
||||||
extern void *osl_pkt_frmnative(osl_t *osh, struct sk_buff *skb);
|
|
||||||
extern struct sk_buff *osl_pkt_tonative(osl_t *osh, void *pkt);
|
|
||||||
extern bool osl_pktshared(void *skb);
|
|
||||||
extern uint osl_pktalloced(osl_t *osh);
|
|
||||||
|
|
||||||
#ifdef BCMDBG_PKT /* pkt logging for debugging */
|
|
||||||
extern char *osl_pktlist_dump(osl_t *osh, char *buf);
|
|
||||||
extern void osl_pktlist_add(osl_t *osh, void *p);
|
|
||||||
extern void osl_pktlist_remove(osl_t *osh, void *p);
|
|
||||||
#endif /* BCMDBG_PKT */
|
|
||||||
|
|
||||||
#endif /* BINOSL */
|
|
||||||
|
|
||||||
#define OSL_ERROR(bcmerror) osl_error(bcmerror)
|
|
||||||
extern int osl_error(int bcmerror);
|
|
||||||
|
|
||||||
/* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */
|
|
||||||
#define PKTBUFSZ 2048 /* largest reasonable packet buffer, driver uses for ethernet MTU */
|
|
||||||
|
|
||||||
#endif /* _linux_osl_h_ */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,122 +0,0 @@
|
||||||
/*
|
|
||||||
* 802.11e protocol header file
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _802_11e_H_
|
|
||||||
#define _802_11e_H_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BCMDBG
|
|
||||||
extern const char *aci_names[];
|
|
||||||
#endif /* BCMDBG */
|
|
||||||
|
|
||||||
/* WME Traffic Specification (TSPEC) element */
|
|
||||||
#define WME_TSPEC_HDR_LEN 2 /* WME TSPEC header length */
|
|
||||||
#define WME_TSPEC_BODY_OFF 2 /* WME TSPEC body offset */
|
|
||||||
|
|
||||||
#define WME_CATEGORY_CODE_OFFSET 0 /* WME Category code offset */
|
|
||||||
#define WME_ACTION_CODE_OFFSET 1 /* WME Action code offset */
|
|
||||||
#define WME_TOKEN_CODE_OFFSET 2 /* WME Token code offset */
|
|
||||||
#define WME_STATUS_CODE_OFFSET 3 /* WME Status code offset */
|
|
||||||
|
|
||||||
struct tsinfo {
|
|
||||||
uint8 octets[3];
|
|
||||||
} PACKED;
|
|
||||||
|
|
||||||
typedef struct tsinfo tsinfo_t;
|
|
||||||
|
|
||||||
/* 802.11e TSPEC IE */
|
|
||||||
typedef struct tspec {
|
|
||||||
uint8 oui[DOT11_OUI_LEN]; /* WME_OUI */
|
|
||||||
uint8 type; /* WME_TYPE */
|
|
||||||
uint8 subtype; /* WME_SUBTYPE_TSPEC */
|
|
||||||
uint8 version; /* WME_VERSION */
|
|
||||||
tsinfo_t tsinfo; /* TS Info bit field */
|
|
||||||
uint16 nom_msdu_size; /* (Nominal or fixed) MSDU Size (bytes) */
|
|
||||||
uint16 max_msdu_size; /* Maximum MSDU Size (bytes) */
|
|
||||||
uint32 min_srv_interval; /* Minimum Service Interval (us) */
|
|
||||||
uint32 max_srv_interval; /* Maximum Service Interval (us) */
|
|
||||||
uint32 inactivity_interval; /* Inactivity Interval (us) */
|
|
||||||
uint32 suspension_interval; /* Suspension Interval (us) */
|
|
||||||
uint32 srv_start_time; /* Service Start Time (us) */
|
|
||||||
uint32 min_data_rate; /* Minimum Data Rate (bps) */
|
|
||||||
uint32 mean_data_rate; /* Mean Data Rate (bps) */
|
|
||||||
uint32 peak_data_rate; /* Peak Data Rate (bps) */
|
|
||||||
uint32 max_burst_size; /* Maximum Burst Size (bytes) */
|
|
||||||
uint32 delay_bound; /* Delay Bound (us) */
|
|
||||||
uint32 min_phy_rate; /* Minimum PHY Rate (bps) */
|
|
||||||
uint16 surplus_bw; /* Surplus Bandwidth Allowance Factor */
|
|
||||||
uint16 medium_time; /* Medium Time (32 us/s periods) */
|
|
||||||
} PACKED tspec_t;
|
|
||||||
|
|
||||||
#define WME_TSPEC_LEN (sizeof(tspec_t)) /* not including 2-bytes of header */
|
|
||||||
|
|
||||||
/* ts_info */
|
|
||||||
/* 802.1D priority is duplicated - bits 13-11 AND bits 3-1 */
|
|
||||||
#define TS_INFO_TID_SHIFT 1 /* TS info. TID shift */
|
|
||||||
#define TS_INFO_TID_MASK (0xf << TS_INFO_TID_SHIFT) /* TS info. TID mask */
|
|
||||||
#define TS_INFO_CONTENTION_SHIFT 7 /* TS info. contention shift */
|
|
||||||
#define TS_INFO_CONTENTION_MASK (0x1 << TS_INFO_CONTENTION_SHIFT) /* TS info. contention mask */
|
|
||||||
#define TS_INFO_DIRECTION_SHIFT 5 /* TS info. direction shift */
|
|
||||||
#define TS_INFO_DIRECTION_MASK (0x3 << TS_INFO_DIRECTION_SHIFT) /* TS info. direction mask */
|
|
||||||
#define TS_INFO_PSB_SHIFT 2 /* TS info. PSB bit Shift */
|
|
||||||
#define TS_INFO_PSB_MASK (1 << TS_INFO_PSB_SHIFT) /* TS info. PSB mask */
|
|
||||||
#define TS_INFO_UPLINK (0 << TS_INFO_DIRECTION_SHIFT) /* TS info. uplink */
|
|
||||||
#define TS_INFO_DOWNLINK (1 << TS_INFO_DIRECTION_SHIFT) /* TS info. downlink */
|
|
||||||
#define TS_INFO_BIDIRECTIONAL (3 << TS_INFO_DIRECTION_SHIFT) /* TS info. bidirectional */
|
|
||||||
#define TS_INFO_USER_PRIO_SHIFT 3 /* TS info. user priority shift */
|
|
||||||
/* TS info. user priority mask */
|
|
||||||
#define TS_INFO_USER_PRIO_MASK (0x7 << TS_INFO_USER_PRIO_SHIFT)
|
|
||||||
|
|
||||||
/* Macro to get/set bit(s) field in TSINFO */
|
|
||||||
#define WLC_CAC_GET_TID(pt) ((((pt).octets[0]) & TS_INFO_TID_MASK) >> TS_INFO_TID_SHIFT)
|
|
||||||
#define WLC_CAC_GET_DIR(pt) ((((pt).octets[0]) & \
|
|
||||||
TS_INFO_DIRECTION_MASK) >> TS_INFO_DIRECTION_SHIFT)
|
|
||||||
#define WLC_CAC_GET_PSB(pt) ((((pt).octets[1]) & WLC_CAC_PSB_MASK) >> WLC_CAC_PSB_SHIFT)
|
|
||||||
#define WLC_CAC_GET_USER_PRIO(pt) ((((pt).octets[1]) & \
|
|
||||||
TS_INFO_USER_PRIO_MASK) >> TS_INFO_USER_PRIO_SHIFT)
|
|
||||||
|
|
||||||
#define WLC_CAC_SET_TID(pt, id) ((((pt).octets[0]) & (~TS_INFO_TID_MASK)) | \
|
|
||||||
((id) << TS_INFO_TID_SHIFT))
|
|
||||||
#define WLC_CAC_SET_USER_PRIO(pt, prio) ((((pt).octets[0]) & (~TS_INFO_USER_PRIO_MASK)) | \
|
|
||||||
((prio) << TS_INFO_USER_PRIO_SHIFT))
|
|
||||||
|
|
||||||
/* 802.11e QBSS Load IE */
|
|
||||||
#define QBSS_LOAD_IE_LEN 5 /* QBSS Load IE length */
|
|
||||||
#define QBSS_LOAD_AAC_OFF 3 /* AAC offset in IE */
|
|
||||||
|
|
||||||
#define CAC_ADDTS_RESP_TIMEOUT 300 /* default ADDTS response timeout in ms */
|
|
||||||
|
|
||||||
/* 802.11e ADDTS status code */
|
|
||||||
#define DOT11E_STATUS_ADMISSION_ACCEPTED 0 /* TSPEC Admission accepted status */
|
|
||||||
#define DOT11E_STATUS_ADDTS_INVALID_PARAM 1 /* TSPEC invalid parameter status */
|
|
||||||
#define DOT11E_STATUS_ADDTS_REFUSED_NSBW 3 /* ADDTS refused (non-sufficient BW) */
|
|
||||||
|
|
||||||
/* 802.11e DELTS status code */
|
|
||||||
#define DOT11E_STATUS_QSTA_LEAVE_QBSS 36 /* STA leave QBSS */
|
|
||||||
#define DOT11E_STATUS_END_TS 37 /* END TS */
|
|
||||||
#define DOT11E_STATUS_UNKNOWN_TS 38 /* UNKNOWN TS */
|
|
||||||
#define DOT11E_STATUS_QSTA_REQ_TIMEOUT 39 /* STA ADDTS request timeout */
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _802_11e_CAC_H_ */
|
|
|
@ -1,37 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* Fundamental types and constants relating to 802.1D
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _802_1_D_
|
|
||||||
#define _802_1_D_
|
|
||||||
|
|
||||||
/* 802.1D priority defines */
|
|
||||||
#define PRIO_8021D_NONE 2 /* None = - */
|
|
||||||
#define PRIO_8021D_BK 1 /* BK - Background */
|
|
||||||
#define PRIO_8021D_BE 0 /* BE - Best-effort */
|
|
||||||
#define PRIO_8021D_EE 3 /* EE - Excellent-effort */
|
|
||||||
#define PRIO_8021D_CL 4 /* CL - Controlled Load */
|
|
||||||
#define PRIO_8021D_VI 5 /* Vi - Video */
|
|
||||||
#define PRIO_8021D_VO 6 /* Vo - Voice */
|
|
||||||
#define PRIO_8021D_NC 7 /* NC - Network Control */
|
|
||||||
#define MAXPRIO 7 /* 0-7 */
|
|
||||||
#define NUMPRIO (MAXPRIO + 1)
|
|
||||||
|
|
||||||
#define ALLPRIO -1 /* All prioirty */
|
|
||||||
|
|
||||||
/* Converts prio to precedence since the numerical value of
|
|
||||||
* PRIO_8021D_BE and PRIO_8021D_NONE are swapped.
|
|
||||||
*/
|
|
||||||
#define PRIO2PREC(prio) \
|
|
||||||
(((prio) == PRIO_8021D_NONE || (prio) == PRIO_8021D_BE) ? ((prio^2)) : (prio))
|
|
||||||
|
|
||||||
#endif /* _802_1_D__ */
|
|
|
@ -1,19 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
|
|
||||||
* the contents of this file may not be disclosed to third parties, copied
|
|
||||||
* or duplicated in any form, in whole or in part, without the prior
|
|
||||||
* written permission of Broadcom Corporation.
|
|
||||||
*
|
|
||||||
* Fundamental constants relating to 802.3
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _802_3_h_
|
|
||||||
#define _802_3_h_
|
|
||||||
|
|
||||||
#define SNAP_HDR_LEN 6 /* 802.3 LLC/SNAP header length */
|
|
||||||
|
|
||||||
#endif /* #ifndef _802_3_h_ */
|
|
|
@ -1,59 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
|
|
||||||
* the contents of this file may not be disclosed to third parties, copied
|
|
||||||
* or duplicated in any form, in whole or in part, without the prior
|
|
||||||
* written permission of Broadcom Corporation.
|
|
||||||
*
|
|
||||||
* Fundamental constants relating to ARP Protocol
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _bcmarp_h_
|
|
||||||
#define _bcmarp_h_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ARP_OPC_OFFSET 6 /* option code offset */
|
|
||||||
#define ARP_SRC_ETH_OFFSET 8 /* src h/w address offset */
|
|
||||||
#define ARP_SRC_IP_OFFSET 14 /* src IP address offset */
|
|
||||||
#define ARP_TGT_ETH_OFFSET 18 /* target h/w address offset */
|
|
||||||
#define ARP_TGT_IP_OFFSET 24 /* target IP address offset */
|
|
||||||
|
|
||||||
#define ARP_OPC_REQUEST 1 /* ARP request */
|
|
||||||
#define ARP_OPC_REPLY 2 /* ARP reply */
|
|
||||||
|
|
||||||
#define ARP_DATA_LEN 28 /* ARP data length */
|
|
||||||
|
|
||||||
struct bcmarp {
|
|
||||||
uint16 htype; /* Header type (1 = ethernet) */
|
|
||||||
uint16 ptype; /* Protocol type (0x800 = IP) */
|
|
||||||
uint8 hlen; /* Hardware address length (Eth = 6) */
|
|
||||||
uint8 plen; /* Protocol address length (IP = 4) */
|
|
||||||
uint16 oper; /* ARP_OPC_... */
|
|
||||||
uint8 src_eth[ETHER_ADDR_LEN]; /* Source hardware address */
|
|
||||||
uint8 src_ip[IPV4_ADDR_LEN]; /* Source protocol address (not aligned) */
|
|
||||||
uint8 dst_eth[ETHER_ADDR_LEN]; /* Destination hardware address */
|
|
||||||
uint8 dst_ip[IPV4_ADDR_LEN]; /* Destination protocol address */
|
|
||||||
} PACKED;
|
|
||||||
|
|
||||||
/* Ethernet header + Arp message */
|
|
||||||
struct bcmetharp {
|
|
||||||
struct ether_header eh;
|
|
||||||
struct bcmarp arp;
|
|
||||||
} PACKED;
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !defined(_bcmarp_h_) */
|
|
|
@ -1,35 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
|
|
||||||
* the contents of this file may not be disclosed to third parties, copied
|
|
||||||
* or duplicated in any form, in whole or in part, without the prior
|
|
||||||
* written permission of Broadcom Corporation.
|
|
||||||
*
|
|
||||||
* Fundamental constants relating to DHCP Protocol
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _bcmdhcp_h_
|
|
||||||
#define _bcmdhcp_h_
|
|
||||||
|
|
||||||
/* DHCP params */
|
|
||||||
#define DHCP_TYPE_OFFSET 0 /* DHCP type (request|reply) offset */
|
|
||||||
#define DHCP_FLAGS_OFFSET 10 /* DHCP flags offset */
|
|
||||||
#define DHCP_CIADDR_OFFSET 12 /* DHCP client IP address offset */
|
|
||||||
#define DHCP_YIADDR_OFFSET 16 /* DHCP your IP address offset */
|
|
||||||
#define DHCP_GIADDR_OFFSET 24 /* DHCP relay agent IP address offset */
|
|
||||||
#define DHCP_CHADDR_OFFSET 28 /* DHCP client h/w address offset */
|
|
||||||
|
|
||||||
#define DHCP_TYPE_REQUEST 1 /* DHCP request (discover|request) */
|
|
||||||
#define DHCP_TYPE_REPLY 2 /* DHCP reply (offset|ack) */
|
|
||||||
|
|
||||||
#define DHCP_PORT_SERVER 67 /* DHCP server UDP port */
|
|
||||||
#define DHCP_PORT_CLIENT 68 /* DHCP client UDP port */
|
|
||||||
|
|
||||||
#define DHCP_FLAG_BCAST 0x8000 /* DHCP broadcast flag */
|
|
||||||
|
|
||||||
#define DHCP_FLAGS_LEN 2 /* DHCP flags field length */
|
|
||||||
|
|
||||||
#endif /* #ifndef _bcmdhcp_h_ */
|
|
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* Broadcom Ethernettype protocol definitions
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Broadcom Ethernet protocol defines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BCMETH_H_
|
|
||||||
#define _BCMETH_H_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ETHER_TYPE_BRCM is defined in ethernet.h */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Following the 2byte BRCM ether_type is a 16bit BRCM subtype field
|
|
||||||
* in one of two formats: (only subtypes 32768-65535 are in use now)
|
|
||||||
*
|
|
||||||
* subtypes 0-32767:
|
|
||||||
* 8 bit subtype (0-127)
|
|
||||||
* 8 bit length in bytes (0-255)
|
|
||||||
*
|
|
||||||
* subtypes 32768-65535:
|
|
||||||
* 16 bit big-endian subtype
|
|
||||||
* 16 bit big-endian length in bytes (0-65535)
|
|
||||||
*
|
|
||||||
* length is the number of additional bytes beyond the 4 or 6 byte header
|
|
||||||
*
|
|
||||||
* Reserved values:
|
|
||||||
* 0 reserved
|
|
||||||
* 5-15 reserved for iLine protocol assignments
|
|
||||||
* 17-126 reserved, assignable
|
|
||||||
* 127 reserved
|
|
||||||
* 32768 reserved
|
|
||||||
* 32769-65534 reserved, assignable
|
|
||||||
* 65535 reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* While adding the subtypes and their specific processing code make sure
|
|
||||||
* bcmeth_bcm_hdr_t is the first data structure in the user specific data structure definition
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BCMILCP_SUBTYPE_RATE 1
|
|
||||||
#define BCMILCP_SUBTYPE_LINK 2
|
|
||||||
#define BCMILCP_SUBTYPE_CSA 3
|
|
||||||
#define BCMILCP_SUBTYPE_LARQ 4
|
|
||||||
#define BCMILCP_SUBTYPE_VENDOR 5
|
|
||||||
#define BCMILCP_SUBTYPE_FLH 17
|
|
||||||
|
|
||||||
#define BCMILCP_SUBTYPE_VENDOR_LONG 32769
|
|
||||||
#define BCMILCP_SUBTYPE_CERT 32770
|
|
||||||
#define BCMILCP_SUBTYPE_SES 32771
|
|
||||||
|
|
||||||
|
|
||||||
#define BCMILCP_BCM_SUBTYPE_RESERVED 0
|
|
||||||
#define BCMILCP_BCM_SUBTYPE_EVENT 1
|
|
||||||
#define BCMILCP_BCM_SUBTYPE_SES 2
|
|
||||||
/*
|
|
||||||
* The EAPOL type is not used anymore. Instead EAPOL messages are now embedded
|
|
||||||
* within BCMILCP_BCM_SUBTYPE_EVENT type messages
|
|
||||||
*/
|
|
||||||
/* #define BCMILCP_BCM_SUBTYPE_EAPOL 3 */
|
|
||||||
|
|
||||||
#define BCMILCP_BCM_SUBTYPEHDR_MINLENGTH 8
|
|
||||||
#define BCMILCP_BCM_SUBTYPEHDR_VERSION 0
|
|
||||||
|
|
||||||
/* These fields are stored in network order */
|
|
||||||
typedef struct bcmeth_hdr
|
|
||||||
{
|
|
||||||
uint16 subtype; /* Vendor specific..32769 */
|
|
||||||
uint16 length;
|
|
||||||
uint8 version; /* Version is 0 */
|
|
||||||
uint8 oui[3]; /* Broadcom OUI */
|
|
||||||
/* user specific Data */
|
|
||||||
uint16 usr_subtype;
|
|
||||||
} PACKED bcmeth_hdr_t;
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _BCMETH_H_ */
|
|
|
@ -1,165 +0,0 @@
|
||||||
/*
|
|
||||||
* Broadcom Event protocol definitions
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Dependencies: proto/bcmeth.h
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Broadcom Ethernet Events protocol defines
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BCMEVENT_H_
|
|
||||||
#define _BCMEVENT_H_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif /* defined(__GNUC__) */
|
|
||||||
|
|
||||||
#define BCM_EVENT_MSG_VERSION 1 /* wl_event_msg_t struct version */
|
|
||||||
#define BCM_MSG_IFNAME_MAX 16 /* max length of interface name */
|
|
||||||
|
|
||||||
/* flags */
|
|
||||||
#define WLC_EVENT_MSG_LINK 0x01 /* link is up */
|
|
||||||
#define WLC_EVENT_MSG_FLUSHTXQ 0x02 /* flush tx queue on MIC error */
|
|
||||||
#define WLC_EVENT_MSG_GROUP 0x04 /* group MIC error */
|
|
||||||
|
|
||||||
/* these fields are stored in network order */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint16 version;
|
|
||||||
uint16 flags; /* see flags below */
|
|
||||||
uint32 event_type; /* Message (see below) */
|
|
||||||
uint32 status; /* Status code (see below) */
|
|
||||||
uint32 reason; /* Reason code (if applicable) */
|
|
||||||
uint32 auth_type; /* WLC_E_AUTH */
|
|
||||||
uint32 datalen; /* data buf */
|
|
||||||
struct ether_addr addr; /* Station address (if applicable) */
|
|
||||||
char ifname[BCM_MSG_IFNAME_MAX]; /* name of the packet incoming interface */
|
|
||||||
} PACKED wl_event_msg_t;
|
|
||||||
|
|
||||||
/* used by driver msgs */
|
|
||||||
typedef struct bcm_event {
|
|
||||||
struct ether_header eth;
|
|
||||||
bcmeth_hdr_t bcm_hdr;
|
|
||||||
wl_event_msg_t event;
|
|
||||||
/* data portion follows */
|
|
||||||
} PACKED bcm_event_t;
|
|
||||||
|
|
||||||
#define BCM_MSG_LEN (sizeof(bcm_event_t) - sizeof(bcmeth_hdr_t) - sizeof(struct ether_header))
|
|
||||||
|
|
||||||
/* Event messages */
|
|
||||||
#define WLC_E_SET_SSID 0 /* indicates status of set SSID */
|
|
||||||
#define WLC_E_JOIN 1 /* differentiates join IBSS from found (WLC_E_START) IBSS */
|
|
||||||
#define WLC_E_START 2 /* STA founded an IBSS or AP started a BSS */
|
|
||||||
#define WLC_E_AUTH 3 /* 802.11 AUTH request */
|
|
||||||
#define WLC_E_AUTH_IND 4 /* 802.11 AUTH indication */
|
|
||||||
#define WLC_E_DEAUTH 5 /* 802.11 DEAUTH request */
|
|
||||||
#define WLC_E_DEAUTH_IND 6 /* 802.11 DEAUTH indication */
|
|
||||||
#define WLC_E_ASSOC 7 /* 802.11 ASSOC request */
|
|
||||||
#define WLC_E_ASSOC_IND 8 /* 802.11 ASSOC indication */
|
|
||||||
#define WLC_E_REASSOC 9 /* 802.11 REASSOC request */
|
|
||||||
#define WLC_E_REASSOC_IND 10 /* 802.11 REASSOC indication */
|
|
||||||
#define WLC_E_DISASSOC 11 /* 802.11 DISASSOC request */
|
|
||||||
#define WLC_E_DISASSOC_IND 12 /* 802.11 DISASSOC indication */
|
|
||||||
#define WLC_E_QUIET_START 13 /* 802.11h Quiet period started */
|
|
||||||
#define WLC_E_QUIET_END 14 /* 802.11h Quiet period ended */
|
|
||||||
#define WLC_E_BEACON_RX 15 /* BEACONS received/lost indication */
|
|
||||||
#define WLC_E_LINK 16 /* generic link indication */
|
|
||||||
#define WLC_E_MIC_ERROR 17 /* TKIP MIC error occurred */
|
|
||||||
#define WLC_E_NDIS_LINK 18 /* NDIS style link indication */
|
|
||||||
#define WLC_E_ROAM 19 /* roam attempt occurred: indicate status & reason */
|
|
||||||
#define WLC_E_TXFAIL 20 /* change in dot11FailedCount (txfail) */
|
|
||||||
#define WLC_E_PMKID_CACHE 21 /* WPA2 pmkid cache indication */
|
|
||||||
#define WLC_E_RETROGRADE_TSF 22 /* current AP's TSF value went backward */
|
|
||||||
#define WLC_E_PRUNE 23 /* AP was pruned from join list for reason */
|
|
||||||
#define WLC_E_AUTOAUTH 24 /* report AutoAuth table entry match for join attempt */
|
|
||||||
#define WLC_E_EAPOL_MSG 25 /* Event encapsulating an EAPOL message */
|
|
||||||
#define WLC_E_SCAN_COMPLETE 26 /* Scan results are ready or scan was aborted */
|
|
||||||
#define WLC_E_ADDTS_IND 27 /* indicate to host addts fail/success */
|
|
||||||
#define WLC_E_DELTS_IND 28 /* indicate to host delts fail/success */
|
|
||||||
#define WLC_E_BCNSENT_IND 29 /* indicate to host of beacon transmit */
|
|
||||||
#define WLC_E_BCNRX_MSG 30 /* Send the received beacon up to the host */
|
|
||||||
#define WLC_E_BCNLOST_MSG 31 /* indicate to host loss of beacon */
|
|
||||||
#define WLC_E_ROAM_PREP 32 /* before attempting to roam */
|
|
||||||
#define WLC_E_PFN_NET_FOUND 33 /* PFN network found event */
|
|
||||||
#define WLC_E_PFN_NET_LOST 34 /* PFN network lost event */
|
|
||||||
|
|
||||||
#ifdef EXT_STA
|
|
||||||
#define WLC_E_RESET_COMPLETE 35
|
|
||||||
#define WLC_E_JOIN_START 36
|
|
||||||
#define WLC_E_ROAM_START 37
|
|
||||||
#define WLC_E_ASSOC_START 38
|
|
||||||
#define WLC_E_IBSS_ASSOC 39
|
|
||||||
#define WLC_E_RADIO 40
|
|
||||||
#define WLC_E_LAST 41 /* highest val + 1 for range checking */
|
|
||||||
#else /* EXT_STA */
|
|
||||||
#define WLC_E_LAST 35 /* highest val + 1 for range checking */
|
|
||||||
#endif /* EXT_STA */
|
|
||||||
|
|
||||||
/* Event status codes */
|
|
||||||
#define WLC_E_STATUS_SUCCESS 0 /* operation was successful */
|
|
||||||
#define WLC_E_STATUS_FAIL 1 /* operation failed */
|
|
||||||
#define WLC_E_STATUS_TIMEOUT 2 /* operation timed out */
|
|
||||||
#define WLC_E_STATUS_NO_NETWORKS 3 /* failed due to no matching network found */
|
|
||||||
#define WLC_E_STATUS_ABORT 4 /* operation was aborted */
|
|
||||||
#define WLC_E_STATUS_NO_ACK 5 /* protocol failure: packet not ack'd */
|
|
||||||
#define WLC_E_STATUS_UNSOLICITED 6 /* AUTH or ASSOC packet was unsolicited */
|
|
||||||
#define WLC_E_STATUS_ATTEMPT 7 /* attempt to assoc to an auto auth configuration */
|
|
||||||
#define WLC_E_STATUS_PARTIAL 8 /* scan results are incomplete */
|
|
||||||
#define WLC_E_STATUS_NEWSCAN 9 /* scan aborted by another scan */
|
|
||||||
#define WLC_E_STATUS_NEWASSOC 10 /* scan aborted due to assoc in progress */
|
|
||||||
#define WLC_E_STATUS_11HQUIET 11 /* 802.11h quiet period started */
|
|
||||||
#define WLC_E_STATUS_SUPPRESS 12 /* user disabled scanning (WLC_SET_SCANSUPPRESS) */
|
|
||||||
#define WLC_E_STATUS_NOCHANS 13 /* no allowable channels to scan */
|
|
||||||
#define WLC_E_STATUS_CCXFASTRM 14 /* scan aborted due to CCX fast roam */
|
|
||||||
|
|
||||||
/* roam reason codes */
|
|
||||||
#define WLC_E_REASON_INITIAL_ASSOC 0 /* initial assoc */
|
|
||||||
#define WLC_E_REASON_LOW_RSSI 1 /* roamed due to low RSSI */
|
|
||||||
#define WLC_E_REASON_DEAUTH 2 /* roamed due to DEAUTH indication */
|
|
||||||
#define WLC_E_REASON_DISASSOC 3 /* roamed due to DISASSOC indication */
|
|
||||||
#define WLC_E_REASON_BCNS_LOST 4 /* roamed due to lost beacons */
|
|
||||||
#define WLC_E_REASON_FAST_ROAM_FAILED 5 /* roamed due to fast roam failure */
|
|
||||||
#define WLC_E_REASON_DIRECTED_ROAM 6 /* roamed due to request by AP */
|
|
||||||
#define WLC_E_REASON_TSPEC_REJECTED 7 /* roamed due to TSPEC rejection */
|
|
||||||
#define WLC_E_REASON_BETTER_AP 8 /* roamed due to finding better AP */
|
|
||||||
|
|
||||||
/* prune reason codes */
|
|
||||||
#define WLC_E_PRUNE_ENCR_MISMATCH 1 /* encryption mismatch */
|
|
||||||
#define WLC_E_PRUNE_BCAST_BSSID 2 /* AP uses a broadcast BSSID */
|
|
||||||
#define WLC_E_PRUNE_MAC_DENY 3 /* STA's MAC addr is in AP's MAC deny list */
|
|
||||||
#define WLC_E_PRUNE_MAC_NA 4 /* STA's MAC addr is not in AP's MAC allow list */
|
|
||||||
#define WLC_E_PRUNE_REG_PASSV 5 /* AP not allowed due to regulatory restriction */
|
|
||||||
#define WLC_E_PRUNE_SPCT_MGMT 6 /* AP does not support STA locale spectrum mgmt */
|
|
||||||
#define WLC_E_PRUNE_RADAR 7 /* AP is on a radar channel of STA locale */
|
|
||||||
#define WLC_E_RSN_MISMATCH 8 /* STA does not support AP's RSN */
|
|
||||||
#define WLC_E_PRUNE_NO_COMMON_RATES 9 /* No rates in common with AP */
|
|
||||||
#define WLC_E_PRUNE_BASIC_RATES 10 /* STA does not support all basic rates of BSS */
|
|
||||||
#define WLC_E_PRUNE_CIPHER_NA 12 /* BSS's cipher not supported */
|
|
||||||
#define WLC_E_PRUNE_KNOWN_STA 13 /* AP is already known to us as a STA */
|
|
||||||
#define WLC_E_PRUNE_WDS_PEER 15 /* AP is already known to us as a WDS peer */
|
|
||||||
#define WLC_E_PRUNE_QBSS_LOAD 16 /* QBSS LOAD - AAC is too low */
|
|
||||||
#define WLC_E_PRUNE_HOME_AP 17 /* prune home AP */
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif /* PACKED */
|
|
||||||
|
|
||||||
#endif /* _BCMEVENT_H_ */
|
|
|
@ -1,151 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* Fundamental constants relating to IP Protocol
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _bcmip_h_
|
|
||||||
#define _bcmip_h_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* IPV4 and IPV6 common */
|
|
||||||
#define IP_VER_OFFSET 0x0 /* offset to version field */
|
|
||||||
#define IP_VER_MASK 0xf0 /* version mask */
|
|
||||||
#define IP_VER_SHIFT 4 /* version shift */
|
|
||||||
#define IP_VER_4 4 /* version number for IPV4 */
|
|
||||||
#define IP_VER_6 6 /* version number for IPV6 */
|
|
||||||
|
|
||||||
#define IP_VER(ip_body) \
|
|
||||||
((((uint8 *)(ip_body))[IP_VER_OFFSET] & IP_VER_MASK) >> IP_VER_SHIFT)
|
|
||||||
|
|
||||||
#define IP_PROT_ICMP 0x1 /* ICMP protocol */
|
|
||||||
#define IP_PROT_TCP 0x6 /* TCP protocol */
|
|
||||||
#define IP_PROT_UDP 0x11 /* UDP protocol type */
|
|
||||||
|
|
||||||
/* IPV4 field offsets */
|
|
||||||
#define IPV4_VER_HL_OFFSET 0 /* version and ihl byte offset */
|
|
||||||
#define IPV4_TOS_OFFSET 1 /* type of service offset */
|
|
||||||
#define IPV4_PKTLEN_OFFSET 2 /* packet length offset */
|
|
||||||
#define IPV4_PKTFLAG_OFFSET 6 /* more-frag,dont-frag flag offset */
|
|
||||||
#define IPV4_PROT_OFFSET 9 /* protocol type offset */
|
|
||||||
#define IPV4_CHKSUM_OFFSET 10 /* IP header checksum offset */
|
|
||||||
#define IPV4_SRC_IP_OFFSET 12 /* src IP addr offset */
|
|
||||||
#define IPV4_DEST_IP_OFFSET 16 /* dest IP addr offset */
|
|
||||||
#define IPV4_OPTIONS_OFFSET 20 /* IP options offset */
|
|
||||||
|
|
||||||
/* IPV4 field decodes */
|
|
||||||
#define IPV4_VER_MASK 0xf0 /* IPV4 version mask */
|
|
||||||
#define IPV4_VER_SHIFT 4 /* IPV4 version shift */
|
|
||||||
|
|
||||||
#define IPV4_HLEN_MASK 0x0f /* IPV4 header length mask */
|
|
||||||
#define IPV4_HLEN(ipv4_body) (4 * (((uint8 *)(ipv4_body))[IPV4_VER_HL_OFFSET] & IPV4_HLEN_MASK))
|
|
||||||
|
|
||||||
#define IPV4_ADDR_LEN 4 /* IPV4 address length */
|
|
||||||
|
|
||||||
#define IPV4_ADDR_NULL(a) ((((uint8 *)(a))[0] | ((uint8 *)(a))[1] | \
|
|
||||||
((uint8 *)(a))[2] | ((uint8 *)(a))[3]) == 0)
|
|
||||||
|
|
||||||
#define IPV4_ADDR_BCAST(a) ((((uint8 *)(a))[0] & ((uint8 *)(a))[1] & \
|
|
||||||
((uint8 *)(a))[2] & ((uint8 *)(a))[3]) == 0xff)
|
|
||||||
|
|
||||||
#define IPV4_TOS_DSCP_MASK 0xfc /* DiffServ codepoint mask */
|
|
||||||
#define IPV4_TOS_DSCP_SHIFT 2 /* DiffServ codepoint shift */
|
|
||||||
|
|
||||||
#define IPV4_TOS(ipv4_body) (((uint8 *)(ipv4_body))[IPV4_TOS_OFFSET])
|
|
||||||
|
|
||||||
#define IPV4_TOS_PREC_MASK 0xe0 /* Historical precedence mask */
|
|
||||||
#define IPV4_TOS_PREC_SHIFT 5 /* Historical precedence shift */
|
|
||||||
|
|
||||||
#define IPV4_TOS_LOWDELAY 0x10 /* Lowest delay requested */
|
|
||||||
#define IPV4_TOS_THROUGHPUT 0x8 /* Best throughput requested */
|
|
||||||
#define IPV4_TOS_RELIABILITY 0x4 /* Most reliable delivery requested */
|
|
||||||
|
|
||||||
#define IPV4_PROT(ipv4_body) (((uint8 *)(ipv4_body))[IPV4_PROT_OFFSET])
|
|
||||||
|
|
||||||
#define IPV4_FRAG_RESV 0x8000 /* Reserved */
|
|
||||||
#define IPV4_FRAG_DONT 0x4000 /* Don't fragment */
|
|
||||||
#define IPV4_FRAG_MORE 0x2000 /* More fragments */
|
|
||||||
#define IPV4_FRAG_OFFSET_MASK 0x1fff /* Fragment offset */
|
|
||||||
|
|
||||||
#define IPV4_ADDR_STR_LEN 16 /* Max IP address length in string format */
|
|
||||||
|
|
||||||
/* IPv4, no options only. */
|
|
||||||
#define IPV4_NO_OPTIONS_HDR_LEN 20
|
|
||||||
#define IPV4_NO_OPTIONS_PAYLOAD(ip_hdr) (&(((uint8 *)(ip_hdr))[IPV4_NO_OPTIONS_HDR_LEN]))
|
|
||||||
|
|
||||||
#define IPV4_PAYLOAD_LEN(ip_body) \
|
|
||||||
(((int)(((uint8 *)(ip_body))[IPV4_PKTLEN_OFFSET + 0]) << 8) | \
|
|
||||||
((uint8 *)(ip_body))[IPV4_PKTLEN_OFFSET + 1])
|
|
||||||
|
|
||||||
/* IPV4 packet formats */
|
|
||||||
struct ipv4_addr {
|
|
||||||
uint8 addr[IPV4_ADDR_LEN];
|
|
||||||
} PACKED;
|
|
||||||
|
|
||||||
struct ipv4_hdr {
|
|
||||||
uint8 version_ihl; /* Version and Internet Header Length */
|
|
||||||
uint8 tos; /* Type Of Service */
|
|
||||||
uint16 tot_len; /* Number of bytes in packet (max 65535) */
|
|
||||||
uint16 id;
|
|
||||||
uint16 frag; /* 3 flag bits and fragment offset */
|
|
||||||
uint8 ttl; /* Time To Live */
|
|
||||||
uint8 prot; /* Protocol */
|
|
||||||
uint16 hdr_chksum; /* IP header checksum */
|
|
||||||
uint8 src_ip[IPV4_ADDR_LEN]; /* Source IP Address */
|
|
||||||
uint8 dst_ip[IPV4_ADDR_LEN]; /* Destination IP Address */
|
|
||||||
} PACKED;
|
|
||||||
|
|
||||||
/* IPV6 field offsets */
|
|
||||||
#define IPV6_PAYLOAD_LEN_OFFSET 4 /* payload length offset */
|
|
||||||
#define IPV6_NEXT_HDR_OFFSET 6 /* next header/protocol offset */
|
|
||||||
#define IPV6_HOP_LIMIT_OFFSET 7 /* hop limit offset */
|
|
||||||
#define IPV6_SRC_IP_OFFSET 8 /* src IP addr offset */
|
|
||||||
#define IPV6_DEST_IP_OFFSET 24 /* dst IP addr offset */
|
|
||||||
|
|
||||||
/* IPV6 field decodes */
|
|
||||||
#define IPV6_TRAFFIC_CLASS(ipv6_body) \
|
|
||||||
(((((uint8 *)(ipv6_body))[0] & 0x0f) << 4) | \
|
|
||||||
((((uint8 *)(ipv6_body))[1] & 0xf0) >> 4))
|
|
||||||
|
|
||||||
#define IPV6_FLOW_LABEL(ipv6_body) \
|
|
||||||
(((((uint8 *)(ipv6_body))[1] & 0x0f) << 16) | \
|
|
||||||
(((uint8 *)(ipv6_body))[2] << 8) | \
|
|
||||||
(((uint8 *)(ipv6_body))[3]))
|
|
||||||
|
|
||||||
#define IPV6_PAYLOAD_LEN(ipv6_body) \
|
|
||||||
((((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 0] << 8) | \
|
|
||||||
((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 1])
|
|
||||||
|
|
||||||
#define IPV6_NEXT_HDR(ipv6_body) \
|
|
||||||
(((uint8 *)(ipv6_body))[IPV6_NEXT_HDR_OFFSET])
|
|
||||||
|
|
||||||
#define IPV6_PROT(ipv6_body) IPV6_NEXT_HDR(ipv6_body)
|
|
||||||
|
|
||||||
#define IPV6_ADDR_LEN 16 /* IPV6 address length */
|
|
||||||
|
|
||||||
/* IPV4 TOS or IPV6 Traffic Classifier or 0 */
|
|
||||||
#define IP_TOS(ip_body) \
|
|
||||||
(IP_VER(ip_body) == IP_VER_4 ? IPV4_TOS(ip_body) : \
|
|
||||||
IP_VER(ip_body) == IP_VER_6 ? IPV6_TRAFFIC_CLASS(ip_body) : 0)
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _bcmip_h_ */
|
|
|
@ -1,67 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* Fundamental constants relating to TCP Protocol
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _bcmtcp_h_
|
|
||||||
#define _bcmtcp_h_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TCP_SRC_PORT_OFFSET 0 /* TCP source port offset */
|
|
||||||
#define TCP_DEST_PORT_OFFSET 2 /* TCP dest port offset */
|
|
||||||
#define TCP_CHKSUM_OFFSET 16 /* TCP body checksum offset */
|
|
||||||
|
|
||||||
/* These fields are stored in network order */
|
|
||||||
struct bcmtcp_hdr
|
|
||||||
{
|
|
||||||
uint16 src_port; /* Source Port Address */
|
|
||||||
uint16 dst_port; /* Destination Port Address */
|
|
||||||
uint32 seq_num; /* TCP Sequence Number */
|
|
||||||
uint32 ack_num; /* TCP Sequence Number */
|
|
||||||
uint16 hdrlen_rsvd_flags; /* Header length, reserved bits and flags */
|
|
||||||
uint16 tcpwin; /* TCP window */
|
|
||||||
uint16 chksum; /* Segment checksum with pseudoheader */
|
|
||||||
uint16 urg_ptr; /* Points to seq-num of byte following urg data */
|
|
||||||
} PACKED;
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Byte offset of flags in TCP header */
|
|
||||||
#define TCP_FLAGS_OFFSET 13
|
|
||||||
|
|
||||||
#define TCP_FLAGS_FIN 0x01
|
|
||||||
#define TCP_FLAGS_SYN 0x02
|
|
||||||
#define TCP_FLAGS_RST 0x03
|
|
||||||
#define TCP_FLAGS_PSH 0x04
|
|
||||||
#define TCP_FLAGS_ACK 0x10
|
|
||||||
#define TCP_FLAGS_URG 0x20
|
|
||||||
#define TCP_FLAGS_ECN 0x40
|
|
||||||
#define TCP_FLAGS_CWR 0x80
|
|
||||||
|
|
||||||
#define TCP_FLAGS(tcp_hdr) (((uint8 *)(tcp_hdr))[TCP_FLAGS_OFFSET])
|
|
||||||
#define TCP_IS_ACK(tcp_hdr) (TCP_FLAGS(tcp_hdr) & TCP_FLAGS_ACK)
|
|
||||||
|
|
||||||
#define TCP_SRC_PORT(tcp_hdr) (ntoh16(((struct bcmtcp_hdr*)(tcp_hdr))->src_port))
|
|
||||||
#define TCP_DST_PORT(tcp_hdr) (ntoh16(((struct bcmtcp_hdr*)(tcp_hdr))->dst_port))
|
|
||||||
#define TCP_SEQ_NUM(tcp_hdr) (ntoh32(((struct bcmtcp_hdr*)(tcp_hdr))->seq_num))
|
|
||||||
#define TCP_ACK_NUM(tcp_hdr) (ntoh32(((struct bcmtcp_hdr*)(tcp_hdr))->ack_num))
|
|
||||||
|
|
||||||
#endif /* #ifndef _bcmtcp_h_ */
|
|
|
@ -1,47 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
|
|
||||||
* the contents of this file may not be disclosed to third parties, copied
|
|
||||||
* or duplicated in any form, in whole or in part, without the prior
|
|
||||||
* written permission of Broadcom Corporation.
|
|
||||||
*
|
|
||||||
* Fundamental constants relating to UDP Protocol
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _bcmudp_h_
|
|
||||||
#define _bcmudp_h_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* UDP header */
|
|
||||||
#define UDP_DEST_PORT_OFFSET 2 /* UDP dest port offset */
|
|
||||||
#define UDP_LEN_OFFSET 4 /* UDP length offset */
|
|
||||||
#define UDP_CHKSUM_OFFSET 6 /* UDP body checksum offset */
|
|
||||||
|
|
||||||
#define UDP_HDR_LEN 8 /* UDP header length */
|
|
||||||
#define UDP_PORT_LEN 2 /* UDP port length */
|
|
||||||
|
|
||||||
/* These fields are stored in network order */
|
|
||||||
struct bcmudp_hdr
|
|
||||||
{
|
|
||||||
uint16 src_port; /* Source Port Address */
|
|
||||||
uint16 dst_port; /* Destination Port Address */
|
|
||||||
uint16 len; /* Number of bytes in datagram including header */
|
|
||||||
uint16 chksum; /* entire datagram checksum with pseudoheader */
|
|
||||||
} PACKED;
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* #ifndef _bcmudp_h_ */
|
|
|
@ -1,44 +0,0 @@
|
||||||
/*
|
|
||||||
* Extensible Authentication Protocol (EAP) definitions
|
|
||||||
*
|
|
||||||
* See
|
|
||||||
* RFC 2284: PPP Extensible Authentication Protocol (EAP)
|
|
||||||
*
|
|
||||||
* Copyright (C) 2002 Broadcom Corporation
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _eap_h_
|
|
||||||
#define _eap_h_
|
|
||||||
|
|
||||||
/* EAP packet format */
|
|
||||||
typedef struct {
|
|
||||||
unsigned char code; /* EAP code */
|
|
||||||
unsigned char id; /* Current request ID */
|
|
||||||
unsigned short length; /* Length including header */
|
|
||||||
unsigned char type; /* EAP type (optional) */
|
|
||||||
unsigned char data[1]; /* Type data (optional) */
|
|
||||||
} eap_header_t;
|
|
||||||
|
|
||||||
#define EAP_HEADER_LEN 4
|
|
||||||
|
|
||||||
/* EAP codes */
|
|
||||||
#define EAP_REQUEST 1
|
|
||||||
#define EAP_RESPONSE 2
|
|
||||||
#define EAP_SUCCESS 3
|
|
||||||
#define EAP_FAILURE 4
|
|
||||||
|
|
||||||
/* EAP types */
|
|
||||||
#define EAP_IDENTITY 1
|
|
||||||
#define EAP_NOTIFICATION 2
|
|
||||||
#define EAP_NAK 3
|
|
||||||
#define EAP_MD5 4
|
|
||||||
#define EAP_OTP 5
|
|
||||||
#define EAP_GTC 6
|
|
||||||
#define EAP_TLS 13
|
|
||||||
#define EAP_EXPANDED 254
|
|
||||||
#define BCM_EAP_SES 10
|
|
||||||
#define BCM_EAP_EXP_LEN 12 /* EAP_LEN 5 + 3 bytes for SMI ID + 4 bytes for ven type */
|
|
||||||
#define BCM_SMI_ID 0x113d
|
|
||||||
|
|
||||||
#endif /* _eap_h_ */
|
|
|
@ -1,178 +0,0 @@
|
||||||
/*
|
|
||||||
* 802.1x EAPOL definitions
|
|
||||||
*
|
|
||||||
* See
|
|
||||||
* IEEE Std 802.1X-2001
|
|
||||||
* IEEE 802.1X RADIUS Usage Guidelines
|
|
||||||
*
|
|
||||||
* Copyright (C) 2002 Broadcom Corporation
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _eapol_h_
|
|
||||||
#define _eapol_h_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <bcmcrypto/aeskeywrap.h>
|
|
||||||
|
|
||||||
/* EAPOL for 802.3/Ethernet */
|
|
||||||
typedef struct {
|
|
||||||
struct ether_header eth; /* 802.3/Ethernet header */
|
|
||||||
unsigned char version; /* EAPOL protocol version */
|
|
||||||
unsigned char type; /* EAPOL type */
|
|
||||||
unsigned short length; /* Length of body */
|
|
||||||
unsigned char body[1]; /* Body (optional) */
|
|
||||||
} eapol_header_t;
|
|
||||||
|
|
||||||
#define EAPOL_HEADER_LEN 18
|
|
||||||
|
|
||||||
/* EAPOL version */
|
|
||||||
#define WPA2_EAPOL_VERSION 2
|
|
||||||
#define WPA_EAPOL_VERSION 1
|
|
||||||
#define LEAP_EAPOL_VERSION 1
|
|
||||||
#define SES_EAPOL_VERSION 1
|
|
||||||
|
|
||||||
/* EAPOL types */
|
|
||||||
#define EAP_PACKET 0
|
|
||||||
#define EAPOL_START 1
|
|
||||||
#define EAPOL_LOGOFF 2
|
|
||||||
#define EAPOL_KEY 3
|
|
||||||
#define EAPOL_ASF 4
|
|
||||||
|
|
||||||
/* EAPOL-Key types */
|
|
||||||
#define EAPOL_RC4_KEY 1
|
|
||||||
#ifdef BCMWPA2
|
|
||||||
#define EAPOL_WPA2_KEY 2 /* 802.11i/WPA2 */
|
|
||||||
#endif
|
|
||||||
#define EAPOL_WPA_KEY 254 /* WPA */
|
|
||||||
|
|
||||||
/* RC4 EAPOL-Key header field sizes */
|
|
||||||
#define EAPOL_KEY_REPLAY_LEN 8
|
|
||||||
#define EAPOL_KEY_IV_LEN 16
|
|
||||||
#define EAPOL_KEY_SIG_LEN 16
|
|
||||||
|
|
||||||
/* RC4 EAPOL-Key */
|
|
||||||
typedef struct {
|
|
||||||
unsigned char type; /* Key Descriptor Type */
|
|
||||||
unsigned short length; /* Key Length (unaligned) */
|
|
||||||
unsigned char replay[EAPOL_KEY_REPLAY_LEN]; /* Replay Counter */
|
|
||||||
unsigned char iv[EAPOL_KEY_IV_LEN]; /* Key IV */
|
|
||||||
unsigned char index; /* Key Flags & Index */
|
|
||||||
unsigned char signature[EAPOL_KEY_SIG_LEN]; /* Key Signature */
|
|
||||||
unsigned char key[1]; /* Key (optional) */
|
|
||||||
} PACKED eapol_key_header_t;
|
|
||||||
|
|
||||||
#define EAPOL_KEY_HEADER_LEN 44
|
|
||||||
|
|
||||||
/* RC4 EAPOL-Key flags */
|
|
||||||
#define EAPOL_KEY_FLAGS_MASK 0x80
|
|
||||||
#define EAPOL_KEY_BROADCAST 0
|
|
||||||
#define EAPOL_KEY_UNICAST 0x80
|
|
||||||
|
|
||||||
/* RC4 EAPOL-Key index */
|
|
||||||
#define EAPOL_KEY_INDEX_MASK 0x7f
|
|
||||||
|
|
||||||
/* WPA/802.11i/WPA2 EAPOL-Key header field sizes */
|
|
||||||
#define EAPOL_WPA_KEY_REPLAY_LEN 8
|
|
||||||
#define EAPOL_WPA_KEY_NONCE_LEN 32
|
|
||||||
#define EAPOL_WPA_KEY_IV_LEN 16
|
|
||||||
#define EAPOL_WPA_KEY_RSC_LEN 8
|
|
||||||
#define EAPOL_WPA_KEY_ID_LEN 8
|
|
||||||
#define EAPOL_WPA_KEY_MIC_LEN 16
|
|
||||||
#define EAPOL_WPA_KEY_DATA_LEN (EAPOL_WPA_MAX_KEY_SIZE + AKW_BLOCK_LEN)
|
|
||||||
#define EAPOL_WPA_MAX_KEY_SIZE 32
|
|
||||||
|
|
||||||
/* WPA EAPOL-Key */
|
|
||||||
typedef struct {
|
|
||||||
unsigned char type; /* Key Descriptor Type */
|
|
||||||
unsigned short key_info; /* Key Information (unaligned) */
|
|
||||||
unsigned short key_len; /* Key Length (unaligned) */
|
|
||||||
unsigned char replay[EAPOL_WPA_KEY_REPLAY_LEN]; /* Replay Counter */
|
|
||||||
unsigned char nonce[EAPOL_WPA_KEY_NONCE_LEN]; /* Nonce */
|
|
||||||
unsigned char iv[EAPOL_WPA_KEY_IV_LEN]; /* Key IV */
|
|
||||||
unsigned char rsc[EAPOL_WPA_KEY_RSC_LEN]; /* Key RSC */
|
|
||||||
unsigned char id[EAPOL_WPA_KEY_ID_LEN]; /* WPA:Key ID, 802.11i/WPA2: Reserved */
|
|
||||||
unsigned char mic[EAPOL_WPA_KEY_MIC_LEN]; /* Key MIC */
|
|
||||||
unsigned short data_len; /* Key Data Length */
|
|
||||||
unsigned char data[EAPOL_WPA_KEY_DATA_LEN]; /* Key data */
|
|
||||||
} PACKED eapol_wpa_key_header_t;
|
|
||||||
|
|
||||||
#define EAPOL_WPA_KEY_LEN 95
|
|
||||||
|
|
||||||
/* WPA/802.11i/WPA2 KEY KEY_INFO bits */
|
|
||||||
#define WPA_KEY_DESC_V1 0x01
|
|
||||||
#define WPA_KEY_DESC_V2 0x02
|
|
||||||
#define WPA_KEY_PAIRWISE 0x08
|
|
||||||
#define WPA_KEY_INSTALL 0x40
|
|
||||||
#define WPA_KEY_ACK 0x80
|
|
||||||
#define WPA_KEY_MIC 0x100
|
|
||||||
#define WPA_KEY_SECURE 0x200
|
|
||||||
#define WPA_KEY_ERROR 0x400
|
|
||||||
#define WPA_KEY_REQ 0x800
|
|
||||||
|
|
||||||
/* WPA-only KEY KEY_INFO bits */
|
|
||||||
#define WPA_KEY_INDEX_0 0x00
|
|
||||||
#define WPA_KEY_INDEX_1 0x10
|
|
||||||
#define WPA_KEY_INDEX_2 0x20
|
|
||||||
#define WPA_KEY_INDEX_3 0x30
|
|
||||||
#define WPA_KEY_INDEX_MASK 0x30
|
|
||||||
#define WPA_KEY_INDEX_SHIFT 0x04
|
|
||||||
|
|
||||||
#ifdef BCMWPA2
|
|
||||||
/* 802.11i/WPA2-only KEY KEY_INFO bits */
|
|
||||||
#define WPA_KEY_ENCRYPTED_DATA 0x1000
|
|
||||||
|
|
||||||
/* Key Data encapsulation */
|
|
||||||
typedef struct {
|
|
||||||
uint8 type;
|
|
||||||
uint8 length;
|
|
||||||
uint8 oui[3];
|
|
||||||
uint8 subtype;
|
|
||||||
uint8 data[1];
|
|
||||||
} PACKED eapol_wpa2_encap_data_t;
|
|
||||||
|
|
||||||
#define EAPOL_WPA2_ENCAP_DATA_HDR_LEN 6
|
|
||||||
|
|
||||||
#define WPA2_KEY_DATA_SUBTYPE_GTK 1
|
|
||||||
#define WPA2_KEY_DATA_SUBTYPE_STAKEY 2
|
|
||||||
#define WPA2_KEY_DATA_SUBTYPE_MAC 3
|
|
||||||
#define WPA2_KEY_DATA_SUBTYPE_PMKID 4
|
|
||||||
|
|
||||||
/* GTK encapsulation */
|
|
||||||
typedef struct {
|
|
||||||
uint8 flags;
|
|
||||||
uint8 reserved;
|
|
||||||
uint8 gtk[EAPOL_WPA_MAX_KEY_SIZE];
|
|
||||||
} PACKED eapol_wpa2_key_gtk_encap_t;
|
|
||||||
|
|
||||||
#define EAPOL_WPA2_KEY_GTK_ENCAP_HDR_LEN 2
|
|
||||||
|
|
||||||
#define WPA2_GTK_INDEX_MASK 0x03
|
|
||||||
#define WPA2_GTK_INDEX_SHIFT 0x00
|
|
||||||
|
|
||||||
#define WPA2_GTK_TRANSMIT 0x04
|
|
||||||
|
|
||||||
/* STAKey encapsulation */
|
|
||||||
typedef struct {
|
|
||||||
uint8 reserved[2];
|
|
||||||
uint8 mac[ETHER_ADDR_LEN];
|
|
||||||
uint8 stakey[EAPOL_WPA_MAX_KEY_SIZE];
|
|
||||||
} PACKED eapol_wpa2_key_stakey_encap_t;
|
|
||||||
|
|
||||||
#define WPA2_KEY_DATA_PAD 0xdd
|
|
||||||
|
|
||||||
#endif /* BCMWPA2 */
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _eapol_h_ */
|
|
|
@ -1,174 +0,0 @@
|
||||||
/*
|
|
||||||
* From FreeBSD 2.2.7: Fundamental constants relating to ethernet.
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _NET_ETHERNET_H_ /* use native BSD ethernet.h when available */
|
|
||||||
#define _NET_ETHERNET_H_
|
|
||||||
|
|
||||||
#ifndef _TYPEDEFS_H_
|
|
||||||
#include "typedefs.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of bytes in an ethernet (MAC) address.
|
|
||||||
*/
|
|
||||||
#define ETHER_ADDR_LEN 6
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of bytes in the type field.
|
|
||||||
*/
|
|
||||||
#define ETHER_TYPE_LEN 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of bytes in the trailing CRC field.
|
|
||||||
*/
|
|
||||||
#define ETHER_CRC_LEN 4
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The length of the combined header.
|
|
||||||
*/
|
|
||||||
#define ETHER_HDR_LEN (ETHER_ADDR_LEN * 2 + ETHER_TYPE_LEN)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The minimum packet length.
|
|
||||||
*/
|
|
||||||
#define ETHER_MIN_LEN 64
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The minimum packet user data length.
|
|
||||||
*/
|
|
||||||
#define ETHER_MIN_DATA 46
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum packet length.
|
|
||||||
*/
|
|
||||||
#define ETHER_MAX_LEN 1518
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum packet user data length.
|
|
||||||
*/
|
|
||||||
#define ETHER_MAX_DATA 1500
|
|
||||||
|
|
||||||
/* ether types */
|
|
||||||
#define ETHER_TYPE_MIN 0x0600 /* Anything less than MIN is a length */
|
|
||||||
#define ETHER_TYPE_IP 0x0800 /* IP */
|
|
||||||
#define ETHER_TYPE_ARP 0x0806 /* ARP */
|
|
||||||
#define ETHER_TYPE_8021Q 0x8100 /* 802.1Q */
|
|
||||||
#define ETHER_TYPE_BRCM 0x886c /* Broadcom Corp. */
|
|
||||||
#define ETHER_TYPE_802_1X 0x888e /* 802.1x */
|
|
||||||
#ifdef BCMWPA2
|
|
||||||
#define ETHER_TYPE_802_1X_PREAUTH 0x88c7 /* 802.1x preauthentication */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Broadcom subtype follows ethertype; First 2 bytes are reserved; Next 2 are subtype; */
|
|
||||||
#define ETHER_BRCM_SUBTYPE_LEN 4 /* Broadcom 4 byte subtype */
|
|
||||||
#define ETHER_BRCM_CRAM 0x1 /* Broadcom subtype cram protocol */
|
|
||||||
|
|
||||||
/* ether header */
|
|
||||||
#define ETHER_DEST_OFFSET (0 * ETHER_ADDR_LEN) /* dest address offset */
|
|
||||||
#define ETHER_SRC_OFFSET (1 * ETHER_ADDR_LEN) /* src address offset */
|
|
||||||
#define ETHER_TYPE_OFFSET (2 * ETHER_ADDR_LEN) /* ether type offset */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A macro to validate a length with
|
|
||||||
*/
|
|
||||||
#define ETHER_IS_VALID_LEN(foo) \
|
|
||||||
((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN)
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __INCif_etherh /* Quick and ugly hack for VxWorks */
|
|
||||||
/*
|
|
||||||
* Structure of a 10Mb/s Ethernet header.
|
|
||||||
*/
|
|
||||||
struct ether_header {
|
|
||||||
uint8 ether_dhost[ETHER_ADDR_LEN];
|
|
||||||
uint8 ether_shost[ETHER_ADDR_LEN];
|
|
||||||
uint16 ether_type;
|
|
||||||
} PACKED;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Structure of a 48-bit Ethernet address.
|
|
||||||
*/
|
|
||||||
#ifndef NOETHREQ /* Quick and ugly hack for VxWorks */
|
|
||||||
struct ether_addr {
|
|
||||||
uint8 octet[ETHER_ADDR_LEN];
|
|
||||||
} PACKED;
|
|
||||||
#endif
|
|
||||||
#endif /* !__INCif_etherh Quick and ugly hack for VxWorks */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Takes a pointer, set, test, clear, toggle locally admininistered
|
|
||||||
* address bit in the 48-bit Ethernet address.
|
|
||||||
*/
|
|
||||||
#define ETHER_SET_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] | 2))
|
|
||||||
#define ETHER_IS_LOCALADDR(ea) (((uint8 *)(ea))[0] & 2)
|
|
||||||
#define ETHER_CLR_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] & 0xd))
|
|
||||||
#define ETHER_TOGGLE_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] ^ 2))
|
|
||||||
|
|
||||||
/* Takes a pointer, marks unicast address bit in the MAC address */
|
|
||||||
#define ETHER_SET_UNICAST(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] & ~1))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Takes a pointer, returns true if a 48-bit multicast address
|
|
||||||
* (including broadcast, since it is all ones)
|
|
||||||
*/
|
|
||||||
#define ETHER_ISMULTI(ea) (((const uint8 *)(ea))[0] & 1)
|
|
||||||
|
|
||||||
|
|
||||||
/* compare two ethernet addresses - assumes the pointers can be referenced as shorts */
|
|
||||||
#define ether_cmp(a, b) (!(((short*)a)[0] == ((short*)b)[0]) | \
|
|
||||||
!(((short*)a)[1] == ((short*)b)[1]) | \
|
|
||||||
!(((short*)a)[2] == ((short*)b)[2]))
|
|
||||||
|
|
||||||
/* copy an ethernet address - assumes the pointers can be referenced as shorts */
|
|
||||||
#define ether_copy(s, d) { \
|
|
||||||
((short*)d)[0] = ((short*)s)[0]; \
|
|
||||||
((short*)d)[1] = ((short*)s)[1]; \
|
|
||||||
((short*)d)[2] = ((short*)s)[2]; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Takes a pointer, returns true if a 48-bit broadcast (all ones)
|
|
||||||
*/
|
|
||||||
#define ETHER_ISBCAST(ea) ((((uint8 *)(ea))[0] & \
|
|
||||||
((uint8 *)(ea))[1] & \
|
|
||||||
((uint8 *)(ea))[2] & \
|
|
||||||
((uint8 *)(ea))[3] & \
|
|
||||||
((uint8 *)(ea))[4] & \
|
|
||||||
((uint8 *)(ea))[5]) == 0xff)
|
|
||||||
|
|
||||||
static const struct ether_addr ether_bcast = {{255, 255, 255, 255, 255, 255}};
|
|
||||||
static const struct ether_addr ether_null = {{0, 0, 0, 0, 0, 0}};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Takes a pointer, returns true if a 48-bit null address (all zeros)
|
|
||||||
*/
|
|
||||||
#define ETHER_ISNULLADDR(ea) ((((uint8 *)(ea))[0] | \
|
|
||||||
((uint8 *)(ea))[1] | \
|
|
||||||
((uint8 *)(ea))[2] | \
|
|
||||||
((uint8 *)(ea))[3] | \
|
|
||||||
((uint8 *)(ea))[4] | \
|
|
||||||
((uint8 *)(ea))[5]) == 0)
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _NET_ETHERNET_H_ */
|
|
|
@ -1,51 +0,0 @@
|
||||||
/*
|
|
||||||
* 802.1Q VLAN protocol definitions
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _vlan_h_
|
|
||||||
#define _vlan_h_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define VLAN_VID_MASK 0xfff /* low 12 bits are vlan id */
|
|
||||||
#define VLAN_CFI_SHIFT 12 /* canonical format indicator bit */
|
|
||||||
#define VLAN_PRI_SHIFT 13 /* user priority */
|
|
||||||
|
|
||||||
#define VLAN_PRI_MASK 7 /* 3 bits of priority */
|
|
||||||
|
|
||||||
#define VLAN_TAG_LEN 4
|
|
||||||
#define VLAN_TAG_OFFSET (2 * ETHER_ADDR_LEN) /* offset in Ethernet II packet only */
|
|
||||||
|
|
||||||
#define VLAN_TPID 0x8100 /* VLAN ethertype/Tag Protocol ID */
|
|
||||||
|
|
||||||
struct ethervlan_header {
|
|
||||||
uint8 ether_dhost[ETHER_ADDR_LEN];
|
|
||||||
uint8 ether_shost[ETHER_ADDR_LEN];
|
|
||||||
uint16 vlan_type; /* 0x8100 */
|
|
||||||
uint16 vlan_tag; /* priority, cfi and vid */
|
|
||||||
uint16 ether_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ETHERVLAN_HDR_LEN (ETHER_HDR_LEN + VLAN_TAG_LEN)
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _vlan_h_ */
|
|
|
@ -1,157 +0,0 @@
|
||||||
/*
|
|
||||||
* Fundamental types and constants relating to WPA
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _proto_wpa_h_
|
|
||||||
#define _proto_wpa_h_
|
|
||||||
|
|
||||||
#include <typedefs.h>
|
|
||||||
#include <proto/ethernet.h>
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Reason Codes */
|
|
||||||
|
|
||||||
/* 13 through 23 taken from IEEE Std 802.11i-2004 */
|
|
||||||
#define DOT11_RC_INVALID_WPA_IE 13 /* Invalid info. element */
|
|
||||||
#define DOT11_RC_MIC_FAILURE 14 /* Michael failure */
|
|
||||||
#define DOT11_RC_4WH_TIMEOUT 15 /* 4-way handshake timeout */
|
|
||||||
#define DOT11_RC_GTK_UPDATE_TIMEOUT 16 /* Group key update timeout */
|
|
||||||
#define DOT11_RC_WPA_IE_MISMATCH 17 /* WPA IE in 4-way handshake differs from
|
|
||||||
* (re-)assoc. request/probe response
|
|
||||||
*/
|
|
||||||
#define DOT11_RC_INVALID_MC_CIPHER 18 /* Invalid multicast cipher */
|
|
||||||
#define DOT11_RC_INVALID_UC_CIPHER 19 /* Invalid unicast cipher */
|
|
||||||
#define DOT11_RC_INVALID_AKMP 20 /* Invalid authenticated key management protocol */
|
|
||||||
#define DOT11_RC_BAD_WPA_VERSION 21 /* Unsupported WPA version */
|
|
||||||
#define DOT11_RC_INVALID_WPA_CAP 22 /* Invalid WPA IE capabilities */
|
|
||||||
#define DOT11_RC_8021X_AUTH_FAIL 23 /* 802.1X authentication failure */
|
|
||||||
|
|
||||||
#define WPA2_PMKID_LEN 16
|
|
||||||
|
|
||||||
/* WPA IE fixed portion */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint8 tag; /* TAG */
|
|
||||||
uint8 length; /* TAG length */
|
|
||||||
uint8 oui[3]; /* IE OUI */
|
|
||||||
uint8 oui_type; /* OUI type */
|
|
||||||
struct {
|
|
||||||
uint8 low;
|
|
||||||
uint8 high;
|
|
||||||
} PACKED version; /* IE version */
|
|
||||||
} PACKED wpa_ie_fixed_t;
|
|
||||||
#define WPA_IE_OUITYPE_LEN 4
|
|
||||||
#define WPA_IE_FIXED_LEN 8
|
|
||||||
#define WPA_IE_TAG_FIXED_LEN 6
|
|
||||||
|
|
||||||
#ifdef BCMWPA2
|
|
||||||
typedef struct {
|
|
||||||
uint8 tag; /* TAG */
|
|
||||||
uint8 length; /* TAG length */
|
|
||||||
struct {
|
|
||||||
uint8 low;
|
|
||||||
uint8 high;
|
|
||||||
} PACKED version; /* IE version */
|
|
||||||
} PACKED wpa_rsn_ie_fixed_t;
|
|
||||||
#define WPA_RSN_IE_FIXED_LEN 4
|
|
||||||
#define WPA_RSN_IE_TAG_FIXED_LEN 2
|
|
||||||
typedef uint8 wpa_pmkid_t[WPA2_PMKID_LEN];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* WPA suite/multicast suite */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint8 oui[3];
|
|
||||||
uint8 type;
|
|
||||||
} PACKED wpa_suite_t, wpa_suite_mcast_t;
|
|
||||||
#define WPA_SUITE_LEN 4
|
|
||||||
|
|
||||||
/* WPA unicast suite list/key management suite list */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
uint8 low;
|
|
||||||
uint8 high;
|
|
||||||
} PACKED count;
|
|
||||||
wpa_suite_t list[1];
|
|
||||||
} PACKED wpa_suite_ucast_t, wpa_suite_auth_key_mgmt_t;
|
|
||||||
#define WPA_IE_SUITE_COUNT_LEN 2
|
|
||||||
#ifdef BCMWPA2
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
uint8 low;
|
|
||||||
uint8 high;
|
|
||||||
} PACKED count;
|
|
||||||
wpa_pmkid_t list[1];
|
|
||||||
} PACKED wpa_pmkid_list_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* WPA cipher suites */
|
|
||||||
#define WPA_CIPHER_NONE 0 /* None */
|
|
||||||
#define WPA_CIPHER_WEP_40 1 /* WEP (40-bit) */
|
|
||||||
#define WPA_CIPHER_TKIP 2 /* TKIP: default for WPA */
|
|
||||||
#define WPA_CIPHER_AES_OCB 3 /* AES (OCB) */
|
|
||||||
#define WPA_CIPHER_AES_CCM 4 /* AES (CCM) */
|
|
||||||
#define WPA_CIPHER_WEP_104 5 /* WEP (104-bit) */
|
|
||||||
|
|
||||||
#define IS_WPA_CIPHER(cipher) ((cipher) == WPA_CIPHER_NONE || \
|
|
||||||
(cipher) == WPA_CIPHER_WEP_40 || \
|
|
||||||
(cipher) == WPA_CIPHER_WEP_104 || \
|
|
||||||
(cipher) == WPA_CIPHER_TKIP || \
|
|
||||||
(cipher) == WPA_CIPHER_AES_OCB || \
|
|
||||||
(cipher) == WPA_CIPHER_AES_CCM)
|
|
||||||
|
|
||||||
/* WPA TKIP countermeasures parameters */
|
|
||||||
#define WPA_TKIP_CM_DETECT 60 /* multiple MIC failure window (seconds) */
|
|
||||||
#define WPA_TKIP_CM_BLOCK 60 /* countermeasures active window (seconds) */
|
|
||||||
|
|
||||||
/* RSN IE defines */
|
|
||||||
#define RSN_CAP_LEN 2 /* Length of RSN capabilities field (2 octets) */
|
|
||||||
|
|
||||||
/* RSN Capabilities defined in 802.11i */
|
|
||||||
#define RSN_CAP_PREAUTH 0x0001
|
|
||||||
#define RSN_CAP_NOPAIRWISE 0x0002
|
|
||||||
#define RSN_CAP_PTK_REPLAY_CNTR_MASK 0x000C
|
|
||||||
#define RSN_CAP_PTK_REPLAY_CNTR_SHIFT 2
|
|
||||||
#define RSN_CAP_GTK_REPLAY_CNTR_MASK 0x0030
|
|
||||||
#define RSN_CAP_GTK_REPLAY_CNTR_SHIFT 4
|
|
||||||
#define RSN_CAP_1_REPLAY_CNTR 0
|
|
||||||
#define RSN_CAP_2_REPLAY_CNTRS 1
|
|
||||||
#define RSN_CAP_4_REPLAY_CNTRS 2
|
|
||||||
#define RSN_CAP_16_REPLAY_CNTRS 3
|
|
||||||
|
|
||||||
/* WPA capabilities defined in 802.11i */
|
|
||||||
#define WPA_CAP_4_REPLAY_CNTRS RSN_CAP_4_REPLAY_CNTRS
|
|
||||||
#define WPA_CAP_16_REPLAY_CNTRS RSN_CAP_16_REPLAY_CNTRS
|
|
||||||
#define WPA_CAP_REPLAY_CNTR_SHIFT RSN_CAP_PTK_REPLAY_CNTR_SHIFT
|
|
||||||
#define WPA_CAP_REPLAY_CNTR_MASK RSN_CAP_PTK_REPLAY_CNTR_MASK
|
|
||||||
|
|
||||||
/* WPA Specific defines */
|
|
||||||
#define WPA_CAP_LEN RSN_CAP_LEN /* Length of RSN capabilities in RSN IE (2 octets) */
|
|
||||||
|
|
||||||
#define WPA_CAP_WPA2_PREAUTH RSN_CAP_PREAUTH
|
|
||||||
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _proto_wpa_h_ */
|
|
|
@ -1,283 +0,0 @@
|
||||||
/*
|
|
||||||
* Generic Broadcom Home Networking Division (HND) DMA engine HW interface
|
|
||||||
* This supports the following chips: BCM42xx, 44xx, 47xx .
|
|
||||||
*
|
|
||||||
* Copyright 2007, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _sbhnddma_h_
|
|
||||||
#define _sbhnddma_h_
|
|
||||||
|
|
||||||
/* DMA structure:
|
|
||||||
* support two DMA engines: 32 bits address or 64 bit addressing
|
|
||||||
* basic DMA register set is per channel(transmit or receive)
|
|
||||||
* a pair of channels is defined for convenience
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* 32 bits addressing */
|
|
||||||
|
|
||||||
/* dma registers per channel(xmt or rcv) */
|
|
||||||
typedef volatile struct {
|
|
||||||
uint32 control; /* enable, et al */
|
|
||||||
uint32 addr; /* descriptor ring base address (4K aligned) */
|
|
||||||
uint32 ptr; /* last descriptor posted to chip */
|
|
||||||
uint32 status; /* current active descriptor, et al */
|
|
||||||
} dma32regs_t;
|
|
||||||
|
|
||||||
typedef volatile struct {
|
|
||||||
dma32regs_t xmt; /* dma tx channel */
|
|
||||||
dma32regs_t rcv; /* dma rx channel */
|
|
||||||
} dma32regp_t;
|
|
||||||
|
|
||||||
typedef volatile struct { /* diag access */
|
|
||||||
uint32 fifoaddr; /* diag address */
|
|
||||||
uint32 fifodatalow; /* low 32bits of data */
|
|
||||||
uint32 fifodatahigh; /* high 32bits of data */
|
|
||||||
uint32 pad; /* reserved */
|
|
||||||
} dma32diag_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* DMA Descriptor
|
|
||||||
* Descriptors are only read by the hardware, never written back.
|
|
||||||
*/
|
|
||||||
typedef volatile struct {
|
|
||||||
uint32 ctrl; /* misc control bits & bufcount */
|
|
||||||
uint32 addr; /* data buffer address */
|
|
||||||
} dma32dd_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Each descriptor ring must be 4096byte aligned, and fit within a single 4096byte page.
|
|
||||||
*/
|
|
||||||
#define D32MAXRINGSZ 4096
|
|
||||||
#define D32RINGALIGN 4096
|
|
||||||
#define D32MAXDD (D32MAXRINGSZ / sizeof (dma32dd_t))
|
|
||||||
|
|
||||||
/* transmit channel control */
|
|
||||||
#define XC_XE ((uint32)1 << 0) /* transmit enable */
|
|
||||||
#define XC_SE ((uint32)1 << 1) /* transmit suspend request */
|
|
||||||
#define XC_LE ((uint32)1 << 2) /* loopback enable */
|
|
||||||
#define XC_FL ((uint32)1 << 4) /* flush request */
|
|
||||||
#define XC_AE ((uint32)3 << 16) /* address extension bits */
|
|
||||||
#define XC_AE_SHIFT 16
|
|
||||||
|
|
||||||
/* transmit descriptor table pointer */
|
|
||||||
#define XP_LD_MASK 0xfff /* last valid descriptor */
|
|
||||||
|
|
||||||
/* transmit channel status */
|
|
||||||
#define XS_CD_MASK 0x0fff /* current descriptor pointer */
|
|
||||||
#define XS_XS_MASK 0xf000 /* transmit state */
|
|
||||||
#define XS_XS_SHIFT 12
|
|
||||||
#define XS_XS_DISABLED 0x0000 /* disabled */
|
|
||||||
#define XS_XS_ACTIVE 0x1000 /* active */
|
|
||||||
#define XS_XS_IDLE 0x2000 /* idle wait */
|
|
||||||
#define XS_XS_STOPPED 0x3000 /* stopped */
|
|
||||||
#define XS_XS_SUSP 0x4000 /* suspend pending */
|
|
||||||
#define XS_XE_MASK 0xf0000 /* transmit errors */
|
|
||||||
#define XS_XE_SHIFT 16
|
|
||||||
#define XS_XE_NOERR 0x00000 /* no error */
|
|
||||||
#define XS_XE_DPE 0x10000 /* descriptor protocol error */
|
|
||||||
#define XS_XE_DFU 0x20000 /* data fifo underrun */
|
|
||||||
#define XS_XE_BEBR 0x30000 /* bus error on buffer read */
|
|
||||||
#define XS_XE_BEDA 0x40000 /* bus error on descriptor access */
|
|
||||||
#define XS_AD_MASK 0xfff00000 /* active descriptor */
|
|
||||||
#define XS_AD_SHIFT 20
|
|
||||||
|
|
||||||
/* receive channel control */
|
|
||||||
#define RC_RE ((uint32)1 << 0) /* receive enable */
|
|
||||||
#define RC_RO_MASK 0xfe /* receive frame offset */
|
|
||||||
#define RC_RO_SHIFT 1
|
|
||||||
#define RC_FM ((uint32)1 << 8) /* direct fifo receive (pio) mode */
|
|
||||||
#define RC_AE ((uint32)3 << 16) /* address extension bits */
|
|
||||||
#define RC_AE_SHIFT 16
|
|
||||||
|
|
||||||
/* receive descriptor table pointer */
|
|
||||||
#define RP_LD_MASK 0xfff /* last valid descriptor */
|
|
||||||
|
|
||||||
/* receive channel status */
|
|
||||||
#define RS_CD_MASK 0x0fff /* current descriptor pointer */
|
|
||||||
#define RS_RS_MASK 0xf000 /* receive state */
|
|
||||||
#define RS_RS_SHIFT 12
|
|
||||||
#define RS_RS_DISABLED 0x0000 /* disabled */
|
|
||||||
#define RS_RS_ACTIVE 0x1000 /* active */
|
|
||||||
#define RS_RS_IDLE 0x2000 /* idle wait */
|
|
||||||
#define RS_RS_STOPPED 0x3000 /* reserved */
|
|
||||||
#define RS_RE_MASK 0xf0000 /* receive errors */
|
|
||||||
#define RS_RE_SHIFT 16
|
|
||||||
#define RS_RE_NOERR 0x00000 /* no error */
|
|
||||||
#define RS_RE_DPE 0x10000 /* descriptor protocol error */
|
|
||||||
#define RS_RE_DFO 0x20000 /* data fifo overflow */
|
|
||||||
#define RS_RE_BEBW 0x30000 /* bus error on buffer write */
|
|
||||||
#define RS_RE_BEDA 0x40000 /* bus error on descriptor access */
|
|
||||||
#define RS_AD_MASK 0xfff00000 /* active descriptor */
|
|
||||||
#define RS_AD_SHIFT 20
|
|
||||||
|
|
||||||
/* fifoaddr */
|
|
||||||
#define FA_OFF_MASK 0xffff /* offset */
|
|
||||||
#define FA_SEL_MASK 0xf0000 /* select */
|
|
||||||
#define FA_SEL_SHIFT 16
|
|
||||||
#define FA_SEL_XDD 0x00000 /* transmit dma data */
|
|
||||||
#define FA_SEL_XDP 0x10000 /* transmit dma pointers */
|
|
||||||
#define FA_SEL_RDD 0x40000 /* receive dma data */
|
|
||||||
#define FA_SEL_RDP 0x50000 /* receive dma pointers */
|
|
||||||
#define FA_SEL_XFD 0x80000 /* transmit fifo data */
|
|
||||||
#define FA_SEL_XFP 0x90000 /* transmit fifo pointers */
|
|
||||||
#define FA_SEL_RFD 0xc0000 /* receive fifo data */
|
|
||||||
#define FA_SEL_RFP 0xd0000 /* receive fifo pointers */
|
|
||||||
#define FA_SEL_RSD 0xe0000 /* receive frame status data */
|
|
||||||
#define FA_SEL_RSP 0xf0000 /* receive frame status pointers */
|
|
||||||
|
|
||||||
/* descriptor control flags */
|
|
||||||
#define CTRL_BC_MASK 0x1fff /* buffer byte count */
|
|
||||||
#define CTRL_AE ((uint32)3 << 16) /* address extension bits */
|
|
||||||
#define CTRL_AE_SHIFT 16
|
|
||||||
#define CTRL_EOT ((uint32)1 << 28) /* end of descriptor table */
|
|
||||||
#define CTRL_IOC ((uint32)1 << 29) /* interrupt on completion */
|
|
||||||
#define CTRL_EOF ((uint32)1 << 30) /* end of frame */
|
|
||||||
#define CTRL_SOF ((uint32)1 << 31) /* start of frame */
|
|
||||||
|
|
||||||
/* control flags in the range [27:20] are core-specific and not defined here */
|
|
||||||
#define CTRL_CORE_MASK 0x0ff00000
|
|
||||||
|
|
||||||
/* 64 bits addressing */
|
|
||||||
|
|
||||||
/* dma registers per channel(xmt or rcv) */
|
|
||||||
typedef volatile struct {
|
|
||||||
uint32 control; /* enable, et al */
|
|
||||||
uint32 ptr; /* last descriptor posted to chip */
|
|
||||||
uint32 addrlow; /* descriptor ring base address low 32-bits (8K aligned) */
|
|
||||||
uint32 addrhigh; /* descriptor ring base address bits 63:32 (8K aligned) */
|
|
||||||
uint32 status0; /* current descriptor, xmt state */
|
|
||||||
uint32 status1; /* active descriptor, xmt error */
|
|
||||||
} dma64regs_t;
|
|
||||||
|
|
||||||
typedef volatile struct {
|
|
||||||
dma64regs_t tx; /* dma64 tx channel */
|
|
||||||
dma64regs_t rx; /* dma64 rx channel */
|
|
||||||
} dma64regp_t;
|
|
||||||
|
|
||||||
typedef volatile struct { /* diag access */
|
|
||||||
uint32 fifoaddr; /* diag address */
|
|
||||||
uint32 fifodatalow; /* low 32bits of data */
|
|
||||||
uint32 fifodatahigh; /* high 32bits of data */
|
|
||||||
uint32 pad; /* reserved */
|
|
||||||
} dma64diag_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* DMA Descriptor
|
|
||||||
* Descriptors are only read by the hardware, never written back.
|
|
||||||
*/
|
|
||||||
typedef volatile struct {
|
|
||||||
uint32 ctrl1; /* misc control bits & bufcount */
|
|
||||||
uint32 ctrl2; /* buffer count and address extension */
|
|
||||||
uint32 addrlow; /* memory address of the date buffer, bits 31:0 */
|
|
||||||
uint32 addrhigh; /* memory address of the date buffer, bits 63:32 */
|
|
||||||
} dma64dd_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Each descriptor ring must be 8kB aligned, and fit within a contiguous 8kB physical addresss.
|
|
||||||
*/
|
|
||||||
#define D64MAXRINGSZ 8192
|
|
||||||
#define D64RINGALIGN 8192
|
|
||||||
#define D64MAXDD (D64MAXRINGSZ / sizeof (dma64dd_t))
|
|
||||||
|
|
||||||
/* transmit channel control */
|
|
||||||
#define D64_XC_XE 0x00000001 /* transmit enable */
|
|
||||||
#define D64_XC_SE 0x00000002 /* transmit suspend request */
|
|
||||||
#define D64_XC_LE 0x00000004 /* loopback enable */
|
|
||||||
#define D64_XC_FL 0x00000010 /* flush request */
|
|
||||||
#define D64_XC_AE 0x00030000 /* address extension bits */
|
|
||||||
#define D64_XC_AE_SHIFT 16
|
|
||||||
|
|
||||||
/* transmit descriptor table pointer */
|
|
||||||
#define D64_XP_LD_MASK 0x00000fff /* last valid descriptor */
|
|
||||||
|
|
||||||
/* transmit channel status */
|
|
||||||
#define D64_XS0_CD_MASK 0x00001fff /* current descriptor pointer */
|
|
||||||
#define D64_XS0_XS_MASK 0xf0000000 /* transmit state */
|
|
||||||
#define D64_XS0_XS_SHIFT 28
|
|
||||||
#define D64_XS0_XS_DISABLED 0x00000000 /* disabled */
|
|
||||||
#define D64_XS0_XS_ACTIVE 0x10000000 /* active */
|
|
||||||
#define D64_XS0_XS_IDLE 0x20000000 /* idle wait */
|
|
||||||
#define D64_XS0_XS_STOPPED 0x30000000 /* stopped */
|
|
||||||
#define D64_XS0_XS_SUSP 0x40000000 /* suspend pending */
|
|
||||||
|
|
||||||
#define D64_XS1_AD_MASK 0x0001ffff /* active descriptor */
|
|
||||||
#define D64_XS1_XE_MASK 0xf0000000 /* transmit errors */
|
|
||||||
#define D64_XS1_XE_SHIFT 28
|
|
||||||
#define D64_XS1_XE_NOERR 0x00000000 /* no error */
|
|
||||||
#define D64_XS1_XE_DPE 0x10000000 /* descriptor protocol error */
|
|
||||||
#define D64_XS1_XE_DFU 0x20000000 /* data fifo underrun */
|
|
||||||
#define D64_XS1_XE_DTE 0x30000000 /* data transfer error */
|
|
||||||
#define D64_XS1_XE_DESRE 0x40000000 /* descriptor read error */
|
|
||||||
#define D64_XS1_XE_COREE 0x50000000 /* core error */
|
|
||||||
|
|
||||||
/* receive channel control */
|
|
||||||
#define D64_RC_RE 0x00000001 /* receive enable */
|
|
||||||
#define D64_RC_RO_MASK 0x000000fe /* receive frame offset */
|
|
||||||
#define D64_RC_RO_SHIFT 1
|
|
||||||
#define D64_RC_FM 0x00000100 /* direct fifo receive (pio) mode */
|
|
||||||
#define D64_RC_AE 0x00030000 /* address extension bits */
|
|
||||||
#define D64_RC_AE_SHIFT 16
|
|
||||||
|
|
||||||
/* receive descriptor table pointer */
|
|
||||||
#define D64_RP_LD_MASK 0x00000fff /* last valid descriptor */
|
|
||||||
|
|
||||||
/* receive channel status */
|
|
||||||
#define D64_RS0_CD_MASK 0x00001fff /* current descriptor pointer */
|
|
||||||
#define D64_RS0_RS_MASK 0xf0000000 /* receive state */
|
|
||||||
#define D64_RS0_RS_SHIFT 28
|
|
||||||
#define D64_RS0_RS_DISABLED 0x00000000 /* disabled */
|
|
||||||
#define D64_RS0_RS_ACTIVE 0x10000000 /* active */
|
|
||||||
#define D64_RS0_RS_IDLE 0x20000000 /* idle wait */
|
|
||||||
#define D64_RS0_RS_STOPPED 0x30000000 /* stopped */
|
|
||||||
#define D64_RS0_RS_SUSP 0x40000000 /* suspend pending */
|
|
||||||
|
|
||||||
#define D64_RS1_AD_MASK 0x0001ffff /* active descriptor */
|
|
||||||
#define D64_RS1_RE_MASK 0xf0000000 /* receive errors */
|
|
||||||
#define D64_RS1_RE_SHIFT 28
|
|
||||||
#define D64_RS1_RE_NOERR 0x00000000 /* no error */
|
|
||||||
#define D64_RS1_RE_DPO 0x10000000 /* descriptor protocol error */
|
|
||||||
#define D64_RS1_RE_DFU 0x20000000 /* data fifo overflow */
|
|
||||||
#define D64_RS1_RE_DTE 0x30000000 /* data transfer error */
|
|
||||||
#define D64_RS1_RE_DESRE 0x40000000 /* descriptor read error */
|
|
||||||
#define D64_RS1_RE_COREE 0x50000000 /* core error */
|
|
||||||
|
|
||||||
/* fifoaddr */
|
|
||||||
#define D64_FA_OFF_MASK 0xffff /* offset */
|
|
||||||
#define D64_FA_SEL_MASK 0xf0000 /* select */
|
|
||||||
#define D64_FA_SEL_SHIFT 16
|
|
||||||
#define D64_FA_SEL_XDD 0x00000 /* transmit dma data */
|
|
||||||
#define D64_FA_SEL_XDP 0x10000 /* transmit dma pointers */
|
|
||||||
#define D64_FA_SEL_RDD 0x40000 /* receive dma data */
|
|
||||||
#define D64_FA_SEL_RDP 0x50000 /* receive dma pointers */
|
|
||||||
#define D64_FA_SEL_XFD 0x80000 /* transmit fifo data */
|
|
||||||
#define D64_FA_SEL_XFP 0x90000 /* transmit fifo pointers */
|
|
||||||
#define D64_FA_SEL_RFD 0xc0000 /* receive fifo data */
|
|
||||||
#define D64_FA_SEL_RFP 0xd0000 /* receive fifo pointers */
|
|
||||||
#define D64_FA_SEL_RSD 0xe0000 /* receive frame status data */
|
|
||||||
#define D64_FA_SEL_RSP 0xf0000 /* receive frame status pointers */
|
|
||||||
|
|
||||||
/* descriptor control flags 1 */
|
|
||||||
#define D64_CTRL1_EOT ((uint32)1 << 28) /* end of descriptor table */
|
|
||||||
#define D64_CTRL1_IOC ((uint32)1 << 29) /* interrupt on completion */
|
|
||||||
#define D64_CTRL1_EOF ((uint32)1 << 30) /* end of frame */
|
|
||||||
#define D64_CTRL1_SOF ((uint32)1 << 31) /* start of frame */
|
|
||||||
|
|
||||||
/* descriptor control flags 2 */
|
|
||||||
#define D64_CTRL2_BC_MASK 0x00007fff /* buffer byte count mask */
|
|
||||||
#define D64_CTRL2_AE 0x00030000 /* address extension bits */
|
|
||||||
#define D64_CTRL2_AE_SHIFT 16
|
|
||||||
|
|
||||||
/* control flags in the range [27:20] are core-specific and not defined here */
|
|
||||||
#define D64_CTRL_CORE_MASK 0x0ff00000
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _sbhnddma_h_ */
|
|
|
@ -1,105 +0,0 @@
|
||||||
/*
|
|
||||||
* Misc system wide definitions
|
|
||||||
*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _bcmdefs_h_
|
|
||||||
#define _bcmdefs_h_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* One doesn't need to include this file explicitly, gets included automatically if
|
|
||||||
* typedefs.h is included.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Reclaiming text and data :
|
|
||||||
* The following macros specify special linker sections that can be reclaimed
|
|
||||||
* after a system is considered 'up'.
|
|
||||||
*/
|
|
||||||
#if defined(__GNUC__) && defined(BCMRECLAIM)
|
|
||||||
extern bool bcmreclaimed;
|
|
||||||
#define BCMINITDATA(_data) __attribute__ ((__section__ (".dataini." #_data))) _data
|
|
||||||
#define BCMINITFN(_fn) __attribute__ ((__section__ (".textini." #_fn))) _fn
|
|
||||||
#else /* #if defined(__GNUC__) && defined(BCMRECLAIM) */
|
|
||||||
#define BCMINITDATA(_data) _data
|
|
||||||
#define BCMINITFN(_fn) _fn
|
|
||||||
#define bcmreclaimed 0
|
|
||||||
#endif /* #if defined(__GNUC__) && defined(BCMRECLAIM) */
|
|
||||||
|
|
||||||
/* Reclaim uninit functions if BCMNODOWN is defined */
|
|
||||||
/* and if they are not already removed by -gc-sections */
|
|
||||||
#ifdef BCMNODOWN
|
|
||||||
#define BCMUNINITFN(_fn) BCMINITFN(_fn)
|
|
||||||
#else
|
|
||||||
#define BCMUNINITFN(_fn) _fn
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BCMRECLAIM
|
|
||||||
#define CONST
|
|
||||||
#else
|
|
||||||
#define CONST const
|
|
||||||
#endif /* BCMRECLAIM */
|
|
||||||
|
|
||||||
/* Compatibility with old-style BCMRECLAIM */
|
|
||||||
#define BCMINIT(_id) _id
|
|
||||||
|
|
||||||
|
|
||||||
/* Put some library data/code into ROM to reduce RAM requirements */
|
|
||||||
#if defined(__GNUC__) && defined(BCMROMOFFLOAD)
|
|
||||||
#define BCMROMDATA(_data) __attribute__ ((__section__ (".datarom." #_data))) _data
|
|
||||||
#define BCMROMFN(_fn) __attribute__ ((__section__ (".textrom." #_fn))) _fn
|
|
||||||
#else
|
|
||||||
#define BCMROMDATA(_data) _data
|
|
||||||
#define BCMROMFN(_fn) _fn
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Bus types */
|
|
||||||
#define SB_BUS 0 /* Silicon Backplane */
|
|
||||||
#define PCI_BUS 1 /* PCI target */
|
|
||||||
#define PCMCIA_BUS 2 /* PCMCIA target */
|
|
||||||
#define SDIO_BUS 3 /* SDIO target */
|
|
||||||
#define JTAG_BUS 4 /* JTAG */
|
|
||||||
#define NO_BUS 0xFF /* Bus that does not support R/W REG */
|
|
||||||
|
|
||||||
/* Allows optimization for single-bus support */
|
|
||||||
#ifdef BCMBUSTYPE
|
|
||||||
#define BUSTYPE(bus) (BCMBUSTYPE)
|
|
||||||
#else
|
|
||||||
#define BUSTYPE(bus) (bus)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Defines for DMA Address Width - Shared between OSL and HNDDMA */
|
|
||||||
#define DMADDR_MASK_32 0x0 /* Address mask for 32-bits */
|
|
||||||
#define DMADDR_MASK_30 0xc0000000 /* Address mask for 30-bits */
|
|
||||||
#define DMADDR_MASK_0 0xffffffff /* Address mask for 0-bits (hi-part) */
|
|
||||||
|
|
||||||
#define DMADDRWIDTH_30 30 /* 30-bit addressing capability */
|
|
||||||
#define DMADDRWIDTH_32 32 /* 32-bit addressing capability */
|
|
||||||
#define DMADDRWIDTH_63 63 /* 64-bit addressing capability */
|
|
||||||
#define DMADDRWIDTH_64 64 /* 64-bit addressing capability */
|
|
||||||
|
|
||||||
/* packet headroom necessary to accomodate the largest header in the system, (i.e TXOFF).
|
|
||||||
* By doing, we avoid the need to allocate an extra buffer for the header when bridging to WL.
|
|
||||||
* There is a compile time check in wlc.c which ensure that this value is at least as big
|
|
||||||
* as TXOFF. This value is used in dma_rxfill (hnddma.c).
|
|
||||||
*/
|
|
||||||
#define BCMEXTRAHDROOM 160
|
|
||||||
|
|
||||||
/* Headroom required for dongle-to-host communication. Packets allocated
|
|
||||||
* locally in the dongle (e.g. for CDC ioctls or RNDIS messages) should
|
|
||||||
* leave this much room in front for low-level message headers which may
|
|
||||||
* be needed to get across the dongle bus to the host. (These messages
|
|
||||||
* don't go over the network, so room for the full WL header above would
|
|
||||||
* be a waste.)
|
|
||||||
*/
|
|
||||||
#define BCMDONGLEHDRSZ 8
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _bcmdefs_h_ */
|
|
|
@ -1,257 +0,0 @@
|
||||||
/*
|
|
||||||
* Misc useful os-independent macros and functions.
|
|
||||||
*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _bcmutils_h_
|
|
||||||
#define _bcmutils_h_
|
|
||||||
|
|
||||||
/* ** driver/apps-shared section ** */
|
|
||||||
|
|
||||||
#define BCME_STRLEN 64 /* Max string length for BCM errors */
|
|
||||||
#define VALID_BCMERROR(e) ((e <= 0) && (e >= BCME_LAST))
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* error codes could be added but the defined ones shouldn't be changed/deleted
|
|
||||||
* these error codes are exposed to the user code
|
|
||||||
* when ever a new error code is added to this list
|
|
||||||
* please update errorstring table with the related error string and
|
|
||||||
* update osl files with os specific errorcode map
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BCME_OK 0 /* Success */
|
|
||||||
#define BCME_ERROR -1 /* Error generic */
|
|
||||||
#define BCME_BADARG -2 /* Bad Argument */
|
|
||||||
#define BCME_BADOPTION -3 /* Bad option */
|
|
||||||
#define BCME_NOTUP -4 /* Not up */
|
|
||||||
#define BCME_NOTDOWN -5 /* Not down */
|
|
||||||
#define BCME_NOTAP -6 /* Not AP */
|
|
||||||
#define BCME_NOTSTA -7 /* Not STA */
|
|
||||||
#define BCME_BADKEYIDX -8 /* BAD Key Index */
|
|
||||||
#define BCME_RADIOOFF -9 /* Radio Off */
|
|
||||||
#define BCME_NOTBANDLOCKED -10 /* Not band locked */
|
|
||||||
#define BCME_NOCLK -11 /* No Clock */
|
|
||||||
#define BCME_BADRATESET -12 /* BAD Rate valueset */
|
|
||||||
#define BCME_BADBAND -13 /* BAD Band */
|
|
||||||
#define BCME_BUFTOOSHORT -14 /* Buffer too short */
|
|
||||||
#define BCME_BUFTOOLONG -15 /* Buffer too long */
|
|
||||||
#define BCME_BUSY -16 /* Busy */
|
|
||||||
#define BCME_NOTASSOCIATED -17 /* Not Associated */
|
|
||||||
#define BCME_BADSSIDLEN -18 /* Bad SSID len */
|
|
||||||
#define BCME_OUTOFRANGECHAN -19 /* Out of Range Channel */
|
|
||||||
#define BCME_BADCHAN -20 /* Bad Channel */
|
|
||||||
#define BCME_BADADDR -21 /* Bad Address */
|
|
||||||
#define BCME_NORESOURCE -22 /* Not Enough Resources */
|
|
||||||
#define BCME_UNSUPPORTED -23 /* Unsupported */
|
|
||||||
#define BCME_BADLEN -24 /* Bad length */
|
|
||||||
#define BCME_NOTREADY -25 /* Not Ready */
|
|
||||||
#define BCME_EPERM -26 /* Not Permitted */
|
|
||||||
#define BCME_NOMEM -27 /* No Memory */
|
|
||||||
#define BCME_ASSOCIATED -28 /* Associated */
|
|
||||||
#define BCME_RANGE -29 /* Not In Range */
|
|
||||||
#define BCME_NOTFOUND -30 /* Not Found */
|
|
||||||
#define BCME_WME_NOT_ENABLED -31 /* WME Not Enabled */
|
|
||||||
#define BCME_TSPEC_NOTFOUND -32 /* TSPEC Not Found */
|
|
||||||
#define BCME_ACM_NOTSUPPORTED -33 /* ACM Not Supported */
|
|
||||||
#define BCME_NOT_WME_ASSOCIATION -34 /* Not WME Association */
|
|
||||||
#define BCME_SDIO_ERROR -35 /* SDIO Bus Error */
|
|
||||||
#define BCME_DONGLE_DOWN -36 /* Dongle Not Accessible */
|
|
||||||
#define BCME_LAST BCME_DONGLE_DOWN
|
|
||||||
|
|
||||||
/* These are collection of BCME Error strings */
|
|
||||||
#define BCMERRSTRINGTABLE { \
|
|
||||||
"OK", \
|
|
||||||
"Undefined error", \
|
|
||||||
"Bad Argument", \
|
|
||||||
"Bad Option", \
|
|
||||||
"Not up", \
|
|
||||||
"Not down", \
|
|
||||||
"Not AP", \
|
|
||||||
"Not STA", \
|
|
||||||
"Bad Key Index", \
|
|
||||||
"Radio Off", \
|
|
||||||
"Not band locked", \
|
|
||||||
"No clock", \
|
|
||||||
"Bad Rate valueset", \
|
|
||||||
"Bad Band", \
|
|
||||||
"Buffer too short", \
|
|
||||||
"Buffer too long", \
|
|
||||||
"Busy", \
|
|
||||||
"Not Associated", \
|
|
||||||
"Bad SSID len", \
|
|
||||||
"Out of Range Channel", \
|
|
||||||
"Bad Channel", \
|
|
||||||
"Bad Address", \
|
|
||||||
"Not Enough Resources", \
|
|
||||||
"Unsupported", \
|
|
||||||
"Bad length", \
|
|
||||||
"Not Ready", \
|
|
||||||
"Not Permitted", \
|
|
||||||
"No Memory", \
|
|
||||||
"Associated", \
|
|
||||||
"Not In Range", \
|
|
||||||
"Not Found", \
|
|
||||||
"WME Not Enabled", \
|
|
||||||
"TSPEC Not Found", \
|
|
||||||
"ACM Not Supported", \
|
|
||||||
"Not WME Association", \
|
|
||||||
"SDIO Bus Error", \
|
|
||||||
"Dongle Not Accessible" \
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef ABS
|
|
||||||
#define ABS(a) (((a) < 0)?-(a):(a))
|
|
||||||
#endif /* ABS */
|
|
||||||
|
|
||||||
#ifndef MIN
|
|
||||||
#define MIN(a, b) (((a) < (b))?(a):(b))
|
|
||||||
#endif /* MIN */
|
|
||||||
|
|
||||||
#ifndef MAX
|
|
||||||
#define MAX(a, b) (((a) > (b))?(a):(b))
|
|
||||||
#endif /* MAX */
|
|
||||||
|
|
||||||
#define CEIL(x, y) (((x) + ((y)-1)) / (y))
|
|
||||||
#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
|
|
||||||
#define ISALIGNED(a, x) (((a) & ((x)-1)) == 0)
|
|
||||||
#define ISPOWEROF2(x) ((((x)-1)&(x)) == 0)
|
|
||||||
#define VALID_MASK(mask) !((mask) & ((mask) + 1))
|
|
||||||
#define OFFSETOF(type, member) ((uint)(uintptr)&((type *)0)->member)
|
|
||||||
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
|
|
||||||
|
|
||||||
/* bit map related macros */
|
|
||||||
#ifndef setbit
|
|
||||||
#ifndef NBBY /* the BSD family defines NBBY */
|
|
||||||
#define NBBY 8 /* 8 bits per byte */
|
|
||||||
#endif /* #ifndef NBBY */
|
|
||||||
#define setbit(a, i) (((uint8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY))
|
|
||||||
#define clrbit(a, i) (((uint8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
|
|
||||||
#define isset(a, i) (((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY)))
|
|
||||||
#define isclr(a, i) ((((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
|
|
||||||
#endif /* setbit */
|
|
||||||
|
|
||||||
#define NBITS(type) (sizeof(type) * 8)
|
|
||||||
#define NBITVAL(nbits) (1 << (nbits))
|
|
||||||
#define MAXBITVAL(nbits) ((1 << (nbits)) - 1)
|
|
||||||
#define NBITMASK(nbits) MAXBITVAL(nbits)
|
|
||||||
#define MAXNBVAL(nbyte) MAXBITVAL((nbyte) * 8)
|
|
||||||
|
|
||||||
/* basic mux operation - can be optimized on several architectures */
|
|
||||||
#define MUX(pred, true, false) ((pred) ? (true) : (false))
|
|
||||||
|
|
||||||
/* modulo inc/dec - assumes x E [0, bound - 1] */
|
|
||||||
#define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1)
|
|
||||||
#define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1)
|
|
||||||
|
|
||||||
/* modulo inc/dec, bound = 2^k */
|
|
||||||
#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))
|
|
||||||
#define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1))
|
|
||||||
|
|
||||||
/* modulo add/sub - assumes x, y E [0, bound - 1] */
|
|
||||||
#define MODADD(x, y, bound) \
|
|
||||||
MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y))
|
|
||||||
#define MODSUB(x, y, bound) \
|
|
||||||
MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y))
|
|
||||||
|
|
||||||
/* module add/sub, bound = 2^k */
|
|
||||||
#define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1))
|
|
||||||
#define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1))
|
|
||||||
|
|
||||||
/* crc defines */
|
|
||||||
#define CRC8_INIT_VALUE 0xff /* Initial CRC8 checksum value */
|
|
||||||
#define CRC8_GOOD_VALUE 0x9f /* Good final CRC8 checksum value */
|
|
||||||
#define CRC16_INIT_VALUE 0xffff /* Initial CRC16 checksum value */
|
|
||||||
#define CRC16_GOOD_VALUE 0xf0b8 /* Good final CRC16 checksum value */
|
|
||||||
#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */
|
|
||||||
#define CRC32_GOOD_VALUE 0xdebb20e3 /* Good final CRC32 checksum value */
|
|
||||||
|
|
||||||
/* bcm_format_flags() bit description structure */
|
|
||||||
typedef struct bcm_bit_desc {
|
|
||||||
uint32 bit;
|
|
||||||
char* name;
|
|
||||||
} bcm_bit_desc_t;
|
|
||||||
|
|
||||||
/* tag_ID/length/value_buffer tuple */
|
|
||||||
typedef struct bcm_tlv {
|
|
||||||
uint8 id;
|
|
||||||
uint8 len;
|
|
||||||
uint8 data[1];
|
|
||||||
} bcm_tlv_t;
|
|
||||||
|
|
||||||
/* Check that bcm_tlv_t fits into the given buflen */
|
|
||||||
#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
|
|
||||||
|
|
||||||
/* buffer length for ethernet address from bcm_ether_ntoa() */
|
|
||||||
#define ETHER_ADDR_STR_LEN 18 /* 18-bytes of Ethernet address buffer length */
|
|
||||||
|
|
||||||
/* unaligned load and store macros */
|
|
||||||
#ifdef IL_BIGENDIAN
|
|
||||||
static INLINE uint32
|
|
||||||
load32_ua(uint8 *a)
|
|
||||||
{
|
|
||||||
return ((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE void
|
|
||||||
store32_ua(uint8 *a, uint32 v)
|
|
||||||
{
|
|
||||||
a[0] = (v >> 24) & 0xff;
|
|
||||||
a[1] = (v >> 16) & 0xff;
|
|
||||||
a[2] = (v >> 8) & 0xff;
|
|
||||||
a[3] = v & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE uint16
|
|
||||||
load16_ua(uint8 *a)
|
|
||||||
{
|
|
||||||
return ((a[0] << 8) | a[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE void
|
|
||||||
store16_ua(uint8 *a, uint16 v)
|
|
||||||
{
|
|
||||||
a[0] = (v >> 8) & 0xff;
|
|
||||||
a[1] = v & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static INLINE uint32
|
|
||||||
load32_ua(uint8 *a)
|
|
||||||
{
|
|
||||||
return ((a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE void
|
|
||||||
store32_ua(uint8 *a, uint32 v)
|
|
||||||
{
|
|
||||||
a[3] = (v >> 24) & 0xff;
|
|
||||||
a[2] = (v >> 16) & 0xff;
|
|
||||||
a[1] = (v >> 8) & 0xff;
|
|
||||||
a[0] = v & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE uint16
|
|
||||||
load16_ua(uint8 *a)
|
|
||||||
{
|
|
||||||
return ((a[1] << 8) | a[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE void
|
|
||||||
store16_ua(uint8 *a, uint16 v)
|
|
||||||
{
|
|
||||||
a[1] = (v >> 8) & 0xff;
|
|
||||||
a[0] = v & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* IL_BIGENDIAN */
|
|
||||||
|
|
||||||
#endif /* _bcmutils_h_ */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* Broadcom Ethernettype protocol definitions
|
|
||||||
*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Broadcom Ethernet protocol defines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BCMETH_H_
|
|
||||||
#define _BCMETH_H_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ETHER_TYPE_BRCM is defined in ethernet.h */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Following the 2byte BRCM ether_type is a 16bit BRCM subtype field
|
|
||||||
* in one of two formats: (only subtypes 32768-65535 are in use now)
|
|
||||||
*
|
|
||||||
* subtypes 0-32767:
|
|
||||||
* 8 bit subtype (0-127)
|
|
||||||
* 8 bit length in bytes (0-255)
|
|
||||||
*
|
|
||||||
* subtypes 32768-65535:
|
|
||||||
* 16 bit big-endian subtype
|
|
||||||
* 16 bit big-endian length in bytes (0-65535)
|
|
||||||
*
|
|
||||||
* length is the number of additional bytes beyond the 4 or 6 byte header
|
|
||||||
*
|
|
||||||
* Reserved values:
|
|
||||||
* 0 reserved
|
|
||||||
* 5-15 reserved for iLine protocol assignments
|
|
||||||
* 17-126 reserved, assignable
|
|
||||||
* 127 reserved
|
|
||||||
* 32768 reserved
|
|
||||||
* 32769-65534 reserved, assignable
|
|
||||||
* 65535 reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* While adding the subtypes and their specific processing code make sure
|
|
||||||
* bcmeth_bcm_hdr_t is the first data structure in the user specific data structure definition
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BCMILCP_SUBTYPE_RATE 1
|
|
||||||
#define BCMILCP_SUBTYPE_LINK 2
|
|
||||||
#define BCMILCP_SUBTYPE_CSA 3
|
|
||||||
#define BCMILCP_SUBTYPE_LARQ 4
|
|
||||||
#define BCMILCP_SUBTYPE_VENDOR 5
|
|
||||||
#define BCMILCP_SUBTYPE_FLH 17
|
|
||||||
|
|
||||||
#define BCMILCP_SUBTYPE_VENDOR_LONG 32769
|
|
||||||
#define BCMILCP_SUBTYPE_CERT 32770
|
|
||||||
#define BCMILCP_SUBTYPE_SES 32771
|
|
||||||
|
|
||||||
|
|
||||||
#define BCMILCP_BCM_SUBTYPE_RESERVED 0
|
|
||||||
#define BCMILCP_BCM_SUBTYPE_EVENT 1
|
|
||||||
#define BCMILCP_BCM_SUBTYPE_SES 2
|
|
||||||
/*
|
|
||||||
* The EAPOL type is not used anymore. Instead EAPOL messages are now embedded
|
|
||||||
* within BCMILCP_BCM_SUBTYPE_EVENT type messages
|
|
||||||
*/
|
|
||||||
/* #define BCMILCP_BCM_SUBTYPE_EAPOL 3 */
|
|
||||||
|
|
||||||
#define BCMILCP_BCM_SUBTYPEHDR_MINLENGTH 8
|
|
||||||
#define BCMILCP_BCM_SUBTYPEHDR_VERSION 0
|
|
||||||
|
|
||||||
/* These fields are stored in network order */
|
|
||||||
typedef struct bcmeth_hdr
|
|
||||||
{
|
|
||||||
uint16 subtype; /* Vendor specific..32769 */
|
|
||||||
uint16 length;
|
|
||||||
uint8 version; /* Version is 0 */
|
|
||||||
uint8 oui[3]; /* Broadcom OUI */
|
|
||||||
/* user specific Data */
|
|
||||||
uint16 usr_subtype;
|
|
||||||
} PACKED bcmeth_hdr_t;
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _BCMETH_H_ */
|
|
|
@ -1,151 +0,0 @@
|
||||||
/*
|
|
||||||
* Broadcom Event protocol definitions
|
|
||||||
*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Dependencies: proto/bcmeth.h
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Broadcom Ethernet Events protocol defines
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BCMEVENT_H_
|
|
||||||
#define _BCMEVENT_H_
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif /* defined(__GNUC__) */
|
|
||||||
|
|
||||||
#define BCM_EVENT_MSG_VERSION 1 /* wl_event_msg_t struct version */
|
|
||||||
#define BCM_MSG_IFNAME_MAX 16 /* max length of interface name */
|
|
||||||
|
|
||||||
/* flags */
|
|
||||||
#define WLC_EVENT_MSG_LINK 0x01 /* link is up */
|
|
||||||
#define WLC_EVENT_MSG_FLUSHTXQ 0x02 /* flush tx queue on MIC error */
|
|
||||||
#define WLC_EVENT_MSG_GROUP 0x04 /* group MIC error */
|
|
||||||
|
|
||||||
/* theses fields are stored in network order */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint16 version;
|
|
||||||
uint16 flags; /* see flags below */
|
|
||||||
uint32 event_type; /* Message (see below) */
|
|
||||||
uint32 status; /* Status code (see below) */
|
|
||||||
uint32 reason; /* Reason code (if applicable) */
|
|
||||||
uint32 auth_type; /* WLC_E_AUTH */
|
|
||||||
uint32 datalen; /* data buf */
|
|
||||||
struct ether_addr addr; /* Station address (if applicable) */
|
|
||||||
char ifname[BCM_MSG_IFNAME_MAX]; /* name of the packet incoming interface */
|
|
||||||
} PACKED wl_event_msg_t;
|
|
||||||
|
|
||||||
/* used by driver msgs */
|
|
||||||
typedef struct bcm_event {
|
|
||||||
struct ether_header eth;
|
|
||||||
bcmeth_hdr_t bcm_hdr;
|
|
||||||
wl_event_msg_t event;
|
|
||||||
/* data portion follows */
|
|
||||||
} PACKED bcm_event_t;
|
|
||||||
|
|
||||||
#define BCM_MSG_LEN (sizeof(bcm_event_t) - sizeof(bcmeth_hdr_t) - sizeof(struct ether_header))
|
|
||||||
|
|
||||||
/* Event messages */
|
|
||||||
#define WLC_E_SET_SSID 0 /* indicates status of set SSID */
|
|
||||||
#define WLC_E_JOIN 1 /* differentiates join IBSS from found (WLC_E_START) IBSS */
|
|
||||||
#define WLC_E_START 2 /* STA founded an IBSS or AP started a BSS */
|
|
||||||
#define WLC_E_AUTH 3 /* 802.11 AUTH request */
|
|
||||||
#define WLC_E_AUTH_IND 4 /* 802.11 AUTH indication */
|
|
||||||
#define WLC_E_DEAUTH 5 /* 802.11 DEAUTH request */
|
|
||||||
#define WLC_E_DEAUTH_IND 6 /* 802.11 DEAUTH indication */
|
|
||||||
#define WLC_E_ASSOC 7 /* 802.11 ASSOC request */
|
|
||||||
#define WLC_E_ASSOC_IND 8 /* 802.11 ASSOC indication */
|
|
||||||
#define WLC_E_REASSOC 9 /* 802.11 REASSOC request */
|
|
||||||
#define WLC_E_REASSOC_IND 10 /* 802.11 REASSOC indication */
|
|
||||||
#define WLC_E_DISASSOC 11 /* 802.11 DISASSOC request */
|
|
||||||
#define WLC_E_DISASSOC_IND 12 /* 802.11 DISASSOC indication */
|
|
||||||
#define WLC_E_QUIET_START 13 /* 802.11h Quiet period started */
|
|
||||||
#define WLC_E_QUIET_END 14 /* 802.11h Quiet period ended */
|
|
||||||
#define WLC_E_BEACON_RX 15 /* BEACONS received/lost indication */
|
|
||||||
#define WLC_E_LINK 16 /* generic link indication */
|
|
||||||
#define WLC_E_MIC_ERROR 17 /* TKIP MIC error occurred */
|
|
||||||
#define WLC_E_NDIS_LINK 18 /* NDIS style link indication */
|
|
||||||
#define WLC_E_ROAM 19 /* roam attempt occurred: indicate status & reason */
|
|
||||||
#define WLC_E_TXFAIL 20 /* change in dot11FailedCount (txfail) */
|
|
||||||
#define WLC_E_PMKID_CACHE 21 /* WPA2 pmkid cache indication */
|
|
||||||
#define WLC_E_RETROGRADE_TSF 22 /* current AP's TSF value went backward */
|
|
||||||
#define WLC_E_PRUNE 23 /* AP was pruned from join list for reason */
|
|
||||||
#define WLC_E_AUTOAUTH 24 /* report AutoAuth table entry match for join attempt */
|
|
||||||
#define WLC_E_EAPOL_MSG 25 /* Event encapsulating an EAPOL message */
|
|
||||||
#define WLC_E_SCAN_COMPLETE 26 /* Scan results are ready or scan was aborted */
|
|
||||||
#define WLC_E_ADDTS_IND 27 /* indicate to host addts fail/success */
|
|
||||||
#define WLC_E_DELTS_IND 28 /* indicate to host delts fail/success */
|
|
||||||
#define WLC_E_BCNSENT_IND 29 /* indicate to host of beacon transmit */
|
|
||||||
#define WLC_E_BCNRX_MSG 30 /* Send the received beacon up to the host */
|
|
||||||
#define WLC_E_LAST 31 /* highest val + 1 for range checking */
|
|
||||||
|
|
||||||
/* Event status codes */
|
|
||||||
#define WLC_E_STATUS_SUCCESS 0 /* operation was successful */
|
|
||||||
#define WLC_E_STATUS_FAIL 1 /* operation failed */
|
|
||||||
#define WLC_E_STATUS_TIMEOUT 2 /* operation timed out */
|
|
||||||
#define WLC_E_STATUS_NO_NETWORKS 3 /* failed due to no matching network found */
|
|
||||||
#define WLC_E_STATUS_ABORT 4 /* operation was aborted */
|
|
||||||
#define WLC_E_STATUS_NO_ACK 5 /* protocol failure: packet not ack'd */
|
|
||||||
#define WLC_E_STATUS_UNSOLICITED 6 /* AUTH or ASSOC packet was unsolicited */
|
|
||||||
#define WLC_E_STATUS_ATTEMPT 7 /* attempt to assoc to an auto auth configuration */
|
|
||||||
|
|
||||||
/* roam reason codes */
|
|
||||||
#define WLC_E_REASON_INITIAL_ASSOC 0 /* initial assoc */
|
|
||||||
#define WLC_E_REASON_LOW_RSSI 1 /* roamed due to low RSSI */
|
|
||||||
#define WLC_E_REASON_DEAUTH 2 /* roamed due to DEAUTH indication */
|
|
||||||
#define WLC_E_REASON_DISASSOC 3 /* roamed due to DISASSOC indication */
|
|
||||||
#define WLC_E_REASON_BCNS_LOST 4 /* roamed due to lost beacons */
|
|
||||||
#define WLC_E_REASON_FAST_ROAM_FAILED 5 /* roamed due to fast roam failure */
|
|
||||||
#define WLC_E_REASON_DIRECTED_ROAM 6 /* roamed due to request by AP */
|
|
||||||
#define WLC_E_REASON_TSPEC_REJECTED 7 /* roamed due to TSPEC rejection */
|
|
||||||
#define WLC_E_REASON_BETTER_AP 8 /* roamed due to finding better AP */
|
|
||||||
|
|
||||||
/* prune reason codes */
|
|
||||||
#define WLC_E_PRUNE_ENCR_MISMATCH 1 /* ecryption mismatch */
|
|
||||||
#define WLC_E_PRUNE_BCAST_BSSID 2 /* AP uses a broadcast BSSID */
|
|
||||||
#define WLC_E_PRUNE_MAC_DENY 3 /* STA's MAC addr is in AP's MAC deny list */
|
|
||||||
#define WLC_E_PRUNE_MAC_NA 4 /* STA's MAC addr is not in AP's MAC allow list */
|
|
||||||
#define WLC_E_PRUNE_REG_PASSV 5 /* AP not allowed due to regulatory restriction */
|
|
||||||
#define WLC_E_PRUNE_SPCT_MGMT 6 /* AP does not support STA locale spectrum mgmt */
|
|
||||||
#define WLC_E_PRUNE_RADAR 7 /* AP is on a radar channel of STA locale */
|
|
||||||
#define WLC_E_RSN_MISMATCH 8 /* STA does not support AP's RSN */
|
|
||||||
#define WLC_E_PRUNE_NO_COMMON_RATES 9 /* No rates in common with AP */
|
|
||||||
#define WLC_E_PRUNE_BASIC_RATES 10 /* STA does not support all basic rates of BSS */
|
|
||||||
#define WLC_E_PRUNE_CCXFAST_PREVAP 11 /* CCX FAST ROAM: prune previous AP */
|
|
||||||
#define WLC_E_PRUNE_CIPHER_NA 12 /* BSS's cipher not supported */
|
|
||||||
#define WLC_E_PRUNE_KNOWN_STA 13 /* AP is already known to us as a STA */
|
|
||||||
#define WLC_E_PRUNE_CCXFAST_DROAM 14 /* CCX FAST ROAM: prune unqulified AP */
|
|
||||||
#define WLC_E_PRUNE_WDS_PEER 15 /* AP is already known to us as a WDS peer */
|
|
||||||
#define WLC_E_PRUNE_QBSS_LOAD 16 /* QBSS LOAD - AAC is too low */
|
|
||||||
#define WLC_E_PRUNE_HOME_AP 17 /* prune home AP */
|
|
||||||
|
|
||||||
/* WLC_SET_CALLBACK data type */
|
|
||||||
typedef struct wlc_event_cb {
|
|
||||||
void (*fn)(void *, bcm_event_t *); /* Callback function */
|
|
||||||
void *context; /* Passed to callback function */
|
|
||||||
} wlc_event_cb_t;
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif /* PACKED */
|
|
||||||
|
|
||||||
#endif /* _BCMEVENT_H_ */
|
|
|
@ -1,164 +0,0 @@
|
||||||
/*
|
|
||||||
* From FreeBSD 2.2.7: Fundamental constants relating to ethernet.
|
|
||||||
*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __NET_ETHERNET_H
|
|
||||||
#define __NET_ETHERNET_H
|
|
||||||
|
|
||||||
#ifndef _TYPEDEFS_H_
|
|
||||||
#include "typedefs.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of bytes in an ethernet (MAC) address.
|
|
||||||
*/
|
|
||||||
#define ETHER_ADDR_LEN 6
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of bytes in the type field.
|
|
||||||
*/
|
|
||||||
#define ETHER_TYPE_LEN 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of bytes in the trailing CRC field.
|
|
||||||
*/
|
|
||||||
#define ETHER_CRC_LEN 4
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The length of the combined header.
|
|
||||||
*/
|
|
||||||
#define ETHER_HDR_LEN (ETHER_ADDR_LEN*2+ETHER_TYPE_LEN)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The minimum packet length.
|
|
||||||
*/
|
|
||||||
#define ETHER_MIN_LEN 64
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The minimum packet user data length.
|
|
||||||
*/
|
|
||||||
#define ETHER_MIN_DATA 46
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum packet length.
|
|
||||||
*/
|
|
||||||
#define ETHER_MAX_LEN 1518
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum packet user data length.
|
|
||||||
*/
|
|
||||||
#define ETHER_MAX_DATA 1500
|
|
||||||
|
|
||||||
/* ether types */
|
|
||||||
#define ETHER_TYPE_IP 0x0800 /* IP */
|
|
||||||
#define ETHER_TYPE_ARP 0x0806 /* ARP */
|
|
||||||
#define ETHER_TYPE_8021Q 0x8100 /* 802.1Q */
|
|
||||||
#define ETHER_TYPE_BRCM 0x886c /* Broadcom Corp. */
|
|
||||||
#define ETHER_TYPE_802_1X 0x888e /* 802.1x */
|
|
||||||
#ifdef BCMWPA2
|
|
||||||
#define ETHER_TYPE_802_1X_PREAUTH 0x88c7 /* 802.1x preauthentication */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Broadcom subtype follows ethertype; First 2 bytes are reserved; Next 2 are subtype; */
|
|
||||||
#define ETHER_BRCM_SUBTYPE_LEN 4 /* Broadcom 4 byte subtype */
|
|
||||||
#define ETHER_BRCM_CRAM 0x1 /* Broadcom subtype cram protocol */
|
|
||||||
|
|
||||||
/* ether header */
|
|
||||||
#define ETHER_DEST_OFFSET 0 /* dest address offset */
|
|
||||||
#define ETHER_SRC_OFFSET 6 /* src address offset */
|
|
||||||
#define ETHER_TYPE_OFFSET 12 /* ether type offset */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A macro to validate a length with
|
|
||||||
*/
|
|
||||||
#define ETHER_IS_VALID_LEN(foo) \
|
|
||||||
((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN)
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __INCif_etherh /* Quick and ugly hack for VxWorks */
|
|
||||||
/*
|
|
||||||
* Structure of a 10Mb/s Ethernet header.
|
|
||||||
*/
|
|
||||||
struct ether_header {
|
|
||||||
uint8 ether_dhost[ETHER_ADDR_LEN];
|
|
||||||
uint8 ether_shost[ETHER_ADDR_LEN];
|
|
||||||
uint16 ether_type;
|
|
||||||
} PACKED;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Structure of a 48-bit Ethernet address.
|
|
||||||
*/
|
|
||||||
struct ether_addr {
|
|
||||||
uint8 octet[ETHER_ADDR_LEN];
|
|
||||||
} PACKED;
|
|
||||||
#endif /* !__INCif_etherh Quick and ugly hack for VxWorks */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Takes a pointer, sets locally admininistered
|
|
||||||
* address bit in the 48-bit Ethernet address.
|
|
||||||
*/
|
|
||||||
#define ETHER_SET_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] | 2))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Takes a pointer, returns true if a 48-bit multicast address
|
|
||||||
* (including broadcast, since it is all ones)
|
|
||||||
*/
|
|
||||||
#define ETHER_ISMULTI(ea) (((uint8 *)(ea))[0] & 1)
|
|
||||||
|
|
||||||
|
|
||||||
/* compare two ethernet addresses - assumes the pointers can be referenced as shorts */
|
|
||||||
#define ether_cmp(a, b) (!(((short*)a)[0] == ((short*)b)[0]) | \
|
|
||||||
!(((short*)a)[1] == ((short*)b)[1]) | \
|
|
||||||
!(((short*)a)[2] == ((short*)b)[2]))
|
|
||||||
|
|
||||||
/* copy an ethernet address - assumes the pointers can be referenced as shorts */
|
|
||||||
#define ether_copy(s, d) { \
|
|
||||||
((short*)d)[0] = ((short*)s)[0]; \
|
|
||||||
((short*)d)[1] = ((short*)s)[1]; \
|
|
||||||
((short*)d)[2] = ((short*)s)[2]; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Takes a pointer, returns true if a 48-bit broadcast (all ones)
|
|
||||||
*/
|
|
||||||
#define ETHER_ISBCAST(ea) ((((uint8 *)(ea))[0] & \
|
|
||||||
((uint8 *)(ea))[1] & \
|
|
||||||
((uint8 *)(ea))[2] & \
|
|
||||||
((uint8 *)(ea))[3] & \
|
|
||||||
((uint8 *)(ea))[4] & \
|
|
||||||
((uint8 *)(ea))[5]) == 0xff)
|
|
||||||
|
|
||||||
static const struct ether_addr ether_bcast = {{255, 255, 255, 255, 255, 255}};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Takes a pointer, returns true if a 48-bit null address (all zeros)
|
|
||||||
*/
|
|
||||||
#define ETHER_ISNULLADDR(ea) ((((uint8 *)(ea))[0] | \
|
|
||||||
((uint8 *)(ea))[1] | \
|
|
||||||
((uint8 *)(ea))[2] | \
|
|
||||||
((uint8 *)(ea))[3] | \
|
|
||||||
((uint8 *)(ea))[4] | \
|
|
||||||
((uint8 *)(ea))[5]) == 0)
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __NET_ETHERNET_H */
|
|
|
@ -1,147 +0,0 @@
|
||||||
/*
|
|
||||||
* Fundamental types and constants relating to WPA
|
|
||||||
*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _proto_wpa_h_
|
|
||||||
#define _proto_wpa_h_
|
|
||||||
|
|
||||||
#include <typedefs.h>
|
|
||||||
#include <proto/ethernet.h>
|
|
||||||
|
|
||||||
/* enable structure packing */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
#pragma pack(1)
|
|
||||||
#define PACKED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Reason Codes */
|
|
||||||
|
|
||||||
/* 10 and 11 are from TGh. */
|
|
||||||
#define DOT11_RC_BAD_PC 10 /* Unacceptable power capability element */
|
|
||||||
#define DOT11_RC_BAD_CHANNELS 11 /* Unacceptable supported channels element */
|
|
||||||
/* 12 is unused */
|
|
||||||
/* 13 through 23 taken from P802.11i/D3.0, November 2002 */
|
|
||||||
#define DOT11_RC_INVALID_WPA_IE 13 /* Invalid info. element */
|
|
||||||
#define DOT11_RC_MIC_FAILURE 14 /* Michael failure */
|
|
||||||
#define DOT11_RC_4WH_TIMEOUT 15 /* 4-way handshake timeout */
|
|
||||||
#define DOT11_RC_GTK_UPDATE_TIMEOUT 16 /* Group key update timeout */
|
|
||||||
#define DOT11_RC_WPA_IE_MISMATCH 17 /* WPA IE in 4-way handshake differs from
|
|
||||||
* (re-)assoc. request/probe response
|
|
||||||
*/
|
|
||||||
#define DOT11_RC_INVALID_MC_CIPHER 18 /* Invalid multicast cipher */
|
|
||||||
#define DOT11_RC_INVALID_UC_CIPHER 19 /* Invalid unicast cipher */
|
|
||||||
#define DOT11_RC_INVALID_AKMP 20 /* Invalid authenticated key management protocol */
|
|
||||||
#define DOT11_RC_BAD_WPA_VERSION 21 /* Unsupported WPA version */
|
|
||||||
#define DOT11_RC_INVALID_WPA_CAP 22 /* Invalid WPA IE capabilities */
|
|
||||||
#define DOT11_RC_8021X_AUTH_FAIL 23 /* 802.1X authentication failure */
|
|
||||||
|
|
||||||
#define WPA2_PMKID_LEN 16
|
|
||||||
|
|
||||||
/* WPA IE fixed portion */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint8 tag; /* TAG */
|
|
||||||
uint8 length; /* TAG length */
|
|
||||||
uint8 oui[3]; /* IE OUI */
|
|
||||||
uint8 oui_type; /* OUI type */
|
|
||||||
struct {
|
|
||||||
uint8 low;
|
|
||||||
uint8 high;
|
|
||||||
} PACKED version; /* IE version */
|
|
||||||
} PACKED wpa_ie_fixed_t;
|
|
||||||
#define WPA_IE_OUITYPE_LEN 4
|
|
||||||
#define WPA_IE_FIXED_LEN 8
|
|
||||||
#define WPA_IE_TAG_FIXED_LEN 6
|
|
||||||
|
|
||||||
#ifdef BCMWPA2
|
|
||||||
typedef struct {
|
|
||||||
uint8 tag; /* TAG */
|
|
||||||
uint8 length; /* TAG length */
|
|
||||||
struct {
|
|
||||||
uint8 low;
|
|
||||||
uint8 high;
|
|
||||||
} PACKED version; /* IE version */
|
|
||||||
} PACKED wpa_rsn_ie_fixed_t;
|
|
||||||
#define WPA_RSN_IE_FIXED_LEN 4
|
|
||||||
#define WPA_RSN_IE_TAG_FIXED_LEN 2
|
|
||||||
typedef uint8 wpa_pmkid_t[WPA2_PMKID_LEN];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* WPA suite/multicast suite */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint8 oui[3];
|
|
||||||
uint8 type;
|
|
||||||
} PACKED wpa_suite_t, wpa_suite_mcast_t;
|
|
||||||
#define WPA_SUITE_LEN 4
|
|
||||||
|
|
||||||
/* WPA unicast suite list/key management suite list */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
uint8 low;
|
|
||||||
uint8 high;
|
|
||||||
} PACKED count;
|
|
||||||
wpa_suite_t list[1];
|
|
||||||
} PACKED wpa_suite_ucast_t, wpa_suite_auth_key_mgmt_t;
|
|
||||||
#define WPA_IE_SUITE_COUNT_LEN 2
|
|
||||||
#ifdef BCMWPA2
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
uint8 low;
|
|
||||||
uint8 high;
|
|
||||||
} PACKED count;
|
|
||||||
wpa_pmkid_t list[1];
|
|
||||||
} PACKED wpa_pmkid_list_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* WPA cipher suites */
|
|
||||||
#define WPA_CIPHER_NONE 0 /* None */
|
|
||||||
#define WPA_CIPHER_WEP_40 1 /* WEP (40-bit) */
|
|
||||||
#define WPA_CIPHER_TKIP 2 /* TKIP: default for WPA */
|
|
||||||
#define WPA_CIPHER_AES_OCB 3 /* AES (OCB) */
|
|
||||||
#define WPA_CIPHER_AES_CCM 4 /* AES (CCM) */
|
|
||||||
#define WPA_CIPHER_WEP_104 5 /* WEP (104-bit) */
|
|
||||||
|
|
||||||
#define IS_WPA_CIPHER(cipher) ((cipher) == WPA_CIPHER_NONE || \
|
|
||||||
(cipher) == WPA_CIPHER_WEP_40 || \
|
|
||||||
(cipher) == WPA_CIPHER_WEP_104 || \
|
|
||||||
(cipher) == WPA_CIPHER_TKIP || \
|
|
||||||
(cipher) == WPA_CIPHER_AES_OCB || \
|
|
||||||
(cipher) == WPA_CIPHER_AES_CCM)
|
|
||||||
|
|
||||||
/* WPA TKIP countermeasures parameters */
|
|
||||||
#define WPA_TKIP_CM_DETECT 60 /* multiple MIC failure window (seconds) */
|
|
||||||
#define WPA_TKIP_CM_BLOCK 60 /* countermeasures active window (seconds) */
|
|
||||||
|
|
||||||
/* WPA capabilities defined in 802.11i */
|
|
||||||
#define WPA_CAP_4_REPLAY_CNTRS 2
|
|
||||||
#define WPA_CAP_16_REPLAY_CNTRS 3
|
|
||||||
#define WPA_CAP_REPLAY_CNTR_SHIFT 2
|
|
||||||
#define WPA_CAP_REPLAY_CNTR_MASK 0x000c
|
|
||||||
|
|
||||||
/* WPA Specific defines */
|
|
||||||
#define WPA_CAP_LEN 2 /* Length of RSN capabilities in RSN IE (2 octets) */
|
|
||||||
|
|
||||||
#ifdef BCMWPA2
|
|
||||||
#define WPA_CAP_WPA2_PREAUTH 1
|
|
||||||
#endif /* BCMWPA2 */
|
|
||||||
|
|
||||||
#undef PACKED
|
|
||||||
#if !defined(__GNUC__)
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _proto_wpa_h_ */
|
|
|
@ -1,229 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TYPEDEFS_H_
|
|
||||||
#define _TYPEDEFS_H_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Inferred Typedefs
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Infer the compile environment based on preprocessor symbols and pramas.
|
|
||||||
* Override type definitions as needed, and include configuration dependent
|
|
||||||
* header files to define types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
#define TYPEDEF_BOOL
|
|
||||||
#ifndef FALSE
|
|
||||||
#define FALSE false
|
|
||||||
#endif
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE true
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
#if defined(_NEED_SIZE_T_)
|
|
||||||
typedef long unsigned int size_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TYPEDEF_UINT
|
|
||||||
#define TYPEDEF_USHORT
|
|
||||||
#define TYPEDEF_ULONG
|
|
||||||
|
|
||||||
|
|
||||||
/* Do not support the (u)int64 types with strict ansi for GNU C */
|
|
||||||
#if defined(__GNUC__) && defined(__STRICT_ANSI__)
|
|
||||||
#define TYPEDEF_INT64
|
|
||||||
#define TYPEDEF_UINT64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* pick up ushort & uint from standard types.h */
|
|
||||||
#if defined(linux) && defined(__KERNEL__)
|
|
||||||
#include <linux/types.h> /* sys/types.h and linux/types.h are oil and water */
|
|
||||||
#else
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* use the default typedefs in the next section of this file */
|
|
||||||
#define USE_TYPEDEF_DEFAULTS
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Default Typedefs
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef USE_TYPEDEF_DEFAULTS
|
|
||||||
#undef USE_TYPEDEF_DEFAULTS
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_BOOL
|
|
||||||
typedef /* @abstract@ */ unsigned char bool;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* define uchar, ushort, uint, ulong */
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_UCHAR
|
|
||||||
typedef unsigned char uchar;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_USHORT
|
|
||||||
typedef unsigned short ushort;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_UINT
|
|
||||||
typedef unsigned int uint;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_ULONG
|
|
||||||
typedef unsigned long ulong;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* define [u]int8/16/32/64, uintptr */
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_UINT8
|
|
||||||
typedef unsigned char uint8;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_UINT16
|
|
||||||
typedef unsigned short uint16;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_UINT32
|
|
||||||
typedef unsigned int uint32;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_UINT64
|
|
||||||
typedef unsigned long long uint64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_UINTPTR
|
|
||||||
typedef unsigned int uintptr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_INT8
|
|
||||||
typedef signed char int8;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_INT16
|
|
||||||
typedef signed short int16;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_INT32
|
|
||||||
typedef signed int int32;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_INT64
|
|
||||||
typedef signed long long int64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* define float32/64, float_t */
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_FLOAT32
|
|
||||||
typedef float float32;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_FLOAT64
|
|
||||||
typedef double float64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* abstracted floating point type allows for compile time selection of
|
|
||||||
* single or double precision arithmetic. Compiling with -DFLOAT32
|
|
||||||
* selects single precision; the default is double precision.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef TYPEDEF_FLOAT_T
|
|
||||||
|
|
||||||
#if defined(FLOAT32)
|
|
||||||
typedef float32 float_t;
|
|
||||||
#else /* default to double precision floating point */
|
|
||||||
typedef float64 float_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* TYPEDEF_FLOAT_T */
|
|
||||||
|
|
||||||
/* define macro values */
|
|
||||||
|
|
||||||
#ifndef FALSE
|
|
||||||
#define FALSE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE 1 /* TRUE */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NULL
|
|
||||||
#define NULL 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef OFF
|
|
||||||
#define OFF 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ON
|
|
||||||
#define ON 1 /* ON = 1 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define AUTO (-1) /* Auto = -1 */
|
|
||||||
|
|
||||||
/* define PTRSZ, INLINE */
|
|
||||||
|
|
||||||
#ifndef PTRSZ
|
|
||||||
#define PTRSZ sizeof(char*)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INLINE
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
|
|
||||||
#define INLINE __inline
|
|
||||||
|
|
||||||
#elif __GNUC__
|
|
||||||
|
|
||||||
#define INLINE __inline__
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define INLINE
|
|
||||||
|
|
||||||
#endif /* _MSC_VER */
|
|
||||||
|
|
||||||
#endif /* INLINE */
|
|
||||||
|
|
||||||
#undef TYPEDEF_BOOL
|
|
||||||
#undef TYPEDEF_UCHAR
|
|
||||||
#undef TYPEDEF_USHORT
|
|
||||||
#undef TYPEDEF_UINT
|
|
||||||
#undef TYPEDEF_ULONG
|
|
||||||
#undef TYPEDEF_UINT8
|
|
||||||
#undef TYPEDEF_UINT16
|
|
||||||
#undef TYPEDEF_UINT32
|
|
||||||
#undef TYPEDEF_UINT64
|
|
||||||
#undef TYPEDEF_UINTPTR
|
|
||||||
#undef TYPEDEF_INT8
|
|
||||||
#undef TYPEDEF_INT16
|
|
||||||
#undef TYPEDEF_INT32
|
|
||||||
#undef TYPEDEF_INT64
|
|
||||||
#undef TYPEDEF_FLOAT32
|
|
||||||
#undef TYPEDEF_FLOAT64
|
|
||||||
#undef TYPEDEF_FLOAT_T
|
|
||||||
|
|
||||||
#endif /* USE_TYPEDEF_DEFAULTS */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Including the bcmdefs.h here, to make sure everyone including typedefs.h
|
|
||||||
* gets this automatically
|
|
||||||
*/
|
|
||||||
#include <bcmdefs.h>
|
|
||||||
|
|
||||||
#endif /* _TYPEDEFS_H_ */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,101 +0,0 @@
|
||||||
/*
|
|
||||||
* Broadcom wireless network adapter utility functions
|
|
||||||
*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _wlutils_h_
|
|
||||||
#define _wlutils_h_
|
|
||||||
|
|
||||||
#include <typedefs.h>
|
|
||||||
#include <wlioctl.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Pass a wlioctl request to the specified interface.
|
|
||||||
* @param name interface name
|
|
||||||
* @param cmd WLC_GET_MAGIC <= cmd < WLC_LAST
|
|
||||||
* @param buf buffer for passing in and/or receiving data
|
|
||||||
* @param len length of buf
|
|
||||||
* @return >= 0 if successful or < 0 otherwise
|
|
||||||
*/
|
|
||||||
extern int wl_ioctl(char *name, int cmd, void *buf, int len);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Probe the specified interface.
|
|
||||||
* @param name interface name
|
|
||||||
* @return >= 0 if a Broadcom wireless device or < 0 otherwise
|
|
||||||
*/
|
|
||||||
extern int wl_probe(char *name);
|
|
||||||
|
|
||||||
extern int wl_iovar_set(char *ifname, char *iovar, void *param, int paramlen);
|
|
||||||
extern int wl_iovar_get(char *ifname, char *iovar, void *bufptr, int buflen);
|
|
||||||
/*
|
|
||||||
* Set/Get named variable.
|
|
||||||
* @param ifname interface name
|
|
||||||
* @param iovar variable name
|
|
||||||
* @param param input param value/buffer
|
|
||||||
* @param paramlen input param value/buffer length
|
|
||||||
* @param bufptr io buffer
|
|
||||||
* @param buflen io buffer length
|
|
||||||
* @param val val or val pointer for int routines
|
|
||||||
* @return success == 0, failure != 0
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* set named driver variable to int value
|
|
||||||
* calling example: wl_iovar_setint(ifname, "arate", rate)
|
|
||||||
*/
|
|
||||||
static inline int
|
|
||||||
wl_iovar_setint(char *ifname, char *iovar, int val)
|
|
||||||
{
|
|
||||||
return wl_iovar_set(ifname, iovar, &val, sizeof(val));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* get named driver variable to int value and return error indication
|
|
||||||
* calling example: wl_iovar_getint(ifname, "arate", &rate)
|
|
||||||
*/
|
|
||||||
static inline int
|
|
||||||
wl_iovar_getint(char *ifname, char *iovar, int *val)
|
|
||||||
{
|
|
||||||
return wl_iovar_get(ifname, iovar, val, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set/Get named variable indexed by BSS Configuration
|
|
||||||
* @param ifname interface name
|
|
||||||
* @param iovar variable name
|
|
||||||
* @param bssidx bsscfg index
|
|
||||||
* @param param input param value/buffer
|
|
||||||
* @param paramlen input param value/buffer length
|
|
||||||
* @param bufptr io buffer
|
|
||||||
* @param buflen io buffer length
|
|
||||||
* @param val val or val pointer for int routines
|
|
||||||
* @return success == 0, failure != 0
|
|
||||||
*/
|
|
||||||
extern int wl_bssiovar_get(char *ifname, char *iovar, int bssidx, void *outbuf, int len);
|
|
||||||
extern int wl_bssiovar_set(char *ifname, char *iovar, int bssidx, void *param, int paramlen);
|
|
||||||
/*
|
|
||||||
* set named & bss indexed driver variable to int value
|
|
||||||
*/
|
|
||||||
static inline int
|
|
||||||
wl_bssiovar_setint(char *ifname, char *iovar, int bssidx, int val)
|
|
||||||
{
|
|
||||||
return wl_bssiovar_set(ifname, iovar, bssidx, &val, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
wl_bssiovar_getint(char *ifname, char *iovar, int bssidx, int *val)
|
|
||||||
{
|
|
||||||
return wl_bssiovar_get(ifname, iovar, bssidx, val, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern int wl_bssiovar_setint(char *ifname, char *iovar, int bssidx, int val);
|
|
||||||
|
|
||||||
#endif /* _wlutils_h_ */
|
|
|
@ -1,16 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
int nvram_set(const char *name, const char *value)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *nvram_get(const char *name)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nvram_unset(const char *name)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
all: wlc
|
|
||||||
clean:
|
|
||||||
rm -f *.o wlc
|
|
||||||
|
|
||||||
wlc: wlc.o ioctl.o
|
|
||||||
%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -I../include -Wall -c -o $@ $<
|
|
||||||
|
|
||||||
.PHONY: all clean
|
|
|
@ -1,297 +0,0 @@
|
||||||
/*
|
|
||||||
* Wireless network adapter utilities
|
|
||||||
*
|
|
||||||
* Copyright 2006, Broadcom Corporation
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
* FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
|
|
||||||
typedef u_int64_t u64;
|
|
||||||
typedef u_int32_t u32;
|
|
||||||
typedef u_int16_t u16;
|
|
||||||
typedef u_int8_t u8;
|
|
||||||
#include <linux/sockios.h>
|
|
||||||
#include <linux/ethtool.h>
|
|
||||||
|
|
||||||
#include <typedefs.h>
|
|
||||||
#include <wlioctl.h>
|
|
||||||
#include <bcmutils.h>
|
|
||||||
#include <wlutils.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
wl_ioctl(char *name, int cmd, void *buf, int len)
|
|
||||||
{
|
|
||||||
struct ifreq ifr;
|
|
||||||
wl_ioctl_t ioc;
|
|
||||||
int ret = 0;
|
|
||||||
int s;
|
|
||||||
|
|
||||||
/* open socket to kernel */
|
|
||||||
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
|
||||||
perror("socket");
|
|
||||||
return errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do it */
|
|
||||||
ioc.cmd = cmd;
|
|
||||||
ioc.buf = buf;
|
|
||||||
ioc.len = len;
|
|
||||||
strncpy(ifr.ifr_name, name, IFNAMSIZ);
|
|
||||||
ifr.ifr_data = (caddr_t) &ioc;
|
|
||||||
if ((ret = ioctl(s, SIOCDEVPRIVATE, &ifr)) < 0)
|
|
||||||
|
|
||||||
/* cleanup */
|
|
||||||
close(s);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
wl_get_dev_type(char *name, void *buf, int len)
|
|
||||||
{
|
|
||||||
int s;
|
|
||||||
int ret;
|
|
||||||
struct ifreq ifr;
|
|
||||||
struct ethtool_drvinfo info;
|
|
||||||
|
|
||||||
/* open socket to kernel */
|
|
||||||
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
|
||||||
perror("socket");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get device type */
|
|
||||||
memset(&info, 0, sizeof(info));
|
|
||||||
info.cmd = ETHTOOL_GDRVINFO;
|
|
||||||
ifr.ifr_data = (caddr_t)&info;
|
|
||||||
strncpy(ifr.ifr_name, name, IFNAMSIZ);
|
|
||||||
if ((ret = ioctl(s, SIOCETHTOOL, &ifr)) < 0) {
|
|
||||||
*(char *)buf = '\0';
|
|
||||||
} else
|
|
||||||
strncpy(buf, info.driver, len);
|
|
||||||
|
|
||||||
close(s);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
wl_probe(char *name)
|
|
||||||
{
|
|
||||||
int ret, val;
|
|
||||||
char buf[3];
|
|
||||||
if ((ret = wl_get_dev_type(name, buf, 3)) < 0)
|
|
||||||
return ret;
|
|
||||||
/* Check interface */
|
|
||||||
if (strncmp(buf, "wl", 2))
|
|
||||||
return -1;
|
|
||||||
if ((ret = wl_ioctl(name, WLC_GET_VERSION, &val, sizeof(val))))
|
|
||||||
return ret;
|
|
||||||
if (val > WLC_IOCTL_VERSION)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
wl_iovar_getbuf(char *ifname, char *iovar, void *param, int paramlen, void *bufptr, int buflen)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
uint namelen;
|
|
||||||
uint iolen;
|
|
||||||
|
|
||||||
namelen = strlen(iovar) + 1; /* length of iovar name plus null */
|
|
||||||
iolen = namelen + paramlen;
|
|
||||||
|
|
||||||
/* check for overflow */
|
|
||||||
if (iolen > buflen)
|
|
||||||
return (BCME_BUFTOOSHORT);
|
|
||||||
|
|
||||||
memcpy(bufptr, iovar, namelen); /* copy iovar name including null */
|
|
||||||
memcpy((int8*)bufptr + namelen, param, paramlen);
|
|
||||||
|
|
||||||
err = wl_ioctl(ifname, WLC_GET_VAR, bufptr, buflen);
|
|
||||||
|
|
||||||
return (err);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
wl_iovar_setbuf(char *ifname, char *iovar, void *param, int paramlen, void *bufptr, int buflen)
|
|
||||||
{
|
|
||||||
uint namelen;
|
|
||||||
uint iolen;
|
|
||||||
|
|
||||||
namelen = strlen(iovar) + 1; /* length of iovar name plus null */
|
|
||||||
iolen = namelen + paramlen;
|
|
||||||
|
|
||||||
/* check for overflow */
|
|
||||||
if (iolen > buflen)
|
|
||||||
return (BCME_BUFTOOSHORT);
|
|
||||||
|
|
||||||
memcpy(bufptr, iovar, namelen); /* copy iovar name including null */
|
|
||||||
memcpy((int8*)bufptr + namelen, param, paramlen);
|
|
||||||
|
|
||||||
return wl_ioctl(ifname, WLC_SET_VAR, bufptr, iolen);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
wl_iovar_set(char *ifname, char *iovar, void *param, int paramlen)
|
|
||||||
{
|
|
||||||
char smbuf[WLC_IOCTL_SMLEN];
|
|
||||||
|
|
||||||
return wl_iovar_setbuf(ifname, iovar, param, paramlen, smbuf, sizeof(smbuf));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
wl_iovar_get(char *ifname, char *iovar, void *bufptr, int buflen)
|
|
||||||
{
|
|
||||||
char smbuf[WLC_IOCTL_SMLEN];
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* use the return buffer if it is bigger than what we have on the stack */
|
|
||||||
if (buflen > sizeof(smbuf)) {
|
|
||||||
ret = wl_iovar_getbuf(ifname, iovar, NULL, 0, bufptr, buflen);
|
|
||||||
} else {
|
|
||||||
ret = wl_iovar_getbuf(ifname, iovar, NULL, 0, smbuf, sizeof(smbuf));
|
|
||||||
if (ret == 0)
|
|
||||||
memcpy(bufptr, smbuf, buflen);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* format a bsscfg indexed iovar buffer
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
wl_bssiovar_mkbuf(char *iovar, int bssidx, void *param, int paramlen, void *bufptr, int buflen,
|
|
||||||
int *plen)
|
|
||||||
{
|
|
||||||
char *prefix = "bsscfg:";
|
|
||||||
int8* p;
|
|
||||||
uint prefixlen;
|
|
||||||
uint namelen;
|
|
||||||
uint iolen;
|
|
||||||
|
|
||||||
prefixlen = strlen(prefix); /* length of bsscfg prefix */
|
|
||||||
namelen = strlen(iovar) + 1; /* length of iovar name + null */
|
|
||||||
iolen = prefixlen + namelen + sizeof(int) + paramlen;
|
|
||||||
|
|
||||||
/* check for overflow */
|
|
||||||
if (buflen < 0 || iolen > (uint)buflen) {
|
|
||||||
*plen = 0;
|
|
||||||
return BCME_BUFTOOSHORT;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = (int8*)bufptr;
|
|
||||||
|
|
||||||
/* copy prefix, no null */
|
|
||||||
memcpy(p, prefix, prefixlen);
|
|
||||||
p += prefixlen;
|
|
||||||
|
|
||||||
/* copy iovar name including null */
|
|
||||||
memcpy(p, iovar, namelen);
|
|
||||||
p += namelen;
|
|
||||||
|
|
||||||
/* bss config index as first param */
|
|
||||||
memcpy(p, &bssidx, sizeof(int32));
|
|
||||||
p += sizeof(int32);
|
|
||||||
|
|
||||||
/* parameter buffer follows */
|
|
||||||
if (paramlen)
|
|
||||||
memcpy(p, param, paramlen);
|
|
||||||
|
|
||||||
*plen = iolen;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* set named & bss indexed driver variable to buffer value
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
wl_bssiovar_setbuf(char *ifname, char *iovar, int bssidx, void *param, int paramlen, void *bufptr,
|
|
||||||
int buflen)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
int iolen;
|
|
||||||
|
|
||||||
err = wl_bssiovar_mkbuf(iovar, bssidx, param, paramlen, bufptr, buflen, &iolen);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
return wl_ioctl(ifname, WLC_SET_VAR, bufptr, iolen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* get named & bss indexed driver variable buffer value
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
wl_bssiovar_getbuf(char *ifname, char *iovar, int bssidx, void *param, int paramlen, void *bufptr,
|
|
||||||
int buflen)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
int iolen;
|
|
||||||
|
|
||||||
err = wl_bssiovar_mkbuf(iovar, bssidx, param, paramlen, bufptr, buflen, &iolen);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
return wl_ioctl(ifname, WLC_GET_VAR, bufptr, buflen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* set named & bss indexed driver variable to buffer value
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
wl_bssiovar_set(char *ifname, char *iovar, int bssidx, void *param, int paramlen)
|
|
||||||
{
|
|
||||||
char smbuf[WLC_IOCTL_SMLEN];
|
|
||||||
|
|
||||||
return wl_bssiovar_setbuf(ifname, iovar, bssidx, param, paramlen, smbuf, sizeof(smbuf));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* get named & bss indexed driver variable buffer value
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
wl_bssiovar_get(char *ifname, char *iovar, int bssidx, void *outbuf, int len)
|
|
||||||
{
|
|
||||||
char smbuf[WLC_IOCTL_SMLEN];
|
|
||||||
int err;
|
|
||||||
|
|
||||||
/* use the return buffer if it is bigger than what we have on the stack */
|
|
||||||
if (len > (int)sizeof(smbuf)) {
|
|
||||||
err = wl_bssiovar_getbuf(ifname, iovar, bssidx, NULL, 0, outbuf, len);
|
|
||||||
} else {
|
|
||||||
memset(smbuf, 0, sizeof(smbuf));
|
|
||||||
err = wl_bssiovar_getbuf(ifname, iovar, bssidx, NULL, 0, smbuf, sizeof(smbuf));
|
|
||||||
if (err == 0)
|
|
||||||
memcpy(outbuf, smbuf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
wl_printlasterror(char *name)
|
|
||||||
{
|
|
||||||
char err_buf[WLC_IOCTL_SMLEN];
|
|
||||||
strcpy(err_buf, "bcmerrstr");
|
|
||||||
|
|
||||||
fprintf(stderr, "Error: ");
|
|
||||||
if ( wl_ioctl(name, WLC_GET_VAR, err_buf, sizeof (err_buf)) != 0)
|
|
||||||
fprintf(stderr, "Error getting the Errorstring from driver\n");
|
|
||||||
else
|
|
||||||
fprintf(stderr, err_buf);
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,27 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for wlcompat
|
|
||||||
#
|
|
||||||
# Copyright (C) 2005-2007 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.
|
|
||||||
#
|
|
||||||
|
|
||||||
EXTRA_CFLAGS += -DBCMDRIVER=1 -DBCMDMA64=1 -I../include
|
|
||||||
ifneq ($(DEBUG),)
|
|
||||||
EXTRA_CFLAGS += -DDEBUG=1
|
|
||||||
_D=-debug
|
|
||||||
endif
|
|
||||||
ifneq ($(WL_WEXT),)
|
|
||||||
EXTRA_CFLAGS += -DWL_WEXT=1
|
|
||||||
endif
|
|
||||||
|
|
||||||
obj-m := wlcompat$(_D).o
|
|
||||||
modules: wlcompat$(_D).o
|
|
||||||
|
|
||||||
wlcompat$(_D).o: wlcompat.c
|
|
||||||
$(CC) $(CFLAGS) $(EXTRA_CFLAGS_nostdinc) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) $(CFLAGS_$@) -c -o $@ $<
|
|
||||||
|
|
||||||
-include $(TOPDIR)/Rules.make
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue