finally move buildroot-ng to trunk
This commit is contained in:
		
							
								
								
									
										148
									
								
								package/broadcom-wl/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								package/broadcom-wl/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,148 @@
 | 
			
		||||
# 
 | 
			
		||||
# Copyright (C) 2006 OpenWrt.org
 | 
			
		||||
#
 | 
			
		||||
# This is free software, licensed under the GNU General Public License v2.
 | 
			
		||||
# See /LICENSE for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2480 2005-11-14 02:07:33Z nbd $
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/rules.mk
 | 
			
		||||
include $(INCLUDE_DIR)/kernel.mk
 | 
			
		||||
 | 
			
		||||
PKG_NAME:=broadcom-wl
 | 
			
		||||
PKG_VERSION:=4.80.17.0
 | 
			
		||||
PKG_RELEASE:=1
 | 
			
		||||
WLC_VERSION:=0.1
 | 
			
		||||
 | 
			
		||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 | 
			
		||||
PKG_SOURCE_URL:=http://downloads.openwrt.org/sources
 | 
			
		||||
PKG_MD5SUM:=3183ddb60e3e882b41df1776c89b614c
 | 
			
		||||
PKG_CAT:=bzcat
 | 
			
		||||
 | 
			
		||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
 | 
			
		||||
 | 
			
		||||
include $(INCLUDE_DIR)/package.mk
 | 
			
		||||
 | 
			
		||||
