Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
a003460b
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a003460b
编写于
15年前
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
上级
964ad81c
dee60269
无相关合并请求
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
107 addition
and
102 deletion
+107
-102
drivers/net/wireless/ath/ath5k/eeprom.c
drivers/net/wireless/ath/ath5k/eeprom.c
+2
-2
drivers/net/wireless/ath/ath5k/phy.c
drivers/net/wireless/ath/ath5k/phy.c
+21
-20
drivers/net/wireless/ath/ath5k/reg.h
drivers/net/wireless/ath/ath5k/reg.h
+1
-0
drivers/net/wireless/ath/ath5k/reset.c
drivers/net/wireless/ath/ath5k/reset.c
+12
-10
drivers/net/wireless/ipw2x00/ipw2200.c
drivers/net/wireless/ipw2x00/ipw2200.c
+17
-2
drivers/net/wireless/ipw2x00/libipw.h
drivers/net/wireless/ipw2x00/libipw.h
+1
-1
drivers/net/wireless/ipw2x00/libipw_module.c
drivers/net/wireless/ipw2x00/libipw_module.c
+17
-20
drivers/net/wireless/iwlwifi/iwl-3945.c
drivers/net/wireless/iwlwifi/iwl-3945.c
+3
-3
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-agn.c
+1
-1
drivers/net/wireless/iwlwifi/iwl-scan.c
drivers/net/wireless/iwlwifi/iwl-scan.c
+16
-33
drivers/net/wireless/rt2x00/rt2x00soc.h
drivers/net/wireless/rt2x00/rt2x00soc.h
+0
-2
net/mac80211/debugfs_netdev.c
net/mac80211/debugfs_netdev.c
+7
-3
net/mac80211/mlme.c
net/mac80211/mlme.c
+8
-5
net/mac80211/sta_info.c
net/mac80211/sta_info.c
+1
-0
未找到文件。
drivers/net/wireless/ath/ath5k/eeprom.c
浏览文件 @
a003460b
...
...
@@ -429,8 +429,8 @@ static int ath5k_eeprom_read_modes(struct ath5k_hw *ah, u32 *offset,
ee
->
ee_margin_tx_rx
[
mode
]
=
(
val
>>
8
)
&
0x3f
;
AR5K_EEPROM_READ
(
o
++
,
val
);
ee
->
ee_i_cal
[
mode
]
=
(
val
>>
8
)
&
0x3f
;
ee
->
ee_q_cal
[
mode
]
=
(
val
>>
3
)
&
0x1f
;
ee
->
ee_i_cal
[
mode
]
=
(
val
>>
5
)
&
0x3f
;
ee
->
ee_q_cal
[
mode
]
=
val
&
0x1f
;
if
(
ah
->
ah_ee_version
>=
AR5K_EEPROM_VERSION_4_2
)
{
AR5K_EEPROM_READ
(
o
++
,
val
);
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath5k/phy.c
浏览文件 @
a003460b
...
...
@@ -1386,38 +1386,39 @@ static int ath5k_hw_rf511x_calibrate(struct ath5k_hw *ah,
goto
done
;
/* Calibration has finished, get the results and re-run */
/* work around empty results which can apparently happen on 5212 */
for
(
i
=
0
;
i
<=
10
;
i
++
)
{
iq_corr
=
ath5k_hw_reg_read
(
ah
,
AR5K_PHY_IQRES_CAL_CORR
);
i_pwr
=
ath5k_hw_reg_read
(
ah
,
AR5K_PHY_IQRES_CAL_PWR_I
);
q_pwr
=
ath5k_hw_reg_read
(
ah
,
AR5K_PHY_IQRES_CAL_PWR_Q
);
ATH5K_DBG_UNLIMIT
(
ah
->
ah_sc
,
ATH5K_DEBUG_CALIBRATE
,
"iq_corr:%x i_pwr:%x q_pwr:%x"
,
iq_corr
,
i_pwr
,
q_pwr
);
if
(
i_pwr
&&
q_pwr
)
break
;
}
i_coffd
=
((
i_pwr
>>
1
)
+
(
q_pwr
>>
1
))
>>
7
;
q_coffd
=
q_pwr
>>
7
;
/*
No correction
*/
if
(
i_coffd
==
0
||
q_coffd
==
0
)
/*
protect against divide by 0 and loss of sign bits
*/
if
(
i_coffd
==
0
||
q_coffd
<
2
)
goto
done
;
i_coff
=
((
-
iq_corr
)
/
i_coffd
);
/* Boundary check */
if
(
i_coff
>
31
)
i_coff
=
31
;
if
(
i_coff
<
-
32
)
i_coff
=
-
32
;
i_coff
=
(
-
iq_corr
)
/
i_coffd
;
i_coff
=
clamp
(
i_coff
,
-
32
,
31
);
/* signed 6 bit */
q_coff
=
(((
s32
)
i_pwr
/
q_coffd
)
-
128
);
q_coff
=
(
i_pwr
/
q_coffd
)
-
128
;
q_coff
=
clamp
(
q_coff
,
-
16
,
15
);
/* signed 5 bit */
/* Boundary check */
if
(
q_coff
>
15
)
q_coff
=
15
;
if
(
q_coff
<
-
16
)
q_coff
=
-
16
;
ATH5K_DBG_UNLIMIT
(
ah
->
ah_sc
,
ATH5K_DEBUG_CALIBRATE
,
"new I:%d Q:%d (i_coffd:%x q_coffd:%x)"
,
i_coff
,
q_coff
,
i_coffd
,
q_coffd
);
/* Commit new I/Q value */
AR5K_REG_ENABLE_BITS
(
ah
,
AR5K_PHY_IQ
,
AR5K_PHY_IQ_CORR_ENABLE
|
((
u32
)
q_coff
)
|
((
u32
)
i_coff
<<
AR5K_PHY_IQ_CORR_Q_I_COFF_S
));
/* Commit new I/Q values (set enable bit last to match HAL sources) */
AR5K_REG_WRITE_BITS
(
ah
,
AR5K_PHY_IQ
,
AR5K_PHY_IQ_CORR_Q_I_COFF
,
i_coff
);
AR5K_REG_WRITE_BITS
(
ah
,
AR5K_PHY_IQ
,
AR5K_PHY_IQ_CORR_Q_Q_COFF
,
q_coff
);
AR5K_REG_ENABLE_BITS
(
ah
,
AR5K_PHY_IQ
,
AR5K_PHY_IQ_CORR_ENABLE
);
/* Re-enable calibration -if we don't we'll commit
* the same values again and again */
...
...
@@ -1873,7 +1874,7 @@ ath5k_hw_set_antenna_mode(struct ath5k_hw *ah, u8 ant_mode)
break
;
case
AR5K_ANTMODE_FIXED_A
:
def_ant
=
1
;
tx_ant
=
0
;
tx_ant
=
1
;
use_def_for_tx
=
true
;
update_def_on_tx
=
false
;
use_def_for_rts
=
true
;
...
...
@@ -1882,7 +1883,7 @@ ath5k_hw_set_antenna_mode(struct ath5k_hw *ah, u8 ant_mode)
break
;
case
AR5K_ANTMODE_FIXED_B
:
def_ant
=
2
;
tx_ant
=
0
;
tx_ant
=
2
;
use_def_for_tx
=
true
;
update_def_on_tx
=
false
;
use_def_for_rts
=
true
;
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath5k/reg.h
浏览文件 @
a003460b
...
...
@@ -2187,6 +2187,7 @@
*/
#define AR5K_PHY_IQ 0x9920
/* Register Address */
#define AR5K_PHY_IQ_CORR_Q_Q_COFF 0x0000001f
/* Mask for q correction info */
#define AR5K_PHY_IQ_CORR_Q_Q_COFF_S 0
#define AR5K_PHY_IQ_CORR_Q_I_COFF 0x000007e0
/* Mask for i correction info */
#define AR5K_PHY_IQ_CORR_Q_I_COFF_S 5
#define AR5K_PHY_IQ_CORR_ENABLE 0x00000800
/* Enable i/q correction */
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath5k/reset.c
浏览文件 @
a003460b
...
...
@@ -851,12 +851,15 @@ static void ath5k_hw_commit_eeprom_settings(struct ath5k_hw *ah,
AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1
,
AR5K_INIT_CYCRSSI_THR1
);
/* I/Q correction
* TODO: Per channel i/q infos ? */
AR5K_REG_ENABLE_BITS
(
ah
,
AR5K_PHY_IQ
,
AR5K_PHY_IQ_CORR_ENABLE
|
(
ee
->
ee_i_cal
[
ee_mode
]
<<
AR5K_PHY_IQ_CORR_Q_I_COFF_S
)
|
ee
->
ee_q_cal
[
ee_mode
]);
/* I/Q correction (set enable bit last to match HAL sources) */
/* TODO: Per channel i/q infos ? */
if
(
ah
->
ah_ee_version
>=
AR5K_EEPROM_VERSION_4_0
)
{
AR5K_REG_WRITE_BITS
(
ah
,
AR5K_PHY_IQ
,
AR5K_PHY_IQ_CORR_Q_I_COFF
,
ee
->
ee_i_cal
[
ee_mode
]);
AR5K_REG_WRITE_BITS
(
ah
,
AR5K_PHY_IQ
,
AR5K_PHY_IQ_CORR_Q_Q_COFF
,
ee
->
ee_q_cal
[
ee_mode
]);
AR5K_REG_ENABLE_BITS
(
ah
,
AR5K_PHY_IQ
,
AR5K_PHY_IQ_CORR_ENABLE
);
}
/* Heavy clipping -disable for now */
if
(
ah
->
ah_ee_version
>=
AR5K_EEPROM_VERSION_5_1
)
...
...
@@ -1379,11 +1382,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
ath5k_hw_set_sleep_clock
(
ah
,
true
);
/*
* Disable beacons and reset the
register
* Disable beacons and reset the
TSF
*/
AR5K_REG_DISABLE_BITS
(
ah
,
AR5K_BEACON
,
AR5K_BEACON_ENABLE
|
AR5K_BEACON_RESET_TSF
);
AR5K_REG_DISABLE_BITS
(
ah
,
AR5K_BEACON
,
AR5K_BEACON_ENABLE
);
ath5k_hw_reset_tsf
(
ah
);
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ipw2x00/ipw2200.c
浏览文件 @
a003460b
...
...
@@ -3177,14 +3177,27 @@ static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len)
int
total_nr
=
0
;
int
i
;
struct
pci_pool
*
pool
;
u32
*
virts
[
CB_NUMBER_OF_ELEMENTS_SMALL
]
;
dma_addr_t
phys
[
CB_NUMBER_OF_ELEMENTS_SMALL
]
;
void
**
virts
;
dma_addr_t
*
phys
;
IPW_DEBUG_TRACE
(
"<< :
\n
"
);
virts
=
kmalloc
(
sizeof
(
void
*
)
*
CB_NUMBER_OF_ELEMENTS_SMALL
,
GFP_KERNEL
);
if
(
!
virts
)
return
-
ENOMEM
;
phys
=
kmalloc
(
sizeof
(
dma_addr_t
)
*
CB_NUMBER_OF_ELEMENTS_SMALL
,
GFP_KERNEL
);
if
(
!
phys
)
{
kfree
(
virts
);
return
-
ENOMEM
;
}
pool
=
pci_pool_create
(
"ipw2200"
,
priv
->
pci_dev
,
CB_MAX_LENGTH
,
0
,
0
);
if
(
!
pool
)
{
IPW_ERROR
(
"pci_pool_create failed
\n
"
);
kfree
(
phys
);
kfree
(
virts
);
return
-
ENOMEM
;
}
...
...
@@ -3254,6 +3267,8 @@ static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len)
pci_pool_free
(
pool
,
virts
[
i
],
phys
[
i
]);
pci_pool_destroy
(
pool
);
kfree
(
phys
);
kfree
(
virts
);
return
ret
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ipw2x00/libipw.h
浏览文件 @
a003460b
...
...
@@ -797,7 +797,7 @@ struct libipw_device {
/* Probe / Beacon management */
struct
list_head
network_free_list
;
struct
list_head
network_list
;
struct
libipw_network
*
networks
;
struct
libipw_network
*
networks
[
MAX_NETWORK_COUNT
]
;
int
scans
;
int
scan_age
;
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ipw2x00/libipw_module.c
浏览文件 @
a003460b
...
...
@@ -67,16 +67,17 @@ void *libipw_wiphy_privid = &libipw_wiphy_privid;
static
int
libipw_networks_allocate
(
struct
libipw_device
*
ieee
)
{
if
(
ieee
->
networks
)
return
0
;
ieee
->
networks
=
kzalloc
(
MAX_NETWORK_COUNT
*
sizeof
(
struct
libipw_network
),
GFP_KERNEL
);
if
(
!
ieee
->
networks
)
{
printk
(
KERN_WARNING
"%s: Out of memory allocating beacons
\n
"
,
ieee
->
dev
->
name
);
return
-
ENOMEM
;
int
i
,
j
;
for
(
i
=
0
;
i
<
MAX_NETWORK_COUNT
;
i
++
)
{
ieee
->
networks
[
i
]
=
kzalloc
(
sizeof
(
struct
libipw_network
),
GFP_KERNEL
);
if
(
!
ieee
->
networks
[
i
])
{
LIBIPW_ERROR
(
"Out of memory allocating beacons
\n
"
);
for
(
j
=
0
;
j
<
i
;
j
++
)
kfree
(
ieee
->
networks
[
j
]);
return
-
ENOMEM
;
}
}
return
0
;
...
...
@@ -97,15 +98,11 @@ static inline void libipw_networks_free(struct libipw_device *ieee)
{
int
i
;
if
(
!
ieee
->
networks
)
return
;
for
(
i
=
0
;
i
<
MAX_NETWORK_COUNT
;
i
++
)
if
(
ieee
->
networks
[
i
].
ibss_dfs
)
kfree
(
ieee
->
networks
[
i
].
ibss_dfs
);
kfree
(
ieee
->
networks
);
ieee
->
networks
=
NULL
;
for
(
i
=
0
;
i
<
MAX_NETWORK_COUNT
;
i
++
)
{
if
(
ieee
->
networks
[
i
]
->
ibss_dfs
)
kfree
(
ieee
->
networks
[
i
]
->
ibss_dfs
);
kfree
(
ieee
->
networks
[
i
]);
}
}
void
libipw_networks_age
(
struct
libipw_device
*
ieee
,
...
...
@@ -130,7 +127,7 @@ static void libipw_networks_initialize(struct libipw_device *ieee)
INIT_LIST_HEAD
(
&
ieee
->
network_free_list
);
INIT_LIST_HEAD
(
&
ieee
->
network_list
);
for
(
i
=
0
;
i
<
MAX_NETWORK_COUNT
;
i
++
)
list_add_tail
(
&
ieee
->
networks
[
i
]
.
list
,
list_add_tail
(
&
ieee
->
networks
[
i
]
->
list
,
&
ieee
->
network_free_list
);
}
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-3945.c
浏览文件 @
a003460b
...
...
@@ -184,7 +184,7 @@ static int iwl3945_hwrate_to_plcp_idx(u8 plcp)
{
int
idx
;
for
(
idx
=
0
;
idx
<
IWL_RATE_COUNT
;
idx
++
)
for
(
idx
=
0
;
idx
<
IWL_RATE_COUNT
_3945
;
idx
++
)
if
(
iwl3945_rates
[
idx
].
plcp
==
plcp
)
return
idx
;
return
-
1
;
...
...
@@ -805,7 +805,7 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl_priv *priv,
int
sta_id
,
int
tx_id
)
{
u16
hw_value
=
ieee80211_get_tx_rate
(
priv
->
hw
,
info
)
->
hw_value
;
u16
rate_index
=
min
(
hw_value
&
0xffff
,
IWL_RATE_COUNT
-
1
);
u16
rate_index
=
min
(
hw_value
&
0xffff
,
IWL_RATE_COUNT
_3945
);
u16
rate_mask
;
int
rate
;
u8
rts_retry_limit
;
...
...
@@ -2146,7 +2146,7 @@ static void iwl3945_hw_reg_init_channel_groups(struct iwl_priv *priv)
/* fill in channel group's nominal powers for each rate */
for
(
rate_index
=
0
;
rate_index
<
IWL_RATE_COUNT
;
rate_index
++
,
clip_pwrs
++
)
{
rate_index
<
IWL_RATE_COUNT
_3945
;
rate_index
++
,
clip_pwrs
++
)
{
switch
(
rate_index
)
{
case
IWL_RATE_36M_INDEX_TABLE
:
if
(
i
==
0
)
/* B/G */
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-agn.c
浏览文件 @
a003460b
...
...
@@ -2653,7 +2653,7 @@ static int iwl_mac_setup_register(struct iwl_priv *priv)
*/
hw
->
wiphy
->
flags
&=
~
WIPHY_FLAG_PS_ON_BY_DEFAULT
;
hw
->
wiphy
->
max_scan_ssids
=
PROBE_OPTION_MAX
+
1
;
hw
->
wiphy
->
max_scan_ssids
=
PROBE_OPTION_MAX
;
/* we create the 802.11 header and a zero-length SSID element */
hw
->
wiphy
->
max_scan_ie_len
=
IWL_MAX_PROBE_REQUEST
-
24
-
2
;
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-scan.c
浏览文件 @
a003460b
...
...
@@ -638,20 +638,9 @@ u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
if
(
left
<
0
)
return
0
;
*
pos
++
=
WLAN_EID_SSID
;
if
(
!
priv
->
is_internal_short_scan
&&
priv
->
scan_request
->
n_ssids
)
{
struct
cfg80211_ssid
*
ssid
=
priv
->
scan_request
->
ssids
;
/* Broadcast if ssid_len is 0 */
*
pos
++
=
ssid
->
ssid_len
;
memcpy
(
pos
,
ssid
->
ssid
,
ssid
->
ssid_len
);
pos
+=
ssid
->
ssid_len
;
len
+=
2
+
ssid
->
ssid_len
;
}
else
{
*
pos
++
=
0
;
len
+=
2
;
}
*
pos
++
=
0
;
len
+=
2
;
if
(
WARN_ON
(
left
<
ie_len
))
return
len
;
...
...
@@ -780,26 +769,20 @@ static void iwl_bg_request_scan(struct work_struct *data)
if
(
priv
->
is_internal_short_scan
)
{
IWL_DEBUG_SCAN
(
priv
,
"Start internal passive scan.
\n
"
);
}
else
if
(
priv
->
scan_request
->
n_ssids
)
{
int
i
,
p
=
0
;
IWL_DEBUG_SCAN
(
priv
,
"Kicking off active scan
\n
"
);
/*
* The first SSID to scan is stuffed into the probe request
* template and the remaining ones are handled through the
* direct_scan array.
*/
if
(
priv
->
scan_request
->
n_ssids
>
1
)
{
int
i
,
p
=
0
;
for
(
i
=
1
;
i
<
priv
->
scan_request
->
n_ssids
;
i
++
)
{
if
(
!
priv
->
scan_request
->
ssids
[
i
].
ssid_len
)
continue
;
scan
->
direct_scan
[
p
].
id
=
WLAN_EID_SSID
;
scan
->
direct_scan
[
p
].
len
=
priv
->
scan_request
->
ssids
[
i
].
ssid_len
;
memcpy
(
scan
->
direct_scan
[
p
].
ssid
,
priv
->
scan_request
->
ssids
[
i
].
ssid
,
priv
->
scan_request
->
ssids
[
i
].
ssid_len
);
n_probes
++
;
p
++
;
}
for
(
i
=
0
;
i
<
priv
->
scan_request
->
n_ssids
;
i
++
)
{
/* always does wildcard anyway */
if
(
!
priv
->
scan_request
->
ssids
[
i
].
ssid_len
)
continue
;
scan
->
direct_scan
[
p
].
id
=
WLAN_EID_SSID
;
scan
->
direct_scan
[
p
].
len
=
priv
->
scan_request
->
ssids
[
i
].
ssid_len
;
memcpy
(
scan
->
direct_scan
[
p
].
ssid
,
priv
->
scan_request
->
ssids
[
i
].
ssid
,
priv
->
scan_request
->
ssids
[
i
].
ssid_len
);
n_probes
++
;
p
++
;
}
is_active
=
true
;
}
else
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/rt2x00/rt2x00soc.h
浏览文件 @
a003460b
...
...
@@ -26,8 +26,6 @@
#ifndef RT2X00SOC_H
#define RT2X00SOC_H
#define KSEG1ADDR(__ptr) __ptr
/*
* SoC driver handlers.
*/
...
...
This diff is collapsed.
Click to expand it.
net/mac80211/debugfs_netdev.c
浏览文件 @
a003460b
...
...
@@ -48,20 +48,24 @@ static ssize_t ieee80211_if_write(
ssize_t
(
*
write
)(
struct
ieee80211_sub_if_data
*
,
const
char
*
,
int
))
{
u8
*
buf
;
ssize_t
ret
=
-
ENODEV
;
ssize_t
ret
;
buf
=
k
z
alloc
(
count
,
GFP_KERNEL
);
buf
=
k
m
alloc
(
count
,
GFP_KERNEL
);
if
(
!
buf
)
return
-
ENOMEM
;
ret
=
-
EFAULT
;
if
(
copy_from_user
(
buf
,
userbuf
,
count
))
return
-
EFAULT
;
goto
freebuf
;
ret
=
-
ENODEV
;
rtnl_lock
();
if
(
sdata
->
dev
->
reg_state
==
NETREG_REGISTERED
)
ret
=
(
*
write
)(
sdata
,
buf
,
count
);
rtnl_unlock
();
freebuf:
kfree
(
buf
);
return
ret
;
}
...
...
This diff is collapsed.
Click to expand it.
net/mac80211/mlme.c
浏览文件 @
a003460b
...
...
@@ -436,10 +436,12 @@ static void ieee80211_enable_ps(struct ieee80211_local *local,
if
(
local
->
hw
.
flags
&
IEEE80211_HW_PS_NULLFUNC_STACK
)
ieee80211_send_nullfunc
(
local
,
sdata
,
1
);
if
(
!
(
local
->
hw
.
flags
&
IEEE80211_HW_REPORTS_TX_ACK_STATUS
))
{
conf
->
flags
|=
IEEE80211_CONF_PS
;
ieee80211_hw_config
(
local
,
IEEE80211_CONF_CHANGE_PS
);
}
if
((
local
->
hw
.
flags
&
IEEE80211_HW_PS_NULLFUNC_STACK
)
&&
(
local
->
hw
.
flags
&
IEEE80211_HW_REPORTS_TX_ACK_STATUS
))
return
;
conf
->
flags
|=
IEEE80211_CONF_PS
;
ieee80211_hw_config
(
local
,
IEEE80211_CONF_CHANGE_PS
);
}
}
...
...
@@ -558,7 +560,8 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
(
!
(
ifmgd
->
flags
&
IEEE80211_STA_NULLFUNC_ACKED
)))
ieee80211_send_nullfunc
(
local
,
sdata
,
1
);
if
(
!
(
local
->
hw
.
flags
&
IEEE80211_HW_REPORTS_TX_ACK_STATUS
)
||
if
(
!
((
local
->
hw
.
flags
&
IEEE80211_HW_REPORTS_TX_ACK_STATUS
)
&&
(
local
->
hw
.
flags
&
IEEE80211_HW_PS_NULLFUNC_STACK
))
||
(
ifmgd
->
flags
&
IEEE80211_STA_NULLFUNC_ACKED
))
{
ifmgd
->
flags
&=
~
IEEE80211_STA_NULLFUNC_ACKED
;
local
->
hw
.
conf
.
flags
|=
IEEE80211_CONF_PS
;
...
...
This diff is collapsed.
Click to expand it.
net/mac80211/sta_info.c
浏览文件 @
a003460b
...
...
@@ -434,6 +434,7 @@ int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU)
/* check if STA exists already */
if
(
sta_info_get_bss
(
sdata
,
sta
->
sta
.
addr
))
{
spin_unlock_irqrestore
(
&
local
->
sta_lock
,
flags
);
mutex_unlock
(
&
local
->
sta_mtx
);
rcu_read_lock
();
err
=
-
EEXIST
;
goto
out_free
;
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
反馈
建议
客服
返回
顶部