Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
e0a8c583
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
e0a8c583
编写于
8月 29, 2011
作者:
J
John W. Linville
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-linville' of
git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx
上级
a508a6ea
04b4d69c
变更
25
展开全部
显示空白变更内容
内联
并排
Showing
25 changed file
with
2090 addition
and
1860 deletion
+2090
-1860
drivers/net/wireless/wl12xx/acx.c
drivers/net/wireless/wl12xx/acx.c
+123
-199
drivers/net/wireless/wl12xx/acx.h
drivers/net/wireless/wl12xx/acx.h
+135
-259
drivers/net/wireless/wl12xx/boot.c
drivers/net/wireless/wl12xx/boot.c
+15
-28
drivers/net/wireless/wl12xx/boot.h
drivers/net/wireless/wl12xx/boot.h
+2
-1
drivers/net/wireless/wl12xx/cmd.c
drivers/net/wireless/wl12xx/cmd.c
+587
-206
drivers/net/wireless/wl12xx/cmd.h
drivers/net/wireless/wl12xx/cmd.h
+181
-148
drivers/net/wireless/wl12xx/conf.h
drivers/net/wireless/wl12xx/conf.h
+140
-212
drivers/net/wireless/wl12xx/debugfs.c
drivers/net/wireless/wl12xx/debugfs.c
+6
-11
drivers/net/wireless/wl12xx/event.c
drivers/net/wireless/wl12xx/event.c
+3
-3
drivers/net/wireless/wl12xx/event.h
drivers/net/wireless/wl12xx/event.h
+31
-49
drivers/net/wireless/wl12xx/init.c
drivers/net/wireless/wl12xx/init.c
+30
-61
drivers/net/wireless/wl12xx/io.h
drivers/net/wireless/wl12xx/io.h
+0
-1
drivers/net/wireless/wl12xx/main.c
drivers/net/wireless/wl12xx/main.c
+582
-379
drivers/net/wireless/wl12xx/ps.c
drivers/net/wireless/wl12xx/ps.c
+2
-2
drivers/net/wireless/wl12xx/reg.h
drivers/net/wireless/wl12xx/reg.h
+0
-75
drivers/net/wireless/wl12xx/rx.c
drivers/net/wireless/wl12xx/rx.c
+36
-24
drivers/net/wireless/wl12xx/rx.h
drivers/net/wireless/wl12xx/rx.h
+8
-10
drivers/net/wireless/wl12xx/scan.c
drivers/net/wireless/wl12xx/scan.c
+28
-10
drivers/net/wireless/wl12xx/scan.h
drivers/net/wireless/wl12xx/scan.h
+16
-9
drivers/net/wireless/wl12xx/sdio.c
drivers/net/wireless/wl12xx/sdio.c
+1
-3
drivers/net/wireless/wl12xx/spi.c
drivers/net/wireless/wl12xx/spi.c
+1
-3
drivers/net/wireless/wl12xx/tx.c
drivers/net/wireless/wl12xx/tx.c
+84
-52
drivers/net/wireless/wl12xx/tx.h
drivers/net/wireless/wl12xx/tx.h
+5
-11
drivers/net/wireless/wl12xx/wl12xx.h
drivers/net/wireless/wl12xx/wl12xx.h
+74
-79
drivers/net/wireless/wl12xx/wl12xx_80211.h
drivers/net/wireless/wl12xx/wl12xx_80211.h
+0
-25
未找到文件。
drivers/net/wireless/wl12xx/acx.c
浏览文件 @
e0a8c583
...
...
@@ -46,6 +46,7 @@ int wl1271_acx_wake_up_conditions(struct wl1271 *wl)
goto
out
;
}
wake_up
->
role_id
=
wl
->
role_id
;
wake_up
->
wake_up_event
=
wl
->
conf
.
conn
.
wake_up_event
;
wake_up
->
listen_interval
=
wl
->
conf
.
conn
.
listen_interval
;
...
...
@@ -101,6 +102,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power)
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
current_tx_power
=
power
*
10
;
ret
=
wl1271_cmd_configure
(
wl
,
DOT11_CUR_TX_PWR
,
acx
,
sizeof
(
*
acx
));
...
...
@@ -128,6 +130,7 @@ int wl1271_acx_feature_cfg(struct wl1271 *wl)
}
/* DF_ENCRYPTION_DISABLE and DF_SNIFF_MODE_ENABLE are disabled */
feature
->
role_id
=
wl
->
role_id
;
feature
->
data_flow_options
=
0
;
feature
->
options
=
0
;
...
...
@@ -183,34 +186,6 @@ int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl)
return
ret
;
}
int
wl1271_acx_rx_config
(
struct
wl1271
*
wl
,
u32
config
,
u32
filter
)
{
struct
acx_rx_config
*
rx_config
;
int
ret
;
wl1271_debug
(
DEBUG_ACX
,
"acx rx config"
);
rx_config
=
kzalloc
(
sizeof
(
*
rx_config
),
GFP_KERNEL
);
if
(
!
rx_config
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
rx_config
->
config_options
=
cpu_to_le32
(
config
);
rx_config
->
filter_options
=
cpu_to_le32
(
filter
);
ret
=
wl1271_cmd_configure
(
wl
,
ACX_RX_CFG
,
rx_config
,
sizeof
(
*
rx_config
));
if
(
ret
<
0
)
{
wl1271_warning
(
"failed to set rx config: %d"
,
ret
);
goto
out
;
}
out:
kfree
(
rx_config
);
return
ret
;
}
int
wl1271_acx_pd_threshold
(
struct
wl1271
*
wl
)
{
struct
acx_packet_detection
*
pd
;
...
...
@@ -250,6 +225,7 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time)
goto
out
;
}
slot
->
role_id
=
wl
->
role_id
;
slot
->
wone_index
=
STATION_WONE_INDEX
;
slot
->
slot_time
=
slot_time
;
...
...
@@ -279,6 +255,7 @@ int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable,
}
/* MAC filtering */
acx
->
role_id
=
wl
->
role_id
;
acx
->
enabled
=
enable
;
acx
->
num_groups
=
mc_list_len
;
memcpy
(
acx
->
mac_table
,
mc_list
,
mc_list_len
*
ETH_ALEN
);
...
...
@@ -308,6 +285,7 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl)
wl1271_debug
(
DEBUG_ACX
,
"acx service period timeout"
);
rx_timeout
->
role_id
=
wl
->
role_id
;
rx_timeout
->
ps_poll_timeout
=
cpu_to_le16
(
wl
->
conf
.
rx
.
ps_poll_timeout
);
rx_timeout
->
upsd_timeout
=
cpu_to_le16
(
wl
->
conf
.
rx
.
upsd_timeout
);
...
...
@@ -344,6 +322,7 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold)
goto
out
;
}
rts
->
role_id
=
wl
->
role_id
;
rts
->
threshold
=
cpu_to_le16
((
u16
)
rts_threshold
);
ret
=
wl1271_cmd_configure
(
wl
,
DOT11_RTS_THRESHOLD
,
rts
,
sizeof
(
*
rts
));
...
...
@@ -403,6 +382,7 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter)
goto
out
;
}
beacon_filter
->
role_id
=
wl
->
role_id
;
beacon_filter
->
enable
=
enable_filter
;
/*
...
...
@@ -439,6 +419,7 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl)
}
/* configure default beacon pass-through rules */
ie_table
->
role_id
=
wl
->
role_id
;
ie_table
->
num_ie
=
0
;
for
(
i
=
0
;
i
<
wl
->
conf
.
conn
.
bcn_filt_ie_count
;
i
++
)
{
struct
conf_bcn_filt_rule
*
r
=
&
(
wl
->
conf
.
conn
.
bcn_filt_ie
[
i
]);
...
...
@@ -500,6 +481,7 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable)
timeout
=
wl
->
conf
.
conn
.
bss_lose_timeout
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
synch_fail_thold
=
cpu_to_le32
(
threshold
);
acx
->
bss_lose_timeout
=
cpu_to_le32
(
timeout
);
...
...
@@ -546,43 +528,13 @@ int wl1271_acx_sg_enable(struct wl1271 *wl, bool enable)
return
ret
;
}
int
wl1271_acx_sta_sg_cfg
(
struct
wl1271
*
wl
)
{
struct
acx_sta_bt_wlan_coex_param
*
param
;
struct
conf_sg_settings
*
c
=
&
wl
->
conf
.
sg
;
int
i
,
ret
;
wl1271_debug
(
DEBUG_ACX
,
"acx sg sta cfg"
);
param
=
kzalloc
(
sizeof
(
*
param
),
GFP_KERNEL
);
if
(
!
param
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
/* BT-WLAN coext parameters */
for
(
i
=
0
;
i
<
CONF_SG_STA_PARAMS_MAX
;
i
++
)
param
->
params
[
i
]
=
cpu_to_le32
(
c
->
sta_params
[
i
]);
param
->
param_idx
=
CONF_SG_PARAMS_ALL
;
ret
=
wl1271_cmd_configure
(
wl
,
ACX_SG_CFG
,
param
,
sizeof
(
*
param
));
if
(
ret
<
0
)
{
wl1271_warning
(
"failed to set sg config: %d"
,
ret
);
goto
out
;
}
out:
kfree
(
param
);
return
ret
;
}
int
wl1271_acx_ap_sg_cfg
(
struct
wl1271
*
wl
)
int
wl12xx_acx_sg_cfg
(
struct
wl1271
*
wl
)
{
struct
acx_
ap_
bt_wlan_coex_param
*
param
;
struct
acx_bt_wlan_coex_param
*
param
;
struct
conf_sg_settings
*
c
=
&
wl
->
conf
.
sg
;
int
i
,
ret
;
wl1271_debug
(
DEBUG_ACX
,
"acx sg
ap
cfg"
);
wl1271_debug
(
DEBUG_ACX
,
"acx sg cfg"
);
param
=
kzalloc
(
sizeof
(
*
param
),
GFP_KERNEL
);
if
(
!
param
)
{
...
...
@@ -591,8 +543,8 @@ int wl1271_acx_ap_sg_cfg(struct wl1271 *wl)
}
/* BT-WLAN coext parameters */
for
(
i
=
0
;
i
<
CONF_SG_
AP_
PARAMS_MAX
;
i
++
)
param
->
params
[
i
]
=
cpu_to_le32
(
c
->
ap_
params
[
i
]);
for
(
i
=
0
;
i
<
CONF_SG_PARAMS_MAX
;
i
++
)
param
->
params
[
i
]
=
cpu_to_le32
(
c
->
params
[
i
]);
param
->
param_idx
=
CONF_SG_PARAMS_ALL
;
ret
=
wl1271_cmd_configure
(
wl
,
ACX_SG_CFG
,
param
,
sizeof
(
*
param
));
...
...
@@ -647,6 +599,7 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl)
goto
out
;
}
bb
->
role_id
=
wl
->
role_id
;
bb
->
beacon_rx_timeout
=
cpu_to_le16
(
wl
->
conf
.
conn
.
beacon_rx_timeout
);
bb
->
broadcast_timeout
=
cpu_to_le16
(
wl
->
conf
.
conn
.
broadcast_timeout
);
bb
->
rx_broadcast_in_ps
=
wl
->
conf
.
conn
.
rx_broadcast_in_ps
;
...
...
@@ -676,6 +629,7 @@ int wl1271_acx_aid(struct wl1271 *wl, u16 aid)
goto
out
;
}
acx_aid
->
role_id
=
wl
->
role_id
;
acx_aid
->
aid
=
cpu_to_le16
(
aid
);
ret
=
wl1271_cmd_configure
(
wl
,
ACX_AID
,
acx_aid
,
sizeof
(
*
acx_aid
));
...
...
@@ -731,6 +685,7 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble)
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
preamble
=
preamble
;
ret
=
wl1271_cmd_configure
(
wl
,
ACX_PREAMBLE_TYPE
,
acx
,
sizeof
(
*
acx
));
...
...
@@ -758,6 +713,7 @@ int wl1271_acx_cts_protect(struct wl1271 *wl,
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
ctsprotect
=
ctsprotect
;
ret
=
wl1271_cmd_configure
(
wl
,
ACX_CTS_PROTECTION
,
acx
,
sizeof
(
*
acx
));
...
...
@@ -789,9 +745,8 @@ int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats)
int
wl1271_acx_sta_rate_policies
(
struct
wl1271
*
wl
)
{
struct
acx_
sta_
rate_policy
*
acx
;
struct
acx_rate_policy
*
acx
;
struct
conf_tx_rate_class
*
c
=
&
wl
->
conf
.
tx
.
sta_rc_conf
;
int
idx
=
0
;
int
ret
=
0
;
wl1271_debug
(
DEBUG_ACX
,
"acx rate policies"
);
...
...
@@ -803,25 +758,30 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl)
goto
out
;
}
wl1271_debug
(
DEBUG_ACX
,
"basic_rate: 0x%x, full_rate: 0x%x"
,
wl
->
basic_rate
,
wl
->
rate_set
);
/* configure one basic rate class */
idx
=
ACX_TX_BASIC_RATE
;
acx
->
rate_class
[
idx
].
enabled_rates
=
cpu_to_le32
(
wl
->
basic_rate
);
acx
->
rate_class
[
idx
].
short_retry_limit
=
c
->
short_retry_limit
;
acx
->
rate_class
[
idx
].
long_retry_limit
=
c
->
long_retry_limit
;
acx
->
rate_class
[
idx
].
aflags
=
c
->
aflags
;
acx
->
rate_policy_idx
=
cpu_to_le32
(
ACX_TX_BASIC_RATE
);
acx
->
rate_policy
.
enabled_rates
=
cpu_to_le32
(
wl
->
basic_rate
);
acx
->
rate_policy
.
short_retry_limit
=
c
->
short_retry_limit
;
acx
->
rate_policy
.
long_retry_limit
=
c
->
long_retry_limit
;
acx
->
rate_policy
.
aflags
=
c
->
aflags
;
ret
=
wl1271_cmd_configure
(
wl
,
ACX_RATE_POLICY
,
acx
,
sizeof
(
*
acx
));
if
(
ret
<
0
)
{
wl1271_warning
(
"Setting of rate policies failed: %d"
,
ret
);
goto
out
;
}
/* configure one AP supported rate class */
idx
=
ACX_TX_AP_FULL_RATE
;
acx
->
rate_
class
[
idx
]
.
enabled_rates
=
cpu_to_le32
(
wl
->
rate_set
);
acx
->
rate_
class
[
idx
]
.
short_retry_limit
=
c
->
short_retry_limit
;
acx
->
rate_
class
[
idx
]
.
long_retry_limit
=
c
->
long_retry_limit
;
acx
->
rate_
class
[
idx
]
.
aflags
=
c
->
aflags
;
acx
->
rate_policy_idx
=
cpu_to_le32
(
ACX_TX_AP_FULL_RATE
)
;
acx
->
rate_
policy
.
enabled_rates
=
cpu_to_le32
(
wl
->
rate_set
);
acx
->
rate_
policy
.
short_retry_limit
=
c
->
short_retry_limit
;
acx
->
rate_
policy
.
long_retry_limit
=
c
->
long_retry_limit
;
acx
->
rate_
policy
.
aflags
=
c
->
aflags
;
acx
->
rate_class_cnt
=
cpu_to_le32
(
ACX_TX_RATE_POLICY_CNT
);
wl1271_debug
(
DEBUG_ACX
,
"basic_rate: 0x%x, full_rate: 0x%x"
,
acx
->
rate_class
[
ACX_TX_BASIC_RATE
].
enabled_rates
,
acx
->
rate_class
[
ACX_TX_AP_FULL_RATE
].
enabled_rates
);
ret
=
wl1271_cmd_configure
(
wl
,
ACX_RATE_POLICY
,
acx
,
sizeof
(
*
acx
));
if
(
ret
<
0
)
{
...
...
@@ -837,7 +797,7 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl)
int
wl1271_acx_ap_rate_policy
(
struct
wl1271
*
wl
,
struct
conf_tx_rate_class
*
c
,
u8
idx
)
{
struct
acx_
ap_
rate_policy
*
acx
;
struct
acx_rate_policy
*
acx
;
int
ret
=
0
;
wl1271_debug
(
DEBUG_ACX
,
"acx ap rate policy %d rates 0x%x"
,
...
...
@@ -883,6 +843,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max,
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
ac
=
ac
;
acx
->
cw_min
=
cw_min
;
acx
->
cw_max
=
cpu_to_le16
(
cw_max
);
...
...
@@ -916,6 +877,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type,
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
queue_id
=
queue_id
;
acx
->
channel_type
=
channel_type
;
acx
->
tsid
=
tsid
;
...
...
@@ -995,52 +957,9 @@ int wl1271_acx_tx_config_options(struct wl1271 *wl)
return
ret
;
}
int
wl1271_acx_ap_mem_cfg
(
struct
wl1271
*
wl
)
{
struct
wl1271_acx_ap_config_memory
*
mem_conf
;
struct
conf_memory_settings
*
mem
;
int
ret
;
wl1271_debug
(
DEBUG_ACX
,
"wl1271 mem cfg"
);
mem_conf
=
kzalloc
(
sizeof
(
*
mem_conf
),
GFP_KERNEL
);
if
(
!
mem_conf
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
if
(
wl
->
chip
.
id
==
CHIP_ID_1283_PG20
)
/*
* FIXME: The 128x AP FW does not yet support dynamic memory.
* Use the base memory configuration for 128x for now. This
* should be fine tuned in the future.
*/
mem
=
&
wl
->
conf
.
mem_wl128x
;
else
mem
=
&
wl
->
conf
.
mem_wl127x
;
/* memory config */
mem_conf
->
num_stations
=
mem
->
num_stations
;
mem_conf
->
rx_mem_block_num
=
mem
->
rx_block_num
;
mem_conf
->
tx_min_mem_block_num
=
mem
->
tx_min_block_num
;
mem_conf
->
num_ssid_profiles
=
mem
->
ssid_profiles
;
mem_conf
->
total_tx_descriptors
=
cpu_to_le32
(
ACX_TX_DESCRIPTORS
);
ret
=
wl1271_cmd_configure
(
wl
,
ACX_MEM_CFG
,
mem_conf
,
sizeof
(
*
mem_conf
));
if
(
ret
<
0
)
{
wl1271_warning
(
"wl1271 mem config failed: %d"
,
ret
);
goto
out
;
}
out:
kfree
(
mem_conf
);
return
ret
;
}
int
wl1271_acx_sta_mem_cfg
(
struct
wl1271
*
wl
)
int
wl12xx_acx_mem_cfg
(
struct
wl1271
*
wl
)
{
struct
wl12
71_acx_sta
_config_memory
*
mem_conf
;
struct
wl12
xx_acx
_config_memory
*
mem_conf
;
struct
conf_memory_settings
*
mem
;
int
ret
;
...
...
@@ -1183,6 +1102,7 @@ int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable)
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
enable
=
enable
?
CONF_BET_MODE_ENABLE
:
CONF_BET_MODE_DISABLE
;
acx
->
max_consecutive
=
wl
->
conf
.
conn
.
bet_max_consecutive
;
...
...
@@ -1210,6 +1130,7 @@ int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address)
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
version
=
ACX_IPV4_VERSION
;
acx
->
enable
=
enable
;
...
...
@@ -1269,6 +1190,7 @@ int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable)
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
enabled
=
enable
;
ret
=
wl1271_cmd_configure
(
wl
,
ACX_KEEP_ALIVE_MODE
,
acx
,
sizeof
(
*
acx
));
...
...
@@ -1295,6 +1217,7 @@ int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid)
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
period
=
cpu_to_le32
(
wl
->
conf
.
conn
.
keep_alive_interval
);
acx
->
index
=
index
;
acx
->
tpl_validation
=
tpl_valid
;
...
...
@@ -1328,6 +1251,7 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable,
wl
->
last_rssi_event
=
-
1
;
acx
->
role_id
=
wl
->
role_id
;
acx
->
pacing
=
cpu_to_le16
(
wl
->
conf
.
roam_trigger
.
trigger_pacing
);
acx
->
metric
=
WL1271_ACX_TRIG_METRIC_RSSI_BEACON
;
acx
->
type
=
WL1271_ACX_TRIG_TYPE_EDGE
;
...
...
@@ -1366,6 +1290,7 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl)
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
rssi_beacon
=
c
->
avg_weight_rssi_beacon
;
acx
->
rssi_data
=
c
->
avg_weight_rssi_data
;
acx
->
snr_beacon
=
c
->
avg_weight_snr_beacon
;
...
...
@@ -1384,14 +1309,15 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl)
int
wl1271_acx_set_ht_capabilities
(
struct
wl1271
*
wl
,
struct
ieee80211_sta_ht_cap
*
ht_cap
,
bool
allow_ht_operation
)
bool
allow_ht_operation
,
u8
hlid
)
{
struct
wl1271_acx_ht_capabilities
*
acx
;
u8
mac_address
[
ETH_ALEN
]
=
{
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
};
int
ret
=
0
;
u32
ht_capabilites
=
0
;
wl1271_debug
(
DEBUG_ACX
,
"acx ht capabilities setting"
);
wl1271_debug
(
DEBUG_ACX
,
"acx ht capabilities setting "
"sta supp: %d sta cap: %d"
,
ht_cap
->
ht_supported
,
ht_cap
->
cap
);
acx
=
kzalloc
(
sizeof
(
*
acx
),
GFP_KERNEL
);
if
(
!
acx
)
{
...
...
@@ -1399,26 +1325,22 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
goto
out
;
}
/* Allow HT Operation ? */
if
(
allow_ht_operation
)
{
ht_capabilites
=
WL1271_ACX_FW_CAP_HT_OPERATION
;
if
(
ht_cap
->
cap
&
IEEE80211_HT_CAP_GRN_FLD
)
ht_capabilites
|=
WL1271_ACX_FW_CAP_GREENFIELD_FRAME_FORMAT
;
if
(
ht_cap
->
cap
&
IEEE80211_HT_CAP_SGI_20
)
ht_capabilites
|=
WL1271_ACX_FW_CAP_SHORT_GI_FOR_20MHZ_PACKETS
;
if
(
ht_cap
->
cap
&
IEEE80211_HT_CAP_LSIG_TXOP_PROT
)
ht_capabilites
|=
WL1271_ACX_FW_CAP_LSIG_TXOP_PROTECTION
;
if
(
allow_ht_operation
&&
ht_cap
->
ht_supported
)
{
/* no need to translate capabilities - use the spec values */
ht_capabilites
=
ht_cap
->
cap
;
/*
* this bit is not employed by the spec but only by FW to
* indicate peer HT support
*/
ht_capabilites
|=
WL12XX_HT_CAP_HT_OPERATION
;
/* get data from A-MPDU parameters field */
acx
->
ampdu_max_length
=
ht_cap
->
ampdu_factor
;
acx
->
ampdu_min_spacing
=
ht_cap
->
ampdu_density
;
}
memcpy
(
acx
->
mac_address
,
mac_address
,
ETH_ALEN
)
;
acx
->
hlid
=
hlid
;
acx
->
ht_capabilites
=
cpu_to_le32
(
ht_capabilites
);
ret
=
wl1271_cmd_configure
(
wl
,
ACX_PEER_HT_CAP
,
acx
,
sizeof
(
*
acx
));
...
...
@@ -1446,6 +1368,7 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl,
goto
out
;
}
acx
->
role_id
=
wl
->
role_id
;
acx
->
ht_protection
=
(
u8
)(
ht_operation_mode
&
IEEE80211_HT_OP_MODE_PROTECTION
);
acx
->
rifs_mode
=
0
;
...
...
@@ -1467,14 +1390,12 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl,
}
/* Configure BA session initiator/receiver parameters setting in the FW. */
int
wl1271_acx_set_ba_session
(
struct
wl1271
*
wl
,
enum
ieee80211_back_parties
direction
,
u8
tid_index
,
u8
policy
)
int
wl12xx_acx_set_ba_initiator_policy
(
struct
wl1271
*
wl
)
{
struct
wl1271_acx_ba_
session
_policy
*
acx
;
struct
wl1271_acx_ba_
initiator
_policy
*
acx
;
int
ret
;
wl1271_debug
(
DEBUG_ACX
,
"acx ba
session setting
"
);
wl1271_debug
(
DEBUG_ACX
,
"acx ba
initiator policy
"
);
acx
=
kzalloc
(
sizeof
(
*
acx
),
GFP_KERNEL
);
if
(
!
acx
)
{
...
...
@@ -1482,33 +1403,18 @@ int wl1271_acx_set_ba_session(struct wl1271 *wl,
goto
out
;
}
/* ANY role */
acx
->
role_id
=
0xff
;
acx
->
tid
=
tid_index
;
acx
->
enable
=
policy
;
acx
->
ba_direction
=
direction
;
switch
(
direction
)
{
case
WLAN_BACK_INITIATOR
:
/* set for the current role */
acx
->
role_id
=
wl
->
role_id
;
acx
->
tid_bitmap
=
wl
->
conf
.
ht
.
tx_ba_tid_bitmap
;
acx
->
win_size
=
wl
->
conf
.
ht
.
tx_ba_win_size
;
acx
->
inactivity_timeout
=
wl
->
conf
.
ht
.
inactivity_timeout
;
break
;
case
WLAN_BACK_RECIPIENT
:
acx
->
win_size
=
RX_BA_WIN_SIZE
;
acx
->
inactivity_timeout
=
0
;
break
;
default:
wl1271_error
(
"Incorrect acx command id=%x
\n
"
,
direction
);
ret
=
-
EINVAL
;
goto
out
;
}
ret
=
wl1271_cmd_configure
(
wl
,
ACX_BA_SESSION_
POLICY_CFG
,
ACX_BA_SESSION_
INIT_POLICY
,
acx
,
sizeof
(
*
acx
));
if
(
ret
<
0
)
{
wl1271_warning
(
"acx ba
session setting
failed: %d"
,
ret
);
wl1271_warning
(
"acx ba
initiator policy
failed: %d"
,
ret
);
goto
out
;
}
...
...
@@ -1518,8 +1424,8 @@ int wl1271_acx_set_ba_session(struct wl1271 *wl,
}
/* setup BA session receiver setting in the FW. */
int
wl12
71_acx_set_ba_receiver_session
(
struct
wl1271
*
wl
,
u8
tid_index
,
u16
ssn
,
bool
enable
)
int
wl12
xx_acx_set_ba_receiver_session
(
struct
wl1271
*
wl
,
u8
tid_index
,
u16
ssn
,
bool
enable
,
u8
peer_hlid
)
{
struct
wl1271_acx_ba_receiver_setup
*
acx
;
int
ret
;
...
...
@@ -1532,11 +1438,10 @@ int wl1271_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn,
goto
out
;
}
/* Single link for now */
acx
->
link_id
=
1
;
acx
->
hlid
=
peer_hlid
;
acx
->
tid
=
tid_index
;
acx
->
enable
=
enable
;
acx
->
win_size
=
0
;
acx
->
win_size
=
wl
->
conf
.
ht
.
rx_ba_win_size
;
acx
->
ssn
=
ssn
;
ret
=
wl1271_cmd_configure
(
wl
,
ACX_BA_SESSION_RX_SETUP
,
acx
,
...
...
@@ -1606,6 +1511,7 @@ int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable)
if
(
!
(
conf_queues
&
BIT
(
i
)))
continue
;
rx_streaming
->
role_id
=
wl
->
role_id
;
rx_streaming
->
tid
=
i
;
rx_streaming
->
enable
=
enable_queues
&
BIT
(
i
);
rx_streaming
->
period
=
wl
->
conf
.
rx_streaming
.
interval
;
...
...
@@ -1635,6 +1541,7 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl)
if
(
!
acx
)
return
-
ENOMEM
;
acx
->
role_id
=
wl
->
role_id
;
acx
->
max_tx_retry
=
cpu_to_le16
(
wl
->
conf
.
tx
.
max_tx_retries
);
ret
=
wl1271_cmd_configure
(
wl
,
ACX_MAX_TX_FAILURE
,
acx
,
sizeof
(
*
acx
));
...
...
@@ -1703,31 +1610,6 @@ int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr)
return
ret
;
}
int
wl1271_acx_set_ap_beacon_filter
(
struct
wl1271
*
wl
,
bool
enable
)
{
struct
acx_ap_beacon_filter
*
acx
=
NULL
;
int
ret
;
wl1271_debug
(
DEBUG_ACX
,
"acx set ap beacon filter: %d"
,
enable
);
acx
=
kzalloc
(
sizeof
(
*
acx
),
GFP_KERNEL
);
if
(
!
acx
)
return
-
ENOMEM
;
acx
->
enable
=
enable
?
1
:
0
;
ret
=
wl1271_cmd_configure
(
wl
,
ACX_AP_BEACON_FILTER_OPT
,
acx
,
sizeof
(
*
acx
));
if
(
ret
<
0
)
{
wl1271_warning
(
"acx set ap beacon filter failed: %d"
,
ret
);
goto
out
;
}
out:
kfree
(
acx
);
return
ret
;
}
int
wl1271_acx_fm_coex
(
struct
wl1271
*
wl
)
{
struct
wl1271_acx_fm_coex
*
acx
;
...
...
@@ -1767,3 +1649,45 @@ int wl1271_acx_fm_coex(struct wl1271 *wl)
kfree
(
acx
);
return
ret
;
}
int
wl12xx_acx_set_rate_mgmt_params
(
struct
wl1271
*
wl
)
{
struct
wl12xx_acx_set_rate_mgmt_params
*
acx
=
NULL
;
struct
conf_rate_policy_settings
*
conf
=
&
wl
->
conf
.
rate
;
int
ret
;
wl1271_debug
(
DEBUG_ACX
,
"acx set rate mgmt params"
);
acx
=
kzalloc
(
sizeof
(
*
acx
),
GFP_KERNEL
);
if
(
!
acx
)
return
-
ENOMEM
;
acx
->
index
=
ACX_RATE_MGMT_ALL_PARAMS
;
acx
->
rate_retry_score
=
cpu_to_le16
(
conf
->
rate_retry_score
);
acx
->
per_add
=
cpu_to_le16
(
conf
->
per_add
);
acx
->
per_th1
=
cpu_to_le16
(
conf
->
per_th1
);
acx
->
per_th2
=
cpu_to_le16
(
conf
->
per_th2
);
acx
->
max_per
=
cpu_to_le16
(
conf
->
max_per
);
acx
->
inverse_curiosity_factor
=
conf
->
inverse_curiosity_factor
;
acx
->
tx_fail_low_th
=
conf
->
tx_fail_low_th
;
acx
->
tx_fail_high_th
=
conf
->
tx_fail_high_th
;
acx
->
per_alpha_shift
=
conf
->
per_alpha_shift
;
acx
->
per_add_shift
=
conf
->
per_add_shift
;
acx
->
per_beta1_shift
=
conf
->
per_beta1_shift
;
acx
->
per_beta2_shift
=
conf
->
per_beta2_shift
;
acx
->
rate_check_up
=
conf
->
rate_check_up
;
acx
->
rate_check_down
=
conf
->
rate_check_down
;
memcpy
(
acx
->
rate_retry_policy
,
conf
->
rate_retry_policy
,
sizeof
(
acx
->
rate_retry_policy
));
ret
=
wl1271_cmd_configure
(
wl
,
ACX_SET_RATE_MGMT_PARAMS
,
acx
,
sizeof
(
*
acx
));
if
(
ret
<
0
)
{
wl1271_warning
(
"acx set rate mgmt params failed: %d"
,
ret
);
goto
out
;
}
out:
kfree
(
acx
);
return
ret
;
}
drivers/net/wireless/wl12xx/acx.h
浏览文件 @
e0a8c583
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/boot.c
浏览文件 @
e0a8c583
...
...
@@ -107,16 +107,6 @@ static unsigned int wl12xx_get_fw_ver_quirks(struct wl1271 *wl)
unsigned
int
quirks
=
0
;
unsigned
int
*
fw_ver
=
wl
->
chip
.
fw_ver
;
/* Only for wl127x */
if
((
fw_ver
[
FW_VER_CHIP
]
==
FW_VER_CHIP_WL127X
)
&&
/* Check STA version */
(((
fw_ver
[
FW_VER_IF_TYPE
]
==
FW_VER_IF_TYPE_STA
)
&&
(
fw_ver
[
FW_VER_MINOR
]
<
FW_VER_MINOR_1_SPARE_STA_MIN
))
||
/* Check AP version */
((
fw_ver
[
FW_VER_IF_TYPE
]
==
FW_VER_IF_TYPE_AP
)
&&
(
fw_ver
[
FW_VER_MINOR
]
<
FW_VER_MINOR_1_SPARE_AP_MIN
))))
quirks
|=
WL12XX_QUIRK_USE_2_SPARE_BLOCKS
;
/* Only new station firmwares support routing fw logs to the host */
if
((
fw_ver
[
FW_VER_IF_TYPE
]
==
FW_VER_IF_TYPE_STA
)
&&
(
fw_ver
[
FW_VER_MINOR
]
<
FW_VER_MINOR_FWLOG_STA_MIN
))
...
...
@@ -504,21 +494,18 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl)
wl
->
event_mask
=
BSS_LOSE_EVENT_ID
|
SCAN_COMPLETE_EVENT_ID
|
PS_REPORT_EVENT_ID
|
JOIN_EVENT_COMPLETE_ID
|
DISCONNECT_EVENT_COMPLETE_ID
|
RSSI_SNR_TRIGGER_0_EVENT_ID
|
PSPOLL_DELIVERY_FAILURE_EVENT_ID
|
SOFT_GEMINI_SENSE_EVENT_ID
|
PERIODIC_SCAN_REPORT_EVENT_ID
|
PERIODIC_SCAN_COMPLETE_EVENT_ID
;
if
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
)
wl
->
event_mask
|=
STA_REMOVE_COMPLETE_EVENT_ID
|
PERIODIC_SCAN_COMPLETE_EVENT_ID
|
DUMMY_PACKET_EVENT_ID
|
PEER_REMOVE_COMPLETE_EVENT_ID
|
BA_SESSION_RX_CONSTRAINT_EVENT_ID
|
REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID
|
INACTIVE_STA_EVENT_ID
|
MAX_TX_RETRY_EVENT_ID
;
else
wl
->
event_mask
|=
DUMMY_PACKET_EVENT_ID
|
BA_SESSION_RX_CONSTRAINT_EVENT_ID
;
ret
=
wl1271_event_unmask
(
wl
);
if
(
ret
<
0
)
{
...
...
@@ -549,13 +536,13 @@ static void wl1271_boot_hw_version(struct wl1271 *wl)
{
u32
fuse
;
fuse
=
wl1271_top_reg_read
(
wl
,
REG_FUSE_DATA_2_1
);
if
(
wl
->
chip
.
id
==
CHIP_ID_1283_PG20
)
fuse
=
wl1271_top_reg_read
(
wl
,
WL128X_REG_FUSE_DATA_2_1
);
else
fuse
=
wl1271_top_reg_read
(
wl
,
WL127X_REG_FUSE_DATA_2_1
);
fuse
=
(
fuse
&
PG_VER_MASK
)
>>
PG_VER_OFFSET
;
wl
->
hw_pg_ver
=
(
s8
)
fuse
;
if
(((
wl
->
hw_pg_ver
&
PG_MAJOR_VER_MASK
)
>>
PG_MAJOR_VER_OFFSET
)
<
3
)
wl
->
quirks
|=
WL12XX_QUIRK_END_OF_TRANSACTION
;
}
static
int
wl128x_switch_tcxo_to_fref
(
struct
wl1271
*
wl
)
...
...
@@ -696,7 +683,8 @@ static int wl127x_boot_clk(struct wl1271 *wl)
u32
pause
;
u32
clk
;
wl1271_boot_hw_version
(
wl
);
if
(((
wl
->
hw_pg_ver
&
PG_MAJOR_VER_MASK
)
>>
PG_MAJOR_VER_OFFSET
)
<
3
)
wl
->
quirks
|=
WL12XX_QUIRK_END_OF_TRANSACTION
;
if
(
wl
->
ref_clock
==
CONF_REF_CLK_19_2_E
||
wl
->
ref_clock
==
CONF_REF_CLK_38_4_E
||
...
...
@@ -750,6 +738,8 @@ int wl1271_load_firmware(struct wl1271 *wl)
u32
tmp
,
clk
;
int
selected_clock
=
-
1
;
wl1271_boot_hw_version
(
wl
);
if
(
wl
->
chip
.
id
==
CHIP_ID_1283_PG20
)
{
ret
=
wl128x_boot_clk
(
wl
,
&
selected_clock
);
if
(
ret
<
0
)
...
...
@@ -852,9 +842,6 @@ int wl1271_boot(struct wl1271 *wl)
/* Enable firmware interrupts now */
wl1271_boot_enable_interrupts
(
wl
);
/* set the wl1271 default filters */
wl1271_set_default_filters
(
wl
);
wl1271_event_mbox_config
(
wl
);
out:
...
...
drivers/net/wireless/wl12xx/boot.h
浏览文件 @
e0a8c583
...
...
@@ -55,7 +55,8 @@ struct wl1271_static_data {
#define OCP_REG_CLK_POLARITY 0x0cb2
#define OCP_REG_CLK_PULL 0x0cb4
#define REG_FUSE_DATA_2_1 0x050a
#define WL127X_REG_FUSE_DATA_2_1 0x050a
#define WL128X_REG_FUSE_DATA_2_1 0x2152
#define PG_VER_MASK 0x3c
#define PG_VER_OFFSET 2
...
...
drivers/net/wireless/wl12xx/cmd.c
浏览文件 @
e0a8c583
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/cmd.h
浏览文件 @
e0a8c583
...
...
@@ -36,7 +36,15 @@ int wl128x_cmd_general_parms(struct wl1271 *wl);
int
wl1271_cmd_radio_parms
(
struct
wl1271
*
wl
);
int
wl128x_cmd_radio_parms
(
struct
wl1271
*
wl
);
int
wl1271_cmd_ext_radio_parms
(
struct
wl1271
*
wl
);
int
wl1271_cmd_join
(
struct
wl1271
*
wl
,
u8
bss_type
);
int
wl12xx_cmd_role_enable
(
struct
wl1271
*
wl
,
u8
role_type
,
u8
*
role_id
);
int
wl12xx_cmd_role_disable
(
struct
wl1271
*
wl
,
u8
*
role_id
);
int
wl12xx_cmd_role_start_dev
(
struct
wl1271
*
wl
);
int
wl12xx_cmd_role_stop_dev
(
struct
wl1271
*
wl
);
int
wl12xx_cmd_role_start_sta
(
struct
wl1271
*
wl
);
int
wl12xx_cmd_role_stop_sta
(
struct
wl1271
*
wl
);
int
wl12xx_cmd_role_start_ap
(
struct
wl1271
*
wl
);
int
wl12xx_cmd_role_stop_ap
(
struct
wl1271
*
wl
);
int
wl12xx_cmd_role_start_ibss
(
struct
wl1271
*
wl
);
int
wl1271_cmd_test
(
struct
wl1271
*
wl
,
void
*
buf
,
size_t
buf_len
,
u8
answer
);
int
wl1271_cmd_interrogate
(
struct
wl1271
*
wl
,
u16
id
,
void
*
buf
,
size_t
len
);
int
wl1271_cmd_configure
(
struct
wl1271
*
wl
,
u16
id
,
void
*
buf
,
size_t
len
);
...
...
@@ -56,20 +64,18 @@ struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl,
int
wl1271_cmd_build_arp_rsp
(
struct
wl1271
*
wl
,
__be32
ip_addr
);
int
wl1271_build_qos_null_data
(
struct
wl1271
*
wl
);
int
wl1271_cmd_build_klv_null_data
(
struct
wl1271
*
wl
);
int
wl1271_cmd_set_sta_default_wep_key
(
struct
wl1271
*
wl
,
u8
id
);
int
wl1271_cmd_set_ap_default_wep_key
(
struct
wl1271
*
wl
,
u8
id
);
int
wl12xx_cmd_set_default_wep_key
(
struct
wl1271
*
wl
,
u8
id
,
u8
hlid
);
int
wl1271_cmd_set_sta_key
(
struct
wl1271
*
wl
,
u16
action
,
u8
id
,
u8
key_type
,
u8
key_size
,
const
u8
*
key
,
const
u8
*
addr
,
u32
tx_seq_32
,
u16
tx_seq_16
);
int
wl1271_cmd_set_ap_key
(
struct
wl1271
*
wl
,
u16
action
,
u8
id
,
u8
key_type
,
u8
key_size
,
const
u8
*
key
,
u8
hlid
,
u32
tx_seq_32
,
u16
tx_seq_16
);
int
wl1271_cmd_disconnect
(
struct
wl1271
*
wl
);
int
wl1271_cmd_set_sta_state
(
struct
wl1271
*
wl
);
int
wl1271_cmd_start_bss
(
struct
wl1271
*
wl
);
int
wl1271_cmd_stop_bss
(
struct
wl1271
*
wl
);
int
wl1271_cmd_add_sta
(
struct
wl1271
*
wl
,
struct
ieee80211_sta
*
sta
,
u8
hlid
);
int
wl1271_cmd_remove_sta
(
struct
wl1271
*
wl
,
u8
hlid
);
int
wl12xx_cmd_set_peer_state
(
struct
wl1271
*
wl
,
u8
hlid
);
int
wl12xx_roc
(
struct
wl1271
*
wl
,
u8
role_id
);
int
wl12xx_croc
(
struct
wl1271
*
wl
,
u8
role_id
);
int
wl12xx_cmd_add_peer
(
struct
wl1271
*
wl
,
struct
ieee80211_sta
*
sta
,
u8
hlid
);
int
wl12xx_cmd_remove_peer
(
struct
wl1271
*
wl
,
u8
hlid
);
int
wl12xx_cmd_config_fwlog
(
struct
wl1271
*
wl
);
int
wl12xx_cmd_start_fwlog
(
struct
wl1271
*
wl
);
int
wl12xx_cmd_stop_fwlog
(
struct
wl1271
*
wl
);
...
...
@@ -83,25 +89,21 @@ enum wl1271_commands {
CMD_DISABLE_TX
=
6
,
CMD_SCAN
=
8
,
CMD_STOP_SCAN
=
9
,
CMD_START_JOIN
=
11
,
CMD_SET_KEYS
=
12
,
CMD_READ_MEMORY
=
13
,
CMD_WRITE_MEMORY
=
14
,
CMD_SET_TEMPLATE
=
19
,
CMD_TEST
=
23
,
CMD_NOISE_HIST
=
28
,
CMD_
LNA_CONTROL
=
32
,
CMD_
QUIET_ELEMENT_SET_STATE
=
29
,
CMD_SET_BCN_MODE
=
33
,
CMD_MEASUREMENT
=
34
,
CMD_STOP_MEASUREMENT
=
35
,
CMD_DISCONNECT
=
36
,
CMD_SET_PS_MODE
=
37
,
CMD_CHANNEL_SWITCH
=
38
,
CMD_STOP_CHANNEL_SWICTH
=
39
,
CMD_AP_DISCOVERY
=
40
,
CMD_STOP_AP_DISCOVERY
=
41
,
CMD_SPS_SCAN
=
42
,
CMD_STOP_SPS_SCAN
=
43
,
CMD_HEALTH_CHECK
=
45
,
CMD_DEBUG
=
46
,
CMD_TRIGGER_SCAN_TO
=
47
,
...
...
@@ -109,16 +111,30 @@ enum wl1271_commands {
CMD_CONNECTION_SCAN_SSID_CFG
=
49
,
CMD_START_PERIODIC_SCAN
=
50
,
CMD_STOP_PERIODIC_SCAN
=
51
,
CMD_SET_STA_STATE
=
52
,
CMD_CONFIG_FWLOGGER
=
53
,
CMD_START_FWLOGGER
=
54
,
CMD_STOP_FWLOGGER
=
55
,
CMD_SET_PEER_STATE
=
52
,
CMD_REMAIN_ON_CHANNEL
=
53
,
CMD_CANCEL_REMAIN_ON_CHANNEL
=
54
,
/* AP mode commands */
CMD_BSS_START
=
60
,
CMD_BSS_STOP
=
61
,
CMD_ADD_STA
=
62
,
CMD_REMOVE_STA
=
63
,
CMD_CONFIG_FWLOGGER
=
55
,
CMD_START_FWLOGGER
=
56
,
CMD_STOP_FWLOGGER
=
57
,
/* AP commands */
CMD_ADD_PEER
=
62
,
CMD_REMOVE_PEER
=
63
,
/* Role API */
CMD_ROLE_ENABLE
=
70
,
CMD_ROLE_DISABLE
=
71
,
CMD_ROLE_START
=
72
,
CMD_ROLE_STOP
=
73
,
/* WIFI Direct */
CMD_WFD_START_DISCOVERY
=
80
,
CMD_WFD_STOP_DISCOVERY
=
81
,
CMD_WFD_ATTRIBUTE_CONFIG
=
82
,
CMD_NOP
=
100
,
NUM_COMMANDS
,
MAX_COMMAND_ID
=
0xFFFF
,
...
...
@@ -147,21 +163,20 @@ enum cmd_templ {
CMD_TEMPL_CTS
,
/*
* For CTS-to-self (FastCTS) mechanism
* for BT/WLAN coexistence (SoftGemini). */
CMD_TEMPL_ARP_RSP
,
CMD_TEMPL_LINK_MEASUREMENT_REPORT
,
/* AP-mode specific */
CMD_TEMPL_AP_BEACON
=
13
,
CMD_TEMPL_AP_BEACON
,
CMD_TEMPL_AP_PROBE_RESPONSE
,
CMD_TEMPL_A
P_A
RP_RSP
,
CMD_TEMPL_ARP_RSP
,
CMD_TEMPL_DEAUTH_AP
,
CMD_TEMPL_TEMPORARY
,
CMD_TEMPL_LINK_MEASUREMENT_REPORT
,
CMD_TEMPL_MAX
=
0xff
};
/* unit ms */
#define WL1271_COMMAND_TIMEOUT 2000
#define WL1271_CMD_TEMPL_MAX_SIZE 252
#define WL1271_CMD_TEMPL_DFLT_SIZE 252
#define WL1271_CMD_TEMPL_MAX_SIZE 548
#define WL1271_EVENT_TIMEOUT 750
struct
wl1271_cmd_header
{
...
...
@@ -193,6 +208,8 @@ enum {
CMD_STATUS_WRONG_NESTING
=
19
,
CMD_STATUS_TIMEOUT
=
21
,
/* Driver internal use.*/
CMD_STATUS_FW_RESET
=
22
,
/* Driver internal use.*/
CMD_STATUS_TEMPLATE_OOM
=
23
,
CMD_STATUS_NO_RX_BA_SESSION
=
24
,
MAX_COMMAND_STATUS
=
0xff
};
...
...
@@ -210,14 +227,50 @@ enum {
#define WL1271_JOIN_CMD_TX_SESSION_OFFSET 1
#define WL1271_JOIN_CMD_BSS_TYPE_5GHZ 0x10
struct
wl12
71_cmd_join
{
struct
wl12
xx_cmd_role_enable
{
struct
wl1271_cmd_header
header
;
__le32
bssid_lsb
;
__le16
bssid_msb
;
__le16
beacon_interval
;
/* in TBTTs */
__le32
rx_config_options
;
__le32
rx_filter_options
;
u8
role_id
;
u8
role_type
;
u8
mac_address
[
ETH_ALEN
];
}
__packed
;
struct
wl12xx_cmd_role_disable
{
struct
wl1271_cmd_header
header
;
u8
role_id
;
u8
padding
[
3
];
}
__packed
;
enum
wl12xx_band
{
WL12XX_BAND_2_4GHZ
=
0
,
WL12XX_BAND_5GHZ
=
1
,
WL12XX_BAND_JAPAN_4_9_GHZ
=
2
,
WL12XX_BAND_DEFAULT
=
WL12XX_BAND_2_4GHZ
,
WL12XX_BAND_INVALID
=
0x7E
,
WL12XX_BAND_MAX_RADIO
=
0x7F
,
};
struct
wl12xx_cmd_role_start
{
struct
wl1271_cmd_header
header
;
u8
role_id
;
u8
band
;
u8
channel
;
u8
padding
;
union
{
struct
{
u8
hlid
;
u8
session
;
u8
padding_1
[
54
];
}
__packed
device
;
/* sta & p2p_cli use the same struct */
struct
{
u8
bssid
[
ETH_ALEN
];
u8
hlid
;
/* data hlid */
u8
session
;
__le32
remote_rates
;
/* remote supported rates */
/*
* The target uses this field to determine the rate at
...
...
@@ -225,23 +278,63 @@ struct wl1271_cmd_join {
* ACK or CTS frames).
*/
__le32
basic_rate_set
;
__le32
supported_rate_set
;
__le32
local_rates
;
/* local supported rates */
u8
ssid_type
;
u8
ssid_len
;
u8
ssid
[
IEEE80211_MAX_SSID_LEN
];
__le16
beacon_interval
;
/* in TBTTs */
}
__packed
sta
;
struct
{
u8
bssid
[
ETH_ALEN
];
u8
hlid
;
/* data hlid */
u8
dtim_interval
;
/*
* bits 0-2: This bitwise field specifies the type
* of BSS to start or join (BSS_TYPE_*).
* bit 4: Band - The radio band in which to join
* or start.
* 0 - 2.4GHz band
* 1 - 5GHz band
* bits 3, 5-7: Reserved
*/
u8
bss_type
;
u8
channel
;
__le32
remote_rates
;
/* remote supported rates */
__le32
basic_rate_set
;
__le32
local_rates
;
/* local supported rates */
u8
ssid_type
;
u8
ssid_len
;
u8
ssid
[
IEEE80211_MAX_SSID_LEN
];
u8
ctrl
;
/* JOIN_CMD_CTRL_* */
u8
reserved
[
3
];
__le16
beacon_interval
;
/* in TBTTs */
u8
padding_1
[
4
];
}
__packed
ibss
;
/* ap & p2p_go use the same struct */
struct
{
__le16
aging_period
;
/* in secs */
u8
beacon_expiry
;
/* in ms */
u8
bss_index
;
/* The host link id for the AP's global queue */
u8
global_hlid
;
/* The host link id for the AP's broadcast queue */
u8
broadcast_hlid
;
__le16
beacon_interval
;
/* in TBTTs */
__le32
basic_rate_set
;
__le32
local_rates
;
/* local supported rates */
u8
dtim_interval
;
u8
ssid_type
;
u8
ssid_len
;
u8
ssid
[
IEEE80211_MAX_SSID_LEN
];
u8
padding_1
[
5
];
}
__packed
ap
;
};
}
__packed
;
struct
wl12xx_cmd_role_stop
{
struct
wl1271_cmd_header
header
;
u8
role_id
;
u8
disc_type
;
/* only STA and P2P_CLI */
__le16
reason
;
/* only STA and P2P_CLI */
}
__packed
;
struct
cmd_enabledisable_path
{
...
...
@@ -287,8 +380,9 @@ enum wl1271_cmd_ps_mode {
struct
wl1271_cmd_ps_params
{
struct
wl1271_cmd_header
header
;
u8
role_id
;
u8
ps_mode
;
/* STATION_* */
u8
padding
[
3
];
u8
padding
[
2
];
}
__packed
;
/* HW encryption keys */
...
...
@@ -301,6 +395,12 @@ enum wl1271_cmd_key_action {
MAX_KEY_ACTION
=
0xffff
,
};
enum
wl1271_cmd_lid_key_type
{
UNICAST_LID_TYPE
=
0
,
BROADCAST_LID_TYPE
=
1
,
WEP_DEFAULT_LID_TYPE
=
2
};
enum
wl1271_cmd_key_type
{
KEY_NONE
=
0
,
KEY_WEP
=
1
,
...
...
@@ -309,44 +409,7 @@ enum wl1271_cmd_key_type {
KEY_GEM
=
4
,
};
/* FIXME: Add description for key-types */
struct
wl1271_cmd_set_sta_keys
{
struct
wl1271_cmd_header
header
;
/* Ignored for default WEP key */
u8
addr
[
ETH_ALEN
];
/* key_action_e */
__le16
key_action
;
__le16
reserved_1
;
/* key size in bytes */
u8
key_size
;
/* key_type_e */
u8
key_type
;
u8
ssid_profile
;
/*
* TKIP, AES: frame's key id field.
* For WEP default key: key id;
*/
u8
id
;
u8
reserved_2
[
6
];
u8
key
[
MAX_KEY_SIZE
];
__le16
ac_seq_num16
[
NUM_ACCESS_CATEGORIES_COPY
];
__le32
ac_seq_num32
[
NUM_ACCESS_CATEGORIES_COPY
];
}
__packed
;
enum
wl1271_cmd_lid_key_type
{
UNICAST_LID_TYPE
=
0
,
BROADCAST_LID_TYPE
=
1
,
WEP_DEFAULT_LID_TYPE
=
2
};
struct
wl1271_cmd_set_ap_keys
{
struct
wl1271_cmd_set_keys
{
struct
wl1271_cmd_header
header
;
/*
...
...
@@ -496,69 +559,39 @@ enum wl1271_disconnect_type {
DISCONNECT_DISASSOC
};
struct
wl1271_cmd_disconnect
{
struct
wl1271_cmd_header
header
;
__le32
rx_config_options
;
__le32
rx_filter_options
;
__le16
reason
;
u8
type
;
u8
padding
;
}
__packed
;
#define WL1271_CMD_STA_STATE_CONNECTED 1
struct
wl12
71_cmd_set_sta
_state
{
struct
wl12
xx_cmd_set_peer
_state
{
struct
wl1271_cmd_header
header
;
u8
hlid
;
u8
state
;
u8
padding
[
3
];
u8
padding
[
2
];
}
__packed
;
enum
wl1271_ssid_type
{
SSID_TYPE_PUBLIC
=
0
,
SSID_TYPE_HIDDEN
=
1
struct
wl12xx_cmd_roc
{
struct
wl1271_cmd_header
header
;
u8
role_id
;
u8
channel
;
u8
band
;
u8
padding
;
};
struct
wl12
71_cmd_bss_start
{
struct
wl12
xx_cmd_croc
{
struct
wl1271_cmd_header
header
;
/* wl1271_ssid_type */
u8
ssid_type
;
u8
ssid_len
;
u8
ssid
[
IEEE80211_MAX_SSID_LEN
];
u8
padding_1
[
2
];
/* Basic rate set */
__le32
basic_rate_set
;
/* Aging period in seconds*/
__le16
aging_period
;
u8
role_id
;
u8
padding
[
3
];
};
/*
* This field specifies the time between target beacon
* transmission times (TBTTs), in time units (TUs).
* Valid values are 1 to 1024.
*/
__le16
beacon_interval
;
u8
bssid
[
ETH_ALEN
];
u8
bss_index
;
/* Radio band */
u8
band
;
u8
channel
;
/* The host link id for the AP's global queue */
u8
global_hlid
;
/* The host link id for the AP's broadcast queue */
u8
broadcast_hlid
;
/* DTIM count */
u8
dtim_interval
;
/* Beacon expiry time in ms */
u8
beacon_expiry
;
u8
padding_2
[
3
];
}
__packed
;
enum
wl12xx_ssid_type
{
WL12XX_SSID_TYPE_PUBLIC
=
0
,
WL12XX_SSID_TYPE_HIDDEN
=
1
,
WL12XX_SSID_TYPE_ANY
=
2
,
};
struct
wl12
71_cmd_add_sta
{
struct
wl12
xx_cmd_add_peer
{
struct
wl1271_cmd_header
header
;
u8
addr
[
ETH_ALEN
];
...
...
@@ -572,7 +605,7 @@ struct wl1271_cmd_add_sta {
u8
padding1
;
}
__packed
;
struct
wl12
71_cmd_remove_sta
{
struct
wl12
xx_cmd_remove_peer
{
struct
wl1271_cmd_header
header
;
u8
hlid
;
...
...
drivers/net/wireless/wl12xx/conf.h
浏览文件 @
e0a8c583
...
...
@@ -99,40 +99,75 @@ enum {
enum
{
/*
* PER threshold in PPM of the BT voice
* Configure the min and max time BT gains the antenna
* in WLAN / BT master basic rate
*
* Range: 0 -
10000000
* Range: 0 -
255 (ms)
*/
CONF_SG_BT_PER_THRESHOLD
=
0
,
CONF_SG_ACL_BT_MASTER_MIN_BR
=
0
,
CONF_SG_ACL_BT_MASTER_MAX_BR
,
/*
*
Number of consequent RX_ACTIVE activities to override BT voice
*
frames to ensure WLAN connection
*
Configure the min and max time BT gains the antenna
*
in WLAN / BT slave basic rate
*
* Range: 0 -
100
* Range: 0 -
255 (ms)
*/
CONF_SG_HV3_MAX_OVERRIDE
,
CONF_SG_ACL_BT_SLAVE_MIN_BR
,
CONF_SG_ACL_BT_SLAVE_MAX_BR
,
/*
* Defines the PER threshold of the BT voice
* Configure the min and max time BT gains the antenna
* in WLAN / BT master EDR
*
* Range: 0 -
65000
* Range: 0 -
255 (ms)
*/
CONF_SG_BT_NFS_SAMPLE_INTERVAL
,
CONF_SG_ACL_BT_MASTER_MIN_EDR
,
CONF_SG_ACL_BT_MASTER_MAX_EDR
,
/*
* Defines the load ratio of BT
* Configure the min and max time BT gains the antenna
* in WLAN / BT slave EDR
*
* Range: 0 -
100 (%
)
* Range: 0 -
255 (ms
)
*/
CONF_SG_BT_LOAD_RATIO
,
CONF_SG_ACL_BT_SLAVE_MIN_EDR
,
CONF_SG_ACL_BT_SLAVE_MAX_EDR
,
/*
* Defines whether the SG will force WLAN host to enter/exit PSM
* The maximum time WLAN can gain the antenna
* in WLAN PSM / BT master/slave BR
*
* Range:
1 - SG can force, 0 - host handles PSM
* Range:
0 - 255 (ms)
*/
CONF_SG_AUTO_PS_MODE
,
CONF_SG_ACL_WLAN_PS_MASTER_BR
,
CONF_SG_ACL_WLAN_PS_SLAVE_BR
,
/*
* The maximum time WLAN can gain the antenna
* in WLAN PSM / BT master/slave EDR
*
* Range: 0 - 255 (ms)
*/
CONF_SG_ACL_WLAN_PS_MASTER_EDR
,
CONF_SG_ACL_WLAN_PS_SLAVE_EDR
,
/* TODO: explain these values */
CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR
,
CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR
,
CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR
,
CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR
,
CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR
,
CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR
,
CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR
,
CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR
,
CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR
,
CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR
,
CONF_SG_ACL_PASSIVE_SCAN_BT_BR
,
CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR
,
CONF_SG_ACL_PASSIVE_SCAN_BT_EDR
,
CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR
,
/*
* Compensation percentage of probe requests when scan initiated
...
...
@@ -151,102 +186,70 @@ enum {
CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3
,
/*
* Defines antenna configuration (single/dual antenna)
*
* Range: 0 - single antenna, 1 - dual antenna
*/
CONF_SG_ANTENNA_CONFIGURATION
,
/*
* The threshold (percent) of max consequtive beacon misses before
* increasing priority of beacon reception.
*
* Range: 0 - 100 (%)
*/
CONF_SG_BEACON_MISS_PERCENT
,
/*
* The rate threshold below which receiving a data frame from the AP
* will increase the priority of the data frame above BT traffic.
*
* Range: 0,2, 5(=5.5), 6, 9, 11, 12, 18, 24, 36, 48, 54
*/
CONF_SG_RATE_ADAPT_THRESH
,
/*
* Not used currently.
* Compensation percentage of WLAN active scan window if initiated
* during BT A2DP
*
* Range: 0
* Range: 0
- 1000 (%)
*/
CONF_SG_
RATE_ADAPT_SNR
,
CONF_SG_
ACTIVE_SCAN_DURATION_FACTOR_A2DP
,
/*
* Co
nfigure the min and max time BT gains the antenna
*
in WLAN PSM / BT master basic rate
* Co
mpensation percentage of WLAN passive scan window if initiated
*
during BT A2DP BR
*
* Range: 0 -
255 (ms
)
* Range: 0 -
1000 (%
)
*/
CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_BR
,
CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_BR
,
CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_BR
,
/*
*
The time after it expires no new WLAN trigger frame is trasmit
ted
*
in WLAN PSM / BT master basic rate
*
Compensation percentage of WLAN passive scan window if initia
ted
*
during BT A2DP EDR
*
* Range: 0 -
255 (ms
)
* Range: 0 -
1000 (%
)
*/
CONF_SG_
WLAN_PS_MAX_BT_ACL_MASTER_B
R
,
CONF_SG_
PASSIVE_SCAN_DURATION_FACTOR_A2DP_ED
R
,
/*
* Co
nfigure the min and max time BT gains the antenna
*
in WLAN PSM / BT slave basic rat
e
* Co
mpensation percentage of WLAN passive scan window if initiated
*
during BT voic
e
*
* Range: 0 -
255 (ms
)
* Range: 0 -
1000 (%
)
*/
CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_BR
,
CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_BR
,
CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3
,
/*
* The time after it expires no new WLAN trigger frame is trasmitted
* in WLAN PSM / BT slave basic rate
*
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_BR
,
/* TODO: explain these values */
CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN
,
CONF_SG_BCN_HV3_COLLISION_THRESH_IN_PASSIVE_SCAN
,
CONF_SG_TX_RX_PROTECTION_BWIDTH_IN_PASSIVE_SCAN
,
/*
* Configure the min and max time BT gains the antenna
* in WLAN PSM / BT master EDR
* Defines whether the SG will force WLAN host to enter/exit PSM
*
* Range:
0 - 255 (ms)
* Range:
1 - SG can force, 0 - host handles PSM
*/
CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_EDR
,
CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_EDR
,
CONF_SG_STA_FORCE_PS_IN_BT_SCO
,
/*
* The time after it expires no new WLAN trigger frame is trasmitted
* in WLAN PSM / BT master EDR
* Defines antenna configuration (single/dual antenna)
*
* Range: 0 -
255 (ms)
* Range: 0 -
single antenna, 1 - dual antenna
*/
CONF_SG_
WLAN_PS_MAX_BT_ACL_MASTER_EDR
,
CONF_SG_
ANTENNA_CONFIGURATION
,
/*
*
Configure the min and max time BT gains the antenna
* in
WLAN PSM / BT slave EDR
*
The threshold (percent) of max consecutive beacon misses before
* in
creasing priority of beacon reception.
*
* Range: 0 -
255 (ms
)
* Range: 0 -
100 (%
)
*/
CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_EDR
,
CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_EDR
,
CONF_SG_BEACON_MISS_PERCENT
,
/*
* The time after it expires no new WLAN trigger frame is trasmitted
* in WLAN PSM / BT slave EDR
* Protection time of the DHCP procedure.
*
* Range: 0 -
255
(ms)
* Range: 0 -
100000
(ms)
*/
CONF_SG_
WLAN_PS_MAX_BT_ACL_SLAVE_EDR
,
CONF_SG_
DHCP_TIME
,
/*
* RX guard time before the beginning of a new BT voice frame during
...
...
@@ -273,166 +276,59 @@ enum {
*/
CONF_SG_ADAPTIVE_RXT_TXT
,
/*
* The used WLAN legacy service period during active BT ACL link
*
* Range: 0 - 255 (ms)
*/
CONF_SG_PS_POLL_TIMEOUT
,
/*
* The used WLAN UPSD service period during active BT ACL link
*
* Range: 0 - 255 (ms)
*/
CONF_SG_UPSD_TIMEOUT
,
/*
* Configure the min and max time BT gains the antenna
* in WLAN Active / BT master EDR
*
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MIN_EDR
,
CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MAX_EDR
,
/*
* The maximum time WLAN can gain the antenna for
* in WLAN Active / BT master EDR
*
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_MASTER_EDR
,
/*
* Configure the min and max time BT gains the antenna
* in WLAN Active / BT slave EDR
*
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MIN_EDR
,
CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MAX_EDR
,
/* TODO: explain this value */
CONF_SG_GENERAL_USAGE_BIT_MAP
,
/*
* The maximum time WLAN can gain the antenna for
* in WLAN Active / BT slave EDR
* Number of consecutive BT voice frames not interrupted by WLAN
*
* Range: 0 -
255 (ms)
* Range: 0 -
100
*/
CONF_SG_
WLAN_ACTIVE_MAX_BT_ACL_SLAVE_EDR
,
CONF_SG_
HV3_MAX_SERVED
,
/*
* Configure the min and max time BT gains the antenna
* in WLAN Active / BT basic rate
* The used WLAN legacy service period during active BT ACL link
*
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_ACTIVE_BT_ACL_MIN_BR
,
CONF_SG_WLAN_ACTIVE_BT_ACL_MAX_BR
,
CONF_SG_PS_POLL_TIMEOUT
,
/*
* The maximum time WLAN can gain the antenna for
* in WLAN Active / BT basic rate
* The used WLAN UPSD service period during active BT ACL link
*
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_BR
,
/*
* Compensation percentage of WLAN passive scan window if initiated
* during BT voice
*
* Range: 0 - 1000 (%)
*/
CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3
,
/*
* Compensation percentage of WLAN passive scan window if initiated
* during BT A2DP
*
* Range: 0 - 1000 (%)
*/
CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP
,
/*
* Fixed time ensured for BT traffic to gain the antenna during WLAN
* passive scan.
*
* Range: 0 - 1000 ms
*/
CONF_SG_PASSIVE_SCAN_A2DP_BT_TIME
,
/*
* Fixed time ensured for WLAN traffic to gain the antenna during WLAN
* passive scan.
*
* Range: 0 - 1000 ms
*/
CONF_SG_PASSIVE_SCAN_A2DP_WLAN_TIME
,
CONF_SG_UPSD_TIMEOUT
,
/*
* Number of consequent BT voice frames not interrupted by WLAN
*
* Range: 0 - 100
*/
CONF_SG_HV3_MAX_SERVED
,
CONF_SG_CONSECUTIVE_CTS_THRESHOLD
,
CONF_SG_STA_RX_WINDOW_AFTER_DTIM
,
CONF_SG_STA_CONNECTION_PROTECTION_TIME
,
/*
* Protection time of the DHCP procedure.
*
* Range: 0 - 100000 (ms)
*/
CONF_SG_DHCP_TIME
,
/* AP params */
CONF_AP_BEACON_MISS_TX
,
CONF_AP_RX_WINDOW_AFTER_BEACON
,
CONF_AP_BEACON_WINDOW_INTERVAL
,
CONF_AP_CONNECTION_PROTECTION_TIME
,
CONF_AP_BT_ACL_VAL_BT_SERVE_TIME
,
CONF_AP_BT_ACL_VAL_WL_SERVE_TIME
,
/*
* Compensation percentage of WLAN active scan window if initiated
* during BT A2DP
*
* Range: 0 - 1000 (%)
*/
CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP
,
CONF_SG_TEMP_PARAM_1
,
CONF_SG_TEMP_PARAM_2
,
CONF_SG_TEMP_PARAM_3
,
CONF_SG_TEMP_PARAM_4
,
CONF_SG_TEMP_PARAM_5
,
/*
* AP beacon miss
*
* Range: 0 - 255
*/
CONF_SG_AP_BEACON_MISS_TX
,
/*
* AP RX window length
*
* Range: 0 - 50
*/
CONF_SG_RX_WINDOW_LENGTH
,
/*
* AP connection protection time
*
* Range: 0 - 5000
*/
CONF_SG_AP_CONNECTION_PROTECTION_TIME
,
CONF_SG_TEMP_PARAM_6
,
CONF_SG_TEMP_PARAM_7
,
CONF_SG_TEMP_PARAM_8
,
CONF_SG_TEMP_PARAM_9
,
CONF_SG_TEMP_PARAM_10
,
CONF_SG_STA_PARAMS_MAX
=
CONF_SG_TEMP_PARAM_5
+
1
,
CONF_SG_AP_PARAMS_MAX
=
CONF_SG_TEMP_PARAM_10
+
1
,
CONF_SG_PARAMS_MAX
,
CONF_SG_PARAMS_ALL
=
0xff
};
struct
conf_sg_settings
{
u32
sta_params
[
CONF_SG_STA_PARAMS_MAX
];
u32
ap_params
[
CONF_SG_AP_PARAMS_MAX
];
u32
params
[
CONF_SG_PARAMS_MAX
];
u8
state
;
};
...
...
@@ -545,6 +441,11 @@ struct conf_rx_settings {
CONF_HW_BIT_RATE_36MBPS | CONF_HW_BIT_RATE_48MBPS | \
CONF_HW_BIT_RATE_54MBPS)
#define CONF_TX_MCS_RATES (CONF_HW_BIT_RATE_MCS_0 | \
CONF_HW_BIT_RATE_MCS_1 | CONF_HW_BIT_RATE_MCS_2 | \
CONF_HW_BIT_RATE_MCS_3 | CONF_HW_BIT_RATE_MCS_4 | \
CONF_HW_BIT_RATE_MCS_5 | CONF_HW_BIT_RATE_MCS_6 | \
CONF_HW_BIT_RATE_MCS_7)
/*
* Default rates for management traffic when operating in AP mode. This
...
...
@@ -661,6 +562,9 @@ struct conf_tx_ac_category {
#define CONF_TX_MAX_TID_COUNT 8
/* Allow TX BA on all TIDs but 6,7. These are currently reserved in the FW */
#define CONF_TX_BA_ENABLED_TID_BITMAP 0x3F
enum
{
CONF_CHANNEL_TYPE_DCF
=
0
,
/* DC/LEGACY*/
CONF_CHANNEL_TYPE_EDCF
=
1
,
/* EDCA*/
...
...
@@ -913,7 +817,7 @@ struct conf_conn_settings {
struct
conf_bcn_filt_rule
bcn_filt_ie
[
CONF_MAX_BCN_FILT_IE_COUNT
];
/*
* The number of conse
q
utive beacons to lose, before the firmware
* The number of conse
c
utive beacons to lose, before the firmware
* becomes out of synch.
*
* Range: u32
...
...
@@ -951,7 +855,7 @@ struct conf_conn_settings {
u8
rx_broadcast_in_ps
;
/*
* Conse
q
utive PS Poll failures before sending event to driver
* Conse
c
utive PS Poll failures before sending event to driver
*
* Range: u8
*/
...
...
@@ -1199,8 +1103,12 @@ struct conf_rf_settings {
};
struct
conf_ht_setting
{
u16
tx_ba_win_size
;
u8
rx_ba_win_size
;
u8
tx_ba_win_size
;
u16
inactivity_timeout
;
/* bitmap of enabled TIDs for TX BA sessions */
u8
tx_ba_tid_bitmap
;
};
struct
conf_memory_settings
{
...
...
@@ -1309,6 +1217,25 @@ struct conf_fwlog {
u8
threshold
;
};
#define ACX_RATE_MGMT_NUM_OF_RATES 13
struct
conf_rate_policy_settings
{
u16
rate_retry_score
;
u16
per_add
;
u16
per_th1
;
u16
per_th2
;
u16
max_per
;
u8
inverse_curiosity_factor
;
u8
tx_fail_low_th
;
u8
tx_fail_high_th
;
u8
per_alpha_shift
;
u8
per_add_shift
;
u8
per_beta1_shift
;
u8
per_beta2_shift
;
u8
rate_check_up
;
u8
rate_check_down
;
u8
rate_retry_policy
[
ACX_RATE_MGMT_NUM_OF_RATES
];
};
struct
conf_drv_settings
{
struct
conf_sg_settings
sg
;
struct
conf_rx_settings
rx
;
...
...
@@ -1326,6 +1253,7 @@ struct conf_drv_settings {
struct
conf_fm_coex
fm_coex
;
struct
conf_rx_streaming_settings
rx_streaming
;
struct
conf_fwlog
fwlog
;
struct
conf_rate_policy_settings
rate
;
u8
hci_io_ds
;
};
...
...
drivers/net/wireless/wl12xx/debugfs.c
浏览文件 @
e0a8c583
...
...
@@ -339,10 +339,11 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf,
#define DRIVER_STATE_PRINT_HEX(x) DRIVER_STATE_PRINT(x, "0x%x")
DRIVER_STATE_PRINT_INT
(
tx_blocks_available
);
DRIVER_STATE_PRINT_INT
(
tx_allocated_blocks
[
0
]);
DRIVER_STATE_PRINT_INT
(
tx_allocated_blocks
[
1
]);
DRIVER_STATE_PRINT_INT
(
tx_allocated_blocks
[
2
]);
DRIVER_STATE_PRINT_INT
(
tx_allocated_blocks
[
3
]);
DRIVER_STATE_PRINT_INT
(
tx_allocated_blocks
);
DRIVER_STATE_PRINT_INT
(
tx_allocated_pkts
[
0
]);
DRIVER_STATE_PRINT_INT
(
tx_allocated_pkts
[
1
]);
DRIVER_STATE_PRINT_INT
(
tx_allocated_pkts
[
2
]);
DRIVER_STATE_PRINT_INT
(
tx_allocated_pkts
[
3
]);
DRIVER_STATE_PRINT_INT
(
tx_frames_cnt
);
DRIVER_STATE_PRINT_LHEX
(
tx_frames_map
[
0
]);
DRIVER_STATE_PRINT_INT
(
tx_queue_count
[
0
]);
...
...
@@ -352,10 +353,7 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf,
DRIVER_STATE_PRINT_INT
(
tx_packets_count
);
DRIVER_STATE_PRINT_INT
(
tx_results_count
);
DRIVER_STATE_PRINT_LHEX
(
flags
);
DRIVER_STATE_PRINT_INT
(
tx_blocks_freed
[
0
]);
DRIVER_STATE_PRINT_INT
(
tx_blocks_freed
[
1
]);
DRIVER_STATE_PRINT_INT
(
tx_blocks_freed
[
2
]);
DRIVER_STATE_PRINT_INT
(
tx_blocks_freed
[
3
]);
DRIVER_STATE_PRINT_INT
(
tx_blocks_freed
);
DRIVER_STATE_PRINT_INT
(
tx_security_last_seq_lsb
);
DRIVER_STATE_PRINT_INT
(
rx_counter
);
DRIVER_STATE_PRINT_INT
(
session_counter
);
...
...
@@ -369,9 +367,6 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf,
DRIVER_STATE_PRINT_INT
(
beacon_int
);
DRIVER_STATE_PRINT_INT
(
psm_entry_retry
);
DRIVER_STATE_PRINT_INT
(
ps_poll_failures
);
DRIVER_STATE_PRINT_HEX
(
filters
);
DRIVER_STATE_PRINT_HEX
(
rx_config
);
DRIVER_STATE_PRINT_HEX
(
rx_filter
);
DRIVER_STATE_PRINT_INT
(
power_level
);
DRIVER_STATE_PRINT_INT
(
rssi_thold
);
DRIVER_STATE_PRINT_INT
(
last_rssi_event
);
...
...
drivers/net/wireless/wl12xx/event.c
浏览文件 @
e0a8c583
...
...
@@ -285,13 +285,13 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
if
((
vector
&
BA_SESSION_RX_CONSTRAINT_EVENT_ID
)
&&
!
is_ap
)
{
wl1271_debug
(
DEBUG_EVENT
,
"BA_SESSION_RX_CONSTRAINT_EVENT_ID. "
"ba_allowed = 0x%x"
,
mbox
->
ba_allowed
);
"ba_allowed = 0x%x"
,
mbox
->
rx_
ba_allowed
);
if
(
wl
->
vif
)
wl1271_stop_ba_event
(
wl
,
mbox
->
ba_allowed
);
wl1271_stop_ba_event
(
wl
,
mbox
->
rx_
ba_allowed
);
}
if
((
vector
&
DUMMY_PACKET_EVENT_ID
)
&&
!
is_ap
)
{
if
((
vector
&
DUMMY_PACKET_EVENT_ID
))
{
wl1271_debug
(
DEBUG_EVENT
,
"DUMMY_PACKET_ID_EVENT_ID"
);
if
(
wl
->
vif
)
wl1271_tx_dummy_packet
(
wl
);
...
...
drivers/net/wireless/wl12xx/event.h
浏览文件 @
e0a8c583
...
...
@@ -49,32 +49,27 @@ enum {
MEASUREMENT_START_EVENT_ID
=
BIT
(
8
),
MEASUREMENT_COMPLETE_EVENT_ID
=
BIT
(
9
),
SCAN_COMPLETE_EVENT_ID
=
BIT
(
10
),
SCHEDULED_SCAN_COMPLETE_EVENT_ID
=
BIT
(
11
),
WFD_DISCOVERY_COMPLETE_EVENT_ID
=
BIT
(
11
),
AP_DISCOVERY_COMPLETE_EVENT_ID
=
BIT
(
12
),
PS_REPORT_EVENT_ID
=
BIT
(
13
),
PSPOLL_DELIVERY_FAILURE_EVENT_ID
=
BIT
(
14
),
DISCONNECT_EVENT_COMPLETE_ID
=
BIT
(
15
),
JOIN_EVENT_COMPLETE_ID
=
BIT
(
16
),
/* BIT(16) is reserved */
CHANNEL_SWITCH_COMPLETE_EVENT_ID
=
BIT
(
17
),
BSS_LOSE_EVENT_ID
=
BIT
(
18
),
REGAINED_BSS_EVENT_ID
=
BIT
(
19
),
MAX_TX_RETRY_EVENT_ID
=
BIT
(
20
),
/* STA: dummy paket for dynamic mem blocks */
DUMMY_PACKET_EVENT_ID
=
BIT
(
21
),
/* AP: STA remove complete */
STA_REMOVE_COMPLETE_EVENT_ID
=
BIT
(
21
),
SOFT_GEMINI_SENSE_EVENT_ID
=
BIT
(
22
),
/* STA: SG prediction */
SOFT_GEMINI_PREDICTION_EVENT_ID
=
BIT
(
23
),
/* AP: Inactive STA */
INACTIVE_STA_EVENT_ID
=
BIT
(
23
),
CHANGE_AUTO_MODE_TIMEOUT_EVENT_ID
=
BIT
(
23
),
SOFT_GEMINI_AVALANCHE_EVENT_ID
=
BIT
(
24
),
PLT_RX_CALIBRATION_COMPLETE_EVENT_ID
=
BIT
(
25
),
DBG_EVENT_ID
=
BIT
(
26
),
HEALTH_CHECK_REPLY
_EVENT_ID
=
BIT
(
27
),
INACTIVE_STA_EVENT_ID
=
BIT
(
26
),
PEER_REMOVE_COMPLETE
_EVENT_ID
=
BIT
(
27
),
PERIODIC_SCAN_COMPLETE_EVENT_ID
=
BIT
(
28
),
PERIODIC_SCAN_REPORT_EVENT_ID
=
BIT
(
29
),
BA_SESSION_RX_CONSTRAINT_EVENT_ID
=
BIT
(
30
),
REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID
=
BIT
(
31
),
EVENT_MBOX_ALL_EVENT_ID
=
0x7fffffff
,
};
...
...
@@ -83,15 +78,6 @@ enum {
EVENT_ENTER_POWER_SAVE_SUCCESS
,
};
struct
event_debug_report
{
u8
debug_event_id
;
u8
num_params
;
__le16
pad
;
__le32
report_1
;
__le32
report_2
;
__le32
report_3
;
}
__packed
;
#define NUM_OF_RSSI_SNR_TRIGGERS 8
struct
event_mailbox
{
...
...
@@ -100,49 +86,45 @@ struct event_mailbox {
__le32
reserved_1
;
__le32
reserved_2
;
u8
dbg_event_id
;
u8
num_relevant_params
;
__le16
reserved_3
;
__le32
event_report_p1
;
__le32
event_report_p2
;
__le32
event_report_p3
;
u8
number_of_scan_results
;
u8
scan_tag
;
u8
reserved_4
[
2
]
;
__le32
compl_scheduled_scan_status
;
u8
completed_scan_status
;
u8
reserved_3
;
__le16
scheduled_scan_attended_channels
;
u8
soft_gemini_sense_info
;
u8
soft_gemini_protective_info
;
s8
rssi_snr_trigger_metric
[
NUM_OF_RSSI_SNR_TRIGGERS
];
u8
channel_switch_status
;
u8
scheduled_scan_status
;
u8
ps_status
;
/* tuned channel (roc) */
u8
roc_channel
;
/* AP FW only */
u8
hlid_removed
;
__le16
hlid_removed_bitmap
;
/*
a bitmap of hlids for stations that have been inactive too long
*/
/*
bitmap of aged stations (by HLID)
*/
__le16
sta_aging_status
;
/*
a bitmap of hlids for stations which didn't respond to TX
*/
/*
bitmap of stations (by HLID) which exceeded max tx retries
*/
__le16
sta_tx_retry_exceeded
;
/*
* Bitmap, Each bit set represents the Role ID for which this constraint
* is set. Range: 0 - FF, FF means ANY role
*/
u8
ba_role_id
;
/*
* Bitmap, Each bit set represents the Link ID for which this constraint
* is set. Not applicable if ba_role_id is set to ANY role (FF).
* Range: 0 - FFFF, FFFF means ANY link in that role
*/
u8
ba_link_id
;
u8
ba_allowed
;
/* discovery completed results */
u8
discovery_tag
;
u8
number_of_preq_results
;
u8
number_of_prsp_results
;
u8
reserved_5
;
/* rx ba constraint */
u8
role_id
;
/* 0xFF means any role. */
u8
rx_ba_allowed
;
u8
reserved_6
[
2
];
u8
ps_poll_delivery_failure_role_ids
;
u8
stopped_role_ids
;
u8
started_role_ids
;
u8
change_auto_mode_timeout
;
u8
reserved_
5
[
21
];
u8
reserved_
7
[
12
];
}
__packed
;
int
wl1271_event_unmask
(
struct
wl1271
*
wl
);
...
...
drivers/net/wireless/wl12xx/init.c
浏览文件 @
e0a8c583
...
...
@@ -39,13 +39,13 @@ int wl1271_sta_init_templates_config(struct wl1271 *wl)
/* send empty templates for fw memory reservation */
ret
=
wl1271_cmd_template_set
(
wl
,
CMD_TEMPL_CFG_PROBE_REQ_2_4
,
NULL
,
WL1271_CMD_TEMPL_
MAX
_SIZE
,
WL1271_CMD_TEMPL_
DFLT
_SIZE
,
0
,
WL1271_RATE_AUTOMATIC
);
if
(
ret
<
0
)
return
ret
;
ret
=
wl1271_cmd_template_set
(
wl
,
CMD_TEMPL_CFG_PROBE_REQ_5
,
NULL
,
WL1271_CMD_TEMPL_
MAX
_SIZE
,
0
,
NULL
,
WL1271_CMD_TEMPL_
DFLT
_SIZE
,
0
,
WL1271_RATE_AUTOMATIC
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -70,15 +70,13 @@ int wl1271_sta_init_templates_config(struct wl1271 *wl)
return
ret
;
ret
=
wl1271_cmd_template_set
(
wl
,
CMD_TEMPL_PROBE_RESPONSE
,
NULL
,
sizeof
(
struct
wl12xx_probe_resp_template
),
WL1271_CMD_TEMPL_DFLT_SIZE
,
0
,
WL1271_RATE_AUTOMATIC
);
if
(
ret
<
0
)
return
ret
;
ret
=
wl1271_cmd_template_set
(
wl
,
CMD_TEMPL_BEACON
,
NULL
,
sizeof
(
struct
wl12xx_beacon_template
),
WL1271_CMD_TEMPL_DFLT_SIZE
,
0
,
WL1271_RATE_AUTOMATIC
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -92,7 +90,7 @@ int wl1271_sta_init_templates_config(struct wl1271 *wl)
for
(
i
=
0
;
i
<
CMD_TEMPL_KLV_IDX_MAX
;
i
++
)
{
ret
=
wl1271_cmd_template_set
(
wl
,
CMD_TEMPL_KLV
,
NULL
,
WL1271_CMD_TEMPL_
MAX
_SIZE
,
i
,
WL1271_CMD_TEMPL_
DFLT
_SIZE
,
i
,
WL1271_RATE_AUTOMATIC
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -191,15 +189,13 @@ static int wl1271_ap_init_templates_config(struct wl1271 *wl)
* reserve memory for later.
*/
ret
=
wl1271_cmd_template_set
(
wl
,
CMD_TEMPL_AP_PROBE_RESPONSE
,
NULL
,
sizeof
(
struct
wl12xx_probe_resp_template
),
WL1271_CMD_TEMPL_MAX_SIZE
,
0
,
WL1271_RATE_AUTOMATIC
);
if
(
ret
<
0
)
return
ret
;
ret
=
wl1271_cmd_template_set
(
wl
,
CMD_TEMPL_AP_BEACON
,
NULL
,
sizeof
(
struct
wl12xx_beacon_template
),
WL1271_CMD_TEMPL_MAX_SIZE
,
0
,
WL1271_RATE_AUTOMATIC
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -227,7 +223,7 @@ static int wl1271_ap_init_templates_config(struct wl1271 *wl)
return
0
;
}
static
int
wl12
71_init_rx_config
(
struct
wl1271
*
wl
,
u32
config
,
u32
filter
)
static
int
wl12
xx_init_rx_config
(
struct
wl1271
*
wl
)
{
int
ret
;
...
...
@@ -235,10 +231,6 @@ static int wl1271_init_rx_config(struct wl1271 *wl, u32 config, u32 filter)
if
(
ret
<
0
)
return
ret
;
ret
=
wl1271_acx_rx_config
(
wl
,
config
,
filter
);
if
(
ret
<
0
)
return
ret
;
return
0
;
}
...
...
@@ -285,10 +277,7 @@ int wl1271_init_pta(struct wl1271 *wl)
{
int
ret
;
if
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
)
ret
=
wl1271_acx_ap_sg_cfg
(
wl
);
else
ret
=
wl1271_acx_sta_sg_cfg
(
wl
);
ret
=
wl12xx_acx_sg_cfg
(
wl
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -392,7 +381,7 @@ static int wl1271_sta_hw_init(struct wl1271 *wl)
if
(
ret
<
0
)
return
ret
;
ret
=
wl12
71_acx_sta
_mem_cfg
(
wl
);
ret
=
wl12
xx_acx
_mem_cfg
(
wl
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -408,12 +397,6 @@ static int wl1271_sta_hw_init_post_mem(struct wl1271 *wl)
{
int
ret
,
i
;
ret
=
wl1271_cmd_set_sta_default_wep_key
(
wl
,
wl
->
default_key
);
if
(
ret
<
0
)
{
wl1271_warning
(
"couldn't set default key"
);
return
ret
;
}
/* disable all keep-alive templates */
for
(
i
=
0
;
i
<
CMD_TEMPL_KLV_IDX_MAX
;
i
++
)
{
ret
=
wl1271_acx_keep_alive_config
(
wl
,
i
,
...
...
@@ -451,7 +434,7 @@ static int wl1271_ap_hw_init(struct wl1271 *wl)
if
(
ret
<
0
)
return
ret
;
ret
=
wl12
71_acx_ap
_mem_cfg
(
wl
);
ret
=
wl12
xx_acx
_mem_cfg
(
wl
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -483,7 +466,7 @@ int wl1271_ap_init_templates(struct wl1271 *wl)
* when operating as AP we want to receive external beacons for
* configuring ERP protection.
*/
ret
=
wl1271_acx_
set_ap_beacon_filter
(
wl
,
false
);
ret
=
wl1271_acx_
beacon_filter_opt
(
wl
,
false
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -532,6 +515,9 @@ int wl1271_init_ap_rates(struct wl1271 *wl)
else
supported_rates
=
CONF_TX_AP_ENABLED_RATES
;
/* unconditionally enable HT rates */
supported_rates
|=
CONF_TX_MCS_RATES
;
/* configure unicast TX rate classes */
for
(
i
=
0
;
i
<
wl
->
conf
.
tx
.
ac_conf_count
;
i
++
)
{
rc
.
enabled_rates
=
supported_rates
;
...
...
@@ -546,41 +532,24 @@ int wl1271_init_ap_rates(struct wl1271 *wl)
return
0
;
}
static
void
wl1271_check_ba_support
(
struct
wl1271
*
wl
)
{
/* validate FW cose ver x.x.x.50-60.x */
if
((
wl
->
chip
.
fw_ver
[
3
]
>=
WL12XX_BA_SUPPORT_FW_COST_VER2_START
)
&&
(
wl
->
chip
.
fw_ver
[
3
]
<
WL12XX_BA_SUPPORT_FW_COST_VER2_END
))
{
wl
->
ba_support
=
true
;
return
;
}
wl
->
ba_support
=
false
;
}
static
int
wl1271_set_ba_policies
(
struct
wl1271
*
wl
)
{
u8
tid_index
;
int
ret
=
0
;
/* Reset the BA RX indicators */
wl
->
ba_rx_bitmap
=
0
;
wl
->
ba_allowed
=
true
;
wl
->
ba_rx_session_count
=
0
;
/* validate that FW support BA */
wl1271_check_ba_support
(
wl
);
if
(
wl
->
ba_support
)
/* 802.11n initiator BA session setting */
for
(
tid_index
=
0
;
tid_index
<
CONF_TX_MAX_TID_COUNT
;
++
tid_index
)
{
ret
=
wl1271_acx_set_ba_session
(
wl
,
WLAN_BACK_INITIATOR
,
tid_index
,
true
);
if
(
ret
<
0
)
break
;
/* BA is supported in STA/AP modes */
if
(
wl
->
bss_type
!=
BSS_TYPE_AP_BSS
&&
wl
->
bss_type
!=
BSS_TYPE_STA_BSS
)
{
wl
->
ba_support
=
false
;
return
0
;
}
return
ret
;
wl
->
ba_support
=
true
;
/* 802.11n initiator BA session setting */
return
wl12xx_acx_set_ba_initiator_policy
(
wl
);
}
int
wl1271_chip_specific_init
(
struct
wl1271
*
wl
)
...
...
@@ -650,11 +619,7 @@ int wl1271_hw_init(struct wl1271 *wl)
return
ret
;
/* RX config */
ret
=
wl1271_init_rx_config
(
wl
,
RX_CFG_PROMISCUOUS
|
RX_CFG_TSF
,
RX_FILTER_OPTION_DEF
);
/* RX_CONFIG_OPTION_ANY_DST_ANY_BSS,
RX_FILTER_OPTION_FILTER_ALL); */
ret
=
wl12xx_init_rx_config
(
wl
);
if
(
ret
<
0
)
goto
out_free_memmap
;
...
...
@@ -733,6 +698,10 @@ int wl1271_hw_init(struct wl1271 *wl)
if
(
ret
<
0
)
goto
out_free_memmap
;
ret
=
wl12xx_acx_set_rate_mgmt_params
(
wl
);
if
(
ret
<
0
)
goto
out_free_memmap
;
/* Configure initiator BA sessions policies */
ret
=
wl1271_set_ba_policies
(
wl
);
if
(
ret
<
0
)
...
...
drivers/net/wireless/wl12xx/io.h
浏览文件 @
e0a8c583
...
...
@@ -186,6 +186,5 @@ int wl1271_free_hw(struct wl1271 *wl);
irqreturn_t
wl1271_irq
(
int
irq
,
void
*
data
);
bool
wl1271_set_block_size
(
struct
wl1271
*
wl
);
int
wl1271_tx_dummy_packet
(
struct
wl1271
*
wl
);
void
wl1271_configure_filters
(
struct
wl1271
*
wl
,
unsigned
int
filters
);
#endif
drivers/net/wireless/wl12xx/main.c
浏览文件 @
e0a8c583
此差异已折叠。
点击以展开。
drivers/net/wireless/wl12xx/ps.c
浏览文件 @
e0a8c583
...
...
@@ -226,8 +226,8 @@ void wl1271_ps_link_start(struct wl1271 *wl, u8 hlid, bool clean_queues)
if
(
test_bit
(
hlid
,
&
wl
->
ap_ps_map
))
return
;
wl1271_debug
(
DEBUG_PSM
,
"start mac80211 PSM on hlid %d
blk
s %d "
"clean_queues %d"
,
hlid
,
wl
->
links
[
hlid
].
allocated_
blk
s
,
wl1271_debug
(
DEBUG_PSM
,
"start mac80211 PSM on hlid %d
pkt
s %d "
"clean_queues %d"
,
hlid
,
wl
->
links
[
hlid
].
allocated_
pkt
s
,
clean_queues
);
rcu_read_lock
();
...
...
drivers/net/wireless/wl12xx/reg.h
浏览文件 @
e0a8c583
...
...
@@ -296,81 +296,6 @@
===============================================*/
#define REG_EVENT_MAILBOX_PTR (SCR_PAD1)
/* Misc */
#define REG_ENABLE_TX_RX (ENABLE)
/*
* Rx configuration (filter) information element
* ---------------------------------------------
*/
#define REG_RX_CONFIG (RX_CFG)
#define REG_RX_FILTER (RX_FILTER_CFG)
#define RX_CFG_ENABLE_PHY_HEADER_PLCP 0x0002
/* promiscuous - receives all valid frames */
#define RX_CFG_PROMISCUOUS 0x0008
/* receives frames from any BSSID */
#define RX_CFG_BSSID 0x0020
/* receives frames destined to any MAC address */
#define RX_CFG_MAC 0x0010
#define RX_CFG_ENABLE_ONLY_MY_DEST_MAC 0x0010
#define RX_CFG_ENABLE_ANY_DEST_MAC 0x0000
#define RX_CFG_ENABLE_ONLY_MY_BSSID 0x0020
#define RX_CFG_ENABLE_ANY_BSSID 0x0000
/* discards all broadcast frames */
#define RX_CFG_DISABLE_BCAST 0x0200
#define RX_CFG_ENABLE_ONLY_MY_SSID 0x0400
#define RX_CFG_ENABLE_RX_CMPLT_FCS_ERROR 0x0800
#define RX_CFG_COPY_RX_STATUS 0x2000
#define RX_CFG_TSF 0x10000
#define RX_CONFIG_OPTION_ANY_DST_MY_BSS (RX_CFG_ENABLE_ANY_DEST_MAC | \
RX_CFG_ENABLE_ONLY_MY_BSSID)
#define RX_CONFIG_OPTION_MY_DST_ANY_BSS (RX_CFG_ENABLE_ONLY_MY_DEST_MAC\
| RX_CFG_ENABLE_ANY_BSSID)
#define RX_CONFIG_OPTION_ANY_DST_ANY_BSS (RX_CFG_ENABLE_ANY_DEST_MAC | \
RX_CFG_ENABLE_ANY_BSSID)
#define RX_CONFIG_OPTION_MY_DST_MY_BSS (RX_CFG_ENABLE_ONLY_MY_DEST_MAC\
| RX_CFG_ENABLE_ONLY_MY_BSSID)
#define RX_CONFIG_OPTION_FOR_SCAN (RX_CFG_ENABLE_PHY_HEADER_PLCP \
| RX_CFG_ENABLE_RX_CMPLT_FCS_ERROR \
| RX_CFG_COPY_RX_STATUS | RX_CFG_TSF)
#define RX_CONFIG_OPTION_FOR_MEASUREMENT (RX_CFG_ENABLE_ANY_DEST_MAC)
#define RX_CONFIG_OPTION_FOR_JOIN (RX_CFG_ENABLE_ONLY_MY_BSSID | \
RX_CFG_ENABLE_ONLY_MY_DEST_MAC)
#define RX_CONFIG_OPTION_FOR_IBSS_JOIN (RX_CFG_ENABLE_ONLY_MY_SSID | \
RX_CFG_ENABLE_ONLY_MY_DEST_MAC)
#define RX_FILTER_OPTION_DEF (CFG_RX_MGMT_EN | CFG_RX_DATA_EN\
| CFG_RX_CTL_EN | CFG_RX_BCN_EN\
| CFG_RX_AUTH_EN | CFG_RX_ASSOC_EN)
#define RX_FILTER_OPTION_FILTER_ALL 0
#define RX_FILTER_OPTION_DEF_PRSP_BCN (CFG_RX_PRSP_EN | CFG_RX_MGMT_EN\
| CFG_RX_RCTS_ACK | CFG_RX_BCN_EN)
#define RX_FILTER_OPTION_JOIN (CFG_RX_MGMT_EN | CFG_RX_DATA_EN\
| CFG_RX_BCN_EN | CFG_RX_AUTH_EN\
| CFG_RX_ASSOC_EN | CFG_RX_RCTS_ACK\
| CFG_RX_PRSP_EN)
/*===============================================
EEPROM Read/Write Request 32bit RW
------------------------------------------
...
...
drivers/net/wireless/wl12xx/rx.c
浏览文件 @
e0a8c583
...
...
@@ -30,20 +30,28 @@
#include "rx.h"
#include "io.h"
static
u8
wl12
71_rx_get_mem_block
(
struct
wl1271_fw_common
_status
*
status
,
static
u8
wl12
xx_rx_get_mem_block
(
struct
wl12xx_fw
_status
*
status
,
u32
drv_rx_counter
)
{
return
le32_to_cpu
(
status
->
rx_pkt_descs
[
drv_rx_counter
])
&
RX_MEM_BLOCK_MASK
;
}
static
u32
wl12
71_rx_get_buf_size
(
struct
wl1271_fw_common
_status
*
status
,
static
u32
wl12
xx_rx_get_buf_size
(
struct
wl12xx_fw
_status
*
status
,
u32
drv_rx_counter
)
{
return
(
le32_to_cpu
(
status
->
rx_pkt_descs
[
drv_rx_counter
])
&
RX_BUF_SIZE_MASK
)
>>
RX_BUF_SIZE_SHIFT_DIV
;
}
static
bool
wl12xx_rx_get_unaligned
(
struct
wl12xx_fw_status
*
status
,
u32
drv_rx_counter
)
{
/* Convert the value to bool */
return
!!
(
le32_to_cpu
(
status
->
rx_pkt_descs
[
drv_rx_counter
])
&
RX_BUF_UNALIGNED_PAYLOAD
);
}
static
void
wl1271_rx_status
(
struct
wl1271
*
wl
,
struct
wl1271_rx_descriptor
*
desc
,
struct
ieee80211_rx_status
*
status
,
...
...
@@ -89,7 +97,8 @@ static void wl1271_rx_status(struct wl1271 *wl,
}
}
static
int
wl1271_rx_handle_data
(
struct
wl1271
*
wl
,
u8
*
data
,
u32
length
)
static
int
wl1271_rx_handle_data
(
struct
wl1271
*
wl
,
u8
*
data
,
u32
length
,
bool
unaligned
)
{
struct
wl1271_rx_descriptor
*
desc
;
struct
sk_buff
*
skb
;
...
...
@@ -97,6 +106,7 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length)
u8
*
buf
;
u8
beacon
=
0
;
u8
is_data
=
0
;
u8
reserved
=
unaligned
?
NET_IP_ALIGN
:
0
;
/*
* In PLT mode we seem to get frames and mac80211 warns about them,
...
...
@@ -131,17 +141,25 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length)
return
-
EINVAL
;
}
skb
=
__dev_alloc_skb
(
length
,
GFP_KERNEL
);
/* skb length not included rx descriptor */
skb
=
__dev_alloc_skb
(
length
+
reserved
-
sizeof
(
*
desc
),
GFP_KERNEL
);
if
(
!
skb
)
{
wl1271_error
(
"Couldn't allocate RX frame"
);
return
-
ENOMEM
;
}
buf
=
skb_put
(
skb
,
length
);
memcpy
(
buf
,
data
,
length
);
/* reserve the unaligned payload(if any) */
skb_reserve
(
skb
,
reserved
);
/* now we pull the descriptor out of the buffer */
skb_pull
(
skb
,
sizeof
(
*
desc
));
buf
=
skb_put
(
skb
,
length
-
sizeof
(
*
desc
));
/*
* Copy packets from aggregation buffer to the skbs without rx
* descriptor and with packet payload aligned care. In case of unaligned
* packets copy the packets in offset of 2 bytes guarantee IP header
* payload aligned to 4 bytes.
*/
memcpy
(
buf
,
data
+
sizeof
(
*
desc
),
length
-
sizeof
(
*
desc
));
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
if
(
ieee80211_is_beacon
(
hdr
->
frame_control
))
...
...
@@ -163,7 +181,7 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length)
return
is_data
;
}
void
wl12
71_rx
(
struct
wl1271
*
wl
,
struct
wl1271_fw_common
_status
*
status
)
void
wl12
xx_rx
(
struct
wl1271
*
wl
,
struct
wl12xx_fw
_status
*
status
)
{
struct
wl1271_acx_mem_map
*
wl_mem_map
=
wl
->
target_mem_map
;
u32
buf_size
;
...
...
@@ -175,12 +193,13 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
u32
pkt_offset
;
bool
is_ap
=
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
);
bool
had_data
=
false
;
bool
unaligned
=
false
;
while
(
drv_rx_counter
!=
fw_rx_counter
)
{
buf_size
=
0
;
rx_counter
=
drv_rx_counter
;
while
(
rx_counter
!=
fw_rx_counter
)
{
pkt_length
=
wl12
71
_rx_get_buf_size
(
status
,
rx_counter
);
pkt_length
=
wl12
xx
_rx_get_buf_size
(
status
,
rx_counter
);
if
(
buf_size
+
pkt_length
>
WL1271_AGGR_BUFFER_SIZE
)
break
;
buf_size
+=
pkt_length
;
...
...
@@ -199,7 +218,7 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
* For aggregated packets, only the first memory block
* should be retrieved. The FW takes care of the rest.
*/
mem_block
=
wl12
71
_rx_get_mem_block
(
status
,
mem_block
=
wl12
xx
_rx_get_mem_block
(
status
,
drv_rx_counter
);
wl
->
rx_mem_pool_addr
.
addr
=
(
mem_block
<<
8
)
+
...
...
@@ -220,8 +239,12 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
/* Split data into separate packets */
pkt_offset
=
0
;
while
(
pkt_offset
<
buf_size
)
{
pkt_length
=
wl12
71
_rx_get_buf_size
(
status
,
pkt_length
=
wl12
xx
_rx_get_buf_size
(
status
,
drv_rx_counter
);
unaligned
=
wl12xx_rx_get_unaligned
(
status
,
drv_rx_counter
);
/*
* the handle data call can only fail in memory-outage
* conditions, in that case the received frame will just
...
...
@@ -229,7 +252,7 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
*/
if
(
wl1271_rx_handle_data
(
wl
,
wl
->
aggr_buf
+
pkt_offset
,
pkt_length
)
==
1
)
pkt_length
,
unaligned
)
==
1
)
had_data
=
true
;
wl
->
rx_counter
++
;
...
...
@@ -260,14 +283,3 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
jiffies
+
msecs_to_jiffies
(
timeout
));
}
}
void
wl1271_set_default_filters
(
struct
wl1271
*
wl
)
{
if
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
)
{
wl
->
rx_config
=
WL1271_DEFAULT_AP_RX_CONFIG
;
wl
->
rx_filter
=
WL1271_DEFAULT_AP_RX_FILTER
;
}
else
{
wl
->
rx_config
=
WL1271_DEFAULT_STA_RX_CONFIG
;
wl
->
rx_filter
=
WL1271_DEFAULT_STA_RX_FILTER
;
}
}
drivers/net/wireless/wl12xx/rx.h
浏览文件 @
e0a8c583
...
...
@@ -86,7 +86,7 @@
* Bits 3-5 - process_id tag (AP mode FW)
* Bits 6-7 - reserved
*/
#define WL1271_RX_DESC_STATUS_MASK 0x0
7
#define WL1271_RX_DESC_STATUS_MASK 0x0
3
#define WL1271_RX_DESC_SUCCESS 0x00
#define WL1271_RX_DESC_DECRYPT_FAIL 0x01
...
...
@@ -96,6 +96,8 @@
#define RX_MEM_BLOCK_MASK 0xFF
#define RX_BUF_SIZE_MASK 0xFFF00
#define RX_BUF_SIZE_SHIFT_DIV 6
/* If set, the start of IP payload is not 4 bytes aligned */
#define RX_BUF_UNALIGNED_PAYLOAD BIT(20)
enum
{
WL12XX_RX_CLASS_UNKNOWN
,
...
...
@@ -119,16 +121,12 @@ struct wl1271_rx_descriptor {
u8
snr
;
__le32
timestamp
;
u8
packet_class
;
union
{
u8
process_id
;
/* STA FW */
u8
hlid
;
/* AP FW */
}
__packed
;
u8
hlid
;
u8
pad_len
;
u8
reserved
;
}
__packed
;
void
wl12
71_rx
(
struct
wl1271
*
wl
,
struct
wl1271_fw_common
_status
*
status
);
void
wl12
xx_rx
(
struct
wl1271
*
wl
,
struct
wl12xx_fw
_status
*
status
);
u8
wl1271_rate_to_idx
(
int
rate
,
enum
ieee80211_band
band
);
void
wl1271_set_default_filters
(
struct
wl1271
*
wl
);
#endif
drivers/net/wireless/wl12xx/scan.c
浏览文件 @
e0a8c583
...
...
@@ -33,6 +33,8 @@ void wl1271_scan_complete_work(struct work_struct *work)
{
struct
delayed_work
*
dwork
;
struct
wl1271
*
wl
;
int
ret
;
bool
is_sta
,
is_ibss
;
dwork
=
container_of
(
work
,
struct
delayed_work
,
work
);
wl
=
container_of
(
dwork
,
struct
wl1271
,
scan_complete_work
);
...
...
@@ -50,21 +52,34 @@ void wl1271_scan_complete_work(struct work_struct *work)
wl
->
scan
.
state
=
WL1271_SCAN_STATE_IDLE
;
memset
(
wl
->
scan
.
scanned_ch
,
0
,
sizeof
(
wl
->
scan
.
scanned_ch
));
wl
->
scan
.
req
=
NULL
;
ieee80211_scan_completed
(
wl
->
hw
,
false
);
/* restore hardware connection monitoring template */
ret
=
wl1271_ps_elp_wakeup
(
wl
);
if
(
ret
<
0
)
goto
out
;
if
(
test_bit
(
WL1271_FLAG_STA_ASSOCIATED
,
&
wl
->
flags
))
{
if
(
wl1271_ps_elp_wakeup
(
wl
)
==
0
)
{
/* restore hardware connection monitoring template */
wl1271_cmd_build_ap_probe_req
(
wl
,
wl
->
probereq
);
wl1271_ps_elp_sleep
(
wl
);
}
/* return to ROC if needed */
is_sta
=
(
wl
->
bss_type
==
BSS_TYPE_STA_BSS
);
is_ibss
=
(
wl
->
bss_type
==
BSS_TYPE_IBSS
);
if
((
is_sta
&&
!
test_bit
(
WL1271_FLAG_STA_ASSOCIATED
,
&
wl
->
flags
))
||
(
is_ibss
&&
!
test_bit
(
WL1271_FLAG_IBSS_JOINED
,
&
wl
->
flags
)))
{
/* restore remain on channel */
wl12xx_cmd_role_start_dev
(
wl
);
wl12xx_roc
(
wl
,
wl
->
dev_role_id
);
}
wl1271_ps_elp_sleep
(
wl
);
if
(
wl
->
scan
.
failed
)
{
wl1271_info
(
"Scan completed due to error."
);
wl12xx_queue_recovery_work
(
wl
);
}
ieee80211_scan_completed
(
wl
->
hw
,
false
);
out:
mutex_unlock
(
&
wl
->
mutex
);
...
...
@@ -156,6 +171,11 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band,
if
(
passive
||
wl
->
scan
.
req
->
n_ssids
==
0
)
scan_options
|=
WL1271_SCAN_OPT_PASSIVE
;
if
(
WARN_ON
(
wl
->
role_id
==
WL12XX_INVALID_ROLE_ID
))
{
ret
=
-
EINVAL
;
goto
out
;
}
cmd
->
params
.
role_id
=
wl
->
role_id
;
cmd
->
params
.
scan_options
=
cpu_to_le16
(
scan_options
);
cmd
->
params
.
n_ch
=
wl1271_get_scan_channels
(
wl
,
wl
->
scan
.
req
,
...
...
@@ -167,10 +187,6 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band,
}
cmd
->
params
.
tx_rate
=
cpu_to_le32
(
basic_rate
);
cmd
->
params
.
rx_config_options
=
cpu_to_le32
(
CFG_RX_ALL_GOOD
);
cmd
->
params
.
rx_filter_options
=
cpu_to_le32
(
CFG_RX_PRSP_EN
|
CFG_RX_MGMT_EN
|
CFG_RX_BCN_EN
);
cmd
->
params
.
n_probe_reqs
=
wl
->
conf
.
scan
.
num_probe_reqs
;
cmd
->
params
.
tx_rate
=
cpu_to_le32
(
basic_rate
);
cmd
->
params
.
tid_trigger
=
0
;
...
...
@@ -186,6 +202,8 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band,
memcpy
(
cmd
->
params
.
ssid
,
wl
->
scan
.
ssid
,
wl
->
scan
.
ssid_len
);
}
memcpy
(
cmd
->
addr
,
wl
->
mac_addr
,
ETH_ALEN
);
ret
=
wl1271_cmd_build_probe_req
(
wl
,
wl
->
scan
.
ssid
,
wl
->
scan
.
ssid_len
,
wl
->
scan
.
req
->
ie
,
wl
->
scan
.
req
->
ie_len
,
band
);
...
...
drivers/net/wireless/wl12xx/scan.h
浏览文件 @
e0a8c583
...
...
@@ -46,7 +46,10 @@ void wl1271_scan_sched_scan_results(struct wl1271 *wl);
#define WL1271_SCAN_CURRENT_TX_PWR 0
#define WL1271_SCAN_OPT_ACTIVE 0
#define WL1271_SCAN_OPT_PASSIVE 1
#define WL1271_SCAN_OPT_TRIGGERED_SCAN 2
#define WL1271_SCAN_OPT_PRIORITY_HIGH 4
/* scan even if we fail to enter psm */
#define WL1271_SCAN_OPT_FORCE 8
#define WL1271_SCAN_BAND_2_4_GHZ 0
#define WL1271_SCAN_BAND_5_GHZ 1
...
...
@@ -62,27 +65,27 @@ enum {
};
struct
basic_scan_params
{
__le32
rx_config_options
;
__le32
rx_filter_options
;
/* Scan option flags (WL1271_SCAN_OPT_*) */
__le16
scan_options
;
u8
role_id
;
/* Number of scan channels in the list (maximum 30) */
u8
n_ch
;
/* This field indicates the number of probe requests to send
per channel for an active scan */
u8
n_probe_reqs
;
/* Rate bit field for sending the probes */
__le32
tx_rate
;
u8
tid_trigger
;
u8
ssid_len
;
/* in order to align */
u8
padding1
[
2
];
u8
use_ssid_list
;
/* Rate bit field for sending the probes */
__le32
tx_rate
;
u8
ssid
[
IEEE80211_MAX_SSID_LEN
];
/* Band to scan */
u8
band
;
u8
use_ssid_list
;
u8
scan_tag
;
u8
padding2
;
u8
padding2
[
2
]
;
}
__packed
;
struct
basic_scan_channel_params
{
...
...
@@ -105,6 +108,10 @@ struct wl1271_cmd_scan {
struct
basic_scan_params
params
;
struct
basic_scan_channel_params
channels
[
WL1271_SCAN_MAX_CHANNELS
];
/* src mac address */
u8
addr
[
ETH_ALEN
];
u8
padding
[
2
];
}
__packed
;
struct
wl1271_cmd_trigger_scan_to
{
...
...
@@ -184,7 +191,7 @@ struct wl1271_cmd_sched_scan_config {
}
__packed
;
#define SCHED_SCAN_MAX_SSIDS
8
#define SCHED_SCAN_MAX_SSIDS
16
enum
{
SCAN_SSID_TYPE_PUBLIC
=
0
,
...
...
drivers/net/wireless/wl12xx/sdio.c
浏览文件 @
e0a8c583
...
...
@@ -412,7 +412,5 @@ module_exit(wl1271_exit);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Luciano Coelho <coelho@ti.com>"
);
MODULE_AUTHOR
(
"Juuso Oikarinen <juuso.oikarinen@nokia.com>"
);
MODULE_FIRMWARE
(
WL127
1
_FW_NAME
);
MODULE_FIRMWARE
(
WL127
X
_FW_NAME
);
MODULE_FIRMWARE
(
WL128X_FW_NAME
);
MODULE_FIRMWARE
(
WL127X_AP_FW_NAME
);
MODULE_FIRMWARE
(
WL128X_AP_FW_NAME
);
drivers/net/wireless/wl12xx/spi.c
浏览文件 @
e0a8c583
...
...
@@ -486,8 +486,6 @@ module_exit(wl1271_exit);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Luciano Coelho <coelho@ti.com>"
);
MODULE_AUTHOR
(
"Juuso Oikarinen <juuso.oikarinen@nokia.com>"
);
MODULE_FIRMWARE
(
WL127
1
_FW_NAME
);
MODULE_FIRMWARE
(
WL127
X
_FW_NAME
);
MODULE_FIRMWARE
(
WL128X_FW_NAME
);
MODULE_FIRMWARE
(
WL127X_AP_FW_NAME
);
MODULE_FIRMWARE
(
WL128X_AP_FW_NAME
);
MODULE_ALIAS
(
"spi:wl1271"
);
drivers/net/wireless/wl12xx/tx.c
浏览文件 @
e0a8c583
...
...
@@ -37,9 +37,10 @@ static int wl1271_set_default_wep_key(struct wl1271 *wl, u8 id)
bool
is_ap
=
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
);
if
(
is_ap
)
ret
=
wl1271_cmd_set_ap_default_wep_key
(
wl
,
id
);
ret
=
wl12xx_cmd_set_default_wep_key
(
wl
,
id
,
wl
->
ap_bcast_hlid
);
else
ret
=
wl12
71_cmd_set_sta_default_wep_key
(
wl
,
id
);
ret
=
wl12
xx_cmd_set_default_wep_key
(
wl
,
id
,
wl
->
sta_hl
id
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -77,6 +78,7 @@ static int wl1271_tx_update_filters(struct wl1271 *wl,
struct
sk_buff
*
skb
)
{
struct
ieee80211_hdr
*
hdr
;
int
ret
;
hdr
=
(
struct
ieee80211_hdr
*
)(
skb
->
data
+
sizeof
(
struct
wl1271_tx_hw_descr
));
...
...
@@ -90,9 +92,19 @@ static int wl1271_tx_update_filters(struct wl1271 *wl,
if
(
!
ieee80211_is_auth
(
hdr
->
frame_control
))
return
0
;
wl1271_configure_filters
(
wl
,
FIF_OTHER_BSS
);
if
(
wl
->
dev_hlid
!=
WL12XX_INVALID_LINK_ID
)
goto
out
;
return
wl1271_acx_rx_config
(
wl
,
wl
->
rx_config
,
wl
->
rx_filter
);
wl1271_debug
(
DEBUG_CMD
,
"starting device role for roaming"
);
ret
=
wl12xx_cmd_role_start_dev
(
wl
);
if
(
ret
<
0
)
goto
out
;
ret
=
wl12xx_roc
(
wl
,
wl
->
dev_role_id
);
if
(
ret
<
0
)
goto
out
;
out:
return
0
;
}
static
void
wl1271_tx_ap_update_inconnection_sta
(
struct
wl1271
*
wl
,
...
...
@@ -114,24 +126,29 @@ static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl,
static
void
wl1271_tx_regulate_link
(
struct
wl1271
*
wl
,
u8
hlid
)
{
bool
fw_ps
;
u8
tx_
blk
s
;
u8
tx_
pkt
s
;
/* only regulate station links */
if
(
hlid
<
WL1271_AP_STA_HLID_START
)
return
;
fw_ps
=
test_bit
(
hlid
,
(
unsigned
long
*
)
&
wl
->
ap_fw_ps_map
);
tx_
blks
=
wl
->
links
[
hlid
].
allocated_blk
s
;
tx_
pkts
=
wl
->
links
[
hlid
].
allocated_pkt
s
;
/*
* if in FW PS and there is enough data in FW we can put the link
* into high-level PS and clean out its TX queues.
*/
if
(
fw_ps
&&
tx_
blks
>=
WL1271_PS_STA_MAX_BLOCK
S
)
if
(
fw_ps
&&
tx_
pkts
>=
WL1271_PS_STA_MAX_PACKET
S
)
wl1271_ps_link_start
(
wl
,
hlid
,
true
);
}
u8
wl1271_tx_get_hlid
(
struct
sk_buff
*
skb
)
static
bool
wl12xx_is_dummy_packet
(
struct
wl1271
*
wl
,
struct
sk_buff
*
skb
)
{
return
wl
->
dummy_packet
==
skb
;
}
u8
wl12xx_tx_get_hlid_ap
(
struct
wl1271
*
wl
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_tx_info
*
control
=
IEEE80211_SKB_CB
(
skb
);
...
...
@@ -144,14 +161,32 @@ u8 wl1271_tx_get_hlid(struct sk_buff *skb)
}
else
{
struct
ieee80211_hdr
*
hdr
;
if
(
!
test_bit
(
WL1271_FLAG_AP_STARTED
,
&
wl
->
flags
))
return
wl
->
system_hlid
;
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
if
(
ieee80211_is_mgmt
(
hdr
->
frame_control
))
return
WL1271_AP_GLOBAL_HLID
;
return
wl
->
ap_global_hlid
;
else
return
WL1271_AP_BROADCAST_HLID
;
return
wl
->
ap_bcast_hlid
;
}
}
static
u8
wl1271_tx_get_hlid
(
struct
wl1271
*
wl
,
struct
sk_buff
*
skb
)
{
if
(
wl12xx_is_dummy_packet
(
wl
,
skb
))
return
wl
->
system_hlid
;
if
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
)
return
wl12xx_tx_get_hlid_ap
(
wl
,
skb
);
if
(
test_bit
(
WL1271_FLAG_STA_ASSOCIATED
,
&
wl
->
flags
)
||
test_bit
(
WL1271_FLAG_IBSS_JOINED
,
&
wl
->
flags
))
return
wl
->
sta_hlid
;
else
return
wl
->
dev_hlid
;
}
static
unsigned
int
wl12xx_calc_packet_alignment
(
struct
wl1271
*
wl
,
unsigned
int
packet_length
)
{
...
...
@@ -169,12 +204,9 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
u32
len
;
u32
total_blocks
;
int
id
,
ret
=
-
EBUSY
,
ac
;
u32
spare_blocks
;
if
(
unlikely
(
wl
->
quirks
&
WL12XX_QUIRK_USE_2_SPARE_BLOCKS
))
spare_blocks
=
2
;
else
spare_blocks
=
1
;
/* we use 1 spare block */
u32
spare_blocks
=
1
;
if
(
buf_offset
+
total_len
>
WL1271_AGGR_BUFFER_SIZE
)
return
-
EAGAIN
;
...
...
@@ -206,12 +238,14 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
desc
->
id
=
id
;
wl
->
tx_blocks_available
-=
total_blocks
;
wl
->
tx_allocated_blocks
+=
total_blocks
;
ac
=
wl1271_tx_get_queue
(
skb_get_queue_mapping
(
skb
));
wl
->
tx_allocated_
blocks
[
ac
]
+=
total_blocks
;
wl
->
tx_allocated_
pkts
[
ac
]
++
;
if
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
)
wl
->
links
[
hlid
].
allocated_blks
+=
total_blocks
;
if
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
&&
hlid
>=
WL1271_AP_STA_HLID_START
)
wl
->
links
[
hlid
].
allocated_pkts
++
;
ret
=
0
;
...
...
@@ -225,11 +259,6 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
return
ret
;
}
static
bool
wl12xx_is_dummy_packet
(
struct
wl1271
*
wl
,
struct
sk_buff
*
skb
)
{
return
wl
->
dummy_packet
==
skb
;
}
static
void
wl1271_tx_fill_hdr
(
struct
wl1271
*
wl
,
struct
sk_buff
*
skb
,
u32
extra
,
struct
ieee80211_tx_info
*
control
,
u8
hlid
)
...
...
@@ -280,9 +309,9 @@ static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb,
wl
->
session_counter
<<
TX_HW_ATTR_OFST_SESSION_COUNTER
;
}
if
(
wl
->
bss_type
!=
BSS_TYPE_AP_BSS
)
{
desc
->
aid
=
hlid
;
desc
->
hlid
=
hlid
;
if
(
wl
->
bss_type
!=
BSS_TYPE_AP_BSS
)
{
/* if the packets are destined for AP (have a STA entry)
send them with AP rate policies, otherwise use default
basic rates */
...
...
@@ -291,18 +320,12 @@ static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb,
else
rate_idx
=
ACX_TX_BASIC_RATE
;
}
else
{
desc
->
hlid
=
hlid
;
switch
(
hlid
)
{
case
WL1271_AP_GLOBAL_HLID
:
if
(
hlid
==
wl
->
ap_global_hlid
)
rate_idx
=
ACX_TX_AP_MODE_MGMT_RATE
;
break
;
case
WL1271_AP_BROADCAST_HLID
:
else
if
(
hlid
==
wl
->
ap_bcast_hlid
)
rate_idx
=
ACX_TX_AP_MODE_BCST_RATE
;
break
;
default:
else
rate_idx
=
ac
;
break
;
}
}
tx_attr
|=
rate_idx
<<
TX_HW_ATTR_OFST_RATE_POLICY
;
...
...
@@ -376,10 +399,11 @@ static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct sk_buff *skb,
}
}
if
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
)
hlid
=
wl1271_tx_get_hlid
(
skb
);
else
hlid
=
TX_HW_DEFAULT_AID
;
hlid
=
wl1271_tx_get_hlid
(
wl
,
skb
);
if
(
hlid
==
WL12XX_INVALID_LINK_ID
)
{
wl1271_error
(
"invalid hlid. dropping skb 0x%p"
,
skb
);
return
-
EINVAL
;
}
ret
=
wl1271_tx_allocate
(
wl
,
skb
,
extra
,
buf_offset
,
hlid
);
if
(
ret
<
0
)
...
...
@@ -462,19 +486,23 @@ void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
static
struct
sk_buff_head
*
wl1271_select_queue
(
struct
wl1271
*
wl
,
struct
sk_buff_head
*
queues
)
{
int
i
,
q
=
-
1
;
u32
min_
blk
s
=
0xffffffff
;
int
i
,
q
=
-
1
,
ac
;
u32
min_
pkt
s
=
0xffffffff
;
/*
* Find a non-empty ac where:
* 1. There are packets to transmit
* 2. The FW has the least allocated blocks
*
* We prioritize the ACs according to VO>VI>BE>BK
*/
for
(
i
=
0
;
i
<
NUM_TX_QUEUES
;
i
++
)
if
(
!
skb_queue_empty
(
&
queues
[
i
])
&&
(
wl
->
tx_allocated_blocks
[
i
]
<
min_blks
))
{
q
=
i
;
min_blks
=
wl
->
tx_allocated_blocks
[
q
];
for
(
i
=
0
;
i
<
NUM_TX_QUEUES
;
i
++
)
{
ac
=
wl1271_tx_get_queue
(
i
);
if
(
!
skb_queue_empty
(
&
queues
[
ac
])
&&
(
wl
->
tx_allocated_pkts
[
ac
]
<
min_pkts
))
{
q
=
ac
;
min_pkts
=
wl
->
tx_allocated_pkts
[
q
];
}
}
if
(
q
==
-
1
)
...
...
@@ -579,7 +607,7 @@ static void wl1271_skb_queue_head(struct wl1271 *wl, struct sk_buff *skb)
if
(
wl12xx_is_dummy_packet
(
wl
,
skb
))
{
set_bit
(
WL1271_FLAG_DUMMY_PACKET_PENDING
,
&
wl
->
flags
);
}
else
if
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
)
{
u8
hlid
=
wl1271_tx_get_hlid
(
skb
);
u8
hlid
=
wl1271_tx_get_hlid
(
wl
,
skb
);
skb_queue_head
(
&
wl
->
links
[
hlid
].
tx_queue
[
q
],
skb
);
/* make sure we dequeue the same packet next time */
...
...
@@ -826,10 +854,14 @@ void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
total
[
i
]
=
0
;
while
((
skb
=
skb_dequeue
(
&
wl
->
links
[
hlid
].
tx_queue
[
i
])))
{
wl1271_debug
(
DEBUG_TX
,
"link freeing skb 0x%p"
,
skb
);
if
(
!
wl12xx_is_dummy_packet
(
wl
,
skb
))
{
info
=
IEEE80211_SKB_CB
(
skb
);
info
->
status
.
rates
[
0
].
idx
=
-
1
;
info
->
status
.
rates
[
0
].
count
=
0
;
ieee80211_tx_status_ni
(
wl
->
hw
,
skb
);
}
total
[
i
]
++
;
}
}
...
...
@@ -853,8 +885,8 @@ void wl1271_tx_reset(struct wl1271 *wl, bool reset_tx_queues)
if
(
wl
->
bss_type
==
BSS_TYPE_AP_BSS
)
{
for
(
i
=
0
;
i
<
AP_MAX_LINKS
;
i
++
)
{
wl1271_tx_reset_link_queues
(
wl
,
i
);
wl
->
links
[
i
].
allocated_
blk
s
=
0
;
wl
->
links
[
i
].
prev_freed_
blk
s
=
0
;
wl
->
links
[
i
].
allocated_
pkt
s
=
0
;
wl
->
links
[
i
].
prev_freed_
pkt
s
=
0
;
}
wl
->
last_tx_hlid
=
0
;
...
...
drivers/net/wireless/wl12xx/tx.h
浏览文件 @
e0a8c583
...
...
@@ -29,9 +29,6 @@
#define TX_HW_MGMT_PKT_LIFETIME_TU 2000
#define TX_HW_AP_MODE_PKT_LIFETIME_TU 8000
/* The chipset reference driver states, that the "aid" value 1
* is for infra-BSS, but is still always used */
#define TX_HW_DEFAULT_AID 1
#define TX_HW_ATTR_SAVE_RETRIES BIT(0)
#define TX_HW_ATTR_HEADER_PAD BIT(1)
...
...
@@ -116,12 +113,8 @@ struct wl1271_tx_hw_descr {
u8
id
;
/* The packet TID value (as User-Priority) */
u8
tid
;
union
{
/* STA - Identifier of the remote STA in IBSS, 1 in infra-BSS */
u8
aid
;
/* AP - host link ID (HLID) */
/* host link ID (HLID) */
u8
hlid
;
}
__packed
;
u8
reserved
;
}
__packed
;
...
...
@@ -133,7 +126,8 @@ enum wl1271_tx_hw_res_status {
TX_TIMEOUT
=
4
,
TX_KEY_NOT_FOUND
=
5
,
TX_PEER_NOT_FOUND
=
6
,
TX_SESSION_MISMATCH
=
7
TX_SESSION_MISMATCH
=
7
,
TX_LINK_NOT_VALID
=
8
,
};
struct
wl1271_tx_hw_res_descr
{
...
...
@@ -216,7 +210,7 @@ void wl1271_tx_flush(struct wl1271 *wl);
u8
wl1271_rate_to_idx
(
int
rate
,
enum
ieee80211_band
band
);
u32
wl1271_tx_enabled_rates_get
(
struct
wl1271
*
wl
,
u32
rate_set
);
u32
wl1271_tx_min_rate_get
(
struct
wl1271
*
wl
);
u8
wl12
71_tx_get_hlid
(
struct
sk_buff
*
skb
);
u8
wl12
xx_tx_get_hlid_ap
(
struct
wl1271
*
wl
,
struct
sk_buff
*
skb
);
void
wl1271_tx_reset_link_queues
(
struct
wl1271
*
wl
,
u8
hlid
);
void
wl1271_handle_tx_low_watermark
(
struct
wl1271
*
wl
);
...
...
drivers/net/wireless/wl12xx/wl12xx.h
浏览文件 @
e0a8c583
...
...
@@ -112,28 +112,8 @@ extern u32 wl12xx_debug_level;
true); \
} while (0)
#define WL1271_DEFAULT_STA_RX_CONFIG (CFG_UNI_FILTER_EN | \
CFG_BSSID_FILTER_EN | \
CFG_MC_FILTER_EN)
#define WL1271_DEFAULT_STA_RX_FILTER (CFG_RX_RCTS_ACK | CFG_RX_PRSP_EN | \
CFG_RX_MGMT_EN | CFG_RX_DATA_EN | \
CFG_RX_CTL_EN | CFG_RX_BCN_EN | \
CFG_RX_AUTH_EN | CFG_RX_ASSOC_EN)
#define WL1271_DEFAULT_AP_RX_CONFIG 0
#define WL1271_DEFAULT_AP_RX_FILTER (CFG_RX_RCTS_ACK | CFG_RX_PREQ_EN | \
CFG_RX_MGMT_EN | CFG_RX_DATA_EN | \
CFG_RX_CTL_EN | CFG_RX_AUTH_EN | \
CFG_RX_ASSOC_EN)
#define WL1271_FW_NAME "ti-connectivity/wl1271-fw-2.bin"
#define WL128X_FW_NAME "ti-connectivity/wl128x-fw.bin"
#define WL127X_AP_FW_NAME "ti-connectivity/wl1271-fw-ap.bin"
#define WL128X_AP_FW_NAME "ti-connectivity/wl128x-fw-ap.bin"
#define WL127X_FW_NAME "ti-connectivity/wl127x-fw-3.bin"
#define WL128X_FW_NAME "ti-connectivity/wl128x-fw-3.bin"
/*
* wl127x and wl128x are using the same NVS file name. However, the
...
...
@@ -157,25 +137,34 @@ extern u32 wl12xx_debug_level;
#define WL1271_DEFAULT_BEACON_INT 100
#define WL1271_DEFAULT_DTIM_PERIOD 1
#define WL1271_AP_GLOBAL_HLID 0
#define WL1271_AP_BROADCAST_HLID 1
#define WL1271_AP_STA_HLID_START 2
#define WL12XX_MAX_ROLES 4
#define WL12XX_MAX_LINKS 8
#define WL12XX_INVALID_ROLE_ID 0xff
#define WL12XX_INVALID_LINK_ID 0xff
/* Defined by FW as 0. Will not be freed or allocated. */
#define WL12XX_SYSTEM_HLID 0
/*
* TODO: we currently don't support multirole. remove
* this constant from the code when we do.
*/
#define WL1271_AP_STA_HLID_START 3
/*
* When in AP-mode, we allow (at least) this number of
mem-block
s
* When in AP-mode, we allow (at least) this number of
packet
s
* to be transmitted to FW for a STA in PS-mode. Only when packets are
* present in the FW buffers it will wake the sleeping STA. We want to put
* enough packets for the driver to transmit all of its buffered data before
* the STA goes to sleep again. But we don't want to take too much mem
-blocks
* the STA goes to sleep again. But we don't want to take too much mem
ory
* as it might hurt the throughput of active STAs.
* The number of blocks (18) is enough for 2 large packets.
*/
#define WL1271_PS_STA_MAX_
BLOCKS (2 * 9)
#define WL1271_PS_STA_MAX_
PACKETS 2
#define WL1271_AP_BSS_INDEX 0
#define WL1271_AP_DEF_BEACON_EXP 20
#define ACX_TX_DESCRIPTORS
32
#define ACX_TX_DESCRIPTORS
16
#define WL1271_AGGR_BUFFER_SIZE (4 * PAGE_SIZE)
...
...
@@ -247,26 +236,22 @@ struct wl1271_stats {
#define AP_MAX_STATIONS 5
/* Broadcast and Global links + links to stations */
#define AP_MAX_LINKS (AP_MAX_STATIONS + 2)
/* Broadcast and Global links + system link + links to stations */
/*
* TODO: when WL1271_AP_STA_HLID_START is no longer constant, change all
* the places that use this.
*/
#define AP_MAX_LINKS (AP_MAX_STATIONS + 3)
/* FW status registers
common for AP/STA
*/
struct
wl12
71_fw_common
_status
{
/* FW status registers */
struct
wl12
xx_fw
_status
{
__le32
intr
;
u8
fw_rx_counter
;
u8
drv_rx_counter
;
u8
reserved
;
u8
tx_results_counter
;
__le32
rx_pkt_descs
[
NUM_RX_PKT_DESC
];
__le32
tx_released_blks
[
NUM_TX_QUEUES
];
__le32
fw_localtime
;
}
__packed
;
/* FW status registers for AP */
struct
wl1271_fw_ap_status
{
struct
wl1271_fw_common_status
common
;
/* Next fields valid only in AP FW */
/*
* A bitmap (where each bit represents a single HLID)
...
...
@@ -274,29 +259,29 @@ struct wl1271_fw_ap_status {
*/
__le32
link_ps_bitmap
;
/* Number of freed MBs per HLID */
u8
tx_lnk_free_blks
[
AP_MAX_LINKS
];
u8
padding_1
[
1
];
}
__packed
;
/*
* A bitmap (where each bit represents a single HLID) to indicate
* if the station is in Fast mode
*/
__le32
link_fast_bitmap
;
/* FW status registers for STA */
struct
wl1271_fw_sta_status
{
struct
wl1271_fw_common_status
common
;
/* Cumulative counter of total released mem blocks since FW-reset */
__le32
total_released_blks
;
u8
tx_total
;
u8
reserved1
;
__le16
reserved2
;
__le32
log_start_addr
;
}
__packed
;
/* Size (in Memory Blocks) of TX pool */
__le32
tx_total
;
struct
wl1271_fw_full_status
{
union
{
struct
wl1271_fw_common_status
common
;
struct
wl1271_fw_sta_status
sta
;
struct
wl1271_fw_ap_status
ap
;
};
}
__packed
;
/* Cumulative counter of released packets per AC */
u8
tx_released_pkts
[
NUM_TX_QUEUES
];
/* Cumulative counter of freed packets per HLID */
u8
tx_lnk_free_pkts
[
WL12XX_MAX_LINKS
];
/* Cumulative counter of released Voice memory blocks */
u8
tx_voice_released_blks
;
u8
padding_1
[
7
];
__le32
log_start_addr
;
}
__packed
;
struct
wl1271_rx_mem_pool_addr
{
u32
addr
;
...
...
@@ -342,7 +327,7 @@ struct wl1271_ap_key {
enum
wl12xx_flags
{
WL1271_FLAG_STA_ASSOCIATED
,
WL1271_FLAG_JOINED
,
WL1271_FLAG_
IBSS_
JOINED
,
WL1271_FLAG_GPIO_POWER
,
WL1271_FLAG_TX_QUEUE_STOPPED
,
WL1271_FLAG_TX_PENDING
,
...
...
@@ -369,11 +354,14 @@ struct wl1271_link {
/* AP-mode - TX queue per AC in link */
struct
sk_buff_head
tx_queue
[
NUM_TX_QUEUES
];
/* accounting for allocated /
available TX block
s in FW */
u8
allocated_
blk
s
;
u8
prev_freed_
blk
s
;
/* accounting for allocated /
freed packet
s in FW */
u8
allocated_
pkt
s
;
u8
prev_freed_
pkt
s
;
u8
addr
[
ETH_ALEN
];
/* bitmap of TIDs where RX BA sessions are active for this link */
u8
ba_bitmap
;
};
struct
wl1271
{
...
...
@@ -405,7 +393,6 @@ struct wl1271 {
u8
*
fw
;
size_t
fw_len
;
u8
fw_bss_type
;
void
*
nvs
;
size_t
nvs_len
;
...
...
@@ -418,15 +405,30 @@ struct wl1271 {
u8
ssid
[
IEEE80211_MAX_SSID_LEN
+
1
];
u8
ssid_len
;
int
channel
;
u8
role_id
;
u8
dev_role_id
;
u8
system_hlid
;
u8
sta_hlid
;
u8
dev_hlid
;
u8
ap_global_hlid
;
u8
ap_bcast_hlid
;
unsigned
long
links_map
[
BITS_TO_LONGS
(
WL12XX_MAX_LINKS
)];
unsigned
long
roles_map
[
BITS_TO_LONGS
(
WL12XX_MAX_ROLES
)];
unsigned
long
roc_map
[
BITS_TO_LONGS
(
WL12XX_MAX_ROLES
)];
struct
wl1271_acx_mem_map
*
target_mem_map
;
/* Accounting for allocated / available TX blocks on HW */
u32
tx_blocks_freed
[
NUM_TX_QUEUES
]
;
u32
tx_blocks_freed
;
u32
tx_blocks_available
;
u32
tx_allocated_blocks
[
NUM_TX_QUEUES
]
;
u32
tx_allocated_blocks
;
u32
tx_results_count
;
/* Accounting for allocated / available Tx packets in HW */
u32
tx_pkts_freed
[
NUM_TX_QUEUES
];
u32
tx_allocated_pkts
[
NUM_TX_QUEUES
];
/* Transmitted TX packets counter for chipset interface */
u32
tx_packets_count
;
...
...
@@ -535,10 +537,6 @@ struct wl1271 {
struct
work_struct
rx_streaming_disable_work
;
struct
timer_list
rx_streaming_timer
;
unsigned
int
filters
;
unsigned
int
rx_config
;
unsigned
int
rx_filter
;
struct
completion
*
elp_compl
;
struct
completion
*
ps_compl
;
struct
delayed_work
elp_work
;
...
...
@@ -562,7 +560,7 @@ struct wl1271 {
u32
buffer_cmd
;
u32
buffer_busyword
[
WL1271_BUSY_WORD_CNT
];
struct
wl12
71_fw_full
_status
*
fw_status
;
struct
wl12
xx_fw
_status
*
fw_status
;
struct
wl1271_tx_hw_res_if
*
tx_res_if
;
struct
ieee80211_vif
*
vif
;
...
...
@@ -622,6 +620,9 @@ struct wl1271 {
/* Platform limitations */
unsigned
int
platform_quirks
;
/* number of currently active RX BA sessions */
int
ba_rx_session_count
;
};
struct
wl1271_station
{
...
...
@@ -659,12 +660,6 @@ size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen);
/* Each RX/TX transaction requires an end-of-transaction transfer */
#define WL12XX_QUIRK_END_OF_TRANSACTION BIT(0)
/*
* Older firmwares use 2 spare TX blocks
* (for STA < 6.1.3.50.58 or for AP < 6.2.0.0.47)
*/
#define WL12XX_QUIRK_USE_2_SPARE_BLOCKS BIT(1)
/* WL128X requires aggregated packets to be aligned to the SDIO block size */
#define WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT BIT(2)
...
...
drivers/net/wireless/wl12xx/wl12xx_80211.h
浏览文件 @
e0a8c583
...
...
@@ -105,18 +105,6 @@ struct wl12xx_ie_country {
/* Templates */
struct
wl12xx_beacon_template
{
struct
ieee80211_header
header
;
__le32
time_stamp
[
2
];
__le16
beacon_interval
;
__le16
capability
;
struct
wl12xx_ie_ssid
ssid
;
struct
wl12xx_ie_rates
rates
;
struct
wl12xx_ie_rates
ext_rates
;
struct
wl12xx_ie_ds_params
ds_params
;
struct
wl12xx_ie_country
country
;
}
__packed
;
struct
wl12xx_null_data_template
{
struct
ieee80211_header
header
;
}
__packed
;
...
...
@@ -146,19 +134,6 @@ struct wl12xx_arp_rsp_template {
__be32
target_ip
;
}
__packed
;
struct
wl12xx_probe_resp_template
{
struct
ieee80211_header
header
;
__le32
time_stamp
[
2
];
__le16
beacon_interval
;
__le16
capability
;
struct
wl12xx_ie_ssid
ssid
;
struct
wl12xx_ie_rates
rates
;
struct
wl12xx_ie_rates
ext_rates
;
struct
wl12xx_ie_ds_params
ds_params
;
struct
wl12xx_ie_country
country
;
}
__packed
;
struct
wl12xx_disconn_template
{
struct
ieee80211_header
header
;
__le16
disconn_reason
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录