Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
f3032be9
K
Kernel
项目概览
openeuler
/
Kernel
大约 1 年 前同步成功
通知
6
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f3032be9
编写于
7月 05, 2008
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-next-2.6
上级
70c03b49
18d72605
变更
45
展开全部
隐藏空白更改
内联
并排
Showing
45 changed file
with
2042 addition
and
2133 deletion
+2042
-2133
drivers/net/wireless/b43/rfkill.c
drivers/net/wireless/b43/rfkill.c
+19
-1
drivers/net/wireless/b43legacy/rfkill.c
drivers/net/wireless/b43legacy/rfkill.c
+19
-1
drivers/net/wireless/hostap/hostap_80211_rx.c
drivers/net/wireless/hostap/hostap_80211_rx.c
+21
-0
drivers/net/wireless/hostap/hostap_hw.c
drivers/net/wireless/hostap/hostap_hw.c
+1
-0
drivers/net/wireless/hostap/hostap_ioctl.c
drivers/net/wireless/hostap/hostap_ioctl.c
+4
-1
drivers/net/wireless/hostap/hostap_main.c
drivers/net/wireless/hostap/hostap_main.c
+1
-19
drivers/net/wireless/hostap/hostap_wlan.h
drivers/net/wireless/hostap/hostap_wlan.h
+13
-1
drivers/net/wireless/iwlwifi/Kconfig
drivers/net/wireless/iwlwifi/Kconfig
+0
-1
drivers/net/wireless/iwlwifi/iwl-3945.h
drivers/net/wireless/iwlwifi/iwl-3945.h
+25
-0
drivers/net/wireless/iwlwifi/iwl-4965-rs.c
drivers/net/wireless/iwlwifi/iwl-4965-rs.c
+1
-21
drivers/net/wireless/iwlwifi/iwl-4965-rs.h
drivers/net/wireless/iwlwifi/iwl-4965-rs.h
+0
-8
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-4965.c
+12
-983
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-5000.c
+12
-15
drivers/net/wireless/iwlwifi/iwl-calib.c
drivers/net/wireless/iwlwifi/iwl-calib.c
+2
-2
drivers/net/wireless/iwlwifi/iwl-calib.h
drivers/net/wireless/iwlwifi/iwl-calib.h
+2
-2
drivers/net/wireless/iwlwifi/iwl-commands.h
drivers/net/wireless/iwlwifi/iwl-commands.h
+7
-5
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-core.c
+48
-15
drivers/net/wireless/iwlwifi/iwl-core.h
drivers/net/wireless/iwlwifi/iwl-core.h
+15
-2
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-dev.h
+1
-19
drivers/net/wireless/iwlwifi/iwl-hcmd.c
drivers/net/wireless/iwlwifi/iwl-hcmd.c
+1
-0
drivers/net/wireless/iwlwifi/iwl-rfkill.c
drivers/net/wireless/iwlwifi/iwl-rfkill.c
+1
-40
drivers/net/wireless/iwlwifi/iwl-rfkill.h
drivers/net/wireless/iwlwifi/iwl-rfkill.h
+0
-2
drivers/net/wireless/iwlwifi/iwl-rx.c
drivers/net/wireless/iwlwifi/iwl-rx.c
+856
-0
drivers/net/wireless/iwlwifi/iwl-sta.c
drivers/net/wireless/iwlwifi/iwl-sta.c
+96
-53
drivers/net/wireless/iwlwifi/iwl-sta.h
drivers/net/wireless/iwlwifi/iwl-sta.h
+1
-1
drivers/net/wireless/iwlwifi/iwl-tx.c
drivers/net/wireless/iwlwifi/iwl-tx.c
+143
-0
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
+176
-69
drivers/net/wireless/iwlwifi/iwl4965-base.c
drivers/net/wireless/iwlwifi/iwl4965-base.c
+136
-303
drivers/net/wireless/p54/p54common.c
drivers/net/wireless/p54/p54common.c
+1
-0
include/net/mac80211.h
include/net/mac80211.h
+5
-0
net/mac80211/Kconfig
net/mac80211/Kconfig
+104
-58
net/mac80211/Makefile
net/mac80211/Makefile
+4
-14
net/mac80211/ieee80211_i.h
net/mac80211/ieee80211_i.h
+6
-0
net/mac80211/iface.c
net/mac80211/iface.c
+3
-3
net/mac80211/main.c
net/mac80211/main.c
+29
-6
net/mac80211/mesh_pathtbl.c
net/mac80211/mesh_pathtbl.c
+0
-1
net/mac80211/mlme.c
net/mac80211/mlme.c
+178
-248
net/mac80211/rate.h
net/mac80211/rate.h
+1
-3
net/mac80211/rc80211_pid_algo.c
net/mac80211/rc80211_pid_algo.c
+0
-10
net/mac80211/rx.c
net/mac80211/rx.c
+56
-147
net/mac80211/sta_info.c
net/mac80211/sta_info.c
+2
-0
net/mac80211/tx.c
net/mac80211/tx.c
+37
-40
net/mac80211/wep.c
net/mac80211/wep.c
+2
-11
net/mac80211/wme.c
net/mac80211/wme.c
+0
-1
net/mac80211/wpa.c
net/mac80211/wpa.c
+1
-27
未找到文件。
drivers/net/wireless/b43/rfkill.c
浏览文件 @
f3032be9
...
...
@@ -43,6 +43,23 @@ static bool b43_is_hw_radio_enabled(struct b43_wldev *dev)
return
0
;
}
/* Update the rfkill state */
static
void
b43_rfkill_update_state
(
struct
b43_wldev
*
dev
)
{
struct
b43_rfkill
*
rfk
=
&
(
dev
->
wl
->
rfkill
);
if
(
!
dev
->
radio_hw_enable
)
{
rfk
->
rfkill
->
state
=
RFKILL_STATE_HARD_BLOCKED
;
return
;
}
if
(
!
dev
->
phy
.
radio_on
)
rfk
->
rfkill
->
state
=
RFKILL_STATE_SOFT_BLOCKED
;
else
rfk
->
rfkill
->
state
=
RFKILL_STATE_UNBLOCKED
;
}
/* The poll callback for the hardware button. */
static
void
b43_rfkill_poll
(
struct
input_polled_dev
*
poll_dev
)
{
...
...
@@ -60,6 +77,7 @@ static void b43_rfkill_poll(struct input_polled_dev *poll_dev)
if
(
unlikely
(
enabled
!=
dev
->
radio_hw_enable
))
{
dev
->
radio_hw_enable
=
enabled
;
report_change
=
1
;
b43_rfkill_update_state
(
dev
);
b43info
(
wl
,
"Radio hardware status changed to %s
\n
"
,
enabled
?
"ENABLED"
:
"DISABLED"
);
}
...
...
@@ -135,7 +153,7 @@ void b43_rfkill_init(struct b43_wldev *dev)
snprintf
(
rfk
->
name
,
sizeof
(
rfk
->
name
),
"b43-%s"
,
wiphy_name
(
wl
->
hw
->
wiphy
));
rfk
->
rfkill
->
name
=
rfk
->
name
;
rfk
->
rfkill
->
state
=
RFKILL_STATE_
ON
;
rfk
->
rfkill
->
state
=
RFKILL_STATE_
UNBLOCKED
;
rfk
->
rfkill
->
data
=
dev
;
rfk
->
rfkill
->
toggle_radio
=
b43_rfkill_soft_toggle
;
rfk
->
rfkill
->
user_claim_unsupported
=
1
;
...
...
drivers/net/wireless/b43legacy/rfkill.c
浏览文件 @
f3032be9
...
...
@@ -44,6 +44,23 @@ static bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev)
return
0
;
}
/* Update the rfkill state */
static
void
b43legacy_rfkill_update_state
(
struct
b43legacy_wldev
*
dev
)
{
struct
b43legacy_rfkill
*
rfk
=
&
(
dev
->
wl
->
rfkill
);
if
(
!
dev
->
radio_hw_enable
)
{
rfk
->
rfkill
->
state
=
RFKILL_STATE_HARD_BLOCKED
;
return
;
}
if
(
!
dev
->
phy
.
radio_on
)
rfk
->
rfkill
->
state
=
RFKILL_STATE_SOFT_BLOCKED
;
else
rfk
->
rfkill
->
state
=
RFKILL_STATE_UNBLOCKED
;
}
/* The poll callback for the hardware button. */
static
void
b43legacy_rfkill_poll
(
struct
input_polled_dev
*
poll_dev
)
{
...
...
@@ -61,6 +78,7 @@ static void b43legacy_rfkill_poll(struct input_polled_dev *poll_dev)
if
(
unlikely
(
enabled
!=
dev
->
radio_hw_enable
))
{
dev
->
radio_hw_enable
=
enabled
;
report_change
=
1
;
b43legacy_rfkill_update_state
(
dev
);
b43legacyinfo
(
wl
,
"Radio hardware status changed to %s
\n
"
,
enabled
?
"ENABLED"
:
"DISABLED"
);
}
...
...
@@ -139,7 +157,7 @@ void b43legacy_rfkill_init(struct b43legacy_wldev *dev)
snprintf
(
rfk
->
name
,
sizeof
(
rfk
->
name
),
"b43legacy-%s"
,
wiphy_name
(
wl
->
hw
->
wiphy
));
rfk
->
rfkill
->
name
=
rfk
->
name
;
rfk
->
rfkill
->
state
=
RFKILL_STATE_
ON
;
rfk
->
rfkill
->
state
=
RFKILL_STATE_
UNBLOCKED
;
rfk
->
rfkill
->
data
=
dev
;
rfk
->
rfkill
->
toggle_radio
=
b43legacy_rfkill_soft_toggle
;
rfk
->
rfkill
->
user_claim_unsupported
=
1
;
...
...
drivers/net/wireless/hostap/hostap_80211_rx.c
浏览文件 @
f3032be9
...
...
@@ -78,6 +78,9 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb,
prism_header
=
2
;
phdrlen
=
sizeof
(
struct
linux_wlan_ng_cap_hdr
);
}
}
else
if
(
dev
->
type
==
ARPHRD_IEEE80211_RADIOTAP
)
{
prism_header
=
3
;
phdrlen
=
sizeof
(
struct
hostap_radiotap_rx
);
}
else
{
prism_header
=
0
;
phdrlen
=
0
;
...
...
@@ -165,6 +168,24 @@ hdr->f.status = s; hdr->f.len = l; hdr->f.data = d
hdr
->
ssi_noise
=
htonl
(
rx_stats
->
noise
);
hdr
->
preamble
=
htonl
(
0
);
/* unknown */
hdr
->
encoding
=
htonl
(
1
);
/* cck */
}
else
if
(
prism_header
==
3
)
{
struct
hostap_radiotap_rx
*
hdr
;
hdr
=
(
struct
hostap_radiotap_rx
*
)
skb_push
(
skb
,
phdrlen
);
memset
(
hdr
,
0
,
phdrlen
);
hdr
->
hdr
.
it_len
=
cpu_to_le16
(
phdrlen
);
hdr
->
hdr
.
it_present
=
cpu_to_le32
((
1
<<
IEEE80211_RADIOTAP_TSFT
)
|
(
1
<<
IEEE80211_RADIOTAP_CHANNEL
)
|
(
1
<<
IEEE80211_RADIOTAP_RATE
)
|
(
1
<<
IEEE80211_RADIOTAP_DBM_ANTSIGNAL
)
|
(
1
<<
IEEE80211_RADIOTAP_DBM_ANTNOISE
));
hdr
->
tsft
=
cpu_to_le64
(
rx_stats
->
mac_time
);
hdr
->
chan_freq
=
cpu_to_le16
(
freq_list
[
local
->
channel
-
1
]);
hdr
->
chan_flags
=
cpu_to_le16
(
IEEE80211_CHAN_CCK
|
IEEE80211_CHAN_2GHZ
);
hdr
->
rate
=
rx_stats
->
rate
/
5
;
hdr
->
dbm_antsignal
=
rx_stats
->
signal
;
hdr
->
dbm_antnoise
=
rx_stats
->
noise
;
}
ret
=
skb
->
len
-
phdrlen
;
...
...
drivers/net/wireless/hostap/hostap_hw.c
浏览文件 @
f3032be9
...
...
@@ -3204,6 +3204,7 @@ prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx,
local
->
auth_algs
=
PRISM2_AUTH_OPEN
|
PRISM2_AUTH_SHARED_KEY
;
local
->
sram_type
=
-
1
;
local
->
scan_channel_mask
=
0xffff
;
local
->
monitor_type
=
PRISM2_MONITOR_RADIOTAP
;
/* Initialize task queue structures */
INIT_WORK
(
&
local
->
reset_queue
,
handle_reset_queue
);
...
...
drivers/net/wireless/hostap/hostap_ioctl.c
浏览文件 @
f3032be9
...
...
@@ -897,6 +897,8 @@ static void hostap_monitor_set_type(local_info_t *local)
if
(
local
->
monitor_type
==
PRISM2_MONITOR_PRISM
||
local
->
monitor_type
==
PRISM2_MONITOR_CAPHDR
)
{
dev
->
type
=
ARPHRD_IEEE80211_PRISM
;
}
else
if
(
local
->
monitor_type
==
PRISM2_MONITOR_RADIOTAP
)
{
dev
->
type
=
ARPHRD_IEEE80211_RADIOTAP
;
}
else
{
dev
->
type
=
ARPHRD_IEEE80211
;
}
...
...
@@ -2520,7 +2522,8 @@ static int prism2_ioctl_priv_prism2_param(struct net_device *dev,
case
PRISM2_PARAM_MONITOR_TYPE
:
if
(
value
!=
PRISM2_MONITOR_80211
&&
value
!=
PRISM2_MONITOR_CAPHDR
&&
value
!=
PRISM2_MONITOR_PRISM
)
{
value
!=
PRISM2_MONITOR_PRISM
&&
value
!=
PRISM2_MONITOR_RADIOTAP
)
{
ret
=
-
EINVAL
;
break
;
}
...
...
drivers/net/wireless/hostap/hostap_main.c
浏览文件 @
f3032be9
...
...
@@ -596,25 +596,7 @@ void hostap_dump_tx_header(const char *name, const struct hfa384x_tx_frame *tx)
int
hostap_80211_header_parse
(
const
struct
sk_buff
*
skb
,
unsigned
char
*
haddr
)
{
struct
hostap_interface
*
iface
=
netdev_priv
(
skb
->
dev
);
local_info_t
*
local
=
iface
->
local
;
if
(
local
->
monitor_type
==
PRISM2_MONITOR_PRISM
||
local
->
monitor_type
==
PRISM2_MONITOR_CAPHDR
)
{
const
unsigned
char
*
mac
=
skb_mac_header
(
skb
);
if
(
*
(
u32
*
)
mac
==
LWNG_CAP_DID_BASE
)
{
memcpy
(
haddr
,
mac
+
sizeof
(
struct
linux_wlan_ng_prism_hdr
)
+
10
,
ETH_ALEN
);
/* addr2 */
}
else
{
/* (*(u32 *)mac == htonl(LWNG_CAPHDR_VERSION)) */
memcpy
(
haddr
,
mac
+
sizeof
(
struct
linux_wlan_ng_cap_hdr
)
+
10
,
ETH_ALEN
);
/* addr2 */
}
}
else
memcpy
(
haddr
,
skb_mac_header
(
skb
)
+
10
,
ETH_ALEN
);
/* addr2 */
memcpy
(
haddr
,
skb_mac_header
(
skb
)
+
10
,
ETH_ALEN
);
/* addr2 */
return
ETH_ALEN
;
}
...
...
drivers/net/wireless/hostap/hostap_wlan.h
浏览文件 @
f3032be9
...
...
@@ -5,6 +5,7 @@
#include <linux/netdevice.h>
#include <linux/mutex.h>
#include <net/iw_handler.h>
#include <net/ieee80211_radiotap.h>
#include "hostap_config.h"
#include "hostap_common.h"
...
...
@@ -55,6 +56,17 @@ struct linux_wlan_ng_cap_hdr {
__be32
encoding
;
}
__attribute__
((
packed
));
struct
hostap_radiotap_rx
{
struct
ieee80211_radiotap_header
hdr
;
__le64
tsft
;
u8
rate
;
u8
padding
;
__le16
chan_freq
;
__le16
chan_flags
;
s8
dbm_antsignal
;
s8
dbm_antnoise
;
}
__attribute__
((
packed
));
#define LWNG_CAP_DID_BASE (4 | (1 << 6))
/* section 4, group 1 */
#define LWNG_CAPHDR_VERSION 0x80211001
...
...
@@ -734,7 +746,7 @@ struct local_info {
unsigned
long
scan_timestamp
;
/* Time started to scan */
enum
{
PRISM2_MONITOR_80211
=
0
,
PRISM2_MONITOR_PRISM
=
1
,
PRISM2_MONITOR_CAPHDR
=
2
PRISM2_MONITOR_CAPHDR
=
2
,
PRISM2_MONITOR_RADIOTAP
=
3
}
monitor_type
;
int
monitor_allow_fcserr
;
...
...
drivers/net/wireless/iwlwifi/Kconfig
浏览文件 @
f3032be9
...
...
@@ -8,7 +8,6 @@ config IWLCORE
select MAC80211_LEDS if IWLWIFI_LEDS
select LEDS_CLASS if IWLWIFI_LEDS
select RFKILL if IWLWIFI_RFKILL
select RFKILL_INPUT if (IWLWIFI_RFKILL && INPUT)
config IWLWIFI_LEDS
bool
...
...
drivers/net/wireless/iwlwifi/iwl-3945.h
浏览文件 @
f3032be9
...
...
@@ -36,6 +36,10 @@
#include <linux/kernel.h>
#include <net/ieee80211_radiotap.h>
/*used for rfkill*/
#include <linux/rfkill.h>
#include <linux/input.h>
/* Hardware specific file defines the PCI IDs table for that hardware module */
extern
struct
pci_device_id
iwl3945_hw_card_ids
[];
...
...
@@ -686,6 +690,23 @@ enum {
#endif
#ifdef CONFIG_IWLWIFI_RFKILL
struct
iwl3945_priv
;
struct
iwl3945_rfkill_mngr
{
struct
rfkill
*
rfkill
;
struct
input_dev
*
input_dev
;
};
void
iwl3945_rfkill_set_hw_state
(
struct
iwl3945_priv
*
priv
);
void
iwl3945_rfkill_unregister
(
struct
iwl3945_priv
*
priv
);
int
iwl3945_rfkill_init
(
struct
iwl3945_priv
*
priv
);
#else
static
inline
void
iwl3945_rfkill_set_hw_state
(
struct
iwl3945_priv
*
priv
)
{}
static
inline
void
iwl3945_rfkill_unregister
(
struct
iwl3945_priv
*
priv
)
{}
static
inline
int
iwl3945_rfkill_init
(
struct
iwl3945_priv
*
priv
)
{
return
0
;
}
#endif
#define IWL_MAX_NUM_QUEUES IWL39_MAX_NUM_QUEUES
struct
iwl3945_priv
{
...
...
@@ -779,6 +800,10 @@ struct iwl3945_priv {
struct
iwl3945_init_alive_resp
card_alive_init
;
struct
iwl3945_alive_resp
card_alive
;
#ifdef CONFIG_IWLWIFI_RFKILL
struct
iwl3945_rfkill_mngr
rfkill_mngr
;
#endif
#ifdef CONFIG_IWL3945_LEDS
struct
iwl3945_led
led
[
IWL_LED_TRG_MAX
];
unsigned
long
last_blink_time
;
...
...
drivers/net/wireless/iwlwifi/iwl-4965-rs.c
浏览文件 @
f3032be9
...
...
@@ -822,9 +822,6 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,
lq_sta
=
(
struct
iwl4965_lq_sta
*
)
sta
->
rate_ctrl_priv
;
if
(
!
priv
->
lq_mngr
.
lq_ready
)
goto
out
;
if
((
priv
->
iw_mode
==
IEEE80211_IF_TYPE_IBSS
)
&&
!
lq_sta
->
ibss_sta_added
)
goto
out
;
...
...
@@ -1678,10 +1675,6 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
if
(
!
sta
||
!
sta
->
rate_ctrl_priv
)
return
;
if
(
!
priv
->
lq_mngr
.
lq_ready
)
{
IWL_DEBUG_RATE
(
"still rate scaling not ready
\n
"
);
return
;
}
lq_sta
=
(
struct
iwl4965_lq_sta
*
)
sta
->
rate_ctrl_priv
;
tid
=
rs_tl_add_packet
(
lq_sta
,
hdr
);
...
...
@@ -2140,11 +2133,8 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
lq_sta
->
ibss_sta_added
=
1
;
rs_initialize_lq
(
priv
,
conf
,
sta
);
}
if
(
!
lq_sta
->
ibss_sta_added
)
goto
done
;
}
done:
if
((
i
<
0
)
||
(
i
>
IWL_RATE_COUNT
))
{
sel
->
rate_idx
=
rate_lowest_index
(
local
,
sband
,
sta
);
goto
out
;
...
...
@@ -2279,9 +2269,6 @@ static void rs_rate_init(void *priv_rate, void *priv_sta,
lq_sta
->
drv
=
priv
;
#endif
if
(
priv
->
assoc_station_added
)
priv
->
lq_mngr
.
lq_ready
=
1
;
rs_initialize_lq
(
priv
,
conf
,
sta
);
}
...
...
@@ -2421,7 +2408,7 @@ static void rs_clear(void *priv_rate)
IWL_DEBUG_RATE
(
"enter
\n
"
);
priv
->
lq_mngr
.
lq_ready
=
0
;
/* TODO - add rate scale state reset */
IWL_DEBUG_RATE
(
"leave
\n
"
);
}
...
...
@@ -2716,13 +2703,6 @@ int iwl4965_fill_rs_info(struct ieee80211_hw *hw, char *buf, u8 sta_id)
return
cnt
;
}
void
iwl4965_rate_scale_init
(
struct
ieee80211_hw
*
hw
,
s32
sta_id
)
{
struct
iwl_priv
*
priv
=
hw
->
priv
;
priv
->
lq_mngr
.
lq_ready
=
1
;
}
int
iwl4965_rate_control_register
(
void
)
{
return
ieee80211_rate_control_register
(
&
rs_ops
);
...
...
drivers/net/wireless/iwlwifi/iwl-4965-rs.h
浏览文件 @
f3032be9
...
...
@@ -295,14 +295,6 @@ static inline u8 iwl4965_get_prev_ieee_rate(u8 rate_index)
*/
extern
int
iwl4965_fill_rs_info
(
struct
ieee80211_hw
*
,
char
*
buf
,
u8
sta_id
);
/**
* iwl4965_rate_scale_init - Initialize the rate scale table based on assoc info
*
* The specific throughput table used is based on the type of network
* the associated with, including A, B, G, and G w/ TGG protection
*/
extern
void
iwl4965_rate_scale_init
(
struct
ieee80211_hw
*
hw
,
s32
sta_id
);
/**
* iwl4965_rate_control_register - Register the rate control algorithm callbacks
*
...
...
drivers/net/wireless/iwlwifi/iwl-4965.c
浏览文件 @
f3032be9
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-5000.c
浏览文件 @
f3032be9
...
...
@@ -675,7 +675,7 @@ static void iwl5000_init_alive_start(struct iwl_priv *priv)
goto
restart
;
}
iwl
core
_clear_stations_table
(
priv
);
iwl_clear_stations_table
(
priv
);
ret
=
priv
->
cfg
->
ops
->
lib
->
alive_notify
(
priv
);
if
(
ret
)
{
IWL_WARNING
(
"Could not complete ALIVE transition: %d
\n
"
,
ret
);
...
...
@@ -807,11 +807,8 @@ static int iwl5000_alive_notify(struct iwl_priv *priv)
iwl5000_send_Xtal_calib
(
priv
);
if
(
priv
->
ucode_type
==
UCODE_RT
)
{
if
(
priv
->
ucode_type
==
UCODE_RT
)
iwl5000_send_calib_results
(
priv
);
set_bit
(
STATUS_READY
,
&
priv
->
status
);
priv
->
is_open
=
1
;
}
return
0
;
}
...
...
@@ -827,19 +824,11 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
priv
->
hw_params
.
max_txq_num
=
priv
->
cfg
->
mod_params
->
num_of_queues
;
priv
->
hw_params
.
first_ampdu_q
=
IWL50_FIRST_AMPDU_QUEUE
;
priv
->
hw_params
.
sw_crypto
=
priv
->
cfg
->
mod_params
->
sw_crypto
;
priv
->
hw_params
.
max_rxq_size
=
RX_QUEUE_SIZE
;
priv
->
hw_params
.
max_rxq_log
=
RX_QUEUE_SIZE_LOG
;
if
(
priv
->
cfg
->
mod_params
->
amsdu_size_8K
)
priv
->
hw_params
.
rx_buf_size
=
IWL_RX_BUF_SIZE_8K
;
else
priv
->
hw_params
.
rx_buf_size
=
IWL_RX_BUF_SIZE_4K
;
priv
->
hw_params
.
max_pkt_size
=
priv
->
hw_params
.
rx_buf_size
-
256
;
priv
->
hw_params
.
max_stations
=
IWL5000_STATION_COUNT
;
priv
->
hw_params
.
bcast_sta_id
=
IWL5000_BROADCAST_ID
;
priv
->
hw_params
.
max_data_size
=
IWL50_RTC_DATA_SIZE
;
priv
->
hw_params
.
max_inst_size
=
IWL50_RTC_INST_SIZE
;
priv
->
hw_params
.
max_bsm_size
=
BSM_SRAM_SIZE
;
priv
->
hw_params
.
max_bsm_size
=
0
;
priv
->
hw_params
.
fat_channel
=
BIT
(
IEEE80211_BAND_2GHZ
)
|
BIT
(
IEEE80211_BAND_5GHZ
);
priv
->
hw_params
.
sens
=
&
iwl5000_sensitivity
;
...
...
@@ -1426,13 +1415,18 @@ static int iwl5000_send_tx_power(struct iwl_priv *priv)
/* half dBm need to multiply */
tx_power_cmd
.
global_lmt
=
(
s8
)(
2
*
priv
->
tx_power_user_lmt
);
tx_power_cmd
.
flags
=
0
;
tx_power_cmd
.
flags
=
IWL50_TX_POWER_NO_CLOSED
;
tx_power_cmd
.
srv_chan_lmt
=
IWL50_TX_POWER_AUTO
;
return
iwl_send_cmd_pdu_async
(
priv
,
REPLY_TX_POWER_DBM_CMD
,
sizeof
(
tx_power_cmd
),
&
tx_power_cmd
,
NULL
);
}
static
void
iwl5000_temperature
(
struct
iwl_priv
*
priv
)
{
/* store temperature from statistics (in Celsius) */
priv
->
temperature
=
le32_to_cpu
(
priv
->
statistics
.
general
.
temperature
);
}
static
struct
iwl_hcmd_ops
iwl5000_hcmd
=
{
.
rxon_assoc
=
iwl5000_send_rxon_assoc
,
...
...
@@ -1462,6 +1456,7 @@ static struct iwl_lib_ops iwl5000_lib = {
.
init_alive_start
=
iwl5000_init_alive_start
,
.
alive_notify
=
iwl5000_alive_notify
,
.
send_tx_power
=
iwl5000_send_tx_power
,
.
temperature
=
iwl5000_temperature
,
.
apm_ops
=
{
.
init
=
iwl5000_apm_init
,
.
reset
=
iwl5000_apm_reset
,
...
...
@@ -1541,6 +1536,8 @@ module_param_named(queues_num50, iwl50_mod_params.num_of_queues, int, 0444);
MODULE_PARM_DESC
(
queues_num50
,
"number of hw queues in 50xx series"
);
module_param_named
(
qos_enable50
,
iwl50_mod_params
.
enable_qos
,
int
,
0444
);
MODULE_PARM_DESC
(
qos_enable50
,
"enable all 50XX QoS functionality"
);
module_param_named
(
11
n_disable50
,
iwl50_mod_params
.
disable_11n
,
int
,
0444
);
MODULE_PARM_DESC
(
11
n_disable50
,
"disable 50XX 11n functionality"
);
module_param_named
(
amsdu_size_8K50
,
iwl50_mod_params
.
amsdu_size_8K
,
int
,
0444
);
MODULE_PARM_DESC
(
amsdu_size_8K50
,
"enable 8K amsdu size in 50XX series"
);
module_param_named
(
fw_restart50
,
iwl50_mod_params
.
restart_fw
,
int
,
0444
);
...
...
drivers/net/wireless/iwlwifi/iwl-calib.c
浏览文件 @
f3032be9
...
...
@@ -470,7 +470,7 @@ void iwl_init_sensitivity(struct iwl_priv *priv)
EXPORT_SYMBOL
(
iwl_init_sensitivity
);
void
iwl_sensitivity_calibration
(
struct
iwl_priv
*
priv
,
struct
iwl
4965
_notif_statistics
*
resp
)
struct
iwl_notif_statistics
*
resp
)
{
u32
rx_enable_time
;
u32
fa_cck
;
...
...
@@ -584,7 +584,7 @@ EXPORT_SYMBOL(iwl_sensitivity_calibration);
* 2) Differential rx gain settings to balance the 3 receivers.
*/
void
iwl_chain_noise_calibration
(
struct
iwl_priv
*
priv
,
struct
iwl4965
_notif_statistics
*
stat_resp
)
struct
iwl
_notif_statistics
*
stat_resp
)
{
struct
iwl_chain_noise_data
*
data
=
NULL
;
...
...
drivers/net/wireless/iwlwifi/iwl-calib.h
浏览文件 @
f3032be9
...
...
@@ -67,9 +67,9 @@
#include "iwl-commands.h"
void
iwl_chain_noise_calibration
(
struct
iwl_priv
*
priv
,
struct
iwl
4965
_notif_statistics
*
stat_resp
);
struct
iwl_notif_statistics
*
stat_resp
);
void
iwl_sensitivity_calibration
(
struct
iwl_priv
*
priv
,
struct
iwl
4965
_notif_statistics
*
resp
);
struct
iwl_notif_statistics
*
resp
);
void
iwl_init_sensitivity
(
struct
iwl_priv
*
priv
);
void
iwl_reset_run_time_calib
(
struct
iwl_priv
*
priv
);
...
...
drivers/net/wireless/iwlwifi/iwl-commands.h
浏览文件 @
f3032be9
...
...
@@ -336,6 +336,8 @@ struct iwl4965_tx_power_db {
* struct iwl5000_tx_power_dbm_cmd
*/
#define IWL50_TX_POWER_AUTO 0x7f
#define IWL50_TX_POWER_NO_CLOSED (0x1 << 6)
struct
iwl5000_tx_power_dbm_cmd
{
s8
global_lmt
;
/*in half-dBm (e.g. 30 = 15 dBm) */
u8
flags
;
...
...
@@ -1534,7 +1536,7 @@ struct iwl5000_tx_resp {
*
* Reports Block-Acknowledge from recipient station
*/
struct
iwl
4965
_compressed_ba_resp
{
struct
iwl_compressed_ba_resp
{
__le32
sta_addr_lo32
;
__le16
sta_addr_hi16
;
__le16
reserved
;
...
...
@@ -2504,7 +2506,7 @@ struct statistics_general {
*/
#define IWL_STATS_CONF_CLEAR_STATS __constant_cpu_to_le32(0x1)
/* see above */
#define IWL_STATS_CONF_DISABLE_NOTIF __constant_cpu_to_le32(0x2)
/* see above */
struct
iwl
4965
_statistics_cmd
{
struct
iwl_statistics_cmd
{
__le32
configuration_flags
;
/* IWL_STATS_CONF_* */
}
__attribute__
((
packed
));
...
...
@@ -2525,7 +2527,7 @@ struct iwl4965_statistics_cmd {
*/
#define STATISTICS_REPLY_FLG_BAND_24G_MSK __constant_cpu_to_le32(0x2)
#define STATISTICS_REPLY_FLG_FAT_MODE_MSK __constant_cpu_to_le32(0x8)
struct
iwl
4965
_notif_statistics
{
struct
iwl_notif_statistics
{
__le32
flag
;
struct
statistics_rx
rx
;
struct
statistics_tx
tx
;
...
...
@@ -2998,8 +3000,8 @@ struct iwl_rx_packet {
struct
iwl_rem_sta_resp
rem_sta
;
struct
iwl4965_sleep_notification
sleep_notif
;
struct
iwl4965_spectrum_resp
spectrum
;
struct
iwl
4965
_notif_statistics
stats
;
struct
iwl
4965
_compressed_ba_resp
compressed_ba
;
struct
iwl_notif_statistics
stats
;
struct
iwl_compressed_ba_resp
compressed_ba
;
struct
iwl4965_missed_beacon_notif
missed_beacon
;
struct
iwl5000_calibration
calib
;
__le32
status
;
...
...
drivers/net/wireless/iwlwifi/iwl-core.c
浏览文件 @
f3032be9
...
...
@@ -273,22 +273,27 @@ int iwl_hw_nic_init(struct iwl_priv *priv)
EXPORT_SYMBOL
(
iwl_hw_nic_init
);
/**
* iwl
core
_clear_stations_table - Clear the driver's station table
* iwl_clear_stations_table - Clear the driver's station table
*
* NOTE: This does not clear or otherwise alter the device's station table.
*/
void
iwl
core
_clear_stations_table
(
struct
iwl_priv
*
priv
)
void
iwl_clear_stations_table
(
struct
iwl_priv
*
priv
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
priv
->
sta_lock
,
flags
);
if
(
iwl_is_alive
(
priv
)
&&
!
test_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
)
&&
iwl_send_cmd_pdu_async
(
priv
,
REPLY_REMOVE_ALL_STA
,
0
,
NULL
,
NULL
))
IWL_ERROR
(
"Couldn't clear the station table
\n
"
);
priv
->
num_stations
=
0
;
memset
(
priv
->
stations
,
0
,
sizeof
(
priv
->
stations
));
spin_unlock_irqrestore
(
&
priv
->
sta_lock
,
flags
);
}
EXPORT_SYMBOL
(
iwl
core
_clear_stations_table
);
EXPORT_SYMBOL
(
iwl_clear_stations_table
);
void
iwl_reset_qos
(
struct
iwl_priv
*
priv
)
{
...
...
@@ -490,7 +495,9 @@ static int iwlcore_init_geos(struct iwl_priv *priv)
sband
->
bitrates
=
&
rates
[
IWL_FIRST_OFDM_RATE
];
sband
->
n_bitrates
=
IWL_RATE_COUNT
-
IWL_FIRST_OFDM_RATE
;
iwlcore_init_ht_hw_capab
(
priv
,
&
sband
->
ht_info
,
IEEE80211_BAND_5GHZ
);
if
(
priv
->
cfg
->
sku
&
IWL_SKU_N
)
iwlcore_init_ht_hw_capab
(
priv
,
&
sband
->
ht_info
,
IEEE80211_BAND_5GHZ
);
sband
=
&
priv
->
bands
[
IEEE80211_BAND_2GHZ
];
sband
->
channels
=
channels
;
...
...
@@ -498,7 +505,9 @@ static int iwlcore_init_geos(struct iwl_priv *priv)
sband
->
bitrates
=
rates
;
sband
->
n_bitrates
=
IWL_RATE_COUNT
;
iwlcore_init_ht_hw_capab
(
priv
,
&
sband
->
ht_info
,
IEEE80211_BAND_2GHZ
);
if
(
priv
->
cfg
->
sku
&
IWL_SKU_N
)
iwlcore_init_ht_hw_capab
(
priv
,
&
sband
->
ht_info
,
IEEE80211_BAND_2GHZ
);
priv
->
ieee_channels
=
channels
;
priv
->
ieee_rates
=
rates
;
...
...
@@ -814,8 +823,9 @@ int iwl_setup_mac(struct iwl_priv *priv)
IEEE80211_HW_NOISE_DBM
;
/* Default value; 4 EDCA QOS priorities */
hw
->
queues
=
4
;
/* Enhanced value; more queues, to support 11n aggregation */
hw
->
ampdu_queues
=
12
;
/* queues to support 11n aggregation */
if
(
priv
->
cfg
->
sku
&
IWL_SKU_N
)
hw
->
ampdu_queues
=
12
;
hw
->
conf
.
beacon_int
=
100
;
...
...
@@ -837,11 +847,28 @@ int iwl_setup_mac(struct iwl_priv *priv)
}
EXPORT_SYMBOL
(
iwl_setup_mac
);
int
iwl_set_hw_params
(
struct
iwl_priv
*
priv
)
{
priv
->
hw_params
.
sw_crypto
=
priv
->
cfg
->
mod_params
->
sw_crypto
;
priv
->
hw_params
.
max_rxq_size
=
RX_QUEUE_SIZE
;
priv
->
hw_params
.
max_rxq_log
=
RX_QUEUE_SIZE_LOG
;
if
(
priv
->
cfg
->
mod_params
->
amsdu_size_8K
)
priv
->
hw_params
.
rx_buf_size
=
IWL_RX_BUF_SIZE_8K
;
else
priv
->
hw_params
.
rx_buf_size
=
IWL_RX_BUF_SIZE_4K
;
priv
->
hw_params
.
max_pkt_size
=
priv
->
hw_params
.
rx_buf_size
-
256
;
if
(
priv
->
cfg
->
mod_params
->
disable_11n
)
priv
->
cfg
->
sku
&=
~
IWL_SKU_N
;
/* Device-specific setup */
return
priv
->
cfg
->
ops
->
lib
->
set_hw_params
(
priv
);
}
EXPORT_SYMBOL
(
iwl_set_hw_params
);
int
iwl_init_drv
(
struct
iwl_priv
*
priv
)
{
int
ret
;
int
i
;
priv
->
retry_rate
=
1
;
priv
->
ibss_beacon
=
NULL
;
...
...
@@ -852,15 +879,12 @@ int iwl_init_drv(struct iwl_priv *priv)
spin_lock_init
(
&
priv
->
hcmd_lock
);
spin_lock_init
(
&
priv
->
lq_mngr
.
lock
);
for
(
i
=
0
;
i
<
IWL_IBSS_MAC_HASH_SIZE
;
i
++
)
INIT_LIST_HEAD
(
&
priv
->
ibss_mac_hash
[
i
]);
INIT_LIST_HEAD
(
&
priv
->
free_frames
);
mutex_init
(
&
priv
->
mutex
);
/* Clear the driver's (not device's) station table */
iwl
core
_clear_stations_table
(
priv
);
iwl_clear_stations_table
(
priv
);
priv
->
data_retry_limit
=
-
1
;
priv
->
ieee_channels
=
NULL
;
...
...
@@ -1383,7 +1407,14 @@ int iwl_radio_kill_sw_enable_radio(struct iwl_priv *priv)
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
iwl_write32
(
priv
,
CSR_UCODE_DRV_GP1_CLR
,
CSR_UCODE_SW_BIT_RFKILL
);
clear_bit
(
STATUS_RF_KILL_SW
,
&
priv
->
status
);
/* If the driver is up it will receive CARD_STATE_NOTIFICATION
* notification where it will clear SW rfkill status.
* Setting it here would break the handler. Only if the
* interface is down we can set here since we don't
* receive any further notification.
*/
if
(
!
priv
->
is_open
)
clear_bit
(
STATUS_RF_KILL_SW
,
&
priv
->
status
);
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
/* wake up ucode */
...
...
@@ -1401,8 +1432,10 @@ int iwl_radio_kill_sw_enable_radio(struct iwl_priv *priv)
return
0
;
}
if
(
priv
->
is_open
)
queue_work
(
priv
->
workqueue
,
&
priv
->
restart
);
/* If the driver is already loaded, it will receive
* CARD_STATE_NOTIFICATION notifications and the handler will
* call restart to reload the driver.
*/
return
1
;
}
EXPORT_SYMBOL
(
iwl_radio_kill_sw_enable_radio
);
drivers/net/wireless/iwlwifi/iwl-core.h
浏览文件 @
f3032be9
...
...
@@ -140,6 +140,7 @@ struct iwl_lib_ops {
int
(
*
set_power
)(
struct
iwl_priv
*
priv
,
void
*
cmd
);
int
(
*
send_tx_power
)
(
struct
iwl_priv
*
priv
);
void
(
*
update_chain_flags
)(
struct
iwl_priv
*
priv
);
void
(
*
temperature
)
(
struct
iwl_priv
*
priv
);
/* eeprom operations (as defined in iwl-eeprom.h) */
struct
iwl_eeprom_ops
eeprom_ops
;
};
...
...
@@ -157,6 +158,7 @@ struct iwl_mod_params {
int
disable_hw_scan
;
/* def: 0 = use h/w scan */
int
num_of_queues
;
/* def: HW dependent */
int
enable_qos
;
/* def: 1 = use quality of service */
int
disable_11n
;
/* def: 0 = disable 11n capabilities */
int
amsdu_size_8K
;
/* def: 1 = enable 8K amsdu size */
int
antenna
;
/* def: 0 = both antennas (use diversity) */
int
restart_fw
;
/* def: 1 = restart firmware */
...
...
@@ -179,7 +181,7 @@ struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
struct
ieee80211_ops
*
hw_ops
);
void
iwl_hw_detect
(
struct
iwl_priv
*
priv
);
void
iwl
core
_clear_stations_table
(
struct
iwl_priv
*
priv
);
void
iwl_clear_stations_table
(
struct
iwl_priv
*
priv
);
void
iwl_free_calib_results
(
struct
iwl_priv
*
priv
);
void
iwl_reset_qos
(
struct
iwl_priv
*
priv
);
void
iwl_set_rxon_chain
(
struct
iwl_priv
*
priv
);
...
...
@@ -191,6 +193,7 @@ u8 iwl_is_fat_tx_allowed(struct iwl_priv *priv,
struct
ieee80211_ht_info
*
sta_ht_inf
);
int
iwl_hw_nic_init
(
struct
iwl_priv
*
priv
);
int
iwl_setup_mac
(
struct
iwl_priv
*
priv
);
int
iwl_set_hw_params
(
struct
iwl_priv
*
priv
);
int
iwl_init_drv
(
struct
iwl_priv
*
priv
);
void
iwl_uninit_drv
(
struct
iwl_priv
*
priv
);
/* "keep warm" functions */
...
...
@@ -209,6 +212,8 @@ int iwl_rx_queue_update_write_ptr(struct iwl_priv *priv,
void
iwl_rx_queue_reset
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_queue
*
rxq
);
void
iwl_rx_replenish
(
struct
iwl_priv
*
priv
);
int
iwl_rx_init
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_queue
*
rxq
);
int
iwl_rx_agg_start
(
struct
iwl_priv
*
priv
,
const
u8
*
addr
,
int
tid
,
u16
ssn
);
int
iwl_rx_agg_stop
(
struct
iwl_priv
*
priv
,
const
u8
*
addr
,
int
tid
);
/* FIXME: remove when TX is moved to iwl core */
int
iwl_rx_queue_restock
(
struct
iwl_priv
*
priv
);
int
iwl_rx_queue_space
(
const
struct
iwl_rx_queue
*
q
);
...
...
@@ -218,6 +223,8 @@ int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index);
/* Handlers */
void
iwl_rx_missed_beacon_notif
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_mem_buffer
*
rxb
);
void
iwl_rx_statistics
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_mem_buffer
*
rxb
);
/* TX helpers */
...
...
@@ -368,7 +375,13 @@ extern void iwl_rf_kill_ct_config(struct iwl_priv *priv);
extern
int
iwl_send_statistics_request
(
struct
iwl_priv
*
priv
,
u8
flags
);
extern
int
iwl_verify_ucode
(
struct
iwl_priv
*
priv
);
extern
int
iwl_send_lq_cmd
(
struct
iwl_priv
*
priv
,
struct
iwl_link_quality_cmd
*
lq
,
u8
flags
);
struct
iwl_link_quality_cmd
*
lq
,
u8
flags
);
extern
void
iwl_rx_reply_rx
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_mem_buffer
*
rxb
);
extern
void
iwl_rx_reply_rx_phy
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_mem_buffer
*
rxb
);
void
iwl_rx_reply_compressed_ba
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_mem_buffer
*
rxb
);
static
inline
int
iwl_send_rxon_assoc
(
struct
iwl_priv
*
priv
)
{
...
...
drivers/net/wireless/iwlwifi/iwl-dev.h
浏览文件 @
f3032be9
...
...
@@ -591,11 +591,6 @@ extern int iwl_send_add_sta(struct iwl_priv *priv,
struct
iwl_addsta_cmd
*
sta
,
u8
flags
);
u8
iwl_add_station_flags
(
struct
iwl_priv
*
priv
,
const
u8
*
addr
,
int
is_ap
,
u8
flags
,
struct
ieee80211_ht_info
*
ht_info
);
extern
int
iwl4965_is_network_packet
(
struct
iwl_priv
*
priv
,
struct
ieee80211_hdr
*
header
);
extern
int
iwl4965_is_duplicate_packet
(
struct
iwl_priv
*
priv
,
struct
ieee80211_hdr
*
header
);
extern
int
iwl4965_calc_sig_qual
(
int
rssi_dbm
,
int
noise_dbm
);
extern
unsigned
int
iwl4965_fill_beacon_frame
(
struct
iwl_priv
*
priv
,
struct
ieee80211_hdr
*
hdr
,
const
u8
*
dest
,
int
left
);
...
...
@@ -624,11 +619,7 @@ extern int iwl_rxq_stop(struct iwl_priv *priv);
extern
void
iwl_txq_ctx_stop
(
struct
iwl_priv
*
priv
);
extern
unsigned
int
iwl4965_hw_get_beacon_cmd
(
struct
iwl_priv
*
priv
,
struct
iwl_frame
*
frame
,
u8
rate
);
extern
void
iwl4965_hw_rx_statistics
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_mem_buffer
*
rxb
);
extern
void
iwl4965_disable_events
(
struct
iwl_priv
*
priv
);
extern
void
iwl4965_rx_reply_rx
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_mem_buffer
*
rxb
);
extern
int
iwl4965_hw_channel_switch
(
struct
iwl_priv
*
priv
,
u16
channel
);
extern
int
iwl_queue_space
(
const
struct
iwl_queue
*
q
);
...
...
@@ -702,7 +693,6 @@ struct iwl4965_lq_mngr {
unsigned
long
stamp_last
;
u32
flush_time
;
u32
tx_packets
;
u8
lq_ready
;
};
/* Sensitivity and chain noise calibration */
...
...
@@ -994,7 +984,7 @@ struct iwl_priv {
struct
iwl_power_mgr
power_data
;
struct
iwl
4965
_notif_statistics
statistics
;
struct
iwl_notif_statistics
statistics
;
unsigned
long
last_statistics_time
;
/* context information */
...
...
@@ -1026,14 +1016,6 @@ struct iwl_priv {
u32
last_beacon_time
;
u64
last_tsf
;
/* Duplicate packet detection */
u16
last_seq_num
;
u16
last_frag_num
;
unsigned
long
last_packet_time
;
/* Hash table for finding stations in IBSS network */
struct
list_head
ibss_mac_hash
[
IWL_IBSS_MAC_HASH_SIZE
];
/* eeprom */
u8
*
eeprom
;
struct
iwl_eeprom_calib_info
*
calib_info
;
...
...
drivers/net/wireless/iwlwifi/iwl-hcmd.c
浏览文件 @
f3032be9
...
...
@@ -93,6 +93,7 @@ const char *get_cmd_string(u8 cmd)
IWL_CMD
(
CALIBRATION_CFG_CMD
);
IWL_CMD
(
CALIBRATION_RES_NOTIFICATION
);
IWL_CMD
(
CALIBRATION_COMPLETE_NOTIFICATION
);
IWL_CMD
(
REPLY_TX_POWER_DBM_CMD
);
default:
return
"UNKNOWN"
;
...
...
drivers/net/wireless/iwlwifi/iwl-rfkill.c
浏览文件 @
f3032be9
...
...
@@ -50,7 +50,7 @@ static int iwl_rfkill_soft_rf_kill(void *data, enum rfkill_state state)
if
(
test_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
))
return
0
;
IWL_DEBUG_RF_KILL
(
"we rec
ie
ved soft RFKILL set to state %d
\n
"
,
state
);
IWL_DEBUG_RF_KILL
(
"we rec
ei
ved soft RFKILL set to state %d
\n
"
,
state
);
mutex_lock
(
&
priv
->
mutex
);
switch
(
state
)
{
...
...
@@ -98,36 +98,11 @@ int iwl_rfkill_init(struct iwl_priv *priv)
priv
->
rfkill_mngr
.
rfkill
->
dev
.
class
->
suspend
=
NULL
;
priv
->
rfkill_mngr
.
rfkill
->
dev
.
class
->
resume
=
NULL
;
#if defined(CONFIG_RFKILL_INPUT) || defined(CONFIG_RFKILL_INPUT_MODULE)
priv
->
rfkill_mngr
.
input_dev
=
input_allocate_device
();
if
(
!
priv
->
rfkill_mngr
.
input_dev
)
{
IWL_ERROR
(
"Unable to allocate rfkill input device.
\n
"
);
ret
=
-
ENOMEM
;
goto
freed_rfkill
;
}
priv
->
rfkill_mngr
.
input_dev
->
name
=
priv
->
cfg
->
name
;
priv
->
rfkill_mngr
.
input_dev
->
phys
=
wiphy_name
(
priv
->
hw
->
wiphy
);
priv
->
rfkill_mngr
.
input_dev
->
id
.
bustype
=
BUS_HOST
;
priv
->
rfkill_mngr
.
input_dev
->
id
.
vendor
=
priv
->
pci_dev
->
vendor
;
priv
->
rfkill_mngr
.
input_dev
->
dev
.
parent
=
device
;
priv
->
rfkill_mngr
.
input_dev
->
evbit
[
0
]
=
BIT
(
EV_KEY
);
set_bit
(
KEY_WLAN
,
priv
->
rfkill_mngr
.
input_dev
->
keybit
);
#endif
ret
=
rfkill_register
(
priv
->
rfkill_mngr
.
rfkill
);
if
(
ret
)
{
IWL_ERROR
(
"Unable to register rfkill: %d
\n
"
,
ret
);
goto
free_input_dev
;
}
#if defined(CONFIG_RFKILL_INPUT) || defined(CONFIG_RFKILL_INPUT_MODULE)
ret
=
input_register_device
(
priv
->
rfkill_mngr
.
input_dev
);
if
(
ret
)
{
IWL_ERROR
(
"Unable to register rfkill input device: %d
\n
"
,
ret
);
goto
unregister_rfkill
;
}
#endif
IWL_DEBUG_RF_KILL
(
"RFKILL initialization complete.
\n
"
);
return
ret
;
...
...
@@ -136,12 +111,6 @@ int iwl_rfkill_init(struct iwl_priv *priv)
rfkill_unregister
(
priv
->
rfkill_mngr
.
rfkill
);
priv
->
rfkill_mngr
.
rfkill
=
NULL
;
free_input_dev:
#if defined(CONFIG_RFKILL_INPUT) || defined(CONFIG_RFKILL_INPUT_MODULE)
input_free_device
(
priv
->
rfkill_mngr
.
input_dev
);
priv
->
rfkill_mngr
.
input_dev
=
NULL
;
#endif
freed_rfkill:
if
(
priv
->
rfkill_mngr
.
rfkill
!=
NULL
)
rfkill_free
(
priv
->
rfkill_mngr
.
rfkill
);
...
...
@@ -156,13 +125,6 @@ EXPORT_SYMBOL(iwl_rfkill_init);
void
iwl_rfkill_unregister
(
struct
iwl_priv
*
priv
)
{
#if defined(CONFIG_RFKILL_INPUT) || defined(CONFIG_RFKILL_INPUT_MODULE)
if
(
priv
->
rfkill_mngr
.
input_dev
)
input_unregister_device
(
priv
->
rfkill_mngr
.
input_dev
);
input_free_device
(
priv
->
rfkill_mngr
.
input_dev
);
priv
->
rfkill_mngr
.
input_dev
=
NULL
;
#endif
if
(
priv
->
rfkill_mngr
.
rfkill
)
rfkill_unregister
(
priv
->
rfkill_mngr
.
rfkill
);
...
...
@@ -173,7 +135,6 @@ EXPORT_SYMBOL(iwl_rfkill_unregister);
/* set rf-kill to the right state. */
void
iwl_rfkill_set_hw_state
(
struct
iwl_priv
*
priv
)
{
if
(
!
priv
->
rfkill_mngr
.
rfkill
)
return
;
...
...
drivers/net/wireless/iwlwifi/iwl-rfkill.h
浏览文件 @
f3032be9
...
...
@@ -31,12 +31,10 @@
struct
iwl_priv
;
#include <linux/rfkill.h>
#include <linux/input.h>
#ifdef CONFIG_IWLWIFI_RFKILL
struct
iwl_rfkill_mngr
{
struct
rfkill
*
rfkill
;
struct
input_dev
*
input_dev
;
};
void
iwl_rfkill_set_hw_state
(
struct
iwl_priv
*
priv
);
...
...
drivers/net/wireless/iwlwifi/iwl-rx.c
浏览文件 @
f3032be9
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/iwl-sta.c
浏览文件 @
f3032be9
...
...
@@ -36,8 +36,8 @@
#include "iwl-helpers.h"
#define IWL_STA_DRIVER_ACTIVE
0x1
/* ucode
entry is active */
#define IWL_STA_UCODE_ACTIVE
0x2
/* ucode entry is active */
#define IWL_STA_DRIVER_ACTIVE
BIT(0)
/* driver
entry is active */
#define IWL_STA_UCODE_ACTIVE
BIT(1)
/* ucode entry is active */
u8
iwl_find_station
(
struct
iwl_priv
*
priv
,
const
u8
*
addr
)
{
...
...
@@ -83,10 +83,28 @@ int iwl_get_ra_sta_id(struct iwl_priv *priv, struct ieee80211_hdr *hdr)
}
EXPORT_SYMBOL
(
iwl_get_ra_sta_id
);
static
void
iwl_sta_ucode_activate
(
struct
iwl_priv
*
priv
,
u8
sta_id
)
{
unsigned
long
flags
;
DECLARE_MAC_BUF
(
mac
);
spin_lock_irqsave
(
&
priv
->
sta_lock
,
flags
);
if
(
!
(
priv
->
stations
[
sta_id
].
used
&
IWL_STA_DRIVER_ACTIVE
))
IWL_ERROR
(
"ACTIVATE a non DRIVER active station %d
\n
"
,
sta_id
);
priv
->
stations
[
sta_id
].
used
|=
IWL_STA_UCODE_ACTIVE
;
IWL_DEBUG_ASSOC
(
"Added STA to Ucode: %s
\n
"
,
print_mac
(
mac
,
priv
->
stations
[
sta_id
].
sta
.
sta
.
addr
));
spin_unlock_irqrestore
(
&
priv
->
sta_lock
,
flags
);
}
static
int
iwl_add_sta_callback
(
struct
iwl_priv
*
priv
,
struct
iwl_cmd
*
cmd
,
struct
sk_buff
*
skb
)
{
struct
iwl_rx_packet
*
res
=
NULL
;
u8
sta_id
=
cmd
->
cmd
.
addsta
.
sta
.
sta_id
;
if
(
!
skb
)
{
IWL_ERROR
(
"Error: Response NULL in REPLY_ADD_STA.
\n
"
);
...
...
@@ -102,8 +120,8 @@ static int iwl_add_sta_callback(struct iwl_priv *priv,
switch
(
res
->
u
.
add_sta
.
status
)
{
case
ADD_STA_SUCCESS_MSK
:
/* FIXME: implement iwl_sta_ucode_activate(priv, addr); */
/* fai
l through */
iwl_sta_ucode_activate
(
priv
,
sta_id
);
/* fal
l through */
default:
IWL_DEBUG_HC
(
"Received REPLY_ADD_STA:(0x%08X)
\n
"
,
res
->
u
.
add_sta
.
status
);
...
...
@@ -147,6 +165,7 @@ int iwl_send_add_sta(struct iwl_priv *priv,
if
(
ret
==
0
)
{
switch
(
res
->
u
.
add_sta
.
status
)
{
case
ADD_STA_SUCCESS_MSK
:
iwl_sta_ucode_activate
(
priv
,
sta
->
sta
.
sta_id
);
IWL_DEBUG_INFO
(
"REPLY_ADD_STA PASSED
\n
"
);
break
;
default:
...
...
@@ -215,88 +234,92 @@ u8 iwl_add_station_flags(struct iwl_priv *priv, const u8 *addr, int is_ap,
u8
flags
,
struct
ieee80211_ht_info
*
ht_info
)
{
int
i
;
int
index
=
IWL_INVALID_STATION
;
int
sta_id
=
IWL_INVALID_STATION
;
struct
iwl_station_entry
*
station
;
unsigned
long
flags_spin
;
DECLARE_MAC_BUF
(
mac
);
spin_lock_irqsave
(
&
priv
->
sta_lock
,
flags_spin
);
if
(
is_ap
)
index
=
IWL_AP_ID
;
sta_id
=
IWL_AP_ID
;
else
if
(
is_broadcast_ether_addr
(
addr
))
index
=
priv
->
hw_params
.
bcast_sta_id
;
sta_id
=
priv
->
hw_params
.
bcast_sta_id
;
else
for
(
i
=
IWL_STA_ID
;
i
<
priv
->
hw_params
.
max_stations
;
i
++
)
{
if
(
!
compare_ether_addr
(
priv
->
stations
[
i
].
sta
.
sta
.
addr
,
addr
))
{
index
=
i
;
sta_id
=
i
;
break
;
}
if
(
!
priv
->
stations
[
i
].
used
&&
index
==
IWL_INVALID_STATION
)
index
=
i
;
sta_id
==
IWL_INVALID_STATION
)
sta_id
=
i
;
}
/* These two conditions have the same outcome, but keep them separate
since they have different meanings */
if
(
unlikely
(
index
==
IWL_INVALID_STATION
))
{
since they have different meanings */
if
(
unlikely
(
sta_id
==
IWL_INVALID_STATION
))
{
spin_unlock_irqrestore
(
&
priv
->
sta_lock
,
flags_spin
);
return
index
;
return
sta_id
;
}
if
(
priv
->
stations
[
index
].
used
&&
!
compare_ether_addr
(
priv
->
stations
[
index
].
sta
.
sta
.
addr
,
addr
))
{
if
(
priv
->
stations
[
sta_id
].
used
&&
!
compare_ether_addr
(
priv
->
stations
[
sta_id
].
sta
.
sta
.
addr
,
addr
))
{
spin_unlock_irqrestore
(
&
priv
->
sta_lock
,
flags_spin
);
return
index
;
return
sta_id
;
}
IWL_DEBUG_ASSOC
(
"Add STA ID %d: %s
\n
"
,
index
,
print_mac
(
mac
,
addr
));
station
=
&
priv
->
stations
[
index
];
station
->
used
=
1
;
station
=
&
priv
->
stations
[
sta_id
];
station
->
used
=
IWL_STA_DRIVER_ACTIVE
;
IWL_DEBUG_ASSOC
(
"Add STA to driver ID %d: %s
\n
"
,
sta_id
,
print_mac
(
mac
,
addr
));
priv
->
num_stations
++
;
/* Set up the REPLY_ADD_STA command to send to device */
memset
(
&
station
->
sta
,
0
,
sizeof
(
struct
iwl_addsta_cmd
));
memcpy
(
station
->
sta
.
sta
.
addr
,
addr
,
ETH_ALEN
);
station
->
sta
.
mode
=
0
;
station
->
sta
.
sta
.
sta_id
=
index
;
station
->
sta
.
sta
.
sta_id
=
sta_id
;
station
->
sta
.
station_flags
=
0
;
/* BCAST station and IBSS stations do not work in HT mode */
if
(
index
!=
priv
->
hw_params
.
bcast_sta_id
&&
if
(
sta_id
!=
priv
->
hw_params
.
bcast_sta_id
&&
priv
->
iw_mode
!=
IEEE80211_IF_TYPE_IBSS
)
iwl_set_ht_add_station
(
priv
,
index
,
ht_info
);
iwl_set_ht_add_station
(
priv
,
sta_id
,
ht_info
);
spin_unlock_irqrestore
(
&
priv
->
sta_lock
,
flags_spin
);
/* Add station to device's station table */
iwl_send_add_sta
(
priv
,
&
station
->
sta
,
flags
);
return
index
;
return
sta_id
;
}
EXPORT_SYMBOL
(
iwl_add_station_flags
);
static
int
iwl_sta_ucode_deactivate
(
struct
iwl_priv
*
priv
,
const
char
*
addr
)
static
void
iwl_sta_ucode_deactivate
(
struct
iwl_priv
*
priv
,
const
char
*
addr
)
{
unsigned
long
flags
;
u8
sta_id
;
DECLARE_MAC_BUF
(
mac
);
sta_id
=
iwl_find_station
(
priv
,
addr
);
if
(
sta_id
!=
IWL_INVALID_STATION
)
{
IWL_DEBUG_ASSOC
(
"Removed STA from Ucode: %s
\n
"
,
print_mac
(
mac
,
addr
));
spin_lock_irqsave
(
&
priv
->
sta_lock
,
flags
);
priv
->
stations
[
sta_id
].
used
&=
~
IWL_STA_UCODE_ACTIVE
;
memset
(
&
priv
->
stations
[
sta_id
],
0
,
sizeof
(
struct
iwl_station_entry
));
spin_unlock_irqrestore
(
&
priv
->
sta_lock
,
flags
);
return
0
;
}
return
-
EINVAL
;
u8
sta_id
=
iwl_find_station
(
priv
,
addr
);
BUG_ON
(
sta_id
==
IWL_INVALID_STATION
);
IWL_DEBUG_ASSOC
(
"Removed STA from Ucode: %s
\n
"
,
print_mac
(
mac
,
addr
));
spin_lock_irqsave
(
&
priv
->
sta_lock
,
flags
);
/* Ucode must be active and driver must be non active */
if
(
priv
->
stations
[
sta_id
].
used
!=
IWL_STA_UCODE_ACTIVE
)
IWL_ERROR
(
"removed non active STA %d
\n
"
,
sta_id
);
priv
->
stations
[
sta_id
].
used
&=
~
IWL_STA_UCODE_ACTIVE
;
memset
(
&
priv
->
stations
[
sta_id
],
0
,
sizeof
(
struct
iwl_station_entry
));
spin_unlock_irqrestore
(
&
priv
->
sta_lock
,
flags
);
}
static
int
iwl_remove_sta_callback
(
struct
iwl_priv
*
priv
,
...
...
@@ -322,6 +345,7 @@ static int iwl_remove_sta_callback(struct iwl_priv *priv,
iwl_sta_ucode_deactivate
(
priv
,
addr
);
break
;
default:
IWL_ERROR
(
"REPLY_REMOVE_STA failed
\n
"
);
break
;
}
...
...
@@ -386,44 +410,63 @@ static int iwl_send_remove_station(struct iwl_priv *priv, const u8 *addr,
/**
* iwl_remove_station - Remove driver's knowledge of station.
*/
u8
iwl_remove_station
(
struct
iwl_priv
*
priv
,
const
u8
*
addr
,
int
is_ap
)
int
iwl_remove_station
(
struct
iwl_priv
*
priv
,
const
u8
*
addr
,
int
is_ap
)
{
int
index
=
IWL_INVALID_STATION
;
int
i
;
int
sta_id
=
IWL_INVALID_STATION
;
int
i
,
ret
=
-
EINVAL
;
unsigned
long
flags
;
DECLARE_MAC_BUF
(
mac
);
spin_lock_irqsave
(
&
priv
->
sta_lock
,
flags
);
if
(
is_ap
)
index
=
IWL_AP_ID
;
sta_id
=
IWL_AP_ID
;
else
if
(
is_broadcast_ether_addr
(
addr
))
index
=
priv
->
hw_params
.
bcast_sta_id
;
sta_id
=
priv
->
hw_params
.
bcast_sta_id
;
else
for
(
i
=
IWL_STA_ID
;
i
<
priv
->
hw_params
.
max_stations
;
i
++
)
if
(
priv
->
stations
[
i
].
used
&&
!
compare_ether_addr
(
priv
->
stations
[
i
].
sta
.
sta
.
addr
,
addr
))
{
index
=
i
;
sta_id
=
i
;
break
;
}
if
(
unlikely
(
index
==
IWL_INVALID_STATION
))
if
(
unlikely
(
sta_id
==
IWL_INVALID_STATION
))
goto
out
;
if
(
priv
->
stations
[
index
].
used
)
{
priv
->
stations
[
index
].
used
=
0
;
priv
->
num_stations
--
;
IWL_DEBUG_ASSOC
(
"Removing STA from driver:%d %s
\n
"
,
sta_id
,
print_mac
(
mac
,
addr
));
if
(
!
(
priv
->
stations
[
sta_id
].
used
&
IWL_STA_DRIVER_ACTIVE
))
{
IWL_ERROR
(
"Removing %s but non DRIVER active
\n
"
,
print_mac
(
mac
,
addr
));
goto
out
;
}
if
(
!
(
priv
->
stations
[
sta_id
].
used
&
IWL_STA_UCODE_ACTIVE
))
{
IWL_ERROR
(
"Removing %s but non UCODE active
\n
"
,
print_mac
(
mac
,
addr
));
goto
out
;
}
priv
->
stations
[
sta_id
].
used
&=
~
IWL_STA_DRIVER_ACTIVE
;
priv
->
num_stations
--
;
BUG_ON
(
priv
->
num_stations
<
0
);
spin_unlock_irqrestore
(
&
priv
->
sta_lock
,
flags
);
iwl_send_remove_station
(
priv
,
addr
,
CMD_ASYNC
);
return
index
;
ret
=
iwl_send_remove_station
(
priv
,
addr
,
CMD_ASYNC
);
return
ret
;
out:
spin_unlock_irqrestore
(
&
priv
->
sta_lock
,
flags
);
return
0
;
return
ret
;
}
EXPORT_SYMBOL
(
iwl_remove_station
);
static
int
iwl_get_free_ucode_key_index
(
struct
iwl_priv
*
priv
)
{
int
i
;
...
...
@@ -782,8 +825,7 @@ int iwl_send_lq_cmd(struct iwl_priv *priv,
iwl_dump_lq_cmd
(
priv
,
lq
);
if
(
iwl_is_associated
(
priv
)
&&
priv
->
assoc_station_added
&&
priv
->
lq_mngr
.
lq_ready
)
if
(
iwl_is_associated
(
priv
)
&&
priv
->
assoc_station_added
)
return
iwl_send_cmd
(
priv
,
&
cmd
);
return
0
;
...
...
@@ -845,6 +887,7 @@ static void iwl_sta_init_lq(struct iwl_priv *priv, const u8 *addr, int is_ap)
iwl_send_cmd_pdu_async
(
priv
,
REPLY_TX_LINK_QUALITY_CMD
,
sizeof
(
link_cmd
),
&
link_cmd
,
NULL
);
}
/**
* iwl_rxon_add_station - add station into station table.
*
...
...
drivers/net/wireless/iwlwifi/iwl-sta.h
浏览文件 @
f3032be9
...
...
@@ -48,7 +48,7 @@ int iwl_set_dynamic_key(struct iwl_priv *priv,
int
iwl_remove_dynamic_key
(
struct
iwl_priv
*
priv
,
struct
ieee80211_key_conf
*
key
,
u8
sta_id
);
int
iwl_rxon_add_station
(
struct
iwl_priv
*
priv
,
const
u8
*
addr
,
int
is_ap
);
u8
iwl_remove_station
(
struct
iwl_priv
*
priv
,
const
u8
*
addr
,
int
is_ap
);
int
iwl_remove_station
(
struct
iwl_priv
*
priv
,
const
u8
*
addr
,
int
is_ap
);
int
iwl_get_sta_id
(
struct
iwl_priv
*
priv
,
struct
ieee80211_hdr
*
hdr
);
void
iwl_sta_modify_enable_tid_tx
(
struct
iwl_priv
*
priv
,
int
sta_id
,
int
tid
);
int
iwl_get_ra_sta_id
(
struct
iwl_priv
*
priv
,
struct
ieee80211_hdr
*
hdr
);
...
...
drivers/net/wireless/iwlwifi/iwl-tx.c
浏览文件 @
f3032be9
...
...
@@ -1350,6 +1350,149 @@ int iwl_txq_check_empty(struct iwl_priv *priv, int sta_id, u8 tid, int txq_id)
}
EXPORT_SYMBOL
(
iwl_txq_check_empty
);
/**
* iwl_tx_status_reply_compressed_ba - Update tx status from block-ack
*
* Go through block-ack's bitmap of ACK'd frames, update driver's record of
* ACK vs. not. This gets sent to mac80211, then to rate scaling algo.
*/
static
int
iwl_tx_status_reply_compressed_ba
(
struct
iwl_priv
*
priv
,
struct
iwl_ht_agg
*
agg
,
struct
iwl_compressed_ba_resp
*
ba_resp
)
{
int
i
,
sh
,
ack
;
u16
seq_ctl
=
le16_to_cpu
(
ba_resp
->
seq_ctl
);
u16
scd_flow
=
le16_to_cpu
(
ba_resp
->
scd_flow
);
u64
bitmap
;
int
successes
=
0
;
struct
ieee80211_tx_info
*
info
;
if
(
unlikely
(
!
agg
->
wait_for_ba
))
{
IWL_ERROR
(
"Received BA when not expected
\n
"
);
return
-
EINVAL
;
}
/* Mark that the expected block-ack response arrived */
agg
->
wait_for_ba
=
0
;
IWL_DEBUG_TX_REPLY
(
"BA %d %d
\n
"
,
agg
->
start_idx
,
ba_resp
->
seq_ctl
);
/* Calculate shift to align block-ack bits with our Tx window bits */
sh
=
agg
->
start_idx
-
SEQ_TO_INDEX
(
seq_ctl
>>
4
);
if
(
sh
<
0
)
/* tbw something is wrong with indices */
sh
+=
0x100
;
/* don't use 64-bit values for now */
bitmap
=
le64_to_cpu
(
ba_resp
->
bitmap
)
>>
sh
;
if
(
agg
->
frame_count
>
(
64
-
sh
))
{
IWL_DEBUG_TX_REPLY
(
"more frames than bitmap size"
);
return
-
1
;
}
/* check for success or failure according to the
* transmitted bitmap and block-ack bitmap */
bitmap
&=
agg
->
bitmap
;
/* For each frame attempted in aggregation,
* update driver's record of tx frame's status. */
for
(
i
=
0
;
i
<
agg
->
frame_count
;
i
++
)
{
ack
=
bitmap
&
(
1
<<
i
);
successes
+=
!!
ack
;
IWL_DEBUG_TX_REPLY
(
"%s ON i=%d idx=%d raw=%d
\n
"
,
ack
?
"ACK"
:
"NACK"
,
i
,
(
agg
->
start_idx
+
i
)
&
0xff
,
agg
->
start_idx
+
i
);
}
info
=
IEEE80211_SKB_CB
(
priv
->
txq
[
scd_flow
].
txb
[
agg
->
start_idx
].
skb
[
0
]);
memset
(
&
info
->
status
,
0
,
sizeof
(
info
->
status
));
info
->
flags
=
IEEE80211_TX_STAT_ACK
;
info
->
flags
|=
IEEE80211_TX_STAT_AMPDU
;
info
->
status
.
ampdu_ack_map
=
successes
;
info
->
status
.
ampdu_ack_len
=
agg
->
frame_count
;
iwl_hwrate_to_tx_control
(
priv
,
agg
->
rate_n_flags
,
info
);
IWL_DEBUG_TX_REPLY
(
"Bitmap %llx
\n
"
,
(
unsigned
long
long
)
bitmap
);
return
0
;
}
/**
* iwl_rx_reply_compressed_ba - Handler for REPLY_COMPRESSED_BA
*
* Handles block-acknowledge notification from device, which reports success
* of frames sent via aggregation.
*/
void
iwl_rx_reply_compressed_ba
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_mem_buffer
*
rxb
)
{
struct
iwl_rx_packet
*
pkt
=
(
struct
iwl_rx_packet
*
)
rxb
->
skb
->
data
;
struct
iwl_compressed_ba_resp
*
ba_resp
=
&
pkt
->
u
.
compressed_ba
;
int
index
;
struct
iwl_tx_queue
*
txq
=
NULL
;
struct
iwl_ht_agg
*
agg
;
DECLARE_MAC_BUF
(
mac
);
/* "flow" corresponds to Tx queue */
u16
scd_flow
=
le16_to_cpu
(
ba_resp
->
scd_flow
);
/* "ssn" is start of block-ack Tx window, corresponds to index
* (in Tx queue's circular buffer) of first TFD/frame in window */
u16
ba_resp_scd_ssn
=
le16_to_cpu
(
ba_resp
->
scd_ssn
);
if
(
scd_flow
>=
priv
->
hw_params
.
max_txq_num
)
{
IWL_ERROR
(
"BUG_ON scd_flow is bigger than number of queues"
);
return
;
}
txq
=
&
priv
->
txq
[
scd_flow
];
agg
=
&
priv
->
stations
[
ba_resp
->
sta_id
].
tid
[
ba_resp
->
tid
].
agg
;
/* Find index just before block-ack window */
index
=
iwl_queue_dec_wrap
(
ba_resp_scd_ssn
&
0xff
,
txq
->
q
.
n_bd
);
/* TODO: Need to get this copy more safely - now good for debug */
IWL_DEBUG_TX_REPLY
(
"REPLY_COMPRESSED_BA [%d]Received from %s, "
"sta_id = %d
\n
"
,
agg
->
wait_for_ba
,
print_mac
(
mac
,
(
u8
*
)
&
ba_resp
->
sta_addr_lo32
),
ba_resp
->
sta_id
);
IWL_DEBUG_TX_REPLY
(
"TID = %d, SeqCtl = %d, bitmap = 0x%llx, scd_flow = "
"%d, scd_ssn = %d
\n
"
,
ba_resp
->
tid
,
ba_resp
->
seq_ctl
,
(
unsigned
long
long
)
le64_to_cpu
(
ba_resp
->
bitmap
),
ba_resp
->
scd_flow
,
ba_resp
->
scd_ssn
);
IWL_DEBUG_TX_REPLY
(
"DAT start_idx = %d, bitmap = 0x%llx
\n
"
,
agg
->
start_idx
,
(
unsigned
long
long
)
agg
->
bitmap
);
/* Update driver's record of ACK vs. not for each frame in window */
iwl_tx_status_reply_compressed_ba
(
priv
,
agg
,
ba_resp
);
/* Release all TFDs before the SSN, i.e. all TFDs in front of
* block-ack window (we assume that they've been successfully
* transmitted ... if not, it's too late anyway). */
if
(
txq
->
q
.
read_ptr
!=
(
ba_resp_scd_ssn
&
0xff
))
{
/* calculate mac80211 ampdu sw queue to wake */
int
ampdu_q
=
scd_flow
-
priv
->
hw_params
.
first_ampdu_q
+
priv
->
hw
->
queues
;
int
freed
=
iwl_tx_queue_reclaim
(
priv
,
scd_flow
,
index
);
priv
->
stations
[
ba_resp
->
sta_id
].
tid
[
ba_resp
->
tid
].
tfds_in_queue
-=
freed
;
if
(
iwl_queue_space
(
&
txq
->
q
)
>
txq
->
q
.
low_mark
&&
priv
->
mac80211_registered
&&
agg
->
state
!=
IWL_EMPTYING_HW_QUEUE_DELBA
)
ieee80211_wake_queue
(
priv
->
hw
,
ampdu_q
);
iwl_txq_check_empty
(
priv
,
ba_resp
->
sta_id
,
ba_resp
->
tid
,
scd_flow
);
}
}
EXPORT_SYMBOL
(
iwl_rx_reply_compressed_ba
);
#ifdef CONFIG_IWLWIF_DEBUG
#define TX_STATUS_ENTRY(x) case TX_STATUS_FAIL_ ## x: return #x
...
...
drivers/net/wireless/iwlwifi/iwl3945-base.c
浏览文件 @
f3032be9
...
...
@@ -970,7 +970,7 @@ static int iwl3945_full_rxon_required(struct iwl3945_priv *priv)
{
/* These items are only settable from the full RXON command */
if
(
!
(
priv
->
active_rxon
.
filter_flags
&
RXON_FILTER_ASSOC_MSK
)
||
if
(
!
(
iwl3945_is_associated
(
priv
)
)
||
compare_ether_addr
(
priv
->
staging_rxon
.
bssid_addr
,
priv
->
active_rxon
.
bssid_addr
)
||
compare_ether_addr
(
priv
->
staging_rxon
.
node_addr
,
...
...
@@ -2312,7 +2312,7 @@ static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv)
#endif
ch_info
=
iwl3945_get_channel_info
(
priv
,
priv
->
band
,
le16_to_cpu
(
priv
->
staging
_rxon
.
channel
));
le16_to_cpu
(
priv
->
active
_rxon
.
channel
));
if
(
!
ch_info
)
ch_info
=
&
priv
->
channel_info
[
0
];
...
...
@@ -2539,6 +2539,11 @@ static int iwl3945_get_sta_id(struct iwl3945_priv *priv, struct ieee80211_hdr *h
iwl3945_print_hex_dump
(
IWL_DL_DROP
,
(
u8
*
)
hdr
,
sizeof
(
*
hdr
));
return
priv
->
hw_setting
.
bcast_sta_id
;
}
/* If we are in monitor mode, use BCAST. This is required for
* packet injection. */
case
IEEE80211_IF_TYPE_MNTR
:
return
priv
->
hw_setting
.
bcast_sta_id
;
default:
IWL_WARNING
(
"Unknown mode of operation: %d"
,
priv
->
iw_mode
);
return
priv
->
hw_setting
.
bcast_sta_id
;
...
...
@@ -2578,11 +2583,6 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb)
goto
drop_unlock
;
}
if
(
!
priv
->
vif
)
{
IWL_DEBUG_DROP
(
"Dropping - !priv->vif
\n
"
);
goto
drop_unlock
;
}
if
((
ieee80211_get_tx_rate
(
priv
->
hw
,
info
)
->
hw_value
&
0xFF
)
==
IWL_INVALID_RATE
)
{
IWL_ERROR
(
"ERROR: No TX rate available.
\n
"
);
goto
drop_unlock
;
...
...
@@ -2603,9 +2603,10 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb)
#endif
/* drop all data frame if we are not associated */
if
((
!
iwl3945_is_associated
(
priv
)
||
((
priv
->
iw_mode
==
IEEE80211_IF_TYPE_STA
)
&&
!
priv
->
assoc_id
))
&&
ieee80211_is_data
(
fc
))
{
if
(
ieee80211_is_data
(
fc
)
&&
(
priv
->
iw_mode
!=
IEEE80211_IF_TYPE_MNTR
)
&&
/* packet injection */
(
!
iwl3945_is_associated
(
priv
)
||
((
priv
->
iw_mode
==
IEEE80211_IF_TYPE_STA
)
&&
!
priv
->
assoc_id
)))
{
IWL_DEBUG_DROP
(
"Dropping - !iwl3945_is_associated
\n
"
);
goto
drop_unlock
;
}
...
...
@@ -5921,7 +5922,9 @@ static void __iwl3945_down(struct iwl3945_priv *priv)
test_bit
(
STATUS_GEO_CONFIGURED
,
&
priv
->
status
)
<<
STATUS_GEO_CONFIGURED
|
test_bit
(
STATUS_IN_SUSPEND
,
&
priv
->
status
)
<<
STATUS_IN_SUSPEND
;
STATUS_IN_SUSPEND
|
test_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
)
<<
STATUS_EXIT_PENDING
;
goto
exit
;
}
...
...
@@ -5936,7 +5939,9 @@ static void __iwl3945_down(struct iwl3945_priv *priv)
test_bit
(
STATUS_IN_SUSPEND
,
&
priv
->
status
)
<<
STATUS_IN_SUSPEND
|
test_bit
(
STATUS_FW_ERROR
,
&
priv
->
status
)
<<
STATUS_FW_ERROR
;
STATUS_FW_ERROR
|
test_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
)
<<
STATUS_EXIT_PENDING
;
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
iwl3945_clear_bit
(
priv
,
CSR_GP_CNTRL
,
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ
);
...
...
@@ -6008,11 +6013,12 @@ static int __iwl3945_up(struct iwl3945_priv *priv)
else
{
set_bit
(
STATUS_RF_KILL_HW
,
&
priv
->
status
);
if
(
!
test_bit
(
STATUS_IN_SUSPEND
,
&
priv
->
status
))
{
iwl3945_rfkill_set_hw_state
(
priv
);
IWL_WARNING
(
"Radio disabled by HW RF Kill switch
\n
"
);
return
-
ENODEV
;
}
}
iwl3945_rfkill_set_hw_state
(
priv
);
iwl3945_write32
(
priv
,
CSR_INT
,
0xFFFFFFFF
);
rc
=
iwl3945_hw_nic_init
(
priv
);
...
...
@@ -6068,6 +6074,7 @@ static int __iwl3945_up(struct iwl3945_priv *priv)
set_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
);
__iwl3945_down
(
priv
);
clear_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
);
/* tried to restart and config the device for as long as our
* patience could withstand */
...
...
@@ -6135,6 +6142,8 @@ static void iwl3945_bg_rf_kill(struct work_struct *work)
"Kill switch must be turned off for "
"wireless networking to work.
\n
"
);
}
iwl3945_rfkill_set_hw_state
(
priv
);
mutex_unlock
(
&
priv
->
mutex
);
}
...
...
@@ -6685,11 +6694,6 @@ static int iwl3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
IWL_DEBUG_MAC80211
(
"enter
\n
"
);
if
(
priv
->
iw_mode
==
IEEE80211_IF_TYPE_MNTR
)
{
IWL_DEBUG_MAC80211
(
"leave - monitor
\n
"
);
return
-
1
;
}
IWL_DEBUG_TX
(
"dev->xmit(%d bytes) at rate 0x%02x
\n
"
,
skb
->
len
,
ieee80211_get_tx_rate
(
hw
,
IEEE80211_SKB_CB
(
skb
))
->
bitrate
);
...
...
@@ -6836,7 +6840,7 @@ static void iwl3945_config_ap(struct iwl3945_priv *priv)
return
;
/* The following should be done only at AP bring up */
if
(
(
priv
->
active_rxon
.
filter_flags
&
RXON_FILTER_ASSOC_MSK
)
==
0
)
{
if
(
!
(
iwl3945_is_associated
(
priv
))
)
{
/* RXON - unassoc (to set timing command) */
priv
->
staging_rxon
.
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
...
...
@@ -6998,26 +7002,18 @@ static void iwl3945_configure_filter(struct ieee80211_hw *hw,
unsigned
int
*
total_flags
,
int
mc_count
,
struct
dev_addr_list
*
mc_list
)
{
/*
* XXX: dummy
* see also iwl3945_connection_init_rx_config
*/
struct
iwl3945_priv
*
priv
=
hw
->
priv
;
int
new_flags
=
0
;
if
(
changed_flags
&
(
FIF_PROMISC_IN_BSS
|
FIF_OTHER_BSS
))
{
if
(
*
total_flags
&
(
FIF_PROMISC_IN_BSS
|
FIF_OTHER_BSS
))
{
IWL_DEBUG_MAC80211
(
"Enter: type %d (0x%x, 0x%x)
\n
"
,
IEEE80211_IF_TYPE_MNTR
,
changed_flags
,
*
total_flags
);
/* queue work 'cuz mac80211 is holding a lock which
* prevents us from issuing (synchronous) f/w cmds */
queue_work
(
priv
->
workqueue
,
&
priv
->
set_monitor
);
new_flags
&=
FIF_PROMISC_IN_BSS
|
FIF_OTHER_BSS
|
FIF_ALLMULTI
;
}
if
(
changed_flags
&
(
*
total_flags
)
&
FIF_OTHER_BSS
)
{
IWL_DEBUG_MAC80211
(
"Enter: type %d (0x%x, 0x%x)
\n
"
,
IEEE80211_IF_TYPE_MNTR
,
changed_flags
,
*
total_flags
);
/* queue work 'cuz mac80211 is holding a lock which
* prevents us from issuing (synchronous) f/w cmds */
queue_work
(
priv
->
workqueue
,
&
priv
->
set_monitor
);
}
*
total_flags
=
new_flags
;
*
total_flags
&=
FIF_OTHER_BSS
|
FIF_ALLMULTI
|
FIF_BCN_PRBRESP_PROMISC
|
FIF_CONTROL
;
}
static
void
iwl3945_mac_remove_interface
(
struct
ieee80211_hw
*
hw
,
...
...
@@ -7412,37 +7408,6 @@ static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO,
#endif
/* CONFIG_IWL3945_DEBUG */
static
ssize_t
show_rf_kill
(
struct
device
*
d
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
/*
* 0 - RF kill not enabled
* 1 - SW based RF kill active (sysfs)
* 2 - HW based RF kill active
* 3 - Both HW and SW based RF kill active
*/
struct
iwl3945_priv
*
priv
=
(
struct
iwl3945_priv
*
)
d
->
driver_data
;
int
val
=
(
test_bit
(
STATUS_RF_KILL_SW
,
&
priv
->
status
)
?
0x1
:
0x0
)
|
(
test_bit
(
STATUS_RF_KILL_HW
,
&
priv
->
status
)
?
0x2
:
0x0
);
return
sprintf
(
buf
,
"%i
\n
"
,
val
);
}
static
ssize_t
store_rf_kill
(
struct
device
*
d
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
struct
iwl3945_priv
*
priv
=
(
struct
iwl3945_priv
*
)
d
->
driver_data
;
mutex_lock
(
&
priv
->
mutex
);
iwl3945_radio_kill_sw
(
priv
,
buf
[
0
]
==
'1'
);
mutex_unlock
(
&
priv
->
mutex
);
return
count
;
}
static
DEVICE_ATTR
(
rf_kill
,
S_IWUSR
|
S_IRUGO
,
show_rf_kill
,
store_rf_kill
);
static
ssize_t
show_temperature
(
struct
device
*
d
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
...
...
@@ -7928,7 +7893,6 @@ static struct attribute *iwl3945_sysfs_entries[] = {
#endif
&
dev_attr_power_level
.
attr
,
&
dev_attr_retry_rate
.
attr
,
&
dev_attr_rf_kill
.
attr
,
&
dev_attr_rs_window
.
attr
,
&
dev_attr_statistics
.
attr
,
&
dev_attr_status
.
attr
,
...
...
@@ -8169,6 +8133,11 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
pci_save_state
(
pdev
);
pci_disable_device
(
pdev
);
err
=
iwl3945_rfkill_init
(
priv
);
if
(
err
)
IWL_ERROR
(
"Unable to initialize RFKILL system. "
"Ignoring error: %d
\n
"
,
err
);
return
0
;
out_free_geos:
...
...
@@ -8231,6 +8200,7 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
sysfs_remove_group
(
&
pdev
->
dev
.
kobj
,
&
iwl3945_attribute_group
);
iwl3945_rfkill_unregister
(
priv
);
iwl3945_dealloc_ucode_pci
(
priv
);
if
(
priv
->
rxq
.
bd
)
...
...
@@ -8299,6 +8269,143 @@ static int iwl3945_pci_resume(struct pci_dev *pdev)
#endif
/* CONFIG_PM */
/*************** RFKILL FUNCTIONS **********/
#ifdef CONFIG_IWLWIFI_RFKILL
/* software rf-kill from user */
static
int
iwl3945_rfkill_soft_rf_kill
(
void
*
data
,
enum
rfkill_state
state
)
{
struct
iwl3945_priv
*
priv
=
data
;
int
err
=
0
;
if
(
!
priv
->
rfkill_mngr
.
rfkill
)
return
0
;
if
(
test_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
))
return
0
;
IWL_DEBUG_RF_KILL
(
"we recieved soft RFKILL set to state %d
\n
"
,
state
);
mutex_lock
(
&
priv
->
mutex
);
switch
(
state
)
{
case
RFKILL_STATE_UNBLOCKED
:
iwl3945_radio_kill_sw
(
priv
,
0
);
/* if HW rf-kill is set dont allow ON state */
if
(
iwl3945_is_rfkill
(
priv
))
err
=
-
EBUSY
;
break
;
case
RFKILL_STATE_SOFT_BLOCKED
:
iwl3945_radio_kill_sw
(
priv
,
1
);
if
(
!
iwl3945_is_rfkill
(
priv
))
err
=
-
EBUSY
;
break
;
default:
IWL_WARNING
(
"we recieved unexpected RFKILL state %d
\n
"
,
state
);
break
;
}
mutex_unlock
(
&
priv
->
mutex
);
return
err
;
}
int
iwl3945_rfkill_init
(
struct
iwl3945_priv
*
priv
)
{
struct
device
*
device
=
wiphy_dev
(
priv
->
hw
->
wiphy
);
int
ret
=
0
;
BUG_ON
(
device
==
NULL
);
IWL_DEBUG_RF_KILL
(
"Initializing RFKILL.
\n
"
);
priv
->
rfkill_mngr
.
rfkill
=
rfkill_allocate
(
device
,
RFKILL_TYPE_WLAN
);
if
(
!
priv
->
rfkill_mngr
.
rfkill
)
{
IWL_ERROR
(
"Unable to allocate rfkill device.
\n
"
);
ret
=
-
ENOMEM
;
goto
error
;
}
priv
->
rfkill_mngr
.
rfkill
->
name
=
priv
->
cfg
->
name
;
priv
->
rfkill_mngr
.
rfkill
->
data
=
priv
;
priv
->
rfkill_mngr
.
rfkill
->
state
=
RFKILL_STATE_ON
;
priv
->
rfkill_mngr
.
rfkill
->
toggle_radio
=
iwl3945_rfkill_soft_rf_kill
;
priv
->
rfkill_mngr
.
rfkill
->
user_claim_unsupported
=
1
;
priv
->
rfkill_mngr
.
rfkill
->
dev
.
class
->
suspend
=
NULL
;
priv
->
rfkill_mngr
.
rfkill
->
dev
.
class
->
resume
=
NULL
;
priv
->
rfkill_mngr
.
input_dev
=
input_allocate_device
();
if
(
!
priv
->
rfkill_mngr
.
input_dev
)
{
IWL_ERROR
(
"Unable to allocate rfkill input device.
\n
"
);
ret
=
-
ENOMEM
;
goto
freed_rfkill
;
}
priv
->
rfkill_mngr
.
input_dev
->
name
=
priv
->
cfg
->
name
;
priv
->
rfkill_mngr
.
input_dev
->
phys
=
wiphy_name
(
priv
->
hw
->
wiphy
);
priv
->
rfkill_mngr
.
input_dev
->
id
.
bustype
=
BUS_HOST
;
priv
->
rfkill_mngr
.
input_dev
->
id
.
vendor
=
priv
->
pci_dev
->
vendor
;
priv
->
rfkill_mngr
.
input_dev
->
dev
.
parent
=
device
;
priv
->
rfkill_mngr
.
input_dev
->
evbit
[
0
]
=
BIT
(
EV_KEY
);
set_bit
(
KEY_WLAN
,
priv
->
rfkill_mngr
.
input_dev
->
keybit
);
ret
=
rfkill_register
(
priv
->
rfkill_mngr
.
rfkill
);
if
(
ret
)
{
IWL_ERROR
(
"Unable to register rfkill: %d
\n
"
,
ret
);
goto
free_input_dev
;
}
ret
=
input_register_device
(
priv
->
rfkill_mngr
.
input_dev
);
if
(
ret
)
{
IWL_ERROR
(
"Unable to register rfkill input device: %d
\n
"
,
ret
);
goto
unregister_rfkill
;
}
IWL_DEBUG_RF_KILL
(
"RFKILL initialization complete.
\n
"
);
return
ret
;
unregister_rfkill:
rfkill_unregister
(
priv
->
rfkill_mngr
.
rfkill
);
priv
->
rfkill_mngr
.
rfkill
=
NULL
;
free_input_dev:
input_free_device
(
priv
->
rfkill_mngr
.
input_dev
);
priv
->
rfkill_mngr
.
input_dev
=
NULL
;
freed_rfkill:
if
(
priv
->
rfkill_mngr
.
rfkill
!=
NULL
)
rfkill_free
(
priv
->
rfkill_mngr
.
rfkill
);
priv
->
rfkill_mngr
.
rfkill
=
NULL
;
error:
IWL_DEBUG_RF_KILL
(
"RFKILL initialization complete.
\n
"
);
return
ret
;
}
void
iwl3945_rfkill_unregister
(
struct
iwl3945_priv
*
priv
)
{
if
(
priv
->
rfkill_mngr
.
input_dev
)
input_unregister_device
(
priv
->
rfkill_mngr
.
input_dev
);
if
(
priv
->
rfkill_mngr
.
rfkill
)
rfkill_unregister
(
priv
->
rfkill_mngr
.
rfkill
);
priv
->
rfkill_mngr
.
input_dev
=
NULL
;
priv
->
rfkill_mngr
.
rfkill
=
NULL
;
}
/* set rf-kill to the right state. */
void
iwl3945_rfkill_set_hw_state
(
struct
iwl3945_priv
*
priv
)
{
if
(
!
priv
->
rfkill_mngr
.
rfkill
)
return
;
if
(
!
iwl3945_is_rfkill
(
priv
))
priv
->
rfkill_mngr
.
rfkill
->
state
=
RFKILL_STATE_ON
;
else
priv
->
rfkill_mngr
.
rfkill
->
state
=
RFKILL_STATE_OFF
;
}
#endif
/*****************************************************************************
*
* driver and module entry point
...
...
drivers/net/wireless/iwlwifi/iwl4965-base.c
浏览文件 @
f3032be9
此差异已折叠。
点击以展开。
drivers/net/wireless/p54/p54common.c
浏览文件 @
f3032be9
...
...
@@ -357,6 +357,7 @@ static void p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb)
rx_status
.
signal
=
hdr
->
rssi
;
/* XX correct? */
rx_status
.
qual
=
(
100
*
hdr
->
rssi
)
/
127
;
rx_status
.
rate_idx
=
hdr
->
rate
&
0xf
;
rx_status
.
freq
=
freq
;
rx_status
.
band
=
IEEE80211_BAND_2GHZ
;
...
...
include/net/mac80211.h
浏览文件 @
f3032be9
...
...
@@ -710,6 +710,10 @@ enum ieee80211_tkip_key_type {
* @IEEE80211_HW_NOISE_DBM:
* Hardware can provide noise (radio interference) values in units dBm,
* decibel difference from one milliwatt.
*
* @IEEE80211_HW_SPECTRUM_MGMT:
* Hardware supports spectrum management defined in 802.11h
* Measurement, Channel Switch, Quieting, TPC
*/
enum
ieee80211_hw_flags
{
IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE
=
1
<<
0
,
...
...
@@ -721,6 +725,7 @@ enum ieee80211_hw_flags {
IEEE80211_HW_SIGNAL_DB
=
1
<<
6
,
IEEE80211_HW_SIGNAL_DBM
=
1
<<
7
,
IEEE80211_HW_NOISE_DBM
=
1
<<
8
,
IEEE80211_HW_SPECTRUM_MGMT
=
1
<<
9
,
};
/**
...
...
net/mac80211/Kconfig
浏览文件 @
f3032be9
...
...
@@ -27,6 +27,14 @@ comment "QoS/HT support needs CONFIG_NETDEVICES_MULTIQUEUE"
menu "Rate control algorithm selection"
depends on MAC80211 != n
config MAC80211_RC_PID
bool "PID controller based rate control algorithm" if EMBEDDED
default y
---help---
This option enables a TX rate control algorithm for
mac80211 that uses a PID controller to select the TX
rate.
choice
prompt "Default rate control algorithm"
default MAC80211_RC_DEFAULT_PID
...
...
@@ -38,40 +46,19 @@ choice
config MAC80211_RC_DEFAULT_PID
bool "PID controller based rate control algorithm"
select
MAC80211_RC_PID
depends on
MAC80211_RC_PID
---help---
Select the PID controller based rate control as the
default rate control algorithm. You should choose
this unless you know what you are doing.
config MAC80211_RC_DEFAULT_NONE
bool "No default algorithm"
depends on EMBEDDED
help
Selecting this option will select no default algorithm
and allow you to not build any. Do not choose this
option unless you know your driver comes with another
suitable algorithm.
endchoice
comment "Selecting 'y' for an algorithm will"
comment "build the algorithm into mac80211."
config MAC80211_RC_DEFAULT
string
default "pid" if MAC80211_RC_DEFAULT_PID
default ""
config MAC80211_RC_PID
tristate "PID controller based rate control algorithm"
---help---
This option enables a TX rate control algorithm for
mac80211 that uses a PID controller to select the TX
rate.
Say Y or M unless you're sure you want to use a
different rate control algorithm.
endmenu
config MAC80211_MESH
...
...
@@ -101,10 +88,16 @@ config MAC80211_DEBUGFS
Say N unless you know you need this.
menuconfig MAC80211_DEBUG_MENU
bool "Select mac80211 debugging features"
depends on MAC80211
---help---
This option collects various mac80211 debug settings.
config MAC80211_DEBUG_PACKET_ALIGNMENT
bool "Enable packet alignment debugging"
depends on MAC80211
help
depends on MAC80211
_DEBUG_MENU
---help---
This option is recommended for driver authors and strongly
discouraged for everybody else, it will trigger a warning
when a driver hands mac80211 a buffer that is aligned in
...
...
@@ -113,33 +106,95 @@ config MAC80211_DEBUG_PACKET_ALIGNMENT
Say N unless you're writing a mac80211 based driver.
config MAC80211_
DEBUG
bool "
Enable debugging output
"
depends on MAC80211
config MAC80211_
NOINLINE
bool "
Do not inline TX/RX handlers
"
depends on MAC80211
_DEBUG_MENU
---help---
This option will enable debug tracing output for the
ieee80211 network stack.
This option affects code generation in mac80211, when
selected some functions are marked "noinline" to allow
easier debugging of problems in the transmit and receive
paths.
If you are not trying to debug or develop the ieee80211
subsystem, you most likely want to say N here.
This option increases code size a bit and inserts a lot
of function calls in the code, but is otherwise safe to
enable.
If unsure, say N unless you expect to be finding problems
in mac80211.
config MAC80211_VERBOSE_DEBUG
bool "Verbose debugging output"
depends on MAC80211_DEBUG_MENU
---help---
Selecting this option causes mac80211 to print out
many debugging messages. It should not be selected
on production systems as some of the messages are
remotely triggerable.
Do not select this option.
config MAC80211_HT_DEBUG
bool "
Enable HT debugging output
"
depends on MAC80211_DEBUG
bool "
Verbose HT debugging
"
depends on MAC80211_DEBUG
_MENU
---help---
This option enables 802.11n High Throughput features
debug tracing output.
I
f you are not trying to debug of develop the ieee80211
subsystem, you most likely want to say N her
e.
I
t should not be selected on production systems as some
of the messages are remotely triggerabl
e.
config MAC80211_VERBOSE_DEBUG
bool "Verbose debugging output"
depends on MAC80211_DEBUG
Do not select this option.
config MAC80211_TKIP_DEBUG
bool "Verbose TKIP debugging"
depends on MAC80211_DEBUG_MENU
---help---
Selecting this option causes mac80211 to print out
very verbose TKIP debugging messages. It should not
be selected on production systems as those messages
are remotely triggerable.
Do not select this option.
config MAC80211_IBSS_DEBUG
bool "Verbose IBSS debugging"
depends on MAC80211_DEBUG_MENU
---help---
Selecting this option causes mac80211 to print out
very verbose IBSS debugging messages. It should not
be selected on production systems as those messages
are remotely triggerable.
Do not select this option.
config MAC80211_VERBOSE_PS_DEBUG
bool "Verbose powersave mode debugging"
depends on MAC80211_DEBUG_MENU
---help---
Selecting this option causes mac80211 to print out very
verbose power save mode debugging messages (when mac80211
is an AP and has power saving stations.)
It should not be selected on production systems as those
messages are remotely triggerable.
Do not select this option.
config MAC80211_VERBOSE_MPL_DEBUG
bool "Verbose mesh peer link debugging"
depends on MAC80211_DEBUG_MENU
depends on MAC80211_MESH
---help---
Selecting this option causes mac80211 to print out very
verbose mesh peer link debugging messages (when mac80211
is taking part in a mesh network).
It should not be selected on production systems as those
messages are remotely triggerable.
Do not select this option.
config MAC80211_LOWTX_FRAME_DUMP
bool "Debug frame dumping"
depends on MAC80211_DEBUG
depends on MAC80211_DEBUG
_MENU
---help---
Selecting this option will cause the stack to
print a message for each frame that is handed
...
...
@@ -150,30 +205,21 @@ config MAC80211_LOWTX_FRAME_DUMP
If unsure, say N and insert the debugging code
you require into the driver you are debugging.
config MAC80211_TKIP_DEBUG
bool "TKIP debugging"
depends on MAC80211_DEBUG
config MAC80211_DEBUG_COUNTERS
bool "Extra statistics for TX/RX debugging"
depends on MAC80211_DEBUG
config MAC80211_IBSS_DEBUG
bool "Support for IBSS testing"
depends on MAC80211_DEBUG
depends on MAC80211_DEBUG_MENU
depends on MAC80211_DEBUGFS
---help---
Say Y here if you intend to debug the IBSS code.
Selecting this option causes mac80211 to keep additional
and very verbose statistics about TX and RX handler use
and show them in debugfs.
config MAC80211_VERBOSE_PS_DEBUG
bool "Verbose powersave mode debugging"
depends on MAC80211_DEBUG
---help---
Say Y here to print out verbose powersave
mode debug messages.
If unsure, say N.
config MAC80211_VERBOSE_
MPL
_DEBUG
bool "Verbose
mesh peer link
debugging"
depends on MAC80211_DEBUG
&& MAC80211_MESH
config MAC80211_VERBOSE_
SPECT_MGMT
_DEBUG
bool "Verbose
Spectrum Management (IEEE 802.11h)
debugging"
depends on MAC80211_DEBUG
---help---
Say Y here to print out verbose
mesh peer link
Say Y here to print out verbose
Spectrum Management (IEEE 802.11h)
debug messages.
net/mac80211/Makefile
浏览文件 @
f3032be9
obj-$(CONFIG_MAC80211)
+=
mac80211.o
# objects for PID algorithm
rc80211_pid-y
:=
rc80211_pid_algo.o
rc80211_pid-$(CONFIG_MAC80211_DEBUGFS)
+=
rc80211_pid_debugfs.o
# build helper for PID algorithm
rc-pid-y
:=
$
(
rc80211_pid-y
)
rc-pid-m
:=
rc80211_pid.o
# mac80211 objects
mac80211-y
:=
\
main.o
\
...
...
@@ -42,10 +34,8 @@ mac80211-$(CONFIG_MAC80211_MESH) += \
mesh_plink.o
\
mesh_hwmp.o
# objects for PID algorithm
rc80211_pid-y
:=
rc80211_pid_algo.o
rc80211_pid-$(CONFIG_MAC80211_DEBUGFS)
+=
rc80211_pid_debugfs.o
# Build rate control algorithm(s)
CFLAGS_rc80211_pid_algo.o
+=
-DRC80211_PID_COMPILE
mac80211-$(CONFIG_MAC80211_RC_PID)
+=
$
(
rc-pid-
$(CONFIG_MAC80211_RC_PID)
)
# Modular rate algorithms are assigned to mac80211-m - make separate modules
obj-m
+=
$
(
mac80211-m
)
mac80211-$(CONFIG_MAC80211_RC_PID)
+=
$
(
rc80211_pid-y
)
net/mac80211/ieee80211_i.h
浏览文件 @
f3032be9
...
...
@@ -954,4 +954,10 @@ int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
void
mac80211_ev_michael_mic_failure
(
struct
net_device
*
dev
,
int
keyidx
,
struct
ieee80211_hdr
*
hdr
);
#ifdef CONFIG_MAC80211_NOINLINE
#define debug_noinline noinline
#else
#define debug_noinline
#endif
#endif
/* IEEE80211_I_H */
net/mac80211/iface.c
浏览文件 @
f3032be9
...
...
@@ -184,9 +184,9 @@ void ieee80211_if_set_type(struct net_device *dev, int type)
sdata
->
u
.
mntr_flags
=
MONITOR_FLAG_CONTROL
|
MONITOR_FLAG_OTHER_BSS
;
break
;
default
:
printk
(
KERN_WARNING
"%s: %s: Unknown interface type 0x%x"
,
dev
->
name
,
__func__
,
type
)
;
case
IEEE80211_IF_TYPE_INVALID
:
BUG
();
break
;
}
ieee80211_debugfs_change_if_type
(
sdata
,
oldtype
);
}
...
...
net/mac80211/main.c
浏览文件 @
f3032be9
...
...
@@ -151,9 +151,7 @@ static int ieee80211_change_mtu(struct net_device *dev, int new_mtu)
/* FIX: what would be proper limits for MTU?
* This interface uses 802.3 frames. */
if
(
new_mtu
<
256
||
new_mtu
>
IEEE80211_MAX_DATA_LEN
-
24
-
6
-
meshhdrlen
)
{
printk
(
KERN_WARNING
"%s: invalid MTU %d
\n
"
,
dev
->
name
,
new_mtu
);
new_mtu
>
IEEE80211_MAX_DATA_LEN
-
24
-
6
-
meshhdrlen
)
{
return
-
EINVAL
;
}
...
...
@@ -589,7 +587,9 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
sta
=
sta_info_get
(
local
,
ra
);
if
(
!
sta
)
{
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"Could not find the station
\n
"
);
#endif
ret
=
-
ENOENT
;
goto
exit
;
}
...
...
@@ -617,9 +617,11 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
sta
->
ampdu_mlme
.
tid_tx
[
tid
]
=
kmalloc
(
sizeof
(
struct
tid_ampdu_tx
),
GFP_ATOMIC
);
if
(
!
sta
->
ampdu_mlme
.
tid_tx
[
tid
])
{
#ifdef CONFIG_MAC80211_HT_DEBUG
if
(
net_ratelimit
())
printk
(
KERN_ERR
"allocate tx mlme to tid %d failed
\n
"
,
tid
);
#endif
ret
=
-
ENOMEM
;
goto
err_unlock_sta
;
}
...
...
@@ -689,7 +691,9 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
sta
->
ampdu_mlme
.
tid_tx
[
tid
]
->
addba_resp_timer
.
expires
=
jiffies
+
ADDBA_RESP_INTERVAL
;
add_timer
(
&
sta
->
ampdu_mlme
.
tid_tx
[
tid
]
->
addba_resp_timer
);
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"activated addBA response timer on tid %d
\n
"
,
tid
);
#endif
goto
exit
;
err_unlock_queue:
...
...
@@ -771,8 +775,10 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid)
DECLARE_MAC_BUF
(
mac
);
if
(
tid
>=
STA_TID_NUM
)
{
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"Bad TID value: tid = %d (>= %d)
\n
"
,
tid
,
STA_TID_NUM
);
#endif
return
;
}
...
...
@@ -780,8 +786,10 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid)
sta
=
sta_info_get
(
local
,
ra
);
if
(
!
sta
)
{
rcu_read_unlock
();
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"Could not find station: %s
\n
"
,
print_mac
(
mac
,
ra
));
#endif
return
;
}
...
...
@@ -789,8 +797,10 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid)
spin_lock_bh
(
&
sta
->
lock
);
if
(
!
(
*
state
&
HT_ADDBA_REQUESTED_MSK
))
{
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"addBA was not requested yet, state is %d
\n
"
,
*
state
);
#endif
spin_unlock_bh
(
&
sta
->
lock
);
rcu_read_unlock
();
return
;
...
...
@@ -801,7 +811,9 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid)
*
state
|=
HT_ADDBA_DRV_READY_MSK
;
if
(
*
state
==
HT_AGG_STATE_OPERATIONAL
)
{
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"Aggregation is on for tid %d
\n
"
,
tid
);
#endif
ieee80211_wake_queue
(
hw
,
sta
->
tid_to_tx_q
[
tid
]);
}
spin_unlock_bh
(
&
sta
->
lock
);
...
...
@@ -818,8 +830,10 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid)
DECLARE_MAC_BUF
(
mac
);
if
(
tid
>=
STA_TID_NUM
)
{
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"Bad TID value: tid = %d (>= %d)
\n
"
,
tid
,
STA_TID_NUM
);
#endif
return
;
}
...
...
@@ -831,8 +845,10 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid)
rcu_read_lock
();
sta
=
sta_info_get
(
local
,
ra
);
if
(
!
sta
)
{
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"Could not find station: %s
\n
"
,
print_mac
(
mac
,
ra
));
#endif
rcu_read_unlock
();
return
;
}
...
...
@@ -842,7 +858,9 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid)
* ieee80211_stop_tx_ba_session will let only
* one stop call to pass through per sta/tid */
if
((
*
state
&
HT_AGG_STATE_REQ_STOP_BA_MSK
)
==
0
)
{
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"unexpected callback to A-MPDU stop
\n
"
);
#endif
rcu_read_unlock
();
return
;
}
...
...
@@ -884,9 +902,11 @@ void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw,
struct
sk_buff
*
skb
=
dev_alloc_skb
(
0
);
if
(
unlikely
(
!
skb
))
{
#ifdef CONFIG_MAC80211_HT_DEBUG
if
(
net_ratelimit
())
printk
(
KERN_WARNING
"%s: Not enough memory, "
"dropping start BA session"
,
skb
->
dev
->
name
);
#endif
return
;
}
ra_tid
=
(
struct
ieee80211_ra_tid
*
)
&
skb
->
cb
;
...
...
@@ -907,9 +927,11 @@ void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw,
struct
sk_buff
*
skb
=
dev_alloc_skb
(
0
);
if
(
unlikely
(
!
skb
))
{
#ifdef CONFIG_MAC80211_HT_DEBUG
if
(
net_ratelimit
())
printk
(
KERN_WARNING
"%s: Not enough memory, "
"dropping stop BA session"
,
skb
->
dev
->
name
);
#endif
return
;
}
ra_tid
=
(
struct
ieee80211_ra_tid
*
)
&
skb
->
cb
;
...
...
@@ -1236,9 +1258,8 @@ static void ieee80211_tasklet_handler(unsigned long data)
ra_tid
->
ra
,
ra_tid
->
tid
);
dev_kfree_skb
(
skb
);
break
;
default:
/* should never get here! */
printk
(
KERN_ERR
"%s: Unknown message type (%d)
\n
"
,
wiphy_name
(
local
->
hw
.
wiphy
),
skb
->
pkt_type
);
default:
WARN_ON
(
1
);
dev_kfree_skb
(
skb
);
break
;
}
...
...
@@ -1365,12 +1386,14 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
return
;
}
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
if
(
net_ratelimit
())
printk
(
KERN_DEBUG
"%s: dropped TX filtered frame, "
"queue_len=%d PS=%d @%lu
\n
"
,
wiphy_name
(
local
->
hw
.
wiphy
),
skb_queue_len
(
&
sta
->
tx_filtered
),
!!
test_sta_flags
(
sta
,
WLAN_STA_PS
),
jiffies
);
#endif
dev_kfree_skb
(
skb
);
}
...
...
net/mac80211/mesh_pathtbl.c
浏览文件 @
f3032be9
...
...
@@ -262,7 +262,6 @@ void mesh_plink_broken(struct sta_info *sta)
}
rcu_read_unlock
();
}
EXPORT_SYMBOL
(
mesh_plink_broken
);
/**
* mesh_path_flush_by_nexthop - Deletes mesh paths if their next hop matches
...
...
net/mac80211/mlme.c
浏览文件 @
f3032be9
此差异已折叠。
点击以展开。
net/mac80211/rate.h
浏览文件 @
f3032be9
...
...
@@ -162,9 +162,7 @@ void rate_control_deinitialize(struct ieee80211_local *local);
/* Rate control algorithms */
#if defined(RC80211_PID_COMPILE) || \
(defined(CONFIG_MAC80211_RC_PID) && \
!defined(CONFIG_MAC80211_RC_PID_MODULE))
#ifdef CONFIG_MAC80211_RC_PID
extern
int
rc80211_pid_init
(
void
);
extern
void
rc80211_pid_exit
(
void
);
#else
...
...
net/mac80211/rc80211_pid_algo.c
浏览文件 @
f3032be9
...
...
@@ -540,11 +540,6 @@ static struct rate_control_ops mac80211_rcpid = {
#endif
};
MODULE_DESCRIPTION
(
"PID controller based rate control algorithm"
);
MODULE_AUTHOR
(
"Stefano Brivio"
);
MODULE_AUTHOR
(
"Mattias Nissler"
);
MODULE_LICENSE
(
"GPL"
);
int
__init
rc80211_pid_init
(
void
)
{
return
ieee80211_rate_control_register
(
&
mac80211_rcpid
);
...
...
@@ -554,8 +549,3 @@ void rc80211_pid_exit(void)
{
ieee80211_rate_control_unregister
(
&
mac80211_rcpid
);
}
#ifdef CONFIG_MAC80211_RC_PID_MODULE
module_init
(
rc80211_pid_init
);
module_exit
(
rc80211_pid_exit
);
#endif
net/mac80211/rx.c
浏览文件 @
f3032be9
此差异已折叠。
点击以展开。
net/mac80211/sta_info.c
浏览文件 @
f3032be9
...
...
@@ -554,8 +554,10 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
sdata
=
sta
->
sdata
;
local
->
total_ps_buffered
--
;
#ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG
printk
(
KERN_DEBUG
"Buffered frame expired (STA "
"%s)
\n
"
,
print_mac
(
mac
,
sta
->
addr
));
#endif
dev_kfree_skb
(
skb
);
if
(
skb_queue_empty
(
&
sta
->
ps_tx_buf
))
...
...
net/mac80211/tx.c
浏览文件 @
f3032be9
...
...
@@ -220,7 +220,7 @@ static int inline is_ieee80211_device(struct net_device *dev,
/* tx handlers */
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_check_assoc
(
struct
ieee80211_tx_data
*
tx
)
{
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
...
...
@@ -274,7 +274,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
return
TX_CONTINUE
;
}
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_sequence
(
struct
ieee80211_tx_data
*
tx
)
{
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
tx
->
skb
->
data
;
...
...
@@ -327,8 +327,10 @@ static void purge_old_ps_buffers(struct ieee80211_local *local)
rcu_read_unlock
();
local
->
total_ps_buffered
=
total
;
#ifdef MAC80211_VERBOSE_PS_DEBUG
printk
(
KERN_DEBUG
"%s: PS buffers full - purged %d frames
\n
"
,
wiphy_name
(
local
->
hw
.
wiphy
),
purged
);
#endif
}
static
ieee80211_tx_result
...
...
@@ -358,11 +360,13 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
purge_old_ps_buffers
(
tx
->
local
);
if
(
skb_queue_len
(
&
tx
->
sdata
->
bss
->
ps_bc_buf
)
>=
AP_MAX_BC_BUFFER
)
{
#ifdef MAC80211_VERBOSE_PS_DEBUG
if
(
net_ratelimit
())
{
printk
(
KERN_DEBUG
"%s: BC TX buffer full - "
"dropping the oldest frame
\n
"
,
tx
->
dev
->
name
);
}
#endif
dev_kfree_skb
(
skb_dequeue
(
&
tx
->
sdata
->
bss
->
ps_bc_buf
));
}
else
tx
->
local
->
total_ps_buffered
++
;
...
...
@@ -403,11 +407,13 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
purge_old_ps_buffers
(
tx
->
local
);
if
(
skb_queue_len
(
&
sta
->
ps_tx_buf
)
>=
STA_MAX_TX_BUFFER
)
{
struct
sk_buff
*
old
=
skb_dequeue
(
&
sta
->
ps_tx_buf
);
#ifdef MAC80211_VERBOSE_PS_DEBUG
if
(
net_ratelimit
())
{
printk
(
KERN_DEBUG
"%s: STA %s TX "
"buffer full - dropping oldest frame
\n
"
,
tx
->
dev
->
name
,
print_mac
(
mac
,
sta
->
addr
));
}
#endif
dev_kfree_skb
(
old
);
}
else
tx
->
local
->
total_ps_buffered
++
;
...
...
@@ -432,7 +438,7 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
return
TX_CONTINUE
;
}
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_ps_buf
(
struct
ieee80211_tx_data
*
tx
)
{
if
(
unlikely
(
tx
->
flags
&
IEEE80211_TX_PS_BUFFERED
))
...
...
@@ -444,7 +450,7 @@ ieee80211_tx_h_ps_buf(struct ieee80211_tx_data *tx)
return
ieee80211_tx_h_multicast_ps_buf
(
tx
);
}
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_select_key
(
struct
ieee80211_tx_data
*
tx
)
{
struct
ieee80211_key
*
key
;
...
...
@@ -493,7 +499,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
return
TX_CONTINUE
;
}
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_rate_ctrl
(
struct
ieee80211_tx_data
*
tx
)
{
struct
rate_selection
rsel
;
...
...
@@ -537,7 +543,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
return
TX_CONTINUE
;
}
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_misc
(
struct
ieee80211_tx_data
*
tx
)
{
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
tx
->
skb
->
data
;
...
...
@@ -632,7 +638,7 @@ ieee80211_tx_h_misc(struct ieee80211_tx_data *tx)
return
TX_CONTINUE
;
}
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_fragment
(
struct
ieee80211_tx_data
*
tx
)
{
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
tx
->
skb
->
data
;
...
...
@@ -713,7 +719,6 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx)
return
TX_CONTINUE
;
fail:
printk
(
KERN_DEBUG
"%s: failed to fragment frame
\n
"
,
tx
->
dev
->
name
);
if
(
frags
)
{
for
(
i
=
0
;
i
<
num_fragm
-
1
;
i
++
)
if
(
frags
[
i
])
...
...
@@ -724,7 +729,7 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx)
return
TX_DROP
;
}
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_encrypt
(
struct
ieee80211_tx_data
*
tx
)
{
if
(
!
tx
->
key
)
...
...
@@ -744,7 +749,7 @@ ieee80211_tx_h_encrypt(struct ieee80211_tx_data *tx)
return
TX_DROP
;
}
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_calculate_duration
(
struct
ieee80211_tx_data
*
tx
)
{
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
tx
->
skb
->
data
;
...
...
@@ -774,7 +779,7 @@ ieee80211_tx_h_calculate_duration(struct ieee80211_tx_data *tx)
return
TX_CONTINUE
;
}
static
ieee80211_tx_result
static
ieee80211_tx_result
debug_noinline
ieee80211_tx_h_stats
(
struct
ieee80211_tx_data
*
tx
)
{
int
i
;
...
...
@@ -795,24 +800,6 @@ ieee80211_tx_h_stats(struct ieee80211_tx_data *tx)
}
typedef
ieee80211_tx_result
(
*
ieee80211_tx_handler
)(
struct
ieee80211_tx_data
*
);
static
ieee80211_tx_handler
ieee80211_tx_handlers
[]
=
{
ieee80211_tx_h_check_assoc
,
ieee80211_tx_h_sequence
,
ieee80211_tx_h_ps_buf
,
ieee80211_tx_h_select_key
,
ieee80211_tx_h_michael_mic_add
,
ieee80211_tx_h_rate_ctrl
,
ieee80211_tx_h_misc
,
ieee80211_tx_h_fragment
,
/* handlers after fragment must be aware of tx info fragmentation! */
ieee80211_tx_h_encrypt
,
ieee80211_tx_h_calculate_duration
,
ieee80211_tx_h_stats
,
NULL
};
/* actual transmit path */
/*
...
...
@@ -1110,20 +1097,32 @@ static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb,
*/
static
int
invoke_tx_handlers
(
struct
ieee80211_tx_data
*
tx
)
{
struct
ieee80211_local
*
local
=
tx
->
local
;
struct
sk_buff
*
skb
=
tx
->
skb
;
ieee80211_tx_handler
*
handler
;
ieee80211_tx_result
res
=
TX_DROP
;
int
i
;
for
(
handler
=
ieee80211_tx_handlers
;
*
handler
!=
NULL
;
handler
++
)
{
res
=
(
*
handler
)(
tx
);
if
(
res
!=
TX_CONTINUE
)
break
;
}
#define CALL_TXH(txh) \
res = txh(tx); \
if (res != TX_CONTINUE) \
goto txh_done;
CALL_TXH
(
ieee80211_tx_h_check_assoc
)
CALL_TXH
(
ieee80211_tx_h_sequence
)
CALL_TXH
(
ieee80211_tx_h_ps_buf
)
CALL_TXH
(
ieee80211_tx_h_select_key
)
CALL_TXH
(
ieee80211_tx_h_michael_mic_add
)
CALL_TXH
(
ieee80211_tx_h_rate_ctrl
)
CALL_TXH
(
ieee80211_tx_h_misc
)
CALL_TXH
(
ieee80211_tx_h_fragment
)
/* handlers after fragment must be aware of tx info fragmentation! */
CALL_TXH
(
ieee80211_tx_h_encrypt
)
CALL_TXH
(
ieee80211_tx_h_calculate_duration
)
CALL_TXH
(
ieee80211_tx_h_stats
)
#undef CALL_TXH
txh_done:
if
(
unlikely
(
res
==
TX_DROP
))
{
I802_DEBUG_INC
(
local
->
tx_handlers_drop
);
I802_DEBUG_INC
(
tx
->
local
->
tx_handlers_drop
);
dev_kfree_skb
(
skb
);
for
(
i
=
0
;
i
<
tx
->
num_extra_frag
;
i
++
)
if
(
tx
->
extra_frag
[
i
])
...
...
@@ -1131,7 +1130,7 @@ static int invoke_tx_handlers(struct ieee80211_tx_data *tx)
kfree
(
tx
->
extra_frag
);
return
-
1
;
}
else
if
(
unlikely
(
res
==
TX_QUEUED
))
{
I802_DEBUG_INC
(
local
->
tx_handlers_queued
);
I802_DEBUG_INC
(
tx
->
local
->
tx_handlers_queued
);
return
-
1
;
}
...
...
@@ -1410,8 +1409,6 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb,
sdata
=
IEEE80211_DEV_TO_SUB_IF
(
dev
);
if
(
unlikely
(
skb
->
len
<
ETH_HLEN
))
{
printk
(
KERN_DEBUG
"%s: short skb (len=%d)
\n
"
,
dev
->
name
,
skb
->
len
);
ret
=
0
;
goto
fail
;
}
...
...
net/mac80211/wep.c
浏览文件 @
f3032be9
...
...
@@ -253,11 +253,8 @@ int ieee80211_wep_decrypt(struct ieee80211_local *local, struct sk_buff *skb,
if
(
ieee80211_wep_decrypt_data
(
local
->
wep_rx_tfm
,
rc4key
,
klen
,
skb
->
data
+
hdrlen
+
WEP_IV_LEN
,
len
))
{
if
(
net_ratelimit
())
printk
(
KERN_DEBUG
"WEP decrypt failed (ICV)
\n
"
);
len
))
ret
=
-
1
;
}
kfree
(
rc4key
);
...
...
@@ -301,14 +298,8 @@ ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx)
return
RX_CONTINUE
;
if
(
!
(
rx
->
status
->
flag
&
RX_FLAG_DECRYPTED
))
{
if
(
ieee80211_wep_decrypt
(
rx
->
local
,
rx
->
skb
,
rx
->
key
))
{
#ifdef CONFIG_MAC80211_DEBUG
if
(
net_ratelimit
())
printk
(
KERN_DEBUG
"%s: RX WEP frame, decrypt "
"failed
\n
"
,
rx
->
dev
->
name
);
#endif
/* CONFIG_MAC80211_DEBUG */
if
(
ieee80211_wep_decrypt
(
rx
->
local
,
rx
->
skb
,
rx
->
key
))
return
RX_DROP_UNUSABLE
;
}
}
else
if
(
!
(
rx
->
status
->
flag
&
RX_FLAG_IV_STRIPPED
))
{
ieee80211_wep_remove_iv
(
rx
->
local
,
rx
->
skb
,
rx
->
key
);
/* remove ICV */
...
...
net/mac80211/wme.c
浏览文件 @
f3032be9
...
...
@@ -680,7 +680,6 @@ void ieee80211_requeue(struct ieee80211_local *local, int queue)
if
(
!
qdisc
||
!
qdisc
->
dequeue
)
return
;
printk
(
KERN_DEBUG
"requeue: qlen = %d
\n
"
,
qdisc
->
q
.
qlen
);
for
(
len
=
qdisc
->
q
.
qlen
;
len
>
0
;
len
--
)
{
skb
=
qdisc
->
dequeue
(
qdisc
);
root_qd
->
q
.
qlen
--
;
...
...
net/mac80211/wpa.c
浏览文件 @
f3032be9
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录