define Package/broadcom-wl/Default
 | 
			
		||||
  SECTION:=net
 | 
			
		||||
  CATEGORY:=Kernel drivers
 | 
			
		||||
  DEPENDS:=@PACKAGE_kmod-brcm-wl||PACKAGE_kmod-brcm-wl-mimo
 | 
			
		||||
  SUBMENU:=Proprietary BCM43xx WiFi driver
 | 
			
		||||
  SUBMENUDEP:=@LINUX_2_4_BRCM
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/kmod-brcm-wl/Default
 | 
			
		||||
  $(call Package/broadcom-wl/Default)
 | 
			
		||||
  SECTION:=kernel
 | 
			
		||||
  DEPENDS:=@LINUX_2_4_BRCM
 | 
			
		||||
  TITLE:=Kernel driver for BCM43xx chipsets
 | 
			
		||||
  DESCRIPTION:=\
 | 
			
		||||
	This package contains the proprietary wireless driver for the Broadcom \\\
 | 
			
		||||
	BCM43xx chipset
 | 
			
		||||
  VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(PKG_RELEASE)
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/kmod-brcm-wl
 | 
			
		||||
  $(call Package/kmod-brcm-wl/Default)
 | 
			
		||||
  DEFAULT:=y
 | 
			
		||||
  TITLE+= (normal version)
 | 
			
		||||
  DESCRIPTION+= (normal version).
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/kmod-brcm-wl-mimo
 | 
			
		||||
  $(call Package/kmod-brcm-wl/Default)
 | 
			
		||||
  TITLE+= (MIMO version)
 | 
			
		||||
  DESCRIPTION+= (MIMO version).
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/wlc
 | 
			
		||||
  $(call Package/broadcom-wl/Default)
 | 
			
		||||
  DEFAULT:=y
 | 
			
		||||
  TITLE:=Proprietary Broadcom wl driver setup utility
 | 
			
		||||
  DESCRIPTION:=\
 | 
			
		||||
	This package contains an utility for initializing the proprietary Broadcom \\\
 | 
			
		||||
	wl driver.
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/wl
 | 
			
		||||
  $(call Package/broadcom-wl/Default)
 | 
			
		||||
  TITLE:=Proprietary Broadcom wl driver config utility
 | 
			
		||||
  DESCRIPTION:=\
 | 
			
		||||
	This package contains the proprietary utility (wl) for configuring the \\\
 | 
			
		||||
	proprietary Broadcom wl driver.
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/nas
 | 
			
		||||
  $(call Package/broadcom-wl/Default)
 | 
			
		||||
  DEPENDS+= +nvram
 | 
			
		||||
  TITLE:=Proprietary Broadcom WPA/WPA2 authenticator
 | 
			
		||||
  DESCRIPTION:=\
 | 
			
		||||
	This package contains the proprietary WPA/WPA2 authenticator (nas) for the \\\
 | 
			
		||||
	proprietary Broadcom wl driver.
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
MAKEFLAGS_KMOD:= -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) $(MAKEFLAGS_KMOD) \
 | 
			
		||||
		modules
 | 
			
		||||
	$(MAKE) $(MAKEFLAGS_KMOD) MOD_NAME="_mimo" \
 | 
			
		||||
		modules
 | 
			
		||||
 | 
			
		||||
	# Compile wlc
 | 
			
		||||
	$(MAKE) -C $(PKG_BUILD_DIR)/wlc \
 | 
			
		||||
		$(TARGET_CONFIGURE_OPTS) \
 | 
			
		||||
		CFLAGS="-I$(PKG_BUILD_DIR)/wlc/include $(TARGET_CFLAGS)" \
 | 
			
		||||
		all
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define wl_template
 | 
			
		||||
	install -d -m0755 $(1)/etc/modules.d
 | 
			
		||||
	echo "wl$(2)" > $(1)/etc/modules.d/20-wl$(2)
 | 
			
		||||
	install -d -m0755 $(1)/lib/modules/$(LINUX_VERSION)
 | 
			
		||||
	install -m0644 $(PKG_BUILD_DIR)/kmod/wl$(2).o $(PKG_BUILD_DIR)/kmod/wl$(2).o.patch $(1)/lib/modules/$(LINUX_VERSION)/
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/kmod-brcm-wl/install
 | 
			
		||||
	$(call wl_template,$(1))
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/kmod-brcm-wl-mimo/install
 | 
			
		||||
	$(call wl_template,$(1),_mimo)
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/wlc/install
 | 
			
		||||
	$(CP) ./files/* $(1)/
 | 
			
		||||
	install -d -m0755 $(1)/sbin
 | 
			
		||||
	install -m0755 $(PKG_BUILD_DIR)/wlc/wlc $(1)/sbin/
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/wl/install
 | 
			
		||||
	install -d -m0755 $(1)/usr/sbin
 | 
			
		||||
	install -m0755 $(PKG_BUILD_DIR)/wl $(1)/usr/sbin/
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/nas/install
 | 
			
		||||
	install -d -m0755 $(1)/usr/lib
 | 
			
		||||
	install -m0755 $(PKG_BUILD_DIR)/libbcmcrypto.so $(1)/usr/lib/
 | 
			
		||||
	install -d -m0755 $(1)/usr/sbin
 | 
			
		||||
	install -m0755 $(PKG_BUILD_DIR)/nas $(1)/usr/sbin/
 | 
			
		||||
	ln -sf nas $(1)/usr/sbin/nas4not
 | 
			
		||||
	ln -sf nas $(1)/usr/sbin/nas4wds
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
$(eval $(call BuildPackage,kmod-brcm-wl))
 | 
			
		||||
$(eval $(call BuildPackage,kmod-brcm-wl-mimo))
 | 
			
		||||
$(eval $(call BuildPackage,wlc))
 | 
			
		||||
$(eval $(call BuildPackage,wl))
 | 
			
		||||
$(eval $(call BuildPackage,nas))
 | 
			
		||||
							
								
								
									
										177
									
								
								package/broadcom-wl/files/lib/wifi/broadcom.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								package/broadcom-wl/files/lib/wifi/broadcom.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,177 @@
 | 
			
		||||
bridge_interface() {
 | 
			
		||||
	(
 | 
			
		||||
		. /etc/functions.sh
 | 
			
		||||
		include network
 | 
			
		||||
		scan_interfaces
 | 
			
		||||
		cfg="$(find_config "$1")"
 | 
			
		||||
		[ -z "$cfg" ] && return 0
 | 
			
		||||
		config_get iftype "$cfg" type
 | 
			
		||||
		[ "$iftype" = bridge ] && config_get "$iftype" bridge
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
scan_broadcom() {
 | 
			
		||||
	local device="$1"
 | 
			
		||||
 | 
			
		||||
	config_get vifs "$device" vifs
 | 
			
		||||
	for vif in $vifs; do
 | 
			
		||||
		config_get mode "$vif" mode
 | 
			
		||||
		case "$mode" in
 | 
			
		||||
			adhoc)
 | 
			
		||||
				adhoc=1
 | 
			
		||||
				adhoc_if="$vif"
 | 
			
		||||
			;;
 | 
			
		||||
			sta)
 | 
			
		||||
				sta=1
 | 
			
		||||
				sta_if="$vif"
 | 
			
		||||
			;;
 | 
			
		||||
			ap)
 | 
			
		||||
				ap=1
 | 
			
		||||
				ap_if="${ap_if:+$ap_if }$vif"
 | 
			
		||||
			;;
 | 
			
		||||
			*) echo "$device($vif): Invalid mode";;
 | 
			
		||||
		esac
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	local _c=
 | 
			
		||||
	for vif in ${adhoc_if:-$sta_if $ap_if}; do
 | 
			
		||||
		config_set "$vif" ifname "wl0${_c:+.$_c}"
 | 
			
		||||
		_c=$((${_c:-0} + 1))
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	mssid=1
 | 
			
		||||
	apsta=0
 | 
			
		||||
	radio=1
 | 
			
		||||
	case "$adhoc:$sta:$ap" in
 | 
			
		||||
		1*)
 | 
			
		||||
			ap=0
 | 
			
		||||
			mssid=0
 | 
			
		||||
			infra=0
 | 
			
		||||
		;;
 | 
			
		||||
		:1:1)
 | 
			
		||||
			apsta=1
 | 
			
		||||
			wet=1
 | 
			
		||||
		;;
 | 
			
		||||
		:1:)
 | 
			
		||||
			wet=1
 | 
			
		||||
			ap=0
 | 
			
		||||
			mssid=0
 | 
			
		||||
		;;
 | 
			
		||||
		::)
 | 
			
		||||
			radio=0
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
setup_broadcom() {
 | 
			
		||||
	local _c
 | 
			
		||||
	config_get channel "$device" channel
 | 
			
		||||
	config_get country "$device" country
 | 
			
		||||
	config_get maxassoc "$device" maxassoc
 | 
			
		||||
 | 
			
		||||
	_c=0
 | 
			
		||||
	nas="$(which nas)"
 | 
			
		||||
	nas_cmd=
 | 
			
		||||
	if_up=
 | 
			
		||||
	for vif in ${adhoc_if:-$sta_if $ap_if}; do
 | 
			
		||||
		append vif_pre_up "vif $_c" "$N"
 | 
			
		||||
		append vif_post_up "vif $_c" "$N"
 | 
			
		||||
		
 | 
			
		||||
		[ "$vif" = "$sta_if" ] || {
 | 
			
		||||
			config_get_bool hidden "$vif" hidden 1
 | 
			
		||||
			append vif_pre_up "closed $hidden" "$N"
 | 
			
		||||
			config_get_bool isolate "$vif" isolate
 | 
			
		||||
			append vif_pre_up "ap_isolate $hidden" "$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
 | 
			
		||||
			;;
 | 
			
		||||
			*psk*|*PSK*)
 | 
			
		||||
				wsec_r=1
 | 
			
		||||
				config_get key "$vif" key
 | 
			
		||||
				case "$enc" in
 | 
			
		||||
					wpa2*|WPA2*|PSK2*|psk2*) auth=128; wsec=4;;
 | 
			
		||||
					*) auth=4; crypto=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
 | 
			
		||||
					wpa2*|WPA2*) auth=64; wsec=4;;
 | 
			
		||||
					*) auth=2; crypto=2;;
 | 
			
		||||
				esac
 | 
			
		||||
				eval "${vif}_key=\"\$key\""
 | 
			
		||||
				nasopts="-r \"\$${vif}_key\" -h $server -p $port"
 | 
			
		||||
			;;
 | 
			
		||||
		esac
 | 
			
		||||
		append vif_post_up "wsec $wsec" "$N"
 | 
			
		||||
		append vif_post_up "wpa_auth $auth" "$N"
 | 
			
		||||
		append vif_post_up "wsec_restrict $wsec_r" "$N"
 | 
			
		||||
		append vif_post_up "eap_restrict $eap_r" "$N"
 | 
			
		||||
		
 | 
			
		||||
		config_get ssid "$vif" ssid
 | 
			
		||||
		append vif_post_up "vlan_mode 0"
 | 
			
		||||
		append vif_post_up "ssid $ssid" "$N"
 | 
			
		||||
		append vif_post_up "enabled 1" "$N"
 | 
			
		||||
		
 | 
			
		||||
		config_get ifname "$vif" ifname
 | 
			
		||||
		append if_up "ifconfig $ifname up" ";$N"
 | 
			
		||||
		[ -z "$nasopts" ] || {
 | 
			
		||||
			bridge="$(bridge_interface "$ifname")"
 | 
			
		||||
			eval "${vif}_ssid=\"\$ssid\""
 | 
			
		||||
			mode="-A"
 | 
			
		||||
			[ "$vif" = "$sta_if" ] && mode="-S"
 | 
			
		||||
			[ -z "$nas" ] || nas_cmd="${nas_cmd:+$nas_cmd$N}$nas -P /var/run/nas.$ifname.pid -H 34954 ${bridge:+ -l $bridge} -i $ifname $mode -m $auth -w $crypto -s \"\$${vif}_ssid\" -g 3600 $nasopts &"
 | 
			
		||||
		}
 | 
			
		||||
		_c=$(($_c + 1))
 | 
			
		||||
	done
 | 
			
		||||
	killall -KILL nas >&- 2>&-
 | 
			
		||||
	wlc stdin <<EOF
 | 
			
		||||
$ifdown
 | 
			
		||||
 | 
			
		||||
mssid $mssid
 | 
			
		||||
ap $ap
 | 
			
		||||
apsta $apsta
 | 
			
		||||
infra $infra
 | 
			
		||||
${wet:+wet 1}
 | 
			
		||||
 | 
			
		||||
radio ${radio:-1}
 | 
			
		||||
macfilter 0
 | 
			
		||||
maclist none
 | 
			
		||||
wds none
 | 
			
		||||
channel ${channel:-0}
 | 
			
		||||
country ${country:-IL0}
 | 
			
		||||
maxassoc ${maxassoc:-128}
 | 
			
		||||
 | 
			
		||||
$vif_pre_up
 | 
			
		||||
up
 | 
			
		||||
$vif_post_up
 | 
			
		||||
EOF
 | 
			
		||||
	eval "$nas_cmd"
 | 
			
		||||
	eval "$if_up"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								package/broadcom-wl/src/kmod/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								package/broadcom-wl/src/kmod/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile,v 1.2 2005/03/29 03:32:18 mbm Exp $
 | 
			
		||||
 | 
			
		||||
EXTRA_CFLAGS += -I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER
 | 
			
		||||
 | 
			
		||||
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' < $< > $@
 | 
			
		||||
 | 
			
		||||
wl$(MOD_NAME).o.patch: wl$(MOD_NAME).o
 | 
			
		||||
	$(OBJDUMP) -d $< | perl patchtable.pl > $@
 | 
			
		||||
 | 
			
		||||
modules: wl$(MOD_NAME).o.patch
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/Rules.make
 | 
			
		||||
							
								
								
									
										101
									
								
								package/broadcom-wl/src/kmod/bcmip.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								package/broadcom-wl/src/kmod/bcmip.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: bcmip.h,v 1.1.1.3 2006/02/27 03:43:16 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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_ */
 | 
			
		||||
							
								
								
									
										857
									
								
								package/broadcom-wl/src/kmod/bcmutils.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										857
									
								
								package/broadcom-wl/src/kmod/bcmutils.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,857 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Misc useful OS-independent routines.
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 * $Id: bcmutils.c,v 1.1.1.12 2006/02/27 03:43:16 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <typedefs.h>
 | 
			
		||||
#include <bcmdefs.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <osl.h>
 | 
			
		||||
#include "linux_osl.h"
 | 
			
		||||
#include "pktq.h"
 | 
			
		||||
#include <bcmutils.h>
 | 
			
		||||
#include <sbutils.h>
 | 
			
		||||
#include <bcmnvram.h>
 | 
			
		||||
#include <bcmendian.h>
 | 
			
		||||
#include <bcmdevs.h>
 | 
			
		||||
#include "bcmip.h"
 | 
			
		||||
 | 
			
		||||
#define ETHER_TYPE_8021Q       0x8100
 | 
			
		||||
#define ETHER_TYPE_IP          0x0800
 | 
			
		||||
#define VLAN_PRI_SHIFT             13
 | 
			
		||||
