mirror of
https://github.com/hak5/wifipineapple-openwrt.git
synced 2025-10-29 16:57:19 +00:00
packages: clean up the package folder
Signed-off-by: John Crispin <blogic@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@37007 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
1630
package/kernel/mac80211/Makefile
Normal file
1630
package/kernel/mac80211/Makefile
Normal file
File diff suppressed because it is too large
Load Diff
641
package/kernel/mac80211/files/lib/wifi/mac80211.sh
Normal file
641
package/kernel/mac80211/files/lib/wifi/mac80211.sh
Normal file
@@ -0,0 +1,641 @@
|
||||
#!/bin/sh
|
||||
append DRIVERS "mac80211"
|
||||
|
||||
mac80211_hostapd_setup_base() {
|
||||
local phy="$1"
|
||||
local ifname="$2"
|
||||
|
||||
cfgfile="/var/run/hostapd-$phy.conf"
|
||||
|
||||
config_get device "$vif" device
|
||||
config_get country "$device" country
|
||||
config_get hwmode "$device" hwmode
|
||||
config_get channel "$device" channel
|
||||
config_get beacon_int "$device" beacon_int
|
||||
config_get basic_rate_list "$device" basic_rate
|
||||
config_get_bool noscan "$device" noscan
|
||||
|
||||
hostapd_set_log_options base_cfg "$device"
|
||||
|
||||
[ -n "$channel" -a -z "$hwmode" ] && wifi_fixup_hwmode "$device"
|
||||
|
||||
[ "$channel" = auto ] && {
|
||||
channel=$(iw phy "$phy" info | \
|
||||
sed -ne '/MHz/ { /disabled\|passive\|radar/d; s/.*\[//; s/\].*//; p; q }')
|
||||
config_set "$device" channel "$channel"
|
||||
}
|
||||
|
||||
[ -n "$hwmode" ] && {
|
||||
config_get hwmode_11n "$device" hwmode_11n
|
||||
[ -n "$hwmode_11n" ] && {
|
||||
hwmode="$hwmode_11n"
|
||||
append base_cfg "ieee80211n=1" "$N"
|
||||
config_get htmode "$device" htmode
|
||||
config_get ht_capab_list "$device" ht_capab
|
||||
case "$htmode" in
|
||||
HT20|HT40+|HT40-) ht_capab="[$htmode]";;
|
||||
*)ht_capab=;;
|
||||
esac
|
||||
for cap in $ht_capab_list; do
|
||||
ht_capab="$ht_capab[$cap]"
|
||||
done
|
||||
[ -n "$ht_capab" ] && append base_cfg "ht_capab=$ht_capab" "$N"
|
||||
}
|
||||
}
|
||||
|
||||
local country_ie=0
|
||||
[ -n "$country" ] && country_ie=1
|
||||
config_get_bool country_ie "$device" country_ie "$country_ie"
|
||||
[ "$country_ie" -gt 0 ] && append base_cfg "ieee80211d=1" "$N"
|
||||
|
||||
local br brval brstr
|
||||
[ -n "$basic_rate_list" ] && {
|
||||
for br in $basic_rate_list; do
|
||||
brval="$(($br / 100))"
|
||||
[ -n "$brstr" ] && brstr="$brstr "
|
||||
brstr="$brstr$brval"
|
||||
done
|
||||
}
|
||||
|
||||
cat >> "$cfgfile" <<EOF
|
||||
ctrl_interface=/var/run/hostapd-$phy
|
||||
driver=nl80211
|
||||
wmm_ac_bk_cwmin=4
|
||||
wmm_ac_bk_cwmax=10
|
||||
wmm_ac_bk_aifs=7
|
||||
wmm_ac_bk_txop_limit=0
|
||||
wmm_ac_bk_acm=0
|
||||
wmm_ac_be_aifs=3
|
||||
wmm_ac_be_cwmin=4
|
||||
wmm_ac_be_cwmax=10
|
||||
wmm_ac_be_txop_limit=0
|
||||
wmm_ac_be_acm=0
|
||||
wmm_ac_vi_aifs=2
|
||||
wmm_ac_vi_cwmin=3
|
||||
wmm_ac_vi_cwmax=4
|
||||
wmm_ac_vi_txop_limit=94
|
||||
wmm_ac_vi_acm=0
|
||||
wmm_ac_vo_aifs=2
|
||||
wmm_ac_vo_cwmin=2
|
||||
wmm_ac_vo_cwmax=3
|
||||
wmm_ac_vo_txop_limit=47
|
||||
wmm_ac_vo_acm=0
|
||||
tx_queue_data3_aifs=7
|
||||
tx_queue_data3_cwmin=15
|
||||
tx_queue_data3_cwmax=1023
|
||||
tx_queue_data3_burst=0
|
||||
tx_queue_data2_aifs=3
|
||||
tx_queue_data2_cwmin=15
|
||||
tx_queue_data2_cwmax=63
|
||||
tx_queue_data2_burst=0
|
||||
tx_queue_data1_aifs=1
|
||||
tx_queue_data1_cwmin=7
|
||||
tx_queue_data1_cwmax=15
|
||||
tx_queue_data1_burst=3.0
|
||||
tx_queue_data0_aifs=1
|
||||
tx_queue_data0_cwmin=3
|
||||
tx_queue_data0_cwmax=7
|
||||
tx_queue_data0_burst=1.5
|
||||
${hwmode:+hw_mode=$hwmode}
|
||||
${channel:+channel=$channel}
|
||||
${beacon_int:+beacon_int=$beacon_int}
|
||||
${country:+country_code=$country}
|
||||
${noscan:+noscan=$noscan}
|
||||
${brstr:+basic_rates=$brstr}
|
||||
$base_cfg
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
mac80211_hostapd_setup_bss() {
|
||||
local phy="$1"
|
||||
local vif="$2"
|
||||
|
||||
hostapd_cfg=
|
||||
cfgfile="/var/run/hostapd-$phy.conf"
|
||||
config_get ifname "$vif" ifname
|
||||
|
||||
if [ -f "$cfgfile" ]; then
|
||||
append hostapd_cfg "bss=$ifname" "$N"
|
||||
else
|
||||
mac80211_hostapd_setup_base "$phy" "$ifname"
|
||||
append hostapd_cfg "interface=$ifname" "$N"
|
||||
fi
|
||||
|
||||
local net_cfg bridge
|
||||
net_cfg="$(find_net_config "$vif")"
|
||||
[ -z "$net_cfg" ] || bridge="$(bridge_interface "$net_cfg")"
|
||||
config_set "$vif" bridge "$bridge"
|
||||
|
||||
hostapd_set_bss_options hostapd_cfg "$vif"
|
||||
|
||||
config_get_bool wds "$vif" wds 0
|
||||
[ "$wds" -gt 0 ] && append hostapd_cfg "wds_sta=1" "$N"
|
||||
|
||||
local macaddr hidden maxassoc wmm
|
||||
config_get macaddr "$vif" macaddr
|
||||
config_get maxassoc "$vif" maxassoc
|
||||
config_get dtim_period "$vif" dtim_period
|
||||
config_get max_listen_int "$vif" max_listen_int
|
||||
config_get_bool hidden "$vif" hidden 0
|
||||
config_get_bool wmm "$vif" wmm 1
|
||||
cat >> /var/run/hostapd-$phy.conf <<EOF
|
||||
$hostapd_cfg
|
||||
wmm_enabled=$wmm
|
||||
bssid=$macaddr
|
||||
ignore_broadcast_ssid=$hidden
|
||||
${dtim_period:+dtim_period=$dtim_period}
|
||||
${max_listen_int:+max_listen_interval=$max_listen_int}
|
||||
${maxassoc:+max_num_sta=$maxassoc}
|
||||
EOF
|
||||
}
|
||||
|
||||
mac80211_start_vif() {
|
||||
local vif="$1"
|
||||
local ifname="$2"
|
||||
|
||||
local net_cfg
|
||||
net_cfg="$(find_net_config "$vif")"
|
||||
[ -z "$net_cfg" ] || start_net "$ifname" "$net_cfg"
|
||||
|
||||
set_wifi_up "$vif" "$ifname"
|
||||
}
|
||||
|
||||
lookup_phy() {
|
||||
[ -n "$phy" ] && {
|
||||
[ -d /sys/class/ieee80211/$phy ] && return
|
||||
}
|
||||
|
||||
local devpath
|
||||
config_get devpath "$device" path
|
||||
[ -n "$devpath" -a -d "/sys/devices/$devpath/ieee80211" ] && {
|
||||
phy="$(ls /sys/devices/$devpath/ieee80211 | grep -m 1 phy)"
|
||||
[ -n "$phy" ] && return
|
||||
}
|
||||
|
||||
local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
|
||||
[ -n "$macaddr" ] && {
|
||||
for _phy in $(ls /sys/class/ieee80211 2>/dev/null); do
|
||||
[ "$macaddr" = "$(cat /sys/class/ieee80211/${_phy}/macaddress)" ] || continue
|
||||
phy="$_phy"
|
||||
return
|
||||
done
|
||||
}
|
||||
phy=
|
||||
return
|
||||
}
|
||||
|
||||
find_mac80211_phy() {
|
||||
local device="$1"
|
||||
|
||||
config_get phy "$device" phy
|
||||
lookup_phy
|
||||
[ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
|
||||
echo "PHY for wifi device $1 not found"
|
||||
return 1
|
||||
}
|
||||
config_set "$device" phy "$phy"
|
||||
|
||||
config_get macaddr "$device" macaddr
|
||||
[ -z "$macaddr" ] && {
|
||||
config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
scan_mac80211() {
|
||||
local device="$1"
|
||||
local adhoc sta ap monitor mesh disabled
|
||||
|
||||
config_get vifs "$device" vifs
|
||||
for vif in $vifs; do
|
||||
config_get_bool disabled "$vif" disabled 0
|
||||
[ $disabled = 0 ] || continue
|
||||
|
||||
config_get mode "$vif" mode
|
||||
case "$mode" in
|
||||
adhoc|sta|ap|monitor|mesh)
|
||||
append $mode "$vif"
|
||||
;;
|
||||
*) echo "$device($vif): Invalid mode, ignored."; continue;;
|
||||
esac
|
||||
done
|
||||
|
||||
config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }${monitor:+$monitor }${mesh:+$mesh}"
|
||||
}
|
||||
|
||||
list_phy_interfaces() {
|
||||
local phy="$1"
|
||||
if [ -d "/sys/class/ieee80211/${phy}/device/net" ]; then
|
||||
ls "/sys/class/ieee80211/${phy}/device/net" 2>/dev/null;
|
||||
else
|
||||
ls "/sys/class/ieee80211/${phy}/device" 2>/dev/null | grep net: | sed -e 's,net:,,g'
|
||||
fi
|
||||
}
|
||||
|
||||
disable_mac80211() (
|
||||
local device="$1"
|
||||
|
||||
find_mac80211_phy "$device" || return 0
|
||||
config_get phy "$device" phy
|
||||
|
||||
set_wifi_down "$device"
|
||||
# kill all running hostapd and wpa_supplicant processes that
|
||||
# are running on atheros/mac80211 vifs
|
||||
for pid in `pidof hostapd`; do
|
||||
grep -E "$phy" /proc/$pid/cmdline >/dev/null && \
|
||||
kill $pid
|
||||
done
|
||||
|
||||
include /lib/network
|
||||
for wdev in $(list_phy_interfaces "$phy"); do
|
||||
[ -f "/var/run/$wdev.pid" ] && kill $(cat /var/run/$wdev.pid) >&/dev/null 2>&1
|
||||
for pid in `pidof wpa_supplicant`; do
|
||||
grep "$wdev" /proc/$pid/cmdline >/dev/null && \
|
||||
kill $pid
|
||||
done
|
||||
ifconfig "$wdev" down 2>/dev/null
|
||||
unbridge "$dev"
|
||||
iw dev "$wdev" del
|
||||
done
|
||||
|
||||
return 0
|
||||
)
|
||||
|
||||
get_freq() {
|
||||
local phy="$1"
|
||||
local chan="$2"
|
||||
iw "$phy" info | grep -E -m1 "(\* ${chan:-....} MHz${chan:+|\\[$chan\\]})" | grep MHz | awk '{print $2}'
|
||||
}
|
||||
|
||||
mac80211_generate_mac() {
|
||||
local id="$1"
|
||||
local ref="$2"
|
||||
local mask="$3"
|
||||
|
||||
[ "$mask" = "00:00:00:00:00:00" ] && mask="ff:ff:ff:ff:ff:ff";
|
||||
local oIFS="$IFS"; IFS=":"; set -- $mask; IFS="$oIFS"
|
||||
|
||||
local mask1=$1
|
||||
local mask6=$6
|
||||
|
||||
local oIFS="$IFS"; IFS=":"; set -- $ref; IFS="$oIFS"
|
||||
[ "$((0x$mask1))" -gt 0 ] && {
|
||||
b1="0x$1"
|
||||
[ "$id" -gt 0 ] && \
|
||||
b1=$((($b1 | 0x2) ^ (($id - 1) << 2)))
|
||||
printf "%02x:%s:%s:%s:%s:%s" $b1 $2 $3 $4 $5 $6
|
||||
return
|
||||
}
|
||||
|
||||
[ "$((0x$mask6))" -lt 255 ] && {
|
||||
printf "%s:%s:%s:%s:%s:%02x" $1 $2 $3 $4 $5 $(( 0x$6 ^ $id ))
|
||||
return
|
||||
}
|
||||
|
||||
off2=$(( (0x$6 + $id) / 0x100 ))
|
||||
printf "%s:%s:%s:%s:%02x:%02x" \
|
||||
$1 $2 $3 $4 \
|
||||
$(( (0x$5 + $off2) % 0x100 )) \
|
||||
$(( (0x$6 + $id) % 0x100 ))
|
||||
}
|
||||
|
||||
enable_mac80211() {
|
||||
local device="$1"
|
||||
config_get channel "$device" channel
|
||||
config_get vifs "$device" vifs
|
||||
config_get txpower "$device" txpower
|
||||
config_get country "$device" country
|
||||
config_get distance "$device" distance
|
||||
config_get txantenna "$device" txantenna all
|
||||
config_get rxantenna "$device" rxantenna all
|
||||
config_get antenna_gain "$device" antenna_gain 0
|
||||
config_get frag "$device" frag
|
||||
config_get rts "$device" rts
|
||||
find_mac80211_phy "$device" || return 0
|
||||
config_get phy "$device" phy
|
||||
local i=0
|
||||
local macidx=0
|
||||
local apidx=0
|
||||
fixed=""
|
||||
local hostapd_ctrl=""
|
||||
|
||||
[ -n "$country" ] && {
|
||||
iw reg get | grep -q "^country $country:" || {
|
||||
iw reg set "$country"
|
||||
sleep 1
|
||||
}
|
||||
}
|
||||
|
||||
config_get chanbw "$device" chanbw
|
||||
[ -n "$chanbw" -a -d /sys/kernel/debug/ieee80211/$phy/ath9k ] && echo "$chanbw" > /sys/kernel/debug/ieee80211/$phy/ath9k/chanbw
|
||||
[ -n "$chanbw" -a -d /sys/kernel/debug/ieee80211/$phy/ath5k ] && echo "$chanbw" > /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode
|
||||
|
||||
[ "$channel" = "auto" -o "$channel" = "0" ] || {
|
||||
fixed=1
|
||||
}
|
||||
|
||||
iw phy "$phy" set antenna $txantenna $rxantenna >/dev/null 2>&1
|
||||
iw phy "$phy" set antenna_gain $antenna_gain
|
||||
|
||||
[ -n "$distance" ] && iw phy "$phy" set distance "$distance"
|
||||
[ -n "$frag" ] && iw phy "$phy" set frag "${frag%%.*}"
|
||||
[ -n "$rts" ] && iw phy "$phy" set rts "${rts%%.*}"
|
||||
|
||||
export channel fixed
|
||||
# convert channel to frequency
|
||||
local freq="$(get_freq "$phy" "${fixed:+$channel}")"
|
||||
|
||||
wifi_fixup_hwmode "$device" "g"
|
||||
for vif in $vifs; do
|
||||
config_get ifname "$vif" ifname
|
||||
[ -n "$ifname" ] || {
|
||||
[ $i -gt 0 ] && ifname="wlan${phy#phy}-$i" || ifname="wlan${phy#phy}"
|
||||
}
|
||||
config_set "$vif" ifname "$ifname"
|
||||
|
||||
config_get mode "$vif" mode
|
||||
config_get ssid "$vif" ssid
|
||||
|
||||
# It is far easier to delete and create the desired interface
|
||||
case "$mode" in
|
||||
adhoc)
|
||||
iw phy "$phy" interface add "$ifname" type adhoc
|
||||
;;
|
||||
ap)
|
||||
# Hostapd will handle recreating the interface and
|
||||
# it's accompanying monitor
|
||||
apidx="$(($apidx + 1))"
|
||||
[ "$apidx" -gt 1 ] || iw phy "$phy" interface add "$ifname" type managed
|
||||
;;
|
||||
mesh)
|
||||
config_get mesh_id "$vif" mesh_id
|
||||
iw phy "$phy" interface add "$ifname" type mp mesh_id "$mesh_id"
|
||||
;;
|
||||
monitor)
|
||||
iw phy "$phy" interface add "$ifname" type monitor
|
||||
;;
|
||||
sta)
|
||||
local wdsflag
|
||||
config_get_bool wds "$vif" wds 0
|
||||
[ "$wds" -gt 0 ] && wdsflag="4addr on"
|
||||
iw phy "$phy" interface add "$ifname" type managed $wdsflag
|
||||
config_get_bool powersave "$vif" powersave 0
|
||||
[ "$powersave" -gt 0 ] && powersave="on" || powersave="off"
|
||||
iw "$ifname" set power_save "$powersave"
|
||||
;;
|
||||
esac
|
||||
|
||||
# All interfaces must have unique mac addresses
|
||||
# which can either be explicitly set in the device
|
||||
# section, or automatically generated
|
||||
config_get macaddr "$device" macaddr
|
||||
config_get vif_mac "$vif" macaddr
|
||||
[ -n "$vif_mac" ] || {
|
||||
vif_mac="$(mac80211_generate_mac $macidx $macaddr $(cat /sys/class/ieee80211/${phy}/address_mask))"
|
||||
macidx="$(($macidx + 1))"
|
||||
}
|
||||
[ "$mode" = "ap" ] || ifconfig "$ifname" hw ether "$vif_mac"
|
||||
config_set "$vif" macaddr "$vif_mac"
|
||||
|
||||
# !! ap !!
|
||||
#
|
||||
# ALL ap functionality will be passed to hostapd
|
||||
#
|
||||
# !! station !!
|
||||
#
|
||||
# ALL station functionality will be passed to wpa_supplicant
|
||||
#
|
||||
if [ ! "$mode" = "ap" ]; then
|
||||
# We attempt to set the channel for all interfaces, although
|
||||
# mac80211 may not support it or the driver might not yet
|
||||
# for ap mode this is handled by hostapd
|
||||
config_get htmode "$device" htmode
|
||||
case "$htmode" in
|
||||
HT20|HT40+|HT40-) ;;
|
||||
*) htmode= ;;
|
||||
esac
|
||||
[ -n "$fixed" -a -n "$channel" ] && iw dev "$ifname" set channel "$channel" $htmode
|
||||
fi
|
||||
|
||||
i=$(($i + 1))
|
||||
done
|
||||
|
||||
local start_hostapd=
|
||||
rm -f /var/run/hostapd-$phy.conf
|
||||
for vif in $vifs; do
|
||||
config_get mode "$vif" mode
|
||||
[ "$mode" = "ap" ] || continue
|
||||
mac80211_hostapd_setup_bss "$phy" "$vif"
|
||||
start_hostapd=1
|
||||
done
|
||||
|
||||
[ -n "$start_hostapd" ] && {
|
||||
hostapd -P /var/run/wifi-$phy.pid -B /var/run/hostapd-$phy.conf || {
|
||||
echo "Failed to start hostapd for $phy"
|
||||
return
|
||||
}
|
||||
sleep 2
|
||||
|
||||
for vif in $vifs; do
|
||||
config_get mode "$vif" mode
|
||||
config_get ifname "$vif" ifname
|
||||
[ "$mode" = "ap" ] || continue
|
||||
hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd-$phy/$ifname}"
|
||||
mac80211_start_vif "$vif" "$ifname"
|
||||
done
|
||||
}
|
||||
|
||||
for vif in $vifs; do
|
||||
config_get mode "$vif" mode
|
||||
config_get ifname "$vif" ifname
|
||||
[ "$mode" = "ap" ] || ifconfig "$ifname" up
|
||||
|
||||
config_get vif_txpower "$vif" txpower
|
||||
# use vif_txpower (from wifi-iface) to override txpower (from
|
||||
# wifi-device) if the latter doesn't exist
|
||||
txpower="${txpower:-$vif_txpower}"
|
||||
[ -z "$txpower" ] || iw dev "$ifname" set txpower fixed "${txpower%%.*}00"
|
||||
|
||||
case "$mode" in
|
||||
adhoc)
|
||||
config_get bssid "$vif" bssid
|
||||
config_get ssid "$vif" ssid
|
||||
config_get beacon_int "$device" beacon_int
|
||||
config_get basic_rate_list "$device" basic_rate
|
||||
config_get encryption "$vif" encryption
|
||||
config_get key "$vif" key 1
|
||||
config_get mcast_rate "$vif" mcast_rate
|
||||
config_get htmode "$device" htmode
|
||||
case "$htmode" in
|
||||
HT20|HT40+|HT40-) ;;
|
||||
*) htmode= ;;
|
||||
esac
|
||||
|
||||
|
||||
local keyspec=""
|
||||
[ "$encryption" == "psk" -o "$encryption" == "psk2" ] && {
|
||||
if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
|
||||
wpa_supplicant_setup_vif "$vif" nl80211 "${hostapd_ctrl:+-H $hostapd_ctrl}" $freq $htmode || {
|
||||
echo "enable_mac80211($device): Failed to set up wpa_supplicant for interface $ifname" >&2
|
||||
# make sure this wifi interface won't accidentally stay open without encryption
|
||||
ifconfig "$ifname" down
|
||||
}
|
||||
mac80211_start_vif "$vif" "$ifname"
|
||||
continue
|
||||
fi
|
||||
}
|
||||
|
||||
[ "$encryption" == "wep" ] && {
|
||||
case "$key" in
|
||||
[1234])
|
||||
local idx
|
||||
for idx in 1 2 3 4; do
|
||||
local ikey
|
||||
config_get ikey "$vif" "key$idx"
|
||||
|
||||
[ -n "$ikey" ] && {
|
||||
ikey="$(($idx - 1)):$(prepare_key_wep "$ikey")"
|
||||
[ $idx -eq $key ] && ikey="d:$ikey"
|
||||
append keyspec "$ikey"
|
||||
}
|
||||
done
|
||||
;;
|
||||
*) append keyspec "d:0:$(prepare_key_wep "$key")" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
local br brval brsub brstr
|
||||
[ -n "$basic_rate_list" ] && {
|
||||
for br in $basic_rate_list; do
|
||||
brval="$(($br / 1000))"
|
||||
brsub="$((($br / 100) % 10))"
|
||||
[ "$brsub" -gt 0 ] && brval="$brval.$brsub"
|
||||
[ -n "$brstr" ] && brstr="$brstr,"
|
||||
brstr="$brstr$brval"
|
||||
done
|
||||
}
|
||||
|
||||
local mcval=""
|
||||
[ -n "$mcast_rate" ] && {
|
||||
mcval="$(($mcast_rate / 1000))"
|
||||
mcsub="$(( ($mcast_rate / 100) % 10 ))"
|
||||
[ "$mcsub" -gt 0 ] && mcval="$mcval.$mcsub"
|
||||
}
|
||||
|
||||
iw dev "$ifname" ibss join "$ssid" $freq $htmode \
|
||||
${fixed:+fixed-freq} $bssid \
|
||||
${beacon_int:+beacon-interval $beacon_int} \
|
||||
${brstr:+basic-rates $brstr} \
|
||||
${mcval:+mcast-rate $mcval} \
|
||||
${keyspec:+keys $keyspec}
|
||||
;;
|
||||
mesh)
|
||||
mp_list="mesh_retry_timeout mesh_confirm_timeout mesh_holding_timeout mesh_max_peer_links
|
||||
mesh_max_retries mesh_ttl mesh_element_ttl mesh_auto_open_plinks mesh_hwmp_max_preq_retries
|
||||
mesh_path_refresh_time mesh_min_discovery_timeout mesh_hwmp_active_path_timeout
|
||||
mesh_hwmp_preq_min_interval mesh_hwmp_net_diameter_traversal_time mesh_hwmp_rootmode
|
||||
mesh_hwmp_rann_interval mesh_gate_announcements mesh_fwding mesh_sync_offset_max_neighor
|
||||
mesh_rssi_threshold mesh_hwmp_active_path_to_root_timeout mesh_hwmp_root_interval
|
||||
mesh_hwmp_confirmation_interval mesh_power_mode mesh_awake_window"
|
||||
for mp in $mp_list
|
||||
do
|
||||
config_get mp_val "$vif" "$mp" ""
|
||||
[ -n "$mp_val" ] && iw dev "$ifname" set mesh_param "$mp" "$mp_val"
|
||||
done
|
||||
;;
|
||||
sta)
|
||||
if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
|
||||
wpa_supplicant_setup_vif "$vif" nl80211 "${hostapd_ctrl:+-H $hostapd_ctrl}" || {
|
||||
echo "enable_mac80211($device): Failed to set up wpa_supplicant for interface $ifname" >&2
|
||||
# make sure this wifi interface won't accidentally stay open without encryption
|
||||
ifconfig "$ifname" down
|
||||
continue
|
||||
}
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
[ "$mode" = "ap" ] || mac80211_start_vif "$vif" "$ifname"
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
|
||||
check_mac80211_device() {
|
||||
config_get phy "$1" phy
|
||||
[ -z "$phy" ] && {
|
||||
find_mac80211_phy "$1" >/dev/null || return 0
|
||||
config_get phy "$1" phy
|
||||
}
|
||||
[ "$phy" = "$dev" ] && found=1
|
||||
}
|
||||
|
||||
detect_mac80211() {
|
||||
devidx=0
|
||||
config_load wireless
|
||||
while :; do
|
||||
config_get type "radio$devidx" type
|
||||
[ -n "$type" ] || break
|
||||
devidx=$(($devidx + 1))
|
||||
done
|
||||
for dev in $(ls /sys/class/ieee80211); do
|
||||
found=0
|
||||
config_foreach check_mac80211_device wifi-device
|
||||
[ "$found" -gt 0 ] && continue
|
||||
|
||||
mode_11n=""
|
||||
mode_band="g"
|
||||
channel="11"
|
||||
ht_cap=0
|
||||
for cap in $(iw phy "$dev" info | grep 'Capabilities:' | cut -d: -f2); do
|
||||
ht_cap="$(($ht_cap | $cap))"
|
||||
done
|
||||
ht_capab="";
|
||||
[ "$ht_cap" -gt 0 ] && {
|
||||
mode_11n="n"
|
||||
append ht_capab " option htmode HT20" "$N"
|
||||
|
||||
list=" list ht_capab"
|
||||
[ "$(($ht_cap & 1))" -eq 1 ] && append ht_capab "$list LDPC" "$N"
|
||||
[ "$(($ht_cap & 16))" -eq 16 ] && append ht_capab "$list GF" "$N"
|
||||
[ "$(($ht_cap & 32))" -eq 32 ] && append ht_capab "$list SHORT-GI-20" "$N"
|
||||
[ "$(($ht_cap & 64))" -eq 64 ] && append ht_capab "$list SHORT-GI-40" "$N"
|
||||
[ "$(($ht_cap & 128))" -eq 128 ] && append ht_capab "$list TX-STBC" "$N"
|
||||
[ "$(($ht_cap & 768))" -eq 256 ] && append ht_capab "$list RX-STBC1" "$N"
|
||||
[ "$(($ht_cap & 768))" -eq 512 ] && append ht_capab "$list RX-STBC12" "$N"
|
||||
[ "$(($ht_cap & 768))" -eq 768 ] && append ht_capab "$list RX-STBC123" "$N"
|
||||
[ "$(($ht_cap & 4096))" -eq 4096 ] && append ht_capab "$list DSSS_CCK-40" "$N"
|
||||
}
|
||||
iw phy "$dev" info | grep -q '2412 MHz' || { mode_band="a"; channel="36"; }
|
||||
|
||||
if [ -x /usr/bin/readlink ]; then
|
||||
path="$(readlink -f /sys/class/ieee80211/${dev}/device)"
|
||||
path="${path##/sys/devices/}"
|
||||
dev_id=" option path '$path'"
|
||||
else
|
||||
dev_id=" option macaddr $(cat /sys/class/ieee80211/${dev}/macaddress)"
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
config wifi-device radio$devidx
|
||||
option type mac80211
|
||||
option channel ${channel}
|
||||
option hwmode 11${mode_11n}${mode_band}
|
||||
$dev_id
|
||||
$ht_capab
|
||||
# REMOVE THIS LINE TO ENABLE WIFI:
|
||||
option disabled 1
|
||||
|
||||
config wifi-iface
|
||||
option device radio$devidx
|
||||
option network lan
|
||||
option mode ap
|
||||
option ssid OpenWrt
|
||||
option encryption none
|
||||
|
||||
EOF
|
||||
devidx=$(($devidx + 1))
|
||||
done
|
||||
}
|
||||
|
||||
697
package/kernel/mac80211/files/regdb.txt
Normal file
697
package/kernel/mac80211/files/regdb.txt
Normal file
@@ -0,0 +1,697 @@
|
||||
# This is the world regulatory domain
|
||||
country 00:
|
||||
(2402 - 2472 @ 40), (3, 20)
|
||||
# Channel 12 - 13. No HT40 channel fits here
|
||||
(2457 - 2482 @ 20), (3, 20), PASSIVE-SCAN, NO-IBSS
|
||||
# Channel 14. Only JP enables this and for 802.11b only
|
||||
(2474 - 2494 @ 20), (3, 20), PASSIVE-SCAN, NO-IBSS, NO-OFDM
|
||||
# Channel 36 - 48
|
||||
(5170 - 5250 @ 40), (3, 20)
|
||||
# NB: 5260 MHz - 5700 MHz requies DFS
|
||||
# Channel 149 - 165
|
||||
(5735 - 5835 @ 40), (3, 20), PASSIVE-SCAN, NO-IBSS
|
||||
|
||||
|
||||
country AE:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country AL:
|
||||
(2402 - 2482 @ 20), (N/A, 20)
|
||||
|
||||
country AM:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (N/A, 18)
|
||||
(5250 - 5330 @ 20), (N/A, 18), DFS
|
||||
|
||||
country AN:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country AR:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country AT: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country AU:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 23)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country AW:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country AZ:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 18)
|
||||
(5250 - 5330 @ 40), (N/A, 18), DFS
|
||||
|
||||
country BA: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country BB:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 23)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country BD:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
|
||||
country BE: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country BG: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 23)
|
||||
(5250 - 5290 @ 40), (N/A, 23), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 30), DFS
|
||||
|
||||
country BH:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (N/A, 20)
|
||||
(5250 - 5330 @ 20), (N/A, 20), DFS
|
||||
(5735 - 5835 @ 20), (N/A, 20)
|
||||
|
||||
country BL:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 18)
|
||||
(5250 - 5330 @ 40), (N/A, 18), DFS
|
||||
|
||||
country BN:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country BO:
|
||||
(2402 - 2482 @ 40), (N/A, 30)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country BR:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country BY:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country BZ:
|
||||
(2402 - 2482 @ 40), (N/A, 30)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country CA:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country CH: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country CL:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5735 - 5835 @ 40), (N/A, 20)
|
||||
|
||||
country CN:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country CO:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country CR:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (3, 17)
|
||||
(5250 - 5330 @ 20), (3, 23), DFS
|
||||
(5735 - 5835 @ 20), (3, 30)
|
||||
|
||||
country CS:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country CY: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
# Data from http://www.ctu.eu/164/download/VOR/VOR-12-08-2005-34.pdf
|
||||
# and http://www.ctu.eu/164/download/VOR/VOR-12-05-2007-6-AN.pdf
|
||||
# Power at 5250 - 5350 MHz and 5470 - 5725 MHz can be doubled if TPC is
|
||||
# implemented.
|
||||
country CZ: DFS-ETSI
|
||||
(2400 - 2483.5 @ 40), (N/A, 100 mW)
|
||||
(5150 - 5250 @ 40), (N/A, 200 mW), NO-OUTDOOR
|
||||
(5250 - 5350 @ 40), (N/A, 100 mW), NO-OUTDOOR, DFS
|
||||
(5470 - 5725 @ 40), (N/A, 500 mW), DFS
|
||||
|
||||
# Data from "Frequenznutzungsplan" (as published in April 2008), downloaded from
|
||||
# http://www.bundesnetzagentur.de/cae/servlet/contentblob/38448/publicationFile/2659/Frequenznutzungsplan2008_Id17448pdf.pdf
|
||||
# For the 5GHz range also see
|
||||
# http://www.bundesnetzagentur.de/cae/servlet/contentblob/38216/publicationFile/6579/WLAN5GHzVfg7_2010_28042010pdf.pdf
|
||||
# The values have been reduced by a factor of 2 (3db) for non TPC devices
|
||||
# (in other words: devices with TPC can use twice the tx power of this table).
|
||||
# Note that the docs do not require TPC for 5150--5250; the reduction to
|
||||
# 100mW thus is not strictly required -- however the conservative 100mW
|
||||
# limit is used here as the non-interference with radar and satellite
|
||||
# apps relies on the attenuation by the building walls only in the
|
||||
# absence of DFS; the neighbour countries have 100mW limit here as well.
|
||||
|
||||
country DE: DFS-ETSI
|
||||
# entries 279004 and 280006
|
||||
(2400 - 2483.5 @ 40), (N/A, 100 mW)
|
||||
# entry 303005
|
||||
(5150 - 5250 @ 40), (N/A, 100 mW), NO-OUTDOOR
|
||||
# entries 304002 and 305002
|
||||
(5250 - 5350 @ 40), (N/A, 100 mW), NO-OUTDOOR, DFS
|
||||
# entries 308002, 309001 and 310003
|
||||
(5470 - 5725 @ 40), (N/A, 500 mW), DFS
|
||||
|
||||
country DK: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country DO:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country DZ:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
|
||||
country EC:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (3, 17)
|
||||
(5250 - 5330 @ 20), (3, 23), DFS
|
||||
(5735 - 5835 @ 20), (3, 30)
|
||||
|
||||
country EE: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country EG:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (N/A, 20)
|
||||
(5250 - 5330 @ 20), (N/A, 20), DFS
|
||||
|
||||
country ES: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country FI: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country FR: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country GE:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 18)
|
||||
(5250 - 5330 @ 40), (N/A, 18), DFS
|
||||
|
||||
country GB: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country GD:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country GR: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country GL: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (N/A, 20)
|
||||
(5250 - 5330 @ 20), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 20), (N/A, 27), DFS
|
||||
|
||||
country GT:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country GU:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 20), (3, 17)
|
||||
(5250 - 5330 @ 20), (3, 23), DFS
|
||||
(5735 - 5835 @ 20), (3, 30)
|
||||
|
||||
country HN:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country HK:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country HR: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country HT:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country HU: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country ID:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
|
||||
country IE: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country IL:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5150 - 5250 @ 40), (N/A, 200 mW), NO-OUTDOOR
|
||||
(5250 - 5350 @ 40), (N/A, 200 mW), NO-OUTDOOR, DFS
|
||||
|
||||
country IN:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5735 - 5835 @ 40), (N/A, 20)
|
||||
|
||||
country IS: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country IR:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country IT: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country JM:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country JP:
|
||||
(2402 - 2472 @ 40), (N/A, 20)
|
||||
(2457 - 2482 @ 20), (N/A, 20)
|
||||
(2474 - 2494 @ 20), (N/A, 20), NO-OFDM
|
||||
(4910 - 4930 @ 10), (N/A, 23)
|
||||
(4910 - 4990 @ 40), (N/A, 23)
|
||||
(4930 - 4950 @ 10), (N/A, 23)
|
||||
(5030 - 5045 @ 10), (N/A, 23)
|
||||
(5030 - 5090 @ 40), (N/A, 23)
|
||||
(5050 - 5060 @ 10), (N/A, 23)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 23), DFS
|
||||
|
||||
country JO:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 18)
|
||||
|
||||
country KE:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country KH:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country KP:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5330 @ 40), (3, 20)
|
||||
(5160 - 5250 @ 40), (3, 20), DFS
|
||||
(5490 - 5630 @ 40), (3, 30), DFS
|
||||
(5735 - 5815 @ 40), (3, 30)
|
||||
|
||||
country KR:
|
||||
(2402 - 2482 @ 20), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (3, 20)
|
||||
(5250 - 5330 @ 20), (3, 20), DFS
|
||||
(5490 - 5630 @ 20), (3, 30), DFS
|
||||
(5735 - 5815 @ 20), (3, 30)
|
||||
|
||||
country KW:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
|
||||
country KZ:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
|
||||
country LB:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country LI: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country LK:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (3, 17)
|
||||
(5250 - 5330 @ 20), (3, 20), DFS
|
||||
(5490 - 5710 @ 20), (3, 20), DFS
|
||||
(5735 - 5835 @ 20), (3, 30)
|
||||
|
||||
country LT: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country LU: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country LV: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country MC: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 18)
|
||||
(5250 - 5330 @ 40), (N/A, 18), DFS
|
||||
|
||||
country MA:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
|
||||
country MO:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 23)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country MK: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country MT: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country MY:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 30), DFS
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country MX:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country NL: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20), NO-OUTDOOR
|
||||
(5250 - 5330 @ 40), (N/A, 20), NO-OUTDOOR, DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country NO: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country NP:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country NZ:
|
||||
(2402 - 2482 @ 40), (N/A, 30)
|
||||
(5170 - 5250 @ 20), (3, 23)
|
||||
(5250 - 5330 @ 20), (3, 23), DFS
|
||||
(5735 - 5835 @ 20), (3, 30)
|
||||
|
||||
country OM:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country PA:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country PE:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country PG:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country PH:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country PK:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country PL: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country PT: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country PR:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 23), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country QA:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 40), (N/A, 30)
|
||||
|
||||
country RO: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country RU:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5835 @ 20), (N/A, 30)
|
||||
|
||||
country SA:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (3, 23)
|
||||
(5250 - 5330 @ 20), (3, 23), DFS
|
||||
(5735 - 5835 @ 20), (3, 30)
|
||||
|
||||
country SE: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country SG:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5735 - 5835 @ 40), (N/A, 20)
|
||||
|
||||
country SI: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country SK: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
(5490 - 5710 @ 40), (N/A, 27), DFS
|
||||
|
||||
country SV:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (3, 17)
|
||||
(5250 - 5330 @ 20), (3, 23), DFS
|
||||
(5735 - 5835 @ 20), (3, 30)
|
||||
|
||||
country SY:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
|
||||
country TW:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5270 - 5330 @ 40), (3, 17), DFS
|
||||
(5735 - 5815 @ 40), (3, 30)
|
||||
|
||||
country TH:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country TT:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country TN:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (N/A, 20)
|
||||
(5250 - 5330 @ 20), (N/A, 20), DFS
|
||||
|
||||
country TR: DFS-ETSI
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 20), (N/A, 20)
|
||||
(5250 - 5330 @ 20), (N/A, 20), DFS
|
||||
|
||||
country UA:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
|
||||
country US: DFS-FCC
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5600 @ 40), (3, 20), DFS
|
||||
(5650 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country UY:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country UZ:
|
||||
(2402 - 2472 @ 40), (3, 27)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country VE:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5735 - 5815 @ 40), (N/A, 23)
|
||||
|
||||
country VN:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (N/A, 20)
|
||||
(5250 - 5330 @ 40), (N/A, 20), DFS
|
||||
|
||||
country YE:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
|
||||
country ZA:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
(5170 - 5250 @ 40), (3, 17)
|
||||
(5250 - 5330 @ 40), (3, 20), DFS
|
||||
(5490 - 5710 @ 40), (3, 20), DFS
|
||||
(5735 - 5835 @ 40), (3, 30)
|
||||
|
||||
country ZW:
|
||||
(2402 - 2482 @ 40), (N/A, 20)
|
||||
|
||||
16
package/kernel/mac80211/patches/000-fix_kconfig.patch
Normal file
16
package/kernel/mac80211/patches/000-fix_kconfig.patch
Normal file
@@ -0,0 +1,16 @@
|
||||
--- a/kconf/Makefile
|
||||
+++ b/kconf/Makefile
|
||||
@@ -1,10 +1,10 @@
|
||||
-CFLAGS=-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
|
||||
+CFLAGS=-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -DKBUILD_NO_NLS
|
||||
|
||||
LXDIALOG := lxdialog/checklist.o lxdialog/inputbox.o lxdialog/menubox.o lxdialog/textbox.o lxdialog/util.o lxdialog/yesno.o
|
||||
|
||||
conf: conf.o zconf.tab.o
|
||||
-mconf: LDFLAGS = -Wl,--no-as-needed $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
|
||||
-mconf: CFLAGS += -DCURSES_LOC="<ncurses.h>" -DLOCALE
|
||||
+mconf: LDFLAGS = $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
|
||||
+mconf: CFLAGS += -DCURSES_LOC="<ncurses.h>"
|
||||
mconf: mconf.o zconf.tab.o $(LXDIALOG)
|
||||
|
||||
.PHONY: clean
|
||||
156
package/kernel/mac80211/patches/001-fix_build.patch
Normal file
156
package/kernel/mac80211/patches/001-fix_build.patch
Normal file
@@ -0,0 +1,156 @@
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -19,6 +19,7 @@ KLIB_BUILD ?= $(KLIB)/build/
|
||||
KERNEL_CONFIG := $(KLIB_BUILD)/.config
|
||||
KERNEL_MAKEFILE := $(KLIB_BUILD)/Makefile
|
||||
CONFIG_MD5 := $(shell md5sum $(KERNEL_CONFIG) 2>/dev/null | sed 's/\s.*//')
|
||||
+STAMP_KERNEL_CONFIG := .kernel_config_md5_$(CONFIG_MD5)
|
||||
|
||||
export KLIB KLIB_BUILD BACKPORT_PWD KMODDIR KMODPATH_ARG
|
||||
|
||||
@@ -36,7 +37,8 @@ mrproper:
|
||||
@rm -f .kernel_config_md5 Kconfig.versions Kconfig.kernel
|
||||
@rm -f backport-include/backport/autoconf.h
|
||||
|
||||
-.DEFAULT:
|
||||
+.SILENT: $(STAMP_KERNEL_CONFIG)
|
||||
+$(STAMP_KERNEL_CONFIG):
|
||||
@set -e ; test -f .local-symbols || ( \
|
||||
echo "/--------------" ;\
|
||||
echo "| You shouldn't run make in the backports tree, but only in" ;\
|
||||
@@ -60,56 +62,60 @@ mrproper:
|
||||
echo "| (that isn't currently running.)" ;\
|
||||
echo "\\--" ;\
|
||||
false)
|
||||
- @set -e ; if [ "$$(cat .kernel_config_md5 2>/dev/null)" != "$(CONFIG_MD5)" ] ;\
|
||||
- then \
|
||||
- echo -n "Generating local configuration database from kernel ..." ;\
|
||||
- grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | ( \
|
||||
- while read l ; do \
|
||||
- if [ "$${l:0:7}" != "CONFIG_" ] ; then \
|
||||
- continue ;\
|
||||
- fi ;\
|
||||
- l=$${l:7} ;\
|
||||
- n=$${l%%=*} ;\
|
||||
- v=$${l#*=} ;\
|
||||
- if [ "$$v" = "m" ] ; then \
|
||||
- echo config $$n ;\
|
||||
- echo ' tristate' ;\
|
||||
- elif [ "$$v" = "y" ] ; then \
|
||||
- echo config $$n ;\
|
||||
- echo ' bool' ;\
|
||||
- else \
|
||||
- continue ;\
|
||||
- fi ;\
|
||||
- echo " default $$v" ;\
|
||||
- echo "" ;\
|
||||
- done \
|
||||
- ) > Kconfig.kernel ;\
|
||||
- kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion | \
|
||||
- sed 's/^\(\(3\|2\.6\)\.[0-9]\+\).*/\1/;t;d') ;\
|
||||
- test "$$kver" != "" || echo "Kernel version parse failed!" ;\
|
||||
- test "$$kver" != "" ;\
|
||||
- kvers="$$(seq 14 39 | sed 's/^/2.6./')" ;\
|
||||
- kvers="$$kvers $$(seq 0 99 | sed 's/^/3./')" ;\
|
||||
- print=0 ;\
|
||||
- for v in $$kvers ; do \
|
||||
- if [ "$$print" = "1" ] ; then \
|
||||
- echo config BACKPORT_KERNEL_$$(echo $$v | tr . _) ;\
|
||||
- echo " def_bool y" ;\
|
||||
- fi ;\
|
||||
- if [ "$$v" = "$$kver" ] ; then print=1 ; fi ;\
|
||||
- done > Kconfig.versions ;\
|
||||
- # RHEL as well, sadly we need to grep for it ;\
|
||||
- RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) | \
|
||||
- sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
|
||||
- RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) | \
|
||||
- sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
|
||||
- for v in $$(seq 0 $$RHEL_MINOR) ; do \
|
||||
- echo config BACKPORT_RHEL_KERNEL_$${RHEL_MAJOR}_$$v ;\
|
||||
- echo " def_bool y" ;\
|
||||
- done >> Kconfig.versions ;\
|
||||
- echo " done." ;\
|
||||
- fi ;\
|
||||
- echo "$(CONFIG_MD5)" > .kernel_config_md5
|
||||
+ @rm -f .kernel_config_md5_*
|
||||
+ @touch $@
|
||||
+
|
||||
+Kconfig.kernel: $(STAMP_KERNEL_CONFIG) .local-symbols
|
||||
+ @printf "Generating local configuration database from kernel ..."
|
||||
+ @grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | ( \
|
||||
+ while read l ; do \
|
||||
+ if [ "$${l:0:7}" != "CONFIG_" ] ; then \
|
||||
+ continue ;\
|
||||
+ fi ;\
|
||||
+ l=$${l:7} ;\
|
||||
+ n=$${l%%=*} ;\
|
||||
+ v=$${l#*=} ;\
|
||||
+ if [ "$$v" = "m" ] ; then \
|
||||
+ echo config $$n ;\
|
||||
+ echo ' tristate' ;\
|
||||
+ elif [ "$$v" = "y" ] ; then \
|
||||
+ echo config $$n ;\
|
||||
+ echo ' bool' ;\
|
||||
+ else \
|
||||
+ continue ;\
|
||||
+ fi ;\
|
||||
+ echo " default $$v" ;\
|
||||
+ echo "" ;\
|
||||
+ done \
|
||||
+ ) > $@
|
||||
+ @echo " done."
|
||||
+
|
||||
+Kconfig.versions: Kconfig.kernel
|
||||
+ @kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion | \
|
||||
+ sed 's/^\(\(3\|2\.6\)\.[0-9]\+\).*/\1/;t;d') ;\
|
||||
+ test "$$kver" != "" || echo "Kernel version parse failed!" ;\
|
||||
+ test "$$kver" != "" ;\
|
||||
+ kvers="$$(seq 14 39 | sed 's/^/2.6./')" ;\
|
||||
+ kvers="$$kvers $$(seq 0 99 | sed 's/^/3./')" ;\
|
||||
+ print=0 ;\
|
||||
+ for v in $$kvers ; do \
|
||||
+ if [ "$$print" = "1" ] ; then \
|
||||
+ echo config BACKPORT_KERNEL_$$(echo $$v | tr . _) ;\
|
||||
+ echo " def_bool y" ;\
|
||||
+ fi ;\
|
||||
+ if [ "$$v" = "$$kver" ] ; then print=1 ; fi ;\
|
||||
+ done > $@
|
||||
+ @RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) | \
|
||||
+ sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
|
||||
+ RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) | \
|
||||
+ sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
|
||||
+ for v in $$(seq 0 $$RHEL_MINOR) ; do \
|
||||
+ echo config BACKPORT_RHEL_KERNEL_$${RHEL_MAJOR}_$$v ;\
|
||||
+ echo " def_bool y" ;\
|
||||
+ done >> $@
|
||||
+
|
||||
+.DEFAULT:
|
||||
+ @$(MAKE) Kconfig.versions
|
||||
@$(MAKE) -f Makefile.real "$@"
|
||||
|
||||
else
|
||||
--- a/Makefile.real
|
||||
+++ b/Makefile.real
|
||||
@@ -54,7 +54,7 @@ defconfig-%::
|
||||
|
||||
backport-include/backport/autoconf.h: .config Kconfig.versions Kconfig.kernel
|
||||
@$(MAKE) oldconfig
|
||||
- @echo -n "Building backport-include/backport/autoconf.h ..."
|
||||
+ @printf "Building backport-include/backport/autoconf.h ..."
|
||||
@grep -f .local-symbols .config | ( \
|
||||
echo "#ifndef COMPAT_AUTOCONF_INCLUDED" ;\
|
||||
echo "#define COMPAT_AUTOCONF_INCLUDED" ;\
|
||||
@@ -75,7 +75,12 @@ backport-include/backport/autoconf.h: .c
|
||||
esac ;\
|
||||
done ;\
|
||||
echo "#endif /* COMPAT_AUTOCONF_INCLUDED */" ;\
|
||||
- ) > backport-include/backport/autoconf.h
|
||||
+ ) > $@.new
|
||||
+ @if cmp -s $@ $@.new; then \
|
||||
+ rm -f $@.new; \
|
||||
+ else \
|
||||
+ mv $@.new $@; \
|
||||
+ fi
|
||||
@echo " done."
|
||||
|
||||
.PHONY: modules
|
||||
44
package/kernel/mac80211/patches/002-change_allconfig.patch
Normal file
44
package/kernel/mac80211/patches/002-change_allconfig.patch
Normal file
@@ -0,0 +1,44 @@
|
||||
--- a/kconf/conf.c
|
||||
+++ b/kconf/conf.c
|
||||
@@ -578,40 +578,12 @@ int main(int ac, char **av)
|
||||
case oldconfig:
|
||||
case listnewconfig:
|
||||
case olddefconfig:
|
||||
- conf_read(NULL);
|
||||
- break;
|
||||
case allnoconfig:
|
||||
case allyesconfig:
|
||||
case allmodconfig:
|
||||
case alldefconfig:
|
||||
case randconfig:
|
||||
- name = getenv("KCONFIG_ALLCONFIG");
|
||||
- if (!name)
|
||||
- break;
|
||||
- if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) {
|
||||
- if (conf_read_simple(name, S_DEF_USER)) {
|
||||
- fprintf(stderr,
|
||||
- _("*** Can't read seed configuration \"%s\"!\n"),
|
||||
- name);
|
||||
- exit(1);
|
||||
- }
|
||||
- break;
|
||||
- }
|
||||
- switch (input_mode) {
|
||||
- case allnoconfig: name = "allno.config"; break;
|
||||
- case allyesconfig: name = "allyes.config"; break;
|
||||
- case allmodconfig: name = "allmod.config"; break;
|
||||
- case alldefconfig: name = "alldef.config"; break;
|
||||
- case randconfig: name = "allrandom.config"; break;
|
||||
- default: break;
|
||||
- }
|
||||
- if (conf_read_simple(name, S_DEF_USER) &&
|
||||
- conf_read_simple("all.config", S_DEF_USER)) {
|
||||
- fprintf(stderr,
|
||||
- _("*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n"),
|
||||
- name);
|
||||
- exit(1);
|
||||
- }
|
||||
+ conf_read(NULL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
13
package/kernel/mac80211/patches/010-disable_rfkill.patch
Normal file
13
package/kernel/mac80211/patches/010-disable_rfkill.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
--- a/backport-include/linux/rfkill.h
|
||||
+++ b/backport-include/linux/rfkill.h
|
||||
@@ -2,6 +2,10 @@
|
||||
#define __COMPAT_RFKILL_H
|
||||
#include <linux/version.h>
|
||||
|
||||
+#undef CONFIG_RFKILL
|
||||
+#undef CONFIG_RFKILL_LEDS
|
||||
+#undef CONFIG_RFKILL_MODULE
|
||||
+
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
|
||||
#include_next <linux/rfkill.h>
|
||||
#else
|
||||
@@ -0,0 +1,16 @@
|
||||
--- a/compat/compat-2.6.39.c
|
||||
+++ b/compat/compat-2.6.39.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
+#ifdef CONFIG_COMPAT_BLUETOOTH
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
|
||||
/*
|
||||
* Termios Helper Methods
|
||||
@@ -112,4 +113,4 @@ int tty_set_termios(struct tty_struct *t
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tty_set_termios);
|
||||
#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) */
|
||||
-
|
||||
+#endif
|
||||
36
package/kernel/mac80211/patches/030-rt2x00_options.patch
Normal file
36
package/kernel/mac80211/patches/030-rt2x00_options.patch
Normal file
@@ -0,0 +1,36 @@
|
||||
--- a/drivers/net/wireless/rt2x00/Kconfig
|
||||
+++ b/drivers/net/wireless/rt2x00/Kconfig
|
||||
@@ -202,25 +202,28 @@ config RT2800USB_UNKNOWN
|
||||
endif
|
||||
|
||||
config RT2800_LIB
|
||||
- tristate
|
||||
+ tristate "RT2800 USB/PCI support"
|
||||
depends on m
|
||||
|
||||
config RT2X00_LIB_MMIO
|
||||
- tristate
|
||||
+ tristate "RT2x00 MMIO support"
|
||||
depends on m
|
||||
|
||||
config RT2X00_LIB_PCI
|
||||
- tristate
|
||||
+ tristate "RT2x00 PCI support"
|
||||
+ depends on PCI
|
||||
depends on m
|
||||
select RT2X00_LIB
|
||||
|
||||
config RT2X00_LIB_SOC
|
||||
- tristate
|
||||
+ tristate "RT2x00 SoC support"
|
||||
+ depends on SOC_RT288X || SOC_RT305X
|
||||
depends on m
|
||||
select RT2X00_LIB
|
||||
|
||||
config RT2X00_LIB_USB
|
||||
- tristate
|
||||
+ tristate "RT2x00 USB support"
|
||||
+ depends on USB
|
||||
depends on m
|
||||
select RT2X00_LIB
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
--- a/drivers/net/wireless/brcm80211/Kconfig
|
||||
+++ b/drivers/net/wireless/brcm80211/Kconfig
|
||||
@@ -1,5 +1,5 @@
|
||||
config BRCMUTIL
|
||||
- tristate
|
||||
+ tristate "Broadcom 802.11 driver utility functions"
|
||||
depends on m
|
||||
|
||||
config BRCMSMAC
|
||||
30
package/kernel/mac80211/patches/050-lib80211_option.patch
Normal file
30
package/kernel/mac80211/patches/050-lib80211_option.patch
Normal file
@@ -0,0 +1,30 @@
|
||||
--- a/net/wireless/Kconfig
|
||||
+++ b/net/wireless/Kconfig
|
||||
@@ -123,7 +123,7 @@ config CFG80211_WEXT
|
||||
extensions with cfg80211-based drivers.
|
||||
|
||||
config LIB80211
|
||||
- tristate
|
||||
+ tristate "lib80211"
|
||||
depends on m
|
||||
default n
|
||||
help
|
||||
@@ -133,15 +133,15 @@ config LIB80211
|
||||
Drivers should select this themselves if needed.
|
||||
|
||||
config LIB80211_CRYPT_WEP
|
||||
- tristate
|
||||
+ tristate "lib80211 WEP support"
|
||||
depends on m
|
||||
|
||||
config LIB80211_CRYPT_CCMP
|
||||
- tristate
|
||||
+ tristate "lib80211 CCMP support"
|
||||
depends on m
|
||||
|
||||
config LIB80211_CRYPT_TKIP
|
||||
- tristate
|
||||
+ tristate "lib80211 TKIP support"
|
||||
depends on m
|
||||
|
||||
config LIB80211_DEBUG
|
||||
129
package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch
Normal file
129
package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch
Normal file
@@ -0,0 +1,129 @@
|
||||
--- a/.local-symbols
|
||||
+++ b/.local-symbols
|
||||
@@ -365,42 +365,6 @@ USB_CDC_PHONET=
|
||||
USB_IPHETH=
|
||||
USB_SIERRA_NET=
|
||||
USB_VL600=
|
||||
-SSB_POSSIBLE=
|
||||
-SSB=
|
||||
-SSB_SPROM=
|
||||
-SSB_BLOCKIO=
|
||||
-SSB_PCIHOST_POSSIBLE=
|
||||
-SSB_PCIHOST=
|
||||
-SSB_B43_PCI_BRIDGE=
|
||||
-SSB_PCMCIAHOST_POSSIBLE=
|
||||
-SSB_PCMCIAHOST=
|
||||
-SSB_SDIOHOST_POSSIBLE=
|
||||
-SSB_SDIOHOST=
|
||||
-SSB_SILENT=
|
||||
-SSB_DEBUG=
|
||||
-SSB_SERIAL=
|
||||
-SSB_DRIVER_PCICORE_POSSIBLE=
|
||||
-SSB_DRIVER_PCICORE=
|
||||
-SSB_PCICORE_HOSTMODE=
|
||||
-SSB_DRIVER_MIPS=
|
||||
-SSB_SFLASH=
|
||||
-SSB_EMBEDDED=
|
||||
-SSB_DRIVER_EXTIF=
|
||||
-SSB_DRIVER_GIGE=
|
||||
-SSB_DRIVER_GPIO=
|
||||
-BCMA_POSSIBLE=
|
||||
-BCMA=
|
||||
-BCMA_BLOCKIO=
|
||||
-BCMA_HOST_PCI_POSSIBLE=
|
||||
-BCMA_HOST_PCI=
|
||||
-BCMA_DRIVER_PCI_HOSTMODE=
|
||||
-BCMA_HOST_SOC=
|
||||
-BCMA_DRIVER_MIPS=
|
||||
-BCMA_SFLASH=
|
||||
-BCMA_NFLASH=
|
||||
-BCMA_DRIVER_GMAC_CMN=
|
||||
-BCMA_DRIVER_GPIO=
|
||||
-BCMA_DEBUG=
|
||||
DRM=
|
||||
DRM_USB=
|
||||
DRM_KMS_HELPER=
|
||||
--- a/Kconfig
|
||||
+++ b/Kconfig
|
||||
@@ -31,9 +31,6 @@ source drivers/net/wireless/Kconfig
|
||||
source drivers/net/ethernet/Kconfig
|
||||
source drivers/net/usb/Kconfig
|
||||
|
||||
-source drivers/ssb/Kconfig
|
||||
-source drivers/bcma/Kconfig
|
||||
-
|
||||
source drivers/gpu/drm/Kconfig
|
||||
|
||||
source net/nfc/Kconfig
|
||||
--- a/Makefile.kernel
|
||||
+++ b/Makefile.kernel
|
||||
@@ -26,8 +26,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/
|
||||
obj-$(CPTCFG_WLAN) += drivers/net/wireless/
|
||||
obj-$(CPTCFG_BT) += net/bluetooth/
|
||||
obj-$(CPTCFG_BT) += drivers/bluetooth/
|
||||
-obj-$(CPTCFG_SSB) += drivers/ssb/
|
||||
-obj-$(CPTCFG_BCMA) += drivers/bcma/
|
||||
obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/
|
||||
obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/
|
||||
obj-$(CPTCFG_DRM) += drivers/gpu/drm/
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -2727,7 +2727,7 @@ static struct ssb_device *b43_ssb_gpio_d
|
||||
{
|
||||
struct ssb_bus *bus = dev->dev->sdev->bus;
|
||||
|
||||
-#ifdef CPTCFG_SSB_DRIVER_PCICORE
|
||||
+#ifdef CONFIG_SSB_DRIVER_PCICORE
|
||||
return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
|
||||
#else
|
||||
return bus->chipco.dev;
|
||||
@@ -4733,7 +4733,7 @@ static int b43_wireless_core_init(struct
|
||||
}
|
||||
if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
|
||||
hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
|
||||
-#ifdef CPTCFG_SSB_DRIVER_PCICORE
|
||||
+#ifdef CONFIG_SSB_DRIVER_PCICORE
|
||||
if (dev->dev->bus_type == B43_BUS_SSB &&
|
||||
dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
|
||||
dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
|
||||
--- a/drivers/net/wireless/b43legacy/main.c
|
||||
+++ b/drivers/net/wireless/b43legacy/main.c
|
||||
@@ -1937,7 +1937,7 @@ static int b43legacy_gpio_init(struct b4
|
||||
if (dev->dev->id.revision >= 2)
|
||||
mask |= 0x0010; /* FIXME: This is redundant. */
|
||||
|
||||
-#ifdef CPTCFG_SSB_DRIVER_PCICORE
|
||||
+#ifdef CONFIG_SSB_DRIVER_PCICORE
|
||||
pcidev = bus->pcicore.dev;
|
||||
#endif
|
||||
gpiodev = bus->chipco.dev ? : pcidev;
|
||||
@@ -1956,7 +1956,7 @@ static void b43legacy_gpio_cleanup(struc
|
||||
struct ssb_bus *bus = dev->dev->bus;
|
||||
struct ssb_device *gpiodev, *pcidev = NULL;
|
||||
|
||||
-#ifdef CPTCFG_SSB_DRIVER_PCICORE
|
||||
+#ifdef CONFIG_SSB_DRIVER_PCICORE
|
||||
pcidev = bus->pcicore.dev;
|
||||
#endif
|
||||
gpiodev = bus->chipco.dev ? : pcidev;
|
||||
--- a/drivers/net/wireless/brcm80211/brcmsmac/Makefile
|
||||
+++ b/drivers/net/wireless/brcm80211/brcmsmac/Makefile
|
||||
@@ -43,6 +43,6 @@ brcmsmac-y := \
|
||||
brcms_trace_events.o \
|
||||
debug.o
|
||||
|
||||
-brcmsmac-$(CPTCFG_BCMA_DRIVER_GPIO) += led.o
|
||||
+brcmsmac-$(CONFIG_BCMA_DRIVER_GPIO) += led.o
|
||||
|
||||
obj-$(CPTCFG_BRCMSMAC) += brcmsmac.o
|
||||
--- a/drivers/net/wireless/brcm80211/brcmsmac/led.h
|
||||
+++ b/drivers/net/wireless/brcm80211/brcmsmac/led.h
|
||||
@@ -22,7 +22,7 @@ struct brcms_led {
|
||||
bool active_low;
|
||||
};
|
||||
|
||||
-#ifdef CPTCFG_BCMA_DRIVER_GPIO
|
||||
+#ifdef CONFIG_BCMA_DRIVER_GPIO
|
||||
void brcms_led_unregister(struct brcms_info *wl);
|
||||
int brcms_led_register(struct brcms_info *wl);
|
||||
#else
|
||||
@@ -0,0 +1,67 @@
|
||||
--- a/net/mac80211/main.c
|
||||
+++ b/net/mac80211/main.c
|
||||
@@ -300,7 +300,7 @@ void ieee80211_restart_hw(struct ieee802
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_restart_hw);
|
||||
|
||||
-#ifdef CONFIG_INET
|
||||
+#ifdef __disabled__CONFIG_INET
|
||||
static int ieee80211_ifa_changed(struct notifier_block *nb,
|
||||
unsigned long data, void *arg)
|
||||
{
|
||||
@@ -359,7 +359,7 @@ static int ieee80211_ifa_changed(struct
|
||||
}
|
||||
#endif
|
||||
|
||||
-#if IS_ENABLED(CONFIG_IPV6)
|
||||
+#if IS_ENABLED(__disabled__CONFIG_IPV6)
|
||||
static int ieee80211_ifa6_changed(struct notifier_block *nb,
|
||||
unsigned long data, void *arg)
|
||||
{
|
||||
@@ -990,14 +990,14 @@ int ieee80211_register_hw(struct ieee802
|
||||
goto fail_pm_qos;
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_INET
|
||||
+#ifdef __disabled__CONFIG_INET
|
||||
local->ifa_notifier.notifier_call = ieee80211_ifa_changed;
|
||||
result = register_inetaddr_notifier(&local->ifa_notifier);
|
||||
if (result)
|
||||
goto fail_ifa;
|
||||
#endif
|
||||
|
||||
-#if IS_ENABLED(CONFIG_IPV6)
|
||||
+#if IS_ENABLED(__disabled__CONFIG_IPV6)
|
||||
local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
|
||||
result = register_inet6addr_notifier(&local->ifa6_notifier);
|
||||
if (result)
|
||||
@@ -1006,13 +1006,13 @@ int ieee80211_register_hw(struct ieee802
|
||||
|
||||
return 0;
|
||||
|
||||
-#if IS_ENABLED(CONFIG_IPV6)
|
||||
+#if IS_ENABLED(__disabled__CONFIG_IPV6)
|
||||
fail_ifa6:
|
||||
-#ifdef CONFIG_INET
|
||||
+#ifdef __disabled__CONFIG_INET
|
||||
unregister_inetaddr_notifier(&local->ifa_notifier);
|
||||
#endif
|
||||
#endif
|
||||
-#if defined(CONFIG_INET) || defined(CONFIG_IPV6)
|
||||
+#if defined(__disabled__CONFIG_INET) || defined(__disabled__CONFIG_IPV6)
|
||||
fail_ifa:
|
||||
pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
|
||||
&local->network_latency_notifier);
|
||||
@@ -1045,10 +1045,10 @@ void ieee80211_unregister_hw(struct ieee
|
||||
|
||||
pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
|
||||
&local->network_latency_notifier);
|
||||
-#ifdef CONFIG_INET
|
||||
+#ifdef __disabled__CONFIG_INET
|
||||
unregister_inetaddr_notifier(&local->ifa_notifier);
|
||||
#endif
|
||||
-#if IS_ENABLED(CONFIG_IPV6)
|
||||
+#if IS_ENABLED(__disabled__CONFIG_IPV6)
|
||||
unregister_inet6addr_notifier(&local->ifa6_notifier);
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/initvals.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/initvals.c
|
||||
@@ -62,8 +62,14 @@ static const struct ath5k_ini ar5210_ini
|
||||
{ AR5K_IMR, 0 },
|
||||
{ AR5K_IER, AR5K_IER_DISABLE },
|
||||
{ AR5K_BSR, 0, AR5K_INI_READ },
|
||||
+#if !defined(CONFIG_ATHEROS_AR71XX) && !defined(CONFIG_ATH79)
|
||||
{ AR5K_TXCFG, AR5K_DMASIZE_128B },
|
||||
{ AR5K_RXCFG, AR5K_DMASIZE_128B },
|
||||
+#else
|
||||
+ /* WAR for AR71xx PCI bug */
|
||||
+ { AR5K_TXCFG, AR5K_DMASIZE_128B },
|
||||
+ { AR5K_RXCFG, AR5K_DMASIZE_4B },
|
||||
+#endif
|
||||
{ AR5K_CFG, AR5K_INIT_CFG },
|
||||
{ AR5K_TOPS, 8 },
|
||||
{ AR5K_RXNOFRM, 8 },
|
||||
--- a/drivers/net/wireless/ath/ath5k/dma.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/dma.c
|
||||
@@ -860,10 +860,18 @@ ath5k_hw_dma_init(struct ath5k_hw *ah)
|
||||
* guess we can tweak it and see how it goes ;-)
|
||||
*/
|
||||
if (ah->ah_version != AR5K_AR5210) {
|
||||
+#if !defined(CONFIG_ATHEROS_AR71XX) && !defined(CONFIG_ATH79)
|
||||
AR5K_REG_WRITE_BITS(ah, AR5K_TXCFG,
|
||||
AR5K_TXCFG_SDMAMR, AR5K_DMASIZE_128B);
|
||||
AR5K_REG_WRITE_BITS(ah, AR5K_RXCFG,
|
||||
AR5K_RXCFG_SDMAMW, AR5K_DMASIZE_128B);
|
||||
+#else
|
||||
+ /* WAR for AR71xx PCI bug */
|
||||
+ AR5K_REG_WRITE_BITS(ah, AR5K_TXCFG,
|
||||
+ AR5K_TXCFG_SDMAMR, AR5K_DMASIZE_128B);
|
||||
+ AR5K_REG_WRITE_BITS(ah, AR5K_RXCFG,
|
||||
+ AR5K_RXCFG_SDMAMW, AR5K_DMASIZE_4B);
|
||||
+#endif
|
||||
}
|
||||
|
||||
/* Pre-enable interrupts on 5211/5212*/
|
||||
313
package/kernel/mac80211/patches/300-pending_work.patch
Normal file
313
package/kernel/mac80211/patches/300-pending_work.patch
Normal file
@@ -0,0 +1,313 @@
|
||||
--- a/net/mac80211/agg-rx.c
|
||||
+++ b/net/mac80211/agg-rx.c
|
||||
@@ -204,6 +204,8 @@ static void ieee80211_send_addba_resp(st
|
||||
memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
|
||||
else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
|
||||
memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
|
||||
+ else if (sdata->vif.type == NL80211_IFTYPE_WDS)
|
||||
+ memcpy(mgmt->bssid, da, ETH_ALEN);
|
||||
|
||||
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
||||
IEEE80211_STYPE_ACTION);
|
||||
--- a/net/mac80211/agg-tx.c
|
||||
+++ b/net/mac80211/agg-tx.c
|
||||
@@ -81,7 +81,8 @@ static void ieee80211_send_addba_request
|
||||
memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
|
||||
- sdata->vif.type == NL80211_IFTYPE_MESH_POINT)
|
||||
+ sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
|
||||
+ sdata->vif.type == NL80211_IFTYPE_WDS)
|
||||
memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
|
||||
else if (sdata->vif.type == NL80211_IFTYPE_STATION)
|
||||
memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
|
||||
@@ -527,6 +528,7 @@ int ieee80211_start_tx_ba_session(struct
|
||||
sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
|
||||
sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
|
||||
sdata->vif.type != NL80211_IFTYPE_AP &&
|
||||
+ sdata->vif.type != NL80211_IFTYPE_WDS &&
|
||||
sdata->vif.type != NL80211_IFTYPE_ADHOC)
|
||||
return -EINVAL;
|
||||
|
||||
--- a/net/mac80211/debugfs_sta.c
|
||||
+++ b/net/mac80211/debugfs_sta.c
|
||||
@@ -66,11 +66,11 @@ static ssize_t sta_flags_read(struct fil
|
||||
test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : ""
|
||||
|
||||
int res = scnprintf(buf, sizeof(buf),
|
||||
- "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
+ "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
TEST(AUTH), TEST(ASSOC), TEST(PS_STA),
|
||||
TEST(PS_DRIVER), TEST(AUTHORIZED),
|
||||
TEST(SHORT_PREAMBLE),
|
||||
- TEST(WME), TEST(WDS), TEST(CLEAR_PS_FILT),
|
||||
+ TEST(WME), TEST(CLEAR_PS_FILT),
|
||||
TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL),
|
||||
TEST(UAPSD), TEST(SP), TEST(TDLS_PEER),
|
||||
TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT),
|
||||
--- a/net/mac80211/ht.c
|
||||
+++ b/net/mac80211/ht.c
|
||||
@@ -281,13 +281,14 @@ void ieee80211_ba_session_work(struct wo
|
||||
sta, tid, WLAN_BACK_RECIPIENT,
|
||||
WLAN_REASON_UNSPECIFIED, true);
|
||||
|
||||
+ spin_lock_bh(&sta->lock);
|
||||
+
|
||||
tid_tx = sta->ampdu_mlme.tid_start_tx[tid];
|
||||
if (tid_tx) {
|
||||
/*
|
||||
* Assign it over to the normal tid_tx array
|
||||
* where it "goes live".
|
||||
*/
|
||||
- spin_lock_bh(&sta->lock);
|
||||
|
||||
sta->ampdu_mlme.tid_start_tx[tid] = NULL;
|
||||
/* could there be a race? */
|
||||
@@ -300,6 +301,7 @@ void ieee80211_ba_session_work(struct wo
|
||||
ieee80211_tx_ba_session_handle_start(sta, tid);
|
||||
continue;
|
||||
}
|
||||
+ spin_unlock_bh(&sta->lock);
|
||||
|
||||
tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
|
||||
if (tid_tx && test_and_clear_bit(HT_AGG_STATE_WANT_STOP,
|
||||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -463,7 +463,6 @@ int ieee80211_do_open(struct wireless_de
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
- struct sta_info *sta;
|
||||
u32 changed = 0;
|
||||
int res;
|
||||
u32 hw_reconf_flags = 0;
|
||||
@@ -629,30 +628,8 @@ int ieee80211_do_open(struct wireless_de
|
||||
|
||||
set_bit(SDATA_STATE_RUNNING, &sdata->state);
|
||||
|
||||
- if (sdata->vif.type == NL80211_IFTYPE_WDS) {
|
||||
- /* Create STA entry for the WDS peer */
|
||||
- sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
|
||||
- GFP_KERNEL);
|
||||
- if (!sta) {
|
||||
- res = -ENOMEM;
|
||||
- goto err_del_interface;
|
||||
- }
|
||||
-
|
||||
- sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
|
||||
- sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
|
||||
- sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
|
||||
-
|
||||
- res = sta_info_insert(sta);
|
||||
- if (res) {
|
||||
- /* STA has been freed */
|
||||
- goto err_del_interface;
|
||||
- }
|
||||
-
|
||||
- rate_control_rate_init(sta);
|
||||
- netif_carrier_on(dev);
|
||||
- } else if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) {
|
||||
+ if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE)
|
||||
rcu_assign_pointer(local->p2p_sdata, sdata);
|
||||
- }
|
||||
|
||||
/*
|
||||
* set_multicast_list will be invoked by the networking core
|
||||
@@ -1116,6 +1093,74 @@ static void ieee80211_if_setup(struct ne
|
||||
dev->destructor = free_netdev;
|
||||
}
|
||||
|
||||
+static void ieee80211_wds_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
||||
+ struct sk_buff *skb)
|
||||
+{
|
||||
+ struct ieee80211_local *local = sdata->local;
|
||||
+ struct ieee80211_rx_status *rx_status;
|
||||
+ struct ieee802_11_elems elems;
|
||||
+ struct ieee80211_mgmt *mgmt;
|
||||
+ struct sta_info *sta;
|
||||
+ size_t baselen;
|
||||
+ u32 rates = 0;
|
||||
+ u16 stype;
|
||||
+ bool new = false;
|
||||
+ enum ieee80211_band band;
|
||||
+ struct ieee80211_supported_band *sband;
|
||||
+
|
||||
+ rx_status = IEEE80211_SKB_RXCB(skb);
|
||||
+ band = rx_status->band;
|
||||
+ sband = local->hw.wiphy->bands[band];
|
||||
+ mgmt = (struct ieee80211_mgmt *) skb->data;
|
||||
+ stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
|
||||
+
|
||||
+ if (stype != IEEE80211_STYPE_BEACON)
|
||||
+ return;
|
||||
+
|
||||
+ baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
|
||||
+ if (baselen > skb->len)
|
||||
+ return;
|
||||
+
|
||||
+ ieee802_11_parse_elems(mgmt->u.probe_resp.variable,
|
||||
+ skb->len - baselen, false, &elems);
|
||||
+
|
||||
+ rates = ieee80211_sta_get_rates(local, &elems, band, NULL);
|
||||
+
|
||||
+ rcu_read_lock();
|
||||
+
|
||||
+ sta = sta_info_get(sdata, sdata->u.wds.remote_addr);
|
||||
+
|
||||
+ if (!sta) {
|
||||
+ rcu_read_unlock();
|
||||
+ sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
|
||||
+ GFP_KERNEL);
|
||||
+ if (!sta)
|
||||
+ return;
|
||||
+
|
||||
+ new = true;
|
||||
+ }
|
||||
+
|
||||
+ sta->last_rx = jiffies;
|
||||
+ sta->sta.supp_rates[band] = rates;
|
||||
+
|
||||
+ if (elems.ht_cap_elem)
|
||||
+ ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
|
||||
+ elems.ht_cap_elem, sta);
|
||||
+
|
||||
+ if (elems.wmm_param)
|
||||
+ set_sta_flag(sta, WLAN_STA_WME);
|
||||
+
|
||||
+ if (new) {
|
||||
+ sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
|
||||
+ sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
|
||||
+ sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
|
||||
+ rate_control_rate_init(sta);
|
||||
+ sta_info_insert_rcu(sta);
|
||||
+ }
|
||||
+
|
||||
+ rcu_read_unlock();
|
||||
+}
|
||||
+
|
||||
static void ieee80211_iface_work(struct work_struct *work)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata =
|
||||
@@ -1220,6 +1265,9 @@ static void ieee80211_iface_work(struct
|
||||
break;
|
||||
ieee80211_mesh_rx_queued_mgmt(sdata, skb);
|
||||
break;
|
||||
+ case NL80211_IFTYPE_WDS:
|
||||
+ ieee80211_wds_rx_queued_mgmt(sdata, skb);
|
||||
+ break;
|
||||
default:
|
||||
WARN(1, "frame for unexpected interface type");
|
||||
break;
|
||||
--- a/net/mac80211/rx.c
|
||||
+++ b/net/mac80211/rx.c
|
||||
@@ -2369,6 +2369,7 @@ ieee80211_rx_h_action(struct ieee80211_r
|
||||
sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
|
||||
sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
|
||||
sdata->vif.type != NL80211_IFTYPE_AP &&
|
||||
+ sdata->vif.type != NL80211_IFTYPE_WDS &&
|
||||
sdata->vif.type != NL80211_IFTYPE_ADHOC)
|
||||
break;
|
||||
|
||||
@@ -2720,14 +2721,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
|
||||
|
||||
if (!ieee80211_vif_is_mesh(&sdata->vif) &&
|
||||
sdata->vif.type != NL80211_IFTYPE_ADHOC &&
|
||||
- sdata->vif.type != NL80211_IFTYPE_STATION)
|
||||
+ sdata->vif.type != NL80211_IFTYPE_STATION &&
|
||||
+ sdata->vif.type != NL80211_IFTYPE_WDS)
|
||||
return RX_DROP_MONITOR;
|
||||
|
||||
switch (stype) {
|
||||
case cpu_to_le16(IEEE80211_STYPE_AUTH):
|
||||
case cpu_to_le16(IEEE80211_STYPE_BEACON):
|
||||
case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP):
|
||||
- /* process for all: mesh, mlme, ibss */
|
||||
+ /* process for all: mesh, mlme, ibss, wds */
|
||||
break;
|
||||
case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
|
||||
case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
|
||||
@@ -3059,10 +3061,16 @@ static int prepare_for_handlers(struct i
|
||||
}
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
- if (bssid || !ieee80211_is_data(hdr->frame_control))
|
||||
- return 0;
|
||||
if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2))
|
||||
return 0;
|
||||
+
|
||||
+ if (ieee80211_is_data(hdr->frame_control) ||
|
||||
+ ieee80211_is_action(hdr->frame_control)) {
|
||||
+ if (compare_ether_addr(sdata->vif.addr, hdr->addr1))
|
||||
+ return 0;
|
||||
+ } else if (!ieee80211_is_beacon(hdr->frame_control))
|
||||
+ return 0;
|
||||
+
|
||||
break;
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
if (!ieee80211_is_public_action(hdr, skb->len) &&
|
||||
--- a/net/mac80211/sta_info.c
|
||||
+++ b/net/mac80211/sta_info.c
|
||||
@@ -149,6 +149,7 @@ static void cleanup_single_sta(struct st
|
||||
* directly by station destruction.
|
||||
*/
|
||||
for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
|
||||
+ kfree(sta->ampdu_mlme.tid_start_tx[i]);
|
||||
tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]);
|
||||
if (!tid_tx)
|
||||
continue;
|
||||
--- a/net/mac80211/sta_info.h
|
||||
+++ b/net/mac80211/sta_info.h
|
||||
@@ -32,7 +32,6 @@
|
||||
* @WLAN_STA_SHORT_PREAMBLE: Station is capable of receiving short-preamble
|
||||
* frames.
|
||||
* @WLAN_STA_WME: Station is a QoS-STA.
|
||||
- * @WLAN_STA_WDS: Station is one of our WDS peers.
|
||||
* @WLAN_STA_CLEAR_PS_FILT: Clear PS filter in hardware (using the
|
||||
* IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next
|
||||
* frame to this station is transmitted.
|
||||
@@ -66,7 +65,6 @@ enum ieee80211_sta_info_flags {
|
||||
WLAN_STA_AUTHORIZED,
|
||||
WLAN_STA_SHORT_PREAMBLE,
|
||||
WLAN_STA_WME,
|
||||
- WLAN_STA_WDS,
|
||||
WLAN_STA_CLEAR_PS_FILT,
|
||||
WLAN_STA_MFP,
|
||||
WLAN_STA_BLOCK_BA,
|
||||
@@ -203,6 +201,7 @@ struct tid_ampdu_rx {
|
||||
* driver requested to close until the work for it runs
|
||||
* @mtx: mutex to protect all TX data (except non-NULL assignments
|
||||
* to tid_tx[idx], which are protected by the sta spinlock)
|
||||
+ * tid_start_tx is also protected by sta->lock.
|
||||
*/
|
||||
struct sta_ampdu_mlme {
|
||||
struct mutex mtx;
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -1778,9 +1778,13 @@ static void ath_tx_txqaddbuf(struct ath_
|
||||
}
|
||||
|
||||
if (!internal) {
|
||||
- txq->axq_depth++;
|
||||
- if (bf_is_ampdu_not_probing(bf))
|
||||
- txq->axq_ampdu_depth++;
|
||||
+ while (bf) {
|
||||
+ txq->axq_depth++;
|
||||
+ if (bf_is_ampdu_not_probing(bf))
|
||||
+ txq->axq_ampdu_depth++;
|
||||
+
|
||||
+ bf = bf->bf_lastbf->bf_next;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
||||
@@ -1183,7 +1183,7 @@ static int ath9k_htc_config(struct ieee8
|
||||
mutex_lock(&priv->htc_pm_lock);
|
||||
|
||||
priv->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE);
|
||||
- if (priv->ps_idle)
|
||||
+ if (!priv->ps_idle)
|
||||
chip_reset = true;
|
||||
|
||||
mutex_unlock(&priv->htc_pm_lock);
|
||||
11
package/kernel/mac80211/patches/310-ap_scan.patch
Normal file
11
package/kernel/mac80211/patches/310-ap_scan.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2092,7 +2092,7 @@ static int ieee80211_scan(struct wiphy *
|
||||
* the frames sent while scanning on other channel will be
|
||||
* lost)
|
||||
*/
|
||||
- if (sdata->u.ap.beacon &&
|
||||
+ if (0 && sdata->u.ap.beacon &&
|
||||
(!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
|
||||
!(req->flags & NL80211_SCAN_FLAG_AP)))
|
||||
return -EOPNOTSUPP;
|
||||
@@ -0,0 +1,28 @@
|
||||
--- a/drivers/net/wireless/ath/Makefile
|
||||
+++ b/drivers/net/wireless/ath/Makefile
|
||||
@@ -11,7 +11,7 @@ obj-$(CPTCFG_ATH_COMMON) += ath.o
|
||||
ath-objs := main.o \
|
||||
regd.o \
|
||||
hw.o \
|
||||
- key.o
|
||||
+ key.o \
|
||||
+ debug.o
|
||||
|
||||
-ath-$(CPTCFG_ATH_DEBUG) += debug.o
|
||||
ccflags-y += -D__CHECK_ENDIAN__
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -281,13 +281,6 @@ void _ath_dbg(struct ath_common *common,
|
||||
#endif /* CPTCFG_ATH_DEBUG */
|
||||
|
||||
/** Returns string describing opmode, or NULL if unknown mode. */
|
||||
-#ifdef CPTCFG_ATH_DEBUG
|
||||
const char *ath_opmode_to_string(enum nl80211_iftype opmode);
|
||||
-#else
|
||||
-static inline const char *ath_opmode_to_string(enum nl80211_iftype opmode)
|
||||
-{
|
||||
- return "UNKNOWN";
|
||||
-}
|
||||
-#endif
|
||||
|
||||
#endif /* ATH_H */
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -45,7 +45,7 @@ int ath9k_modparam_nohwcrypt;
|
||||
module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
|
||||
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
|
||||
|
||||
-int led_blink;
|
||||
+int led_blink = 1;
|
||||
module_param_named(blink, led_blink, int, 0444);
|
||||
MODULE_PARM_DESC(blink, "Enable LED blink on activity");
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/etherdevice.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include "hw.h"
|
||||
@@ -518,8 +519,16 @@ static int ath9k_hw_init_macaddr(struct
|
||||
common->macaddr[2 * i] = eeval >> 8;
|
||||
common->macaddr[2 * i + 1] = eeval & 0xff;
|
||||
}
|
||||
- if (sum == 0 || sum == 0xffff * 3)
|
||||
- return -EADDRNOTAVAIL;
|
||||
+ if (!is_valid_ether_addr(common->macaddr)) {
|
||||
+ ath_err(common,
|
||||
+ "eeprom contains invalid mac address: %pM\n",
|
||||
+ common->macaddr);
|
||||
+
|
||||
+ random_ether_addr(common->macaddr);
|
||||
+ ath_err(common,
|
||||
+ "random mac address will be used: %pM\n",
|
||||
+ common->macaddr);
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
58
package/kernel/mac80211/patches/403-ath_regd_optional.patch
Normal file
58
package/kernel/mac80211/patches/403-ath_regd_optional.patch
Normal file
@@ -0,0 +1,58 @@
|
||||
--- a/drivers/net/wireless/ath/regd.c
|
||||
+++ b/drivers/net/wireless/ath/regd.c
|
||||
@@ -196,6 +196,10 @@ ath_reg_apply_beaconing_flags(struct wip
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i;
|
||||
|
||||
+#ifdef CPTCFG_ATH_USER_REGD
|
||||
+ return;
|
||||
+#endif
|
||||
+
|
||||
for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
||||
|
||||
if (!wiphy->bands[band])
|
||||
@@ -250,6 +254,10 @@ ath_reg_apply_active_scan_flags(struct w
|
||||
struct ieee80211_channel *ch;
|
||||
const struct ieee80211_reg_rule *reg_rule;
|
||||
|
||||
+#ifdef CPTCFG_ATH_USER_REGD
|
||||
+ return;
|
||||
+#endif
|
||||
+
|
||||
sband = wiphy->bands[IEEE80211_BAND_2GHZ];
|
||||
if (!sband)
|
||||
return;
|
||||
@@ -299,6 +307,10 @@ static void ath_reg_apply_radar_flags(st
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i;
|
||||
|
||||
+#ifdef CPTCFG_ATH_USER_REGD
|
||||
+ return;
|
||||
+#endif
|
||||
+
|
||||
if (!wiphy->bands[IEEE80211_BAND_5GHZ])
|
||||
return;
|
||||
|
||||
@@ -503,6 +515,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
{
|
||||
const struct ieee80211_regdomain *regd;
|
||||
|
||||
+#ifdef CPTCFG_ATH_USER_REGD
|
||||
+ return 0;
|
||||
+#endif
|
||||
+
|
||||
wiphy->reg_notifier = reg_notifier;
|
||||
wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY;
|
||||
|
||||
--- a/drivers/net/wireless/ath/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/Kconfig
|
||||
@@ -21,6 +21,9 @@ menuconfig ATH_CARDS
|
||||
|
||||
if ATH_CARDS
|
||||
|
||||
+config ATH_USER_REGD
|
||||
+ bool "Do not enforce EEPROM regulatory restrictions"
|
||||
+
|
||||
config ATH_DEBUG
|
||||
bool "Atheros wireless debugging"
|
||||
---help---
|
||||
84
package/kernel/mac80211/patches/404-world_regd_fixup.patch
Normal file
84
package/kernel/mac80211/patches/404-world_regd_fixup.patch
Normal file
@@ -0,0 +1,84 @@
|
||||
--- a/drivers/net/wireless/ath/regd.c
|
||||
+++ b/drivers/net/wireless/ath/regd.c
|
||||
@@ -42,7 +42,8 @@ static int __ath_regd_init(struct ath_re
|
||||
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
|
||||
|
||||
/* We allow IBSS on these on a case by case basis by regulatory domain */
|
||||
-#define ATH9K_5GHZ_5150_5350 REG_RULE(5150-10, 5350+10, 80, 0, 30,\
|
||||
+#define ATH9K_5GHZ_5150_5350 REG_RULE(5150-10, 5250, 80, 0, 30, 0), \
|
||||
+ REG_RULE(5250, 5350+10, 80, 0, 30,\
|
||||
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
|
||||
#define ATH9K_5GHZ_5470_5850 REG_RULE(5470-10, 5850+10, 80, 0, 30,\
|
||||
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
|
||||
@@ -60,57 +61,56 @@ static int __ath_regd_init(struct ath_re
|
||||
#define ATH9K_5GHZ_NO_MIDBAND ATH9K_5GHZ_5150_5350, \
|
||||
ATH9K_5GHZ_5725_5850
|
||||
|
||||
+#define REGD_RULES(...) \
|
||||
+ .reg_rules = { __VA_ARGS__ }, \
|
||||
+ .n_reg_rules = ARRAY_SIZE(((struct ieee80211_reg_rule[]) { __VA_ARGS__ }))
|
||||
+
|
||||
/* Can be used for:
|
||||
* 0x60, 0x61, 0x62 */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_60_61_62 = {
|
||||
- .n_reg_rules = 5,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH9K_2GHZ_ALL,
|
||||
ATH9K_5GHZ_ALL,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
/* Can be used by 0x63 and 0x65 */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_63_65 = {
|
||||
- .n_reg_rules = 4,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH9K_2GHZ_CH01_11,
|
||||
ATH9K_2GHZ_CH12_13,
|
||||
ATH9K_5GHZ_NO_MIDBAND,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
/* Can be used by 0x64 only */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_64 = {
|
||||
- .n_reg_rules = 3,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH9K_2GHZ_CH01_11,
|
||||
ATH9K_5GHZ_NO_MIDBAND,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
/* Can be used by 0x66 and 0x69 */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_66_69 = {
|
||||
- .n_reg_rules = 3,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH9K_2GHZ_CH01_11,
|
||||
ATH9K_5GHZ_ALL,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
/* Can be used by 0x67, 0x68, 0x6A and 0x6C */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_67_68_6A_6C = {
|
||||
- .n_reg_rules = 4,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH9K_2GHZ_CH01_11,
|
||||
ATH9K_2GHZ_CH12_13,
|
||||
ATH9K_5GHZ_ALL,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
static inline bool is_wwr_sku(u16 regd)
|
||||
@@ -0,0 +1,19 @@
|
||||
--- a/net/wireless/reg.c
|
||||
+++ b/net/wireless/reg.c
|
||||
@@ -1696,6 +1696,8 @@ void regulatory_hint_11d(struct wiphy *w
|
||||
enum environment_cap env = ENVIRON_ANY;
|
||||
struct regulatory_request *request = NULL, *lr;
|
||||
|
||||
+ return;
|
||||
+
|
||||
/* IE len must be evenly divisible by 2 */
|
||||
if (country_ie_len & 0x01)
|
||||
return;
|
||||
@@ -1890,6 +1892,7 @@ static void restore_regulatory_settings(
|
||||
|
||||
void regulatory_hint_disconnect(void)
|
||||
{
|
||||
+ return;
|
||||
REG_DBG_PRINT("All devices are disconnected, going to restore regulatory settings\n");
|
||||
restore_regulatory_settings(false);
|
||||
}
|
||||
26
package/kernel/mac80211/patches/406-ath_regd_us.patch
Normal file
26
package/kernel/mac80211/patches/406-ath_regd_us.patch
Normal file
@@ -0,0 +1,26 @@
|
||||
--- a/drivers/net/wireless/ath/regd_common.h
|
||||
+++ b/drivers/net/wireless/ath/regd_common.h
|
||||
@@ -32,6 +32,7 @@ enum EnumRd {
|
||||
FCC2_WORLD = 0x21,
|
||||
FCC2_ETSIC = 0x22,
|
||||
FCC6_WORLD = 0x23,
|
||||
+ FCC3_FCCA_2 = 0x2A,
|
||||
FRANCE_RES = 0x31,
|
||||
FCC3_FCCA = 0x3A,
|
||||
FCC3_WORLD = 0x3B,
|
||||
@@ -167,6 +168,7 @@ static struct reg_dmn_pair_mapping regDo
|
||||
{FCC2_WORLD, CTL_FCC, CTL_ETSI},
|
||||
{FCC2_ETSIC, CTL_FCC, CTL_ETSI},
|
||||
{FCC3_FCCA, CTL_FCC, CTL_FCC},
|
||||
+ {FCC3_FCCA_2, CTL_FCC, CTL_FCC},
|
||||
{FCC3_WORLD, CTL_FCC, CTL_ETSI},
|
||||
{FCC4_FCCA, CTL_FCC, CTL_FCC},
|
||||
{FCC5_FCCA, CTL_FCC, CTL_FCC},
|
||||
@@ -463,6 +465,7 @@ static struct country_code_to_enum_rd al
|
||||
{CTRY_UAE, NULL1_WORLD, "AE"},
|
||||
{CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB"},
|
||||
{CTRY_UNITED_STATES, FCC3_FCCA, "US"},
|
||||
+ {CTRY_UNITED_STATES, FCC3_FCCA_2, "US"},
|
||||
/* This "PS" is for US public safety actually... to support this we
|
||||
* would need to assign new special alpha2 to CRDA db as with the world
|
||||
* regdomain and use another alpha2 */
|
||||
@@ -0,0 +1,10 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -729,6 +729,7 @@ static const struct ieee80211_iface_limi
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
+ { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
|
||||
@@ -86,13 +86,8 @@ ath5k_add_interface(struct ieee80211_hw
|
||||
goto end;
|
||||
}
|
||||
|
||||
- /* Don't allow other interfaces if one ad-hoc is configured.
|
||||
- * TODO: Fix the problems with ad-hoc and multiple other interfaces.
|
||||
- * We would need to operate the HW in ad-hoc mode to allow TSF updates
|
||||
- * for the IBSS, but this breaks with additional AP or STA interfaces
|
||||
- * at the moment. */
|
||||
- if (ah->num_adhoc_vifs ||
|
||||
- (ah->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) {
|
||||
+ /* Don't allow more than one ad-hoc interface */
|
||||
+ if (ah->num_adhoc_vifs && vif->type == NL80211_IFTYPE_ADHOC) {
|
||||
ATH5K_ERR(ah, "Only one single ad-hoc interface is allowed.\n");
|
||||
ret = -ELNRNG;
|
||||
goto end;
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -1916,7 +1916,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
}
|
||||
|
||||
if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
|
||||
- ah->num_mesh_vifs > 1) ||
|
||||
+ ah->num_adhoc_vifs + ah->num_mesh_vifs > 1) ||
|
||||
ah->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
u64 tsf = ath5k_hw_get_tsf64(ah);
|
||||
u32 tsftu = TSF_TO_TU(tsf);
|
||||
@@ -2002,7 +2002,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
|
||||
intval = ah->bintval & AR5K_BEACON_PERIOD;
|
||||
if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
|
||||
- + ah->num_mesh_vifs > 1) {
|
||||
+ + ah->num_adhoc_vifs + ah->num_mesh_vifs > 1) {
|
||||
intval /= ATH_BCBUF; /* staggered multi-bss beacons */
|
||||
if (intval < 15)
|
||||
ATH5K_WARN(ah, "intval %u is too low, min 15\n",
|
||||
@@ -2469,6 +2469,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
+ { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
|
||||
};
|
||||
|
||||
static const struct ieee80211_iface_combination if_comb = {
|
||||
@@ -0,0 +1,18 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/reset.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/reset.c
|
||||
@@ -1154,6 +1154,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
|
||||
tsf_lo = 0;
|
||||
mode = 0;
|
||||
|
||||
+#if 0
|
||||
/*
|
||||
* Sanity check for fast flag
|
||||
* Fast channel change only available
|
||||
@@ -1161,6 +1162,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
|
||||
*/
|
||||
if (fast && (ah->ah_radio != AR5K_RF2413) &&
|
||||
(ah->ah_radio != AR5K_RF5413))
|
||||
+#endif
|
||||
fast = false;
|
||||
|
||||
/* Disable sleep clock operation
|
||||
33
package/kernel/mac80211/patches/430-add_ath5k_platform.patch
Normal file
33
package/kernel/mac80211/patches/430-add_ath5k_platform.patch
Normal file
@@ -0,0 +1,33 @@
|
||||
--- /dev/null
|
||||
+++ b/include/linux/ath5k_platform.h
|
||||
@@ -0,0 +1,30 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2008 Atheros Communications Inc.
|
||||
+ * Copyright (c) 2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ * Copyright (c) 2009 Imre Kaloz <kaloz@openwrt.org>
|
||||
+ * Copyright (c) 2010 Daniel Golle <daniel.golle@gmail.com>
|
||||
+ *
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _LINUX_ATH5K_PLATFORM_H
|
||||
+#define _LINUX_ATH5K_PLATFORM_H
|
||||
+
|
||||
+#define ATH5K_PLAT_EEP_MAX_WORDS 2048
|
||||
+
|
||||
+struct ath5k_platform_data {
|
||||
+ u16 *eeprom_data;
|
||||
+ u8 *macaddr;
|
||||
+};
|
||||
+
|
||||
+#endif /* _LINUX_ATH5K_PLATFORM_H */
|
||||
@@ -0,0 +1,56 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/pci.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/pci-aspm.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/ath5k_platform.h>
|
||||
#include "../ath.h"
|
||||
#include "ath5k.h"
|
||||
#include "debug.h"
|
||||
@@ -72,7 +73,7 @@ static void ath5k_pci_read_cachesize(str
|
||||
}
|
||||
|
||||
/*
|
||||
- * Read from eeprom
|
||||
+ * Read from eeprom or platform_data
|
||||
*/
|
||||
static bool
|
||||
ath5k_pci_eeprom_read(struct ath_common *common, u32 offset, u16 *data)
|
||||
@@ -80,6 +81,19 @@ ath5k_pci_eeprom_read(struct ath_common
|
||||
struct ath5k_hw *ah = (struct ath5k_hw *) common->ah;
|
||||
u32 status, timeout;
|
||||
|
||||
+ struct ath5k_platform_data *pdata = NULL;
|
||||
+
|
||||
+ if (ah->pdev)
|
||||
+ pdata = ah->pdev->dev.platform_data;
|
||||
+
|
||||
+ if (pdata && pdata->eeprom_data && pdata->eeprom_data[61] == AR5K_EEPROM_MAGIC_VALUE) {
|
||||
+ if (offset >= ATH5K_PLAT_EEP_MAX_WORDS)
|
||||
+ return false;
|
||||
+
|
||||
+ *data = pdata->eeprom_data[offset];
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* Initialize EEPROM access
|
||||
*/
|
||||
@@ -123,6 +137,16 @@ static int ath5k_pci_eeprom_read_mac(str
|
||||
u16 data;
|
||||
int octet;
|
||||
|
||||
+ struct ath5k_platform_data *pdata = NULL;
|
||||
+
|
||||
+ if (ah->pdev)
|
||||
+ pdata = ah->pdev->dev.platform_data;
|
||||
+
|
||||
+ if (pdata && pdata->macaddr) {
|
||||
+ memcpy(mac, pdata->macaddr, ETH_ALEN);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
AR5K_EEPROM_READ(0x20, data);
|
||||
|
||||
for (offset = 0x1f, octet = 0, total = 0; offset >= 0x1d; offset--) {
|
||||
11
package/kernel/mac80211/patches/432-ath5k_add_pciids.patch
Normal file
11
package/kernel/mac80211/patches/432-ath5k_add_pciids.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/pci.c
|
||||
@@ -48,6 +48,8 @@ static DEFINE_PCI_DEVICE_TABLE(ath5k_pci
|
||||
{ PCI_VDEVICE(ATHEROS, 0x001b) }, /* 5413 Eagle */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x001c) }, /* PCI-E cards */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x001d) }, /* 2417 Nala */
|
||||
+ { PCI_VDEVICE(ATHEROS, 0xff16) }, /* 2413,2414 sx76x on lantiq_danube */
|
||||
+ { PCI_VDEVICE(ATHEROS, 0xff1a) }, /* 2417 arv45xx on lantiq_danube */
|
||||
{ PCI_VDEVICE(ATHEROS, 0xff1b) }, /* AR5BXB63 */
|
||||
{ 0 }
|
||||
};
|
||||
@@ -0,0 +1,113 @@
|
||||
This adds a bwmode debugfs file which can be used to set alternate
|
||||
channel operating bandwidths. Only tested with AR5413 and only at
|
||||
5 and 20 mhz channels.
|
||||
|
||||
Signed-off-by: Pat Erley <pat-lkml at erley.org>
|
||||
---
|
||||
Other devices will need to be added to the switch in write_file_bwmode
|
||||
|
||||
drivers/net/wireless/ath/ath5k/debug.c | 86 ++++++++++++++++++++++++++++++++
|
||||
1 files changed, 86 insertions(+), 0 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath5k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/debug.c
|
||||
@@ -811,6 +811,89 @@ static const struct file_operations fops
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
+/* debugfs: bwmode */
|
||||
+
|
||||
+static ssize_t read_file_bwmode(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath5k_hw *ah = file->private_data;
|
||||
+ char buf[15];
|
||||
+ unsigned int len = 0;
|
||||
+
|
||||
+ int cur_ah_bwmode = ah->ah_bwmode;
|
||||
+
|
||||
+#define print_selected(MODE, LABEL) \
|
||||
+ if (cur_ah_bwmode == MODE) \
|
||||
+ len += snprintf(buf+len, sizeof(buf)-len, "[%s]", LABEL); \
|
||||
+ else \
|
||||
+ len += snprintf(buf+len, sizeof(buf)-len, "%s", LABEL); \
|
||||
+ len += snprintf(buf+len, sizeof(buf)-len, " ");
|
||||
+
|
||||
+ print_selected(AR5K_BWMODE_5MHZ, "5");
|
||||
+ print_selected(AR5K_BWMODE_10MHZ, "10");
|
||||
+ print_selected(AR5K_BWMODE_DEFAULT, "20");
|
||||
+ print_selected(AR5K_BWMODE_40MHZ, "40");
|
||||
+#undef print_selected
|
||||
+
|
||||
+ len += snprintf(buf+len, sizeof(buf)-len, "\n");
|
||||
+
|
||||
+ return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
+}
|
||||
+
|
||||
+static ssize_t write_file_bwmode(struct file *file,
|
||||
+ const char __user *userbuf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath5k_hw *ah = file->private_data;
|
||||
+ char buf[3];
|
||||
+ int bw = 20;
|
||||
+ int tobwmode = AR5K_BWMODE_DEFAULT;
|
||||
+
|
||||
+ if (copy_from_user(buf, userbuf, min(count, sizeof(buf))))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ /* TODO: Add check for active interface */
|
||||
+
|
||||
+ if(strncmp(buf, "5", 1) == 0 ) {
|
||||
+ tobwmode = AR5K_BWMODE_5MHZ;
|
||||
+ bw = 5;
|
||||
+ } else if ( strncmp(buf, "10", 2) == 0 ) {
|
||||
+ tobwmode = AR5K_BWMODE_10MHZ;
|
||||
+ bw = 10;
|
||||
+ } else if ( strncmp(buf, "20", 2) == 0 ) {
|
||||
+ tobwmode = AR5K_BWMODE_DEFAULT;
|
||||
+ bw = 20;
|
||||
+ } else if ( strncmp(buf, "40", 2) == 0 ) {
|
||||
+ tobwmode = AR5K_BWMODE_40MHZ;
|
||||
+ bw = 40;
|
||||
+ } else
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ATH5K_INFO(ah, "Changing to %imhz channel width[%i]\n",
|
||||
+ bw, tobwmode);
|
||||
+
|
||||
+ switch (ah->ah_radio) {
|
||||
+ /* TODO: only define radios that actually support 5/10mhz channels */
|
||||
+ case AR5K_RF5413: case AR5K_RF5110: case AR5K_RF5111: case AR5K_RF5112: case AR5K_RF2413: case AR5K_RF2316: case AR5K_RF2317: case AR5K_RF2425:
|
||||
+ if(ah->ah_bwmode != tobwmode) {
|
||||
+ mutex_lock(&ah->lock);
|
||||
+ ah->ah_bwmode = tobwmode;
|
||||
+ mutex_unlock(&ah->lock);
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_bwmode = {
|
||||
+ .read = read_file_bwmode,
|
||||
+ .write = write_file_bwmode,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = default_llseek,
|
||||
+};
|
||||
|
||||
/* debugfs: queues etc */
|
||||
|
||||
@@ -902,6 +985,9 @@ ath5k_debug_init_device(struct ath5k_hw
|
||||
debugfs_create_file("beacon", S_IWUSR | S_IRUSR, phydir, ah,
|
||||
&fops_beacon);
|
||||
|
||||
+ debugfs_create_file("bwmode", S_IWUSR | S_IRUSR, phydir, ah,
|
||||
+ &fops_bwmode);
|
||||
+
|
||||
debugfs_create_file("reset", S_IWUSR, phydir, ah, &fops_reset);
|
||||
|
||||
debugfs_create_file("antenna", S_IWUSR | S_IRUSR, phydir, ah,
|
||||
@@ -0,0 +1,65 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1735,6 +1735,53 @@ void ath9k_deinit_debug(struct ath_softc
|
||||
}
|
||||
}
|
||||
|
||||
+static ssize_t read_file_eeprom(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+ struct ath_common *common = ath9k_hw_common(ah);
|
||||
+ int bytes = 0;
|
||||
+ int pos = *ppos;
|
||||
+ int size = 4096;
|
||||
+ u16 val;
|
||||
+ int i;
|
||||
+
|
||||
+ if (AR_SREV_9300_20_OR_LATER(ah))
|
||||
+ size = 16384;
|
||||
+
|
||||
+ if (*ppos < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (count > size - *ppos)
|
||||
+ count = size - *ppos;
|
||||
+
|
||||
+ for (i = *ppos / 2; count > 0; count -= bytes, *ppos += bytes, i++) {
|
||||
+ void *from = &val;
|
||||
+
|
||||
+ if (!common->bus_ops->eeprom_read(common, i, &val))
|
||||
+ val = 0xffff;
|
||||
+
|
||||
+ if (*ppos % 2) {
|
||||
+ from++;
|
||||
+ bytes = 1;
|
||||
+ } else if (count == 1) {
|
||||
+ bytes = 1;
|
||||
+ } else {
|
||||
+ bytes = 2;
|
||||
+ }
|
||||
+ copy_to_user(user_buf, from, bytes);
|
||||
+ user_buf += bytes;
|
||||
+ }
|
||||
+ return *ppos - pos;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_eeprom = {
|
||||
+ .read = read_file_eeprom,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE
|
||||
+};
|
||||
+
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1752,6 +1799,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
|
||||
ath9k_dfs_init_debug(sc);
|
||||
|
||||
+ debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
+ &fops_eeprom);
|
||||
debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
&fops_dma);
|
||||
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
102
package/kernel/mac80211/patches/501-ath9k-eeprom_endianess.patch
Normal file
102
package/kernel/mac80211/patches/501-ath9k-eeprom_endianess.patch
Normal file
@@ -0,0 +1,102 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
@@ -262,7 +262,7 @@ static int ath9k_hw_def_check_eeprom(str
|
||||
{
|
||||
struct ar5416_eeprom_def *eep = &ah->eeprom.def;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
- u16 *eepdata, temp, magic, magic2;
|
||||
+ u16 *eepdata, temp, magic;
|
||||
u32 sum = 0, el;
|
||||
bool need_swap = false;
|
||||
int i, addr, size;
|
||||
@@ -272,27 +272,16 @@ static int ath9k_hw_def_check_eeprom(str
|
||||
return false;
|
||||
}
|
||||
|
||||
- if (!ath9k_hw_use_flash(ah)) {
|
||||
- ath_dbg(common, EEPROM, "Read Magic = 0x%04X\n", magic);
|
||||
-
|
||||
- if (magic != AR5416_EEPROM_MAGIC) {
|
||||
- magic2 = swab16(magic);
|
||||
-
|
||||
- if (magic2 == AR5416_EEPROM_MAGIC) {
|
||||
- size = sizeof(struct ar5416_eeprom_def);
|
||||
- need_swap = true;
|
||||
- eepdata = (u16 *) (&ah->eeprom);
|
||||
-
|
||||
- for (addr = 0; addr < size / sizeof(u16); addr++) {
|
||||
- temp = swab16(*eepdata);
|
||||
- *eepdata = temp;
|
||||
- eepdata++;
|
||||
- }
|
||||
- } else {
|
||||
- ath_err(common,
|
||||
- "Invalid EEPROM Magic. Endianness mismatch.\n");
|
||||
- return -EINVAL;
|
||||
- }
|
||||
+ if (swab16(magic) == AR5416_EEPROM_MAGIC &&
|
||||
+ !(ah->ah_flags & AH_NO_EEP_SWAP)) {
|
||||
+ size = sizeof(struct ar5416_eeprom_def);
|
||||
+ need_swap = true;
|
||||
+ eepdata = (u16 *) (&ah->eeprom);
|
||||
+
|
||||
+ for (addr = 0; addr < size / sizeof(u16); addr++) {
|
||||
+ temp = swab16(*eepdata);
|
||||
+ *eepdata = temp;
|
||||
+ eepdata++;
|
||||
}
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
@@ -57,7 +57,7 @@ static bool ath9k_hw_4k_fill_eeprom(stru
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
|
||||
- if (!ath9k_hw_use_flash(ah)) {
|
||||
+ if (!(ah->ah_flags & AH_NO_EEP_SWAP)) {
|
||||
ath_dbg(common, EEPROM, "Reading from EEPROM, not flash\n");
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
@@ -60,7 +60,7 @@ static bool ath9k_hw_ar9287_fill_eeprom(
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
|
||||
- if (!ath9k_hw_use_flash(ah)) {
|
||||
+ if (!(ah->ah_flags & AH_NO_EEP_SWAP)) {
|
||||
ath_dbg(common, EEPROM, "Reading from EEPROM, not flash\n");
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -735,6 +735,7 @@ enum ath_cal_list {
|
||||
#define AH_USE_EEPROM 0x1
|
||||
#define AH_UNPLUGGED 0x2 /* The card has been physically removed. */
|
||||
#define AH_FASTCC 0x4
|
||||
+#define AH_NO_EEP_SWAP 0x8 /* Do not swap EEPROM data */
|
||||
|
||||
struct ath_hw {
|
||||
struct ath_ops reg_ops;
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -592,6 +592,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||
ah->get_mac_revision = pdata->get_mac_revision;
|
||||
ah->external_reset = pdata->external_reset;
|
||||
+ if (!pdata->endian_check)
|
||||
+ ah->ah_flags |= AH_NO_EEP_SWAP;
|
||||
}
|
||||
|
||||
common = ath9k_hw_common(ah);
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -31,6 +31,7 @@ struct ath9k_platform_data {
|
||||
u32 gpio_mask;
|
||||
u32 gpio_val;
|
||||
|
||||
+ bool endian_check;
|
||||
bool is_clk_25mhz;
|
||||
int (*get_mac_revision)(void);
|
||||
int (*external_reset)(void);
|
||||
32
package/kernel/mac80211/patches/502-ath9k_ahb_init.patch
Normal file
32
package/kernel/mac80211/patches/502-ath9k_ahb_init.patch
Normal file
@@ -0,0 +1,32 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -984,23 +984,23 @@ static int __init ath9k_init(void)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
- error = ath_pci_init();
|
||||
+ error = ath_ahb_init();
|
||||
if (error < 0) {
|
||||
- pr_err("No PCI devices found, driver not installed\n");
|
||||
error = -ENODEV;
|
||||
goto err_rate_unregister;
|
||||
}
|
||||
|
||||
- error = ath_ahb_init();
|
||||
+ error = ath_pci_init();
|
||||
if (error < 0) {
|
||||
+ pr_err("No PCI devices found, driver not installed\n");
|
||||
error = -ENODEV;
|
||||
- goto err_pci_exit;
|
||||
+ goto err_ahb_exit;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
- err_pci_exit:
|
||||
- ath_pci_exit();
|
||||
+ err_ahb_exit:
|
||||
+ ath_ahb_exit();
|
||||
|
||||
err_rate_unregister:
|
||||
ath_rate_control_unregister();
|
||||
@@ -0,0 +1,13 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2010,8 +2010,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
REG_WRITE(ah, AR_OBS, 8);
|
||||
|
||||
if (ah->config.rx_intr_mitigation) {
|
||||
- REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500);
|
||||
- REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000);
|
||||
+ REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 250);
|
||||
+ REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 500);
|
||||
}
|
||||
|
||||
if (ah->config.tx_intr_mitigation) {
|
||||
11
package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch
Normal file
11
package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -119,7 +119,7 @@ int ath_descdma_setup(struct ath_softc *
|
||||
/* RX / TX */
|
||||
/***********/
|
||||
|
||||
-#define ATH_RXBUF 512
|
||||
+#define ATH_RXBUF 256
|
||||
#define ATH_TXBUF 512
|
||||
#define ATH_TXBUF_RESERVE 5
|
||||
#define ATH_MAX_QDEPTH (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE)
|
||||
@@ -0,0 +1,128 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -696,6 +696,7 @@ struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
|
||||
+ u32 chan_bw;
|
||||
struct survey_info *cur_survey;
|
||||
struct survey_info survey[ATH9K_NUM_CHANNELS];
|
||||
|
||||
@@ -899,6 +900,7 @@ struct fft_sample_ht20 {
|
||||
u8 data[SPECTRAL_HT20_NUM_BINS];
|
||||
} __packed;
|
||||
|
||||
+int ath9k_config(struct ieee80211_hw *hw, u32 changed);
|
||||
void ath9k_tasklet(unsigned long data);
|
||||
int ath_cabq_update(struct ath_softc *);
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1782,6 +1782,50 @@ static const struct file_operations fops
|
||||
.owner = THIS_MODULE
|
||||
};
|
||||
|
||||
+
|
||||
+static ssize_t read_file_chan_bw(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ char buf[32];
|
||||
+ unsigned int len;
|
||||
+
|
||||
+ len = sprintf(buf, "0x%08x\n", sc->chan_bw);
|
||||
+ return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
+}
|
||||
+
|
||||
+static ssize_t write_file_chan_bw(struct file *file, const char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ unsigned long chan_bw;
|
||||
+ char buf[32];
|
||||
+ ssize_t len;
|
||||
+
|
||||
+ len = min(count, sizeof(buf) - 1);
|
||||
+ if (copy_from_user(buf, user_buf, len))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ buf[len] = '\0';
|
||||
+ if (strict_strtoul(buf, 0, &chan_bw))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ sc->chan_bw = chan_bw;
|
||||
+ if (!test_bit(SC_OP_INVALID, &sc->sc_flags))
|
||||
+ ath9k_config(sc->hw, IEEE80211_CONF_CHANGE_CHANNEL);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_chanbw = {
|
||||
+ .read = read_file_chan_bw,
|
||||
+ .write = write_file_chan_bw,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = default_llseek,
|
||||
+};
|
||||
+
|
||||
+
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1801,6 +1845,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
|
||||
debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
&fops_eeprom);
|
||||
+ debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
+ sc, &fops_chanbw);
|
||||
debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
&fops_dma);
|
||||
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1139,7 +1139,7 @@ int ath9k_spectral_scan_config(struct ie
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
|
||||
+int ath9k_config(struct ieee80211_hw *hw, u32 changed)
|
||||
{
|
||||
struct ath_softc *sc = hw->priv;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
@@ -1195,9 +1195,11 @@ static int ath9k_config(struct ieee80211
|
||||
struct ieee80211_channel *curchan = hw->conf.chandef.chan;
|
||||
enum nl80211_channel_type channel_type =
|
||||
cfg80211_get_chandef_type(&conf->chandef);
|
||||
+ struct ath9k_channel *hchan;
|
||||
int pos = curchan->hw_value;
|
||||
int old_pos = -1;
|
||||
unsigned long flags;
|
||||
+ u32 oldflags;
|
||||
|
||||
if (ah->curchan)
|
||||
old_pos = ah->curchan - &ah->channels[0];
|
||||
@@ -1233,7 +1235,23 @@ static int ath9k_config(struct ieee80211
|
||||
memset(&sc->survey[pos], 0, sizeof(struct survey_info));
|
||||
}
|
||||
|
||||
- if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {
|
||||
+ hchan = &sc->sc_ah->channels[pos];
|
||||
+ oldflags = hchan->channelFlags;
|
||||
+ switch (sc->chan_bw) {
|
||||
+ case 5:
|
||||
+ hchan->channelFlags &= ~CHANNEL_HALF;
|
||||
+ hchan->channelFlags |= CHANNEL_QUARTER;
|
||||
+ break;
|
||||
+ case 10:
|
||||
+ hchan->channelFlags &= ~CHANNEL_QUARTER;
|
||||
+ hchan->channelFlags |= CHANNEL_HALF;
|
||||
+ break;
|
||||
+ default:
|
||||
+ hchan->channelFlags &= ~(CHANNEL_HALF | CHANNEL_QUARTER);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (ath_set_channel(sc, hw, hchan) < 0) {
|
||||
ath_err(common, "Unable to set channel\n");
|
||||
mutex_unlock(&sc->mutex);
|
||||
ath9k_ps_restore(sc);
|
||||
@@ -0,0 +1,33 @@
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -1614,6 +1614,7 @@ struct ieee80211_hw {
|
||||
u8 max_tx_aggregation_subframes;
|
||||
u8 offchannel_tx_hw_queue;
|
||||
u8 radiotap_mcs_details;
|
||||
+ s8 cur_power_level;
|
||||
u16 radiotap_vht_details;
|
||||
netdev_features_t netdev_features;
|
||||
u8 uapsd_queues;
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2273,7 +2273,9 @@ static int ieee80211_get_tx_power(struct
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
- if (!local->use_chanctx)
|
||||
+ if (local->hw.cur_power_level)
|
||||
+ *dbm = local->hw.cur_power_level;
|
||||
+ else if (!local->use_chanctx)
|
||||
*dbm = local->hw.conf.power_level;
|
||||
else
|
||||
*dbm = sdata->vif.bss_conf.txpower;
|
||||
--- a/net/mac80211/main.c
|
||||
+++ b/net/mac80211/main.c
|
||||
@@ -167,6 +167,7 @@ static u32 ieee80211_hw_conf_chan(struct
|
||||
|
||||
if (local->hw.conf.power_level != power) {
|
||||
changed |= IEEE80211_CONF_CHANGE_POWER;
|
||||
+ local->hw.cur_power_level = power;
|
||||
local->hw.conf.power_level = power;
|
||||
}
|
||||
|
||||
19
package/kernel/mac80211/patches/521-ath9k_cur_txpower.patch
Normal file
19
package/kernel/mac80211/patches/521-ath9k_cur_txpower.patch
Normal file
@@ -0,0 +1,19 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1258,6 +1258,8 @@ int ath9k_config(struct ieee80211_hw *hw
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ hw->cur_power_level = sc->curtxpow / 2;
|
||||
+
|
||||
/*
|
||||
* The most recent snapshot of channel->noisefloor for the old
|
||||
* channel is only available after the hardware reset. Copy it to
|
||||
@@ -1294,6 +1296,7 @@ int ath9k_config(struct ieee80211_hw *hw
|
||||
sc->config.txpowlimit = 2 * conf->power_level;
|
||||
ath9k_cmn_update_txpow(ah, sc->curtxpow,
|
||||
sc->config.txpowlimit, &sc->curtxpow);
|
||||
+ hw->cur_power_level = sc->curtxpow / 2;
|
||||
}
|
||||
|
||||
mutex_unlock(&sc->mutex);
|
||||
@@ -0,0 +1,153 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/mac.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/mac.h
|
||||
@@ -133,12 +133,8 @@ struct ath_rx_status {
|
||||
u8 rs_rate;
|
||||
u8 rs_antenna;
|
||||
u8 rs_more;
|
||||
- int8_t rs_rssi_ctl0;
|
||||
- int8_t rs_rssi_ctl1;
|
||||
- int8_t rs_rssi_ctl2;
|
||||
- int8_t rs_rssi_ext0;
|
||||
- int8_t rs_rssi_ext1;
|
||||
- int8_t rs_rssi_ext2;
|
||||
+ int8_t rs_rssi_ctl[3];
|
||||
+ int8_t rs_rssi_ext[3];
|
||||
u8 rs_isaggr;
|
||||
u8 rs_moreaggr;
|
||||
u8 rs_num_delims;
|
||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
@@ -939,6 +939,7 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
bool discard_current = sc->rx.discard_next;
|
||||
+ int i, j;
|
||||
|
||||
sc->rx.discard_next = rx_stats->rs_more;
|
||||
if (discard_current)
|
||||
@@ -968,6 +969,21 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
if (rx_stats->rs_moreaggr)
|
||||
rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
|
||||
|
||||
+ for (i = 0, j = 0; i < ARRAY_SIZE(rx_stats->rs_rssi_ctl); i++) {
|
||||
+ s8 rssi;
|
||||
+
|
||||
+ if (!(ah->rxchainmask & BIT(i)))
|
||||
+ continue;
|
||||
+
|
||||
+ rssi = rx_stats->rs_rssi_ctl[i];
|
||||
+ if (rssi != ATH9K_RSSI_BAD) {
|
||||
+ rx_status->chains |= BIT(j);
|
||||
+ rx_status->chain_signal[j] = ah->noise + rssi;
|
||||
+ }
|
||||
+ j++;
|
||||
+ }
|
||||
+
|
||||
+
|
||||
sc->rx.discard_next = false;
|
||||
return 0;
|
||||
}
|
||||
@@ -1077,7 +1093,7 @@ static int ath_process_fft(struct ath_so
|
||||
fft_sample.tlv.length = __cpu_to_be16(length);
|
||||
|
||||
fft_sample.freq = __cpu_to_be16(ah->curchan->chan->center_freq);
|
||||
- fft_sample.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
|
||||
+ fft_sample.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
|
||||
fft_sample.noise = ah->noise;
|
||||
|
||||
switch (len - SPECTRAL_HT20_TOTAL_DATA_LEN) {
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
|
||||
@@ -476,12 +476,12 @@ int ath9k_hw_process_rxdesc_edma(struct
|
||||
|
||||
/* XXX: Keycache */
|
||||
rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined);
|
||||
- rxs->rs_rssi_ctl0 = MS(rxsp->status1, AR_RxRSSIAnt00);
|
||||
- rxs->rs_rssi_ctl1 = MS(rxsp->status1, AR_RxRSSIAnt01);
|
||||
- rxs->rs_rssi_ctl2 = MS(rxsp->status1, AR_RxRSSIAnt02);
|
||||
- rxs->rs_rssi_ext0 = MS(rxsp->status5, AR_RxRSSIAnt10);
|
||||
- rxs->rs_rssi_ext1 = MS(rxsp->status5, AR_RxRSSIAnt11);
|
||||
- rxs->rs_rssi_ext2 = MS(rxsp->status5, AR_RxRSSIAnt12);
|
||||
+ rxs->rs_rssi_ctl[0] = MS(rxsp->status1, AR_RxRSSIAnt00);
|
||||
+ rxs->rs_rssi_ctl[1] = MS(rxsp->status1, AR_RxRSSIAnt01);
|
||||
+ rxs->rs_rssi_ctl[2] = MS(rxsp->status1, AR_RxRSSIAnt02);
|
||||
+ rxs->rs_rssi_ext[0] = MS(rxsp->status5, AR_RxRSSIAnt10);
|
||||
+ rxs->rs_rssi_ext[1] = MS(rxsp->status5, AR_RxRSSIAnt11);
|
||||
+ rxs->rs_rssi_ext[2] = MS(rxsp->status5, AR_RxRSSIAnt12);
|
||||
|
||||
if (rxsp->status11 & AR_RxKeyIdxValid)
|
||||
rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx);
|
||||
--- a/drivers/net/wireless/ath/ath9k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/mac.c
|
||||
@@ -554,25 +554,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a
|
||||
|
||||
if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) {
|
||||
rs->rs_rssi = ATH9K_RSSI_BAD;
|
||||
- rs->rs_rssi_ctl0 = ATH9K_RSSI_BAD;
|
||||
- rs->rs_rssi_ctl1 = ATH9K_RSSI_BAD;
|
||||
- rs->rs_rssi_ctl2 = ATH9K_RSSI_BAD;
|
||||
- rs->rs_rssi_ext0 = ATH9K_RSSI_BAD;
|
||||
- rs->rs_rssi_ext1 = ATH9K_RSSI_BAD;
|
||||
- rs->rs_rssi_ext2 = ATH9K_RSSI_BAD;
|
||||
+ rs->rs_rssi_ctl[0] = ATH9K_RSSI_BAD;
|
||||
+ rs->rs_rssi_ctl[1] = ATH9K_RSSI_BAD;
|
||||
+ rs->rs_rssi_ctl[2] = ATH9K_RSSI_BAD;
|
||||
+ rs->rs_rssi_ext[0] = ATH9K_RSSI_BAD;
|
||||
+ rs->rs_rssi_ext[1] = ATH9K_RSSI_BAD;
|
||||
+ rs->rs_rssi_ext[2] = ATH9K_RSSI_BAD;
|
||||
} else {
|
||||
rs->rs_rssi = MS(ads.ds_rxstatus4, AR_RxRSSICombined);
|
||||
- rs->rs_rssi_ctl0 = MS(ads.ds_rxstatus0,
|
||||
+ rs->rs_rssi_ctl[0] = MS(ads.ds_rxstatus0,
|
||||
AR_RxRSSIAnt00);
|
||||
- rs->rs_rssi_ctl1 = MS(ads.ds_rxstatus0,
|
||||
+ rs->rs_rssi_ctl[1] = MS(ads.ds_rxstatus0,
|
||||
AR_RxRSSIAnt01);
|
||||
- rs->rs_rssi_ctl2 = MS(ads.ds_rxstatus0,
|
||||
+ rs->rs_rssi_ctl[2] = MS(ads.ds_rxstatus0,
|
||||
AR_RxRSSIAnt02);
|
||||
- rs->rs_rssi_ext0 = MS(ads.ds_rxstatus4,
|
||||
+ rs->rs_rssi_ext[0] = MS(ads.ds_rxstatus4,
|
||||
AR_RxRSSIAnt10);
|
||||
- rs->rs_rssi_ext1 = MS(ads.ds_rxstatus4,
|
||||
+ rs->rs_rssi_ext[1] = MS(ads.ds_rxstatus4,
|
||||
AR_RxRSSIAnt11);
|
||||
- rs->rs_rssi_ext2 = MS(ads.ds_rxstatus4,
|
||||
+ rs->rs_rssi_ext[2] = MS(ads.ds_rxstatus4,
|
||||
AR_RxRSSIAnt12);
|
||||
}
|
||||
if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
|
||||
--- a/drivers/net/wireless/ath/ath9k/dfs.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/dfs.c
|
||||
@@ -158,8 +158,8 @@ void ath9k_dfs_process_phyerr(struct ath
|
||||
return;
|
||||
}
|
||||
|
||||
- ard.rssi = rs->rs_rssi_ctl0;
|
||||
- ard.ext_rssi = rs->rs_rssi_ext0;
|
||||
+ ard.rssi = rs->rs_rssi_ctl[0];
|
||||
+ ard.ext_rssi = rs->rs_rssi_ext[0];
|
||||
|
||||
/*
|
||||
* hardware stores this as 8 bit signed value.
|
||||
--- a/drivers/net/wireless/ath/ath9k/antenna.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/antenna.c
|
||||
@@ -546,14 +546,14 @@ void ath_ant_comb_scan(struct ath_softc
|
||||
struct ath_ant_comb *antcomb = &sc->ant_comb;
|
||||
int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
|
||||
int curr_main_set;
|
||||
- int main_rssi = rs->rs_rssi_ctl0;
|
||||
- int alt_rssi = rs->rs_rssi_ctl1;
|
||||
+ int main_rssi = rs->rs_rssi_ctl[0];
|
||||
+ int alt_rssi = rs->rs_rssi_ctl[1];
|
||||
int rx_ant_conf, main_ant_conf;
|
||||
bool short_scan = false;
|
||||
|
||||
- rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) &
|
||||
+ rx_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_CURRENT_SHIFT) &
|
||||
ATH_ANT_RX_MASK;
|
||||
- main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) &
|
||||
+ main_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_MAIN_SHIFT) &
|
||||
ATH_ANT_RX_MASK;
|
||||
|
||||
/* Record packet only when both main_rssi and alt_rssi is positive */
|
||||
@@ -0,0 +1,162 @@
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -997,6 +997,7 @@ enum ieee80211_smps_mode {
|
||||
*
|
||||
* @power_level: requested transmit power (in dBm), backward compatibility
|
||||
* value only that is set to the minimum of all interfaces
|
||||
+ * @max_antenna_gain: maximum antenna gain adjusted by user config (in dBi)
|
||||
*
|
||||
* @chandef: the channel definition to tune to
|
||||
* @radar_enabled: whether radar detection is enabled
|
||||
@@ -1018,6 +1019,7 @@ struct ieee80211_conf {
|
||||
u32 flags;
|
||||
int power_level, dynamic_ps_timeout;
|
||||
int max_sleep_period;
|
||||
+ int max_antenna_gain;
|
||||
|
||||
u16 listen_interval;
|
||||
u8 ps_dtim_period;
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -1126,6 +1126,7 @@ struct ieee80211_local {
|
||||
int dynamic_ps_forced_timeout;
|
||||
|
||||
int user_power_level; /* in dBm, for all interfaces */
|
||||
+ int user_antenna_gain; /* in dBi */
|
||||
|
||||
enum ieee80211_smps_mode smps_mode;
|
||||
|
||||
--- a/include/uapi/linux/nl80211.h
|
||||
+++ b/include/uapi/linux/nl80211.h
|
||||
@@ -1736,6 +1736,8 @@ enum nl80211_attrs {
|
||||
|
||||
NL80211_ATTR_PEER_AID,
|
||||
|
||||
+ NL80211_ATTR_WIPHY_ANTENNA_GAIN,
|
||||
+
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -349,6 +349,7 @@ static const struct nla_policy nl80211_p
|
||||
[NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
|
||||
.len = IEEE80211_MAX_DATA_LEN },
|
||||
[NL80211_ATTR_PEER_AID] = { .type = NLA_U16 },
|
||||
+ [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
@@ -1953,6 +1954,22 @@ static int nl80211_set_wiphy(struct sk_b
|
||||
goto bad_res;
|
||||
}
|
||||
|
||||
+ if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) {
|
||||
+ int idx, dbi = 0;
|
||||
+
|
||||
+ if (!rdev->ops->set_antenna_gain) {
|
||||
+ result = -EOPNOTSUPP;
|
||||
+ goto bad_res;
|
||||
+ }
|
||||
+
|
||||
+ idx = NL80211_ATTR_WIPHY_ANTENNA_GAIN;
|
||||
+ dbi = nla_get_u32(info->attrs[idx]);
|
||||
+
|
||||
+ result = rdev->ops->set_antenna_gain(&rdev->wiphy, dbi);
|
||||
+ if (result)
|
||||
+ goto bad_res;
|
||||
+ }
|
||||
+
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
|
||||
info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
|
||||
u32 tx_ant, rx_ant;
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2283,6 +2283,19 @@ static int ieee80211_get_tx_power(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ieee80211_set_antenna_gain(struct wiphy *wiphy, int dbi)
|
||||
+{
|
||||
+ struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
+
|
||||
+ if (dbi < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ local->user_antenna_gain = dbi;
|
||||
+ ieee80211_hw_config(local, 0);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *addr)
|
||||
{
|
||||
@@ -3484,6 +3497,7 @@ struct cfg80211_ops mac80211_config_ops
|
||||
.set_wiphy_params = ieee80211_set_wiphy_params,
|
||||
.set_tx_power = ieee80211_set_tx_power,
|
||||
.get_tx_power = ieee80211_get_tx_power,
|
||||
+ .set_antenna_gain = ieee80211_set_antenna_gain,
|
||||
.set_wds_peer = ieee80211_set_wds_peer,
|
||||
.rfkill_poll = ieee80211_rfkill_poll,
|
||||
CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -1942,6 +1942,7 @@ struct cfg80211_update_ft_ies_params {
|
||||
* (as advertised by the nl80211 feature flag.)
|
||||
* @get_tx_power: store the current TX power into the dbm variable;
|
||||
* return 0 if successful
|
||||
+ * @set_antenna_gain: set antenna gain to reduce maximum tx power if necessary
|
||||
*
|
||||
* @set_wds_peer: set the WDS peer for a WDS interface
|
||||
*
|
||||
@@ -2161,6 +2162,7 @@ struct cfg80211_ops {
|
||||
enum nl80211_tx_power_setting type, int mbm);
|
||||
int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int *dbm);
|
||||
+ int (*set_antenna_gain)(struct wiphy *wiphy, int dbi);
|
||||
|
||||
int (*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *addr);
|
||||
--- a/net/mac80211/main.c
|
||||
+++ b/net/mac80211/main.c
|
||||
@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
struct cfg80211_chan_def chandef = {};
|
||||
u32 changed = 0;
|
||||
- int power;
|
||||
+ int power, ant_gain, max_power;
|
||||
u32 offchannel_flag;
|
||||
|
||||
offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
|
||||
@@ -165,8 +165,21 @@ static u32 ieee80211_hw_conf_chan(struct
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
- if (local->hw.conf.power_level != power) {
|
||||
+ max_power = chandef.chan->max_reg_power;
|
||||
+ ant_gain = chandef.chan->max_antenna_gain;
|
||||
+ if (local->user_antenna_gain > 0) {
|
||||
+ if (local->user_antenna_gain > ant_gain) {
|
||||
+ max_power -= local->user_antenna_gain - ant_gain;
|
||||
+ ant_gain = 0;
|
||||
+ } else
|
||||
+ ant_gain -= local->user_antenna_gain;
|
||||
+ power = min(power, max_power);
|
||||
+ }
|
||||
+
|
||||
+ if (local->hw.conf.power_level != power ||
|
||||
+ local->hw.conf.max_antenna_gain != ant_gain) {
|
||||
changed |= IEEE80211_CONF_CHANGE_POWER;
|
||||
+ local->hw.conf.max_antenna_gain = ant_gain;
|
||||
local->hw.cur_power_level = power;
|
||||
local->hw.conf.power_level = power;
|
||||
}
|
||||
@@ -597,6 +610,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_BW;
|
||||
local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
|
||||
+ local->user_antenna_gain = 0;
|
||||
local->hw.uapsd_queues = IEEE80211_DEFAULT_UAPSD_QUEUES;
|
||||
local->hw.uapsd_max_sp_len = IEEE80211_DEFAULT_MAX_SP_LEN;
|
||||
local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
|
||||
@@ -0,0 +1,34 @@
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -73,6 +73,7 @@ struct ath_regulatory {
|
||||
u16 max_power_level;
|
||||
u16 current_rd;
|
||||
int16_t power_limit;
|
||||
+ int16_t max_antenna_gain;
|
||||
struct reg_dmn_pair_mapping *regpair;
|
||||
};
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2847,7 +2847,7 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
channel = chan->chan;
|
||||
chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
|
||||
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||||
- max_gain = chan_pwr - new_pwr + channel->max_antenna_gain * 2;
|
||||
+ max_gain = chan_pwr - new_pwr + reg->max_antenna_gain * 2;
|
||||
|
||||
ant_gain = get_antenna_gain(ah, chan);
|
||||
if (ant_gain > max_gain)
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1292,7 +1292,10 @@ int ath9k_config(struct ieee80211_hw *hw
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_POWER) {
|
||||
+ struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||||
+
|
||||
ath_dbg(common, CONFIG, "Set power: %d\n", conf->power_level);
|
||||
+ reg->max_antenna_gain = conf->max_antenna_gain;
|
||||
sc->config.txpowlimit = 2 * conf->power_level;
|
||||
ath9k_cmn_update_txpow(ah, sc->curtxpow,
|
||||
sc->config.txpowlimit, &sc->curtxpow);
|
||||
248
package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
Normal file
248
package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
Normal file
@@ -0,0 +1,248 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -557,6 +557,9 @@ struct ath9k_wow_pattern {
|
||||
void ath_init_leds(struct ath_softc *sc);
|
||||
void ath_deinit_leds(struct ath_softc *sc);
|
||||
void ath_fill_led_pin(struct ath_softc *sc);
|
||||
+int ath_create_gpio_led(struct ath_softc *sc, int gpio, const char *name,
|
||||
+ const char *trigger, bool active_low);
|
||||
+
|
||||
#else
|
||||
static inline void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
@@ -692,6 +695,13 @@ enum spectral_mode {
|
||||
SPECTRAL_CHANSCAN,
|
||||
};
|
||||
|
||||
+struct ath_led {
|
||||
+ struct list_head list;
|
||||
+ struct ath_softc *sc;
|
||||
+ const struct gpio_led *gpio;
|
||||
+ struct led_classdev cdev;
|
||||
+};
|
||||
+
|
||||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -733,9 +743,8 @@ struct ath_softc {
|
||||
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
- bool led_registered;
|
||||
- char led_name[32];
|
||||
- struct led_classdev led_cdev;
|
||||
+ const char *led_default_trigger;
|
||||
+ struct list_head leds;
|
||||
#endif
|
||||
|
||||
struct ath9k_hw_cal_data caldata;
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -24,40 +24,102 @@
|
||||
static void ath_led_brightness(struct led_classdev *led_cdev,
|
||||
enum led_brightness brightness)
|
||||
{
|
||||
- struct ath_softc *sc = container_of(led_cdev, struct ath_softc, led_cdev);
|
||||
- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, (brightness == LED_OFF));
|
||||
+ struct ath_led *led = container_of(led_cdev, struct ath_led, cdev);
|
||||
+ struct ath_softc *sc = led->sc;
|
||||
+
|
||||
+ ath9k_ps_wakeup(sc);
|
||||
+ ath9k_hw_set_gpio(sc->sc_ah, led->gpio->gpio,
|
||||
+ (brightness != LED_OFF) ^ led->gpio->active_low);
|
||||
+ ath9k_ps_restore(sc);
|
||||
+}
|
||||
+
|
||||
+static int ath_add_led(struct ath_softc *sc, struct ath_led *led)
|
||||
+{
|
||||
+ const struct gpio_led *gpio = led->gpio;
|
||||
+ int ret;
|
||||
+
|
||||
+ led->cdev.name = gpio->name;
|
||||
+ led->cdev.default_trigger = gpio->default_trigger;
|
||||
+ led->cdev.brightness_set = ath_led_brightness;
|
||||
+
|
||||
+ ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->cdev);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ led->sc = sc;
|
||||
+ list_add(&led->list, &sc->leds);
|
||||
+
|
||||
+ /* Configure gpio for output */
|
||||
+ ath9k_hw_cfg_output(sc->sc_ah, gpio->gpio,
|
||||
+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
+
|
||||
+ /* LED off */
|
||||
+ ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int ath_create_gpio_led(struct ath_softc *sc, int gpio_num, const char *name,
|
||||
+ const char *trigger, bool active_low)
|
||||
+{
|
||||
+ struct ath_led *led;
|
||||
+ struct gpio_led *gpio;
|
||||
+ char *_name;
|
||||
+ int ret;
|
||||
+
|
||||
+ led = kzalloc(sizeof(*led) + sizeof(*gpio) + strlen(name) + 1,
|
||||
+ GFP_KERNEL);
|
||||
+ if (!led)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ led->gpio = gpio = (struct gpio_led *) (led + 1);
|
||||
+ _name = (char *) (led->gpio + 1);
|
||||
+
|
||||
+ strcpy(_name, name);
|
||||
+ gpio->name = _name;
|
||||
+ gpio->gpio = gpio_num;
|
||||
+ gpio->active_low = active_low;
|
||||
+ gpio->default_trigger = trigger;
|
||||
+
|
||||
+ ret = ath_add_led(sc, led);
|
||||
+ if (unlikely(ret < 0))
|
||||
+ kfree(led);
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
void ath_deinit_leds(struct ath_softc *sc)
|
||||
{
|
||||
- if (!sc->led_registered)
|
||||
- return;
|
||||
+ struct ath_led *led;
|
||||
|
||||
- ath_led_brightness(&sc->led_cdev, LED_OFF);
|
||||
- led_classdev_unregister(&sc->led_cdev);
|
||||
+ while (!list_empty(&sc->leds)) {
|
||||
+ led = list_first_entry(&sc->leds, struct ath_led, list);
|
||||
+ list_del(&led->list);
|
||||
+ ath_led_brightness(&led->cdev, LED_OFF);
|
||||
+ led_classdev_unregister(&led->cdev);
|
||||
+ kfree(led);
|
||||
+ }
|
||||
}
|
||||
|
||||
void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
- int ret;
|
||||
+ char led_name[32];
|
||||
+ const char *trigger;
|
||||
+
|
||||
+ INIT_LIST_HEAD(&sc->leds);
|
||||
|
||||
if (AR_SREV_9100(sc->sc_ah))
|
||||
return;
|
||||
|
||||
- if (!led_blink)
|
||||
- sc->led_cdev.default_trigger =
|
||||
- ieee80211_get_radio_led_name(sc->hw);
|
||||
-
|
||||
- snprintf(sc->led_name, sizeof(sc->led_name),
|
||||
- "ath9k-%s", wiphy_name(sc->hw->wiphy));
|
||||
- sc->led_cdev.name = sc->led_name;
|
||||
- sc->led_cdev.brightness_set = ath_led_brightness;
|
||||
+ snprintf(led_name, sizeof(led_name), "ath9k-%s",
|
||||
+ wiphy_name(sc->hw->wiphy));
|
||||
|
||||
- ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &sc->led_cdev);
|
||||
- if (ret < 0)
|
||||
- return;
|
||||
+ if (led_blink)
|
||||
+ trigger = sc->led_default_trigger;
|
||||
+ else
|
||||
+ trigger = ieee80211_get_radio_led_name(sc->hw);
|
||||
|
||||
- sc->led_registered = true;
|
||||
+ ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, 1);
|
||||
}
|
||||
|
||||
void ath_fill_led_pin(struct ath_softc *sc)
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -891,7 +891,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
/* must be initialized before ieee80211_register_hw */
|
||||
- sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw,
|
||||
+ sc->led_default_trigger = ieee80211_create_tpt_led_trigger(sc->hw,
|
||||
IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_tpt_blink,
|
||||
ARRAY_SIZE(ath9k_tpt_blink));
|
||||
#endif
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1825,6 +1825,61 @@ static const struct file_operations fops
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_MAC80211_LEDS
|
||||
+
|
||||
+static ssize_t write_file_gpio_led(struct file *file, const char __user *ubuf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ char buf[32], *str, *name, *c;
|
||||
+ ssize_t len;
|
||||
+ unsigned int gpio;
|
||||
+ bool active_low = false;
|
||||
+
|
||||
+ len = min(count, sizeof(buf) - 1);
|
||||
+ if (copy_from_user(buf, ubuf, len))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ buf[len] = '\0';
|
||||
+ name = strchr(buf, ',');
|
||||
+ if (!name)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ *(name++) = 0;
|
||||
+ if (!*name)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ c = strchr(name, '\n');
|
||||
+ if (c)
|
||||
+ *c = 0;
|
||||
+
|
||||
+ str = buf;
|
||||
+ if (*str == '!') {
|
||||
+ str++;
|
||||
+ active_low = true;
|
||||
+ }
|
||||
+
|
||||
+ if (kstrtouint(str, 0, &gpio) < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (gpio >= sc->sc_ah->caps.num_gpio_pins)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (ath_create_gpio_led(sc, gpio, name, NULL, active_low) < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_gpio_led = {
|
||||
+ .write = write_file_gpio_led,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = default_llseek,
|
||||
+};
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
@@ -1847,6 +1902,10 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
&fops_eeprom);
|
||||
debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
sc, &fops_chanbw);
|
||||
+#ifdef CONFIG_MAC80211_LEDS
|
||||
+ debugfs_create_file("gpio_led", S_IWUSR,
|
||||
+ sc->debug.debugfs_phy, sc, &fops_gpio_led);
|
||||
+#endif
|
||||
debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
&fops_dma);
|
||||
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
@@ -0,0 +1,71 @@
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -35,6 +35,9 @@ struct ath9k_platform_data {
|
||||
bool is_clk_25mhz;
|
||||
int (*get_mac_revision)(void);
|
||||
int (*external_reset)(void);
|
||||
+
|
||||
+ int num_leds;
|
||||
+ const struct gpio_led *leds;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_ATH9K_PLATFORM_H */
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include "ath9k.h"
|
||||
+#include <linux/ath9k_platform.h>
|
||||
|
||||
/********************************/
|
||||
/* LED functions */
|
||||
@@ -88,6 +89,24 @@ int ath_create_gpio_led(struct ath_softc
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int ath_create_platform_led(struct ath_softc *sc,
|
||||
+ const struct gpio_led *gpio)
|
||||
+{
|
||||
+ struct ath_led *led;
|
||||
+ int ret;
|
||||
+
|
||||
+ led = kzalloc(sizeof(*led), GFP_KERNEL);
|
||||
+ if (!led)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ led->gpio = gpio;
|
||||
+ ret = ath_add_led(sc, led);
|
||||
+ if (ret < 0)
|
||||
+ kfree(led);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
void ath_deinit_leds(struct ath_softc *sc)
|
||||
{
|
||||
struct ath_led *led;
|
||||
@@ -103,8 +122,10 @@ void ath_deinit_leds(struct ath_softc *s
|
||||
|
||||
void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
+ struct ath9k_platform_data *pdata = sc->dev->platform_data;
|
||||
char led_name[32];
|
||||
const char *trigger;
|
||||
+ int i;
|
||||
|
||||
INIT_LIST_HEAD(&sc->leds);
|
||||
|
||||
@@ -120,6 +141,12 @@ void ath_init_leds(struct ath_softc *sc)
|
||||
trigger = ieee80211_get_radio_led_name(sc->hw);
|
||||
|
||||
ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, 1);
|
||||
+
|
||||
+ if (!pdata)
|
||||
+ return;
|
||||
+
|
||||
+ for (i = 0; i < pdata->num_leds; i++)
|
||||
+ ath_create_platform_led(sc, &pdata->leds[i]);
|
||||
}
|
||||
|
||||
void ath_fill_led_pin(struct ath_softc *sc)
|
||||
@@ -0,0 +1,30 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
|
||||
@@ -241,21 +241,19 @@ static bool ar9003_hw_get_isr(struct ath
|
||||
|
||||
*masked = isr & ATH9K_INT_COMMON;
|
||||
|
||||
- if (ah->config.rx_intr_mitigation)
|
||||
+ if (ah->config.rx_intr_mitigation) {
|
||||
if (isr & (AR_ISR_RXMINTR | AR_ISR_RXINTM))
|
||||
*masked |= ATH9K_INT_RXLP;
|
||||
-
|
||||
- if (ah->config.tx_intr_mitigation)
|
||||
- if (isr & (AR_ISR_TXMINTR | AR_ISR_TXINTM))
|
||||
- *masked |= ATH9K_INT_TX;
|
||||
-
|
||||
- if (isr & (AR_ISR_LP_RXOK | AR_ISR_RXERR))
|
||||
+ } else if (isr & (AR_ISR_LP_RXOK | AR_ISR_RXERR))
|
||||
*masked |= ATH9K_INT_RXLP;
|
||||
|
||||
if (isr & AR_ISR_HP_RXOK)
|
||||
*masked |= ATH9K_INT_RXHP;
|
||||
|
||||
- if (isr & (AR_ISR_TXOK | AR_ISR_TXERR | AR_ISR_TXEOL)) {
|
||||
+ if (ah->config.tx_intr_mitigation) {
|
||||
+ if (isr & (AR_ISR_TXMINTR | AR_ISR_TXINTM))
|
||||
+ *masked |= ATH9K_INT_TX;
|
||||
+ } else if (isr & (AR_ISR_TXOK | AR_ISR_TXERR | AR_ISR_TXEOL)) {
|
||||
*masked |= ATH9K_INT_TX;
|
||||
|
||||
if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ani.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ani.h
|
||||
@@ -34,7 +34,7 @@
|
||||
#define ATH9K_ANI_PERIOD 300
|
||||
|
||||
/* in ms */
|
||||
-#define ATH9K_ANI_POLLINTERVAL 1000
|
||||
+#define ATH9K_ANI_POLLINTERVAL 300
|
||||
|
||||
#define ATH9K_SIG_FIRSTEP_SETTING_MIN 0
|
||||
#define ATH9K_SIG_FIRSTEP_SETTING_MAX 20
|
||||
@@ -0,0 +1,28 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/mac.c
|
||||
@@ -705,7 +705,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw
|
||||
{
|
||||
#define AH_RX_STOP_DMA_TIMEOUT 10000 /* usec */
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
- u32 mac_status, last_mac_status = 0;
|
||||
+ u32 mac_status = 0, last_mac_status = 0;
|
||||
int i;
|
||||
|
||||
/* Enable access to the DMA observation bus */
|
||||
@@ -735,6 +735,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw
|
||||
}
|
||||
|
||||
if (i == 0) {
|
||||
+ if (!AR_SREV_9300_20_OR_LATER(ah) &&
|
||||
+ (mac_status & 0x700) == 0) {
|
||||
+ /*
|
||||
+ * DMA is idle but the MAC is still stuck
|
||||
+ * processing events
|
||||
+ */
|
||||
+ *reset = true;
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
ath_err(common,
|
||||
"DMA failed to stop in %d ms AR_CR=0x%08x AR_DIAG_SW=0x%08x DMADBG_7=0x%08x\n",
|
||||
AH_RX_STOP_DMA_TIMEOUT / 1000,
|
||||
139
package/kernel/mac80211/patches/553-ath9k_debugfs_diag.patch
Normal file
139
package/kernel/mac80211/patches/553-ath9k_debugfs_diag.patch
Normal file
@@ -0,0 +1,139 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1881,6 +1881,50 @@ static const struct file_operations fops
|
||||
#endif
|
||||
|
||||
|
||||
+static ssize_t read_file_diag(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+ char buf[32];
|
||||
+ unsigned int len;
|
||||
+
|
||||
+ len = sprintf(buf, "0x%08lx\n", ah->diag);
|
||||
+ return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
+}
|
||||
+
|
||||
+static ssize_t write_file_diag(struct file *file, const char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+ unsigned long diag;
|
||||
+ char buf[32];
|
||||
+ ssize_t len;
|
||||
+
|
||||
+ len = min(count, sizeof(buf) - 1);
|
||||
+ if (copy_from_user(buf, user_buf, len))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ buf[len] = '\0';
|
||||
+ if (strict_strtoul(buf, 0, &diag))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ah->diag = diag;
|
||||
+ ath9k_hw_update_diag(ah);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_diag = {
|
||||
+ .read = read_file_diag,
|
||||
+ .write = write_file_diag,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = default_llseek,
|
||||
+};
|
||||
+
|
||||
+
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1906,6 +1950,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
debugfs_create_file("gpio_led", S_IWUSR,
|
||||
sc->debug.debugfs_phy, sc, &fops_gpio_led);
|
||||
#endif
|
||||
+ debugfs_create_file("diag", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
+ sc, &fops_diag);
|
||||
debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
&fops_dma);
|
||||
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -495,6 +495,12 @@ enum {
|
||||
ATH9K_RESET_COLD,
|
||||
};
|
||||
|
||||
+enum {
|
||||
+ ATH_DIAG_DISABLE_RX,
|
||||
+ ATH_DIAG_DISABLE_TX,
|
||||
+ ATH_DIAG_TRIGGER_ERROR,
|
||||
+};
|
||||
+
|
||||
struct ath9k_hw_version {
|
||||
u32 magic;
|
||||
u16 devid;
|
||||
@@ -773,6 +779,8 @@ struct ath_hw {
|
||||
u32 rfkill_polarity;
|
||||
u32 ah_flags;
|
||||
|
||||
+ unsigned long diag;
|
||||
+
|
||||
bool reset_power_on;
|
||||
bool htc_reset_init;
|
||||
|
||||
@@ -1020,6 +1028,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
|
||||
bool ath9k_hw_check_alive(struct ath_hw *ah);
|
||||
|
||||
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
|
||||
+void ath9k_hw_update_diag(struct ath_hw *ah);
|
||||
|
||||
#ifdef CPTCFG_ATH9K_DEBUGFS
|
||||
void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause);
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1853,6 +1853,20 @@ fail:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+void ath9k_hw_update_diag(struct ath_hw *ah)
|
||||
+{
|
||||
+ if (test_bit(ATH_DIAG_DISABLE_RX, &ah->diag))
|
||||
+ REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_DIS);
|
||||
+ else
|
||||
+ REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_DIS);
|
||||
+
|
||||
+ if (test_bit(ATH_DIAG_DISABLE_TX, &ah->diag))
|
||||
+ REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_LOOP_BACK);
|
||||
+ else
|
||||
+ REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_LOOP_BACK);
|
||||
+}
|
||||
+EXPORT_SYMBOL(ath9k_hw_update_diag);
|
||||
+
|
||||
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
||||
{
|
||||
@@ -2055,6 +2069,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
}
|
||||
|
||||
ath9k_hw_apply_gpio_override(ah);
|
||||
+ ath9k_hw_update_diag(ah);
|
||||
|
||||
if (AR_SREV_9565(ah) && ah->shared_chain_lnadiv)
|
||||
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -462,6 +462,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
ath9k_hw_getisr(ah, &status); /* NB: clears ISR too */
|
||||
status &= ah->imask; /* discard unasked-for bits */
|
||||
|
||||
+ if (test_bit(ATH_DIAG_TRIGGER_ERROR, &ah->diag)) {
|
||||
+ status |= ATH9K_INT_FATAL;
|
||||
+ clear_bit(ATH_DIAG_TRIGGER_ERROR, &ah->diag);
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* If there are no status bits set, then this interrupt was not
|
||||
* for me (should have been caught above).
|
||||
13
package/kernel/mac80211/patches/554-ath9k_ani_mrc_fix.patch
Normal file
13
package/kernel/mac80211/patches/554-ath9k_ani_mrc_fix.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -1136,6 +1136,10 @@ skip_ws_det:
|
||||
* is_on == 0 means MRC CCK is OFF (more noise imm)
|
||||
*/
|
||||
bool is_on = param ? 1 : 0;
|
||||
+
|
||||
+ if (ah->caps.rx_chainmask == 1)
|
||||
+ break;
|
||||
+
|
||||
REG_RMW_FIELD(ah, AR_PHY_MRC_CCK_CTRL,
|
||||
AR_PHY_MRC_CCK_ENABLE, is_on);
|
||||
REG_RMW_FIELD(ah, AR_PHY_MRC_CCK_CTRL,
|
||||
@@ -0,0 +1,70 @@
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -33,6 +33,9 @@ struct ath9k_platform_data {
|
||||
|
||||
bool endian_check;
|
||||
bool is_clk_25mhz;
|
||||
+ bool disable_2ghz;
|
||||
+ bool disable_5ghz;
|
||||
+
|
||||
int (*get_mac_revision)(void);
|
||||
int (*external_reset)(void);
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2448,17 +2448,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
|
||||
}
|
||||
|
||||
eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
|
||||
- if ((eeval & (AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A)) == 0) {
|
||||
- ath_err(common,
|
||||
- "no band has been marked as supported in EEPROM\n");
|
||||
- return -EINVAL;
|
||||
+
|
||||
+ if (eeval & AR5416_OPFLAGS_11A) {
|
||||
+ if (ah->disable_5ghz)
|
||||
+ ath_warn(common, "disabling 5GHz band\n");
|
||||
+ else
|
||||
+ pCap->hw_caps |= ATH9K_HW_CAP_5GHZ;
|
||||
}
|
||||
|
||||
- if (eeval & AR5416_OPFLAGS_11A)
|
||||
- pCap->hw_caps |= ATH9K_HW_CAP_5GHZ;
|
||||
+ if (eeval & AR5416_OPFLAGS_11G) {
|
||||
+ if (ah->disable_2ghz)
|
||||
+ ath_warn(common, "disabling 2GHz band\n");
|
||||
+ else
|
||||
+ pCap->hw_caps |= ATH9K_HW_CAP_2GHZ;
|
||||
+ }
|
||||
|
||||
- if (eeval & AR5416_OPFLAGS_11G)
|
||||
- pCap->hw_caps |= ATH9K_HW_CAP_2GHZ;
|
||||
+ if ((pCap->hw_caps & (ATH9K_HW_CAP_2GHZ | ATH9K_HW_CAP_5GHZ)) == 0) {
|
||||
+ ath_err(common, "both bands are disabled\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
if (AR_SREV_9485(ah) ||
|
||||
AR_SREV_9285(ah) ||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -940,6 +940,8 @@ struct ath_hw {
|
||||
bool is_clk_25mhz;
|
||||
int (*get_mac_revision)(void);
|
||||
int (*external_reset)(void);
|
||||
+ bool disable_2ghz;
|
||||
+ bool disable_5ghz;
|
||||
|
||||
const struct firmware *eeprom_blob;
|
||||
};
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -592,6 +592,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||
ah->get_mac_revision = pdata->get_mac_revision;
|
||||
ah->external_reset = pdata->external_reset;
|
||||
+ ah->disable_2ghz = pdata->disable_2ghz;
|
||||
+ ah->disable_5ghz = pdata->disable_5ghz;
|
||||
if (!pdata->endian_check)
|
||||
ah->ah_flags |= AH_NO_EEP_SWAP;
|
||||
}
|
||||
74
package/kernel/mac80211/patches/556-ath9k_ani_revert.patch
Normal file
74
package/kernel/mac80211/patches/556-ath9k_ani_revert.patch
Normal file
@@ -0,0 +1,74 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ani.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ani.h
|
||||
@@ -20,8 +20,12 @@
|
||||
#define BEACON_RSSI(ahp) (ahp->stats.avgbrssi)
|
||||
|
||||
/* units are errors per second */
|
||||
-#define ATH9K_ANI_OFDM_TRIG_HIGH 1000
|
||||
+#define ATH9K_ANI_OFDM_TRIG_HIGH 3500
|
||||
+#define ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI 1000
|
||||
+
|
||||
#define ATH9K_ANI_OFDM_TRIG_LOW 400
|
||||
+#define ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI 900
|
||||
+
|
||||
#define ATH9K_ANI_CCK_TRIG_HIGH 600
|
||||
#define ATH9K_ANI_CCK_TRIG_LOW 300
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/ani.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ani.c
|
||||
@@ -177,14 +177,17 @@ static void ath9k_hw_set_ofdm_nil(struct
|
||||
BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_HIGH)
|
||||
weak_sig = true;
|
||||
|
||||
- /*
|
||||
- * OFDM Weak signal detection is always enabled for AP mode.
|
||||
- */
|
||||
- if (ah->opmode != NL80211_IFTYPE_AP &&
|
||||
- aniState->ofdmWeakSigDetect != weak_sig) {
|
||||
- ath9k_hw_ani_control(ah,
|
||||
- ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
|
||||
- entry_ofdm->ofdm_weak_signal_on);
|
||||
+ if (aniState->ofdmWeakSigDetect != weak_sig)
|
||||
+ ath9k_hw_ani_control(ah,
|
||||
+ ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
|
||||
+ entry_ofdm->ofdm_weak_signal_on);
|
||||
+
|
||||
+ if (aniState->ofdmNoiseImmunityLevel >= ATH9K_ANI_OFDM_DEF_LEVEL) {
|
||||
+ ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;
|
||||
+ ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI;
|
||||
+ } else {
|
||||
+ ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI;
|
||||
+ ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,25 +423,12 @@ void ath9k_hw_ani_monitor(struct ath_hw
|
||||
ofdmPhyErrRate, aniState->cckNoiseImmunityLevel,
|
||||
cckPhyErrRate, aniState->ofdmsTurn);
|
||||
|
||||
- if (aniState->listenTime > 5 * ah->aniperiod) {
|
||||
- /*
|
||||
- * Check if we need to lower immunity if
|
||||
- * 5 ani_periods have passed.
|
||||
- */
|
||||
- if (ofdmPhyErrRate <= ah->config.ofdm_trig_low &&
|
||||
- cckPhyErrRate <= ah->config.cck_trig_low) {
|
||||
+ if (aniState->listenTime > ah->aniperiod) {
|
||||
+ if (cckPhyErrRate < ah->config.cck_trig_low &&
|
||||
+ ofdmPhyErrRate < ah->config.ofdm_trig_low) {
|
||||
ath9k_hw_ani_lower_immunity(ah);
|
||||
aniState->ofdmsTurn = !aniState->ofdmsTurn;
|
||||
- }
|
||||
- ath9k_ani_restart(ah);
|
||||
- } else if (aniState->listenTime > ah->aniperiod) {
|
||||
- /*
|
||||
- * Check if immunity has to be raised,
|
||||
- * (either OFDM or CCK).
|
||||
- */
|
||||
- if (ofdmPhyErrRate > ah->config.ofdm_trig_high &&
|
||||
- (cckPhyErrRate <= ah->config.cck_trig_high ||
|
||||
- aniState->ofdmsTurn)) {
|
||||
+ } else if (ofdmPhyErrRate > ah->config.ofdm_trig_high) {
|
||||
ath9k_hw_ani_ofdm_err_trigger(ah);
|
||||
aniState->ofdmsTurn = false;
|
||||
} else if (cckPhyErrRate > ah->config.cck_trig_high) {
|
||||
13
package/kernel/mac80211/patches/601-rt2x00-set_pci_mwi.patch
Normal file
13
package/kernel/mac80211/patches/601-rt2x00-set_pci_mwi.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
@@ -96,8 +96,10 @@ int rt2x00pci_probe(struct pci_dev *pci_
|
||||
|
||||
pci_set_master(pci_dev);
|
||||
|
||||
+#ifdef CONFIG_PCI_SET_MWI
|
||||
if (pci_set_mwi(pci_dev))
|
||||
rt2x00_probe_err("MWI not available\n");
|
||||
+#endif
|
||||
|
||||
if (dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32))) {
|
||||
rt2x00_probe_err("PCI DMA not supported\n");
|
||||
@@ -0,0 +1,32 @@
|
||||
--- /dev/null
|
||||
+++ b/include/linux/rt2x00_platform.h
|
||||
@@ -0,0 +1,19 @@
|
||||
+/*
|
||||
+ * Platform data definition for the rt2x00 driver
|
||||
+ *
|
||||
+ * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License version 2 as published
|
||||
+ * by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef _RT2X00_PLATFORM_H
|
||||
+#define _RT2X00_PLATFORM_H
|
||||
+
|
||||
+struct rt2x00_platform_data {
|
||||
+ char *eeprom_file_name;
|
||||
+};
|
||||
+
|
||||
+#endif /* _RT2X00_PLATFORM_H */
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <linux/input-polldev.h>
|
||||
#include <linux/kfifo.h>
|
||||
#include <linux/hrtimer.h>
|
||||
+#include <linux/rt2x00_platform.h>
|
||||
|
||||
#include <net/mac80211.h>
|
||||
|
||||
@@ -0,0 +1,289 @@
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
|
||||
@@ -0,0 +1,98 @@
|
||||
+/*
|
||||
+ Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com>
|
||||
+ <http://rt2x00.serialmonkey.com>
|
||||
+
|
||||
+ This program is free software; you can redistribute it and/or modify
|
||||
+ it under the terms of the GNU General Public License as published by
|
||||
+ the Free Software Foundation; either version 2 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with this program; if not, write to the
|
||||
+ Free Software Foundation, Inc.,
|
||||
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ Module: rt2x00lib
|
||||
+ Abstract: rt2x00 eeprom file loading routines.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include "rt2x00.h"
|
||||
+#include "rt2x00lib.h"
|
||||
+
|
||||
+static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ const struct firmware *ee;
|
||||
+ char *ee_name;
|
||||
+ int retval;
|
||||
+
|
||||
+ ee_name = rt2x00dev->ops->lib->get_eeprom_file_name(rt2x00dev);
|
||||
+ if (!ee_name) {
|
||||
+ rt2x00_err(rt2x00dev,
|
||||
+ "Invalid EEPROM filename.\n"
|
||||
+ "Please file bug report to %s.\n", DRV_PROJECT);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ rt2x00_info(rt2x00dev, "Loading EEPROM data from '%s'.\n", ee_name);
|
||||
+
|
||||
+ retval = request_firmware(&ee, ee_name, rt2x00dev->dev);
|
||||
+ if (retval) {
|
||||
+ rt2x00_err(rt2x00dev, "Failed to request EEPROM.\n");
|
||||
+ return retval;
|
||||
+ }
|
||||
+
|
||||
+ if (!ee || !ee->size || !ee->data) {
|
||||
+ rt2x00_err(rt2x00dev, "Failed to read EEPROM file.\n");
|
||||
+ retval = -ENOENT;
|
||||
+ goto err_exit;
|
||||
+ }
|
||||
+
|
||||
+ if (ee->size != rt2x00dev->ops->eeprom_size) {
|
||||
+ rt2x00_err(rt2x00dev,
|
||||
+ "EEPROM file size is invalid, it should be %d bytes\n",
|
||||
+ rt2x00dev->ops->eeprom_size);
|
||||
+ retval = -EINVAL;
|
||||
+ goto err_release_ee;
|
||||
+ }
|
||||
+
|
||||
+ rt2x00dev->eeprom_file = ee;
|
||||
+ return 0;
|
||||
+
|
||||
+err_release_ee:
|
||||
+ release_firmware(ee);
|
||||
+err_exit:
|
||||
+ return retval;
|
||||
+}
|
||||
+
|
||||
+int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ int retval;
|
||||
+
|
||||
+ if (!test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!rt2x00dev->eeprom_file) {
|
||||
+ retval = rt2x00lib_request_eeprom_file(rt2x00dev);
|
||||
+ if (retval)
|
||||
+ return retval;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ release_firmware(rt2x00dev->eeprom_file);
|
||||
+ rt2x00dev->eeprom_file = NULL;
|
||||
+}
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -549,6 +549,7 @@ struct rt2x00lib_ops {
|
||||
const u8 *data, const size_t len);
|
||||
int (*load_firmware) (struct rt2x00_dev *rt2x00dev,
|
||||
const u8 *data, const size_t len);
|
||||
+ char *(*get_eeprom_file_name) (struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
/*
|
||||
* Device initialization/deinitialization handlers.
|
||||
@@ -705,6 +706,7 @@ enum rt2x00_capability_flags {
|
||||
REQUIRE_SW_SEQNO,
|
||||
REQUIRE_HT_TX_DESC,
|
||||
REQUIRE_PS_AUTOWAKE,
|
||||
+ REQUIRE_EEPROM_FILE,
|
||||
|
||||
/*
|
||||
* Capabilities
|
||||
@@ -974,6 +976,11 @@ struct rt2x00_dev {
|
||||
const struct firmware *fw;
|
||||
|
||||
/*
|
||||
+ * EEPROM image.
|
||||
+ */
|
||||
+ const struct firmware *eeprom_file;
|
||||
+
|
||||
+ /*
|
||||
* FIFO for storing tx status reports between isr and tasklet.
|
||||
*/
|
||||
DECLARE_KFIFO_PTR(txstatus_fifo, u32);
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00lib.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
|
||||
@@ -322,6 +322,22 @@ static inline void rt2x00lib_free_firmwa
|
||||
#endif /* CPTCFG_RT2X00_LIB_FIRMWARE */
|
||||
|
||||
/*
|
||||
+ * EEPROM file handlers.
|
||||
+ */
|
||||
+#ifdef CPTCFG_RT2X00_LIB_EEPROM
|
||||
+int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev);
|
||||
+void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev);
|
||||
+#else
|
||||
+static inline int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+static inline void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+}
|
||||
+#endif /* CPTCFG_RT2X00_LIB_EEPROM */
|
||||
+
|
||||
+/*
|
||||
* Debugfs handlers.
|
||||
*/
|
||||
#ifdef CPTCFG_RT2X00_LIB_DEBUGFS
|
||||
--- a/drivers/net/wireless/rt2x00/Kconfig
|
||||
+++ b/drivers/net/wireless/rt2x00/Kconfig
|
||||
@@ -69,6 +69,7 @@ config RT2800PCI
|
||||
select RT2X00_LIB_PCI if PCI
|
||||
select RT2X00_LIB_SOC if SOC_RT288X || SOC_RT305X
|
||||
select RT2X00_LIB_FIRMWARE
|
||||
+ select RT2X00_LIB_EEPROM
|
||||
select RT2X00_LIB_CRYPTO
|
||||
depends on CRC_CCITT
|
||||
depends on EEPROM_93CX6
|
||||
@@ -235,6 +236,9 @@ config RT2X00_LIB_FIRMWARE
|
||||
config RT2X00_LIB_CRYPTO
|
||||
boolean
|
||||
|
||||
+config RT2X00_LIB_EEPROM
|
||||
+ boolean
|
||||
+
|
||||
config RT2X00_LIB_LEDS
|
||||
depends on !BACKPORT_KERNEL_2_6_25
|
||||
boolean
|
||||
--- a/drivers/net/wireless/rt2x00/Makefile
|
||||
+++ b/drivers/net/wireless/rt2x00/Makefile
|
||||
@@ -7,6 +7,7 @@ rt2x00lib-$(CPTCFG_RT2X00_LIB_DEBUGFS) +
|
||||
rt2x00lib-$(CPTCFG_RT2X00_LIB_CRYPTO) += rt2x00crypto.o
|
||||
rt2x00lib-$(CPTCFG_RT2X00_LIB_FIRMWARE) += rt2x00firmware.o
|
||||
rt2x00lib-$(CPTCFG_RT2X00_LIB_LEDS) += rt2x00leds.o
|
||||
+rt2x00lib-$(CPTCFG_RT2X00_LIB_EEPROM) += rt2x00eeprom.o
|
||||
|
||||
obj-$(CPTCFG_RT2X00_LIB) += rt2x00lib.o
|
||||
obj-$(CPTCFG_RT2X00_LIB_MMIO) += rt2x00mmio.o
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -90,25 +90,11 @@ static void rt2800pci_mcu_status(struct
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
|
||||
}
|
||||
|
||||
-#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
|
||||
static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
- void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
|
||||
-
|
||||
- if (!base_addr)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE);
|
||||
-
|
||||
- iounmap(base_addr);
|
||||
+ memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE);
|
||||
return 0;
|
||||
}
|
||||
-#else
|
||||
-static inline int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
-{
|
||||
- return -ENOMEM;
|
||||
-}
|
||||
-#endif /* CONFIG_SOC_RT288X || CONFIG_SOC_RT305X */
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
|
||||
@@ -332,6 +318,20 @@ static int rt2800pci_write_firmware(stru
|
||||
}
|
||||
|
||||
/*
|
||||
+ * EEPROM file functions.
|
||||
+ */
|
||||
+static char *rt2800pci_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ struct rt2x00_platform_data *pdata;
|
||||
+
|
||||
+ pdata = rt2x00dev->dev->platform_data;
|
||||
+ if (pdata)
|
||||
+ return pdata->eeprom_file_name;
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
* Initialization functions.
|
||||
*/
|
||||
static bool rt2800pci_get_entry_state(struct queue_entry *entry)
|
||||
@@ -1155,6 +1155,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
.get_firmware_name = rt2800pci_get_firmware_name,
|
||||
.check_firmware = rt2800_check_firmware,
|
||||
.load_firmware = rt2800_load_firmware,
|
||||
+ .get_eeprom_file_name = rt2800pci_get_eeprom_file_name,
|
||||
.initialize = rt2x00mmio_initialize,
|
||||
.uninitialize = rt2x00mmio_uninitialize,
|
||||
.get_entry_state = rt2800pci_get_entry_state,
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
@@ -1325,6 +1325,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
|
||||
INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
|
||||
INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
|
||||
|
||||
+ retval = rt2x00lib_load_eeprom_file(rt2x00dev);
|
||||
+ if (retval)
|
||||
+ goto exit;
|
||||
+
|
||||
/*
|
||||
* Let the driver probe the device to detect the capabilities.
|
||||
*/
|
||||
@@ -1455,6 +1459,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
|
||||
*/
|
||||
if (rt2x00dev->drv_data)
|
||||
kfree(rt2x00dev->drv_data);
|
||||
+
|
||||
+ /*
|
||||
+ * Free EEPROM image.
|
||||
+ */
|
||||
+ rt2x00lib_free_eeprom_file(rt2x00dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00soc.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00soc.c
|
||||
@@ -94,6 +94,7 @@ int rt2x00soc_probe(struct platform_devi
|
||||
rt2x00dev->hw = hw;
|
||||
rt2x00dev->irq = platform_get_irq(pdev, 0);
|
||||
rt2x00dev->name = pdev->dev.driver->name;
|
||||
+ set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags);
|
||||
|
||||
rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC);
|
||||
|
||||
--- a/.local-symbols
|
||||
+++ b/.local-symbols
|
||||
@@ -272,6 +272,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
RT2X00_LIB_CRYPTO=
|
||||
RT2X00_LIB_LEDS=
|
||||
RT2X00_LIB_DEBUGFS=
|
||||
+RT2X00_LIB_EEPROM=
|
||||
RT2X00_DEBUG=
|
||||
RTLWIFI=
|
||||
RTLWIFI_DEBUG=
|
||||
46
package/kernel/mac80211/patches/605-rt2x00-pci-eeprom.patch
Normal file
46
package/kernel/mac80211/patches/605-rt2x00-pci-eeprom.patch
Normal file
@@ -0,0 +1,46 @@
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -90,7 +90,7 @@ static void rt2800pci_mcu_status(struct
|
||||
rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
|
||||
}
|
||||
|
||||
-static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
+static int rt2800pci_read_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE);
|
||||
return 0;
|
||||
@@ -1092,8 +1092,9 @@ static int rt2800pci_read_eeprom(struct
|
||||
{
|
||||
int retval;
|
||||
|
||||
- if (rt2x00_is_soc(rt2x00dev))
|
||||
- retval = rt2800pci_read_eeprom_soc(rt2x00dev);
|
||||
+ if (rt2x00_is_soc(rt2x00dev) ||
|
||||
+ test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags))
|
||||
+ retval = rt2800pci_read_eeprom_file(rt2x00dev);
|
||||
else if (rt2800pci_efuse_detect(rt2x00dev))
|
||||
retval = rt2800pci_read_eeprom_efuse(rt2x00dev);
|
||||
else
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
@@ -78,6 +78,7 @@ exit:
|
||||
int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)
|
||||
{
|
||||
struct ieee80211_hw *hw;
|
||||
+ struct rt2x00_platform_data *pdata;
|
||||
struct rt2x00_dev *rt2x00dev;
|
||||
int retval;
|
||||
u16 chip;
|
||||
@@ -125,6 +126,12 @@ int rt2x00pci_probe(struct pci_dev *pci_
|
||||
rt2x00dev->irq = pci_dev->irq;
|
||||
rt2x00dev->name = pci_name(pci_dev);
|
||||
|
||||
+ /* if we get passed the name of a eeprom_file_name, then use this in
|
||||
+ favour of the eeprom */
|
||||
+ pdata = rt2x00dev->dev->platform_data;
|
||||
+ if (pdata && pdata->eeprom_file_name)
|
||||
+ set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags);
|
||||
+
|
||||
if (pci_is_pcie(pci_dev))
|
||||
rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_PCIE);
|
||||
else
|
||||
67
package/kernel/mac80211/patches/606-rt2x00_no_realign.patch
Normal file
67
package/kernel/mac80211/patches/606-rt2x00_no_realign.patch
Normal file
@@ -0,0 +1,67 @@
|
||||
[RFC] rt2x00: For drivers that only need L2 padding don't realign frames
|
||||
|
||||
Signed-off-by: Helmut Schaa <helmut.schaa@...>
|
||||
---
|
||||
|
||||
Ivo, Gertjan, do you remeber by any chance why this alignment stuff was added
|
||||
in the first place? Was it because of DMA restrictions?
|
||||
|
||||
While doing some profiling on the rt3052 SoC I noticed that 30-40% time was
|
||||
spent in memmove calls. And the culprit is the memmove aligning the payload
|
||||
to a 4byte boundary since that has to move a whole bunch of data.
|
||||
|
||||
Interesstingly the legacy drivers insert an l2pad between the header and the
|
||||
payload but doesn't realign the payload itself to a 4-byte boundary. Hence,
|
||||
I came up with this patch and indeed CPU usage improves impressively.
|
||||
|
||||
Only tested on rt2800pci!
|
||||
|
||||
Thanks,
|
||||
Helmut
|
||||
|
||||
drivers/net/wireless/rt2x00/rt2x00queue.c | 30 +++-------------------------
|
||||
1 files changed, 4 insertions(+), 26 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
|
||||
@@ -163,36 +163,14 @@ void rt2x00queue_align_frame(struct sk_b
|
||||
void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length)
|
||||
{
|
||||
unsigned int payload_length = skb->len - header_length;
|
||||
- unsigned int header_align = ALIGN_SIZE(skb, 0);
|
||||
- unsigned int payload_align = ALIGN_SIZE(skb, header_length);
|
||||
unsigned int l2pad = payload_length ? L2PAD_SIZE(header_length) : 0;
|
||||
|
||||
- /*
|
||||
- * Adjust the header alignment if the payload needs to be moved more
|
||||
- * than the header.
|
||||
- */
|
||||
- if (payload_align > header_align)
|
||||
- header_align += 4;
|
||||
-
|
||||
- /* There is nothing to do if no alignment is needed */
|
||||
- if (!header_align)
|
||||
+ if (!l2pad)
|
||||
return;
|
||||
|
||||
- /* Reserve the amount of space needed in front of the frame */
|
||||
- skb_push(skb, header_align);
|
||||
-
|
||||
- /*
|
||||
- * Move the header.
|
||||
- */
|
||||
- memmove(skb->data, skb->data + header_align, header_length);
|
||||
-
|
||||
- /* Move the payload, if present and if required */
|
||||
- if (payload_length && payload_align)
|
||||
- memmove(skb->data + header_length + l2pad,
|
||||
- skb->data + header_length + l2pad + payload_align,
|
||||
- payload_length);
|
||||
-
|
||||
- /* Trim the skb to the correct size */
|
||||
+ /* insert l2pad -> Move header */
|
||||
+ skb_push(skb, l2pad);
|
||||
+ memmove(skb->data, skb->data + l2pad, header_length);
|
||||
skb_trim(skb, header_length + l2pad + payload_length);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
--- a/include/linux/rt2x00_platform.h
|
||||
+++ b/include/linux/rt2x00_platform.h
|
||||
@@ -14,6 +14,9 @@
|
||||
|
||||
struct rt2x00_platform_data {
|
||||
char *eeprom_file_name;
|
||||
+
|
||||
+ int disable_2ghz;
|
||||
+ int disable_5ghz;
|
||||
};
|
||||
|
||||
#endif /* _RT2X00_PLATFORM_H */
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
@@ -938,6 +938,22 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
unsigned int num_rates;
|
||||
unsigned int i;
|
||||
|
||||
+ if (rt2x00dev->dev->platform_data) {
|
||||
+ struct rt2x00_platform_data *pdata;
|
||||
+
|
||||
+ pdata = rt2x00dev->dev->platform_data;
|
||||
+ if (pdata->disable_2ghz)
|
||||
+ spec->supported_bands &= ~SUPPORT_BAND_2GHZ;
|
||||
+ if (pdata->disable_5ghz)
|
||||
+ spec->supported_bands &= ~SUPPORT_BAND_5GHZ;
|
||||
+ }
|
||||
+
|
||||
+ if ((spec->supported_bands & SUPPORT_BAND_BOTH) == 0) {
|
||||
+ rt2x00_err(rt2x00dev, "No supported bands\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+
|
||||
num_rates = 0;
|
||||
if (spec->supported_rates & SUPPORT_RATE_CCK)
|
||||
num_rates += 4;
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -414,6 +414,7 @@ struct hw_mode_spec {
|
||||
unsigned int supported_bands;
|
||||
#define SUPPORT_BAND_2GHZ 0x00000001
|
||||
#define SUPPORT_BAND_5GHZ 0x00000002
|
||||
+#define SUPPORT_BAND_BOTH (SUPPORT_BAND_2GHZ | SUPPORT_BAND_5GHZ)
|
||||
|
||||
unsigned int supported_rates;
|
||||
#define SUPPORT_RATE_CCK 0x00000001
|
||||
@@ -0,0 +1,63 @@
|
||||
--- a/include/linux/rt2x00_platform.h
|
||||
+++ b/include/linux/rt2x00_platform.h
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
struct rt2x00_platform_data {
|
||||
char *eeprom_file_name;
|
||||
+ const u8 *mac_address;
|
||||
|
||||
int disable_2ghz;
|
||||
int disable_5ghz;
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
@@ -929,6 +929,18 @@ static void rt2x00lib_rate(struct ieee80
|
||||
entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE;
|
||||
}
|
||||
|
||||
+const u8 *rt2x00lib_get_mac_address(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ struct rt2x00_platform_data *pdata;
|
||||
+
|
||||
+ pdata = rt2x00dev->dev->platform_data;
|
||||
+ if (!pdata)
|
||||
+ return NULL;
|
||||
+
|
||||
+ return pdata->mac_address;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rt2x00lib_get_mac_address);
|
||||
+
|
||||
static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
|
||||
struct hw_mode_spec *spec)
|
||||
{
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -1326,6 +1326,7 @@ static inline void rt2x00debug_dump_fram
|
||||
*/
|
||||
u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
|
||||
struct ieee80211_vif *vif);
|
||||
+const u8 *rt2x00lib_get_mac_address(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
/*
|
||||
* Interrupt context handlers.
|
||||
--- a/drivers/net/wireless/rt2x00/rt61pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
|
||||
@@ -2395,6 +2395,7 @@ static int rt61pci_validate_eeprom(struc
|
||||
u32 reg;
|
||||
u16 word;
|
||||
u8 *mac;
|
||||
+ const u8 *pdata_mac;
|
||||
s8 value;
|
||||
|
||||
rt2x00mmio_register_read(rt2x00dev, E2PROM_CSR, ®);
|
||||
@@ -2415,7 +2416,11 @@ static int rt61pci_validate_eeprom(struc
|
||||
/*
|
||||
* Start validation of the data that has been read.
|
||||
*/
|
||||
+ pdata_mac = rt2x00lib_get_mac_address(rt2x00dev);
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
+ if (pdata_mac)
|
||||
+ memcpy(mac, pdata_mac, 6);
|
||||
+
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
@@ -0,0 +1,214 @@
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
@@ -2631,15 +2631,18 @@ static void rt2800_config_channel(struct
|
||||
/*
|
||||
* Change BBP settings
|
||||
*/
|
||||
+ rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
|
||||
+ rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
|
||||
+ rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
|
||||
+
|
||||
if (rt2x00_rt(rt2x00dev, RT3352)) {
|
||||
rt2800_bbp_write(rt2x00dev, 27, 0x0);
|
||||
rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
|
||||
rt2800_bbp_write(rt2x00dev, 27, 0x20);
|
||||
rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
|
||||
+ rt2800_bbp_write(rt2x00dev, 86, 0x38);
|
||||
+ rt2800_bbp_write(rt2x00dev, 83, 0x6a);
|
||||
} else {
|
||||
- rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
|
||||
- rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
|
||||
- rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
|
||||
rt2800_bbp_write(rt2x00dev, 86, 0);
|
||||
}
|
||||
|
||||
@@ -4948,6 +4951,12 @@ static void rt2800_init_rfcsr_3290(struc
|
||||
|
||||
static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
+ int tx0_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX0,
|
||||
+ &rt2x00dev->cap_flags);
|
||||
+ int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
|
||||
+ &rt2x00dev->cap_flags);
|
||||
+ u8 rfcsr;
|
||||
+
|
||||
rt2800_rf_init_calibration(rt2x00dev, 30);
|
||||
|
||||
rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
|
||||
@@ -4983,15 +4992,30 @@ static void rt2800_init_rfcsr_3352(struc
|
||||
rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
|
||||
rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
|
||||
rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 34, 0x01);
|
||||
+ rfcsr = 0x01;
|
||||
+ if (!tx0_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR34_TX0_EXT_PA, 1);
|
||||
+ if (!tx1_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR34_TX1_EXT_PA, 1);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
|
||||
rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
|
||||
rt2800_rfcsr_write(rt2x00dev, 36, 0xbd);
|
||||
rt2800_rfcsr_write(rt2x00dev, 37, 0x3c);
|
||||
rt2800_rfcsr_write(rt2x00dev, 38, 0x5f);
|
||||
rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
|
||||
rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 41, 0x5b);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
|
||||
+ rfcsr = 0x52;
|
||||
+ if (tx0_int_pa) {
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR41_BIT1, 1);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR41_BIT4, 1);
|
||||
+ }
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 41, rfcsr);
|
||||
+ rfcsr = 0x52;
|
||||
+ if (tx1_int_pa) {
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR42_BIT1, 1);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR42_BIT4, 1);
|
||||
+ }
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 42, rfcsr);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
|
||||
rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
|
||||
rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
|
||||
@@ -4999,15 +5023,20 @@ static void rt2800_init_rfcsr_3352(struc
|
||||
rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
|
||||
rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
|
||||
rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 50, 0x2d);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 51, 0x7f);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 52, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 53, 0x52);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 54, 0x1b);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 55, 0x7f);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 56, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 57, 0x52);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 58, 0x1b);
|
||||
+ rfcsr = 0x2d;
|
||||
+ if (!tx0_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR50_TX0_EXT_PA, 1);
|
||||
+ if (!tx1_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR50_TX1_EXT_PA, 1);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 51, (tx0_int_pa ? 0x7f : 0x52));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 52, (tx0_int_pa ? 0x00 : 0xc0));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 53, (tx0_int_pa ? 0x52 : 0xd2));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 54, (tx0_int_pa ? 0x1b : 0xc0));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 55, (tx1_int_pa ? 0x7f : 0x52));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 56, (tx1_int_pa ? 0x00 : 0xc0));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 57, (tx0_int_pa ? 0x52 : 0x49));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 58, (tx1_int_pa ? 0x1b : 0xc0));
|
||||
rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
|
||||
@@ -5692,6 +5721,7 @@ static int rt2800_init_eeprom(struct rt2
|
||||
* RT53xx: defined in "EEPROM_CHIP_ID" field
|
||||
*/
|
||||
if (rt2x00_rt(rt2x00dev, RT3290) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT3352) ||
|
||||
rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
rt2x00_rt(rt2x00dev, RT5392))
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
|
||||
@@ -5781,7 +5811,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
/*
|
||||
* Detect if this device has Bluetooth co-existence.
|
||||
*/
|
||||
- if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_BT_COEXIST))
|
||||
+ if (!rt2x00_rt(rt2x00dev, RT3352) &&
|
||||
+ rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_BT_COEXIST))
|
||||
__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
|
||||
|
||||
/*
|
||||
@@ -5810,6 +5841,22 @@ static int rt2800_init_eeprom(struct rt2
|
||||
EIRP_MAX_TX_POWER_LIMIT)
|
||||
__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
|
||||
|
||||
+ /*
|
||||
+ * Detect if device uses internal or external PA
|
||||
+ */
|
||||
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
|
||||
+
|
||||
+ if (rt2x00_rt(rt2x00dev, RT3352)) {
|
||||
+ if (!rt2x00_get_field16(eeprom,
|
||||
+ EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
|
||||
+ __set_bit(CAPABILITY_INTERNAL_PA_TX0,
|
||||
+ &rt2x00dev->cap_flags);
|
||||
+ if (!rt2x00_get_field16(eeprom,
|
||||
+ EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352))
|
||||
+ __set_bit(CAPABILITY_INTERNAL_PA_TX1,
|
||||
+ &rt2x00dev->cap_flags);
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800.h
|
||||
@@ -2153,6 +2153,12 @@ struct mac_iveiv_entry {
|
||||
#define RFCSR31_RX_CALIB FIELD8(0x7f)
|
||||
|
||||
/*
|
||||
+ * RFCSR 34:
|
||||
+ */
|
||||
+#define RFCSR34_TX0_EXT_PA FIELD8(0x04)
|
||||
+#define RFCSR34_TX1_EXT_PA FIELD8(0x08)
|
||||
+
|
||||
+/*
|
||||
* RFCSR 38:
|
||||
*/
|
||||
#define RFCSR38_RX_LO1_EN FIELD8(0x20)
|
||||
@@ -2163,6 +2169,18 @@ struct mac_iveiv_entry {
|
||||
#define RFCSR39_RX_LO2_EN FIELD8(0x80)
|
||||
|
||||
/*
|
||||
+ * RFCSR 41:
|
||||
+ */
|
||||
+#define RFCSR41_BIT1 FIELD8(0x01)
|
||||
+#define RFCSR41_BIT4 FIELD8(0x08)
|
||||
+
|
||||
+/*
|
||||
+ * RFCSR 42:
|
||||
+ */
|
||||
+#define RFCSR42_BIT1 FIELD8(0x01)
|
||||
+#define RFCSR42_BIT4 FIELD8(0x08)
|
||||
+
|
||||
+/*
|
||||
* RFCSR 49:
|
||||
*/
|
||||
#define RFCSR49_TX FIELD8(0x3f)
|
||||
@@ -2172,6 +2190,8 @@ struct mac_iveiv_entry {
|
||||
* RFCSR 50:
|
||||
*/
|
||||
#define RFCSR50_TX FIELD8(0x3f)
|
||||
+#define RFCSR50_TX0_EXT_PA FIELD8(0x02)
|
||||
+#define RFCSR50_TX1_EXT_PA FIELD8(0x10)
|
||||
#define RFCSR50_EP FIELD8(0xc0)
|
||||
|
||||
/*
|
||||
@@ -2260,6 +2280,8 @@ struct mac_iveiv_entry {
|
||||
* INTERNAL_TX_ALC: 0: disable, 1: enable
|
||||
* BT_COEXIST: 0: disable, 1: enable
|
||||
* DAC_TEST: 0: disable, 1: enable
|
||||
+ * EXTERNAL_TX0_PA: 0: disable, 1: enable (only on RT3352)
|
||||
+ * EXTERNAL_TX1_PA: 0: disable, 1: enable (only on RT3352)
|
||||
*/
|
||||
#define EEPROM_NIC_CONF1 0x001b
|
||||
#define EEPROM_NIC_CONF1_HW_RADIO FIELD16(0x0001)
|
||||
@@ -2277,6 +2299,8 @@ struct mac_iveiv_entry {
|
||||
#define EEPROM_NIC_CONF1_INTERNAL_TX_ALC FIELD16(0x2000)
|
||||
#define EEPROM_NIC_CONF1_BT_COEXIST FIELD16(0x4000)
|
||||
#define EEPROM_NIC_CONF1_DAC_TEST FIELD16(0x8000)
|
||||
+#define EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352 FIELD16(0x4000)
|
||||
+#define EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352 FIELD16(0x8000)
|
||||
|
||||
/*
|
||||
* EEPROM frequency
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -726,6 +726,8 @@ enum rt2x00_capability_flags {
|
||||
CAPABILITY_DOUBLE_ANTENNA,
|
||||
CAPABILITY_BT_COEXIST,
|
||||
CAPABILITY_VCO_RECALIBRATION,
|
||||
+ CAPABILITY_INTERNAL_PA_TX0,
|
||||
+ CAPABILITY_INTERNAL_PA_TX1,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -0,0 +1,115 @@
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
@@ -6133,6 +6133,27 @@ static const struct rf_channel rf_vals_5
|
||||
{196, 83, 0, 12, 1},
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * RF value list for rt3xxx with Xtal20MHz
|
||||
+ * Supports: 2.4 GHz (all) (RF3322)
|
||||
+ */
|
||||
+static const struct rf_channel rf_vals_xtal20mhz_3x[] = {
|
||||
+ {1, 0xE2, 2, 0x14},
|
||||
+ {2, 0xE3, 2, 0x14},
|
||||
+ {3, 0xE4, 2, 0x14},
|
||||
+ {4, 0xE5, 2, 0x14},
|
||||
+ {5, 0xE6, 2, 0x14},
|
||||
+ {6, 0xE7, 2, 0x14},
|
||||
+ {7, 0xE8, 2, 0x14},
|
||||
+ {8, 0xE9, 2, 0x14},
|
||||
+ {9, 0xEA, 2, 0x14},
|
||||
+ {10, 0xEB, 2, 0x14},
|
||||
+ {11, 0xEC, 2, 0x14},
|
||||
+ {12, 0xED, 2, 0x14},
|
||||
+ {13, 0xEE, 2, 0x14},
|
||||
+ {14, 0xF0, 2, 0x18},
|
||||
+};
|
||||
+
|
||||
static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct hw_mode_spec *spec = &rt2x00dev->spec;
|
||||
@@ -6211,7 +6232,6 @@ static int rt2800_probe_hw_mode(struct r
|
||||
rt2x00_rf(rt2x00dev, RF3022) ||
|
||||
rt2x00_rf(rt2x00dev, RF3290) ||
|
||||
rt2x00_rf(rt2x00dev, RF3320) ||
|
||||
- rt2x00_rf(rt2x00dev, RF3322) ||
|
||||
rt2x00_rf(rt2x00dev, RF5360) ||
|
||||
rt2x00_rf(rt2x00dev, RF5370) ||
|
||||
rt2x00_rf(rt2x00dev, RF5372) ||
|
||||
@@ -6219,6 +6239,12 @@ static int rt2800_probe_hw_mode(struct r
|
||||
rt2x00_rf(rt2x00dev, RF5392)) {
|
||||
spec->num_channels = 14;
|
||||
spec->channels = rf_vals_3x;
|
||||
+ } else if (rt2x00_rf(rt2x00dev, RF3322)) {
|
||||
+ spec->num_channels = 14;
|
||||
+ if (spec->clk_is_20mhz)
|
||||
+ spec->channels = rf_vals_xtal20mhz_3x;
|
||||
+ else
|
||||
+ spec->channels = rf_vals_3x;
|
||||
} else if (rt2x00_rf(rt2x00dev, RF3052)) {
|
||||
spec->supported_bands |= SUPPORT_BAND_5GHZ;
|
||||
spec->num_channels = ARRAY_SIZE(rf_vals_3x);
|
||||
@@ -6366,6 +6392,19 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
|
||||
+ struct hw_mode_spec *spec = &rt2x00dev->spec;
|
||||
+
|
||||
+ if (!pdata)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ spec->clk_is_20mhz = pdata->clk_is_20mhz;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
int retval;
|
||||
@@ -6395,6 +6434,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
|
||||
rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
|
||||
|
||||
/*
|
||||
+ * Probe SoC clock.
|
||||
+ */
|
||||
+ if (rt2x00_is_soc(rt2x00dev)) {
|
||||
+ retval = rt2800_probe_clk(rt2x00dev);
|
||||
+ if (retval)
|
||||
+ return retval;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
* Initialize hw specifications.
|
||||
*/
|
||||
retval = rt2800_probe_hw_mode(rt2x00dev);
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -409,6 +409,7 @@ static inline struct rt2x00_intf* vif_to
|
||||
* @channels: Device/chipset specific channel values (See &struct rf_channel).
|
||||
* @channels_info: Additional information for channels (See &struct channel_info).
|
||||
* @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
|
||||
+ * @clk_is_20mhz: External crystal of WiSoC is 20MHz instead of 40MHz
|
||||
*/
|
||||
struct hw_mode_spec {
|
||||
unsigned int supported_bands;
|
||||
@@ -425,6 +426,7 @@ struct hw_mode_spec {
|
||||
const struct channel_info *channels_info;
|
||||
|
||||
struct ieee80211_sta_ht_cap ht;
|
||||
+ int clk_is_20mhz;
|
||||
};
|
||||
|
||||
/*
|
||||
--- a/include/linux/rt2x00_platform.h
|
||||
+++ b/include/linux/rt2x00_platform.h
|
||||
@@ -18,6 +18,7 @@ struct rt2x00_platform_data {
|
||||
|
||||
int disable_2ghz;
|
||||
int disable_5ghz;
|
||||
+ int clk_is_20mhz;
|
||||
};
|
||||
|
||||
#endif /* _RT2X00_PLATFORM_H */
|
||||
@@ -0,0 +1,34 @@
|
||||
From 04dbd87265f6ba4a373b211ba324b437d224fb2d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 17 Mar 2013 00:03:31 +0100
|
||||
Subject: [PATCH 21/38] rt2x00: make wmac loadable via OF on rt288x/305x SoC
|
||||
|
||||
This patch ads the match table to allow loading the wmac support from a
|
||||
devicetree.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/rt2800pci.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -1308,11 +1308,18 @@ static int rt2800soc_probe(struct platfo
|
||||
return rt2x00soc_probe(pdev, &rt2800pci_ops);
|
||||
}
|
||||
|
||||
+static const struct of_device_id rt2880_wmac_match[] = {
|
||||
+ { .compatible = "ralink,rt2880-wmac" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, rt2880_wmac_match);
|
||||
+
|
||||
static struct platform_driver rt2800soc_driver = {
|
||||
.driver = {
|
||||
.name = "rt2800_wmac",
|
||||
.owner = THIS_MODULE,
|
||||
.mod_name = KBUILD_MODNAME,
|
||||
+ .of_match_table = rt2880_wmac_match,
|
||||
},
|
||||
.probe = rt2800soc_probe,
|
||||
.remove = rt2x00soc_remove,
|
||||
@@ -0,0 +1,28 @@
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/eeprom_93cx6.h>
|
||||
+#include <linux/of.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00mmio.h"
|
||||
@@ -323,11 +324,17 @@ static int rt2800pci_write_firmware(stru
|
||||
static char *rt2800pci_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct rt2x00_platform_data *pdata;
|
||||
+ struct device_node *np;
|
||||
+ char *eep;
|
||||
|
||||
pdata = rt2x00dev->dev->platform_data;
|
||||
if (pdata)
|
||||
return pdata->eeprom_file_name;
|
||||
|
||||
+ np = rt2x00dev->dev->of_node;
|
||||
+ if (np && !of_property_read_string(np, "ralink,eeprom", &eep))
|
||||
+ return eep;
|
||||
+
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/clk.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2800lib.h"
|
||||
@@ -6394,13 +6395,14 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
|
||||
int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
- struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
|
||||
struct hw_mode_spec *spec = &rt2x00dev->spec;
|
||||
+ struct clk *clk = clk_get(rt2x00dev->dev, NULL);
|
||||
|
||||
- if (!pdata)
|
||||
- return -EINVAL;
|
||||
+ if (IS_ERR(clk))
|
||||
+ return PTR_ERR(clk);
|
||||
|
||||
- spec->clk_is_20mhz = pdata->clk_is_20mhz;
|
||||
+ if (clk_get_rate(clk) == 20000000)
|
||||
+ spec->clk_is_20mhz = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
285
package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch
Normal file
285
package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch
Normal file
@@ -0,0 +1,285 @@
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800.h
|
||||
@@ -71,6 +71,7 @@
|
||||
#define RF3053 0x000d
|
||||
#define RF5592 0x000f
|
||||
#define RF3290 0x3290
|
||||
+#define RF5350 0x5350
|
||||
#define RF5360 0x5360
|
||||
#define RF5370 0x5370
|
||||
#define RF5372 0x5372
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
@@ -2141,6 +2141,15 @@ static void rt2800_config_channel_rf53xx
|
||||
if (rf->channel <= 14) {
|
||||
int idx = rf->channel-1;
|
||||
|
||||
+ if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
+ static const char r59_non_bt[] = {0x0b, 0x0b,
|
||||
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
|
||||
+ 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
|
||||
+
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59,
|
||||
+ r59_non_bt[idx]);
|
||||
+ }
|
||||
+
|
||||
if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) {
|
||||
if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
|
||||
/* r55/r59 value array of channel 1~14 */
|
||||
@@ -2598,6 +2607,7 @@ static void rt2800_config_channel(struct
|
||||
case RF3322:
|
||||
rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
|
||||
break;
|
||||
+ case RF5350:
|
||||
case RF5360:
|
||||
case RF5370:
|
||||
case RF5372:
|
||||
@@ -2614,6 +2624,7 @@ static void rt2800_config_channel(struct
|
||||
|
||||
if (rt2x00_rf(rt2x00dev, RF3290) ||
|
||||
rt2x00_rf(rt2x00dev, RF3322) ||
|
||||
+ rt2x00_rf(rt2x00dev, RF5350) ||
|
||||
rt2x00_rf(rt2x00dev, RF5360) ||
|
||||
rt2x00_rf(rt2x00dev, RF5370) ||
|
||||
rt2x00_rf(rt2x00dev, RF5372) ||
|
||||
@@ -2755,7 +2766,8 @@ static void rt2800_config_channel(struct
|
||||
/*
|
||||
* Clear update flag
|
||||
*/
|
||||
- if (rt2x00_rt(rt2x00dev, RT3352)) {
|
||||
+ if (rt2x00_rt(rt2x00dev, RT3352) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
rt2800_bbp_read(rt2x00dev, 49, &bbp);
|
||||
rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
|
||||
rt2800_bbp_write(rt2x00dev, 49, bbp);
|
||||
@@ -3201,6 +3213,7 @@ void rt2800_vco_calibration(struct rt2x0
|
||||
rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
|
||||
break;
|
||||
case RF3290:
|
||||
+ case RF5350:
|
||||
case RF5360:
|
||||
case RF5370:
|
||||
case RF5372:
|
||||
@@ -3540,7 +3553,8 @@ static int rt2800_init_registers(struct
|
||||
} else if (rt2x00_rt(rt2x00dev, RT3572)) {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
|
||||
- } else if (rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
+ } else if (rt2x00_rt(rt2x00dev, RT5350) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
rt2x00_rt(rt2x00dev, RT5392) ||
|
||||
rt2x00_rt(rt2x00dev, RT5592)) {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
|
||||
@@ -4193,9 +4207,13 @@ static void rt2800_init_bbp_3352(struct
|
||||
|
||||
rt2800_bbp_write(rt2x00dev, 82, 0x62);
|
||||
|
||||
- rt2800_bbp_write(rt2x00dev, 83, 0x6a);
|
||||
-
|
||||
- rt2800_bbp_write(rt2x00dev, 84, 0x99);
|
||||
+ if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
+ rt2800_bbp_write(rt2x00dev, 83, 0x7a);
|
||||
+ rt2800_bbp_write(rt2x00dev, 84, 0x9a);
|
||||
+ } else {
|
||||
+ rt2800_bbp_write(rt2x00dev, 83, 0x6a);
|
||||
+ rt2800_bbp_write(rt2x00dev, 84, 0x99);
|
||||
+ }
|
||||
|
||||
rt2800_bbp_write(rt2x00dev, 86, 0x38);
|
||||
|
||||
@@ -4209,9 +4227,13 @@ static void rt2800_init_bbp_3352(struct
|
||||
|
||||
rt2800_bbp_write(rt2x00dev, 104, 0x92);
|
||||
|
||||
- rt2800_bbp_write(rt2x00dev, 105, 0x34);
|
||||
-
|
||||
- rt2800_bbp_write(rt2x00dev, 106, 0x05);
|
||||
+ if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
+ rt2800_bbp_write(rt2x00dev, 105, 0x3c);
|
||||
+ rt2800_bbp_write(rt2x00dev, 106, 0x03);
|
||||
+ } else {
|
||||
+ rt2800_bbp_write(rt2x00dev, 105, 0x34);
|
||||
+ rt2800_bbp_write(rt2x00dev, 106, 0x05);
|
||||
+ }
|
||||
|
||||
rt2800_bbp_write(rt2x00dev, 120, 0x50);
|
||||
|
||||
@@ -4236,6 +4258,13 @@ static void rt2800_init_bbp_3352(struct
|
||||
rt2800_bbp_write(rt2x00dev, 143, 0xa2);
|
||||
|
||||
rt2800_bbp_write(rt2x00dev, 148, 0xc8);
|
||||
+
|
||||
+ if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
+ rt2800_bbp_write(rt2x00dev, 150, 0x40); /* Antenna Software OFDM */
|
||||
+ rt2800_bbp_write(rt2x00dev, 151, 0x30); /* Antenna Software CCK */
|
||||
+ rt2800_bbp_write(rt2x00dev, 152, 0xa3);
|
||||
+ rt2800_bbp_write(rt2x00dev, 154, 0); /* Clear previously selected antenna */
|
||||
+ }
|
||||
}
|
||||
|
||||
static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
|
||||
@@ -4520,6 +4549,7 @@ static void rt2800_init_bbp(struct rt2x0
|
||||
rt2800_init_bbp_3290(rt2x00dev);
|
||||
break;
|
||||
case RT3352:
|
||||
+ case RT5350:
|
||||
rt2800_init_bbp_3352(rt2x00dev);
|
||||
break;
|
||||
case RT3390:
|
||||
@@ -5159,6 +5189,76 @@ static void rt2800_init_rfcsr_3572(struc
|
||||
rt2800_normal_mode_setup_3xxx(rt2x00dev);
|
||||
}
|
||||
|
||||
+static void rt2800_init_rfcsr_5350(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 3, 0x08);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 4, 0x49);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 8, 0xf1);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
|
||||
+ if(rt2x00dev->spec.clk_is_20mhz)
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 13, 0x1f);
|
||||
+ else
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 16, 0xc0);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 23, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 29, 0xd0);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 40, 0x0b);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 44, 0x0c);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 45, 0xa6);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 49, 0x80);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 50, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 51, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 52, 0x38);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 53, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 56, 0x82);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59, 0x0b);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 61, 0xd1);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
|
||||
+}
|
||||
+
|
||||
static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
rt2800_rf_init_calibration(rt2x00dev, 2);
|
||||
@@ -5387,6 +5487,9 @@ static void rt2800_init_rfcsr(struct rt2
|
||||
case RT3572:
|
||||
rt2800_init_rfcsr_3572(rt2x00dev);
|
||||
break;
|
||||
+ case RT5350:
|
||||
+ rt2800_init_rfcsr_5350(rt2x00dev);
|
||||
+ break;
|
||||
case RT5390:
|
||||
rt2800_init_rfcsr_5390(rt2x00dev);
|
||||
break;
|
||||
@@ -5598,6 +5701,12 @@ static int rt2800_validate_eeprom(struct
|
||||
rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
|
||||
rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
|
||||
+ } else if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
+ rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 1);
|
||||
+ rt2x00_set_field16(&word, EEPROM_NIC_CONF0_TXPATH, 1);
|
||||
+ rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF3320);
|
||||
+ rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
|
||||
+ rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
|
||||
} else if (rt2x00_rt(rt2x00dev, RT2860) ||
|
||||
rt2x00_rt(rt2x00dev, RT2872)) {
|
||||
/*
|
||||
@@ -5723,9 +5832,12 @@ static int rt2800_init_eeprom(struct rt2
|
||||
*/
|
||||
if (rt2x00_rt(rt2x00dev, RT3290) ||
|
||||
rt2x00_rt(rt2x00dev, RT3352) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT5350) ||
|
||||
rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
rt2x00_rt(rt2x00dev, RT5392))
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
|
||||
+ else if (rt2x00_rt(rt2x00dev, RT5350))
|
||||
+ rf = RF5350;
|
||||
else
|
||||
rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
|
||||
|
||||
@@ -5742,6 +5854,7 @@ static int rt2800_init_eeprom(struct rt2
|
||||
case RF3290:
|
||||
case RF3320:
|
||||
case RF3322:
|
||||
+ case RF5350:
|
||||
case RF5360:
|
||||
case RF5370:
|
||||
case RF5372:
|
||||
@@ -6240,7 +6353,8 @@ static int rt2800_probe_hw_mode(struct r
|
||||
rt2x00_rf(rt2x00dev, RF5392)) {
|
||||
spec->num_channels = 14;
|
||||
spec->channels = rf_vals_3x;
|
||||
- } else if (rt2x00_rf(rt2x00dev, RF3322)) {
|
||||
+ } else if (rt2x00_rf(rt2x00dev, RF3322) ||
|
||||
+ rt2x00_rf(rt2x00dev, RF5350)) {
|
||||
spec->num_channels = 14;
|
||||
if (spec->clk_is_20mhz)
|
||||
spec->channels = rf_vals_xtal20mhz_3x;
|
||||
@@ -6341,6 +6455,7 @@ static int rt2800_probe_hw_mode(struct r
|
||||
case RF3320:
|
||||
case RF3052:
|
||||
case RF3290:
|
||||
+ case RF5350:
|
||||
case RF5360:
|
||||
case RF5370:
|
||||
case RF5372:
|
||||
@@ -6378,6 +6493,7 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
case RT3352:
|
||||
case RT3390:
|
||||
case RT3572:
|
||||
+ case RT5350:
|
||||
case RT5390:
|
||||
case RT5392:
|
||||
case RT5592:
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
||||
@@ -181,6 +181,7 @@ struct rt2x00_chip {
|
||||
#define RT3572 0x3572
|
||||
#define RT3593 0x3593
|
||||
#define RT3883 0x3883 /* WSOC */
|
||||
+#define RT5350 0x5350 /* WSOC 2.4GHz */
|
||||
#define RT5390 0x5390 /* 2.4GHz */
|
||||
#define RT5392 0x5392 /* 2.4GHz */
|
||||
#define RT5592 0x5592
|
||||
@@ -0,0 +1,102 @@
|
||||
From 339fe73f340161a624cc08e738d2244814852c3e Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 17 Mar 2013 00:55:04 +0100
|
||||
Subject: [PATCH] rt2x00: load eeprom on SoC from a mtd device defines inside
|
||||
OF
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/rt2x00/Kconfig | 1 +
|
||||
drivers/net/wireless/rt2x00/rt2800pci.c | 44 ++++++++++++++++++++++++++-----
|
||||
2 files changed, 39 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/Kconfig
|
||||
+++ b/drivers/net/wireless/rt2x00/Kconfig
|
||||
@@ -71,6 +71,7 @@ config RT2800PCI
|
||||
select RT2X00_LIB_FIRMWARE
|
||||
select RT2X00_LIB_EEPROM
|
||||
select RT2X00_LIB_CRYPTO
|
||||
+ select MTD if SOC_RT288X || SOC_RT305X
|
||||
depends on CRC_CCITT
|
||||
depends on EEPROM_93CX6
|
||||
---help---
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00eeprom.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
|
||||
@@ -30,12 +30,77 @@
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00lib.h"
|
||||
|
||||
+#ifdef CONFIG_OF
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/mtd/mtd.h>
|
||||
+#include <linux/mtd/partitions.h>
|
||||
+
|
||||
+static struct firmware mtd_fw;
|
||||
+
|
||||
+static int rt2800pci_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ struct device_node *np = rt2x00dev->dev->of_node, *mtd_np = NULL;
|
||||
+ size_t retlen, len = rt2x00dev->ops->eeprom_size;
|
||||
+ int ret, size, offset = 0;
|
||||
+ struct mtd_info *mtd;
|
||||
+ const char *part;
|
||||
+ const __be32 *list;
|
||||
+ phandle phandle;
|
||||
+
|
||||
+ list = of_get_property(np, "ralink,mtd-eeprom", &size);
|
||||
+ if (!list) {
|
||||
+ dev_err(rt2x00dev->dev, "failed to load eeprom property\n");
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+
|
||||
+ phandle = be32_to_cpup(list++);
|
||||
+ if (phandle)
|
||||
+ mtd_np = of_find_node_by_phandle(phandle);
|
||||
+ if (!mtd_np) {
|
||||
+ dev_err(rt2x00dev->dev, "failed to load mtd phandle\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ part = of_get_property(mtd_np, "label", NULL);
|
||||
+ if (!part)
|
||||
+ part = mtd_np->name;
|
||||
+
|
||||
+ mtd = get_mtd_device_nm(part);
|
||||
+ if (IS_ERR(mtd)) {
|
||||
+ dev_err(rt2x00dev->dev, "failed to get mtd device \"%s\"\n", part);
|
||||
+ return PTR_ERR(mtd);
|
||||
+ }
|
||||
+
|
||||
+ if (size > sizeof(*list))
|
||||
+ offset = be32_to_cpup(list);
|
||||
+
|
||||
+ ret = mtd_read(mtd, offset, len, &retlen, (u_char *) rt2x00dev->eeprom);
|
||||
+ put_mtd_device(mtd);
|
||||
+
|
||||
+ if (!ret) {
|
||||
+ rt2x00dev->eeprom_file = &mtd_fw;
|
||||
+ mtd_fw.size = len;
|
||||
+ mtd_fw.data = rt2x00dev->eeprom;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+#else
|
||||
+static inline int rt2800pci_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
const struct firmware *ee;
|
||||
char *ee_name;
|
||||
int retval;
|
||||
|
||||
+ if (!rt2800pci_read_eeprom_mtd(rt2x00dev))
|
||||
+ return 0;
|
||||
+
|
||||
ee_name = rt2x00dev->ops->lib->get_eeprom_file_name(rt2x00dev);
|
||||
if (!ee_name) {
|
||||
rt2x00_err(rt2x00dev,
|
||||
@@ -0,0 +1,10 @@
|
||||
--- a/drivers/net/wireless/mwl8k.c
|
||||
+++ b/drivers/net/wireless/mwl8k.c
|
||||
@@ -5530,6 +5530,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
|
||||
|
||||
static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {
|
||||
+ { PCI_VDEVICE(MARVELL, 0x2a02), .driver_data = MWL8363, },
|
||||
{ PCI_VDEVICE(MARVELL, 0x2a0a), .driver_data = MWL8363, },
|
||||
{ PCI_VDEVICE(MARVELL, 0x2a0c), .driver_data = MWL8363, },
|
||||
{ PCI_VDEVICE(MARVELL, 0x2a24), .driver_data = MWL8363, },
|
||||
@@ -0,0 +1,37 @@
|
||||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -820,6 +820,7 @@ struct b43_wldev {
|
||||
bool qos_enabled; /* TRUE, if QoS is used. */
|
||||
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
|
||||
bool use_pio; /* TRUE if next init should use PIO */
|
||||
+ int gpiomask; /* GPIO LED mask as a module parameter */
|
||||
|
||||
/* PHY/Radio device. */
|
||||
struct b43_phy phy;
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -76,6 +76,11 @@ MODULE_FIRMWARE("b43/ucode16_mimo.fw");
|
||||
MODULE_FIRMWARE("b43/ucode5.fw");
|
||||
MODULE_FIRMWARE("b43/ucode9.fw");
|
||||
|
||||
+static int modparam_gpiomask = 0x000F;
|
||||
+module_param_named(gpiomask, modparam_gpiomask, int, 0444);
|
||||
+MODULE_PARM_DESC(gpiomask,
|
||||
+ "GPIO mask for LED control (default 0x000F)");
|
||||
+
|
||||
static int modparam_bad_frames_preempt;
|
||||
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
|
||||
MODULE_PARM_DESC(bad_frames_preempt,
|
||||
@@ -2740,10 +2745,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
u32 mask, set;
|
||||
|
||||
b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
|
||||
- b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, 0xF);
|
||||
+ b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, modparam_gpiomask);
|
||||
|
||||
mask = 0x0000001F;
|
||||
- set = 0x0000000F;
|
||||
+ set = modparam_gpiomask;
|
||||
if (dev->dev->chip_id == 0x4301) {
|
||||
mask |= 0x0060;
|
||||
set |= 0x0060;
|
||||
86
package/kernel/mac80211/patches/810-b43_no_pio.patch
Normal file
86
package/kernel/mac80211/patches/810-b43_no_pio.patch
Normal file
@@ -0,0 +1,86 @@
|
||||
--- a/drivers/net/wireless/b43/Makefile
|
||||
+++ b/drivers/net/wireless/b43/Makefile
|
||||
@@ -20,7 +20,7 @@ b43-y += xmit.o
|
||||
b43-y += lo.o
|
||||
b43-y += wa.o
|
||||
b43-y += dma.o
|
||||
-b43-y += pio.o
|
||||
+b43-$(CONFIG_B43_PIO) += pio.o
|
||||
b43-y += rfkill.o
|
||||
b43-$(CPTCFG_B43_LEDS) += leds.o
|
||||
b43-$(CPTCFG_B43_PCMCIA) += pcmcia.o
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -1913,10 +1913,12 @@ static void b43_do_interrupt_thread(stru
|
||||
dma_reason[0], dma_reason[1],
|
||||
dma_reason[2], dma_reason[3],
|
||||
dma_reason[4], dma_reason[5]);
|
||||
+#ifdef CONFIG_B43_PIO
|
||||
b43err(dev->wl, "This device does not support DMA "
|
||||
"on your system. It will now be switched to PIO.\n");
|
||||
/* Fall back to PIO transfers if we get fatal DMA errors! */
|
||||
dev->use_pio = true;
|
||||
+#endif
|
||||
b43_controller_restart(dev, "DMA error");
|
||||
return;
|
||||
}
|
||||
--- a/drivers/net/wireless/b43/pio.h
|
||||
+++ b/drivers/net/wireless/b43/pio.h
|
||||
@@ -150,7 +150,7 @@ static inline void b43_piorx_write32(str
|
||||
b43_write32(q->dev, q->mmio_base + offset, value);
|
||||
}
|
||||
|
||||
-
|
||||
+#ifdef CONFIG_B43_PIO
|
||||
int b43_pio_init(struct b43_wldev *dev);
|
||||
void b43_pio_free(struct b43_wldev *dev);
|
||||
|
||||
@@ -161,5 +161,37 @@ void b43_pio_rx(struct b43_pio_rxqueue *
|
||||
|
||||
void b43_pio_tx_suspend(struct b43_wldev *dev);
|
||||
void b43_pio_tx_resume(struct b43_wldev *dev);
|
||||
+#else
|
||||
+static inline int b43_pio_init(struct b43_wldev *dev)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_free(struct b43_wldev *dev)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_handle_txstatus(struct b43_wldev *dev,
|
||||
+ const struct b43_txstatus *status)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_rx(struct b43_pio_rxqueue *q)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_tx_suspend(struct b43_wldev *dev)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_tx_resume(struct b43_wldev *dev)
|
||||
+{
|
||||
+}
|
||||
+#endif /* CONFIG_B43_PIO */
|
||||
|
||||
#endif /* B43_PIO_H_ */
|
||||
--- a/drivers/net/wireless/b43/Kconfig
|
||||
+++ b/drivers/net/wireless/b43/Kconfig
|
||||
@@ -104,7 +104,7 @@ config B43_BCMA_PIO
|
||||
default y
|
||||
|
||||
config B43_PIO
|
||||
- bool
|
||||
+ bool "Broadcom 43xx PIO support"
|
||||
depends on B43
|
||||
select SSB_BLOCKIO
|
||||
default y
|
||||
@@ -0,0 +1,131 @@
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -1560,7 +1560,7 @@ static void b43_write_beacon_template(st
|
||||
len, ram_offset, shm_size_offset, rate);
|
||||
|
||||
/* Write the PHY TX control parameters. */
|
||||
- antenna = B43_ANTENNA_DEFAULT;
|
||||
+ antenna = dev->tx_antenna;
|
||||
antenna = b43_antenna_to_phyctl(antenna);
|
||||
ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
|
||||
/* We can't send beacons with short preamble. Would get PHY errors. */
|
||||
@@ -3098,8 +3098,8 @@ static int b43_chip_init(struct b43_wlde
|
||||
|
||||
/* Select the antennae */
|
||||
if (phy->ops->set_rx_antenna)
|
||||
- phy->ops->set_rx_antenna(dev, B43_ANTENNA_DEFAULT);
|
||||
- b43_mgmtframe_txantenna(dev, B43_ANTENNA_DEFAULT);
|
||||
+ phy->ops->set_rx_antenna(dev, dev->rx_antenna);
|
||||
+ b43_mgmtframe_txantenna(dev, dev->tx_antenna);
|
||||
|
||||
if (phy->type == B43_PHYTYPE_B) {
|
||||
value16 = b43_read16(dev, 0x005E);
|
||||
@@ -3843,7 +3843,6 @@ static int b43_op_config(struct ieee8021
|
||||
struct b43_wldev *dev;
|
||||
struct b43_phy *phy;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
- int antenna;
|
||||
int err = 0;
|
||||
bool reload_bss = false;
|
||||
|
||||
@@ -3897,11 +3896,9 @@ static int b43_op_config(struct ieee8021
|
||||
}
|
||||
|
||||
/* Antennas for RX and management frame TX. */
|
||||
- antenna = B43_ANTENNA_DEFAULT;
|
||||
- b43_mgmtframe_txantenna(dev, antenna);
|
||||
- antenna = B43_ANTENNA_DEFAULT;
|
||||
+ b43_mgmtframe_txantenna(dev, dev->tx_antenna);
|
||||
if (phy->ops->set_rx_antenna)
|
||||
- phy->ops->set_rx_antenna(dev, antenna);
|
||||
+ phy->ops->set_rx_antenna(dev, dev->rx_antenna);
|
||||
|
||||
if (wl->radio_enabled != phy->radio_on) {
|
||||
if (wl->radio_enabled) {
|
||||
@@ -5026,6 +5023,47 @@ static int b43_op_get_survey(struct ieee
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int b43_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
|
||||
+{
|
||||
+ struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||
+ struct b43_wldev *dev = wl->current_dev;
|
||||
+
|
||||
+ if (tx_ant == 1 && rx_ant == 1) {
|
||||
+ dev->tx_antenna = B43_ANTENNA0;
|
||||
+ dev->rx_antenna = B43_ANTENNA0;
|
||||
+ }
|
||||
+ else if (tx_ant == 2 && rx_ant == 2) {
|
||||
+ dev->tx_antenna = B43_ANTENNA1;
|
||||
+ dev->rx_antenna = B43_ANTENNA1;
|
||||
+ }
|
||||
+ else if ((tx_ant & 3) == 3 && (rx_ant & 3) == 3) {
|
||||
+ dev->tx_antenna = B43_ANTENNA_DEFAULT;
|
||||
+ dev->rx_antenna = B43_ANTENNA_DEFAULT;
|
||||
+ }
|
||||
+ else {
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int b43_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
|
||||
+{
|
||||
+ struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||
+ struct b43_wldev *dev = wl->current_dev;
|
||||
+
|
||||
+ switch (dev->tx_antenna) {
|
||||
+ case B43_ANTENNA0:
|
||||
+ *tx_ant = 1; *rx_ant = 1; break;
|
||||
+ case B43_ANTENNA1:
|
||||
+ *tx_ant = 2; *rx_ant = 2; break;
|
||||
+ case B43_ANTENNA_DEFAULT:
|
||||
+ *tx_ant = 3; *rx_ant = 3; break;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static const struct ieee80211_ops b43_hw_ops = {
|
||||
.tx = b43_op_tx,
|
||||
.conf_tx = b43_op_conf_tx,
|
||||
@@ -5047,6 +5085,8 @@ static const struct ieee80211_ops b43_hw
|
||||
.sw_scan_complete = b43_op_sw_scan_complete_notifier,
|
||||
.get_survey = b43_op_get_survey,
|
||||
.rfkill_poll = b43_rfkill_poll,
|
||||
+ .set_antenna = b43_op_set_antenna,
|
||||
+ .get_antenna = b43_op_get_antenna,
|
||||
};
|
||||
|
||||
/* Hard-reset the chip. Do not call this directly.
|
||||
@@ -5293,6 +5333,8 @@ static int b43_one_core_attach(struct b4
|
||||
if (!wldev)
|
||||
goto out;
|
||||
|
||||
+ wldev->rx_antenna = B43_ANTENNA_DEFAULT;
|
||||
+ wldev->tx_antenna = B43_ANTENNA_DEFAULT;
|
||||
wldev->use_pio = b43_modparam_pio;
|
||||
wldev->dev = dev;
|
||||
wldev->wl = wl;
|
||||
@@ -5383,6 +5425,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
|
||||
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
|
||||
|
||||
+ hw->wiphy->available_antennas_rx = 0x3;
|
||||
+ hw->wiphy->available_antennas_tx = 0x3;
|
||||
+
|
||||
wl->hw_registred = false;
|
||||
hw->max_rates = 2;
|
||||
SET_IEEE80211_DEV(hw, dev->dev);
|
||||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -821,6 +821,8 @@ struct b43_wldev {
|
||||
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
|
||||
bool use_pio; /* TRUE if next init should use PIO */
|
||||
int gpiomask; /* GPIO LED mask as a module parameter */
|
||||
+ int rx_antenna; /* Used RX antenna (B43_ANTENNAxxx) */
|
||||
+ int tx_antenna; /* Used TX antenna (B43_ANTENNAxxx) */
|
||||
|
||||
/* PHY/Radio device. */
|
||||
struct b43_phy phy;
|
||||
@@ -0,0 +1,134 @@
|
||||
From 4f214b1ead0af7439921637645cb63f378516175 Mon Sep 17 00:00:00 2001
|
||||
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Date: Sat, 21 Jan 2012 18:48:38 +0100
|
||||
Subject: [PATCH 33/34] b43: add workaround for b43 on pcie bus of bcm4716.
|
||||
|
||||
bcm4716 (which includes 4717 & 4718), plus 4706 on PCIe can reorder
|
||||
transactions. As a fix, a read after write is performed on certain
|
||||
places in the code. Older chips and the newer 5357 family don't require
|
||||
this fix.
|
||||
This code is based on the brcmsmac driver.
|
||||
|
||||
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
---
|
||||
drivers/net/wireless/b43/b43.h | 26 ++++++++++++++++++++++++++
|
||||
drivers/net/wireless/b43/bus.h | 10 ++++++++++
|
||||
drivers/net/wireless/b43/phy_common.c | 6 ++++++
|
||||
drivers/net/wireless/b43/phy_n.c | 10 +++++-----
|
||||
4 files changed, 47 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -1061,6 +1061,32 @@ static inline bool b43_using_pio_transfe
|
||||
return dev->__using_pio_transfers;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * bcm4716 (which includes 4717 & 4718), plus 4706 on PCIe can reorder
|
||||
+ * transactions. As a fix, a read after write is performed on certain places
|
||||
+ * in the code. Older chips and the newer 5357 family don't require this fix.
|
||||
+ */
|
||||
+#ifdef CONFIG_BCM47XX_BCMA
|
||||
+#include <asm/mach-bcm47xx/bcm47xx.h>
|
||||
+static inline void b43_wflush16(struct b43_wldev *dev, u16 offset, u16 value)
|
||||
+{
|
||||
+ if (b43_bus_host_is_pci(dev->dev) &&
|
||||
+ bcm47xx_bus_type == BCM47XX_BUS_TYPE_BCMA &&
|
||||
+ (bcm47xx_bus.bcma.bus.chipinfo.id == 0x4716 ||
|
||||
+ bcm47xx_bus.bcma.bus.chipinfo.id == 0x5300)) {
|
||||
+ b43_write16(dev, offset, value);
|
||||
+ b43_read16(dev, offset);
|
||||
+ } else {
|
||||
+ b43_write16(dev, offset, value);
|
||||
+ }
|
||||
+}
|
||||
+#else
|
||||
+static inline void b43_wflush16(struct b43_wldev *dev, u16 offset, u16 value)
|
||||
+{
|
||||
+ b43_write16(dev, offset, value);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
/* Message printing */
|
||||
__printf(2, 3) void b43info(struct b43_wl *wl, const char *fmt, ...);
|
||||
__printf(2, 3) void b43err(struct b43_wl *wl, const char *fmt, ...);
|
||||
--- a/drivers/net/wireless/b43/bus.h
|
||||
+++ b/drivers/net/wireless/b43/bus.h
|
||||
@@ -60,6 +60,16 @@ static inline bool b43_bus_host_is_sdio(
|
||||
return (dev->bus_type == B43_BUS_SSB &&
|
||||
dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO);
|
||||
}
|
||||
+static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev)
|
||||
+{
|
||||
+ if (dev->bus_type == B43_BUS_SSB)
|
||||
+ return (dev->sdev->bus->bustype == SSB_BUSTYPE_PCI);
|
||||
+#ifdef CONFIG_B43_BCMA
|
||||
+ if (dev->bus_type == B43_BUS_BCMA)
|
||||
+ return (dev->bdev->bus->hosttype == BCMA_HOSTTYPE_PCI);
|
||||
+#endif
|
||||
+ return false;
|
||||
+}
|
||||
|
||||
struct b43_bus_dev *b43_bus_dev_bcma_init(struct bcma_device *core);
|
||||
struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev);
|
||||
--- a/drivers/net/wireless/b43/phy_common.c
|
||||
+++ b/drivers/net/wireless/b43/phy_common.c
|
||||
@@ -266,6 +266,12 @@ void b43_phy_write(struct b43_wldev *dev
|
||||
{
|
||||
assert_mac_suspended(dev);
|
||||
dev->phy.ops->phy_write(dev, reg, value);
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ if (b43_bus_host_is_pci(dev->dev) && reg == 0x72) {
|
||||
+ b43_read16(dev, B43_MMIO_PHY_VER);
|
||||
+ return;
|
||||
+ }
|
||||
+#endif
|
||||
if (++dev->phy.writes_counter == B43_MAX_WRITES_IN_ROW) {
|
||||
b43_read16(dev, B43_MMIO_PHY_VER);
|
||||
dev->phy.writes_counter = 0;
|
||||
--- a/drivers/net/wireless/b43/phy_n.c
|
||||
+++ b/drivers/net/wireless/b43/phy_n.c
|
||||
@@ -5417,14 +5417,14 @@ static inline void check_phyreg(struct b
|
||||
static u16 b43_nphy_op_read(struct b43_wldev *dev, u16 reg)
|
||||
{
|
||||
check_phyreg(dev, reg);
|
||||
- b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
|
||||
+ b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
|
||||
return b43_read16(dev, B43_MMIO_PHY_DATA);
|
||||
}
|
||||
|
||||
static void b43_nphy_op_write(struct b43_wldev *dev, u16 reg, u16 value)
|
||||
{
|
||||
check_phyreg(dev, reg);
|
||||
- b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
|
||||
+ b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
|
||||
b43_write16(dev, B43_MMIO_PHY_DATA, value);
|
||||
}
|
||||
|
||||
@@ -5432,7 +5432,7 @@ static void b43_nphy_op_maskset(struct b
|
||||
u16 set)
|
||||
{
|
||||
check_phyreg(dev, reg);
|
||||
- b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
|
||||
+ b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
|
||||
b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set);
|
||||
}
|
||||
|
||||
@@ -5443,7 +5443,7 @@ static u16 b43_nphy_op_radio_read(struct
|
||||
/* N-PHY needs 0x100 for read access */
|
||||
reg |= 0x100;
|
||||
|
||||
- b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg);
|
||||
+ b43_wflush16(dev, B43_MMIO_RADIO_CONTROL, reg);
|
||||
return b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
|
||||
}
|
||||
|
||||
@@ -5452,7 +5452,7 @@ static void b43_nphy_op_radio_write(stru
|
||||
/* Register 1 is a 32-bit register. */
|
||||
B43_WARN_ON(reg == 1);
|
||||
|
||||
- b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg);
|
||||
+ b43_wflush16(dev, B43_MMIO_RADIO_CONTROL, reg);
|
||||
b43_write16(dev, B43_MMIO_RADIO_DATA_LOW, value);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/b43/dma.h
|
||||
+++ b/drivers/net/wireless/b43/dma.h
|
||||
@@ -169,7 +169,7 @@ struct b43_dmadesc_generic {
|
||||
|
||||
/* DMA engine tuning knobs */
|
||||
#define B43_TXRING_SLOTS 256
|
||||
-#define B43_RXRING_SLOTS 256
|
||||
+#define B43_RXRING_SLOTS 32
|
||||
#define B43_DMA0_RX_FW598_BUFSIZE (B43_DMA0_RX_FW598_FO + IEEE80211_MAX_FRAME_LEN)
|
||||
#define B43_DMA0_RX_FW351_BUFSIZE (B43_DMA0_RX_FW351_FO + IEEE80211_MAX_FRAME_LEN)
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -2757,6 +2757,14 @@ static int b43_gpio_init(struct b43_wlde
|
||||
} else if (dev->dev->chip_id == 0x5354) {
|
||||
/* Don't allow overtaking buttons GPIOs */
|
||||
set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */
|
||||
+ } else if (dev->dev->chip_id == BCMA_CHIP_ID_BCM4716 ||
|
||||
+ dev->dev->chip_id == BCMA_CHIP_ID_BCM47162 ||
|
||||
+ dev->dev->chip_id == BCMA_CHIP_ID_BCM5356 ||
|
||||
+ dev->dev->chip_id == BCMA_CHIP_ID_BCM5357 ||
|
||||
+ dev->dev->chip_id == BCMA_CHIP_ID_BCM53572) {
|
||||
+ /* just use gpio 0 and 1 for 2.4 GHz wifi led */
|
||||
+ set &= 0x3;
|
||||
+ mask &= 0x3;
|
||||
}
|
||||
|
||||
if (0 /* FIXME: conditional unknown */ ) {
|
||||
@@ -0,0 +1,31 @@
|
||||
--- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
|
||||
+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
|
||||
@@ -59,23 +59,16 @@
|
||||
|
||||
#define BRCM_2GHZ_2412_2462 REG_RULE(2412-10, 2462+10, 40, 0, 19, 0)
|
||||
#define BRCM_2GHZ_2467_2472 REG_RULE(2467-10, 2472+10, 20, 0, 19, \
|
||||
- NL80211_RRF_PASSIVE_SCAN | \
|
||||
- NL80211_RRF_NO_IBSS)
|
||||
+ 0)
|
||||
|
||||
#define BRCM_5GHZ_5180_5240 REG_RULE(5180-10, 5240+10, 40, 0, 21, \
|
||||
- NL80211_RRF_PASSIVE_SCAN | \
|
||||
- NL80211_RRF_NO_IBSS)
|
||||
+ 0)
|
||||
#define BRCM_5GHZ_5260_5320 REG_RULE(5260-10, 5320+10, 40, 0, 21, \
|
||||
- NL80211_RRF_PASSIVE_SCAN | \
|
||||
- NL80211_RRF_DFS | \
|
||||
- NL80211_RRF_NO_IBSS)
|
||||
+ 0)
|
||||
#define BRCM_5GHZ_5500_5700 REG_RULE(5500-10, 5700+10, 40, 0, 21, \
|
||||
- NL80211_RRF_PASSIVE_SCAN | \
|
||||
- NL80211_RRF_DFS | \
|
||||
- NL80211_RRF_NO_IBSS)
|
||||
+ 0)
|
||||
#define BRCM_5GHZ_5745_5825 REG_RULE(5745-10, 5825+10, 40, 0, 21, \
|
||||
- NL80211_RRF_PASSIVE_SCAN | \
|
||||
- NL80211_RRF_NO_IBSS)
|
||||
+ 0)
|
||||
|
||||
static const struct ieee80211_regdomain brcms_regdom_x2 = {
|
||||
.n_reg_rules = 6,
|
||||
Reference in New Issue
Block a user