Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
b5e41567
cloud-kernel
项目概览
openanolis
/
cloud-kernel
接近 2 年 前同步成功
通知
170
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
b5e41567
编写于
11月 16, 2010
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
上级
6b353088
b1d771ee
变更
148
展开全部
隐藏空白更改
内联
并排
Showing
148 changed file
with
5604 addition
and
2949 deletion
+5604
-2949
arch/arm/mach-omap2/board-omap3pandora.c
arch/arm/mach-omap2/board-omap3pandora.c
+9
-23
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath5k/base.c
+21
-3
drivers/net/wireless/ath/ath5k/debug.c
drivers/net/wireless/ath/ath5k/debug.c
+15
-15
drivers/net/wireless/ath/ath5k/desc.h
drivers/net/wireless/ath/ath5k/desc.h
+9
-9
drivers/net/wireless/ath/ath5k/phy.c
drivers/net/wireless/ath/ath5k/phy.c
+1
-7
drivers/net/wireless/ath/ath9k/ar5008_phy.c
drivers/net/wireless/ath/ath9k/ar5008_phy.c
+7
-7
drivers/net/wireless/ath/ath9k/ar9002_mac.c
drivers/net/wireless/ath/ath9k/ar9002_mac.c
+53
-70
drivers/net/wireless/ath/ath9k/ar9002_phy.c
drivers/net/wireless/ath/ath9k/ar9002_phy.c
+4
-4
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+15
-5
drivers/net/wireless/ath/ath9k/ar9003_mac.c
drivers/net/wireless/ath/ath9k/ar9003_mac.c
+36
-33
drivers/net/wireless/ath/ath9k/ar9003_mac.h
drivers/net/wireless/ath/ath9k/ar9003_mac.h
+3
-3
drivers/net/wireless/ath/ath9k/ar9003_phy.c
drivers/net/wireless/ath/ath9k/ar9003_phy.c
+7
-7
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/ath9k.h
+5
-9
drivers/net/wireless/ath/ath9k/beacon.c
drivers/net/wireless/ath/ath9k/beacon.c
+6
-6
drivers/net/wireless/ath/ath9k/common.c
drivers/net/wireless/ath/ath9k/common.c
+6
-9
drivers/net/wireless/ath/ath9k/common.h
drivers/net/wireless/ath/ath9k/common.h
+8
-6
drivers/net/wireless/ath/ath9k/debug.c
drivers/net/wireless/ath/ath9k/debug.c
+25
-23
drivers/net/wireless/ath/ath9k/debug.h
drivers/net/wireless/ath/ath9k/debug.h
+2
-3
drivers/net/wireless/ath/ath9k/eeprom.h
drivers/net/wireless/ath/ath9k/eeprom.h
+2
-1
drivers/net/wireless/ath/ath9k/eeprom_4k.c
drivers/net/wireless/ath/ath9k/eeprom_4k.c
+7
-2
drivers/net/wireless/ath/ath9k/eeprom_9287.c
drivers/net/wireless/ath/ath9k/eeprom_9287.c
+15
-12
drivers/net/wireless/ath/ath9k/eeprom_def.c
drivers/net/wireless/ath/ath9k/eeprom_def.c
+33
-29
drivers/net/wireless/ath/ath9k/gpio.c
drivers/net/wireless/ath/ath9k/gpio.c
+4
-6
drivers/net/wireless/ath/ath9k/htc_drv_main.c
drivers/net/wireless/ath/ath9k/htc_drv_main.c
+9
-61
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+8
-1
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.c
+4
-5
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/ath/ath9k/hw.h
+8
-8
drivers/net/wireless/ath/ath9k/init.c
drivers/net/wireless/ath/ath9k/init.c
+41
-47
drivers/net/wireless/ath/ath9k/mac.c
drivers/net/wireless/ath/ath9k/mac.c
+50
-36
drivers/net/wireless/ath/ath9k/mac.h
drivers/net/wireless/ath/ath9k/mac.h
+6
-7
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/main.c
+54
-113
drivers/net/wireless/ath/ath9k/pci.c
drivers/net/wireless/ath/ath9k/pci.c
+22
-18
drivers/net/wireless/ath/ath9k/rc.c
drivers/net/wireless/ath/ath9k/rc.c
+5
-26
drivers/net/wireless/ath/ath9k/recv.c
drivers/net/wireless/ath/ath9k/recv.c
+15
-27
drivers/net/wireless/ath/ath9k/virtual.c
drivers/net/wireless/ath/ath9k/virtual.c
+2
-1
drivers/net/wireless/ath/ath9k/xmit.c
drivers/net/wireless/ath/ath9k/xmit.c
+45
-57
drivers/net/wireless/ath/carl9170/carl9170.h
drivers/net/wireless/ath/carl9170/carl9170.h
+3
-2
drivers/net/wireless/ath/carl9170/fwcmd.h
drivers/net/wireless/ath/carl9170/fwcmd.h
+9
-4
drivers/net/wireless/ath/carl9170/hw.h
drivers/net/wireless/ath/carl9170/hw.h
+6
-1
drivers/net/wireless/ath/carl9170/mac.c
drivers/net/wireless/ath/carl9170/mac.c
+34
-22
drivers/net/wireless/ath/carl9170/main.c
drivers/net/wireless/ath/carl9170/main.c
+18
-1
drivers/net/wireless/ath/carl9170/phy.c
drivers/net/wireless/ath/carl9170/phy.c
+4
-13
drivers/net/wireless/ath/carl9170/phy.h
drivers/net/wireless/ath/carl9170/phy.h
+12
-12
drivers/net/wireless/ath/carl9170/tx.c
drivers/net/wireless/ath/carl9170/tx.c
+67
-13
drivers/net/wireless/ath/carl9170/usb.c
drivers/net/wireless/ath/carl9170/usb.c
+1
-1
drivers/net/wireless/ath/carl9170/version.h
drivers/net/wireless/ath/carl9170/version.h
+3
-3
drivers/net/wireless/ath/debug.h
drivers/net/wireless/ath/debug.h
+2
-0
drivers/net/wireless/ath/key.c
drivers/net/wireless/ath/key.c
+5
-4
drivers/net/wireless/b43/b43.h
drivers/net/wireless/b43/b43.h
+13
-0
drivers/net/wireless/b43/dma.c
drivers/net/wireless/b43/dma.c
+0
-5
drivers/net/wireless/b43/phy_n.c
drivers/net/wireless/b43/phy_n.c
+9
-5
drivers/net/wireless/b43/radio_2055.c
drivers/net/wireless/b43/radio_2055.c
+5
-3
drivers/net/wireless/b43/radio_2056.c
drivers/net/wireless/b43/radio_2056.c
+51
-0
drivers/net/wireless/b43/radio_2056.h
drivers/net/wireless/b43/radio_2056.h
+1078
-3
drivers/net/wireless/b43legacy/rfkill.c
drivers/net/wireless/b43legacy/rfkill.c
+1
-1
drivers/net/wireless/iwlwifi/Kconfig
drivers/net/wireless/iwlwifi/Kconfig
+3
-0
drivers/net/wireless/iwlwifi/Makefile
drivers/net/wireless/iwlwifi/Makefile
+5
-2
drivers/net/wireless/iwlwifi/iwl-1000.c
drivers/net/wireless/iwlwifi/iwl-1000.c
+8
-5
drivers/net/wireless/iwlwifi/iwl-3945.c
drivers/net/wireless/iwlwifi/iwl-3945.c
+17
-5
drivers/net/wireless/iwlwifi/iwl-3945.h
drivers/net/wireless/iwlwifi/iwl-3945.h
+4
-4
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-4965.c
+321
-31
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-5000.c
+16
-10
drivers/net/wireless/iwlwifi/iwl-6000.c
drivers/net/wireless/iwlwifi/iwl-6000.c
+25
-21
drivers/net/wireless/iwlwifi/iwl-agn-calib.c
drivers/net/wireless/iwlwifi/iwl-agn-calib.c
+124
-106
drivers/net/wireless/iwlwifi/iwl-agn-lib.c
drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+32
-21
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
+619
-0
drivers/net/wireless/iwlwifi/iwl-agn-sta.c
drivers/net/wireless/iwlwifi/iwl-agn-sta.c
+31
-1
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-agn.c
+75
-418
drivers/net/wireless/iwlwifi/iwl-agn.h
drivers/net/wireless/iwlwifi/iwl-agn.h
+40
-1
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-core.c
+153
-688
drivers/net/wireless/iwlwifi/iwl-core.h
drivers/net/wireless/iwlwifi/iwl-core.h
+40
-30
drivers/net/wireless/iwlwifi/iwl-csr.h
drivers/net/wireless/iwlwifi/iwl-csr.h
+2
-0
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-dev.h
+3
-0
drivers/net/wireless/iwlwifi/iwl-led.c
drivers/net/wireless/iwlwifi/iwl-led.c
+2
-0
drivers/net/wireless/iwlwifi/iwl-legacy.c
drivers/net/wireless/iwlwifi/iwl-legacy.c
+662
-0
drivers/net/wireless/iwlwifi/iwl-legacy.h
drivers/net/wireless/iwlwifi/iwl-legacy.h
+79
-0
drivers/net/wireless/iwlwifi/iwl-power.c
drivers/net/wireless/iwlwifi/iwl-power.c
+60
-35
drivers/net/wireless/iwlwifi/iwl-power.h
drivers/net/wireless/iwlwifi/iwl-power.h
+3
-0
drivers/net/wireless/iwlwifi/iwl-rx.c
drivers/net/wireless/iwlwifi/iwl-rx.c
+27
-18
drivers/net/wireless/iwlwifi/iwl-scan.c
drivers/net/wireless/iwlwifi/iwl-scan.c
+7
-4
drivers/net/wireless/iwlwifi/iwl-tx.c
drivers/net/wireless/iwlwifi/iwl-tx.c
+30
-21
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
+25
-24
drivers/net/wireless/mac80211_hwsim.c
drivers/net/wireless/mac80211_hwsim.c
+4
-1
drivers/net/wireless/mwl8k.c
drivers/net/wireless/mwl8k.c
+6
-1
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2400pci.c
+6
-8
drivers/net/wireless/rt2x00/rt2400pci.h
drivers/net/wireless/rt2x00/rt2400pci.h
+3
-3
drivers/net/wireless/rt2x00/rt2500pci.c
drivers/net/wireless/rt2x00/rt2500pci.c
+9
-11
drivers/net/wireless/rt2x00/rt2500pci.h
drivers/net/wireless/rt2x00/rt2500pci.h
+2
-2
drivers/net/wireless/rt2x00/rt2500usb.c
drivers/net/wireless/rt2x00/rt2500usb.c
+10
-12
drivers/net/wireless/rt2x00/rt2800.h
drivers/net/wireless/rt2x00/rt2800.h
+48
-13
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/rt2x00/rt2800lib.c
+37
-6
drivers/net/wireless/rt2x00/rt2800pci.c
drivers/net/wireless/rt2x00/rt2800pci.c
+7
-9
drivers/net/wireless/rt2x00/rt2800pci.h
drivers/net/wireless/rt2x00/rt2800pci.h
+6
-6
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rt2x00/rt2800usb.c
+54
-12
drivers/net/wireless/rt2x00/rt2800usb.h
drivers/net/wireless/rt2x00/rt2800usb.h
+2
-2
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00.h
+1
-0
drivers/net/wireless/rt2x00/rt2x00config.c
drivers/net/wireless/rt2x00/rt2x00config.c
+5
-3
drivers/net/wireless/rt2x00/rt2x00debug.c
drivers/net/wireless/rt2x00/rt2x00debug.c
+5
-5
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt2x00dev.c
+15
-22
drivers/net/wireless/rt2x00/rt2x00lib.h
drivers/net/wireless/rt2x00/rt2x00lib.h
+1
-2
drivers/net/wireless/rt2x00/rt2x00link.c
drivers/net/wireless/rt2x00/rt2x00link.c
+1
-1
drivers/net/wireless/rt2x00/rt2x00mac.c
drivers/net/wireless/rt2x00/rt2x00mac.c
+42
-10
drivers/net/wireless/rt2x00/rt2x00pci.c
drivers/net/wireless/rt2x00/rt2x00pci.c
+1
-1
drivers/net/wireless/rt2x00/rt2x00queue.c
drivers/net/wireless/rt2x00/rt2x00queue.c
+14
-25
drivers/net/wireless/rt2x00/rt2x00queue.h
drivers/net/wireless/rt2x00/rt2x00queue.h
+4
-29
drivers/net/wireless/rt2x00/rt2x00reg.h
drivers/net/wireless/rt2x00/rt2x00reg.h
+0
-2
drivers/net/wireless/rt2x00/rt2x00usb.c
drivers/net/wireless/rt2x00/rt2x00usb.c
+3
-22
drivers/net/wireless/rt2x00/rt61pci.c
drivers/net/wireless/rt2x00/rt61pci.c
+13
-15
drivers/net/wireless/rt2x00/rt61pci.h
drivers/net/wireless/rt2x00/rt61pci.h
+1
-1
drivers/net/wireless/rt2x00/rt73usb.c
drivers/net/wireless/rt2x00/rt73usb.c
+10
-12
drivers/net/wireless/rt2x00/rt73usb.h
drivers/net/wireless/rt2x00/rt73usb.h
+1
-1
drivers/net/wireless/rtl818x/rtl8187_dev.c
drivers/net/wireless/rtl818x/rtl8187_dev.c
+71
-69
drivers/net/wireless/rtl818x/rtl8187_rtl8225.c
drivers/net/wireless/rtl818x/rtl8187_rtl8225.c
+0
-22
drivers/net/wireless/wl1251/main.c
drivers/net/wireless/wl1251/main.c
+9
-6
drivers/net/wireless/wl1251/sdio.c
drivers/net/wireless/wl1251/sdio.c
+66
-35
drivers/net/wireless/wl1251/spi.c
drivers/net/wireless/wl1251/spi.c
+9
-0
drivers/net/wireless/wl1251/wl1251.h
drivers/net/wireless/wl1251/wl1251.h
+1
-0
drivers/net/wireless/wl12xx/Kconfig
drivers/net/wireless/wl12xx/Kconfig
+11
-1
drivers/net/wireless/wl12xx/wl1271.h
drivers/net/wireless/wl12xx/wl1271.h
+12
-1
drivers/net/wireless/wl12xx/wl1271_acx.c
drivers/net/wireless/wl12xx/wl1271_acx.c
+83
-0
drivers/net/wireless/wl12xx/wl1271_acx.h
drivers/net/wireless/wl12xx/wl1271_acx.h
+88
-1
drivers/net/wireless/wl12xx/wl1271_boot.c
drivers/net/wireless/wl12xx/wl1271_boot.c
+4
-6
drivers/net/wireless/wl12xx/wl1271_debugfs.c
drivers/net/wireless/wl12xx/wl1271_debugfs.c
+111
-104
drivers/net/wireless/wl12xx/wl1271_event.c
drivers/net/wireless/wl12xx/wl1271_event.c
+0
-2
drivers/net/wireless/wl12xx/wl1271_main.c
drivers/net/wireless/wl12xx/wl1271_main.c
+177
-43
drivers/net/wireless/wl12xx/wl1271_rx.c
drivers/net/wireless/wl12xx/wl1271_rx.c
+23
-5
drivers/net/wireless/wl12xx/wl1271_rx.h
drivers/net/wireless/wl12xx/wl1271_rx.h
+1
-1
drivers/net/wireless/wl12xx/wl1271_scan.c
drivers/net/wireless/wl12xx/wl1271_scan.c
+3
-2
drivers/net/wireless/wl12xx/wl1271_testmode.c
drivers/net/wireless/wl12xx/wl1271_testmode.c
+12
-0
drivers/net/wireless/wl12xx/wl1271_tx.c
drivers/net/wireless/wl12xx/wl1271_tx.c
+90
-42
drivers/net/wireless/wl12xx/wl1271_tx.h
drivers/net/wireless/wl12xx/wl1271_tx.h
+2
-1
drivers/net/wireless/zd1201.c
drivers/net/wireless/zd1201.c
+1
-0
drivers/net/wireless/zd1211rw/zd_usb.c
drivers/net/wireless/zd1211rw/zd_usb.c
+2
-0
drivers/ssb/pcihost_wrapper.c
drivers/ssb/pcihost_wrapper.c
+7
-0
include/linux/bitops.h
include/linux/bitops.h
+11
-0
include/linux/nl80211.h
include/linux/nl80211.h
+5
-1
include/linux/rfkill.h
include/linux/rfkill.h
+0
-31
include/linux/wl12xx.h
include/linux/wl12xx.h
+8
-0
include/net/cfg80211.h
include/net/cfg80211.h
+8
-7
net/mac80211/aes_ccm.c
net/mac80211/aes_ccm.c
+1
-2
net/mac80211/aes_cmac.c
net/mac80211/aes_cmac.c
+1
-2
net/mac80211/debugfs.c
net/mac80211/debugfs.c
+31
-29
net/mac80211/debugfs.h
net/mac80211/debugfs.h
+2
-0
net/mac80211/debugfs_key.c
net/mac80211/debugfs_key.c
+9
-10
net/mac80211/debugfs_sta.c
net/mac80211/debugfs_sta.c
+10
-16
net/mac80211/rc80211_minstrel_ht.c
net/mac80211/rc80211_minstrel_ht.c
+10
-6
net/rfkill/core.c
net/rfkill/core.c
+0
-14
net/wireless/reg.c
net/wireless/reg.c
+118
-16
未找到文件。
arch/arm/mach-omap2/board-omap3pandora.c
浏览文件 @
b5e41567
...
...
@@ -642,31 +642,13 @@ static void __init omap3pandora_init_irq(void)
omap_gpio_init
();
}
static
void
pandora_wl1251_set_power
(
bool
enable
)
{
/*
* Keep power always on until wl1251_sdio driver learns to re-init
* the chip after powering it down and back up.
*/
}
static
struct
wl12xx_platform_data
pandora_wl1251_pdata
=
{
.
set_power
=
pandora_wl1251_set_power
,
.
use_eeprom
=
true
,
};
static
struct
platform_device
pandora_wl1251_data
=
{
.
name
=
"wl1251_data"
,
.
id
=
-
1
,
.
dev
=
{
.
platform_data
=
&
pandora_wl1251_pdata
,
},
};
static
void
pandora_wl1251_init
(
void
)
static
void
__init
pandora_wl1251_init
(
void
)
{
struct
wl12xx_platform_data
pandora_wl1251_pdata
;
int
ret
;
memset
(
&
pandora_wl1251_pdata
,
0
,
sizeof
(
pandora_wl1251_pdata
));
ret
=
gpio_request
(
PANDORA_WIFI_IRQ_GPIO
,
"wl1251 irq"
);
if
(
ret
<
0
)
goto
fail
;
...
...
@@ -679,6 +661,11 @@ static void pandora_wl1251_init(void)
if
(
pandora_wl1251_pdata
.
irq
<
0
)
goto
fail_irq
;
pandora_wl1251_pdata
.
use_eeprom
=
true
;
ret
=
wl12xx_set_platform_data
(
&
pandora_wl1251_pdata
);
if
(
ret
<
0
)
goto
fail_irq
;
return
;
fail_irq:
...
...
@@ -691,7 +678,6 @@ static struct platform_device *omap3pandora_devices[] __initdata = {
&
pandora_leds_gpio
,
&
pandora_keys_gpio
,
&
pandora_dss_device
,
&
pandora_wl1251_data
,
&
pandora_vwlan_device
,
};
...
...
drivers/net/wireless/ath/ath5k/base.c
浏览文件 @
b5e41567
...
...
@@ -566,8 +566,8 @@ static void ath_do_set_opmode(struct ath5k_softc *sc)
sc
->
opmode
,
ath_opmode_to_string
(
sc
->
opmode
));
}
void
ath5k_update_bssid_mask_and_opmode
(
struct
ath5k_softc
*
sc
,
struct
ieee80211_vif
*
vif
)
static
void
ath5k_update_bssid_mask_and_opmode
(
struct
ath5k_softc
*
sc
,
struct
ieee80211_vif
*
vif
)
{
struct
ath_common
*
common
=
ath5k_hw_common
(
sc
->
ah
);
struct
ath_vif_iter_data
iter_data
;
...
...
@@ -3206,14 +3206,32 @@ static int ath5k_get_survey(struct ieee80211_hw *hw, int idx,
{
struct
ath5k_softc
*
sc
=
hw
->
priv
;
struct
ieee80211_conf
*
conf
=
&
hw
->
conf
;
struct
ath_common
*
common
=
ath5k_hw_common
(
sc
->
ah
);
struct
ath_cycle_counters
*
cc
=
&
common
->
cc_survey
;
unsigned
int
div
=
common
->
clockrate
*
1000
;
if
(
idx
!=
0
)
if
(
idx
!=
0
)
return
-
ENOENT
;
survey
->
channel
=
conf
->
channel
;
survey
->
filled
=
SURVEY_INFO_NOISE_DBM
;
survey
->
noise
=
sc
->
ah
->
ah_noise_floor
;
spin_lock_bh
(
&
common
->
cc_lock
);
ath_hw_cycle_counters_update
(
common
);
if
(
cc
->
cycles
>
0
)
{
survey
->
filled
|=
SURVEY_INFO_CHANNEL_TIME
|
SURVEY_INFO_CHANNEL_TIME_BUSY
|
SURVEY_INFO_CHANNEL_TIME_RX
|
SURVEY_INFO_CHANNEL_TIME_TX
;
survey
->
channel_time
+=
cc
->
cycles
/
div
;
survey
->
channel_time_busy
+=
cc
->
rx_busy
/
div
;
survey
->
channel_time_rx
+=
cc
->
rx_frame
/
div
;
survey
->
channel_time_tx
+=
cc
->
tx_frame
/
div
;
}
memset
(
cc
,
0
,
sizeof
(
*
cc
));
spin_unlock_bh
(
&
common
->
cc_lock
);
return
0
;
}
...
...
drivers/net/wireless/ath/ath5k/debug.c
浏览文件 @
b5e41567
...
...
@@ -554,63 +554,63 @@ static ssize_t read_file_frameerrors(struct file *file, char __user *user_buf,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"RX
\n
---------------------
\n
"
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"CRC
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"CRC
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
rxerr_crc
,
st
->
rx_all_count
>
0
?
st
->
rxerr_crc
*
100
/
st
->
rx_all_count
:
0
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"PHY
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"PHY
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
rxerr_phy
,
st
->
rx_all_count
>
0
?
st
->
rxerr_phy
*
100
/
st
->
rx_all_count
:
0
);
for
(
i
=
0
;
i
<
32
;
i
++
)
{
if
(
st
->
rxerr_phy_code
[
i
])
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
" phy_err[%
d]
\t
%d
\n
"
,
" phy_err[%
u]
\t
%u
\n
"
,
i
,
st
->
rxerr_phy_code
[
i
]);
}
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"FIFO
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"FIFO
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
rxerr_fifo
,
st
->
rx_all_count
>
0
?
st
->
rxerr_fifo
*
100
/
st
->
rx_all_count
:
0
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"decrypt
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"decrypt
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
rxerr_decrypt
,
st
->
rx_all_count
>
0
?
st
->
rxerr_decrypt
*
100
/
st
->
rx_all_count
:
0
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"MIC
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"MIC
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
rxerr_mic
,
st
->
rx_all_count
>
0
?
st
->
rxerr_mic
*
100
/
st
->
rx_all_count
:
0
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"process
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"process
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
rxerr_proc
,
st
->
rx_all_count
>
0
?
st
->
rxerr_proc
*
100
/
st
->
rx_all_count
:
0
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"jumbo
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"jumbo
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
rxerr_jumbo
,
st
->
rx_all_count
>
0
?
st
->
rxerr_jumbo
*
100
/
st
->
rx_all_count
:
0
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"[RX all
\t
%
d
]
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"[RX all
\t
%
u
]
\n
"
,
st
->
rx_all_count
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"RX-all-bytes
\t
%
d
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"RX-all-bytes
\t
%
u
\n
"
,
st
->
rx_bytes_count
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"
\n
TX
\n
---------------------
\n
"
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"retry
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"retry
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
txerr_retry
,
st
->
tx_all_count
>
0
?
st
->
txerr_retry
*
100
/
st
->
tx_all_count
:
0
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"FIFO
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"FIFO
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
txerr_fifo
,
st
->
tx_all_count
>
0
?
st
->
txerr_fifo
*
100
/
st
->
tx_all_count
:
0
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"filter
\t
%
d
\t
(%d
%%)
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"filter
\t
%
u
\t
(%u
%%)
\n
"
,
st
->
txerr_filt
,
st
->
tx_all_count
>
0
?
st
->
txerr_filt
*
100
/
st
->
tx_all_count
:
0
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"[TX all
\t
%
d
]
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"[TX all
\t
%
u
]
\n
"
,
st
->
tx_all_count
);
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"TX-all-bytes
\t
%
d
\n
"
,
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"TX-all-bytes
\t
%
u
\n
"
,
st
->
tx_bytes_count
);
if
(
len
>
sizeof
(
buf
))
...
...
drivers/net/wireless/ath/ath5k/desc.h
浏览文件 @
b5e41567
...
...
@@ -26,7 +26,7 @@
struct
ath5k_hw_rx_ctl
{
u32
rx_control_0
;
/* RX control word 0 */
u32
rx_control_1
;
/* RX control word 1 */
}
__packed
;
}
__packed
__aligned
(
4
)
;
/* RX control word 1 fields/flags */
#define AR5K_DESC_RX_CTL1_BUF_LEN 0x00000fff
/* data buffer length */
...
...
@@ -39,7 +39,7 @@ struct ath5k_hw_rx_ctl {
struct
ath5k_hw_rx_status
{
u32
rx_status_0
;
/* RX status word 0 */
u32
rx_status_1
;
/* RX status word 1 */
}
__packed
;
}
__packed
__aligned
(
4
)
;
/* 5210/5211 */
/* RX status word 0 fields/flags */
...
...
@@ -129,7 +129,7 @@ enum ath5k_phy_error_code {
struct
ath5k_hw_2w_tx_ctl
{
u32
tx_control_0
;
/* TX control word 0 */
u32
tx_control_1
;
/* TX control word 1 */
}
__packed
;
}
__packed
__aligned
(
4
)
;
/* TX control word 0 fields/flags */
#define AR5K_2W_TX_DESC_CTL0_FRAME_LEN 0x00000fff
/* frame length */
...
...
@@ -185,7 +185,7 @@ struct ath5k_hw_4w_tx_ctl {
u32
tx_control_1
;
/* TX control word 1 */
u32
tx_control_2
;
/* TX control word 2 */
u32
tx_control_3
;
/* TX control word 3 */
}
__packed
;
}
__packed
__aligned
(
4
)
;
/* TX control word 0 fields/flags */
#define AR5K_4W_TX_DESC_CTL0_FRAME_LEN 0x00000fff
/* frame length */
...
...
@@ -244,7 +244,7 @@ struct ath5k_hw_4w_tx_ctl {
struct
ath5k_hw_tx_status
{
u32
tx_status_0
;
/* TX status word 0 */
u32
tx_status_1
;
/* TX status word 1 */
}
__packed
;
}
__packed
__aligned
(
4
)
;
/* TX status word 0 fields/flags */
#define AR5K_DESC_TX_STATUS0_FRAME_XMIT_OK 0x00000001
/* TX success */
...
...
@@ -282,7 +282,7 @@ struct ath5k_hw_tx_status {
struct
ath5k_hw_5210_tx_desc
{
struct
ath5k_hw_2w_tx_ctl
tx_ctl
;
struct
ath5k_hw_tx_status
tx_stat
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
/*
* 5212 hardware TX descriptor
...
...
@@ -290,7 +290,7 @@ struct ath5k_hw_5210_tx_desc {
struct
ath5k_hw_5212_tx_desc
{
struct
ath5k_hw_4w_tx_ctl
tx_ctl
;
struct
ath5k_hw_tx_status
tx_stat
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
/*
* Common hardware RX descriptor
...
...
@@ -298,7 +298,7 @@ struct ath5k_hw_5212_tx_desc {
struct
ath5k_hw_all_rx_desc
{
struct
ath5k_hw_rx_ctl
rx_ctl
;
struct
ath5k_hw_rx_status
rx_stat
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
/*
* Atheros hardware DMA descriptor
...
...
@@ -313,7 +313,7 @@ struct ath5k_desc {
struct
ath5k_hw_5212_tx_desc
ds_tx5212
;
struct
ath5k_hw_all_rx_desc
ds_rx
;
}
ud
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
#define AR5K_RXDESC_INTREQ 0x0020
...
...
drivers/net/wireless/ath/ath5k/phy.c
浏览文件 @
b5e41567
...
...
@@ -1102,18 +1102,12 @@ int ath5k_hw_channel(struct ath5k_hw *ah, struct ieee80211_channel *channel)
PHY calibration
\*****************/
static
int
sign_extend
(
int
val
,
const
int
nbits
)
{
int
order
=
BIT
(
nbits
-
1
);
return
(
val
^
order
)
-
order
;
}
static
s32
ath5k_hw_read_measured_noise_floor
(
struct
ath5k_hw
*
ah
)
{
s32
val
;
val
=
ath5k_hw_reg_read
(
ah
,
AR5K_PHY_NF
);
return
sign_extend
(
AR5K_REG_MS
(
val
,
AR5K_PHY_NF_MINCCA_PWR
),
9
);
return
sign_extend
32
(
AR5K_REG_MS
(
val
,
AR5K_PHY_NF_MINCCA_PWR
),
8
);
}
void
ath5k_hw_init_nfcal_hist
(
struct
ath5k_hw
*
ah
)
...
...
drivers/net/wireless/ath/ath9k/ar5008_phy.c
浏览文件 @
b5e41567
...
...
@@ -873,7 +873,7 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
channel
->
max_antenna_gain
*
2
,
channel
->
max_power
*
2
,
min
((
u32
)
MAX_RATE_POWER
,
(
u32
)
regulatory
->
power_limit
));
(
u32
)
regulatory
->
power_limit
)
,
false
);
/* Write analog registers */
if
(
!
ath9k_hw_set_rf_regs
(
ah
,
chan
,
freqIndex
))
{
...
...
@@ -1490,25 +1490,25 @@ static void ar5008_hw_do_getnf(struct ath_hw *ah,
int16_t
nf
;
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CCA
),
AR_PHY_MINCCA_PWR
);
nfarray
[
0
]
=
sign_extend
(
nf
,
9
);
nfarray
[
0
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CH1_CCA
),
AR_PHY_CH1_MINCCA_PWR
);
nfarray
[
1
]
=
sign_extend
(
nf
,
9
);
nfarray
[
1
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CH2_CCA
),
AR_PHY_CH2_MINCCA_PWR
);
nfarray
[
2
]
=
sign_extend
(
nf
,
9
);
nfarray
[
2
]
=
sign_extend
32
(
nf
,
8
);
if
(
!
IS_CHAN_HT40
(
ah
->
curchan
))
return
;
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_EXT_CCA
),
AR_PHY_EXT_MINCCA_PWR
);
nfarray
[
3
]
=
sign_extend
(
nf
,
9
);
nfarray
[
3
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CH1_EXT_CCA
),
AR_PHY_CH1_EXT_MINCCA_PWR
);
nfarray
[
4
]
=
sign_extend
(
nf
,
9
);
nfarray
[
4
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CH2_EXT_CCA
),
AR_PHY_CH2_EXT_MINCCA_PWR
);
nfarray
[
5
]
=
sign_extend
(
nf
,
9
);
nfarray
[
5
]
=
sign_extend
32
(
nf
,
8
);
}
/*
...
...
drivers/net/wireless/ath/ath9k/ar9002_mac.c
浏览文件 @
b5e41567
...
...
@@ -90,13 +90,10 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
*
masked
=
isr
&
ATH9K_INT_COMMON
;
if
(
ah
->
config
.
rx_intr_mitigation
)
{
if
(
isr
&
(
AR_ISR_RXMINTR
|
AR_ISR_RXINTM
))
*
masked
|=
ATH9K_INT_RX
;
}
if
(
isr
&
(
AR_ISR_RXOK
|
AR_ISR_RXERR
))
if
(
isr
&
(
AR_ISR_RXMINTR
|
AR_ISR_RXINTM
|
AR_ISR_RXOK
|
AR_ISR_RXERR
))
*
masked
|=
ATH9K_INT_RX
;
if
(
isr
&
(
AR_ISR_TXOK
|
AR_ISR_TXDESC
|
AR_ISR_TXERR
|
AR_ISR_TXEOL
))
{
...
...
@@ -118,14 +115,6 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
"receive FIFO overrun interrupt
\n
"
);
}
if
(
!
AR_SREV_9100
(
ah
))
{
if
(
!
(
pCap
->
hw_caps
&
ATH9K_HW_CAP_AUTOSLEEP
))
{
u32
isr5
=
REG_READ
(
ah
,
AR_ISR_S5_S
);
if
(
isr5
&
AR_ISR_S5_TIM_TIMER
)
*
masked
|=
ATH9K_INT_TIM_TIMER
;
}
}
*
masked
|=
mask2
;
}
...
...
@@ -136,17 +125,18 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
u32
s5_s
;
s5_s
=
REG_READ
(
ah
,
AR_ISR_S5_S
);
if
(
isr
&
AR_ISR_GENTMR
)
{
ah
->
intr_gen_timer_trigger
=
ah
->
intr_gen_timer_trigger
=
MS
(
s5_s
,
AR_ISR_S5_GENTIMER_TRIG
);
ah
->
intr_gen_timer_thresh
=
MS
(
s5_s
,
AR_ISR_S5_GENTIMER_THRESH
);
ah
->
intr_gen_timer_thresh
=
MS
(
s5_s
,
AR_ISR_S5_GENTIMER_THRESH
);
if
(
ah
->
intr_gen_timer_trigger
)
*
masked
|=
ATH9K_INT_GENTIMER
;
if
(
ah
->
intr_gen_timer_trigger
)
*
masked
|=
ATH9K_INT_GENTIMER
;
}
if
((
s5_s
&
AR_ISR_S5_TIM_TIMER
)
&&
!
(
pCap
->
hw_caps
&
ATH9K_HW_CAP_AUTOSLEEP
))
*
masked
|=
ATH9K_INT_TIM_TIMER
;
}
if
(
sync_cause
)
{
...
...
@@ -218,77 +208,70 @@ static int ar9002_hw_proc_txdesc(struct ath_hw *ah, void *ds,
struct
ath_tx_status
*
ts
)
{
struct
ar5416_desc
*
ads
=
AR5416DESC
(
ds
);
u32
status
;
if
((
ads
->
ds_txstatus9
&
AR_TxDone
)
==
0
)
status
=
ACCESS_ONCE
(
ads
->
ds_txstatus9
);
if
((
status
&
AR_TxDone
)
==
0
)
return
-
EINPROGRESS
;
ts
->
ts_seqnum
=
MS
(
ads
->
ds_txstatus9
,
AR_SeqNum
);
ts
->
ts_tstamp
=
ads
->
AR_SendTimestamp
;
ts
->
ts_status
=
0
;
ts
->
ts_flags
=
0
;
if
(
ads
->
ds_txstatus1
&
AR_FrmXmitOK
)
if
(
status
&
AR_TxOpExceeded
)
ts
->
ts_status
|=
ATH9K_TXERR_XTXOP
;
ts
->
tid
=
MS
(
status
,
AR_TxTid
);
ts
->
ts_rateindex
=
MS
(
status
,
AR_FinalTxIdx
);
ts
->
ts_seqnum
=
MS
(
status
,
AR_SeqNum
);
status
=
ACCESS_ONCE
(
ads
->
ds_txstatus0
);
ts
->
ts_rssi_ctl0
=
MS
(
status
,
AR_TxRSSIAnt00
);
ts
->
ts_rssi_ctl1
=
MS
(
status
,
AR_TxRSSIAnt01
);
ts
->
ts_rssi_ctl2
=
MS
(
status
,
AR_TxRSSIAnt02
);
if
(
status
&
AR_TxBaStatus
)
{
ts
->
ts_flags
|=
ATH9K_TX_BA
;
ts
->
ba_low
=
ads
->
AR_BaBitmapLow
;
ts
->
ba_high
=
ads
->
AR_BaBitmapHigh
;
}
status
=
ACCESS_ONCE
(
ads
->
ds_txstatus1
);
if
(
status
&
AR_FrmXmitOK
)
ts
->
ts_status
|=
ATH9K_TX_ACKED
;
if
(
ads
->
ds_txstatus1
&
AR_ExcessiveRetries
)
ts
->
ts_status
|=
ATH9K_TXERR_XRETRY
;
if
(
ads
->
ds_txstatus1
&
AR_Filtered
)
ts
->
ts_status
|=
ATH9K_TXERR_FILT
;
if
(
ads
->
ds_txstatus1
&
AR_FIFOUnderrun
)
{
ts
->
ts_status
|=
ATH9K_TXERR_FIFO
;
ath9k_hw_updatetxtriglevel
(
ah
,
true
);
else
{
if
(
status
&
AR_ExcessiveRetries
)
ts
->
ts_status
|=
ATH9K_TXERR_XRETRY
;
if
(
status
&
AR_Filtered
)
ts
->
ts_status
|=
ATH9K_TXERR_FILT
;
if
(
status
&
AR_FIFOUnderrun
)
{
ts
->
ts_status
|=
ATH9K_TXERR_FIFO
;
ath9k_hw_updatetxtriglevel
(
ah
,
true
);
}
}
if
(
ads
->
ds_txstatus9
&
AR_TxOpExceeded
)
ts
->
ts_status
|=
ATH9K_TXERR_XTXOP
;
if
(
ads
->
ds_txstatus1
&
AR_TxTimerExpired
)
if
(
status
&
AR_TxTimerExpired
)
ts
->
ts_status
|=
ATH9K_TXERR_TIMER_EXPIRED
;
if
(
ads
->
ds_txstatus1
&
AR_DescCfgErr
)
if
(
status
&
AR_DescCfgErr
)
ts
->
ts_flags
|=
ATH9K_TX_DESC_CFG_ERR
;
if
(
ads
->
ds_txstatus1
&
AR_TxDataUnderrun
)
{
if
(
status
&
AR_TxDataUnderrun
)
{
ts
->
ts_flags
|=
ATH9K_TX_DATA_UNDERRUN
;
ath9k_hw_updatetxtriglevel
(
ah
,
true
);
}
if
(
ads
->
ds_txstatus1
&
AR_TxDelimUnderrun
)
{
if
(
status
&
AR_TxDelimUnderrun
)
{
ts
->
ts_flags
|=
ATH9K_TX_DELIM_UNDERRUN
;
ath9k_hw_updatetxtriglevel
(
ah
,
true
);
}
if
(
ads
->
ds_txstatus0
&
AR_TxBaStatus
)
{
ts
->
ts_flags
|=
ATH9K_TX_BA
;
ts
->
ba_low
=
ads
->
AR_BaBitmapLow
;
ts
->
ba_high
=
ads
->
AR_BaBitmapHigh
;
}
ts
->
ts_shortretry
=
MS
(
status
,
AR_RTSFailCnt
);
ts
->
ts_longretry
=
MS
(
status
,
AR_DataFailCnt
);
ts
->
ts_virtcol
=
MS
(
status
,
AR_VirtRetryCnt
);
ts
->
ts_rateindex
=
MS
(
ads
->
ds_txstatus9
,
AR_FinalTxIdx
);
switch
(
ts
->
ts_rateindex
)
{
case
0
:
ts
->
ts_ratecode
=
MS
(
ads
->
ds_ctl3
,
AR_XmitRate0
);
break
;
case
1
:
ts
->
ts_ratecode
=
MS
(
ads
->
ds_ctl3
,
AR_XmitRate1
);
break
;
case
2
:
ts
->
ts_ratecode
=
MS
(
ads
->
ds_ctl3
,
AR_XmitRate2
);
break
;
case
3
:
ts
->
ts_ratecode
=
MS
(
ads
->
ds_ctl3
,
AR_XmitRate3
);
break
;
}
status
=
ACCESS_ONCE
(
ads
->
ds_txstatus5
);
ts
->
ts_rssi
=
MS
(
status
,
AR_TxRSSICombined
);
ts
->
ts_rssi_ext0
=
MS
(
status
,
AR_TxRSSIAnt10
);
ts
->
ts_rssi_ext1
=
MS
(
status
,
AR_TxRSSIAnt11
);
ts
->
ts_rssi_ext2
=
MS
(
status
,
AR_TxRSSIAnt12
);
ts
->
ts_rssi
=
MS
(
ads
->
ds_txstatus5
,
AR_TxRSSICombined
);
ts
->
ts_rssi_ctl0
=
MS
(
ads
->
ds_txstatus0
,
AR_TxRSSIAnt00
);
ts
->
ts_rssi_ctl1
=
MS
(
ads
->
ds_txstatus0
,
AR_TxRSSIAnt01
);
ts
->
ts_rssi_ctl2
=
MS
(
ads
->
ds_txstatus0
,
AR_TxRSSIAnt02
);
ts
->
ts_rssi_ext0
=
MS
(
ads
->
ds_txstatus5
,
AR_TxRSSIAnt10
);
ts
->
ts_rssi_ext1
=
MS
(
ads
->
ds_txstatus5
,
AR_TxRSSIAnt11
);
ts
->
ts_rssi_ext2
=
MS
(
ads
->
ds_txstatus5
,
AR_TxRSSIAnt12
);
ts
->
evm0
=
ads
->
AR_TxEVM0
;
ts
->
evm1
=
ads
->
AR_TxEVM1
;
ts
->
evm2
=
ads
->
AR_TxEVM2
;
ts
->
ts_shortretry
=
MS
(
ads
->
ds_txstatus1
,
AR_RTSFailCnt
);
ts
->
ts_longretry
=
MS
(
ads
->
ds_txstatus1
,
AR_DataFailCnt
);
ts
->
ts_virtcol
=
MS
(
ads
->
ds_txstatus1
,
AR_VirtRetryCnt
);
ts
->
tid
=
MS
(
ads
->
ds_txstatus9
,
AR_TxTid
);
ts
->
ts_antenna
=
0
;
return
0
;
}
...
...
drivers/net/wireless/ath/ath9k/ar9002_phy.c
浏览文件 @
b5e41567
...
...
@@ -473,21 +473,21 @@ static void ar9002_hw_do_getnf(struct ath_hw *ah,
int16_t
nf
;
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CCA
),
AR9280_PHY_MINCCA_PWR
);
nfarray
[
0
]
=
sign_extend
(
nf
,
9
);
nfarray
[
0
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_EXT_CCA
),
AR9280_PHY_EXT_MINCCA_PWR
);
if
(
IS_CHAN_HT40
(
ah
->
curchan
))
nfarray
[
3
]
=
sign_extend
(
nf
,
9
);
nfarray
[
3
]
=
sign_extend
32
(
nf
,
8
);
if
(
AR_SREV_9285
(
ah
)
||
AR_SREV_9271
(
ah
))
return
;
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CH1_CCA
),
AR9280_PHY_CH1_MINCCA_PWR
);
nfarray
[
1
]
=
sign_extend
(
nf
,
9
);
nfarray
[
1
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CH1_EXT_CCA
),
AR9280_PHY_CH1_EXT_MINCCA_PWR
);
if
(
IS_CHAN_HT40
(
ah
->
curchan
))
nfarray
[
4
]
=
sign_extend
(
nf
,
9
);
nfarray
[
4
]
=
sign_extend
32
(
nf
,
8
);
}
static
void
ar9002_hw_set_nf_limits
(
struct
ath_hw
*
ah
)
...
...
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
浏览文件 @
b5e41567
...
...
@@ -2131,8 +2131,9 @@ static void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
struct
ath9k_channel
*
chan
,
u16
cfgCtl
,
u8
twiceAntennaReduction
,
u8
twiceMaxRegulatoryPower
,
u8
powerLimit
)
u8
powerLimit
,
bool
test
)
{
struct
ath_regulatory
*
regulatory
=
ath9k_hw_regulatory
(
ah
);
struct
ath_common
*
common
=
ath9k_hw_common
(
ah
);
u8
targetPowerValT2
[
ar9300RateSize
];
unsigned
int
i
=
0
;
...
...
@@ -2144,7 +2145,16 @@ static void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
twiceMaxRegulatoryPower
,
powerLimit
);
while
(
i
<
ar9300RateSize
)
{
regulatory
->
max_power_level
=
0
;
for
(
i
=
0
;
i
<
ar9300RateSize
;
i
++
)
{
if
(
targetPowerValT2
[
i
]
>
regulatory
->
max_power_level
)
regulatory
->
max_power_level
=
targetPowerValT2
[
i
];
}
if
(
test
)
return
;
for
(
i
=
0
;
i
<
ar9300RateSize
;
i
++
)
{
ath_print
(
common
,
ATH_DBG_EEPROM
,
"TPC[%02d] 0x%08x "
,
i
,
targetPowerValT2
[
i
]);
i
++
;
...
...
@@ -2159,9 +2169,6 @@ static void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
i
++
;
}
/* Write target power array to registers */
ar9003_hw_tx_power_regwrite
(
ah
,
targetPowerValT2
);
/*
* This is the TX power we send back to driver core,
* and it can use to pass to userspace to display our
...
...
@@ -2180,7 +2187,10 @@ static void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
i
=
ALL_TARGET_HT20_0_8_16
;
/* ht20 */
ah
->
txpower_limit
=
targetPowerValT2
[
i
];
regulatory
->
max_power_level
=
targetPowerValT2
[
i
];
/* Write target power array to registers */
ar9003_hw_tx_power_regwrite
(
ah
,
targetPowerValT2
);
ar9003_hw_calibration_apply
(
ah
,
chan
->
channel
);
}
...
...
drivers/net/wireless/ath/ath9k/ar9003_mac.c
浏览文件 @
b5e41567
...
...
@@ -237,10 +237,12 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
struct
ath_tx_status
*
ts
)
{
struct
ar9003_txs
*
ads
;
u32
status
;
ads
=
&
ah
->
ts_ring
[
ah
->
ts_tail
];
if
((
ads
->
status8
&
AR_TxDone
)
==
0
)
status
=
ACCESS_ONCE
(
ads
->
status8
);
if
((
status
&
AR_TxDone
)
==
0
)
return
-
EINPROGRESS
;
ah
->
ts_tail
=
(
ah
->
ts_tail
+
1
)
%
ah
->
ts_size
;
...
...
@@ -253,57 +255,58 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
return
-
EIO
;
}
if
(
status
&
AR_TxOpExceeded
)
ts
->
ts_status
|=
ATH9K_TXERR_XTXOP
;
ts
->
ts_rateindex
=
MS
(
status
,
AR_FinalTxIdx
);
ts
->
ts_seqnum
=
MS
(
status
,
AR_SeqNum
);
ts
->
tid
=
MS
(
status
,
AR_TxTid
);
ts
->
qid
=
MS
(
ads
->
ds_info
,
AR_TxQcuNum
);
ts
->
desc_id
=
MS
(
ads
->
status1
,
AR_TxDescId
);
ts
->
ts_seqnum
=
MS
(
ads
->
status8
,
AR_SeqNum
);
ts
->
ts_tstamp
=
ads
->
status4
;
ts
->
ts_status
=
0
;
ts
->
ts_flags
=
0
;
if
(
ads
->
status3
&
AR_ExcessiveRetries
)
status
=
ACCESS_ONCE
(
ads
->
status2
);
ts
->
ts_rssi_ctl0
=
MS
(
status
,
AR_TxRSSIAnt00
);
ts
->
ts_rssi_ctl1
=
MS
(
status
,
AR_TxRSSIAnt01
);
ts
->
ts_rssi_ctl2
=
MS
(
status
,
AR_TxRSSIAnt02
);
if
(
status
&
AR_TxBaStatus
)
{
ts
->
ts_flags
|=
ATH9K_TX_BA
;
ts
->
ba_low
=
ads
->
status5
;
ts
->
ba_high
=
ads
->
status6
;
}
status
=
ACCESS_ONCE
(
ads
->
status3
);
if
(
status
&
AR_ExcessiveRetries
)
ts
->
ts_status
|=
ATH9K_TXERR_XRETRY
;
if
(
ads
->
status3
&
AR_Filtered
)
if
(
status
&
AR_Filtered
)
ts
->
ts_status
|=
ATH9K_TXERR_FILT
;
if
(
ads
->
status3
&
AR_FIFOUnderrun
)
{
if
(
status
&
AR_FIFOUnderrun
)
{
ts
->
ts_status
|=
ATH9K_TXERR_FIFO
;
ath9k_hw_updatetxtriglevel
(
ah
,
true
);
}
if
(
ads
->
status8
&
AR_TxOpExceeded
)
ts
->
ts_status
|=
ATH9K_TXERR_XTXOP
;
if
(
ads
->
status3
&
AR_TxTimerExpired
)
if
(
status
&
AR_TxTimerExpired
)
ts
->
ts_status
|=
ATH9K_TXERR_TIMER_EXPIRED
;
if
(
ads
->
status3
&
AR_DescCfgErr
)
if
(
status
&
AR_DescCfgErr
)
ts
->
ts_flags
|=
ATH9K_TX_DESC_CFG_ERR
;
if
(
ads
->
status3
&
AR_TxDataUnderrun
)
{
if
(
status
&
AR_TxDataUnderrun
)
{
ts
->
ts_flags
|=
ATH9K_TX_DATA_UNDERRUN
;
ath9k_hw_updatetxtriglevel
(
ah
,
true
);
}
if
(
ads
->
status3
&
AR_TxDelimUnderrun
)
{
if
(
status
&
AR_TxDelimUnderrun
)
{
ts
->
ts_flags
|=
ATH9K_TX_DELIM_UNDERRUN
;
ath9k_hw_updatetxtriglevel
(
ah
,
true
);
}
if
(
ads
->
status2
&
AR_TxBaStatus
)
{
ts
->
ts_flags
|=
ATH9K_TX_BA
;
ts
->
ba_low
=
ads
->
status5
;
ts
->
ba_high
=
ads
->
status6
;
}
ts
->
ts_rateindex
=
MS
(
ads
->
status8
,
AR_FinalTxIdx
);
ts
->
ts_rssi
=
MS
(
ads
->
status7
,
AR_TxRSSICombined
);
ts
->
ts_rssi_ctl0
=
MS
(
ads
->
status2
,
AR_TxRSSIAnt00
);
ts
->
ts_rssi_ctl1
=
MS
(
ads
->
status2
,
AR_TxRSSIAnt01
);
ts
->
ts_rssi_ctl2
=
MS
(
ads
->
status2
,
AR_TxRSSIAnt02
);
ts
->
ts_rssi_ext0
=
MS
(
ads
->
status7
,
AR_TxRSSIAnt10
);
ts
->
ts_rssi_ext1
=
MS
(
ads
->
status7
,
AR_TxRSSIAnt11
);
ts
->
ts_rssi_ext2
=
MS
(
ads
->
status7
,
AR_TxRSSIAnt12
);
ts
->
ts_shortretry
=
MS
(
ads
->
status3
,
AR_RTSFailCnt
);
ts
->
ts_longretry
=
MS
(
ads
->
status3
,
AR_DataFailCnt
);
ts
->
ts_virtcol
=
MS
(
ads
->
status3
,
AR_VirtRetryCnt
);
ts
->
ts_antenna
=
0
;
ts
->
tid
=
MS
(
ads
->
status8
,
AR_TxTid
);
ts
->
ts_shortretry
=
MS
(
status
,
AR_RTSFailCnt
);
ts
->
ts_longretry
=
MS
(
status
,
AR_DataFailCnt
);
ts
->
ts_virtcol
=
MS
(
status
,
AR_VirtRetryCnt
);
status
=
ACCESS_ONCE
(
ads
->
status7
);
ts
->
ts_rssi
=
MS
(
status
,
AR_TxRSSICombined
);
ts
->
ts_rssi_ext0
=
MS
(
status
,
AR_TxRSSIAnt10
);
ts
->
ts_rssi_ext1
=
MS
(
status
,
AR_TxRSSIAnt11
);
ts
->
ts_rssi_ext2
=
MS
(
status
,
AR_TxRSSIAnt12
);
memset
(
ads
,
0
,
sizeof
(
*
ads
));
...
...
drivers/net/wireless/ath/ath9k/ar9003_mac.h
浏览文件 @
b5e41567
...
...
@@ -65,7 +65,7 @@ struct ar9003_rxs {
u32
status9
;
u32
status10
;
u32
status11
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
/* Transmit Control Descriptor */
struct
ar9003_txc
{
...
...
@@ -93,7 +93,7 @@ struct ar9003_txc {
u32
ctl21
;
/* DMA control 21 */
u32
ctl22
;
/* DMA control 22 */
u32
pad
[
9
];
/* pad to cache line (128 bytes/32 dwords) */
}
__packed
;
}
__packed
__aligned
(
4
)
;
struct
ar9003_txs
{
u32
ds_info
;
...
...
@@ -105,7 +105,7 @@ struct ar9003_txs {
u32
status6
;
u32
status7
;
u32
status8
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
void
ar9003_hw_attach_mac_ops
(
struct
ath_hw
*
hw
);
void
ath9k_hw_set_rx_bufsize
(
struct
ath_hw
*
ah
,
u16
buf_size
);
...
...
drivers/net/wireless/ath/ath9k/ar9003_phy.c
浏览文件 @
b5e41567
...
...
@@ -614,7 +614,7 @@ static int ar9003_hw_process_ini(struct ath_hw *ah,
channel
->
max_antenna_gain
*
2
,
channel
->
max_power
*
2
,
min
((
u32
)
MAX_RATE_POWER
,
(
u32
)
regulatory
->
power_limit
));
(
u32
)
regulatory
->
power_limit
)
,
false
);
return
0
;
}
...
...
@@ -1023,25 +1023,25 @@ static void ar9003_hw_do_getnf(struct ath_hw *ah,
int16_t
nf
;
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CCA_0
),
AR_PHY_MINCCA_PWR
);
nfarray
[
0
]
=
sign_extend
(
nf
,
9
);
nfarray
[
0
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CCA_1
),
AR_PHY_CH1_MINCCA_PWR
);
nfarray
[
1
]
=
sign_extend
(
nf
,
9
);
nfarray
[
1
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_CCA_2
),
AR_PHY_CH2_MINCCA_PWR
);
nfarray
[
2
]
=
sign_extend
(
nf
,
9
);
nfarray
[
2
]
=
sign_extend
32
(
nf
,
8
);
if
(
!
IS_CHAN_HT40
(
ah
->
curchan
))
return
;
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_EXT_CCA
),
AR_PHY_EXT_MINCCA_PWR
);
nfarray
[
3
]
=
sign_extend
(
nf
,
9
);
nfarray
[
3
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_EXT_CCA_1
),
AR_PHY_CH1_EXT_MINCCA_PWR
);
nfarray
[
4
]
=
sign_extend
(
nf
,
9
);
nfarray
[
4
]
=
sign_extend
32
(
nf
,
8
);
nf
=
MS
(
REG_READ
(
ah
,
AR_PHY_EXT_CCA_2
),
AR_PHY_CH2_EXT_MINCCA_PWR
);
nfarray
[
5
]
=
sign_extend
(
nf
,
9
);
nfarray
[
5
]
=
sign_extend
32
(
nf
,
8
);
}
static
void
ar9003_hw_set_nf_limits
(
struct
ath_hw
*
ah
)
...
...
drivers/net/wireless/ath/ath9k/ath9k.h
浏览文件 @
b5e41567
...
...
@@ -195,7 +195,6 @@ enum ATH_AGGR_STATUS {
#define ATH_TXFIFO_DEPTH 8
struct
ath_txq
{
int
axq_class
;
u32
axq_qnum
;
u32
*
axq_link
;
struct
list_head
axq_q
;
...
...
@@ -208,11 +207,12 @@ struct ath_txq {
struct
list_head
txq_fifo_pending
;
u8
txq_headidx
;
u8
txq_tailidx
;
int
pending_frames
;
};
struct
ath_atx_ac
{
struct
ath_txq
*
txq
;
int
sched
;
int
qnum
;
struct
list_head
list
;
struct
list_head
tid_q
;
};
...
...
@@ -270,7 +270,6 @@ struct ath_node {
struct
ath_atx_ac
ac
[
WME_NUM_AC
];
u16
maxampdu
;
u8
mpdudensity
;
int
last_rssi
;
};
#define AGGR_CLEANUP BIT(1)
...
...
@@ -291,12 +290,11 @@ struct ath_tx_control {
struct
ath_tx
{
u16
seq_no
;
u32
txqsetup
;
int
hwq_map
[
WME_NUM_AC
];
spinlock_t
txbuflock
;
struct
list_head
txbuf
;
struct
ath_txq
txq
[
ATH9K_NUM_TX_QUEUES
];
struct
ath_descdma
txdma
;
int
pending_frames
[
WME_NUM_AC
];
struct
ath_txq
*
txq_map
[
WME_NUM_AC
];
};
struct
ath_rx_edma
{
...
...
@@ -310,7 +308,6 @@ struct ath_rx {
u8
rxotherant
;
u32
*
rxlink
;
unsigned
int
rxfilter
;
spinlock_t
pcu_lock
;
spinlock_t
rxbuflock
;
struct
list_head
rxbuf
;
struct
ath_descdma
rxdma
;
...
...
@@ -327,7 +324,6 @@ void ath_rx_cleanup(struct ath_softc *sc);
int
ath_rx_tasklet
(
struct
ath_softc
*
sc
,
int
flush
,
bool
hp
);
struct
ath_txq
*
ath_txq_setup
(
struct
ath_softc
*
sc
,
int
qtype
,
int
subtype
);
void
ath_tx_cleanupq
(
struct
ath_softc
*
sc
,
struct
ath_txq
*
txq
);
int
ath_tx_setup
(
struct
ath_softc
*
sc
,
int
haltype
);
void
ath_drain_all_txq
(
struct
ath_softc
*
sc
,
bool
retry_tx
);
void
ath_draintxq
(
struct
ath_softc
*
sc
,
struct
ath_txq
*
txq
,
bool
retry_tx
);
...
...
@@ -600,9 +596,9 @@ struct ath_softc {
struct
ath_hw
*
sc_ah
;
void
__iomem
*
mem
;
int
irq
;
spinlock_t
sc_resetlock
;
spinlock_t
sc_serial_rw
;
spinlock_t
sc_pm_lock
;
spinlock_t
sc_pcu_lock
;
struct
mutex
mutex
;
struct
work_struct
paprd_work
;
struct
work_struct
hw_check_work
;
...
...
@@ -662,11 +658,11 @@ struct ath_wiphy {
bool
idle
;
int
chan_idx
;
int
chan_is_ht
;
int
last_rssi
;
};
void
ath9k_tasklet
(
unsigned
long
data
);
int
ath_reset
(
struct
ath_softc
*
sc
,
bool
retry_tx
);
int
ath_get_mac80211_qnum
(
u32
queue
,
struct
ath_softc
*
sc
);
int
ath_cabq_update
(
struct
ath_softc
*
);
static
inline
void
ath_read_cachesize
(
struct
ath_common
*
common
,
int
*
csz
)
...
...
drivers/net/wireless/ath/ath9k/beacon.c
浏览文件 @
b5e41567
...
...
@@ -28,7 +28,7 @@ int ath_beaconq_config(struct ath_softc *sc)
struct
ath_hw
*
ah
=
sc
->
sc_ah
;
struct
ath_common
*
common
=
ath9k_hw_common
(
ah
);
struct
ath9k_tx_queue_info
qi
,
qi_be
;
int
qnum
;
struct
ath_txq
*
txq
;
ath9k_hw_get_txq_props
(
ah
,
sc
->
beacon
.
beaconq
,
&
qi
);
if
(
sc
->
sc_ah
->
opmode
==
NL80211_IFTYPE_AP
)
{
...
...
@@ -38,8 +38,8 @@ int ath_beaconq_config(struct ath_softc *sc)
qi
.
tqi_cwmax
=
0
;
}
else
{
/* Adhoc mode; important thing is to use 2x cwmin. */
qnum
=
sc
->
tx
.
hw
q_map
[
WME_AC_BE
];
ath9k_hw_get_txq_props
(
ah
,
qnum
,
&
qi_be
);
txq
=
sc
->
tx
.
tx
q_map
[
WME_AC_BE
];
ath9k_hw_get_txq_props
(
ah
,
txq
->
axq_
qnum
,
&
qi_be
);
qi
.
tqi_aifs
=
qi_be
.
tqi_aifs
;
qi
.
tqi_cwmin
=
4
*
qi_be
.
tqi_cwmin
;
qi
.
tqi_cwmax
=
qi_be
.
tqi_cwmax
;
...
...
@@ -503,7 +503,7 @@ static void ath_beacon_config_ap(struct ath_softc *sc,
/* Set the computed AP beacon timers */
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
ath9k_beacon_init
(
sc
,
nexttbtt
,
intval
);
sc
->
beacon
.
bmisscnt
=
0
;
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
);
...
...
@@ -638,7 +638,7 @@ static void ath_beacon_config_sta(struct ath_softc *sc,
/* Set the computed STA beacon timers */
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
ath9k_hw_set_sta_beacon_timers
(
ah
,
&
bs
);
ah
->
imask
|=
ATH9K_INT_BMISS
;
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
);
...
...
@@ -686,7 +686,7 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
/* Set the computed ADHOC beacon timers */
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
ath9k_beacon_init
(
sc
,
nexttbtt
,
intval
);
sc
->
beacon
.
bmisscnt
=
0
;
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
);
...
...
drivers/net/wireless/ath/ath9k/common.c
浏览文件 @
b5e41567
...
...
@@ -107,12 +107,10 @@ static u32 ath9k_get_extchanmode(struct ieee80211_channel *chan,
/*
* Update internal channel flags.
*/
void
ath9k_cmn_update_ichannel
(
struct
ieee80211_hw
*
hw
,
struct
ath9k_channel
*
ichan
)
void
ath9k_cmn_update_ichannel
(
struct
ath9k_channel
*
ichan
,
struct
ieee80211_channel
*
chan
,
enum
nl80211_channel_type
channel_type
)
{
struct
ieee80211_channel
*
chan
=
hw
->
conf
.
channel
;
struct
ieee80211_conf
*
conf
=
&
hw
->
conf
;
ichan
->
channel
=
chan
->
center_freq
;
ichan
->
chan
=
chan
;
...
...
@@ -124,9 +122,8 @@ void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw,
ichan
->
channelFlags
=
CHANNEL_5GHZ
|
CHANNEL_OFDM
;
}
if
(
conf_is_ht
(
conf
))
ichan
->
chanmode
=
ath9k_get_extchanmode
(
chan
,
conf
->
channel_type
);
if
(
channel_type
!=
NL80211_CHAN_NO_HT
)
ichan
->
chanmode
=
ath9k_get_extchanmode
(
chan
,
channel_type
);
}
EXPORT_SYMBOL
(
ath9k_cmn_update_ichannel
);
...
...
@@ -142,7 +139,7 @@ struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw,
chan_idx
=
curchan
->
hw_value
;
channel
=
&
ah
->
channels
[
chan_idx
];
ath9k_cmn_update_ichannel
(
hw
,
channel
);
ath9k_cmn_update_ichannel
(
channel
,
curchan
,
hw
->
conf
.
channel_type
);
return
channel
;
}
...
...
drivers/net/wireless/ath/ath9k/common.h
浏览文件 @
b5e41567
...
...
@@ -31,10 +31,11 @@
#define WME_MAX_BA WME_BA_BMP_SIZE
#define ATH_TID_MAX_BUFS (2 * WME_MAX_BA)
#define WME_AC_BE 0
#define WME_AC_BK 1
#define WME_AC_VI 2
#define WME_AC_VO 3
/* These must match mac80211 skb queue mapping numbers */
#define WME_AC_VO 0
#define WME_AC_VI 1
#define WME_AC_BE 2
#define WME_AC_BK 3
#define WME_NUM_AC 4
#define ATH_RSSI_DUMMY_MARKER 0x127
...
...
@@ -62,8 +63,9 @@ enum ath_stomp_type {
int
ath9k_cmn_padpos
(
__le16
frame_control
);
int
ath9k_cmn_get_hw_crypto_keytype
(
struct
sk_buff
*
skb
);
void
ath9k_cmn_update_ichannel
(
struct
ieee80211_hw
*
hw
,
struct
ath9k_channel
*
ichan
);
void
ath9k_cmn_update_ichannel
(
struct
ath9k_channel
*
ichan
,
struct
ieee80211_channel
*
chan
,
enum
nl80211_channel_type
channel_type
);
struct
ath9k_channel
*
ath9k_cmn_get_curchannel
(
struct
ieee80211_hw
*
hw
,
struct
ath_hw
*
ah
);
int
ath9k_cmn_count_streams
(
unsigned
int
chainmask
,
int
max
);
...
...
drivers/net/wireless/ath/ath9k/debug.c
浏览文件 @
b5e41567
...
...
@@ -461,16 +461,16 @@ static ssize_t read_file_wiphy(struct file *file, char __user *user_buf,
/* Put variable-length stuff down here, and check for overflows. */
for
(
i
=
0
;
i
<
sc
->
num_sec_wiphy
;
i
++
)
{
struct
ath_wiphy
*
aphy
=
sc
->
sec_wiphy
[
i
];
if
(
aphy
==
NULL
)
struct
ath_wiphy
*
aphy
_tmp
=
sc
->
sec_wiphy
[
i
];
if
(
aphy
_tmp
==
NULL
)
continue
;
chan
=
aphy
->
hw
->
conf
.
channel
;
chan
=
aphy
_tmp
->
hw
->
conf
.
channel
;
len
+=
snprintf
(
buf
+
len
,
sizeof
(
buf
)
-
len
,
"secondary: %s (%s chan=%d ht=%d)
\n
"
,
wiphy_name
(
aphy
->
hw
->
wiphy
),
ath_wiphy_state_str
(
aphy
->
state
),
wiphy_name
(
aphy
_tmp
->
hw
->
wiphy
),
ath_wiphy_state_str
(
aphy
_tmp
->
state
),
ieee80211_frequency_to_channel
(
chan
->
center_freq
),
aphy
->
chan_is_ht
);
aphy_tmp
->
chan_is_ht
);
}
if
(
len
>
sizeof
(
buf
))
len
=
sizeof
(
buf
);
...
...
@@ -585,10 +585,10 @@ static const struct file_operations fops_wiphy = {
do { \
len += snprintf(buf + len, size - len, \
"%s%13u%11u%10u%10u\n", str, \
sc->debug.stats.txstats[
sc->tx.hwq_map[WME_AC_BE]
].elem, \
sc->debug.stats.txstats[
sc->tx.hwq_map[WME_AC_BK]
].elem, \
sc->debug.stats.txstats[
sc->tx.hwq_map[WME_AC_VI]
].elem, \
sc->debug.stats.txstats[
sc->tx.hwq_map[WME_AC_VO]
].elem); \
sc->debug.stats.txstats[
WME_AC_BE
].elem, \
sc->debug.stats.txstats[
WME_AC_BK
].elem, \
sc->debug.stats.txstats[
WME_AC_VI
].elem, \
sc->debug.stats.txstats[
WME_AC_VO
].elem); \
} while(0)
static
ssize_t
read_file_xmit
(
struct
file
*
file
,
char
__user
*
user_buf
,
...
...
@@ -630,33 +630,35 @@ static ssize_t read_file_xmit(struct file *file, char __user *user_buf,
return
retval
;
}
void
ath_debug_stat_tx
(
struct
ath_softc
*
sc
,
struct
ath_
txq
*
txq
,
struct
ath_
buf
*
bf
,
struct
ath_
tx_status
*
ts
)
void
ath_debug_stat_tx
(
struct
ath_softc
*
sc
,
struct
ath_
buf
*
bf
,
struct
ath_tx_status
*
ts
)
{
TX_STAT_INC
(
txq
->
axq_qnum
,
tx_pkts_all
);
sc
->
debug
.
stats
.
txstats
[
txq
->
axq_qnum
].
tx_bytes_all
+=
bf
->
bf_mpdu
->
len
;
int
qnum
=
skb_get_queue_mapping
(
bf
->
bf_mpdu
);
TX_STAT_INC
(
qnum
,
tx_pkts_all
);
sc
->
debug
.
stats
.
txstats
[
qnum
].
tx_bytes_all
+=
bf
->
bf_mpdu
->
len
;
if
(
bf_isampdu
(
bf
))
{
if
(
bf_isxretried
(
bf
))
TX_STAT_INC
(
txq
->
axq_
qnum
,
a_xretries
);
TX_STAT_INC
(
qnum
,
a_xretries
);
else
TX_STAT_INC
(
txq
->
axq_
qnum
,
a_completed
);
TX_STAT_INC
(
qnum
,
a_completed
);
}
else
{
TX_STAT_INC
(
txq
->
axq_
qnum
,
completed
);
TX_STAT_INC
(
qnum
,
completed
);
}
if
(
ts
->
ts_status
&
ATH9K_TXERR_FIFO
)
TX_STAT_INC
(
txq
->
axq_
qnum
,
fifo_underrun
);
TX_STAT_INC
(
qnum
,
fifo_underrun
);
if
(
ts
->
ts_status
&
ATH9K_TXERR_XTXOP
)
TX_STAT_INC
(
txq
->
axq_
qnum
,
xtxop
);
TX_STAT_INC
(
qnum
,
xtxop
);
if
(
ts
->
ts_status
&
ATH9K_TXERR_TIMER_EXPIRED
)
TX_STAT_INC
(
txq
->
axq_
qnum
,
timer_exp
);
TX_STAT_INC
(
qnum
,
timer_exp
);
if
(
ts
->
ts_flags
&
ATH9K_TX_DESC_CFG_ERR
)
TX_STAT_INC
(
txq
->
axq_
qnum
,
desc_cfg_err
);
TX_STAT_INC
(
qnum
,
desc_cfg_err
);
if
(
ts
->
ts_flags
&
ATH9K_TX_DATA_UNDERRUN
)
TX_STAT_INC
(
txq
->
axq_
qnum
,
data_underrun
);
TX_STAT_INC
(
qnum
,
data_underrun
);
if
(
ts
->
ts_flags
&
ATH9K_TX_DELIM_UNDERRUN
)
TX_STAT_INC
(
txq
->
axq_
qnum
,
delim_underrun
);
TX_STAT_INC
(
qnum
,
delim_underrun
);
}
static
const
struct
file_operations
fops_xmit
=
{
...
...
drivers/net/wireless/ath/ath9k/debug.h
浏览文件 @
b5e41567
...
...
@@ -169,8 +169,8 @@ void ath9k_exit_debug(struct ath_hw *ah);
int
ath9k_debug_create_root
(
void
);
void
ath9k_debug_remove_root
(
void
);
void
ath_debug_stat_interrupt
(
struct
ath_softc
*
sc
,
enum
ath9k_int
status
);
void
ath_debug_stat_tx
(
struct
ath_softc
*
sc
,
struct
ath_
txq
*
txq
,
struct
ath_
buf
*
bf
,
struct
ath_
tx_status
*
ts
);
void
ath_debug_stat_tx
(
struct
ath_softc
*
sc
,
struct
ath_
buf
*
bf
,
struct
ath_tx_status
*
ts
);
void
ath_debug_stat_rx
(
struct
ath_softc
*
sc
,
struct
ath_rx_status
*
rs
);
#else
...
...
@@ -199,7 +199,6 @@ static inline void ath_debug_stat_interrupt(struct ath_softc *sc,
}
static
inline
void
ath_debug_stat_tx
(
struct
ath_softc
*
sc
,
struct
ath_txq
*
txq
,
struct
ath_buf
*
bf
,
struct
ath_tx_status
*
ts
)
{
...
...
drivers/net/wireless/ath/ath9k/eeprom.h
浏览文件 @
b5e41567
...
...
@@ -680,7 +680,8 @@ struct eeprom_ops {
void
(
*
set_addac
)(
struct
ath_hw
*
hw
,
struct
ath9k_channel
*
chan
);
void
(
*
set_txpower
)(
struct
ath_hw
*
hw
,
struct
ath9k_channel
*
chan
,
u16
cfgCtl
,
u8
twiceAntennaReduction
,
u8
twiceMaxRegulatoryPower
,
u8
powerLimit
);
u8
twiceMaxRegulatoryPower
,
u8
powerLimit
,
bool
test
);
u16
(
*
get_spur_channel
)(
struct
ath_hw
*
ah
,
u16
i
,
bool
is2GHz
);
};
...
...
drivers/net/wireless/ath/ath9k/eeprom_4k.c
浏览文件 @
b5e41567
...
...
@@ -726,7 +726,7 @@ static void ath9k_hw_4k_set_txpower(struct ath_hw *ah,
u16
cfgCtl
,
u8
twiceAntennaReduction
,
u8
twiceMaxRegulatoryPower
,
u8
powerLimit
)
u8
powerLimit
,
bool
test
)
{
struct
ath_regulatory
*
regulatory
=
ath9k_hw_regulatory
(
ah
);
struct
ar5416_eeprom_4k
*
pEepData
=
&
ah
->
eeprom
.
map4k
;
...
...
@@ -751,15 +751,20 @@ static void ath9k_hw_4k_set_txpower(struct ath_hw *ah,
ath9k_hw_set_4k_power_cal_table
(
ah
,
chan
,
&
txPowerIndexOffset
);
regulatory
->
max_power_level
=
0
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ratesArray
);
i
++
)
{
ratesArray
[
i
]
=
(
int16_t
)(
txPowerIndexOffset
+
ratesArray
[
i
]);
if
(
ratesArray
[
i
]
>
AR5416_MAX_RATE_POWER
)
ratesArray
[
i
]
=
AR5416_MAX_RATE_POWER
;
if
(
ratesArray
[
i
]
>
regulatory
->
max_power_level
)
regulatory
->
max_power_level
=
ratesArray
[
i
];
}
if
(
test
)
return
;
/* Update regulatory */
i
=
rate6mb
;
if
(
IS_CHAN_HT40
(
chan
))
i
=
rateHt40_0
;
...
...
drivers/net/wireless/ath/ath9k/eeprom_9287.c
浏览文件 @
b5e41567
...
...
@@ -853,7 +853,7 @@ static void ath9k_hw_ar9287_set_txpower(struct ath_hw *ah,
struct
ath9k_channel
*
chan
,
u16
cfgCtl
,
u8
twiceAntennaReduction
,
u8
twiceMaxRegulatoryPower
,
u8
powerLimit
)
u8
powerLimit
,
bool
test
)
{
struct
ath_regulatory
*
regulatory
=
ath9k_hw_regulatory
(
ah
);
struct
ar9287_eeprom
*
pEepData
=
&
ah
->
eeprom
.
map9287
;
...
...
@@ -877,12 +877,26 @@ static void ath9k_hw_ar9287_set_txpower(struct ath_hw *ah,
ath9k_hw_set_ar9287_power_cal_table
(
ah
,
chan
,
&
txPowerIndexOffset
);
regulatory
->
max_power_level
=
0
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ratesArray
);
i
++
)
{
ratesArray
[
i
]
=
(
int16_t
)(
txPowerIndexOffset
+
ratesArray
[
i
]);
if
(
ratesArray
[
i
]
>
AR9287_MAX_RATE_POWER
)
ratesArray
[
i
]
=
AR9287_MAX_RATE_POWER
;
if
(
ratesArray
[
i
]
>
regulatory
->
max_power_level
)
regulatory
->
max_power_level
=
ratesArray
[
i
];
}
if
(
test
)
return
;
if
(
IS_CHAN_2GHZ
(
chan
))
i
=
rate1l
;
else
i
=
rate6mb
;
regulatory
->
max_power_level
=
ratesArray
[
i
];
if
(
AR_SREV_9280_20_OR_LATER
(
ah
))
{
for
(
i
=
0
;
i
<
Ar5416RateSize
;
i
++
)
ratesArray
[
i
]
-=
AR9287_PWR_TABLE_OFFSET_DB
*
2
;
...
...
@@ -971,17 +985,6 @@ static void ath9k_hw_ar9287_set_txpower(struct ath_hw *ah,
|
ATH9K_POW_SM
(
ratesArray
[
rateDupOfdm
],
8
)
|
ATH9K_POW_SM
(
ratesArray
[
rateDupCck
],
0
));
}
if
(
IS_CHAN_2GHZ
(
chan
))
i
=
rate1l
;
else
i
=
rate6mb
;
if
(
AR_SREV_9280_20_OR_LATER
(
ah
))
regulatory
->
max_power_level
=
ratesArray
[
i
]
+
AR9287_PWR_TABLE_OFFSET_DB
*
2
;
else
regulatory
->
max_power_level
=
ratesArray
[
i
];
}
static
void
ath9k_hw_ar9287_set_addac
(
struct
ath_hw
*
ah
,
...
...
drivers/net/wireless/ath/ath9k/eeprom_def.c
浏览文件 @
b5e41567
...
...
@@ -1258,7 +1258,7 @@ static void ath9k_hw_def_set_txpower(struct ath_hw *ah,
u16
cfgCtl
,
u8
twiceAntennaReduction
,
u8
twiceMaxRegulatoryPower
,
u8
powerLimit
)
u8
powerLimit
,
bool
test
)
{
#define RT_AR_DELTA(x) (ratesArray[x] - cck_ofdm_delta)
struct
ath_regulatory
*
regulatory
=
ath9k_hw_regulatory
(
ah
);
...
...
@@ -1285,12 +1285,44 @@ static void ath9k_hw_def_set_txpower(struct ath_hw *ah,
ath9k_hw_set_def_power_cal_table
(
ah
,
chan
,
&
txPowerIndexOffset
);
regulatory
->
max_power_level
=
0
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ratesArray
);
i
++
)
{
ratesArray
[
i
]
=
(
int16_t
)(
txPowerIndexOffset
+
ratesArray
[
i
]);
if
(
ratesArray
[
i
]
>
AR5416_MAX_RATE_POWER
)
ratesArray
[
i
]
=
AR5416_MAX_RATE_POWER
;
if
(
ratesArray
[
i
]
>
regulatory
->
max_power_level
)
regulatory
->
max_power_level
=
ratesArray
[
i
];
}
if
(
!
test
)
{
i
=
rate6mb
;
if
(
IS_CHAN_HT40
(
chan
))
i
=
rateHt40_0
;
else
if
(
IS_CHAN_HT20
(
chan
))
i
=
rateHt20_0
;
regulatory
->
max_power_level
=
ratesArray
[
i
];
}
switch
(
ar5416_get_ntxchains
(
ah
->
txchainmask
))
{
case
1
:
break
;
case
2
:
regulatory
->
max_power_level
+=
INCREASE_MAXPOW_BY_TWO_CHAIN
;
break
;
case
3
:
regulatory
->
max_power_level
+=
INCREASE_MAXPOW_BY_THREE_CHAIN
;
break
;
default:
ath_print
(
ath9k_hw_common
(
ah
),
ATH_DBG_EEPROM
,
"Invalid chainmask configuration
\n
"
);
break
;
}
if
(
test
)
return
;
if
(
AR_SREV_9280_20_OR_LATER
(
ah
))
{
for
(
i
=
0
;
i
<
Ar5416RateSize
;
i
++
)
{
int8_t
pwr_table_offset
;
...
...
@@ -1387,34 +1419,6 @@ static void ath9k_hw_def_set_txpower(struct ath_hw *ah,
REG_WRITE
(
ah
,
AR_PHY_POWER_TX_SUB
,
ATH9K_POW_SM
(
pModal
->
pwrDecreaseFor3Chain
,
6
)
|
ATH9K_POW_SM
(
pModal
->
pwrDecreaseFor2Chain
,
0
));
i
=
rate6mb
;
if
(
IS_CHAN_HT40
(
chan
))
i
=
rateHt40_0
;
else
if
(
IS_CHAN_HT20
(
chan
))
i
=
rateHt20_0
;
if
(
AR_SREV_9280_20_OR_LATER
(
ah
))
regulatory
->
max_power_level
=
ratesArray
[
i
]
+
AR5416_PWR_TABLE_OFFSET_DB
*
2
;
else
regulatory
->
max_power_level
=
ratesArray
[
i
];
switch
(
ar5416_get_ntxchains
(
ah
->
txchainmask
))
{
case
1
:
break
;
case
2
:
regulatory
->
max_power_level
+=
INCREASE_MAXPOW_BY_TWO_CHAIN
;
break
;
case
3
:
regulatory
->
max_power_level
+=
INCREASE_MAXPOW_BY_THREE_CHAIN
;
break
;
default:
ath_print
(
ath9k_hw_common
(
ah
),
ATH_DBG_EEPROM
,
"Invalid chainmask configuration
\n
"
);
break
;
}
}
static
u8
ath9k_hw_def_get_num_ant_config
(
struct
ath_hw
*
ah
,
...
...
drivers/net/wireless/ath/ath9k/gpio.c
浏览文件 @
b5e41567
...
...
@@ -259,7 +259,7 @@ static void ath9k_gen_timer_start(struct ath_hw *ah,
ath9k_hw_gen_timer_start
(
ah
,
timer
,
timer_next
,
timer_period
);
if
((
ah
->
imask
&
ATH9K_INT_GENTIMER
)
==
0
)
{
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
ah
->
imask
|=
ATH9K_INT_GENTIMER
;
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
);
}
...
...
@@ -273,7 +273,7 @@ static void ath9k_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer)
/* if no timer is enabled, turn off interrupt mask */
if
(
timer_table
->
timer_mask
.
val
==
0
)
{
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
ah
->
imask
&=
~
ATH9K_INT_GENTIMER
;
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
);
}
...
...
@@ -310,10 +310,8 @@ static void ath_btcoex_period_timer(unsigned long data)
timer_period
=
is_btscan
?
btcoex
->
btscan_no_stomp
:
btcoex
->
btcoex_no_stomp
;
ath9k_gen_timer_start
(
ah
,
btcoex
->
no_stomp_timer
,
(
ath9k_hw_gettsf32
(
ah
)
+
timer_period
),
timer_period
*
10
);
ath9k_gen_timer_start
(
ah
,
btcoex
->
no_stomp_timer
,
0
,
timer_period
*
10
);
btcoex
->
hw_timer_enabled
=
true
;
}
...
...
drivers/net/wireless/ath/ath9k/htc_drv_main.c
浏览文件 @
b5e41567
...
...
@@ -29,7 +29,7 @@ static void ath_update_txpow(struct ath9k_htc_priv *priv)
struct
ath_hw
*
ah
=
priv
->
ah
;
if
(
priv
->
curtxpow
!=
priv
->
txpowlimit
)
{
ath9k_hw_set_txpowerlimit
(
ah
,
priv
->
txpowlimit
);
ath9k_hw_set_txpowerlimit
(
ah
,
priv
->
txpowlimit
,
false
);
/* read back in case value is clamped */
priv
->
curtxpow
=
ath9k_hw_regulatory
(
ah
)
->
power_limit
;
}
...
...
@@ -184,47 +184,6 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
return
ret
;
}
static
int
ath9k_htc_add_monitor_interface
(
struct
ath9k_htc_priv
*
priv
)
{
struct
ath_common
*
common
=
ath9k_hw_common
(
priv
->
ah
);
struct
ath9k_htc_target_vif
hvif
;
int
ret
=
0
;
u8
cmd_rsp
;
if
(
priv
->
nvifs
>
0
)
return
-
ENOBUFS
;
memset
(
&
hvif
,
0
,
sizeof
(
struct
ath9k_htc_target_vif
));
memcpy
(
&
hvif
.
myaddr
,
common
->
macaddr
,
ETH_ALEN
);
hvif
.
opmode
=
cpu_to_be32
(
HTC_M_MONITOR
);
priv
->
ah
->
opmode
=
NL80211_IFTYPE_MONITOR
;
hvif
.
index
=
priv
->
nvifs
;
WMI_CMD_BUF
(
WMI_VAP_CREATE_CMDID
,
&
hvif
);
if
(
ret
)
return
ret
;
priv
->
nvifs
++
;
return
0
;
}
static
int
ath9k_htc_remove_monitor_interface
(
struct
ath9k_htc_priv
*
priv
)
{
struct
ath_common
*
common
=
ath9k_hw_common
(
priv
->
ah
);
struct
ath9k_htc_target_vif
hvif
;
int
ret
=
0
;
u8
cmd_rsp
;
memset
(
&
hvif
,
0
,
sizeof
(
struct
ath9k_htc_target_vif
));
memcpy
(
&
hvif
.
myaddr
,
common
->
macaddr
,
ETH_ALEN
);
hvif
.
index
=
0
;
/* Should do for now */
WMI_CMD_BUF
(
WMI_VAP_REMOVE_CMDID
,
&
hvif
);
priv
->
nvifs
--
;
return
ret
;
}
static
int
ath9k_htc_add_station
(
struct
ath9k_htc_priv
*
priv
,
struct
ieee80211_vif
*
vif
,
struct
ieee80211_sta
*
sta
)
...
...
@@ -1240,16 +1199,6 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
WMI_CMD
(
WMI_STOP_RECV_CMDID
);
skb_queue_purge
(
&
priv
->
tx_queue
);
/* Remove monitor interface here */
if
(
ah
->
opmode
==
NL80211_IFTYPE_MONITOR
)
{
if
(
ath9k_htc_remove_monitor_interface
(
priv
))
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to remove monitor interface
\n
"
);
else
ath_print
(
common
,
ATH_DBG_CONFIG
,
"Monitor interface removed
\n
"
);
}
if
(
ah
->
btcoex_hw
.
enabled
)
{
ath9k_hw_btcoex_disable
(
ah
);
if
(
ah
->
btcoex_hw
.
scheme
==
ATH_BTCOEX_CFG_3WIRE
)
...
...
@@ -1400,7 +1349,9 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
ath_print
(
common
,
ATH_DBG_CONFIG
,
"Set channel: %d MHz
\n
"
,
curchan
->
center_freq
);
ath9k_cmn_update_ichannel
(
hw
,
&
priv
->
ah
->
channels
[
pos
]);
ath9k_cmn_update_ichannel
(
&
priv
->
ah
->
channels
[
pos
],
hw
->
conf
.
channel
,
hw
->
conf
.
channel_type
);
if
(
ath9k_htc_set_channel
(
priv
,
hw
,
&
priv
->
ah
->
channels
[
pos
])
<
0
)
{
ath_print
(
common
,
ATH_DBG_FATAL
,
...
...
@@ -1421,16 +1372,13 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
}
}
if
(
changed
&
IEEE80211_CONF_CHANGE_MONITOR
)
{
if
(
changed
&
IEEE80211_CONF_CHANGE_MONITOR
)
if
(
conf
->
flags
&
IEEE80211_CONF_MONITOR
)
{
if
(
ath9k_htc_add_monitor_interface
(
priv
))
ath_print
(
common
,
ATH_DBG_FATAL
,
"Failed to set monitor mode
\n
"
);
else
ath_print
(
common
,
ATH_DBG_CONFIG
,
"HW opmode set to Monitor mode
\n
"
);
ath_print
(
common
,
ATH_DBG_CONFIG
,
"HW opmode set to Monitor mode
\n
"
);
priv
->
ah
->
opmode
=
NL80211_IFTYPE_MONITOR
;
}
}
if
(
changed
&
IEEE80211_CONF_CHANGE_IDLE
)
{
mutex_lock
(
&
priv
->
htc_pm_lock
);
...
...
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
浏览文件 @
b5e41567
...
...
@@ -20,8 +20,15 @@
/* TX */
/******/
static
const
int
subtype_txq_to_hwq
[]
=
{
[
WME_AC_BE
]
=
ATH_TXQ_AC_BE
,
[
WME_AC_BK
]
=
ATH_TXQ_AC_BK
,
[
WME_AC_VI
]
=
ATH_TXQ_AC_VI
,
[
WME_AC_VO
]
=
ATH_TXQ_AC_VO
,
};
#define ATH9K_HTC_INIT_TXQ(subtype) do { \
qi.tqi_subtype = subtype
;
\
qi.tqi_subtype = subtype
_txq_to_hwq[subtype];
\
qi.tqi_aifs = ATH9K_TXQ_USEDEFAULT; \
qi.tqi_cwmin = ATH9K_TXQ_USEDEFAULT; \
qi.tqi_cwmax = ATH9K_TXQ_USEDEFAULT; \
...
...
drivers/net/wireless/ath/ath9k/hw.c
浏览文件 @
b5e41567
...
...
@@ -1170,7 +1170,7 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,
channel
->
max_antenna_gain
*
2
,
channel
->
max_power
*
2
,
min
((
u32
)
MAX_RATE_POWER
,
(
u32
)
regulatory
->
power_limit
));
(
u32
)
regulatory
->
power_limit
)
,
false
);
ath9k_hw_rfbus_done
(
ah
);
...
...
@@ -2176,7 +2176,7 @@ bool ath9k_hw_disable(struct ath_hw *ah)
}
EXPORT_SYMBOL
(
ath9k_hw_disable
);
void
ath9k_hw_set_txpowerlimit
(
struct
ath_hw
*
ah
,
u32
limit
)
void
ath9k_hw_set_txpowerlimit
(
struct
ath_hw
*
ah
,
u32
limit
,
bool
test
)
{
struct
ath_regulatory
*
regulatory
=
ath9k_hw_regulatory
(
ah
);
struct
ath9k_channel
*
chan
=
ah
->
curchan
;
...
...
@@ -2189,7 +2189,7 @@ void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit)
channel
->
max_antenna_gain
*
2
,
channel
->
max_power
*
2
,
min
((
u32
)
MAX_RATE_POWER
,
(
u32
)
regulatory
->
power_limit
));
(
u32
)
regulatory
->
power_limit
)
,
test
);
}
EXPORT_SYMBOL
(
ath9k_hw_set_txpowerlimit
);
...
...
@@ -2323,11 +2323,10 @@ static u32 rightmost_index(struct ath_gen_timer_table *timer_table, u32 *mask)
return
timer_table
->
gen_timer_index
[
b
];
}
u32
ath9k_hw_gettsf32
(
struct
ath_hw
*
ah
)
static
u32
ath9k_hw_gettsf32
(
struct
ath_hw
*
ah
)
{
return
REG_READ
(
ah
,
AR_TSF_L32
);
}
EXPORT_SYMBOL
(
ath9k_hw_gettsf32
);
struct
ath_gen_timer
*
ath_gen_timer_alloc
(
struct
ath_hw
*
ah
,
void
(
*
trigger
)(
void
*
),
...
...
drivers/net/wireless/ath/ath9k/hw.h
浏览文件 @
b5e41567
...
...
@@ -157,6 +157,13 @@
#define PAPRD_GAIN_TABLE_ENTRIES 32
#define PAPRD_TABLE_SZ 24
enum
ath_hw_txq_subtype
{
ATH_TXQ_AC_BE
=
0
,
ATH_TXQ_AC_BK
=
1
,
ATH_TXQ_AC_VI
=
2
,
ATH_TXQ_AC_VO
=
3
,
};
enum
ath_ini_subsys
{
ATH_INI_PRE
=
0
,
ATH_INI_CORE
,
...
...
@@ -819,12 +826,6 @@ static inline struct ath_hw_ops *ath9k_hw_ops(struct ath_hw *ah)
return
&
ah
->
ops
;
}
static
inline
int
sign_extend
(
int
val
,
const
int
nbits
)
{
int
order
=
BIT
(
nbits
-
1
);
return
(
val
^
order
)
-
order
;
}
/* Initialization, Detach, Reset */
const
char
*
ath9k_hw_probe
(
u16
vendorid
,
u16
devid
);
void
ath9k_hw_deinit
(
struct
ath_hw
*
ah
);
...
...
@@ -861,7 +862,7 @@ u32 ath9k_hw_getrxfilter(struct ath_hw *ah);
void
ath9k_hw_setrxfilter
(
struct
ath_hw
*
ah
,
u32
bits
);
bool
ath9k_hw_phy_disable
(
struct
ath_hw
*
ah
);
bool
ath9k_hw_disable
(
struct
ath_hw
*
ah
);
void
ath9k_hw_set_txpowerlimit
(
struct
ath_hw
*
ah
,
u32
limit
);
void
ath9k_hw_set_txpowerlimit
(
struct
ath_hw
*
ah
,
u32
limit
,
bool
test
);
void
ath9k_hw_setopmode
(
struct
ath_hw
*
ah
);
void
ath9k_hw_setmcastfilter
(
struct
ath_hw
*
ah
,
u32
filter0
,
u32
filter1
);
void
ath9k_hw_setbssidmask
(
struct
ath_hw
*
ah
);
...
...
@@ -893,7 +894,6 @@ void ath9k_hw_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer);
void
ath_gen_timer_free
(
struct
ath_hw
*
ah
,
struct
ath_gen_timer
*
timer
);
void
ath_gen_timer_isr
(
struct
ath_hw
*
hw
);
u32
ath9k_hw_gettsf32
(
struct
ath_hw
*
ah
);
void
ath9k_hw_name
(
struct
ath_hw
*
ah
,
char
*
hw_name
,
size_t
len
);
...
...
drivers/net/wireless/ath/ath9k/init.c
浏览文件 @
b5e41567
...
...
@@ -398,7 +398,8 @@ static void ath9k_init_crypto(struct ath_softc *sc)
static
int
ath9k_init_btcoex
(
struct
ath_softc
*
sc
)
{
int
r
,
qnum
;
struct
ath_txq
*
txq
;
int
r
;
switch
(
sc
->
sc_ah
->
btcoex_hw
.
scheme
)
{
case
ATH_BTCOEX_CFG_NONE
:
...
...
@@ -411,8 +412,8 @@ static int ath9k_init_btcoex(struct ath_softc *sc)
r
=
ath_init_btcoex_timer
(
sc
);
if
(
r
)
return
-
1
;
qnum
=
sc
->
tx
.
hw
q_map
[
WME_AC_BE
];
ath9k_hw_init_btcoex_hw
(
sc
->
sc_ah
,
qnum
);
txq
=
sc
->
tx
.
tx
q_map
[
WME_AC_BE
];
ath9k_hw_init_btcoex_hw
(
sc
->
sc_ah
,
txq
->
axq_
qnum
);
sc
->
btcoex
.
bt_stomp_type
=
ATH_BTCOEX_STOMP_LOW
;
break
;
default:
...
...
@@ -425,59 +426,18 @@ static int ath9k_init_btcoex(struct ath_softc *sc)
static
int
ath9k_init_queues
(
struct
ath_softc
*
sc
)
{
struct
ath_common
*
common
=
ath9k_hw_common
(
sc
->
sc_ah
);
int
i
=
0
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
sc
->
tx
.
hwq_map
);
i
++
)
sc
->
tx
.
hwq_map
[
i
]
=
-
1
;
sc
->
beacon
.
beaconq
=
ath9k_hw_beaconq_setup
(
sc
->
sc_ah
);
if
(
sc
->
beacon
.
beaconq
==
-
1
)
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to setup a beacon xmit queue
\n
"
);
goto
err
;
}
sc
->
beacon
.
cabq
=
ath_txq_setup
(
sc
,
ATH9K_TX_QUEUE_CAB
,
0
);
if
(
sc
->
beacon
.
cabq
==
NULL
)
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to setup CAB xmit queue
\n
"
);
goto
err
;
}
sc
->
config
.
cabqReadytime
=
ATH_CABQ_READY_TIME
;
ath_cabq_update
(
sc
);
if
(
!
ath_tx_setup
(
sc
,
WME_AC_BK
))
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to setup xmit queue for BK traffic
\n
"
);
goto
err
;
}
if
(
!
ath_tx_setup
(
sc
,
WME_AC_BE
))
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to setup xmit queue for BE traffic
\n
"
);
goto
err
;
}
if
(
!
ath_tx_setup
(
sc
,
WME_AC_VI
))
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to setup xmit queue for VI traffic
\n
"
);
goto
err
;
}
if
(
!
ath_tx_setup
(
sc
,
WME_AC_VO
))
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to setup xmit queue for VO traffic
\n
"
);
goto
err
;
}
for
(
i
=
0
;
i
<
WME_NUM_AC
;
i
++
)
sc
->
tx
.
txq_map
[
i
]
=
ath_txq_setup
(
sc
,
ATH9K_TX_QUEUE_DATA
,
i
);
return
0
;
err:
for
(
i
=
0
;
i
<
ATH9K_NUM_TX_QUEUES
;
i
++
)
if
(
ATH_TXQ_SETUP
(
sc
,
i
))
ath_tx_cleanupq
(
sc
,
&
sc
->
tx
.
txq
[
i
]);
return
-
EIO
;
}
static
int
ath9k_init_channels_rates
(
struct
ath_softc
*
sc
)
...
...
@@ -583,7 +543,6 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
spin_lock_init
(
&
common
->
cc_lock
);
spin_lock_init
(
&
sc
->
wiphy_lock
);
spin_lock_init
(
&
sc
->
sc_resetlock
);
spin_lock_init
(
&
sc
->
sc_serial_rw
);
spin_lock_init
(
&
sc
->
sc_pm_lock
);
mutex_init
(
&
sc
->
mutex
);
...
...
@@ -645,6 +604,37 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
return
ret
;
}
static
void
ath9k_init_band_txpower
(
struct
ath_softc
*
sc
,
int
band
)
{
struct
ieee80211_supported_band
*
sband
;
struct
ieee80211_channel
*
chan
;
struct
ath_hw
*
ah
=
sc
->
sc_ah
;
struct
ath_regulatory
*
reg
=
ath9k_hw_regulatory
(
ah
);
int
i
;
sband
=
&
sc
->
sbands
[
band
];
for
(
i
=
0
;
i
<
sband
->
n_channels
;
i
++
)
{
chan
=
&
sband
->
channels
[
i
];
ah
->
curchan
=
&
ah
->
channels
[
chan
->
hw_value
];
ath9k_cmn_update_ichannel
(
ah
->
curchan
,
chan
,
NL80211_CHAN_HT20
);
ath9k_hw_set_txpowerlimit
(
ah
,
MAX_RATE_POWER
,
true
);
chan
->
max_power
=
reg
->
max_power_level
/
2
;
}
}
static
void
ath9k_init_txpower_limits
(
struct
ath_softc
*
sc
)
{
struct
ath_hw
*
ah
=
sc
->
sc_ah
;
struct
ath9k_channel
*
curchan
=
ah
->
curchan
;
if
(
ah
->
caps
.
hw_caps
&
ATH9K_HW_CAP_2GHZ
)
ath9k_init_band_txpower
(
sc
,
IEEE80211_BAND_2GHZ
);
if
(
ah
->
caps
.
hw_caps
&
ATH9K_HW_CAP_5GHZ
)
ath9k_init_band_txpower
(
sc
,
IEEE80211_BAND_5GHZ
);
ah
->
curchan
=
curchan
;
}
void
ath9k_set_hw_capab
(
struct
ath_softc
*
sc
,
struct
ieee80211_hw
*
hw
)
{
struct
ath_common
*
common
=
ath9k_hw_common
(
sc
->
sc_ah
);
...
...
@@ -706,6 +696,7 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
const
struct
ath_bus_ops
*
bus_ops
)
{
struct
ieee80211_hw
*
hw
=
sc
->
hw
;
struct
ath_wiphy
*
aphy
=
hw
->
priv
;
struct
ath_common
*
common
;
struct
ath_hw
*
ah
;
int
error
=
0
;
...
...
@@ -738,6 +729,8 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
if
(
error
!=
0
)
goto
error_rx
;
ath9k_init_txpower_limits
(
sc
);
/* Register with mac80211 */
error
=
ieee80211_register_hw
(
hw
);
if
(
error
)
...
...
@@ -755,6 +748,7 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
INIT_WORK
(
&
sc
->
chan_work
,
ath9k_wiphy_chan_work
);
INIT_DELAYED_WORK
(
&
sc
->
wiphy_work
,
ath9k_wiphy_work
);
sc
->
wiphy_scheduler_int
=
msecs_to_jiffies
(
500
);
aphy
->
last_rssi
=
ATH_RSSI_DUMMY_MARKER
;
ath_init_leds
(
sc
);
ath_start_rfkill_poll
(
sc
);
...
...
drivers/net/wireless/ath/ath9k/mac.c
浏览文件 @
b5e41567
...
...
@@ -117,12 +117,11 @@ EXPORT_SYMBOL(ath9k_hw_numtxpending);
bool
ath9k_hw_updatetxtriglevel
(
struct
ath_hw
*
ah
,
bool
bIncTrigLevel
)
{
u32
txcfg
,
curLevel
,
newLevel
;
enum
ath9k_int
omask
;
if
(
ah
->
tx_trig_level
>=
ah
->
config
.
max_txtrig_level
)
return
false
;
omask
=
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
&
~
ATH9K_INT_GLOBAL
);
ath9k_hw_disable_interrupts
(
ah
);
txcfg
=
REG_READ
(
ah
,
AR_TXCFG
);
curLevel
=
MS
(
txcfg
,
AR_FTRIG
);
...
...
@@ -136,7 +135,7 @@ bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel)
REG_WRITE
(
ah
,
AR_TXCFG
,
(
txcfg
&
~
AR_FTRIG
)
|
SM
(
newLevel
,
AR_FTRIG
));
ath9k_hw_
set_interrupts
(
ah
,
omask
);
ath9k_hw_
enable_interrupts
(
ah
);
ah
->
tx_trig_level
=
newLevel
;
...
...
@@ -849,28 +848,59 @@ bool ath9k_hw_intrpend(struct ath_hw *ah)
}
EXPORT_SYMBOL
(
ath9k_hw_intrpend
);
enum
ath9k_int
ath9k_hw_set_interrupts
(
struct
ath_hw
*
ah
,
enum
ath9k_int
ints
)
void
ath9k_hw_disable_interrupts
(
struct
ath_hw
*
ah
)
{
struct
ath_common
*
common
=
ath9k_hw_common
(
ah
);
ath_print
(
common
,
ATH_DBG_INTERRUPT
,
"disable IER
\n
"
);
REG_WRITE
(
ah
,
AR_IER
,
AR_IER_DISABLE
);
(
void
)
REG_READ
(
ah
,
AR_IER
);
if
(
!
AR_SREV_9100
(
ah
))
{
REG_WRITE
(
ah
,
AR_INTR_ASYNC_ENABLE
,
0
);
(
void
)
REG_READ
(
ah
,
AR_INTR_ASYNC_ENABLE
);
REG_WRITE
(
ah
,
AR_INTR_SYNC_ENABLE
,
0
);
(
void
)
REG_READ
(
ah
,
AR_INTR_SYNC_ENABLE
);
}
}
EXPORT_SYMBOL
(
ath9k_hw_disable_interrupts
);
void
ath9k_hw_enable_interrupts
(
struct
ath_hw
*
ah
)
{
struct
ath_common
*
common
=
ath9k_hw_common
(
ah
);
if
(
!
(
ah
->
imask
&
ATH9K_INT_GLOBAL
))
return
;
ath_print
(
common
,
ATH_DBG_INTERRUPT
,
"enable IER
\n
"
);
REG_WRITE
(
ah
,
AR_IER
,
AR_IER_ENABLE
);
if
(
!
AR_SREV_9100
(
ah
))
{
REG_WRITE
(
ah
,
AR_INTR_ASYNC_ENABLE
,
AR_INTR_MAC_IRQ
);
REG_WRITE
(
ah
,
AR_INTR_ASYNC_MASK
,
AR_INTR_MAC_IRQ
);
REG_WRITE
(
ah
,
AR_INTR_SYNC_ENABLE
,
AR_INTR_SYNC_DEFAULT
);
REG_WRITE
(
ah
,
AR_INTR_SYNC_MASK
,
AR_INTR_SYNC_DEFAULT
);
}
ath_print
(
common
,
ATH_DBG_INTERRUPT
,
"AR_IMR 0x%x IER 0x%x
\n
"
,
REG_READ
(
ah
,
AR_IMR
),
REG_READ
(
ah
,
AR_IER
));
}
EXPORT_SYMBOL
(
ath9k_hw_enable_interrupts
);
void
ath9k_hw_set_interrupts
(
struct
ath_hw
*
ah
,
enum
ath9k_int
ints
)
{
enum
ath9k_int
omask
=
ah
->
imask
;
u32
mask
,
mask2
;
struct
ath9k_hw_capabilities
*
pCap
=
&
ah
->
caps
;
struct
ath_common
*
common
=
ath9k_hw_common
(
ah
);
ath_print
(
common
,
ATH_DBG_INTERRUPT
,
"0x%x => 0x%x
\n
"
,
omask
,
ints
);
if
(
omask
&
ATH9K_INT_GLOBAL
)
{
ath_print
(
common
,
ATH_DBG_INTERRUPT
,
"disable IER
\n
"
);
REG_WRITE
(
ah
,
AR_IER
,
AR_IER_DISABLE
);
(
void
)
REG_READ
(
ah
,
AR_IER
);
if
(
!
AR_SREV_9100
(
ah
))
{
REG_WRITE
(
ah
,
AR_INTR_ASYNC_ENABLE
,
0
);
(
void
)
REG_READ
(
ah
,
AR_INTR_ASYNC_ENABLE
);
if
(
!
(
ints
&
ATH9K_INT_GLOBAL
))
ath9k_hw_enable_interrupts
(
ah
);
REG_WRITE
(
ah
,
AR_INTR_SYNC_ENABLE
,
0
);
(
void
)
REG_READ
(
ah
,
AR_INTR_SYNC_ENABLE
);
}
}
ath_print
(
common
,
ATH_DBG_INTERRUPT
,
"0x%x => 0x%x
\n
"
,
omask
,
ints
);
/* TODO: global int Ref count */
mask
=
ints
&
ATH9K_INT_COMMON
;
...
...
@@ -946,24 +976,8 @@ enum ath9k_int ath9k_hw_set_interrupts(struct ath_hw *ah,
REG_CLR_BIT
(
ah
,
AR_IMR_S5
,
AR_IMR_S5_TIM_TIMER
);
}
if
(
ints
&
ATH9K_INT_GLOBAL
)
{
ath_print
(
common
,
ATH_DBG_INTERRUPT
,
"enable IER
\n
"
);
REG_WRITE
(
ah
,
AR_IER
,
AR_IER_ENABLE
);
if
(
!
AR_SREV_9100
(
ah
))
{
REG_WRITE
(
ah
,
AR_INTR_ASYNC_ENABLE
,
AR_INTR_MAC_IRQ
);
REG_WRITE
(
ah
,
AR_INTR_ASYNC_MASK
,
AR_INTR_MAC_IRQ
);
REG_WRITE
(
ah
,
AR_INTR_SYNC_ENABLE
,
AR_INTR_SYNC_DEFAULT
);
REG_WRITE
(
ah
,
AR_INTR_SYNC_MASK
,
AR_INTR_SYNC_DEFAULT
);
}
ath_print
(
common
,
ATH_DBG_INTERRUPT
,
"AR_IMR 0x%x IER 0x%x
\n
"
,
REG_READ
(
ah
,
AR_IMR
),
REG_READ
(
ah
,
AR_IER
));
}
ath9k_hw_enable_interrupts
(
ah
);
return
omask
;
return
;
}
EXPORT_SYMBOL
(
ath9k_hw_set_interrupts
);
drivers/net/wireless/ath/ath9k/mac.h
浏览文件 @
b5e41567
...
...
@@ -104,13 +104,11 @@ struct ath_tx_status {
u32
ts_tstamp
;
u16
ts_seqnum
;
u8
ts_status
;
u8
ts_ratecode
;
u8
ts_rateindex
;
int8_t
ts_rssi
;
u8
ts_shortretry
;
u8
ts_longretry
;
u8
ts_virtcol
;
u8
ts_antenna
;
u8
ts_flags
;
int8_t
ts_rssi_ctl0
;
int8_t
ts_rssi_ctl1
;
...
...
@@ -121,7 +119,6 @@ struct ath_tx_status {
u8
qid
;
u16
desc_id
;
u8
tid
;
u8
pad
[
2
];
u32
ba_low
;
u32
ba_high
;
u32
evm0
;
...
...
@@ -240,7 +237,7 @@ struct ath_desc {
u32
ds_ctl1
;
u32
ds_hw
[
20
];
void
*
ds_vdata
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
#define ATH9K_TXDESC_CLRDMASK 0x0001
#define ATH9K_TXDESC_NOACK 0x0002
...
...
@@ -310,7 +307,7 @@ struct ar5416_desc {
u32
status8
;
}
rx
;
}
u
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
#define AR5416DESC(_ds) ((struct ar5416_desc *)(_ds))
#define AR5416DESC_CONST(_ds) ((const struct ar5416_desc *)(_ds))
...
...
@@ -669,6 +666,7 @@ enum ath9k_key_type {
struct
ath_hw
;
struct
ath9k_channel
;
enum
ath9k_int
;
u32
ath9k_hw_gettxbuf
(
struct
ath_hw
*
ah
,
u32
q
);
void
ath9k_hw_puttxbuf
(
struct
ath_hw
*
ah
,
u32
q
,
u32
txdp
);
...
...
@@ -700,8 +698,9 @@ int ath9k_hw_beaconq_setup(struct ath_hw *ah);
/* Interrupt Handling */
bool
ath9k_hw_intrpend
(
struct
ath_hw
*
ah
);
enum
ath9k_int
ath9k_hw_set_interrupts
(
struct
ath_hw
*
ah
,
enum
ath9k_int
ints
);
void
ath9k_hw_set_interrupts
(
struct
ath_hw
*
ah
,
enum
ath9k_int
ints
);
void
ath9k_hw_enable_interrupts
(
struct
ath_hw
*
ah
);
void
ath9k_hw_disable_interrupts
(
struct
ath_hw
*
ah
);
void
ar9002_hw_attach_mac_ops
(
struct
ath_hw
*
ah
);
...
...
drivers/net/wireless/ath/ath9k/main.c
浏览文件 @
b5e41567
...
...
@@ -24,7 +24,7 @@ static void ath_update_txpow(struct ath_softc *sc)
struct
ath_hw
*
ah
=
sc
->
sc_ah
;
if
(
sc
->
curtxpow
!=
sc
->
config
.
txpowlimit
)
{
ath9k_hw_set_txpowerlimit
(
ah
,
sc
->
config
.
txpowlimit
);
ath9k_hw_set_txpowerlimit
(
ah
,
sc
->
config
.
txpowlimit
,
false
);
/* read back in case value is clamped */
sc
->
curtxpow
=
ath9k_hw_regulatory
(
ah
)
->
power_limit
;
}
...
...
@@ -235,6 +235,8 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
ath9k_ps_wakeup
(
sc
);
spin_lock_bh
(
&
sc
->
sc_pcu_lock
);
/*
* This is only performed if the channel settings have
* actually changed.
...
...
@@ -244,11 +246,9 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
* hardware at the new frequency, and then re-enable
* the relevant bits of the h/w.
*/
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
ath_drain_all_txq
(
sc
,
false
);
spin_lock_bh
(
&
sc
->
rx
.
pcu_lock
);
stopped
=
ath_stoprecv
(
sc
);
/* XXX: do not flush receive queue here. We don't want
...
...
@@ -267,30 +267,22 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
channel
->
center_freq
,
conf_is_ht40
(
conf
),
fastcc
);
spin_lock_bh
(
&
sc
->
sc_resetlock
);
r
=
ath9k_hw_reset
(
ah
,
hchan
,
caldata
,
fastcc
);
if
(
r
)
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to reset channel (%u MHz), "
"reset status %d
\n
"
,
channel
->
center_freq
,
r
);
spin_unlock_bh
(
&
sc
->
sc_resetlock
);
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
goto
ps_restore
;
}
spin_unlock_bh
(
&
sc
->
sc_resetlock
);
if
(
ath_startrecv
(
sc
)
!=
0
)
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to restart recv logic
\n
"
);
r
=
-
EIO
;
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
goto
ps_restore
;
}
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
ath_update_txpow
(
sc
);
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
);
...
...
@@ -301,6 +293,8 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
}
ps_restore:
spin_unlock_bh
(
&
sc
->
sc_pcu_lock
);
ath9k_ps_restore
(
sc
);
return
r
;
}
...
...
@@ -341,7 +335,7 @@ void ath_paprd_calibrate(struct work_struct *work)
struct
ath_tx_control
txctl
;
struct
ath9k_hw_cal_data
*
caldata
=
ah
->
caldata
;
struct
ath_common
*
common
=
ath9k_hw_common
(
ah
);
int
qnum
,
ftype
;
int
ftype
;
int
chain_ok
=
0
;
int
chain
;
int
len
=
1800
;
...
...
@@ -368,8 +362,7 @@ void ath_paprd_calibrate(struct work_struct *work)
memcpy
(
hdr
->
addr3
,
hw
->
wiphy
->
perm_addr
,
ETH_ALEN
);
memset
(
&
txctl
,
0
,
sizeof
(
txctl
));
qnum
=
sc
->
tx
.
hwq_map
[
WME_AC_BE
];
txctl
.
txq
=
&
sc
->
tx
.
txq
[
qnum
];
txctl
.
txq
=
sc
->
tx
.
txq_map
[
WME_AC_BE
];
ath9k_ps_wakeup
(
sc
);
ar9003_paprd_init_table
(
ah
);
...
...
@@ -567,7 +560,6 @@ static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta)
an
->
maxampdu
=
1
<<
(
IEEE80211_HT_MAX_AMPDU_FACTOR
+
sta
->
ht_cap
.
ampdu_factor
);
an
->
mpdudensity
=
parse_mpdudensity
(
sta
->
ht_cap
.
ampdu_density
);
an
->
last_rssi
=
ATH_RSSI_DUMMY_MARKER
;
}
}
...
...
@@ -615,6 +607,8 @@ void ath9k_tasklet(unsigned long data)
return
;
}
spin_lock_bh
(
&
sc
->
sc_pcu_lock
);
if
(
!
ath9k_hw_check_alive
(
ah
))
ieee80211_queue_work
(
sc
->
hw
,
&
sc
->
hw_check_work
);
...
...
@@ -625,15 +619,12 @@ void ath9k_tasklet(unsigned long data)
rxmask
=
(
ATH9K_INT_RX
|
ATH9K_INT_RXEOL
|
ATH9K_INT_RXORN
);
if
(
status
&
rxmask
)
{
spin_lock_bh
(
&
sc
->
rx
.
pcu_lock
);
/* Check for high priority Rx first */
if
((
ah
->
caps
.
hw_caps
&
ATH9K_HW_CAP_EDMA
)
&&
(
status
&
ATH9K_INT_RXHP
))
ath_rx_tasklet
(
sc
,
0
,
true
);
ath_rx_tasklet
(
sc
,
0
,
false
);
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
}
if
(
status
&
ATH9K_INT_TX
)
{
...
...
@@ -658,7 +649,9 @@ void ath9k_tasklet(unsigned long data)
ath_gen_timer_isr
(
sc
->
sc_ah
);
/* re-enable hardware interrupt */
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
);
ath9k_hw_enable_interrupts
(
ah
);
spin_unlock_bh
(
&
sc
->
sc_pcu_lock
);
ath9k_ps_restore
(
sc
);
}
...
...
@@ -757,7 +750,7 @@ irqreturn_t ath_isr(int irq, void *dev)
* interrupt; otherwise it will continue to
* fire.
*/
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
/*
* Let the hal handle the event. We assume
* it will clear whatever condition caused
...
...
@@ -766,7 +759,7 @@ irqreturn_t ath_isr(int irq, void *dev)
spin_lock
(
&
common
->
cc_lock
);
ath9k_hw_proc_mib_event
(
ah
);
spin_unlock
(
&
common
->
cc_lock
);
ath9k_hw_
set_interrupts
(
ah
,
ah
->
imask
);
ath9k_hw_
enable_interrupts
(
ah
);
}
if
(
!
(
ah
->
caps
.
hw_caps
&
ATH9K_HW_CAP_AUTOSLEEP
))
...
...
@@ -783,8 +776,8 @@ irqreturn_t ath_isr(int irq, void *dev)
ath_debug_stat_interrupt
(
sc
,
status
);
if
(
sched
)
{
/* turn off every interrupt
except SWBA
*/
ath9k_hw_
set_interrupts
(
ah
,
(
ah
->
imask
&
ATH9K_INT_SWBA
)
);
/* turn off every interrupt */
ath9k_hw_
disable_interrupts
(
ah
);
tasklet_schedule
(
&
sc
->
intr_tq
);
}
...
...
@@ -836,9 +829,11 @@ static u32 ath_get_extchanmode(struct ath_softc *sc,
}
static
void
ath9k_bss_assoc_info
(
struct
ath_softc
*
sc
,
struct
ieee80211_hw
*
hw
,
struct
ieee80211_vif
*
vif
,
struct
ieee80211_bss_conf
*
bss_conf
)
{
struct
ath_wiphy
*
aphy
=
hw
->
priv
;
struct
ath_hw
*
ah
=
sc
->
sc_ah
;
struct
ath_common
*
common
=
ath9k_hw_common
(
ah
);
...
...
@@ -862,6 +857,7 @@ static void ath9k_bss_assoc_info(struct ath_softc *sc,
ath_beacon_config
(
sc
,
vif
);
/* Reset rssi stats */
aphy
->
last_rssi
=
ATH_RSSI_DUMMY_MARKER
;
sc
->
sc_ah
->
stats
.
avgbrssi
=
ATH_RSSI_DUMMY_MARKER
;
sc
->
sc_flags
|=
SC_OP_ANI_RUN
;
...
...
@@ -883,13 +879,13 @@ void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw)
int
r
;
ath9k_ps_wakeup
(
sc
);
spin_lock_bh
(
&
sc
->
sc_pcu_lock
);
ath9k_hw_configpcipowersave
(
ah
,
0
,
0
);
if
(
!
ah
->
curchan
)
ah
->
curchan
=
ath_get_curchannel
(
sc
,
sc
->
hw
);
spin_lock_bh
(
&
sc
->
rx
.
pcu_lock
);
spin_lock_bh
(
&
sc
->
sc_resetlock
);
r
=
ath9k_hw_reset
(
ah
,
ah
->
curchan
,
ah
->
caldata
,
false
);
if
(
r
)
{
ath_print
(
common
,
ATH_DBG_FATAL
,
...
...
@@ -897,17 +893,14 @@ void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw)
"reset status %d
\n
"
,
channel
->
center_freq
,
r
);
}
spin_unlock_bh
(
&
sc
->
sc_resetlock
);
ath_update_txpow
(
sc
);
if
(
ath_startrecv
(
sc
)
!=
0
)
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to restart recv logic
\n
"
);
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
spin_unlock_bh
(
&
sc
->
sc_
pcu_lock
);
return
;
}
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
if
(
sc
->
sc_flags
&
SC_OP_BEACONS
)
ath_beacon_config
(
sc
,
NULL
);
/* restart beacons */
...
...
@@ -920,6 +913,8 @@ void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw)
ath9k_hw_set_gpio
(
ah
,
ah
->
led_pin
,
0
);
ieee80211_wake_queues
(
hw
);
spin_unlock_bh
(
&
sc
->
sc_pcu_lock
);
ath9k_ps_restore
(
sc
);
}
...
...
@@ -930,6 +925,8 @@ void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
int
r
;
ath9k_ps_wakeup
(
sc
);
spin_lock_bh
(
&
sc
->
sc_pcu_lock
);
ieee80211_stop_queues
(
hw
);
/*
...
...
@@ -942,19 +939,16 @@ void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
}
/* Disable interrupts */
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
ath_drain_all_txq
(
sc
,
false
);
/* clear pending tx frames */
spin_lock_bh
(
&
sc
->
rx
.
pcu_lock
);
ath_stoprecv
(
sc
);
/* turn off frame recv */
ath_flushrecv
(
sc
);
/* flush recv queue */
if
(
!
ah
->
curchan
)
ah
->
curchan
=
ath_get_curchannel
(
sc
,
hw
);
spin_lock_bh
(
&
sc
->
sc_resetlock
);
r
=
ath9k_hw_reset
(
ah
,
ah
->
curchan
,
ah
->
caldata
,
false
);
if
(
r
)
{
ath_print
(
ath9k_hw_common
(
sc
->
sc_ah
),
ATH_DBG_FATAL
,
...
...
@@ -962,14 +956,14 @@ void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
"reset status %d
\n
"
,
channel
->
center_freq
,
r
);
}
spin_unlock_bh
(
&
sc
->
sc_resetlock
);
ath9k_hw_phy_disable
(
ah
);
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
ath9k_hw_configpcipowersave
(
ah
,
1
,
1
);
spin_unlock_bh
(
&
sc
->
sc_pcu_lock
);
ath9k_ps_restore
(
sc
);
ath9k_setpower
(
sc
,
ATH9K_PM_FULL_SLEEP
);
}
...
...
@@ -983,29 +977,25 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
/* Stop ANI */
del_timer_sync
(
&
common
->
ani
.
timer
);
spin_lock_bh
(
&
sc
->
sc_pcu_lock
);
ieee80211_stop_queues
(
hw
);
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
ath_drain_all_txq
(
sc
,
retry_tx
);
spin_lock_bh
(
&
sc
->
rx
.
pcu_lock
);
ath_stoprecv
(
sc
);
ath_flushrecv
(
sc
);
spin_lock_bh
(
&
sc
->
sc_resetlock
);
r
=
ath9k_hw_reset
(
ah
,
sc
->
sc_ah
->
curchan
,
ah
->
caldata
,
false
);
if
(
r
)
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to reset hardware; reset status %d
\n
"
,
r
);
spin_unlock_bh
(
&
sc
->
sc_resetlock
);
if
(
ath_startrecv
(
sc
)
!=
0
)
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to start recv logic
\n
"
);
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
/*
* We may be doing a reset in response to a request
* that changes the channel so update any state that
...
...
@@ -1030,6 +1020,7 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
}
ieee80211_wake_queues
(
hw
);
spin_unlock_bh
(
&
sc
->
sc_pcu_lock
);
/* Start ANI */
ath_start_ani
(
common
);
...
...
@@ -1037,56 +1028,6 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
return
r
;
}
static
int
ath_get_hal_qnum
(
u16
queue
,
struct
ath_softc
*
sc
)
{
int
qnum
;
switch
(
queue
)
{
case
0
:
qnum
=
sc
->
tx
.
hwq_map
[
WME_AC_VO
];
break
;
case
1
:
qnum
=
sc
->
tx
.
hwq_map
[
WME_AC_VI
];
break
;
case
2
:
qnum
=
sc
->
tx
.
hwq_map
[
WME_AC_BE
];
break
;
case
3
:
qnum
=
sc
->
tx
.
hwq_map
[
WME_AC_BK
];
break
;
default:
qnum
=
sc
->
tx
.
hwq_map
[
WME_AC_BE
];
break
;
}
return
qnum
;
}
int
ath_get_mac80211_qnum
(
u32
queue
,
struct
ath_softc
*
sc
)
{
int
qnum
;
switch
(
queue
)
{
case
WME_AC_VO
:
qnum
=
0
;
break
;
case
WME_AC_VI
:
qnum
=
1
;
break
;
case
WME_AC_BE
:
qnum
=
2
;
break
;
case
WME_AC_BK
:
qnum
=
3
;
break
;
default:
qnum
=
-
1
;
break
;
}
return
qnum
;
}
/* XXX: Remove me once we don't depend on ath9k_channel for all
* this redundant data */
void
ath9k_update_ichannel
(
struct
ath_softc
*
sc
,
struct
ieee80211_hw
*
hw
,
...
...
@@ -1168,19 +1109,16 @@ static int ath9k_start(struct ieee80211_hw *hw)
* be followed by initialization of the appropriate bits
* and then setup of the interrupt mask.
*/
spin_lock_bh
(
&
sc
->
rx
.
pcu_lock
);
spin_lock_bh
(
&
sc
->
sc_resetlock
);
spin_lock_bh
(
&
sc
->
sc_pcu_lock
);
r
=
ath9k_hw_reset
(
ah
,
init_channel
,
ah
->
caldata
,
false
);
if
(
r
)
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to reset hardware; reset status %d "
"(freq %u MHz)
\n
"
,
r
,
curchan
->
center_freq
);
spin_unlock_bh
(
&
sc
->
sc_resetlock
);
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
spin_unlock_bh
(
&
sc
->
sc_pcu_lock
);
goto
mutex_unlock
;
}
spin_unlock_bh
(
&
sc
->
sc_resetlock
);
/*
* This is needed only to setup initial state
...
...
@@ -1199,10 +1137,10 @@ static int ath9k_start(struct ieee80211_hw *hw)
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to start recv logic
\n
"
);
r
=
-
EIO
;
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
spin_unlock_bh
(
&
sc
->
sc_
pcu_lock
);
goto
mutex_unlock
;
}
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
spin_unlock_bh
(
&
sc
->
sc_
pcu_lock
);
/* Setup our intr mask. */
ah
->
imask
=
ATH9K_INT_TX
|
ATH9K_INT_RXEOL
|
...
...
@@ -1262,7 +1200,6 @@ static int ath9k_tx(struct ieee80211_hw *hw,
struct
ath_tx_control
txctl
;
int
padpos
,
padsize
;
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
int
qnum
;
if
(
aphy
->
state
!=
ATH_WIPHY_ACTIVE
&&
aphy
->
state
!=
ATH_WIPHY_SCAN
)
{
ath_print
(
common
,
ATH_DBG_XMIT
,
...
...
@@ -1335,8 +1272,7 @@ static int ath9k_tx(struct ieee80211_hw *hw,
memmove
(
skb
->
data
,
skb
->
data
+
padsize
,
padpos
);
}
qnum
=
ath_get_hal_qnum
(
skb_get_queue_mapping
(
skb
),
sc
);
txctl
.
txq
=
&
sc
->
tx
.
txq
[
qnum
];
txctl
.
txq
=
sc
->
tx
.
txq_map
[
skb_get_queue_mapping
(
skb
)];
ath_print
(
common
,
ATH_DBG_XMIT
,
"transmitting packet, skb: %p
\n
"
,
skb
);
...
...
@@ -1400,22 +1336,25 @@ static void ath9k_stop(struct ieee80211_hw *hw)
ath9k_btcoex_timer_pause
(
sc
);
}
spin_lock_bh
(
&
sc
->
sc_pcu_lock
);
/* make sure h/w will not generate any interrupt
* before setting the invalid flag. */
ath9k_hw_
set_interrupts
(
ah
,
0
);
ath9k_hw_
disable_interrupts
(
ah
);
spin_lock_bh
(
&
sc
->
rx
.
pcu_lock
);
if
(
!
(
sc
->
sc_flags
&
SC_OP_INVALID
))
{
ath_drain_all_txq
(
sc
,
false
);
ath_stoprecv
(
sc
);
ath9k_hw_phy_disable
(
ah
);
}
else
sc
->
rx
.
rxlink
=
NULL
;
spin_unlock_bh
(
&
sc
->
rx
.
pcu_lock
);
/* disable HAL and put h/w to sleep */
ath9k_hw_disable
(
ah
);
ath9k_hw_configpcipowersave
(
ah
,
1
,
1
);
spin_unlock_bh
(
&
sc
->
sc_pcu_lock
);
ath9k_ps_restore
(
sc
);
/* Finally, put the chip in FULL SLEEP mode */
...
...
@@ -1822,12 +1761,15 @@ static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
struct
ath_wiphy
*
aphy
=
hw
->
priv
;
struct
ath_softc
*
sc
=
aphy
->
sc
;
struct
ath_common
*
common
=
ath9k_hw_common
(
sc
->
sc_ah
);
struct
ath_txq
*
txq
;
struct
ath9k_tx_queue_info
qi
;
int
ret
=
0
,
qnum
;
int
ret
=
0
;
if
(
queue
>=
WME_NUM_AC
)
return
0
;
txq
=
sc
->
tx
.
txq_map
[
queue
];
mutex_lock
(
&
sc
->
mutex
);
memset
(
&
qi
,
0
,
sizeof
(
struct
ath9k_tx_queue_info
));
...
...
@@ -1836,20 +1778,19 @@ static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
qi
.
tqi_cwmin
=
params
->
cw_min
;
qi
.
tqi_cwmax
=
params
->
cw_max
;
qi
.
tqi_burstTime
=
params
->
txop
;
qnum
=
ath_get_hal_qnum
(
queue
,
sc
);
ath_print
(
common
,
ATH_DBG_CONFIG
,
"Configure tx [queue/halq] [%d/%d], "
"aifs: %d, cw_min: %d, cw_max: %d, txop: %d
\n
"
,
queue
,
qnum
,
params
->
aifs
,
params
->
cw_min
,
queue
,
txq
->
axq_
qnum
,
params
->
aifs
,
params
->
cw_min
,
params
->
cw_max
,
params
->
txop
);
ret
=
ath_txq_update
(
sc
,
qnum
,
&
qi
);
ret
=
ath_txq_update
(
sc
,
txq
->
axq_
qnum
,
&
qi
);
if
(
ret
)
ath_print
(
common
,
ATH_DBG_FATAL
,
"TXQ Update failed
\n
"
);
if
(
sc
->
sc_ah
->
opmode
==
NL80211_IFTYPE_ADHOC
)
if
(
(
qnum
==
sc
->
tx
.
hwq_map
[
WME_AC_BE
])
&&
!
ret
)
if
(
queue
==
WME_AC_BE
&&
!
ret
)
ath_beaconq_config
(
sc
);
mutex_unlock
(
&
sc
->
mutex
);
...
...
@@ -2011,7 +1952,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
if
(
changed
&
BSS_CHANGED_ASSOC
)
{
ath_print
(
common
,
ATH_DBG_CONFIG
,
"BSS Changed ASSOC %d
\n
"
,
bss_conf
->
assoc
);
ath9k_bss_assoc_info
(
sc
,
vif
,
bss_conf
);
ath9k_bss_assoc_info
(
sc
,
hw
,
vif
,
bss_conf
);
}
mutex_unlock
(
&
sc
->
mutex
);
...
...
drivers/net/wireless/ath/ath9k/pci.c
浏览文件 @
b5e41567
...
...
@@ -247,34 +247,25 @@ static void ath_pci_remove(struct pci_dev *pdev)
#ifdef CONFIG_PM
static
int
ath_pci_suspend
(
struct
pci_dev
*
pdev
,
pm_message_t
stat
e
)
static
int
ath_pci_suspend
(
struct
device
*
devic
e
)
{
struct
pci_dev
*
pdev
=
to_pci_dev
(
device
);
struct
ieee80211_hw
*
hw
=
pci_get_drvdata
(
pdev
);
struct
ath_wiphy
*
aphy
=
hw
->
priv
;
struct
ath_softc
*
sc
=
aphy
->
sc
;
ath9k_hw_set_gpio
(
sc
->
sc_ah
,
sc
->
sc_ah
->
led_pin
,
1
);
pci_save_state
(
pdev
);
pci_disable_device
(
pdev
);
pci_set_power_state
(
pdev
,
PCI_D3hot
);
return
0
;
}
static
int
ath_pci_resume
(
struct
pci_dev
*
pdev
)
static
int
ath_pci_resume
(
struct
device
*
device
)
{
struct
pci_dev
*
pdev
=
to_pci_dev
(
device
);
struct
ieee80211_hw
*
hw
=
pci_get_drvdata
(
pdev
);
struct
ath_wiphy
*
aphy
=
hw
->
priv
;
struct
ath_softc
*
sc
=
aphy
->
sc
;
u32
val
;
int
err
;
pci_restore_state
(
pdev
);
err
=
pci_enable_device
(
pdev
);
if
(
err
)
return
err
;
/*
* Suspend/Resume resets the PCI configuration space, so we have to
...
...
@@ -293,7 +284,23 @@ static int ath_pci_resume(struct pci_dev *pdev)
return
0
;
}
#endif
/* CONFIG_PM */
static
const
struct
dev_pm_ops
ath9k_pm_ops
=
{
.
suspend
=
ath_pci_suspend
,
.
resume
=
ath_pci_resume
,
.
freeze
=
ath_pci_suspend
,
.
thaw
=
ath_pci_resume
,
.
poweroff
=
ath_pci_suspend
,
.
restore
=
ath_pci_resume
,
};
#define ATH9K_PM_OPS (&ath9k_pm_ops)
#else
/* !CONFIG_PM */
#define ATH9K_PM_OPS NULL
#endif
/* !CONFIG_PM */
MODULE_DEVICE_TABLE
(
pci
,
ath_pci_id_table
);
...
...
@@ -302,10 +309,7 @@ static struct pci_driver ath_pci_driver = {
.
id_table
=
ath_pci_id_table
,
.
probe
=
ath_pci_probe
,
.
remove
=
ath_pci_remove
,
#ifdef CONFIG_PM
.
suspend
=
ath_pci_suspend
,
.
resume
=
ath_pci_resume
,
#endif
/* CONFIG_PM */
.
driver
.
pm
=
ATH9K_PM_OPS
,
};
int
ath_pci_init
(
void
)
...
...
drivers/net/wireless/ath/ath9k/rc.c
浏览文件 @
b5e41567
...
...
@@ -381,25 +381,6 @@ static const struct ath_rate_table ar5416_11g_ratetable = {
static
int
ath_rc_get_rateindex
(
const
struct
ath_rate_table
*
rate_table
,
struct
ieee80211_tx_rate
*
rate
);
static
inline
int8_t
median
(
int8_t
a
,
int8_t
b
,
int8_t
c
)
{
if
(
a
>=
b
)
{
if
(
b
>=
c
)
return
b
;
else
if
(
a
>
c
)
return
c
;
else
return
a
;
}
else
{
if
(
a
>=
c
)
return
a
;
else
if
(
b
>=
c
)
return
c
;
else
return
b
;
}
}
static
void
ath_rc_sort_validrates
(
const
struct
ath_rate_table
*
rate_table
,
struct
ath_rate_priv
*
ath_rc_priv
)
{
...
...
@@ -1444,12 +1425,12 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband,
ath_rc_priv
->
neg_ht_rates
.
rs_nrates
=
j
;
}
is_cw40
=
sta
->
ht_cap
.
cap
&
IEEE80211_HT_CAP_SUP_WIDTH_20_40
;
is_cw40
=
!!
(
sta
->
ht_cap
.
cap
&
IEEE80211_HT_CAP_SUP_WIDTH_20_40
)
;
if
(
is_cw40
)
is_sgi
=
sta
->
ht_cap
.
cap
&
IEEE80211_HT_CAP_SGI_40
;
is_sgi
=
!!
(
sta
->
ht_cap
.
cap
&
IEEE80211_HT_CAP_SGI_40
)
;
else
if
(
sc
->
sc_ah
->
caps
.
hw_caps
&
ATH9K_HW_CAP_SGI_20
)
is_sgi
=
sta
->
ht_cap
.
cap
&
IEEE80211_HT_CAP_SGI_20
;
is_sgi
=
!!
(
sta
->
ht_cap
.
cap
&
IEEE80211_HT_CAP_SGI_20
)
;
/* Choose rate table first */
...
...
@@ -1468,10 +1449,8 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband,
struct
ath_rate_priv
*
ath_rc_priv
=
priv_sta
;
const
struct
ath_rate_table
*
rate_table
=
NULL
;
bool
oper_cw40
=
false
,
oper_sgi
;
bool
local_cw40
=
(
ath_rc_priv
->
ht_cap
&
WLAN_RC_40_FLAG
)
?
true
:
false
;
bool
local_sgi
=
(
ath_rc_priv
->
ht_cap
&
WLAN_RC_SGI_FLAG
)
?
true
:
false
;
bool
local_cw40
=
!!
(
ath_rc_priv
->
ht_cap
&
WLAN_RC_40_FLAG
);
bool
local_sgi
=
!!
(
ath_rc_priv
->
ht_cap
&
WLAN_RC_SGI_FLAG
);
/* FIXME: Handle AP mode later when we support CWM */
...
...
drivers/net/wireless/ath/ath9k/recv.c
浏览文件 @
b5e41567
...
...
@@ -317,7 +317,7 @@ int ath_rx_init(struct ath_softc *sc, int nbufs)
struct
ath_buf
*
bf
;
int
error
=
0
;
spin_lock_init
(
&
sc
->
rx
.
pcu_lock
);
spin_lock_init
(
&
sc
->
sc_
pcu_lock
);
sc
->
sc_flags
&=
~
SC_OP_RXFLUSH
;
spin_lock_init
(
&
sc
->
rx
.
rxbuflock
);
...
...
@@ -528,6 +528,8 @@ bool ath_stoprecv(struct ath_softc *sc)
sc
->
rx
.
rxlink
=
NULL
;
spin_unlock_bh
(
&
sc
->
rx
.
rxbuflock
);
ATH_DBG_WARN
(
!
stopped
,
"Could not stop RX, we could be "
"confusing the DMA engine when we start RX up
\n
"
);
return
stopped
;
}
...
...
@@ -962,36 +964,23 @@ static void ath9k_process_rssi(struct ath_common *common,
struct
ieee80211_hdr
*
hdr
,
struct
ath_rx_status
*
rx_stats
)
{
struct
ath_wiphy
*
aphy
=
hw
->
priv
;
struct
ath_hw
*
ah
=
common
->
ah
;
struct
ieee80211_sta
*
sta
;
struct
ath_node
*
an
;
int
last_rssi
=
ATH_RSSI_DUMMY_MARKER
;
int
last_rssi
;
__le16
fc
;
if
(
ah
->
opmode
!=
NL80211_IFTYPE_STATION
)
return
;
fc
=
hdr
->
frame_control
;
if
(
!
ieee80211_is_beacon
(
fc
)
||
compare_ether_addr
(
hdr
->
addr3
,
common
->
curbssid
))
return
;
rcu_read_lock
();
/*
* XXX: use ieee80211_find_sta! This requires quite a bit of work
* under the current ath9k virtual wiphy implementation as we have
* no way of tying a vif to wiphy. Typically vifs are attached to
* at least one sdata of a wiphy on mac80211 but with ath9k virtual
* wiphy you'd have to iterate over every wiphy and each sdata.
*/
if
(
is_multicast_ether_addr
(
hdr
->
addr1
))
sta
=
ieee80211_find_sta_by_ifaddr
(
hw
,
hdr
->
addr2
,
NULL
);
else
sta
=
ieee80211_find_sta_by_ifaddr
(
hw
,
hdr
->
addr2
,
hdr
->
addr1
);
if
(
sta
)
{
an
=
(
struct
ath_node
*
)
sta
->
drv_priv
;
if
(
rx_stats
->
rs_rssi
!=
ATH9K_RSSI_BAD
&&
!
rx_stats
->
rs_moreaggr
)
ATH_RSSI_LPF
(
an
->
last_rssi
,
rx_stats
->
rs_rssi
);
last_rssi
=
an
->
last_rssi
;
}
rcu_read_unlock
();
if
(
rx_stats
->
rs_rssi
!=
ATH9K_RSSI_BAD
&&
!
rx_stats
->
rs_moreaggr
)
ATH_RSSI_LPF
(
aphy
->
last_rssi
,
rx_stats
->
rs_rssi
);
last_rssi
=
aphy
->
last_rssi
;
if
(
likely
(
last_rssi
!=
ATH_RSSI_DUMMY_MARKER
))
rx_stats
->
rs_rssi
=
ATH_EP_RND
(
last_rssi
,
ATH_RSSI_EP_MULTIPLIER
);
...
...
@@ -999,8 +988,7 @@ static void ath9k_process_rssi(struct ath_common *common,
rx_stats
->
rs_rssi
=
0
;
/* Update Beacon RSSI, this is used by ANI. */
if
(
ieee80211_is_beacon
(
fc
))
ah
->
stats
.
avgbrssi
=
rx_stats
->
rs_rssi
;
ah
->
stats
.
avgbrssi
=
rx_stats
->
rs_rssi
;
}
/*
...
...
drivers/net/wireless/ath/ath9k/virtual.c
浏览文件 @
b5e41567
...
...
@@ -107,6 +107,7 @@ int ath9k_wiphy_add(struct ath_softc *sc)
aphy
->
sc
=
sc
;
aphy
->
hw
=
hw
;
sc
->
sec_wiphy
[
i
]
=
aphy
;
aphy
->
last_rssi
=
ATH_RSSI_DUMMY_MARKER
;
spin_unlock_bh
(
&
sc
->
wiphy_lock
);
memcpy
(
addr
,
common
->
macaddr
,
ETH_ALEN
);
...
...
@@ -186,7 +187,7 @@ static int ath9k_send_nullfunc(struct ath_wiphy *aphy,
info
->
control
.
rates
[
1
].
idx
=
-
1
;
memset
(
&
txctl
,
0
,
sizeof
(
struct
ath_tx_control
));
txctl
.
txq
=
&
sc
->
tx
.
txq
[
sc
->
tx
.
hwq_map
[
WME_AC_VO
]
];
txctl
.
txq
=
sc
->
tx
.
txq_map
[
WME_AC_VO
];
txctl
.
frame_type
=
ps
?
ATH9K_IFT_PAUSE
:
ATH9K_IFT_UNPAUSE
;
if
(
ath_tx_start
(
aphy
->
hw
,
skb
,
&
txctl
)
!=
0
)
...
...
drivers/net/wireless/ath/ath9k/xmit.c
浏览文件 @
b5e41567
...
...
@@ -124,7 +124,7 @@ static void ath_tx_queue_tid(struct ath_txq *txq, struct ath_atx_tid *tid)
static
void
ath_tx_resume_tid
(
struct
ath_softc
*
sc
,
struct
ath_atx_tid
*
tid
)
{
struct
ath_txq
*
txq
=
&
sc
->
tx
.
txq
[
tid
->
ac
->
qnum
]
;
struct
ath_txq
*
txq
=
tid
->
ac
->
txq
;
WARN_ON
(
!
tid
->
paused
);
...
...
@@ -142,7 +142,7 @@ static void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
static
void
ath_tx_flush_tid
(
struct
ath_softc
*
sc
,
struct
ath_atx_tid
*
tid
)
{
struct
ath_txq
*
txq
=
&
sc
->
tx
.
txq
[
tid
->
ac
->
qnum
]
;
struct
ath_txq
*
txq
=
tid
->
ac
->
txq
;
struct
ath_buf
*
bf
;
struct
list_head
bf_head
;
struct
ath_tx_status
ts
;
...
...
@@ -817,7 +817,7 @@ void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
{
struct
ath_node
*
an
=
(
struct
ath_node
*
)
sta
->
drv_priv
;
struct
ath_atx_tid
*
txtid
=
ATH_AN_2_TID
(
an
,
tid
);
struct
ath_txq
*
txq
=
&
sc
->
tx
.
txq
[
txtid
->
ac
->
qnum
]
;
struct
ath_txq
*
txq
=
txtid
->
ac
->
txq
;
if
(
txtid
->
state
&
AGGR_CLEANUP
)
return
;
...
...
@@ -888,10 +888,16 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype)
struct
ath_hw
*
ah
=
sc
->
sc_ah
;
struct
ath_common
*
common
=
ath9k_hw_common
(
ah
);
struct
ath9k_tx_queue_info
qi
;
static
const
int
subtype_txq_to_hwq
[]
=
{
[
WME_AC_BE
]
=
ATH_TXQ_AC_BE
,
[
WME_AC_BK
]
=
ATH_TXQ_AC_BK
,
[
WME_AC_VI
]
=
ATH_TXQ_AC_VI
,
[
WME_AC_VO
]
=
ATH_TXQ_AC_VO
,
};
int
qnum
,
i
;
memset
(
&
qi
,
0
,
sizeof
(
qi
));
qi
.
tqi_subtype
=
subtype
;
qi
.
tqi_subtype
=
subtype
_txq_to_hwq
[
subtype
]
;
qi
.
tqi_aifs
=
ATH9K_TXQ_USEDEFAULT
;
qi
.
tqi_cwmin
=
ATH9K_TXQ_USEDEFAULT
;
qi
.
tqi_cwmax
=
ATH9K_TXQ_USEDEFAULT
;
...
...
@@ -940,7 +946,6 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype)
if
(
!
ATH_TXQ_SETUP
(
sc
,
qnum
))
{
struct
ath_txq
*
txq
=
&
sc
->
tx
.
txq
[
qnum
];
txq
->
axq_class
=
subtype
;
txq
->
axq_qnum
=
qnum
;
txq
->
axq_link
=
NULL
;
INIT_LIST_HEAD
(
&
txq
->
axq_q
);
...
...
@@ -1148,13 +1153,11 @@ void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
ath_print
(
common
,
ATH_DBG_FATAL
,
"Failed to stop TX DMA. Resetting hardware!
\n
"
);
spin_lock_bh
(
&
sc
->
sc_resetlock
);
r
=
ath9k_hw_reset
(
ah
,
sc
->
sc_ah
->
curchan
,
ah
->
caldata
,
false
);
if
(
r
)
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to reset hardware; reset status %d
\n
"
,
r
);
spin_unlock_bh
(
&
sc
->
sc_resetlock
);
}
for
(
i
=
0
;
i
<
ATH9K_NUM_TX_QUEUES
;
i
++
)
{
...
...
@@ -1212,24 +1215,6 @@ void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq)
}
}
int
ath_tx_setup
(
struct
ath_softc
*
sc
,
int
haltype
)
{
struct
ath_txq
*
txq
;
if
(
haltype
>=
ARRAY_SIZE
(
sc
->
tx
.
hwq_map
))
{
ath_print
(
ath9k_hw_common
(
sc
->
sc_ah
),
ATH_DBG_FATAL
,
"HAL AC %u out of range, max %zu!
\n
"
,
haltype
,
ARRAY_SIZE
(
sc
->
tx
.
hwq_map
));
return
0
;
}
txq
=
ath_txq_setup
(
sc
,
ATH9K_TX_QUEUE_DATA
,
haltype
);
if
(
txq
!=
NULL
)
{
sc
->
tx
.
hwq_map
[
haltype
]
=
txq
->
axq_qnum
;
return
1
;
}
else
return
0
;
}
/***********/
/* TX, DMA */
/***********/
...
...
@@ -1710,6 +1695,7 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf,
goto
tx_done
;
}
WARN_ON
(
tid
->
ac
->
txq
!=
txctl
->
txq
);
if
(
tx_info
->
flags
&
IEEE80211_TX_CTL_AMPDU
)
{
/*
* Try aggregation if it's a unicast data frame
...
...
@@ -1749,6 +1735,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
return
-
1
;
}
q
=
skb_get_queue_mapping
(
skb
);
r
=
ath_tx_setup_buffer
(
hw
,
bf
,
skb
,
txctl
);
if
(
unlikely
(
r
))
{
ath_print
(
common
,
ATH_DBG_FATAL
,
"TX mem alloc failure
\n
"
);
...
...
@@ -1758,8 +1745,9 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
* we will at least have to run TX completionon one buffer
* on the queue */
spin_lock_bh
(
&
txq
->
axq_lock
);
if
(
!
txq
->
stopped
&&
txq
->
axq_depth
>
1
)
{
ath_mac80211_stop_queue
(
sc
,
skb_get_queue_mapping
(
skb
));
if
(
txq
==
sc
->
tx
.
txq_map
[
q
]
&&
!
txq
->
stopped
&&
txq
->
axq_depth
>
1
)
{
ath_mac80211_stop_queue
(
sc
,
q
);
txq
->
stopped
=
1
;
}
spin_unlock_bh
(
&
txq
->
axq_lock
);
...
...
@@ -1769,13 +1757,10 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
return
r
;
}
q
=
skb_get_queue_mapping
(
skb
);
if
(
q
>=
4
)
q
=
0
;
spin_lock_bh
(
&
txq
->
axq_lock
);
if
(
++
sc
->
tx
.
pending_frames
[
q
]
>
ATH_MAX_QDEPTH
&&
!
txq
->
stopped
)
{
ath_mac80211_stop_queue
(
sc
,
skb_get_queue_mapping
(
skb
));
if
(
txq
==
sc
->
tx
.
txq_map
[
q
]
&&
++
txq
->
pending_frames
>
ATH_MAX_QDEPTH
&&
!
txq
->
stopped
)
{
ath_mac80211_stop_queue
(
sc
,
q
);
txq
->
stopped
=
1
;
}
spin_unlock_bh
(
&
txq
->
axq_lock
);
...
...
@@ -1843,7 +1828,8 @@ void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
/*****************/
static
void
ath_tx_complete
(
struct
ath_softc
*
sc
,
struct
sk_buff
*
skb
,
struct
ath_wiphy
*
aphy
,
int
tx_flags
)
struct
ath_wiphy
*
aphy
,
int
tx_flags
,
struct
ath_txq
*
txq
)
{
struct
ieee80211_hw
*
hw
=
sc
->
hw
;
struct
ieee80211_tx_info
*
tx_info
=
IEEE80211_SKB_CB
(
skb
);
...
...
@@ -1890,11 +1876,12 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
ath9k_tx_status
(
hw
,
skb
);
else
{
q
=
skb_get_queue_mapping
(
skb
);
if
(
q
>=
4
)
q
=
0
;
if
(
--
sc
->
tx
.
pending_frames
[
q
]
<
0
)
sc
->
tx
.
pending_frames
[
q
]
=
0
;
if
(
txq
==
sc
->
tx
.
txq_map
[
q
])
{
spin_lock_bh
(
&
txq
->
axq_lock
);
if
(
WARN_ON
(
--
txq
->
pending_frames
<
0
))
txq
->
pending_frames
=
0
;
spin_unlock_bh
(
&
txq
->
axq_lock
);
}
ieee80211_tx_status
(
hw
,
skb
);
}
...
...
@@ -1929,8 +1916,8 @@ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
else
complete
(
&
sc
->
paprd_complete
);
}
else
{
ath_debug_stat_tx
(
sc
,
txq
,
bf
,
ts
);
ath_tx_complete
(
sc
,
skb
,
bf
->
aphy
,
tx_flags
);
ath_debug_stat_tx
(
sc
,
bf
,
ts
);
ath_tx_complete
(
sc
,
skb
,
bf
->
aphy
,
tx_flags
,
txq
);
}
/* At this point, skb (bf->bf_mpdu) is consumed...make sure we don't
* accidentally reference it later.
...
...
@@ -2020,16 +2007,13 @@ static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
tx_info
->
status
.
rates
[
tx_rateindex
].
count
=
ts
->
ts_longretry
+
1
;
}
static
void
ath_wake_mac80211_queue
(
struct
ath_softc
*
sc
,
struct
ath_txq
*
txq
)
static
void
ath_wake_mac80211_queue
(
struct
ath_softc
*
sc
,
int
qnum
)
{
int
qnum
;
qnum
=
ath_get_mac80211_qnum
(
txq
->
axq_class
,
sc
);
if
(
qnum
==
-
1
)
return
;
struct
ath_txq
*
txq
;
txq
=
sc
->
tx
.
txq_map
[
qnum
];
spin_lock_bh
(
&
txq
->
axq_lock
);
if
(
txq
->
stopped
&&
sc
->
tx
.
pending_frames
[
qnum
]
<
ATH_MAX_QDEPTH
)
{
if
(
txq
->
stopped
&&
txq
->
pending_frames
<
ATH_MAX_QDEPTH
)
{
if
(
ath_mac80211_start_queue
(
sc
,
qnum
))
txq
->
stopped
=
0
;
}
...
...
@@ -2046,6 +2030,7 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
struct
ath_tx_status
ts
;
int
txok
;
int
status
;
int
qnum
;
ath_print
(
common
,
ATH_DBG_QUEUE
,
"tx queue %d (%x), link %p
\n
"
,
txq
->
axq_qnum
,
ath9k_hw_gettxbuf
(
sc
->
sc_ah
,
txq
->
axq_qnum
),
...
...
@@ -2121,12 +2106,15 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
ath_tx_rc_status
(
bf
,
&
ts
,
txok
?
0
:
1
,
txok
,
true
);
}
qnum
=
skb_get_queue_mapping
(
bf
->
bf_mpdu
);
if
(
bf_isampdu
(
bf
))
ath_tx_complete_aggr
(
sc
,
txq
,
bf
,
&
bf_head
,
&
ts
,
txok
);
else
ath_tx_complete_buf
(
sc
,
bf
,
txq
,
&
bf_head
,
&
ts
,
txok
,
0
);
ath_wake_mac80211_queue
(
sc
,
txq
);
if
(
txq
==
sc
->
tx
.
txq_map
[
qnum
])
ath_wake_mac80211_queue
(
sc
,
qnum
);
spin_lock_bh
(
&
txq
->
axq_lock
);
if
(
sc
->
sc_flags
&
SC_OP_TXAGGR
)
...
...
@@ -2196,6 +2184,7 @@ void ath_tx_edma_tasklet(struct ath_softc *sc)
struct
list_head
bf_head
;
int
status
;
int
txok
;
int
qnum
;
for
(;;)
{
status
=
ath9k_hw_txprocdesc
(
ah
,
NULL
,
(
void
*
)
&
txs
);
...
...
@@ -2239,13 +2228,16 @@ void ath_tx_edma_tasklet(struct ath_softc *sc)
ath_tx_rc_status
(
bf
,
&
txs
,
txok
?
0
:
1
,
txok
,
true
);
}
qnum
=
skb_get_queue_mapping
(
bf
->
bf_mpdu
);
if
(
bf_isampdu
(
bf
))
ath_tx_complete_aggr
(
sc
,
txq
,
bf
,
&
bf_head
,
&
txs
,
txok
);
else
ath_tx_complete_buf
(
sc
,
bf
,
txq
,
&
bf_head
,
&
txs
,
txok
,
0
);
ath_wake_mac80211_queue
(
sc
,
txq
);
if
(
txq
==
sc
->
tx
.
txq_map
[
qnum
])
ath_wake_mac80211_queue
(
sc
,
qnum
);
spin_lock_bh
(
&
txq
->
axq_lock
);
if
(
!
list_empty
(
&
txq
->
txq_fifo_pending
))
{
...
...
@@ -2377,7 +2369,7 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an)
for
(
acno
=
0
,
ac
=
&
an
->
ac
[
acno
];
acno
<
WME_NUM_AC
;
acno
++
,
ac
++
)
{
ac
->
sched
=
false
;
ac
->
qnum
=
sc
->
tx
.
hw
q_map
[
acno
];
ac
->
txq
=
sc
->
tx
.
tx
q_map
[
acno
];
INIT_LIST_HEAD
(
&
ac
->
tid_q
);
}
}
...
...
@@ -2387,17 +2379,13 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an)
struct
ath_atx_ac
*
ac
;
struct
ath_atx_tid
*
tid
;
struct
ath_txq
*
txq
;
int
i
,
tidno
;
int
tidno
;
for
(
tidno
=
0
,
tid
=
&
an
->
tid
[
tidno
];
tidno
<
WME_NUM_TID
;
tidno
++
,
tid
++
)
{
i
=
tid
->
ac
->
qnum
;
if
(
!
ATH_TXQ_SETUP
(
sc
,
i
))
continue
;
txq
=
&
sc
->
tx
.
txq
[
i
];
ac
=
tid
->
ac
;
txq
=
ac
->
txq
;
spin_lock_bh
(
&
txq
->
axq_lock
);
...
...
drivers/net/wireless/ath/carl9170/carl9170.h
浏览文件 @
b5e41567
...
...
@@ -48,7 +48,7 @@
#include <linux/usb.h>
#ifdef CONFIG_CARL9170_LEDS
#include <linux/leds.h>
#endif
/* CONFIG_CARL170_LEDS */
#endif
/* CONFIG_CARL
9
170_LEDS */
#ifdef CONFIG_CARL9170_WPC
#include <linux/input.h>
#endif
/* CONFIG_CARL9170_WPC */
...
...
@@ -215,7 +215,7 @@ enum carl9170_restart_reasons {
CARL9170_RR_TOO_MANY_FIRMWARE_ERRORS
,
CARL9170_RR_WATCHDOG
,
CARL9170_RR_STUCK_TX
,
CARL9170_RR_
SLOW_SYSTEM
,
CARL9170_RR_
UNRESPONSIVE_DEVICE
,
CARL9170_RR_COMMAND_TIMEOUT
,
CARL9170_RR_TOO_MANY_PHY_ERRORS
,
CARL9170_RR_LOST_RSP
,
...
...
@@ -287,6 +287,7 @@ struct ar9170 {
/* reset / stuck frames/queue detection */
struct
work_struct
restart_work
;
struct
work_struct
ping_work
;
unsigned
int
restart_counter
;
unsigned
long
queue_stop_timeout
[
__AR9170_NUM_TXQ
];
unsigned
long
max_queue_stop_timeout
[
__AR9170_NUM_TXQ
];
...
...
drivers/net/wireless/ath/carl9170/fwcmd.h
浏览文件 @
b5e41567
...
...
@@ -97,13 +97,13 @@ struct carl9170_set_key_cmd {
__le16
type
;
u8
macAddr
[
6
];
u32
key
[
4
];
}
__packed
;
}
__packed
__aligned
(
4
)
;
#define CARL9170_SET_KEY_CMD_SIZE 28
struct
carl9170_disable_key_cmd
{
__le16
user
;
__le16
padding
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
#define CARL9170_DISABLE_KEY_CMD_SIZE 4
struct
carl9170_u32_list
{
...
...
@@ -206,7 +206,7 @@ struct carl9170_cmd {
struct
carl9170_rx_filter_cmd
rx_filter
;
u8
data
[
CARL9170_MAX_CMD_PAYLOAD_LEN
];
}
__packed
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
#define CARL9170_TX_STATUS_QUEUE 3
#define CARL9170_TX_STATUS_QUEUE_S 0
...
...
@@ -216,6 +216,7 @@ struct carl9170_cmd {
#define CARL9170_TX_STATUS_TRIES (7 << CARL9170_TX_STATUS_TRIES_S)
#define CARL9170_TX_STATUS_SUCCESS 0x80
#ifdef __CARL9170FW__
/*
* NOTE:
* Both structs [carl9170_tx_status and _carl9170_tx_status]
...
...
@@ -232,6 +233,8 @@ struct carl9170_tx_status {
u8
tries
:
3
;
u8
success
:
1
;
}
__packed
;
#endif
/* __CARL9170FW__ */
struct
_carl9170_tx_status
{
/*
* This version should be immune to all alignment bugs.
...
...
@@ -272,13 +275,15 @@ struct carl9170_rsp {
struct
carl9170_rf_init_result
rf_init_res
;
struct
carl9170_u32_list
rreg_res
;
struct
carl9170_u32_list
echo
;
#ifdef __CARL9170FW__
struct
carl9170_tx_status
tx_status
[
0
];
#endif
/* __CARL9170FW__ */
struct
_carl9170_tx_status
_tx_status
[
0
];
struct
carl9170_gpio
gpio
;
struct
carl9170_tsf_rsp
tsf
;
struct
carl9170_psm
psm
;
u8
data
[
CARL9170_MAX_CMD_PAYLOAD_LEN
];
}
__packed
;
}
__packed
;
}
__packed
__aligned
(
4
)
;
#endif
/* __CARL9170_SHARED_FWCMD_H */
drivers/net/wireless/ath/carl9170/hw.h
浏览文件 @
b5e41567
...
...
@@ -712,7 +712,8 @@ struct ar9170_stream {
__le16
tag
;
u8
payload
[
0
];
};
}
__packed
__aligned
(
4
);
#define AR9170_STREAM_LEN 4
#define AR9170_MAX_ACKTABLE_ENTRIES 8
#define AR9170_MAX_VIRTUAL_MAC 7
...
...
@@ -736,4 +737,8 @@ struct ar9170_stream {
#define MOD_VAL(reg, value, newvalue) \
(((value) & ~reg) | (((newvalue) << reg##_S) & reg))
#define GET_VAL(reg, value) \
(((value) & reg) >> reg##_S)
#endif
/* __CARL9170_SHARED_HW_H */
drivers/net/wireless/ath/carl9170/mac.c
浏览文件 @
b5e41567
...
...
@@ -205,8 +205,8 @@ int carl9170_init_mac(struct ar9170 *ar)
carl9170_regwrite
(
AR9170_MAC_REG_BACKOFF_PROTECT
,
0x105
);
/* Aggregation MAX number and timeout */
carl9170_regwrite
(
AR9170_MAC_REG_AMPDU_FACTOR
,
0xa
);
carl9170_regwrite
(
AR9170_MAC_REG_AMPDU_DENSITY
,
0x140a0
0
);
carl9170_regwrite
(
AR9170_MAC_REG_AMPDU_FACTOR
,
0x
8000
a
);
carl9170_regwrite
(
AR9170_MAC_REG_AMPDU_DENSITY
,
0x140a0
7
);
carl9170_regwrite
(
AR9170_MAC_REG_FRAMETYPE_FILTER
,
AR9170_MAC_FTF_DEFAULTS
);
...
...
@@ -457,8 +457,9 @@ int carl9170_set_beacon_timers(struct ar9170 *ar)
int
carl9170_update_beacon
(
struct
ar9170
*
ar
,
const
bool
submit
)
{
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
=
NULL
;
struct
carl9170_vif_info
*
cvif
;
struct
ieee80211_tx_info
*
txinfo
;
__le32
*
data
,
*
old
=
NULL
;
u32
word
,
off
,
addr
,
len
;
int
i
=
0
,
err
=
0
;
...
...
@@ -487,7 +488,13 @@ int carl9170_update_beacon(struct ar9170 *ar, const bool submit)
if
(
!
skb
)
{
err
=
-
ENOMEM
;
goto
out_unlock
;
goto
err_free
;
}
txinfo
=
IEEE80211_SKB_CB
(
skb
);
if
(
txinfo
->
control
.
rates
[
0
].
flags
&
IEEE80211_TX_RC_MCS
)
{
err
=
-
EINVAL
;
goto
err_free
;
}
spin_lock_bh
(
&
ar
->
beacon_lock
);
...
...
@@ -504,11 +511,8 @@ int carl9170_update_beacon(struct ar9170 *ar, const bool submit)
wiphy_err
(
ar
->
hw
->
wiphy
,
"beacon does not "
"fit into device memory!
\n
"
);
}
spin_unlock_bh
(
&
ar
->
beacon_lock
);
dev_kfree_skb_any
(
skb
);
err
=
-
EINVAL
;
goto
out
_unlock
;
goto
err
_unlock
;
}
if
(
len
>
AR9170_MAC_BCN_LENGTH_MAX
)
{
...
...
@@ -518,22 +522,22 @@ int carl9170_update_beacon(struct ar9170 *ar, const bool submit)
AR9170_MAC_BCN_LENGTH_MAX
,
len
);
}
spin_unlock_bh
(
&
ar
->
beacon_lock
);
dev_kfree_skb_any
(
skb
);
err
=
-
EMSGSIZE
;
goto
out
_unlock
;
goto
err
_unlock
;
}
carl9170_async_regwrite_begin
(
ar
);
i
=
txinfo
->
control
.
rates
[
0
].
idx
;
if
(
txinfo
->
band
!=
IEEE80211_BAND_2GHZ
)
i
+=
4
;
/* XXX: use skb->cb info */
if
(
ar
->
hw
->
conf
.
channel
->
band
==
IEEE80211_BAND_2GHZ
)
{
carl9170_async_regwrite
(
AR9170_MAC_REG_BCN_PLCP
,
((
skb
->
len
+
FCS_LEN
)
<<
(
3
+
16
))
+
0x0400
);
}
else
{
carl9170_async_regwrite
(
AR9170_MAC_REG_BCN_PLCP
,
((
skb
->
len
+
FCS_LEN
)
<<
16
)
+
0x001b
);
}
word
=
__carl9170_ratetable
[
i
].
hw_value
&
0xf
;
if
(
i
<
4
)
word
|=
((
skb
->
len
+
FCS_LEN
)
<<
(
3
+
16
))
+
0x0400
;
else
word
|=
((
skb
->
len
+
FCS_LEN
)
<<
16
)
+
0x0010
;
carl9170_async_regwrite_begin
(
ar
);
carl9170_async_regwrite
(
AR9170_MAC_REG_BCN_PLCP
,
word
);
for
(
i
=
0
;
i
<
DIV_ROUND_UP
(
skb
->
len
,
4
);
i
++
)
{
/*
...
...
@@ -557,7 +561,7 @@ int carl9170_update_beacon(struct ar9170 *ar, const bool submit)
cvif
->
beacon
=
skb
;
spin_unlock_bh
(
&
ar
->
beacon_lock
);
if
(
err
)
goto
out_unlock
;
goto
err_free
;
if
(
submit
)
{
err
=
carl9170_bcn_ctrl
(
ar
,
cvif
->
id
,
...
...
@@ -565,10 +569,18 @@ int carl9170_update_beacon(struct ar9170 *ar, const bool submit)
addr
,
skb
->
len
+
FCS_LEN
);
if
(
err
)
goto
out_unlock
;
goto
err_free
;
}
out_unlock:
rcu_read_unlock
();
return
0
;
err_unlock:
spin_unlock_bh
(
&
ar
->
beacon_lock
);
err_free:
rcu_read_unlock
();
dev_kfree_skb_any
(
skb
);
return
err
;
}
...
...
drivers/net/wireless/ath/carl9170/main.c
浏览文件 @
b5e41567
...
...
@@ -428,6 +428,7 @@ static void carl9170_cancel_worker(struct ar9170 *ar)
cancel_delayed_work_sync
(
&
ar
->
led_work
);
#endif
/* CONFIG_CARL9170_LEDS */
cancel_work_sync
(
&
ar
->
ps_work
);
cancel_work_sync
(
&
ar
->
ping_work
);
cancel_work_sync
(
&
ar
->
ampdu_work
);
}
...
...
@@ -533,6 +534,21 @@ void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r)
*/
}
static
void
carl9170_ping_work
(
struct
work_struct
*
work
)
{
struct
ar9170
*
ar
=
container_of
(
work
,
struct
ar9170
,
ping_work
);
int
err
;
if
(
!
IS_STARTED
(
ar
))
return
;
mutex_lock
(
&
ar
->
mutex
);
err
=
carl9170_echo_test
(
ar
,
0xdeadbeef
);
if
(
err
)
carl9170_restart
(
ar
,
CARL9170_RR_UNRESPONSIVE_DEVICE
);
mutex_unlock
(
&
ar
->
mutex
);
}
static
int
carl9170_init_interface
(
struct
ar9170
*
ar
,
struct
ieee80211_vif
*
vif
)
{
...
...
@@ -1614,6 +1630,7 @@ void *carl9170_alloc(size_t priv_size)
skb_queue_head_init
(
&
ar
->
tx_pending
[
i
]);
}
INIT_WORK
(
&
ar
->
ps_work
,
carl9170_ps_work
);
INIT_WORK
(
&
ar
->
ping_work
,
carl9170_ping_work
);
INIT_WORK
(
&
ar
->
restart_work
,
carl9170_restart_work
);
INIT_WORK
(
&
ar
->
ampdu_work
,
carl9170_ampdu_work
);
INIT_DELAYED_WORK
(
&
ar
->
tx_janitor
,
carl9170_tx_janitor
);
...
...
@@ -1828,7 +1845,7 @@ int carl9170_register(struct ar9170 *ar)
err
=
carl9170_led_register
(
ar
);
if
(
err
)
goto
err_unreg
;
#endif
/* CONFIG_CAR
9L
170_LEDS */
#endif
/* CONFIG_CAR
L9
170_LEDS */
#ifdef CONFIG_CARL9170_WPC
err
=
carl9170_register_wps_button
(
ar
);
...
...
drivers/net/wireless/ath/carl9170/phy.c
浏览文件 @
b5e41567
...
...
@@ -1554,15 +1554,6 @@ static int carl9170_set_power_cal(struct ar9170 *ar, u32 freq,
return
carl9170_regwrite_result
();
}
/* TODO: replace this with sign_extend32(noise, 8) */
static
int
carl9170_calc_noise_dbm
(
u32
raw_noise
)
{
if
(
raw_noise
&
0x100
)
return
~
0x1ff
|
raw_noise
;
else
return
raw_noise
;
}
int
carl9170_get_noisefloor
(
struct
ar9170
*
ar
)
{
static
const
u32
phy_regs
[]
=
{
...
...
@@ -1578,11 +1569,11 @@ int carl9170_get_noisefloor(struct ar9170 *ar)
return
err
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
ar
->
noise
[
i
]
=
carl9170_calc_noise_dbm
(
(
phy_res
[
i
]
>>
19
)
&
0x1ff
);
ar
->
noise
[
i
]
=
sign_extend32
(
GET_VAL
(
AR9170_PHY_CCA_MIN_PWR
,
phy_res
[
i
]),
8
);
ar
->
noise
[
i
+
2
]
=
carl9170_calc_noise_dbm
(
(
phy_res
[
i
+
2
]
>>
23
)
&
0x1ff
);
ar
->
noise
[
i
+
2
]
=
sign_extend32
(
GET_VAL
(
AR9170_PHY_EXT_CCA_MIN_PWR
,
phy_res
[
i
+
2
]),
8
);
}
return
0
;
...
...
drivers/net/wireless/ath/carl9170/phy.h
浏览文件 @
b5e41567
...
...
@@ -139,8 +139,8 @@
#define AR9170_PHY_AGC_CONTROL_NO_UPDATE_NF 0x00020000
#define AR9170_PHY_REG_CCA (AR9170_PHY_REG_BASE + 0x0064)
#define AR9170_PHY_CCA_MIN
CCA_PWR
0x0ff80000
#define AR9170_PHY_CCA_MIN
CCA
_PWR_S 19
#define AR9170_PHY_CCA_MIN
_PWR
0x0ff80000
#define AR9170_PHY_CCA_MIN_PWR_S 19
#define AR9170_PHY_CCA_THRESH62 0x0007f000
#define AR9170_PHY_CCA_THRESH62_S 12
...
...
@@ -338,8 +338,8 @@
#define AR9170_PHY_EXT_CCA_CYCPWR_THR1_S 9
#define AR9170_PHY_EXT_CCA_THRESH62 0x007f0000
#define AR9170_PHY_EXT_CCA_THRESH62_S 16
#define AR9170_PHY_EXT_
MINCCA
_PWR 0xff800000
#define AR9170_PHY_EXT_
MINCCA
_PWR_S 23
#define AR9170_PHY_EXT_
CCA_MIN
_PWR 0xff800000
#define AR9170_PHY_EXT_
CCA_MIN
_PWR_S 23
#define AR9170_PHY_REG_SFCORR_EXT (AR9170_PHY_REG_BASE + 0x01c0)
#define AR9170_PHY_SFCORR_EXT_M1_THRESH 0x0000007f
...
...
@@ -546,19 +546,19 @@
#define AR9170_PHY_FORCE_XPA_CFG_S 0
#define AR9170_PHY_REG_CH1_CCA (AR9170_PHY_REG_BASE + 0x1064)
#define AR9170_PHY_CH1_
MINCCA
_PWR 0x0ff80000
#define AR9170_PHY_CH1_
MINCCA
_PWR_S 19
#define AR9170_PHY_CH1_
CCA_MIN
_PWR 0x0ff80000
#define AR9170_PHY_CH1_
CCA_MIN
_PWR_S 19
#define AR9170_PHY_REG_CH2_CCA (AR9170_PHY_REG_BASE + 0x2064)
#define AR9170_PHY_CH2_
MINCCA
_PWR 0x0ff80000
#define AR9170_PHY_CH2_
MINCCA
_PWR_S 19
#define AR9170_PHY_CH2_
CCA_MIN
_PWR 0x0ff80000
#define AR9170_PHY_CH2_
CCA_MIN
_PWR_S 19
#define AR9170_PHY_REG_CH1_EXT_CCA (AR9170_PHY_REG_BASE + 0x11bc)
#define AR9170_PHY_CH1_EXT_
MINCCA
_PWR 0xff800000
#define AR9170_PHY_CH1_EXT_
MINCCA_PWR_S
23
#define AR9170_PHY_CH1_EXT_
CCA_MIN
_PWR 0xff800000
#define AR9170_PHY_CH1_EXT_
CCA_MIN_PWR_S
23
#define AR9170_PHY_REG_CH2_EXT_CCA (AR9170_PHY_REG_BASE + 0x21bc)
#define AR9170_PHY_CH2_EXT_
MINCCA
_PWR 0xff800000
#define AR9170_PHY_CH2_EXT_
MINCCA_PWR_S
23
#define AR9170_PHY_CH2_EXT_
CCA_MIN
_PWR 0xff800000
#define AR9170_PHY_CH2_EXT_
CCA_MIN_PWR_S
23
#endif
/* __CARL9170_SHARED_PHY_H */
drivers/net/wireless/ath/carl9170/tx.c
浏览文件 @
b5e41567
...
...
@@ -242,9 +242,11 @@ static void carl9170_tx_release(struct kref *ref)
ar
->
tx_ampdu_schedule
=
true
;
if
(
txinfo
->
flags
&
IEEE80211_TX_STAT_AMPDU
)
{
txinfo
->
status
.
ampdu_len
=
txinfo
->
pad
[
0
];
txinfo
->
status
.
ampdu_ack_len
=
txinfo
->
pad
[
1
];
txinfo
->
pad
[
0
]
=
txinfo
->
pad
[
1
]
=
0
;
struct
_carl9170_tx_superframe
*
super
;
super
=
(
void
*
)
skb
->
data
;
txinfo
->
status
.
ampdu_len
=
super
->
s
.
rix
;
txinfo
->
status
.
ampdu_ack_len
=
super
->
s
.
cnt
;
}
else
if
(
txinfo
->
flags
&
IEEE80211_TX_STAT_ACK
)
{
/*
* drop redundant tx_status reports:
...
...
@@ -337,7 +339,8 @@ static void carl9170_tx_status_process_ampdu(struct ar9170 *ar,
u8
tid
;
if
(
!
(
txinfo
->
flags
&
IEEE80211_TX_CTL_AMPDU
)
||
txinfo
->
flags
&
IEEE80211_TX_CTL_INJECTED
)
txinfo
->
flags
&
IEEE80211_TX_CTL_INJECTED
||
(
!
(
super
->
f
.
mac_control
&
cpu_to_le16
(
AR9170_TX_MAC_AGGR
))))
return
;
tx_info
=
IEEE80211_SKB_CB
(
skb
);
...
...
@@ -389,8 +392,8 @@ static void carl9170_tx_status_process_ampdu(struct ar9170 *ar,
sta_info
->
stats
[
tid
].
ampdu_ack_len
++
;
if
(
super
->
f
.
mac_control
&
cpu_to_le16
(
AR9170_TX_MAC_IMM_BA
))
{
txinfo
->
pad
[
0
]
=
sta_info
->
stats
[
tid
].
ampdu_len
;
txinfo
->
pad
[
1
]
=
sta_info
->
stats
[
tid
].
ampdu_ack_len
;
super
->
s
.
rix
=
sta_info
->
stats
[
tid
].
ampdu_len
;
super
->
s
.
cnt
=
sta_info
->
stats
[
tid
].
ampdu_ack_len
;
txinfo
->
flags
|=
IEEE80211_TX_STAT_AMPDU
;
sta_info
->
stats
[
tid
].
clear
=
true
;
}
...
...
@@ -524,6 +527,59 @@ static void carl9170_check_queue_stop_timeout(struct ar9170 *ar)
}
}
static
void
carl9170_tx_ampdu_timeout
(
struct
ar9170
*
ar
)
{
struct
carl9170_sta_tid
*
iter
;
struct
sk_buff
*
skb
;
struct
ieee80211_tx_info
*
txinfo
;
struct
carl9170_tx_info
*
arinfo
;
struct
_carl9170_tx_superframe
*
super
;
struct
ieee80211_sta
*
sta
;
struct
ieee80211_vif
*
vif
;
struct
ieee80211_hdr
*
hdr
;
unsigned
int
vif_id
;
rcu_read_lock
();
list_for_each_entry_rcu
(
iter
,
&
ar
->
tx_ampdu_list
,
list
)
{
if
(
iter
->
state
<
CARL9170_TID_STATE_IDLE
)
continue
;
spin_lock_bh
(
&
iter
->
lock
);
skb
=
skb_peek
(
&
iter
->
queue
);
if
(
!
skb
)
goto
unlock
;
txinfo
=
IEEE80211_SKB_CB
(
skb
);
arinfo
=
(
void
*
)
txinfo
->
rate_driver_data
;
if
(
time_is_after_jiffies
(
arinfo
->
timeout
+
msecs_to_jiffies
(
CARL9170_QUEUE_TIMEOUT
)))
goto
unlock
;
super
=
(
void
*
)
skb
->
data
;
hdr
=
(
void
*
)
super
->
frame_data
;
vif_id
=
(
super
->
s
.
misc
&
CARL9170_TX_SUPER_MISC_VIF_ID
)
>>
CARL9170_TX_SUPER_MISC_VIF_ID_S
;
if
(
WARN_ON
(
vif_id
>=
AR9170_MAX_VIRTUAL_MAC
))
goto
unlock
;
vif
=
rcu_dereference
(
ar
->
vif_priv
[
vif_id
].
vif
);
if
(
WARN_ON
(
!
vif
))
goto
unlock
;
sta
=
ieee80211_find_sta
(
vif
,
hdr
->
addr1
);
if
(
WARN_ON
(
!
sta
))
goto
unlock
;
ieee80211_stop_tx_ba_session
(
sta
,
iter
->
tid
);
unlock:
spin_unlock_bh
(
&
iter
->
lock
);
}
rcu_read_unlock
();
}
void
carl9170_tx_janitor
(
struct
work_struct
*
work
)
{
struct
ar9170
*
ar
=
container_of
(
work
,
struct
ar9170
,
...
...
@@ -534,6 +590,7 @@ void carl9170_tx_janitor(struct work_struct *work)
ar
->
tx_janitor_last_run
=
jiffies
;
carl9170_check_queue_stop_timeout
(
ar
);
carl9170_tx_ampdu_timeout
(
ar
);
if
(
!
atomic_read
(
&
ar
->
tx_total_queued
))
return
;
...
...
@@ -842,10 +899,8 @@ static int carl9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb)
if
(
unlikely
(
!
sta
||
!
cvif
))
goto
err_out
;
factor
=
min_t
(
unsigned
int
,
1u
,
info
->
control
.
sta
->
ht_cap
.
ampdu_factor
);
density
=
info
->
control
.
sta
->
ht_cap
.
ampdu_density
;
factor
=
min_t
(
unsigned
int
,
1u
,
sta
->
ht_cap
.
ampdu_factor
);
density
=
sta
->
ht_cap
.
ampdu_density
;
if
(
density
)
{
/*
...
...
@@ -1206,6 +1261,7 @@ static void carl9170_tx(struct ar9170 *ar)
static
bool
carl9170_tx_ampdu_queue
(
struct
ar9170
*
ar
,
struct
ieee80211_sta
*
sta
,
struct
sk_buff
*
skb
)
{
struct
_carl9170_tx_superframe
*
super
=
(
void
*
)
super
;
struct
carl9170_sta_info
*
sta_info
;
struct
carl9170_sta_tid
*
agg
;
struct
sk_buff
*
iter
;
...
...
@@ -1274,6 +1330,7 @@ static bool carl9170_tx_ampdu_queue(struct ar9170 *ar,
err_unlock_rcu:
rcu_read_unlock
();
super
->
f
.
mac_control
&=
~
cpu_to_le16
(
AR9170_TX_MAC_AGGR
);
carl9170_tx_status
(
ar
,
skb
,
false
);
ar
->
tx_dropped
++
;
return
false
;
...
...
@@ -1302,9 +1359,6 @@ int carl9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
*/
if
(
info
->
flags
&
IEEE80211_TX_CTL_AMPDU
)
{
if
(
WARN_ON_ONCE
(
!
sta
))
goto
err_free
;
run
=
carl9170_tx_ampdu_queue
(
ar
,
sta
,
skb
);
if
(
run
)
carl9170_tx_ampdu
(
ar
);
...
...
drivers/net/wireless/ath/carl9170/usb.c
浏览文件 @
b5e41567
...
...
@@ -433,7 +433,7 @@ static void carl9170_usb_rx_complete(struct urb *urb)
* device.
*/
carl9170_restart
(
ar
,
CARL9170_RR_SLOW_SYSTEM
);
ieee80211_queue_work
(
ar
->
hw
,
&
ar
->
ping_work
);
}
}
else
{
/*
...
...
drivers/net/wireless/ath/carl9170/version.h
浏览文件 @
b5e41567
#ifndef __CARL9170_SHARED_VERSION_H
#define __CARL9170_SHARED_VERSION_H
#define CARL9170FW_VERSION_YEAR 10
#define CARL9170FW_VERSION_MONTH
9
#define CARL9170FW_VERSION_DAY 2
8
#define CARL9170FW_VERSION_GIT "1.
8.8.3
"
#define CARL9170FW_VERSION_MONTH
10
#define CARL9170FW_VERSION_DAY 2
9
#define CARL9170FW_VERSION_GIT "1.
9.0
"
#endif
/* __CARL9170_SHARED_VERSION_H */
drivers/net/wireless/ath/debug.h
浏览文件 @
b5e41567
...
...
@@ -70,11 +70,13 @@ enum ATH_DEBUG {
#ifdef CONFIG_ATH_DEBUG
void
ath_print
(
struct
ath_common
*
common
,
int
dbg_mask
,
const
char
*
fmt
,
...)
__attribute__
((
format
(
printf
,
3
,
4
)));
#define ATH_DBG_WARN(foo, arg...) WARN(foo, arg)
#else
static
inline
void
__attribute__
((
format
(
printf
,
3
,
4
)))
ath_print
(
struct
ath_common
*
common
,
int
dbg_mask
,
const
char
*
fmt
,
...)
{
}
#define ATH_DBG_WARN(foo, arg)
#endif
/* CONFIG_ATH_DEBUG */
/** Returns string describing opmode, or NULL if unknown mode. */
...
...
drivers/net/wireless/ath/key.c
浏览文件 @
b5e41567
...
...
@@ -67,7 +67,8 @@ bool ath_hw_keyreset(struct ath_common *common, u16 entry)
}
EXPORT_SYMBOL
(
ath_hw_keyreset
);
bool
ath_hw_keysetmac
(
struct
ath_common
*
common
,
u16
entry
,
const
u8
*
mac
)
static
bool
ath_hw_keysetmac
(
struct
ath_common
*
common
,
u16
entry
,
const
u8
*
mac
)
{
u32
macHi
,
macLo
;
u32
unicast_flag
=
AR_KEYTABLE_VALID
;
...
...
@@ -107,9 +108,9 @@ bool ath_hw_keysetmac(struct ath_common *common, u16 entry, const u8 *mac)
return
true
;
}
bool
ath_hw_set_keycache_entry
(
struct
ath_common
*
common
,
u16
entry
,
const
struct
ath_keyval
*
k
,
const
u8
*
mac
)
static
bool
ath_hw_set_keycache_entry
(
struct
ath_common
*
common
,
u16
entry
,
const
struct
ath_keyval
*
k
,
const
u8
*
mac
)
{
void
*
ah
=
common
->
ah
;
u32
key0
,
key1
,
key2
,
key3
,
key4
;
...
...
drivers/net/wireless/b43/b43.h
浏览文件 @
b5e41567
...
...
@@ -153,6 +153,19 @@
#define B43_BFH_FEM_BT 0x0040
/* has FEM and switch to share antenna
* with bluetooth */
/* SPROM boardflags2_lo values */
#define B43_BFL2_RXBB_INT_REG_DIS 0x0001
/* external RX BB regulator present */
#define B43_BFL2_APLL_WAR 0x0002
/* alternative A-band PLL settings implemented */
#define B43_BFL2_TXPWRCTRL_EN 0x0004
/* permits enabling TX Power Control */
#define B43_BFL2_2X4_DIV 0x0008
/* 2x4 diversity switch */
#define B43_BFL2_5G_PWRGAIN 0x0010
/* supports 5G band power gain */
#define B43_BFL2_PCIEWAR_OVR 0x0020
/* overrides ASPM and Clkreq settings */
#define B43_BFL2_CAESERS_BRD 0x0040
/* is Caesers board (unused) */
#define B43_BFL2_BTC3WIRE 0x0080
/* used 3-wire bluetooth coexist */
#define B43_BFL2_SKWRKFEM_BRD 0x0100
/* 4321mcm93 uses Skyworks FEM */
#define B43_BFL2_SPUR_WAR 0x0200
/* has a workaround for clock-harmonic spurs */
#define B43_BFL2_GPLL_WAR 0x0400
/* altenative G-band PLL settings implemented */
/* GPIO register offset, in both ChipCommon and PCI core. */
#define B43_GPIO_CONTROL 0x6c
...
...
drivers/net/wireless/b43/dma.c
浏览文件 @
b5e41567
...
...
@@ -415,11 +415,6 @@ static int alloc_ringmemory(struct b43_dmaring *ring)
static
void
free_ringmemory
(
struct
b43_dmaring
*
ring
)
{
gfp_t
flags
=
GFP_KERNEL
;
if
(
ring
->
type
==
B43_DMA_64BIT
)
flags
|=
GFP_DMA
;
dma_free_coherent
(
ring
->
dev
->
dev
->
dma_dev
,
B43_DMA_RINGMEMSIZE
,
ring
->
descbase
,
ring
->
dmabase
);
}
...
...
drivers/net/wireless/b43/phy_n.c
浏览文件 @
b5e41567
...
...
@@ -191,7 +191,8 @@ static void b43_radio_init2055_post(struct b43_wldev *dev)
binfo
->
type
!=
0x46D
||
binfo
->
rev
<
0x41
);
else
workaround
=
((
sprom
->
boardflags_hi
&
B43_BFH_NOPA
)
==
0
);
workaround
=
!
(
sprom
->
boardflags2_lo
&
B43_BFL2_RXBB_INT_REG_DIS
);
b43_radio_mask
(
dev
,
B2055_MASTER1
,
0xFFF3
);
if
(
workaround
)
{
...
...
@@ -240,10 +241,13 @@ static void b43_radio_init2055_post(struct b43_wldev *dev)
static
void
b43_radio_init2055
(
struct
b43_wldev
*
dev
)
{
b43_radio_init2055_pre
(
dev
);
if
(
b43_status
(
dev
)
<
B43_STAT_INITIALIZED
)
b2055_upload_inittab
(
dev
,
0
,
1
);
else
b2055_upload_inittab
(
dev
,
0
/*FIXME on 5ghz band*/
,
0
);
if
(
b43_status
(
dev
)
<
B43_STAT_INITIALIZED
)
{
/* Follow wl, not specs. Do not force uploading all regs */
b2055_upload_inittab
(
dev
,
0
,
0
);
}
else
{
bool
ghz5
=
b43_current_band
(
dev
->
wl
)
==
IEEE80211_BAND_5GHZ
;
b2055_upload_inittab
(
dev
,
ghz5
,
0
);
}
b43_radio_init2055_post
(
dev
);
}
...
...
drivers/net/wireless/b43/radio_2055.c
浏览文件 @
b5e41567
...
...
@@ -244,7 +244,7 @@ static const struct b2055_inittab_entry b2055_inittab [] = {
[
0xCB
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xCC
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
B2055_C1_LNA_GAINBST
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xCE
]
=
{
.
ghz5
=
0x000
0
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xCE
]
=
{
.
ghz5
=
0x000
6
,
.
ghz2
=
0x0006
,
NOUPLOAD
,
},
[
0xCF
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xD0
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xD1
]
=
{
.
ghz5
=
0x0018
,
.
ghz2
=
0x0018
,
NOUPLOAD
,
},
...
...
@@ -256,7 +256,7 @@ static const struct b2055_inittab_entry b2055_inittab [] = {
[
0xD7
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xD8
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
B2055_C2_LNA_GAINBST
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xDA
]
=
{
.
ghz5
=
0x000
0
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xDA
]
=
{
.
ghz5
=
0x000
6
,
.
ghz2
=
0x0006
,
NOUPLOAD
,
},
[
0xDB
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xDC
]
=
{
.
ghz5
=
0x0000
,
.
ghz2
=
0x0000
,
NOUPLOAD
,
},
[
0xDD
]
=
{
.
ghz5
=
0x0018
,
.
ghz2
=
0x0018
,
NOUPLOAD
,
},
...
...
@@ -1299,7 +1299,7 @@ void b2055_upload_inittab(struct b43_wldev *dev,
bool
ghz5
,
bool
ignore_uploadflag
)
{
const
struct
b2055_inittab_entry
*
e
;
unsigned
int
i
;
unsigned
int
i
,
writes
=
0
;
u16
value
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
b2055_inittab
);
i
++
)
{
...
...
@@ -1312,6 +1312,8 @@ void b2055_upload_inittab(struct b43_wldev *dev,
else
value
=
e
->
ghz2
;
b43_radio_write16
(
dev
,
i
,
value
);
if
(
++
writes
%
4
==
0
)
b43_read32
(
dev
,
B43_MMIO_MACCTL
);
/* flush */
}
}
}
...
...
drivers/net/wireless/b43/radio_2056.c
浏览文件 @
b5e41567
...
...
@@ -24,9 +24,60 @@
#include "radio_2056.h"
#include "phy_common.h"
#define RADIOREGS3(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, \
r30, r31, r32, r33, r34, r35, r36) \
.radio_syn_pll_vcocal1 = r00, \
.radio_syn_pll_vcocal2 = r01, \
.radio_syn_pll_refdiv = r02, \
.radio_syn_pll_mmd2 = r03, \
.radio_syn_pll_mmd1 = r04, \
.radio_syn_pll_loopfilter1 = r05, \
.radio_syn_pll_loopfilter2 = r06, \
.radio_syn_pll_loopfilter3 = r07, \
.radio_syn_pll_loopfilter4 = r08, \
.radio_syn_pll_loopfilter5 = r09, \
.radio_syn_reserved_addr27 = r10, \
.radio_syn_reserved_addr28 = r11, \
.radio_syn_reserved_addr29 = r12, \
.radio_syn_logen_vcobuf1 = r13, \
.radio_syn_logen_mixer2 = r14, \
.radio_syn_logen_buf3 = r15, \
.radio_syn_logen_buf4 = r16, \
.radio_rx0_lnaa_tune = r17, \
.radio_rx0_lnag_tune = r18, \
.radio_tx0_intpaa_boost_tune = r19, \
.radio_tx0_intpag_boost_tune = r20, \
.radio_tx0_pada_boost_tune = r21, \
.radio_tx0_padg_boost_tune = r22, \
.radio_tx0_pgaa_boost_tune = r23, \
.radio_tx0_pgag_boost_tune = r24, \
.radio_tx0_mixa_boost_tune = r25, \
.radio_tx0_mixg_boost_tune = r26, \
.radio_rx1_lnaa_tune = r27, \
.radio_rx1_lnag_tune = r28, \
.radio_tx1_intpaa_boost_tune = r29, \
.radio_tx1_intpag_boost_tune = r30, \
.radio_tx1_pada_boost_tune = r31, \
.radio_tx1_padg_boost_tune = r32, \
.radio_tx1_pgaa_boost_tune = r33, \
.radio_tx1_pgag_boost_tune = r34, \
.radio_tx1_mixa_boost_tune = r35, \
.radio_tx1_mixg_boost_tune = r36
#define PHYREGS(r0, r1, r2, r3, r4, r5) \
.phy_regs.phy_bw1a = r0, \
.phy_regs.phy_bw2 = r1, \
.phy_regs.phy_bw3 = r2, \
.phy_regs.phy_bw4 = r3, \
.phy_regs.phy_bw5 = r4, \
.phy_regs.phy_bw6 = r5
static
const
struct
b43_nphy_channeltab_entry_rev3
b43_nphy_channeltab_rev3
[]
=
{
};
/* TODO: add support for rev4+ devices by searching in rev4+ tables */
const
struct
b43_nphy_channeltab_entry_rev3
*
b43_nphy_get_chantabent_rev3
(
struct
b43_wldev
*
dev
,
u16
freq
)
{
...
...
drivers/net/wireless/b43/radio_2056.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/b43legacy/rfkill.c
浏览文件 @
b5e41567
...
...
@@ -29,7 +29,7 @@
/* Returns TRUE, if the radio is enabled in hardware. */
bool
b43legacy_is_hw_radio_enabled
(
struct
b43legacy_wldev
*
dev
)
{
if
(
dev
->
phy
.
rev
>=
3
)
{
if
(
dev
->
dev
->
id
.
revision
>=
3
)
{
if
(
!
(
b43legacy_read32
(
dev
,
B43legacy_MMIO_RADIO_HWENABLED_HI
)
&
B43legacy_MMIO_RADIO_HWENABLED_HI_MASK
))
return
1
;
...
...
drivers/net/wireless/iwlwifi/Kconfig
浏览文件 @
b5e41567
...
...
@@ -106,6 +106,9 @@ config IWL5000
Intel WiFi Link 1000BGN
Intel Wireless WiFi 5150AGN
Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN
Intel 6000 Gen 2 Series Wi-Fi Adapters (6000G2A and 6000G2B)
Intel WIreless WiFi Link 6050BGN Gen 2 Adapter
Intel 100 Series Wi-Fi Adapters (100BGN and 130BGN)
config IWL3945
tristate "Intel PRO/Wireless 3945ABG/BG Network Connection (iwl3945)"
...
...
drivers/net/wireless/iwlwifi/Makefile
浏览文件 @
b5e41567
...
...
@@ -2,6 +2,8 @@ obj-$(CONFIG_IWLWIFI) += iwlcore.o
iwlcore-objs
:=
iwl-core.o iwl-eeprom.o iwl-hcmd.o iwl-power.o
iwlcore-objs
+=
iwl-rx.o iwl-tx.o iwl-sta.o
iwlcore-objs
+=
iwl-scan.o iwl-led.o
iwlcore-$(CONFIG_IWL3945)
+=
iwl-legacy.o
iwlcore-$(CONFIG_IWL4965)
+=
iwl-legacy.o
iwlcore-$(CONFIG_IWLWIFI_DEBUGFS)
+=
iwl-debugfs.o
iwlcore-$(CONFIG_IWLWIFI_DEVICE_TRACING)
+=
iwl-devtrace.o
...
...
@@ -9,13 +11,14 @@ CFLAGS_iwl-devtrace.o := -I$(src)
# AGN
obj-$(CONFIG_IWLAGN)
+=
iwlagn.o
iwlagn-objs
:=
iwl-agn.o iwl-agn-rs.o iwl-agn-led.o
iwl-agn-ict.o
iwlagn-objs
+=
iwl-agn-ucode.o iwl-agn-
hcmd.o iwl-agn-
tx.o
iwlagn-objs
:=
iwl-agn.o iwl-agn-rs.o iwl-agn-led.o
iwlagn-objs
+=
iwl-agn-ucode.o iwl-agn-tx.o
iwlagn-objs
+=
iwl-agn-lib.o iwl-agn-rx.o iwl-agn-calib.o
iwlagn-objs
+=
iwl-agn-tt.o iwl-agn-sta.o iwl-agn-eeprom.o
iwlagn-$(CONFIG_IWLWIFI_DEBUGFS)
+=
iwl-agn-debugfs.o
iwlagn-$(CONFIG_IWL4965)
+=
iwl-4965.o
iwlagn-$(CONFIG_IWL5000)
+=
iwl-agn-rxon.o iwl-agn-hcmd.o iwl-agn-ict.o
iwlagn-$(CONFIG_IWL5000)
+=
iwl-5000.o
iwlagn-$(CONFIG_IWL5000)
+=
iwl-6000.o
iwlagn-$(CONFIG_IWL5000)
+=
iwl-1000.o
...
...
drivers/net/wireless/iwlwifi/iwl-1000.c
浏览文件 @
b5e41567
...
...
@@ -211,14 +211,16 @@ static struct iwl_lib_ops iwl1000_lib = {
.
calib_version
=
iwlagn_eeprom_calib_version
,
.
query_addr
=
iwlagn_eeprom_query_addr
,
},
.
post_associate
=
iwl_post_associate
,
.
isr
=
iwl_isr_ict
,
.
config_ap
=
iwl_config_ap
,
.
isr_ops
=
{
.
isr
=
iwl_isr_ict
,
.
free
=
iwl_free_isr_ict
,
.
alloc
=
iwl_alloc_isr_ict
,
.
reset
=
iwl_reset_ict
,
.
disable
=
iwl_disable_ict
,
},
.
temp_ops
=
{
.
temperature
=
iwlagn_temperature
,
},
.
manage_ibss_station
=
iwlagn_manage_ibss_station
,
.
update_bcast_stations
=
iwl_update_bcast_stations
,
.
debugfs_ops
=
{
.
rx_stats_read
=
iwl_ucode_rx_stats_read
,
.
tx_stats_read
=
iwl_ucode_tx_stats_read
,
...
...
@@ -243,6 +245,7 @@ static const struct iwl_ops iwl1000_ops = {
.
hcmd
=
&
iwlagn_hcmd
,
.
utils
=
&
iwlagn_hcmd_utils
,
.
led
=
&
iwlagn_led_ops
,
.
ieee80211_ops
=
&
iwlagn_hw_ops
,
};
static
struct
iwl_base_params
iwl1000_base_params
=
{
...
...
drivers/net/wireless/iwlwifi/iwl-3945.c
浏览文件 @
b5e41567
...
...
@@ -51,6 +51,7 @@
#include "iwl-led.h"
#include "iwl-3945-led.h"
#include "iwl-3945-debugfs.h"
#include "iwl-legacy.h"
#define IWL_DECLARE_RATE_INFO(r, ip, in, rp, rn, pp, np) \
[IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP, \
...
...
@@ -1451,6 +1452,10 @@ static int iwl3945_send_tx_power(struct iwl_priv *priv)
};
u16
chan
;
if
(
WARN_ONCE
(
test_bit
(
STATUS_SCAN_HW
,
&
priv
->
status
),
"TX Power requested while scanning!
\n
"
))
return
-
EAGAIN
;
chan
=
le16_to_cpu
(
priv
->
contexts
[
IWL_RXON_CTX_BSS
].
active
.
channel
);
txpower
.
band
=
(
priv
->
band
==
IEEE80211_BAND_5GHZ
)
?
0
:
1
;
...
...
@@ -2722,10 +2727,9 @@ static struct iwl_lib_ops iwl3945_lib = {
},
.
send_tx_power
=
iwl3945_send_tx_power
,
.
is_valid_rtc_data_addr
=
iwl3945_hw_valid_rtc_data_addr
,
.
post_associate
=
iwl3945_post_associate
,
.
isr
=
iwl_isr_legacy
,
.
config_ap
=
iwl3945_config_ap
,
.
manage_ibss_station
=
iwl3945_manage_ibss_station
,
.
isr_ops
=
{
.
isr
=
iwl_isr_legacy
,
},
.
recover_from_tx_stall
=
iwl_bg_monitor_recover
,
.
check_plcp_health
=
iwl3945_good_plcp_health
,
...
...
@@ -2736,10 +2740,16 @@ static struct iwl_lib_ops iwl3945_lib = {
},
};
static
const
struct
iwl_legacy_ops
iwl3945_legacy_ops
=
{
.
post_associate
=
iwl3945_post_associate
,
.
config_ap
=
iwl3945_config_ap
,
.
manage_ibss_station
=
iwl3945_manage_ibss_station
,
};
static
struct
iwl_hcmd_utils_ops
iwl3945_hcmd_utils
=
{
.
get_hcmd_size
=
iwl3945_get_hcmd_size
,
.
build_addsta_hcmd
=
iwl3945_build_addsta_hcmd
,
.
tx_cmd_protection
=
iwl
core
_tx_cmd_protection
,
.
tx_cmd_protection
=
iwl
_legacy
_tx_cmd_protection
,
.
request_scan
=
iwl3945_request_scan
,
.
post_scan
=
iwl3945_post_scan
,
};
...
...
@@ -2749,6 +2759,8 @@ static const struct iwl_ops iwl3945_ops = {
.
hcmd
=
&
iwl3945_hcmd
,
.
utils
=
&
iwl3945_hcmd_utils
,
.
led
=
&
iwl3945_led_ops
,
.
legacy
=
&
iwl3945_legacy_ops
,
.
ieee80211_ops
=
&
iwl3945_hw_ops
,
};
static
struct
iwl_base_params
iwl3945_base_params
=
{
...
...
drivers/net/wireless/iwlwifi/iwl-3945.h
浏览文件 @
b5e41567
...
...
@@ -264,10 +264,8 @@ void iwl3945_reply_statistics(struct iwl_priv *priv,
struct
iwl_rx_mem_buffer
*
rxb
);
extern
void
iwl3945_disable_events
(
struct
iwl_priv
*
priv
);
extern
int
iwl4965_get_temperature
(
const
struct
iwl_priv
*
priv
);
extern
void
iwl3945_post_associate
(
struct
iwl_priv
*
priv
,
struct
ieee80211_vif
*
vif
);
extern
void
iwl3945_config_ap
(
struct
iwl_priv
*
priv
,
struct
ieee80211_vif
*
vif
);
extern
void
iwl3945_post_associate
(
struct
iwl_priv
*
priv
);
extern
void
iwl3945_config_ap
(
struct
iwl_priv
*
priv
);
extern
int
iwl3945_commit_rxon
(
struct
iwl_priv
*
priv
,
struct
iwl_rxon_context
*
ctx
);
...
...
@@ -282,6 +280,8 @@ extern int iwl3945_commit_rxon(struct iwl_priv *priv,
*/
extern
u8
iwl3945_hw_find_station
(
struct
iwl_priv
*
priv
,
const
u8
*
bssid
);
extern
struct
ieee80211_ops
iwl3945_hw_ops
;
/*
* Forward declare iwl-3945.c functions for iwl-base.c
*/
...
...
drivers/net/wireless/iwlwifi/iwl-4965.c
浏览文件 @
b5e41567
...
...
@@ -48,6 +48,7 @@
#include "iwl-agn-led.h"
#include "iwl-agn.h"
#include "iwl-agn-debugfs.h"
#include "iwl-legacy.h"
static
int
iwl4965_send_tx_power
(
struct
iwl_priv
*
priv
);
static
int
iwl4965_hw_get_temperature
(
struct
iwl_priv
*
priv
);
...
...
@@ -1377,13 +1378,9 @@ static int iwl4965_send_tx_power(struct iwl_priv *priv)
u8
ctrl_chan_high
=
0
;
struct
iwl_rxon_context
*
ctx
=
&
priv
->
contexts
[
IWL_RXON_CTX_BSS
];
if
(
test_bit
(
STATUS_SCANNING
,
&
priv
->
status
))
{
/* If this gets hit a lot, switch it to a BUG() and catch
* the stack trace to find out who is calling this during
* a scan. */
IWL_WARN
(
priv
,
"TX Power requested while scanning!
\n
"
);
if
(
WARN_ONCE
(
test_bit
(
STATUS_SCAN_HW
,
&
priv
->
status
),
"TX Power requested while scanning!
\n
"
))
return
-
EAGAIN
;
}
band
=
priv
->
band
==
IEEE80211_BAND_2GHZ
;
...
...
@@ -1447,6 +1444,142 @@ static int iwl4965_send_rxon_assoc(struct iwl_priv *priv,
return
ret
;
}
static
int
iwl4965_commit_rxon
(
struct
iwl_priv
*
priv
,
struct
iwl_rxon_context
*
ctx
)
{
/* cast away the const for active_rxon in this function */
struct
iwl_rxon_cmd
*
active_rxon
=
(
void
*
)
&
ctx
->
active
;
int
ret
;
bool
new_assoc
=
!!
(
ctx
->
staging
.
filter_flags
&
RXON_FILTER_ASSOC_MSK
);
if
(
!
iwl_is_alive
(
priv
))
return
-
EBUSY
;
if
(
!
ctx
->
is_active
)
return
0
;
/* always get timestamp with Rx frame */
ctx
->
staging
.
flags
|=
RXON_FLG_TSF2HOST_MSK
;
ret
=
iwl_check_rxon_cmd
(
priv
,
ctx
);
if
(
ret
)
{
IWL_ERR
(
priv
,
"Invalid RXON configuration. Not committing.
\n
"
);
return
-
EINVAL
;
}
/*
* receive commit_rxon request
* abort any previous channel switch if still in process
*/
if
(
priv
->
switch_rxon
.
switch_in_progress
&&
(
priv
->
switch_rxon
.
channel
!=
ctx
->
staging
.
channel
))
{
IWL_DEBUG_11H
(
priv
,
"abort channel switch on %d
\n
"
,
le16_to_cpu
(
priv
->
switch_rxon
.
channel
));
iwl_chswitch_done
(
priv
,
false
);
}
/* If we don't need to send a full RXON, we can use
* iwl_rxon_assoc_cmd which is used to reconfigure filter
* and other flags for the current radio configuration. */
if
(
!
iwl_full_rxon_required
(
priv
,
ctx
))
{
ret
=
iwl_send_rxon_assoc
(
priv
,
ctx
);
if
(
ret
)
{
IWL_ERR
(
priv
,
"Error setting RXON_ASSOC (%d)
\n
"
,
ret
);
return
ret
;
}
memcpy
(
active_rxon
,
&
ctx
->
staging
,
sizeof
(
*
active_rxon
));
iwl_print_rx_config_cmd
(
priv
,
ctx
);
return
0
;
}
/* If we are currently associated and the new config requires
* an RXON_ASSOC and the new config wants the associated mask enabled,
* we must clear the associated from the active configuration
* before we apply the new config */
if
(
iwl_is_associated_ctx
(
ctx
)
&&
new_assoc
)
{
IWL_DEBUG_INFO
(
priv
,
"Toggling associated bit on current RXON
\n
"
);
active_rxon
->
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
ret
=
iwl_send_cmd_pdu
(
priv
,
ctx
->
rxon_cmd
,
sizeof
(
struct
iwl_rxon_cmd
),
active_rxon
);
/* If the mask clearing failed then we set
* active_rxon back to what it was previously */
if
(
ret
)
{
active_rxon
->
filter_flags
|=
RXON_FILTER_ASSOC_MSK
;
IWL_ERR
(
priv
,
"Error clearing ASSOC_MSK (%d)
\n
"
,
ret
);
return
ret
;
}
iwl_clear_ucode_stations
(
priv
,
ctx
);
iwl_restore_stations
(
priv
,
ctx
);
ret
=
iwl_restore_default_wep_keys
(
priv
,
ctx
);
if
(
ret
)
{
IWL_ERR
(
priv
,
"Failed to restore WEP keys (%d)
\n
"
,
ret
);
return
ret
;
}
}
IWL_DEBUG_INFO
(
priv
,
"Sending RXON
\n
"
"* with%s RXON_FILTER_ASSOC_MSK
\n
"
"* channel = %d
\n
"
"* bssid = %pM
\n
"
,
(
new_assoc
?
""
:
"out"
),
le16_to_cpu
(
ctx
->
staging
.
channel
),
ctx
->
staging
.
bssid_addr
);
iwl_set_rxon_hwcrypto
(
priv
,
ctx
,
!
priv
->
cfg
->
mod_params
->
sw_crypto
);
/* Apply the new configuration
* RXON unassoc clears the station table in uCode so restoration of
* stations is needed after it (the RXON command) completes
*/
if
(
!
new_assoc
)
{
ret
=
iwl_send_cmd_pdu
(
priv
,
ctx
->
rxon_cmd
,
sizeof
(
struct
iwl_rxon_cmd
),
&
ctx
->
staging
);
if
(
ret
)
{
IWL_ERR
(
priv
,
"Error setting new RXON (%d)
\n
"
,
ret
);
return
ret
;
}
IWL_DEBUG_INFO
(
priv
,
"Return from !new_assoc RXON.
\n
"
);
memcpy
(
active_rxon
,
&
ctx
->
staging
,
sizeof
(
*
active_rxon
));
iwl_clear_ucode_stations
(
priv
,
ctx
);
iwl_restore_stations
(
priv
,
ctx
);
ret
=
iwl_restore_default_wep_keys
(
priv
,
ctx
);
if
(
ret
)
{
IWL_ERR
(
priv
,
"Failed to restore WEP keys (%d)
\n
"
,
ret
);
return
ret
;
}
}
if
(
new_assoc
)
{
priv
->
start_calib
=
0
;
/* Apply the new configuration
* RXON assoc doesn't clear the station table in uCode,
*/
ret
=
iwl_send_cmd_pdu
(
priv
,
ctx
->
rxon_cmd
,
sizeof
(
struct
iwl_rxon_cmd
),
&
ctx
->
staging
);
if
(
ret
)
{
IWL_ERR
(
priv
,
"Error setting new RXON (%d)
\n
"
,
ret
);
return
ret
;
}
memcpy
(
active_rxon
,
&
ctx
->
staging
,
sizeof
(
*
active_rxon
));
}
iwl_print_rx_config_cmd
(
priv
,
ctx
);
iwl_init_sensitivity
(
priv
);
/* If we issue a new RXON command which required a tune then we must
* send a new TXPOWER command or we won't be able to Tx any frames */
ret
=
iwl_set_tx_power
(
priv
,
priv
->
tx_power_user_lmt
,
true
);
if
(
ret
)
{
IWL_ERR
(
priv
,
"Error sending TX power (%d)
\n
"
,
ret
);
return
ret
;
}
return
0
;
}
static
int
iwl4965_hw_channel_switch
(
struct
iwl_priv
*
priv
,
struct
ieee80211_channel_switch
*
ch_switch
)
{
...
...
@@ -1553,22 +1686,6 @@ static void iwl4965_txq_update_byte_cnt_tbl(struct iwl_priv *priv,
tfd_offset
[
TFD_QUEUE_SIZE_MAX
+
write_ptr
]
=
bc_ent
;
}
/**
* sign_extend - Sign extend a value using specified bit as sign-bit
*
* Example: sign_extend(9, 3) would return -7 as bit3 of 1001b is 1
* and bit0..2 is 001b which when sign extended to 1111111111111001b is -7.
*
* @param oper value to sign extend
* @param index 0 based bit index (0<=index<32) to sign bit
*/
static
s32
sign_extend
(
u32
oper
,
int
index
)
{
u8
shift
=
31
-
index
;
return
(
s32
)(
oper
<<
shift
)
>>
shift
;
}
/**
* iwl4965_hw_get_temperature - return the calibrated temperature (in Kelvin)
* @statistics: Provides the temperature reading from the uCode
...
...
@@ -1606,9 +1723,9 @@ static int iwl4965_hw_get_temperature(struct iwl_priv *priv)
* "initialize" ALIVE response.
*/
if
(
!
test_bit
(
STATUS_TEMPERATURE
,
&
priv
->
status
))
vt
=
sign_extend
(
R4
,
23
);
vt
=
sign_extend
32
(
R4
,
23
);
else
vt
=
sign_extend
(
le32_to_cpu
(
priv
->
_agn
.
statistics
.
vt
=
sign_extend
32
(
le32_to_cpu
(
priv
->
_agn
.
statistics
.
general
.
common
.
temperature
),
23
);
IWL_DEBUG_TEMP
(
priv
,
"Calib values R[1-3]: %d %d %d R4: %d
\n
"
,
R1
,
R2
,
R3
,
vt
);
...
...
@@ -2216,7 +2333,7 @@ static void iwl4965_cancel_deferred_work(struct iwl_priv *priv)
static
struct
iwl_hcmd_ops
iwl4965_hcmd
=
{
.
rxon_assoc
=
iwl4965_send_rxon_assoc
,
.
commit_rxon
=
iwl
agn
_commit_rxon
,
.
commit_rxon
=
iwl
4965
_commit_rxon
,
.
set_rxon_chain
=
iwlagn_set_rxon_chain
,
.
send_bt_config
=
iwl_send_bt_config
,
};
...
...
@@ -2233,12 +2350,155 @@ static void iwl4965_post_scan(struct iwl_priv *priv)
iwlcore_commit_rxon
(
priv
,
ctx
);
}
static
void
iwl4965_post_associate
(
struct
iwl_priv
*
priv
)
{
struct
iwl_rxon_context
*
ctx
=
&
priv
->
contexts
[
IWL_RXON_CTX_BSS
];
struct
ieee80211_vif
*
vif
=
ctx
->
vif
;
struct
ieee80211_conf
*
conf
=
NULL
;
int
ret
=
0
;
if
(
!
vif
||
!
priv
->
is_open
)
return
;
if
(
vif
->
type
==
NL80211_IFTYPE_AP
)
{
IWL_ERR
(
priv
,
"%s Should not be called in AP mode
\n
"
,
__func__
);
return
;
}
if
(
test_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
))
return
;
iwl_scan_cancel_timeout
(
priv
,
200
);
conf
=
ieee80211_get_hw_conf
(
priv
->
hw
);
ctx
->
staging
.
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
iwlcore_commit_rxon
(
priv
,
ctx
);
ret
=
iwl_send_rxon_timing
(
priv
,
ctx
);
if
(
ret
)
IWL_WARN
(
priv
,
"RXON timing - "
"Attempting to continue.
\n
"
);
ctx
->
staging
.
filter_flags
|=
RXON_FILTER_ASSOC_MSK
;
iwl_set_rxon_ht
(
priv
,
&
priv
->
current_ht_config
);
if
(
priv
->
cfg
->
ops
->
hcmd
->
set_rxon_chain
)
priv
->
cfg
->
ops
->
hcmd
->
set_rxon_chain
(
priv
,
ctx
);
ctx
->
staging
.
assoc_id
=
cpu_to_le16
(
vif
->
bss_conf
.
aid
);
IWL_DEBUG_ASSOC
(
priv
,
"assoc id %d beacon interval %d
\n
"
,
vif
->
bss_conf
.
aid
,
vif
->
bss_conf
.
beacon_int
);
if
(
vif
->
bss_conf
.
use_short_preamble
)
ctx
->
staging
.
flags
|=
RXON_FLG_SHORT_PREAMBLE_MSK
;
else
ctx
->
staging
.
flags
&=
~
RXON_FLG_SHORT_PREAMBLE_MSK
;
if
(
ctx
->
staging
.
flags
&
RXON_FLG_BAND_24G_MSK
)
{
if
(
vif
->
bss_conf
.
use_short_slot
)
ctx
->
staging
.
flags
|=
RXON_FLG_SHORT_SLOT_MSK
;
else
ctx
->
staging
.
flags
&=
~
RXON_FLG_SHORT_SLOT_MSK
;
}
iwlcore_commit_rxon
(
priv
,
ctx
);
IWL_DEBUG_ASSOC
(
priv
,
"Associated as %d to: %pM
\n
"
,
vif
->
bss_conf
.
aid
,
ctx
->
active
.
bssid_addr
);
switch
(
vif
->
type
)
{
case
NL80211_IFTYPE_STATION
:
break
;
case
NL80211_IFTYPE_ADHOC
:
iwlagn_send_beacon_cmd
(
priv
);
break
;
default:
IWL_ERR
(
priv
,
"%s Should not be called in %d mode
\n
"
,
__func__
,
vif
->
type
);
break
;
}
/* the chain noise calibration will enabled PM upon completion
* If chain noise has already been run, then we need to enable
* power management here */
if
(
priv
->
chain_noise_data
.
state
==
IWL_CHAIN_NOISE_DONE
)
iwl_power_update_mode
(
priv
,
false
);
/* Enable Rx differential gain and sensitivity calibrations */
iwl_chain_noise_reset
(
priv
);
priv
->
start_calib
=
1
;
}
static
void
iwl4965_config_ap
(
struct
iwl_priv
*
priv
)
{
struct
iwl_rxon_context
*
ctx
=
&
priv
->
contexts
[
IWL_RXON_CTX_BSS
];
struct
ieee80211_vif
*
vif
=
ctx
->
vif
;
int
ret
=
0
;
lockdep_assert_held
(
&
priv
->
mutex
);
if
(
test_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
))
return
;
/* The following should be done only at AP bring up */
if
(
!
iwl_is_associated_ctx
(
ctx
))
{
/* RXON - unassoc (to set timing command) */
ctx
->
staging
.
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
iwlcore_commit_rxon
(
priv
,
ctx
);
/* RXON Timing */
ret
=
iwl_send_rxon_timing
(
priv
,
ctx
);
if
(
ret
)
IWL_WARN
(
priv
,
"RXON timing failed - "
"Attempting to continue.
\n
"
);
/* AP has all antennas */
priv
->
chain_noise_data
.
active_chains
=
priv
->
hw_params
.
valid_rx_ant
;
iwl_set_rxon_ht
(
priv
,
&
priv
->
current_ht_config
);
if
(
priv
->
cfg
->
ops
->
hcmd
->
set_rxon_chain
)
priv
->
cfg
->
ops
->
hcmd
->
set_rxon_chain
(
priv
,
ctx
);
ctx
->
staging
.
assoc_id
=
0
;
if
(
vif
->
bss_conf
.
use_short_preamble
)
ctx
->
staging
.
flags
|=
RXON_FLG_SHORT_PREAMBLE_MSK
;
else
ctx
->
staging
.
flags
&=
~
RXON_FLG_SHORT_PREAMBLE_MSK
;
if
(
ctx
->
staging
.
flags
&
RXON_FLG_BAND_24G_MSK
)
{
if
(
vif
->
bss_conf
.
use_short_slot
)
ctx
->
staging
.
flags
|=
RXON_FLG_SHORT_SLOT_MSK
;
else
ctx
->
staging
.
flags
&=
~
RXON_FLG_SHORT_SLOT_MSK
;
}
/* need to send beacon cmd before committing assoc RXON! */
iwlagn_send_beacon_cmd
(
priv
);
/* restore RXON assoc */
ctx
->
staging
.
filter_flags
|=
RXON_FILTER_ASSOC_MSK
;
iwlcore_commit_rxon
(
priv
,
ctx
);
}
iwlagn_send_beacon_cmd
(
priv
);
/* FIXME - we need to add code here to detect a totally new
* configuration, reset the AP, unassoc, rxon timing, assoc,
* clear sta table, add BCAST sta... */
}
static
struct
iwl_hcmd_utils_ops
iwl4965_hcmd_utils
=
{
.
get_hcmd_size
=
iwl4965_get_hcmd_size
,
.
build_addsta_hcmd
=
iwl4965_build_addsta_hcmd
,
.
chain_noise_reset
=
iwl4965_chain_noise_reset
,
.
gain_computation
=
iwl4965_gain_computation
,
.
tx_cmd_protection
=
iwl
core
_tx_cmd_protection
,
.
tx_cmd_protection
=
iwl
_legacy
_tx_cmd_protection
,
.
calc_rssi
=
iwl4965_calc_rssi
,
.
request_scan
=
iwlagn_request_scan
,
.
post_scan
=
iwl4965_post_scan
,
...
...
@@ -2285,14 +2545,12 @@ static struct iwl_lib_ops iwl4965_lib = {
},
.
send_tx_power
=
iwl4965_send_tx_power
,
.
update_chain_flags
=
iwl_update_chain_flags
,
.
post_associate
=
iwl_post_associate
,
.
config_ap
=
iwl_config_ap
,
.
isr
=
iwl_isr_legacy
,
.
isr_ops
=
{
.
isr
=
iwl_isr_legacy
,
}
,
.
temp_ops
=
{
.
temperature
=
iwl4965_temperature_calib
,
},
.
manage_ibss_station
=
iwlagn_manage_ibss_station
,
.
update_bcast_stations
=
iwl_update_bcast_stations
,
.
debugfs_ops
=
{
.
rx_stats_read
=
iwl_ucode_rx_stats_read
,
.
tx_stats_read
=
iwl_ucode_tx_stats_read
,
...
...
@@ -2304,11 +2562,43 @@ static struct iwl_lib_ops iwl4965_lib = {
.
check_plcp_health
=
iwl_good_plcp_health
,
};
static
const
struct
iwl_legacy_ops
iwl4965_legacy_ops
=
{
.
post_associate
=
iwl4965_post_associate
,
.
config_ap
=
iwl4965_config_ap
,
.
manage_ibss_station
=
iwlagn_manage_ibss_station
,
.
update_bcast_stations
=
iwl_update_bcast_stations
,
};
struct
ieee80211_ops
iwl4965_hw_ops
=
{
.
tx
=
iwlagn_mac_tx
,
.
start
=
iwlagn_mac_start
,
.
stop
=
iwlagn_mac_stop
,
.
add_interface
=
iwl_mac_add_interface
,
.
remove_interface
=
iwl_mac_remove_interface
,
.
change_interface
=
iwl_mac_change_interface
,
.
config
=
iwl_legacy_mac_config
,
.
configure_filter
=
iwlagn_configure_filter
,
.
set_key
=
iwlagn_mac_set_key
,
.
update_tkip_key
=
iwlagn_mac_update_tkip_key
,
.
conf_tx
=
iwl_mac_conf_tx
,
.
reset_tsf
=
iwl_legacy_mac_reset_tsf
,
.
bss_info_changed
=
iwl_legacy_mac_bss_info_changed
,
.
ampdu_action
=
iwlagn_mac_ampdu_action
,
.
hw_scan
=
iwl_mac_hw_scan
,
.
sta_add
=
iwlagn_mac_sta_add
,
.
sta_remove
=
iwl_mac_sta_remove
,
.
channel_switch
=
iwlagn_mac_channel_switch
,
.
flush
=
iwlagn_mac_flush
,
.
tx_last_beacon
=
iwl_mac_tx_last_beacon
,
};
static
const
struct
iwl_ops
iwl4965_ops
=
{
.
lib
=
&
iwl4965_lib
,
.
hcmd
=
&
iwl4965_hcmd
,
.
utils
=
&
iwl4965_hcmd_utils
,
.
led
=
&
iwlagn_led_ops
,
.
legacy
=
&
iwl4965_legacy_ops
,
.
ieee80211_ops
=
&
iwl4965_hw_ops
,
};
static
struct
iwl_base_params
iwl4965_base_params
=
{
...
...
drivers/net/wireless/iwlwifi/iwl-5000.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-6000.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-agn-calib.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-agn-lib.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
0 → 100644
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-agn-sta.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-agn.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-agn.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-core.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-core.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-csr.h
浏览文件 @
b5e41567
...
...
@@ -132,6 +132,8 @@
#define CSR_LED_REG (CSR_BASE+0x094)
#define CSR_DRAM_INT_TBL_REG (CSR_BASE+0x0A0)
#define CSR_MAC_SHADOW_REG_CTRL (CSR_BASE+0x0A8)
/* 6000 and up */
/* GIO Chicken Bits (PCI Express bus link power management) */
#define CSR_GIO_CHICKEN_BITS (CSR_BASE+0x100)
...
...
drivers/net/wireless/iwlwifi/iwl-dev.h
浏览文件 @
b5e41567
...
...
@@ -1162,6 +1162,8 @@ struct iwl_rxon_context {
*/
bool
always_active
,
is_active
;
bool
ht_need_multiple_chains
;
enum
iwl_rxon_context_id
ctxid
;
u32
interface_modes
,
exclusive_interface_modes
;
...
...
@@ -1517,6 +1519,7 @@ struct iwl_priv {
s8
tx_power_user_lmt
;
s8
tx_power_device_lmt
;
s8
tx_power_lmt_in_half_dbm
;
/* max tx power in half-dBm format */
s8
tx_power_next
;
#ifdef CONFIG_IWLWIFI_DEBUG
...
...
drivers/net/wireless/iwlwifi/iwl-led.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-legacy.c
0 → 100644
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-legacy.h
0 → 100644
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-power.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-power.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-rx.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-scan.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-tx.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl3945-base.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/mac80211_hwsim.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/mwl8k.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2400pci.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2400pci.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2500pci.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2500pci.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2500usb.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2800.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2800lib.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2800pci.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2800pci.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2800usb.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2800usb.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00.h
浏览文件 @
b5e41567
...
...
@@ -1133,6 +1133,7 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
int
rt2x00mac_conf_tx
(
struct
ieee80211_hw
*
hw
,
u16
queue
,
const
struct
ieee80211_tx_queue_params
*
params
);
void
rt2x00mac_rfkill_poll
(
struct
ieee80211_hw
*
hw
);
void
rt2x00mac_flush
(
struct
ieee80211_hw
*
hw
,
bool
drop
);
/*
* Driver allocation handlers.
...
...
drivers/net/wireless/rt2x00/rt2x00config.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00debug.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00dev.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00lib.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00link.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00mac.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00pci.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00queue.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00queue.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00reg.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt2x00usb.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt61pci.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt61pci.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt73usb.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rt2x00/rt73usb.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rtl818x/rtl8187_dev.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/rtl818x/rtl8187_rtl8225.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl1251/main.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl1251/sdio.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl1251/spi.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl1251/wl1251.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/Kconfig
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_acx.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_acx.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_boot.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_debugfs.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_event.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_main.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_rx.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_rx.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_scan.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_testmode.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_tx.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/wl1271_tx.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/zd1201.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/net/wireless/zd1211rw/zd_usb.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
drivers/ssb/pcihost_wrapper.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
include/linux/bitops.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
include/linux/nl80211.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
include/linux/rfkill.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
include/linux/wl12xx.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
include/net/cfg80211.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
net/mac80211/aes_ccm.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
net/mac80211/aes_cmac.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
net/mac80211/debugfs.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
net/mac80211/debugfs.h
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
net/mac80211/debugfs_key.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
net/mac80211/debugfs_sta.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
net/mac80211/rc80211_minstrel_ht.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
net/rfkill/core.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
net/wireless/reg.c
浏览文件 @
b5e41567
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录