#define VLAN_PRI_MASK               7
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct  ether_header {
 | 
			
		||||
	uint8   ether_dhost[6];
 | 
			
		||||
	uint8   ether_shost[6];
 | 
			
		||||
	uint16  ether_type;
 | 
			
		||||
} __attribute__((packed));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct ethervlan_header {
 | 
			
		||||
	uint8   ether_dhost[6];
 | 
			
		||||
	uint8   ether_shost[6];
 | 
			
		||||
	uint16  vlan_type;		/* 0x8100 */
 | 
			
		||||
	uint16  vlan_tag;		/* priority, cfi and vid */
 | 
			
		||||
	uint16  ether_type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* copy a pkt buffer chain into a buffer */
 | 
			
		||||
uint
 | 
			
		||||
pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf)
 | 
			
		||||
{
 | 
			
		||||
	uint n, ret = 0;
 | 
			
		||||
 | 
			
		||||
	if (len < 0)
 | 
			
		||||
		len = 4096;	/* "infinite" */
 | 
			
		||||
 | 
			
		||||
	/* skip 'offset' bytes */
 | 
			
		||||
	for (; p && offset; p = PKTNEXT(osh, p)) {
 | 
			
		||||
		if (offset < (uint)PKTLEN(osh, p))
 | 
			
		||||
			break;
 | 
			
		||||
		offset -= PKTLEN(osh, p);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!p)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	/* copy the data */
 | 
			
		||||
	for (; p && len; p = PKTNEXT(osh, p)) {
 | 
			
		||||
		n = MIN((uint)PKTLEN(osh, p) - offset, (uint)len);
 | 
			
		||||
		bcopy(PKTDATA(osh, p) + offset, buf, n);
 | 
			
		||||
		buf += n;
 | 
			
		||||
		len -= n;
 | 
			
		||||
		ret += n;
 | 
			
		||||
		offset = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* return total length of buffer chain */
 | 
			
		||||
uint
 | 
			
		||||
pkttotlen(osl_t *osh, void *p)
 | 
			
		||||
{
 | 
			
		||||
	uint total;
 | 
			
		||||
 | 
			
		||||
	total = 0;
 | 
			
		||||
	for (; p; p = PKTNEXT(osh, p))
 | 
			
		||||
		total += PKTLEN(osh, p);
 | 
			
		||||
	return (total);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* return the last buffer of chained pkt */
 | 
			
		||||
void *
 | 
			
		||||
pktlast(osl_t *osh, void *p)
 | 
			
		||||
{
 | 
			
		||||
	for (; PKTNEXT(osh, p); p = PKTNEXT(osh, p))
 | 
			
		||||
		;
 | 
			
		||||
 | 
			
		||||
	return (p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * osl multiple-precedence packet queue
 | 
			
		||||
 * hi_prec is always >= the number of the highest non-empty queue
 | 
			
		||||
 */
 | 
			
		||||
void *
 | 
			
		||||
pktq_penq(struct pktq *pq, int prec, void *p)
 | 
			
		||||
{
 | 
			
		||||
	struct pktq_prec *q;
 | 
			
		||||
 | 
			
		||||
	ASSERT(prec >= 0 && prec < pq->num_prec);
 | 
			
		||||
	ASSERT(PKTLINK(p) == NULL);         /* queueing chains not allowed */
 | 
			
		||||
 | 
			
		||||
	ASSERT(!pktq_full(pq));
 | 
			
		||||
	ASSERT(!pktq_pfull(pq, prec));
 | 
			
		||||
 | 
			
		||||
	q = &pq->q[prec];
 | 
			
		||||
 | 
			
		||||
	if (q->head)
 | 
			
		||||
		PKTSETLINK(q->tail, p);
 | 
			
		||||
	else
 | 
			
		||||
		q->head = p;
 | 
			
		||||
 | 
			
		||||
	q->tail = p;
 | 
			
		||||
	q->len++;
 | 
			
		||||
 | 
			
		||||
	pq->len++;
 | 
			
		||||
 | 
			
		||||
	if (pq->hi_prec < prec)
 | 
			
		||||
		pq->hi_prec = (uint8)prec;
 | 
			
		||||
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
pktq_penq_head(struct pktq *pq, int prec, void *p)
 | 
			
		||||
{
 | 
			
		||||
	struct pktq_prec *q;
 | 
			
		||||
 | 
			
		||||
	ASSERT(prec >= 0 && prec < pq->num_prec);
 | 
			
		||||
	ASSERT(PKTLINK(p) == NULL);         /* queueing chains not allowed */
 | 
			
		||||
 | 
			
		||||
	ASSERT(!pktq_full(pq));
 | 
			
		||||
	ASSERT(!pktq_pfull(pq, prec));
 | 
			
		||||
 | 
			
		||||
	q = &pq->q[prec];
 | 
			
		||||
 | 
			
		||||
	if (q->head == NULL)
 | 
			
		||||
		q->tail = p;
 | 
			
		||||
 | 
			
		||||
	PKTSETLINK(p, q->head);
 | 
			
		||||
	q->head = p;
 | 
			
		||||
	q->len++;
 | 
			
		||||
 | 
			
		||||
	pq->len++;
 | 
			
		||||
 | 
			
		||||
	if (pq->hi_prec < prec)
 | 
			
		||||
		pq->hi_prec = (uint8)prec;
 | 
			
		||||
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
pktq_pdeq(struct pktq *pq, int prec)
 | 
			
		||||
{
 | 
			
		||||
	struct pktq_prec *q;
 | 
			
		||||
	void *p;
 | 
			
		||||
 | 
			
		||||
	ASSERT(prec >= 0 && prec < pq->num_prec);
 | 
			
		||||
 | 
			
		||||
	q = &pq->q[prec];
 | 
			
		||||
 | 
			
		||||
	if ((p = q->head) == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	if ((q->head = PKTLINK(p)) == NULL)
 | 
			
		||||
		q->tail = NULL;
 | 
			
		||||
 | 
			
		||||
	q->len--;
 | 
			
		||||
 | 
			
		||||
	pq->len--;
 | 
			
		||||
 | 
			
		||||
	PKTSETLINK(p, NULL);
 | 
			
		||||
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
pktq_pdeq_tail(struct pktq *pq, int prec)
 | 
			
		||||
{
 | 
			
		||||
	struct pktq_prec *q;
 | 
			
		||||
	void *p, *prev;
 | 
			
		||||
 | 
			
		||||
	ASSERT(prec >= 0 && prec < pq->num_prec);
 | 
			
		||||
 | 
			
		||||
	q = &pq->q[prec];
 | 
			
		||||
 | 
			
		||||
	if ((p = q->head) == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	for (prev = NULL; p != q->tail; p = PKTLINK(p))
 | 
			
		||||
		prev = p;
 | 
			
		||||
 | 
			
		||||
	if (prev)
 | 
			
		||||
		PKTSETLINK(prev, NULL);
 | 
			
		||||
	else
 | 
			
		||||
		q->head = NULL;
 | 
			
		||||
 | 
			
		||||
	q->tail = prev;
 | 
			
		||||
	q->len--;
 | 
			
		||||
 | 
			
		||||
	pq->len--;
 | 
			
		||||
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir)
 | 
			
		||||
{
 | 
			
		||||
	struct pktq_prec *q;
 | 
			
		||||
	void *p;
 | 
			
		||||
 | 
			
		||||
	q = &pq->q[prec];
 | 
			
		||||
	p = q->head;
 | 
			
		||||
	while (p) {
 | 
			
		||||
		q->head = PKTLINK(p);
 | 
			
		||||
		PKTSETLINK(p, NULL);
 | 
			
		||||
		PKTFREE(osh, p, dir);
 | 
			
		||||
		q->len--;
 | 
			
		||||
		pq->len--;
 | 
			
		||||
		p = q->head;
 | 
			
		||||
	}
 | 
			
		||||
	ASSERT(q->len == 0);
 | 
			
		||||
	q->tail = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
pktq_pdel(struct pktq *pq, void *pktbuf, int prec)
 | 
			
		||||
{
 | 
			
		||||
	struct pktq_prec *q;
 | 
			
		||||
	void *p;
 | 
			
		||||
 | 
			
		||||
	ASSERT(prec >= 0 && prec < pq->num_prec);
 | 
			
		||||
 | 
			
		||||
	if (!pktbuf)
 | 
			
		||||
		return FALSE;
 | 
			
		||||
 | 
			
		||||
	q = &pq->q[prec];
 | 
			
		||||
 | 
			
		||||
	if (q->head == pktbuf) {
 | 
			
		||||
		if ((q->head = PKTLINK(pktbuf)) == NULL)
 | 
			
		||||
			q->tail = NULL;
 | 
			
		||||
	} else {
 | 
			
		||||
		for (p = q->head; p && PKTLINK(p) != pktbuf; p = PKTLINK(p))
 | 
			
		||||
			;
 | 
			
		||||
		if (p == NULL)
 | 
			
		||||
			return FALSE;
 | 
			
		||||
 | 
			
		||||
		PKTSETLINK(p, PKTLINK(pktbuf));
 | 
			
		||||
		if (q->tail == pktbuf)
 | 
			
		||||
			q->tail = p;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	q->len--;
 | 
			
		||||
	pq->len--;
 | 
			
		||||
	PKTSETLINK(pktbuf, NULL);
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
pktq_init(struct pktq *pq, int num_prec, int max_len)
 | 
			
		||||
{
 | 
			
		||||
	int prec;
 | 
			
		||||
 | 
			
		||||
	ASSERT(num_prec > 0 && num_prec <= PKTQ_MAX_PREC);
 | 
			
		||||
 | 
			
		||||
	bzero(pq, sizeof(*pq));
 | 
			
		||||
 | 
			
		||||
	pq->num_prec = (uint16)num_prec;
 | 
			
		||||
 | 
			
		||||
	pq->max = (uint16)max_len;
 | 
			
		||||
 | 
			
		||||
	for (prec = 0; prec < num_prec; prec++)
 | 
			
		||||
		pq->q[prec].max = pq->max;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
pktq_deq(struct pktq *pq, int *prec_out)
 | 
			
		||||
{
 | 
			
		||||
	struct pktq_prec *q;
 | 
			
		||||
	void *p;
 | 
			
		||||
	int prec;
 | 
			
		||||
 | 
			
		||||
	if (pq->len == 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
 | 
			
		||||
		pq->hi_prec--;
 | 
			
		||||
 | 
			
		||||
	q = &pq->q[prec];
 | 
			
		||||
 | 
			
		||||
	if ((p = q->head) == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	if ((q->head = PKTLINK(p)) == NULL)
 | 
			
		||||
		q->tail = NULL;
 | 
			
		||||
 | 
			
		||||
	q->len--;
 | 
			
		||||
 | 
			
		||||
	pq->len--;
 | 
			
		||||
 | 
			
		||||
	if (prec_out)
 | 
			
		||||
		*prec_out = prec;
 | 
			
		||||
 | 
			
		||||
	PKTSETLINK(p, NULL);
 | 
			
		||||
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
pktq_deq_tail(struct pktq *pq, int *prec_out)
 | 
			
		||||
{
 | 
			
		||||
	struct pktq_prec *q;
 | 
			
		||||
	void *p, *prev;
 | 
			
		||||
	int prec;
 | 
			
		||||
 | 
			
		||||
	if (pq->len == 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	for (prec = 0; prec < pq->hi_prec; prec++)
 | 
			
		||||
		if (pq->q[prec].head)
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
	q = &pq->q[prec];
 | 
			
		||||
 | 
			
		||||
	if ((p = q->head) == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	for (prev = NULL; p != q->tail; p = PKTLINK(p))
 | 
			
		||||
		prev = p;
 | 
			
		||||
 | 
			
		||||
	if (prev)
 | 
			
		||||
		PKTSETLINK(prev, NULL);
 | 
			
		||||
	else
 | 
			
		||||
		q->head = NULL;
 | 
			
		||||
 | 
			
		||||
	q->tail = prev;
 | 
			
		||||
	q->len--;
 | 
			
		||||
 | 
			
		||||
	pq->len--;
 | 
			
		||||
 | 
			
		||||
	if (prec_out)
 | 
			
		||||
		*prec_out = prec;
 | 
			
		||||
 | 
			
		||||
	PKTSETLINK(p, NULL);
 | 
			
		||||
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
pktq_peek(struct pktq *pq, int *prec_out)
 | 
			
		||||
{
 | 
			
		||||
	int prec;
 | 
			
		||||
 | 
			
		||||
	if (pq->len == 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
 | 
			
		||||
		pq->hi_prec--;
 | 
			
		||||
 | 
			
		||||
	if (prec_out)
 | 
			
		||||
		*prec_out = prec;
 | 
			
		||||
 | 
			
		||||
	return (pq->q[prec].head);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
pktq_peek_tail(struct pktq *pq, int *prec_out)
 | 
			
		||||
{
 | 
			
		||||
	int prec;
 | 
			
		||||
 | 
			
		||||
	if (pq->len == 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	for (prec = 0; prec < pq->hi_prec; prec++)
 | 
			
		||||
		if (pq->q[prec].head)
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
	if (prec_out)
 | 
			
		||||
		*prec_out = prec;
 | 
			
		||||
 | 
			
		||||
	return (pq->q[prec].tail);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
pktq_flush(osl_t *osh, struct pktq *pq, bool dir)
 | 
			
		||||
{
 | 
			
		||||
	int prec;
 | 
			
		||||
	for (prec = 0; prec < pq->num_prec; prec++)
 | 
			
		||||
		pktq_pflush(osh, pq, prec, dir);
 | 
			
		||||
	ASSERT(pq->len == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Return sum of lengths of a specific set of precedences */
 | 
			
		||||
int
 | 
			
		||||
pktq_mlen(struct pktq *pq, uint prec_bmp)
 | 
			
		||||
{
 | 
			
		||||
	int prec, len;
 | 
			
		||||
 | 
			
		||||
	len = 0;
 | 
			
		||||
 | 
			
		||||
	for (prec = 0; prec <= pq->hi_prec; prec++)
 | 
			
		||||
		if (prec_bmp & (1 << prec))
 | 
			
		||||
			len += pq->q[prec].len;
 | 
			
		||||
 | 
			
		||||
	return len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Priority dequeue from a specific set of precedences */
 | 
			
		||||
void *
 | 
			
		||||
pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out)
 | 
			
		||||
{
 | 
			
		||||
	struct pktq_prec *q;
 | 
			
		||||
	void *p;
 | 
			
		||||
	int prec;
 | 
			
		||||
 | 
			
		||||
	if (pq->len == 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
 | 
			
		||||
		pq->hi_prec--;
 | 
			
		||||
 | 
			
		||||
	while ((prec_bmp & (1 << prec)) == 0 || pq->q[prec].head == NULL)
 | 
			
		||||
		if (prec-- == 0)
 | 
			
		||||
			return NULL;
 | 
			
		||||
 | 
			
		||||
	q = &pq->q[prec];
 | 
			
		||||
 | 
			
		||||
	if ((p = q->head) == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	if ((q->head = PKTLINK(p)) == NULL)
 | 
			
		||||
		q->tail = NULL;
 | 
			
		||||
 | 
			
		||||
	q->len--;
 | 
			
		||||
 | 
			
		||||
	if (prec_out)
 | 
			
		||||
		*prec_out = prec;
 | 
			
		||||
 | 
			
		||||
	pq->len--;
 | 
			
		||||
 | 
			
		||||
	PKTSETLINK(p, NULL);
 | 
			
		||||
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char*
 | 
			
		||||
bcmstrcat(char *dest, const char *src)
 | 
			
		||||
{
 | 
			
		||||
	strcpy(&dest[strlen(dest)], src);
 | 
			
		||||
	return (dest);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char*
 | 
			
		||||
bcm_ether_ntoa(struct ether_addr *ea, char *buf)
 | 
			
		||||
{
 | 
			
		||||
	sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x",
 | 
			
		||||
		ea->octet[0]&0xff, ea->octet[1]&0xff, ea->octet[2]&0xff,
 | 
			
		||||
		ea->octet[3]&0xff, ea->octet[4]&0xff, ea->octet[5]&0xff);
 | 
			
		||||
	return (buf);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* parse a xx:xx:xx:xx:xx:xx format ethernet address */
 | 
			
		||||
int
 | 
			
		||||
bcm_ether_atoe(char *p, struct ether_addr *ea)
 | 
			
		||||
{
 | 
			
		||||
	int i = 0;
 | 
			
		||||
 | 
			
		||||
	for (;;) {
 | 
			
		||||
		ea->octet[i++] = (char) bcm_strtoul(p, &p, 16);
 | 
			
		||||
		if (!*p++ || i == 6)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (i == 6);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Takes an Ethernet frame and sets out-of-bound PKTPRIO
 | 
			
		||||
 * Also updates the inplace vlan tag if requested
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
pktsetprio(void *pkt, bool update_vtag)
 | 
			
		||||
{
 | 
			
		||||
	struct ether_header *eh;
 | 
			
		||||
	struct ethervlan_header *evh;
 | 
			
		||||
	uint8 *pktdata;
 | 
			
		||||
	int priority = 0;
 | 
			
		||||
 | 
			
		||||
	pktdata = (uint8 *) PKTDATA(NULL, pkt);
 | 
			
		||||
	ASSERT(ISALIGNED((uintptr)pktdata, sizeof(uint16)));
 | 
			
		||||
 | 
			
		||||
	eh = (struct ether_header *) pktdata;
 | 
			
		||||
 | 
			
		||||
	if (ntoh16(eh->ether_type) == ETHER_TYPE_8021Q) {
 | 
			
		||||
		uint16 vlan_tag;
 | 
			
		||||
		int vlan_prio, dscp_prio = 0;
 | 
			
		||||
 | 
			
		||||
		evh = (struct ethervlan_header *)eh;
 | 
			
		||||
 | 
			
		||||
		vlan_tag = ntoh16(evh->vlan_tag);
 | 
			
		||||
		vlan_prio = (int) (vlan_tag >> VLAN_PRI_SHIFT) & VLAN_PRI_MASK;
 | 
			
		||||
 | 
			
		||||
		if (ntoh16(evh->ether_type) == ETHER_TYPE_IP) {
 | 
			
		||||
			uint8 *ip_body = pktdata + sizeof(struct ethervlan_header);
 | 
			
		||||
			uint8 tos_tc = IP_TOS(ip_body);
 | 
			
		||||
			dscp_prio = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* DSCP priority gets precedence over 802.1P (vlan tag) */
 | 
			
		||||
		priority = (dscp_prio != 0) ? dscp_prio : vlan_prio;
 | 
			
		||||
 | 
			
		||||
		/* 
 | 
			
		||||
		 * If the DSCP priority is not the same as the VLAN priority,
 | 
			
		||||
		 * then overwrite the priority field in the vlan tag, with the
 | 
			
		||||
		 * DSCP priority value. This is required for Linux APs because
 | 
			
		||||
		 * the VLAN driver on Linux, overwrites the skb->priority field
 | 
			
		||||
		 * with the priority value in the vlan tag
 | 
			
		||||
		 */
 | 
			
		||||
		if (update_vtag && (priority != vlan_prio)) {
 | 
			
		||||
			vlan_tag &= ~(VLAN_PRI_MASK << VLAN_PRI_SHIFT);
 | 
			
		||||
			vlan_tag |= (uint16)priority << VLAN_PRI_SHIFT;
 | 
			
		||||
			evh->vlan_tag = hton16(vlan_tag);
 | 
			
		||||
		}
 | 
			
		||||
	} else if (ntoh16(eh->ether_type) == ETHER_TYPE_IP) {
 | 
			
		||||
		uint8 *ip_body = pktdata + sizeof(struct ether_header);
 | 
			
		||||
		uint8 tos_tc = IP_TOS(ip_body);
 | 
			
		||||
		priority = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ASSERT(priority >= 0 && priority <= MAXPRIO);
 | 
			
		||||
	PKTSETPRIO(pkt, priority);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char bcm_undeferrstr[BCME_STRLEN];
 | 
			
		||||
 | 
			
		||||
static const char *bcmerrorstrtable[] = BCMERRSTRINGTABLE;
 | 
			
		||||
 | 
			
		||||
/* Convert the Error codes into related Error strings  */
 | 
			
		||||
const char *
 | 
			
		||||
bcmerrorstr(int bcmerror)
 | 
			
		||||
{
 | 
			
		||||
	int abs_bcmerror;
 | 
			
		||||
 | 
			
		||||
	abs_bcmerror = ABS(bcmerror);
 | 
			
		||||
 | 
			
		||||
	/* check if someone added a bcmerror code but forgot to add errorstring */
 | 
			
		||||
	ASSERT(ABS(BCME_LAST) == (ARRAYSIZE(bcmerrorstrtable) - 1));
 | 
			
		||||
	if ((bcmerror > 0) || (abs_bcmerror > ABS(BCME_LAST))) {
 | 
			
		||||
		sprintf(bcm_undeferrstr, "undefined Error %d", bcmerror);
 | 
			
		||||
		return bcm_undeferrstr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ASSERT((strlen((char*)bcmerrorstrtable[abs_bcmerror])) < BCME_STRLEN);
 | 
			
		||||
 | 
			
		||||
	return bcmerrorstrtable[abs_bcmerror];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
bcm_iovar_lencheck(const bcm_iovar_t *vi, void *arg, int len, bool set)
 | 
			
		||||
{
 | 
			
		||||
	int bcmerror = 0;
 | 
			
		||||
 | 
			
		||||
	/* length check on io buf */
 | 
			
		||||
	switch (vi->type) {
 | 
			
		||||
	case IOVT_BOOL:
 | 
			
		||||
	case IOVT_INT8:
 | 
			
		||||
	case IOVT_INT16:
 | 
			
		||||
	case IOVT_INT32:
 | 
			
		||||
	case IOVT_UINT8:
 | 
			
		||||
	case IOVT_UINT16:
 | 
			
		||||
	case IOVT_UINT32:
 | 
			
		||||
		/* all integers are int32 sized args at the ioctl interface */
 | 
			
		||||
		if (len < (int)sizeof(int)) {
 | 
			
		||||
			bcmerror = BCME_BUFTOOSHORT;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case IOVT_BUFFER:
 | 
			
		||||
		/* buffer must meet minimum length requirement */
 | 
			
		||||
		if (len < vi->minlen) {
 | 
			
		||||
			bcmerror = BCME_BUFTOOSHORT;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case IOVT_VOID:
 | 
			
		||||
		if (!set) {
 | 
			
		||||
			/* Cannot return nil... */
 | 
			
		||||
			bcmerror = BCME_UNSUPPORTED;
 | 
			
		||||
		} else if (len) {
 | 
			
		||||
			/* Set is an action w/o parameters */
 | 
			
		||||
			bcmerror = BCME_BUFTOOLONG;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		/* unknown type for length check in iovar info */
 | 
			
		||||
		ASSERT(0);
 | 
			
		||||
		bcmerror = BCME_UNSUPPORTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return bcmerror;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define CRC_INNER_LOOP(n, c, x) \
 | 
			
		||||
		    (c) = ((c) >> 8) ^ crc##n##_table[((c) ^ (x)) & 0xff]
 | 
			
		||||
 | 
			
		||||
static uint32 crc32_table[256] = {
 | 
			
		||||
    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
 | 
			
		||||
    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
 | 
			
		||||
    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
 | 
			
		||||
    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
 | 
			
		||||
    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
 | 
			
		||||
    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
 | 
			
		||||
    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
 | 
			
		||||
    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
 | 
			
		||||
    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
 | 
			
		||||
    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
 | 
			
		||||
    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
 | 
			
		||||
    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
 | 
			
		||||
    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
 | 
			
		||||
    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
 | 
			
		||||
    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
 | 
			
		||||
    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
 | 
			
		||||
    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
 | 
			
		||||
    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
 | 
			
		||||
    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
 | 
			
		||||
    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
 | 
			
		||||
    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
 | 
			
		||||
    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
 | 
			
		||||
    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
 | 
			
		||||
    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
 | 
			
		||||
    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
 | 
			
		||||
    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
 | 
			
		||||
    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
 | 
			
		||||
    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
 | 
			
		||||
    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
 | 
			
		||||
    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
 | 
			
		||||
    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
 | 
			
		||||
    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
 | 
			
		||||
    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
 | 
			
		||||
    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
 | 
			
		||||
    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
 | 
			
		||||
    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
 | 
			
		||||
    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
 | 
			
		||||
    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
 | 
			
		||||
    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
 | 
			
		||||
    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
 | 
			
		||||
    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
 | 
			
		||||
    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
 | 
			
		||||
    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
 | 
			
		||||
    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
 | 
			
		||||
    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
 | 
			
		||||
    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
 | 
			
		||||
    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
 | 
			
		||||
    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
 | 
			
		||||
    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
 | 
			
		||||
    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
 | 
			
		||||
    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
 | 
			
		||||
    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
 | 
			
		||||
    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
 | 
			
		||||
    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
 | 
			
		||||
    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
 | 
			
		||||
    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
 | 
			
		||||
    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
 | 
			
		||||
    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
 | 
			
		||||
    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
 | 
			
		||||
    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
 | 
			
		||||
    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
 | 
			
		||||
    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
 | 
			
		||||
    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
 | 
			
		||||
    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
uint32
 | 
			
		||||
hndcrc32(
 | 
			
		||||
    uint8 *pdata,  /* pointer to array of data to process */
 | 
			
		||||
    uint   nbytes, /* number of input data bytes to process */
 | 
			
		||||
    uint32 crc     /* either CRC32_INIT_VALUE or previous return value */
 | 
			
		||||
)
 | 
			
		||||
{
 | 
			
		||||
	uint8 *pend;
 | 
			
		||||
#ifdef __mips__
 | 
			
		||||
	uint8 tmp[4];
 | 
			
		||||
	ulong *tptr = (ulong *)tmp;
 | 
			
		||||
 | 
			
		||||
	/* in case the beginning of the buffer isn't aligned */
 | 
			
		||||
	pend = (uint8 *)((uint)(pdata + 3) & 0xfffffffc);
 | 
			
		||||
	nbytes -= (pend - pdata);
 | 
			
		||||
	while (pdata < pend)
 | 
			
		||||
		CRC_INNER_LOOP(32, crc, *pdata++);
 | 
			
		||||
 | 
			
		||||
	/* handle bulk of data as 32-bit words */
 | 
			
		||||
	pend = pdata + (nbytes & 0xfffffffc);
 | 
			
		||||
	while (pdata < pend) {
 | 
			
		||||
		*tptr = *(ulong *)pdata;
 | 
			
		||||
		pdata += sizeof(ulong *);
 | 
			
		||||
		CRC_INNER_LOOP(32, crc, tmp[0]);
 | 
			
		||||
		CRC_INNER_LOOP(32, crc, tmp[1]);
 | 
			
		||||
		CRC_INNER_LOOP(32, crc, tmp[2]);
 | 
			
		||||
		CRC_INNER_LOOP(32, crc, tmp[3]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* 1-3 bytes at end of buffer */
 | 
			
		||||
	pend = pdata + (nbytes & 0x03);
 | 
			
		||||
	while (pdata < pend)
 | 
			
		||||
		CRC_INNER_LOOP(32, crc, *pdata++);
 | 
			
		||||
#else
 | 
			
		||||
	pend = pdata + nbytes;
 | 
			
		||||
	while (pdata < pend)
 | 
			
		||||
		CRC_INNER_LOOP(32, crc, *pdata++);
 | 
			
		||||
#endif /* __mips__ */
 | 
			
		||||
 | 
			
		||||
	return crc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Advance from the current 1-byte tag/1-byte length/variable-length value
 | 
			
		||||
 * triple, to the next, returning a pointer to the next.
 | 
			
		||||
 * If the current or next TLV is invalid (does not fit in given buffer length),
 | 
			
		||||
 * NULL is returned.
 | 
			
		||||
 * *buflen is not modified if the TLV elt parameter is invalid, or is decremented
 | 
			
		||||
 * by the TLV paramter's length if it is valid.
 | 
			
		||||
 */
 | 
			
		||||
bcm_tlv_t *
 | 
			
		||||
bcm_next_tlv(bcm_tlv_t *elt, int *buflen)
 | 
			
		||||
{
 | 
			
		||||
	int len;
 | 
			
		||||
 | 
			
		||||
	/* validate current elt */
 | 
			
		||||
	if (!bcm_valid_tlv(elt, *buflen))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	/* advance to next elt */
 | 
			
		||||
	len = elt->len;
 | 
			
		||||
	elt = (bcm_tlv_t*)(elt->data + len);
 | 
			
		||||
	*buflen -= (2 + len);
 | 
			
		||||
 | 
			
		||||
	/* validate next elt */
 | 
			
		||||
	if (!bcm_valid_tlv(elt, *buflen))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	return elt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Traverse a string of 1-byte tag/1-byte length/variable-length value
 | 
			
		||||
 * triples, returning a pointer to the substring whose first element
 | 
			
		||||
 * matches tag
 | 
			
		||||
 */
 | 
			
		||||
bcm_tlv_t *
 | 
			
		||||
bcm_parse_tlvs(void *buf, int buflen, uint key)
 | 
			
		||||
{
 | 
			
		||||
	bcm_tlv_t *elt;
 | 
			
		||||
	int totlen;
 | 
			
		||||
 | 
			
		||||
	elt = (bcm_tlv_t*)buf;
 | 
			
		||||
	totlen = buflen;
 | 
			
		||||
 | 
			
		||||
	/* find tagged parameter */
 | 
			
		||||
	while (totlen >= 2) {
 | 
			
		||||
		int len = elt->len;
 | 
			
		||||
 | 
			
		||||
		/* validate remaining totlen */
 | 
			
		||||
		if ((elt->id == key) && (totlen >= (len + 2)))
 | 
			
		||||
			return (elt);
 | 
			
		||||
 | 
			
		||||
		elt = (bcm_tlv_t*)((uint8*)elt + (len + 2));
 | 
			
		||||
		totlen -= (len + 2);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Traverse a string of 1-byte tag/1-byte length/variable-length value
 | 
			
		||||
 * triples, returning a pointer to the substring whose first element
 | 
			
		||||
 * matches tag.  Stop parsing when we see an element whose ID is greater
 | 
			
		||||
 * than the target key.
 | 
			
		||||
 */
 | 
			
		||||
bcm_tlv_t *
 | 
			
		||||
bcm_parse_ordered_tlvs(void *buf, int buflen, uint key)
 | 
			
		||||
{
 | 
			
		||||
	bcm_tlv_t *elt;
 | 
			
		||||
	int totlen;
 | 
			
		||||
 | 
			
		||||
	elt = (bcm_tlv_t*)buf;
 | 
			
		||||
	totlen = buflen;
 | 
			
		||||
 | 
			
		||||
	/* find tagged parameter */
 | 
			
		||||
	while (totlen >= 2) {
 | 
			
		||||
		uint id = elt->id;
 | 
			
		||||
		int len = elt->len;
 | 
			
		||||
 | 
			
		||||
		/* Punt if we start seeing IDs > than target key */
 | 
			
		||||
		if (id > key)
 | 
			
		||||
			return (NULL);
 | 
			
		||||
 | 
			
		||||
		/* validate remaining totlen */
 | 
			
		||||
		if ((id == key) && (totlen >= (len + 2)))
 | 
			
		||||
			return (elt);
 | 
			
		||||
 | 
			
		||||
		elt = (bcm_tlv_t*)((uint8*)elt + (len + 2));
 | 
			
		||||
		totlen -= (len + 2);
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Initialization of bcmstrbuf structure */
 | 
			
		||||
void
 | 
			
		||||
bcm_binit(struct bcmstrbuf *b, char *buf, uint size)
 | 
			
		||||
{
 | 
			
		||||
	b->origsize = b->size = size;
 | 
			
		||||
	b->origbuf = b->buf = buf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Buffer sprintf wrapper to guard against buffer overflow */
 | 
			
		||||
int
 | 
			
		||||
bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	int r;
 | 
			
		||||
 | 
			
		||||
	va_start(ap, fmt);
 | 
			
		||||
	r = vsnprintf(b->buf, b->size, fmt, ap);
 | 
			
		||||
 | 
			
		||||
	/* Non Ansi C99 compliant returns -1,
 | 
			
		||||
	 * Ansi compliant return r >= b->size,
 | 
			
		||||
	 * bcmstdlib returns 0, handle all
 | 
			
		||||
	 */
 | 
			
		||||
	if ((r == -1) || (r >= (int)b->size) || (r == 0))
 | 
			
		||||
	{
 | 
			
		||||
		b->size = 0;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		b->size -= r;
 | 
			
		||||
		b->buf += r;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 | 
			
		||||
	return r;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1157
									
								
								package/broadcom-wl/src/kmod/hnddma.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1157
									
								
								package/broadcom-wl/src/kmod/hnddma.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										156
									
								
								package/broadcom-wl/src/kmod/hnddma.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								package/broadcom-wl/src/kmod/hnddma.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,156 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Generic Broadcom Home Networking Division (HND) DMA engine SW interface
 | 
			
		||||
 * This supports the following chips: BCM42xx, 44xx, 47xx .
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 * $Id: hnddma.h,v 1.1.1.13 2006/04/08 06:13:39 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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, 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))
 | 
			
		||||
 | 
			
		||||
#define DMA_DUMP_SIZE 2048
 | 
			
		||||
/* 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_ */
 | 
			
		||||
							
								
								
									
										269
									
								
								package/broadcom-wl/src/kmod/linux_osl.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										269
									
								
								package/broadcom-wl/src/kmod/linux_osl.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,269 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Linux OS Independent Layer
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: linux_osl.c,v 1.1.1.14 2006/04/08 06:13:39 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define LINUX_OSL
 | 
			
		||||
 | 
			
		||||
#include <typedefs.h>
 | 
			
		||||
#include <bcmendian.h>
 | 
			
		||||
#include <linux/module.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;
 | 
			
		||||
 | 
			
		||||
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 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* translate bcmerrors into linux errors */
 | 
			
		||||
int
 | 
			
		||||
osl_error(int bcmerror)
 | 
			
		||||
{
 | 
			
		||||
	int abs_bcmerror;
 | 
			
		||||
	int array_size = ARRAYSIZE(linuxbcmerrormap);
 | 
			
		||||
 | 
			
		||||
	abs_bcmerror = ABS(bcmerror);
 | 
			
		||||
 | 
			
		||||
	if (bcmerror > 0)
 | 
			
		||||
		abs_bcmerror = 0;
 | 
			
		||||
 | 
			
		||||
	else if (abs_bcmerror >= array_size)
 | 
			
		||||
		abs_bcmerror = BCME_ERROR;
 | 
			
		||||
 | 
			
		||||
	return linuxbcmerrormap[abs_bcmerror];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
osl_t *
 | 
			
		||||
osl_attach(void *pdev, bool pkttag)
 | 
			
		||||
{
 | 
			
		||||
	osl_t *osh;
 | 
			
		||||
 | 
			
		||||
	osh = kmalloc(sizeof(osl_t), GFP_ATOMIC);
 | 
			
		||||
	ASSERT(osh);
 | 
			
		||||
 | 
			
		||||
	bzero(osh, sizeof(osl_t));
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * check the cases where
 | 
			
		||||
	 * 1.Error code Added to bcmerror table, but forgot to add it to the OS
 | 
			
		||||
	 * dependent error code
 | 
			
		||||
	 * 2. Error code is added to the bcmerror table, but forgot to add the
 | 
			
		||||
	 * corresponding errorstring(dummy call to bcmerrorstr)
 | 
			
		||||
	 */
 | 
			
		||||
	bcmerrorstr(0);
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
	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, bool send)
 | 
			
		||||
{
 | 
			
		||||
	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)
 | 
			
		||||
{
 | 
			
		||||
	struct sk_buff *skb, *nskb;
 | 
			
		||||
 | 
			
		||||
	skb = (struct sk_buff*) p;
 | 
			
		||||
 | 
			
		||||
	/* 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;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef osl_delay
 | 
			
		||||
void
 | 
			
		||||
osl_delay(uint usec)
 | 
			
		||||
{
 | 
			
		||||
	OSL_DELAY(usec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 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++;
 | 
			
		||||
	return (p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint
 | 
			
		||||
osl_pktalloced(osl_t *osh)
 | 
			
		||||
{
 | 
			
		||||
	return (osh->pub.pktalloced);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										171
									
								
								package/broadcom-wl/src/kmod/linux_osl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								package/broadcom-wl/src/kmod/linux_osl.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,171 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Linux OS Independent Layer
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: linux_osl.h,v 1.1.1.13 2006/04/08 06:13:39 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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 */
 | 
			
		||||
 | 
			
		||||
/* osl handle type forward declaration */
 | 
			
		||||
typedef struct osl_dmainfo osldma_t;
 | 
			
		||||
 | 
			
		||||
/* OSL initialization */
 | 
			
		||||
extern osl_t *osl_attach(void *pdev, bool pkttag);
 | 
			
		||||
extern void osl_detach(osl_t *osh);
 | 
			
		||||
 | 
			
		||||
/* 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);
 | 
			
		||||
 | 
			
		||||
/* API for DMA addressing capability */
 | 
			
		||||
#define	DMA_MAP(osh, va, size, direction, p) \
 | 
			
		||||
	osl_dma_map((osh), (va), (size), (direction))
 | 
			
		||||
#define	DMA_UNMAP(osh, pa, size, direction, p) \
 | 
			
		||||
	osl_dma_unmap((osh), (pa), (size), (direction))
 | 
			
		||||
static inline uint
 | 
			
		||||
osl_dma_map(void *osh, void *va, uint size, int direction)
 | 
			
		||||
{
 | 
			
		||||
	int dir;
 | 
			
		||||
	struct pci_dev *dev;
 | 
			
		||||
 | 
			
		||||
	dev = (osh == NULL ? NULL : ((osl_t *)osh)->pdev);
 | 
			
		||||
	dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE;
 | 
			
		||||
	return (pci_map_single(dev, va, size, dir));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
osl_dma_unmap(void *osh, uint pa, uint size, int direction)
 | 
			
		||||
{
 | 
			
		||||
	int dir;
 | 
			
		||||
	struct pci_dev *dev;
 | 
			
		||||
 | 
			
		||||
	dev = (osh == NULL ? NULL : ((osl_t *)osh)->pdev);
 | 
			
		||||
	dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE;
 | 
			
		||||
	pci_unmap_single(dev, (uint32)pa, size, dir);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0)
 | 
			
		||||
#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))
 | 
			
		||||
static inline void*
 | 
			
		||||
osl_dma_alloc_consistent(osl_t *osh, uint size, ulong *pap)
 | 
			
		||||
{
 | 
			
		||||
	return (pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa)
 | 
			
		||||
{
 | 
			
		||||
	pci_free_consistent(osh->pdev, size, va, (dma_addr_t)pa);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* register access macros */
 | 
			
		||||
#if defined(BCMJTAG)
 | 
			
		||||
#include <bcmjtag.h>
 | 
			
		||||
#define	R_REG(osh, r)	bcmjtag_read(NULL, (uint32)(r), sizeof(*(r)))
 | 
			
		||||
#define	W_REG(osh, r, v)	bcmjtag_write(NULL, (uint32)(r), (uint32)(v), sizeof(*(r)))
 | 
			
		||||
#endif /* defined(BCMSDIO) */
 | 
			
		||||
 | 
			
		||||
/* packet primitives */
 | 
			
		||||
#define	PKTGET(osh, len, send)		osl_pktget((osh), (len), (send))
 | 
			
		||||
#define	PKTFREE(osh, skb, send)		osl_pktfree((osh), (skb))
 | 
			
		||||
#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_pktalloced((osh))
 | 
			
		||||
#define PKTLIST_DUMP(osh, buf)
 | 
			
		||||
 | 
			
		||||
/* 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(struct osl_pubinfo *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) {
 | 
			
		||||
		osh->pktalloced++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (void *)skb;
 | 
			
		||||
}
 | 
			
		||||
#define PKTFRMNATIVE(osh, skb)	osl_pkt_frmnative(((struct osl_pubinfo *)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(struct osl_pubinfo *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) {
 | 
			
		||||
		osh->pktalloced--;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (struct sk_buff *)pkt;
 | 
			
		||||
}
 | 
			
		||||
#define PKTTONATIVE(osh, pkt)		osl_pkt_tonative((struct osl_pubinfo *)(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 PKTSHARED(skb)                  (((struct sk_buff*)(skb))->cloned)
 | 
			
		||||
 | 
			
		||||
extern void *osl_pktget(osl_t *osh, uint len, bool send);
 | 
			
		||||
extern void osl_pktfree(osl_t *osh, void *skb);
 | 
			
		||||
extern void *osl_pktdup(osl_t *osh, void *skb);
 | 
			
		||||
extern uint osl_pktalloced(osl_t *osh);
 | 
			
		||||
 | 
			
		||||
#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_ */
 | 
			
		||||
							
								
								
									
										61
									
								
								package/broadcom-wl/src/kmod/patchtable.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								package/broadcom-wl/src/kmod/patchtable.pl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2006 OpenWrt.org
 | 
			
		||||
# Copyright (C) 2006 Felix Fietkau
 | 
			
		||||
#
 | 
			
		||||
# This is free software, licensed under the GNU General Public License v2.
 | 
			
		||||
# See /LICENSE for more information.
 | 
			
		||||
#
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
my $TABLE = pack("V", 0xbadc0ded);
 | 
			
		||||
my $TABLE_SIZE = 512;
 | 
			
		||||
my $SLT1 = "\x01\x00\x00\x00";
 | 
			
		||||
my $SLT2 = "\x02\x00\x00\x00";
 | 
			
		||||
my $ACKW = "\x03\x00\x00\x00";
 | 
			
		||||
my $PTABLE_END = "\xff\xff\xff\xff";
 | 
			
		||||
 | 
			
		||||
my $addr = "";
 | 
			
		||||
my $opcode = "";
 | 
			
		||||
my $function = "";
 | 
			
		||||
 | 
			
		||||
sub add_entry {
 | 
			
		||||
	my $key = shift;
 | 
			
		||||
	my $value = shift;
 | 
			
		||||
	my $default = shift;
 | 
			
		||||
 | 
			
		||||
	$TABLE .= $key;
 | 
			
		||||
	$TABLE .= pack("V", $value);
 | 
			
		||||
	$TABLE .= pack("V", $default);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
while (<>) {
 | 
			
		||||
	$addr = $opcode = "";
 | 
			
		||||
	/^\w{8}\s*<(.*)>:$/ and $function = $1;
 | 
			
		||||
	/^\s*(\w+):\s*(\w{8})\s*/ and do {
 | 
			
		||||
		$addr = $1;
 | 
			
		||||
		$opcode = $2;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	($function eq 'wlc_update_slot_timing') and do {
 | 
			
		||||
		# li	a2,9 	-- short slot time
 | 
			
		||||
		($opcode eq '24060009') and add_entry($SLT1, hex($addr), hex($opcode));
 | 
			
		||||
		# li	v0,519	-- 510 + short slot time
 | 
			
		||||
		($opcode eq '24020207') and add_entry($SLT2, hex($addr), hex($opcode));
 | 
			
		||||
		
 | 
			
		||||
		# li	a2,20	-- long slot time
 | 
			
		||||
		($opcode eq '24060014') and add_entry($SLT1, hex($addr), hex($opcode));
 | 
			
		||||
		# li	v0,530	-- 510 + long slot time
 | 
			
		||||
		($opcode eq '24020212') and add_entry($SLT2, hex($addr), hex($opcode));
 | 
			
		||||
	};
 | 
			
		||||
	($function eq 'wlc_d11hdrs') and do {
 | 
			
		||||
		# ori	s6,s6,0x1 -- ack flag (new)
 | 
			
		||||
		($opcode eq '36d60001') and add_entry($ACKW, hex($addr), hex($opcode));
 | 
			
		||||
		# ori	s3,s3,0x1 -- ack flag (old)
 | 
			
		||||
		($opcode eq '36730001') and add_entry($ACKW, hex($addr), hex($opcode));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$TABLE .= $PTABLE_END;
 | 
			
		||||
$TABLE .= ("\x00" x ($TABLE_SIZE - length($TABLE)));
 | 
			
		||||
print $TABLE;
 | 
			
		||||
							
								
								
									
										97
									
								
								package/broadcom-wl/src/kmod/pktq.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								package/broadcom-wl/src/kmod/pktq.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,97 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 * $Id: bcmutils.h,v 1.1.1.16 2006/04/08 06:13:39 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef	_pktq_h_
 | 
			
		||||
#define	_pktq_h_
 | 
			
		||||
#include <osl.h>
 | 
			
		||||
 | 
			
		||||
/* osl multi-precedence packet queue */
 | 
			
		||||
 | 
			
		||||
#define PKTQ_LEN_DEFAULT        128	/* Max 128 packets */
 | 
			
		||||
#define PKTQ_MAX_PREC           16	/* Maximum precedence levels */
 | 
			
		||||
 | 
			
		||||
struct pktq {
 | 
			
		||||
	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 */
 | 
			
		||||
	} q[PKTQ_MAX_PREC];
 | 
			
		||||
	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 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#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((pq), 0, (p))
 | 
			
		||||
#define pktenq_head(pq, p)	pktq_penq_head((pq), 0, (p))
 | 
			
		||||
#define pktdeq(pq)		pktq_pdeq((pq), 0)
 | 
			
		||||
#define pktdeq_tail(pq)		pktq_pdeq_tail((pq), 0)
 | 
			
		||||
 | 
			
		||||
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 */
 | 
			
		||||
 | 
			
		||||
/* 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);
 | 
			
		||||
 | 
			
		||||
extern void pktsetprio(void *pkt, bool update_vtag);
 | 
			
		||||
 | 
			
		||||
#endif	/* _pktq_h_ */
 | 
			
		||||
							
								
								
									
										284
									
								
								package/broadcom-wl/src/kmod/sbhnddma.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										284
									
								
								package/broadcom-wl/src/kmod/sbhnddma.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,284 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Generic Broadcom Home Networking Division (HND) DMA engine HW interface
 | 
			
		||||
 * This supports the following chips: BCM42xx, 44xx, 47xx .
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: sbhnddma.h,v 1.1.1.2 2006/02/27 03:43:16 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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_ */
 | 
			
		||||
							
								
								
									
										9
									
								
								package/broadcom-wl/src/wlc/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								package/broadcom-wl/src/wlc/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
all: wlc
 | 
			
		||||
clean:
 | 
			
		||||
	rm -f *.o wlc
 | 
			
		||||
 | 
			
		||||
wlc: wlc.o ioctl.o
 | 
			
		||||
%.o: %.c
 | 
			
		||||
	$(CC) $(CFLAGS) -Wall -c -o $@ $<
 | 
			
		||||
 | 
			
		||||
.PHONY: all clean
 | 
			
		||||
							
								
								
									
										106
									
								
								package/broadcom-wl/src/wlc/include/bcmdefs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								package/broadcom-wl/src/wlc/include/bcmdefs.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 * $Id: bcmdefs.h,v 1.1.1.3 2006/04/08 06:13:39 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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_ */
 | 
			
		||||
							
								
								
									
										258
									
								
								package/broadcom-wl/src/wlc/include/bcmutils.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										258
									
								
								package/broadcom-wl/src/wlc/include/bcmutils.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,258 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 * $Id: bcmutils.h,v 1.1.1.16 2006/04/08 06:13:39 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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_ */
 | 
			
		||||
							
								
								
									
										1258
									
								
								package/broadcom-wl/src/wlc/include/proto/802.11.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1258
									
								
								package/broadcom-wl/src/wlc/include/proto/802.11.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										101
									
								
								package/broadcom-wl/src/wlc/include/proto/bcmeth.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								package/broadcom-wl/src/wlc/include/proto/bcmeth.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: bcmeth.h,v 1.1.1.4 2006/02/27 03:43:16 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 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_ */
 | 
			
		||||
							
								
								
									
										152
									
								
								package/broadcom-wl/src/wlc/include/proto/bcmevent.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								package/broadcom-wl/src/wlc/include/proto/bcmevent.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,152 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: bcmevent.h,v 1.1.1.3 2006/02/27 03:43:16 honor Exp $
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 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_ */
 | 
			
		||||
							
								
								
									
										165
									
								
								package/broadcom-wl/src/wlc/include/proto/ethernet.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								package/broadcom-wl/src/wlc/include/proto/ethernet.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,165 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: ethernet.h,v 1.1.1.14 2006/02/27 03:43:16 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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_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_ */
 | 
			
		||||
							
								
								
									
										148
									
								
								package/broadcom-wl/src/wlc/include/proto/wpa.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								package/broadcom-wl/src/wlc/include/proto/wpa.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,148 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: wpa.h,v 1.1.1.4 2006/02/27 03:43:16 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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_ */
 | 
			
		||||
							
								
								
									
										230
									
								
								package/broadcom-wl/src/wlc/include/typedefs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								package/broadcom-wl/src/wlc/include/typedefs.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,230 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 * $Id: typedefs.h,v 1.1.1.12 2006/04/08 06:13:40 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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_ */
 | 
			
		||||
							
								
								
									
										1384
									
								
								package/broadcom-wl/src/wlc/include/wlioctl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1384
									
								
								package/broadcom-wl/src/wlc/include/wlioctl.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										102
									
								
								package/broadcom-wl/src/wlc/include/wlutils.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								package/broadcom-wl/src/wlc/include/wlutils.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,102 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: wlutils.h,v 1.1.1.12 2006/02/27 03:43:20 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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_ */
 | 
			
		||||
							
								
								
									
										298
									
								
								package/broadcom-wl/src/wlc/ioctl.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								package/broadcom-wl/src/wlc/ioctl.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,298 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: wl.c,v 1.1.1.11 2006/02/27 03:43:20 honor Exp $
 | 
			
		||||
 */
 | 
			
		||||
#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);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1140
									
								
								package/broadcom-wl/src/wlc/wlc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1140
									
								
								package/broadcom-wl/src/wlc/wlc.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user