Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
cbe461c5
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看板
提交
cbe461c5
编写于
6月 11, 2012
作者:
G
Gustavo Padovan
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-upstream' of
git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth
Conflicts: net/bluetooth/hci_event.c
上级
1d0c4da8
1c2e0041
变更
26
隐藏空白更改
内联
并排
Showing
26 changed file
with
238 addition
and
49 deletion
+238
-49
drivers/bcma/driver_chipcommon_pmu.c
drivers/bcma/driver_chipcommon_pmu.c
+3
-1
drivers/bcma/sprom.c
drivers/bcma/sprom.c
+2
-2
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+2
-2
drivers/net/wireless/iwlwifi/iwl-eeprom.c
drivers/net/wireless/iwlwifi/iwl-eeprom.c
+9
-9
drivers/net/wireless/iwlwifi/iwl-mac80211.c
drivers/net/wireless/iwlwifi/iwl-mac80211.c
+2
-0
drivers/net/wireless/mac80211_hwsim.c
drivers/net/wireless/mac80211_hwsim.c
+21
-0
drivers/net/wireless/mwifiex/cfg80211.c
drivers/net/wireless/mwifiex/cfg80211.c
+13
-0
drivers/net/wireless/mwifiex/fw.h
drivers/net/wireless/mwifiex/fw.h
+6
-0
drivers/net/wireless/mwifiex/uap_cmd.c
drivers/net/wireless/mwifiex/uap_cmd.c
+10
-0
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00.h
+1
-2
drivers/net/wireless/rt2x00/rt2x00mac.c
drivers/net/wireless/rt2x00/rt2x00mac.c
+0
-1
drivers/net/wireless/rt2x00/rt2x00queue.c
drivers/net/wireless/rt2x00/rt2x00queue.c
+6
-7
include/net/bluetooth/hci.h
include/net/bluetooth/hci.h
+6
-0
net/bluetooth/hci_event.c
net/bluetooth/hci_event.c
+48
-0
net/bluetooth/l2cap_core.c
net/bluetooth/l2cap_core.c
+6
-1
net/bluetooth/mgmt.c
net/bluetooth/mgmt.c
+18
-0
net/bluetooth/smp.c
net/bluetooth/smp.c
+7
-4
net/mac80211/agg-rx.c
net/mac80211/agg-rx.c
+6
-1
net/mac80211/cfg.c
net/mac80211/cfg.c
+3
-3
net/mac80211/iface.c
net/mac80211/iface.c
+12
-0
net/mac80211/mlme.c
net/mac80211/mlme.c
+27
-9
net/mac80211/offchannel.c
net/mac80211/offchannel.c
+16
-0
net/mac80211/sta_info.c
net/mac80211/sta_info.c
+2
-2
net/mac80211/tx.c
net/mac80211/tx.c
+6
-3
net/mac80211/util.c
net/mac80211/util.c
+1
-1
net/wireless/ibss.c
net/wireless/ibss.c
+5
-1
未找到文件。
drivers/bcma/driver_chipcommon_pmu.c
浏览文件 @
cbe461c5
...
...
@@ -139,7 +139,9 @@ void bcma_pmu_workarounds(struct bcma_drv_cc *cc)
bcma_chipco_chipctl_maskset
(
cc
,
0
,
~
0
,
0x7
);
break
;
case
0x4331
:
/* BCM4331 workaround is SPROM-related, we put it in sprom.c */
case
43431
:
/* Ext PA lines must be enabled for tx on BCM4331 */
bcma_chipco_bcm4331_ext_pa_lines_ctl
(
cc
,
true
);
break
;
case
43224
:
if
(
bus
->
chipinfo
.
rev
==
0
)
{
...
...
drivers/bcma/sprom.c
浏览文件 @
cbe461c5
...
...
@@ -579,13 +579,13 @@ int bcma_sprom_get(struct bcma_bus *bus)
if
(
!
sprom
)
return
-
ENOMEM
;
if
(
bus
->
chipinfo
.
id
==
0x4331
)
if
(
bus
->
chipinfo
.
id
==
0x4331
||
bus
->
chipinfo
.
id
==
43431
)
bcma_chipco_bcm4331_ext_pa_lines_ctl
(
&
bus
->
drv_cc
,
false
);
pr_debug
(
"SPROM offset 0x%x
\n
"
,
offset
);
bcma_sprom_read
(
bus
,
offset
,
sprom
);
if
(
bus
->
chipinfo
.
id
==
0x4331
)
if
(
bus
->
chipinfo
.
id
==
0x4331
||
bus
->
chipinfo
.
id
==
43431
)
bcma_chipco_bcm4331_ext_pa_lines_ctl
(
&
bus
->
drv_cc
,
true
);
err
=
bcma_sprom_valid
(
sprom
);
...
...
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
浏览文件 @
cbe461c5
...
...
@@ -89,9 +89,9 @@ int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev)
data
|=
1
<<
SDIO_FUNC_1
|
1
<<
SDIO_FUNC_2
|
1
;
brcmf_sdio_regwb
(
sdiodev
,
SDIO_CCCR_IENx
,
data
,
&
ret
);
/* redirect, configure an
e
enable io for interrupt signal */
/* redirect, configure an
d
enable io for interrupt signal */
data
=
SDIO_SEPINT_MASK
|
SDIO_SEPINT_OE
;
if
(
sdiodev
->
irq_flags
|
IRQF_TRIGGER_HIGH
)
if
(
sdiodev
->
irq_flags
&
IRQF_TRIGGER_HIGH
)
data
|=
SDIO_SEPINT_ACT_HI
;
brcmf_sdio_regwb
(
sdiodev
,
SDIO_CCCR_BRCM_SEPINT
,
data
,
&
ret
);
...
...
drivers/net/wireless/iwlwifi/iwl-eeprom.c
浏览文件 @
cbe461c5
...
...
@@ -568,28 +568,28 @@ static int iwl_find_otp_image(struct iwl_trans *trans,
* iwl_get_max_txpower_avg - get the highest tx power from all chains.
* find the highest tx power from all chains for the channel
*/
static
s8
iwl_get_max_txpower_avg
(
const
struct
iwl_cfg
*
cfg
,
static
s8
iwl_get_max_txpower_avg
(
struct
iwl_priv
*
priv
,
struct
iwl_eeprom_enhanced_txpwr
*
enhanced_txpower
,
int
element
,
s8
*
max_txpower_in_half_dbm
)
{
s8
max_txpower_avg
=
0
;
/* (dBm) */
/* Take the highest tx power from any valid chains */
if
((
cfg
->
valid_tx_ant
&
ANT_A
)
&&
if
((
priv
->
hw_params
.
valid_tx_ant
&
ANT_A
)
&&
(
enhanced_txpower
[
element
].
chain_a_max
>
max_txpower_avg
))
max_txpower_avg
=
enhanced_txpower
[
element
].
chain_a_max
;
if
((
cfg
->
valid_tx_ant
&
ANT_B
)
&&
if
((
priv
->
hw_params
.
valid_tx_ant
&
ANT_B
)
&&
(
enhanced_txpower
[
element
].
chain_b_max
>
max_txpower_avg
))
max_txpower_avg
=
enhanced_txpower
[
element
].
chain_b_max
;
if
((
cfg
->
valid_tx_ant
&
ANT_C
)
&&
if
((
priv
->
hw_params
.
valid_tx_ant
&
ANT_C
)
&&
(
enhanced_txpower
[
element
].
chain_c_max
>
max_txpower_avg
))
max_txpower_avg
=
enhanced_txpower
[
element
].
chain_c_max
;
if
(((
cfg
->
valid_tx_ant
==
ANT_AB
)
|
(
cfg
->
valid_tx_ant
==
ANT_BC
)
|
(
cfg
->
valid_tx_ant
==
ANT_AC
))
&&
if
(((
priv
->
hw_params
.
valid_tx_ant
==
ANT_AB
)
|
(
priv
->
hw_params
.
valid_tx_ant
==
ANT_BC
)
|
(
priv
->
hw_params
.
valid_tx_ant
==
ANT_AC
))
&&
(
enhanced_txpower
[
element
].
mimo2_max
>
max_txpower_avg
))
max_txpower_avg
=
enhanced_txpower
[
element
].
mimo2_max
;
if
((
cfg
->
valid_tx_ant
==
ANT_ABC
)
&&
if
((
priv
->
hw_params
.
valid_tx_ant
==
ANT_ABC
)
&&
(
enhanced_txpower
[
element
].
mimo3_max
>
max_txpower_avg
))
max_txpower_avg
=
enhanced_txpower
[
element
].
mimo3_max
;
...
...
@@ -691,7 +691,7 @@ static void iwl_eeprom_enhanced_txpower(struct iwl_priv *priv)
((
txp
->
delta_20_in_40
&
0xf0
)
>>
4
),
(
txp
->
delta_20_in_40
&
0x0f
));
max_txp_avg
=
iwl_get_max_txpower_avg
(
priv
->
cfg
,
txp_array
,
idx
,
max_txp_avg
=
iwl_get_max_txpower_avg
(
priv
,
txp_array
,
idx
,
&
max_txp_avg_halfdbm
);
/*
...
...
drivers/net/wireless/iwlwifi/iwl-mac80211.c
浏览文件 @
cbe461c5
...
...
@@ -199,6 +199,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
WIPHY_FLAG_DISABLE_BEACON_HINTS
|
WIPHY_FLAG_IBSS_RSN
;
#ifdef CONFIG_PM_SLEEP
if
(
priv
->
fw
->
img
[
IWL_UCODE_WOWLAN
].
sec
[
0
].
len
&&
priv
->
trans
->
ops
->
wowlan_suspend
&&
device_can_wakeup
(
priv
->
trans
->
dev
))
{
...
...
@@ -217,6 +218,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
hw
->
wiphy
->
wowlan
.
pattern_max_len
=
IWLAGN_WOWLAN_MAX_PATTERN_LEN
;
}
#endif
if
(
iwlwifi_mod_params
.
power_save
)
hw
->
wiphy
->
flags
|=
WIPHY_FLAG_PS_ON_BY_DEFAULT
;
...
...
drivers/net/wireless/mac80211_hwsim.c
浏览文件 @
cbe461c5
...
...
@@ -1721,6 +1721,24 @@ static void hwsim_exit_netlink(void)
"unregister family %i
\n
"
,
ret
);
}
static
const
struct
ieee80211_iface_limit
hwsim_if_limits
[]
=
{
{
.
max
=
1
,
.
types
=
BIT
(
NL80211_IFTYPE_ADHOC
)
},
{
.
max
=
2048
,
.
types
=
BIT
(
NL80211_IFTYPE_STATION
)
|
BIT
(
NL80211_IFTYPE_P2P_CLIENT
)
|
#ifdef CONFIG_MAC80211_MESH
BIT
(
NL80211_IFTYPE_MESH_POINT
)
|
#endif
BIT
(
NL80211_IFTYPE_AP
)
|
BIT
(
NL80211_IFTYPE_P2P_GO
)
},
};
static
const
struct
ieee80211_iface_combination
hwsim_if_comb
=
{
.
limits
=
hwsim_if_limits
,
.
n_limits
=
ARRAY_SIZE
(
hwsim_if_limits
),
.
max_interfaces
=
2048
,
.
num_different_channels
=
1
,
};
static
int
__init
init_mac80211_hwsim
(
void
)
{
int
i
,
err
=
0
;
...
...
@@ -1782,6 +1800,9 @@ static int __init init_mac80211_hwsim(void)
hw
->
wiphy
->
n_addresses
=
2
;
hw
->
wiphy
->
addresses
=
data
->
addresses
;
hw
->
wiphy
->
iface_combinations
=
&
hwsim_if_comb
;
hw
->
wiphy
->
n_iface_combinations
=
1
;
if
(
fake_hw_scan
)
{
hw
->
wiphy
->
max_scan_ssids
=
255
;
hw
->
wiphy
->
max_scan_ie_len
=
IEEE80211_MAX_DATA_LEN
;
...
...
drivers/net/wireless/mwifiex/cfg80211.c
浏览文件 @
cbe461c5
...
...
@@ -948,6 +948,19 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy,
bss_cfg
->
ssid
.
ssid_len
=
params
->
ssid_len
;
}
switch
(
params
->
hidden_ssid
)
{
case
NL80211_HIDDEN_SSID_NOT_IN_USE
:
bss_cfg
->
bcast_ssid_ctl
=
1
;
break
;
case
NL80211_HIDDEN_SSID_ZERO_LEN
:
bss_cfg
->
bcast_ssid_ctl
=
0
;
break
;
case
NL80211_HIDDEN_SSID_ZERO_CONTENTS
:
/* firmware doesn't support this type of hidden SSID */
default:
return
-
EINVAL
;
}
if
(
mwifiex_set_secure_params
(
priv
,
bss_cfg
,
params
))
{
kfree
(
bss_cfg
);
wiphy_err
(
wiphy
,
"Failed to parse secuirty parameters!
\n
"
);
...
...
drivers/net/wireless/mwifiex/fw.h
浏览文件 @
cbe461c5
...
...
@@ -122,6 +122,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
#define TLV_TYPE_CHANNELBANDLIST (PROPRIETARY_TLV_BASE_ID + 42)
#define TLV_TYPE_UAP_BEACON_PERIOD (PROPRIETARY_TLV_BASE_ID + 44)
#define TLV_TYPE_UAP_DTIM_PERIOD (PROPRIETARY_TLV_BASE_ID + 45)
#define TLV_TYPE_UAP_BCAST_SSID (PROPRIETARY_TLV_BASE_ID + 48)
#define TLV_TYPE_UAP_RTS_THRESHOLD (PROPRIETARY_TLV_BASE_ID + 51)
#define TLV_TYPE_UAP_WPA_PASSPHRASE (PROPRIETARY_TLV_BASE_ID + 60)
#define TLV_TYPE_UAP_ENCRY_PROTOCOL (PROPRIETARY_TLV_BASE_ID + 64)
...
...
@@ -1209,6 +1210,11 @@ struct host_cmd_tlv_ssid {
u8
ssid
[
0
];
}
__packed
;
struct
host_cmd_tlv_bcast_ssid
{
struct
host_cmd_tlv
tlv
;
u8
bcast_ctl
;
}
__packed
;
struct
host_cmd_tlv_beacon_period
{
struct
host_cmd_tlv
tlv
;
__le16
period
;
...
...
drivers/net/wireless/mwifiex/uap_cmd.c
浏览文件 @
cbe461c5
...
...
@@ -132,6 +132,7 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size)
struct
host_cmd_tlv_dtim_period
*
dtim_period
;
struct
host_cmd_tlv_beacon_period
*
beacon_period
;
struct
host_cmd_tlv_ssid
*
ssid
;
struct
host_cmd_tlv_bcast_ssid
*
bcast_ssid
;
struct
host_cmd_tlv_channel_band
*
chan_band
;
struct
host_cmd_tlv_frag_threshold
*
frag_threshold
;
struct
host_cmd_tlv_rts_threshold
*
rts_threshold
;
...
...
@@ -153,6 +154,14 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size)
cmd_size
+=
sizeof
(
struct
host_cmd_tlv
)
+
bss_cfg
->
ssid
.
ssid_len
;
tlv
+=
sizeof
(
struct
host_cmd_tlv
)
+
bss_cfg
->
ssid
.
ssid_len
;
bcast_ssid
=
(
struct
host_cmd_tlv_bcast_ssid
*
)
tlv
;
bcast_ssid
->
tlv
.
type
=
cpu_to_le16
(
TLV_TYPE_UAP_BCAST_SSID
);
bcast_ssid
->
tlv
.
len
=
cpu_to_le16
(
sizeof
(
bcast_ssid
->
bcast_ctl
));
bcast_ssid
->
bcast_ctl
=
bss_cfg
->
bcast_ssid_ctl
;
cmd_size
+=
sizeof
(
struct
host_cmd_tlv_bcast_ssid
);
tlv
+=
sizeof
(
struct
host_cmd_tlv_bcast_ssid
);
}
if
(
bss_cfg
->
channel
&&
bss_cfg
->
channel
<=
MAX_CHANNEL_BAND_BG
)
{
chan_band
=
(
struct
host_cmd_tlv_channel_band
*
)
tlv
;
...
...
@@ -416,6 +425,7 @@ int mwifiex_uap_set_channel(struct mwifiex_private *priv, int channel)
if
(
!
bss_cfg
)
return
-
ENOMEM
;
mwifiex_set_sys_config_invalid_data
(
bss_cfg
);
bss_cfg
->
band_cfg
=
BAND_CONFIG_MANUAL
;
bss_cfg
->
channel
=
channel
;
...
...
drivers/net/wireless/rt2x00/rt2x00.h
浏览文件 @
cbe461c5
...
...
@@ -396,8 +396,7 @@ struct rt2x00_intf {
* for hardware which doesn't support hardware
* sequence counting.
*/
spinlock_t
seqlock
;
u16
seqno
;
atomic_t
seqno
;
};
static
inline
struct
rt2x00_intf
*
vif_to_intf
(
struct
ieee80211_vif
*
vif
)
...
...
drivers/net/wireless/rt2x00/rt2x00mac.c
浏览文件 @
cbe461c5
...
...
@@ -277,7 +277,6 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
else
rt2x00dev
->
intf_sta_count
++
;
spin_lock_init
(
&
intf
->
seqlock
);
mutex_init
(
&
intf
->
beacon_skb_mutex
);
intf
->
beacon
=
entry
;
...
...
drivers/net/wireless/rt2x00/rt2x00queue.c
浏览文件 @
cbe461c5
...
...
@@ -207,6 +207,7 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev,
struct
ieee80211_tx_info
*
tx_info
=
IEEE80211_SKB_CB
(
skb
);
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
struct
rt2x00_intf
*
intf
=
vif_to_intf
(
tx_info
->
control
.
vif
);
u16
seqno
;
if
(
!
(
tx_info
->
flags
&
IEEE80211_TX_CTL_ASSIGN_SEQ
))
return
;
...
...
@@ -238,15 +239,13 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev,
* sequence counting per-frame, since those will override the
* sequence counter given by mac80211.
*/
spin_lock
(
&
intf
->
seqlock
);
if
(
test_bit
(
ENTRY_TXD_FIRST_FRAGMENT
,
&
txdesc
->
flags
))
intf
->
seqno
+=
0x10
;
hdr
->
seq_ctrl
&=
cpu_to_le16
(
IEEE80211_SCTL_FRAG
);
hdr
->
seq_ctrl
|=
cpu_to_le16
(
intf
->
seqno
);
spin_unlock
(
&
intf
->
seqlock
);
seqno
=
atomic_add_return
(
0x10
,
&
intf
->
seqno
);
else
seqno
=
atomic_read
(
&
intf
->
seqno
);
hdr
->
seq_ctrl
&=
cpu_to_le16
(
IEEE80211_SCTL_FRAG
);
hdr
->
seq_ctrl
|=
cpu_to_le16
(
seqno
);
}
static
void
rt2x00queue_create_tx_descriptor_plcp
(
struct
rt2x00_dev
*
rt2x00dev
,
...
...
include/net/bluetooth/hci.h
浏览文件 @
cbe461c5
...
...
@@ -1195,6 +1195,12 @@ struct extended_inquiry_info {
__u8
data
[
240
];
}
__packed
;
#define HCI_EV_KEY_REFRESH_COMPLETE 0x30
struct
hci_ev_key_refresh_complete
{
__u8
status
;
__le16
handle
;
}
__packed
;
#define HCI_EV_IO_CAPA_REQUEST 0x31
struct
hci_ev_io_capa_request
{
bdaddr_t
bdaddr
;
...
...
net/bluetooth/hci_event.c
浏览文件 @
cbe461c5
...
...
@@ -3040,6 +3040,50 @@ static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
hci_dev_unlock
(
hdev
);
}
static
void
hci_key_refresh_complete_evt
(
struct
hci_dev
*
hdev
,
struct
sk_buff
*
skb
)
{
struct
hci_ev_key_refresh_complete
*
ev
=
(
void
*
)
skb
->
data
;
struct
hci_conn
*
conn
;
BT_DBG
(
"%s status %u handle %u"
,
hdev
->
name
,
ev
->
status
,
__le16_to_cpu
(
ev
->
handle
));
hci_dev_lock
(
hdev
);
conn
=
hci_conn_hash_lookup_handle
(
hdev
,
__le16_to_cpu
(
ev
->
handle
));
if
(
!
conn
)
goto
unlock
;
if
(
!
ev
->
status
)
conn
->
sec_level
=
conn
->
pending_sec_level
;
clear_bit
(
HCI_CONN_ENCRYPT_PEND
,
&
conn
->
flags
);
if
(
ev
->
status
&&
conn
->
state
==
BT_CONNECTED
)
{
hci_acl_disconn
(
conn
,
HCI_ERROR_AUTH_FAILURE
);
hci_conn_put
(
conn
);
goto
unlock
;
}
if
(
conn
->
state
==
BT_CONFIG
)
{
if
(
!
ev
->
status
)
conn
->
state
=
BT_CONNECTED
;
hci_proto_connect_cfm
(
conn
,
ev
->
status
);
hci_conn_put
(
conn
);
}
else
{
hci_auth_cfm
(
conn
,
ev
->
status
);
hci_conn_hold
(
conn
);
conn
->
disc_timeout
=
HCI_DISCONN_TIMEOUT
;
hci_conn_put
(
conn
);
}
unlock:
hci_dev_unlock
(
hdev
);
}
static
u8
hci_get_auth_req
(
struct
hci_conn
*
conn
)
{
/* If remote requests dedicated bonding follow that lead */
...
...
@@ -3560,6 +3604,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
hci_extended_inquiry_result_evt
(
hdev
,
skb
);
break
;
case
HCI_EV_KEY_REFRESH_COMPLETE
:
hci_key_refresh_complete_evt
(
hdev
,
skb
);
break
;
case
HCI_EV_IO_CAPA_REQUEST
:
hci_io_capa_request_evt
(
hdev
,
skb
);
break
;
...
...
net/bluetooth/l2cap_core.c
浏览文件 @
cbe461c5
...
...
@@ -1314,7 +1314,12 @@ static void security_timeout(struct work_struct *work)
struct
l2cap_conn
*
conn
=
container_of
(
work
,
struct
l2cap_conn
,
security_timer
.
work
);
l2cap_conn_del
(
conn
->
hcon
,
ETIMEDOUT
);
BT_DBG
(
"conn %p"
,
conn
);
if
(
test_and_clear_bit
(
HCI_CONN_LE_SMP_PEND
,
&
conn
->
hcon
->
flags
))
{
smp_chan_destroy
(
conn
);
l2cap_conn_del
(
conn
->
hcon
,
ETIMEDOUT
);
}
}
static
struct
l2cap_conn
*
l2cap_conn_add
(
struct
hci_conn
*
hcon
,
u8
status
)
...
...
net/bluetooth/mgmt.c
浏览文件 @
cbe461c5
...
...
@@ -1873,6 +1873,22 @@ static void pairing_complete_cb(struct hci_conn *conn, u8 status)
pairing_complete
(
cmd
,
mgmt_status
(
status
));
}
static
void
le_connect_complete_cb
(
struct
hci_conn
*
conn
,
u8
status
)
{
struct
pending_cmd
*
cmd
;
BT_DBG
(
"status %u"
,
status
);
if
(
!
status
)
return
;
cmd
=
find_pairing
(
conn
);
if
(
!
cmd
)
BT_DBG
(
"Unable to find a pending command"
);
else
pairing_complete
(
cmd
,
mgmt_status
(
status
));
}
static
int
pair_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
{
...
...
@@ -1941,6 +1957,8 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
/* For LE, just connecting isn't a proof that the pairing finished */
if
(
cp
->
addr
.
type
==
BDADDR_BREDR
)
conn
->
connect_cfm_cb
=
pairing_complete_cb
;
else
conn
->
connect_cfm_cb
=
le_connect_complete_cb
;
conn
->
security_cfm_cb
=
pairing_complete_cb
;
conn
->
disconn_cfm_cb
=
pairing_complete_cb
;
...
...
net/bluetooth/smp.c
浏览文件 @
cbe461c5
...
...
@@ -649,7 +649,7 @@ static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
auth
|=
(
req
->
auth_req
|
rsp
->
auth_req
)
&
SMP_AUTH_MITM
;
ret
=
tk_request
(
conn
,
0
,
auth
,
r
sp
->
io_capability
,
req
->
io_capability
);
ret
=
tk_request
(
conn
,
0
,
auth
,
r
eq
->
io_capability
,
rsp
->
io_capability
);
if
(
ret
)
return
SMP_UNSPECIFIED
;
...
...
@@ -704,7 +704,7 @@ static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
return
0
;
}
static
u8
smp_ltk_encrypt
(
struct
l2cap_conn
*
conn
)
static
u8
smp_ltk_encrypt
(
struct
l2cap_conn
*
conn
,
u8
sec_level
)
{
struct
smp_ltk
*
key
;
struct
hci_conn
*
hcon
=
conn
->
hcon
;
...
...
@@ -713,6 +713,9 @@ static u8 smp_ltk_encrypt(struct l2cap_conn *conn)
if
(
!
key
)
return
0
;
if
(
sec_level
>
BT_SECURITY_MEDIUM
&&
!
key
->
authenticated
)
return
0
;
if
(
test_and_set_bit
(
HCI_CONN_ENCRYPT_PEND
,
&
hcon
->
flags
))
return
1
;
...
...
@@ -733,7 +736,7 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
hcon
->
pending_sec_level
=
authreq_to_seclevel
(
rp
->
auth_req
);
if
(
smp_ltk_encrypt
(
conn
))
if
(
smp_ltk_encrypt
(
conn
,
hcon
->
pending_sec_level
))
return
0
;
if
(
test_and_set_bit
(
HCI_CONN_LE_SMP_PEND
,
&
hcon
->
flags
))
...
...
@@ -772,7 +775,7 @@ int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
return
1
;
if
(
hcon
->
link_mode
&
HCI_LM_MASTER
)
if
(
smp_ltk_encrypt
(
conn
))
if
(
smp_ltk_encrypt
(
conn
,
sec_level
))
goto
done
;
if
(
test_and_set_bit
(
HCI_CONN_LE_SMP_PEND
,
&
hcon
->
flags
))
...
...
net/mac80211/agg-rx.c
浏览文件 @
cbe461c5
...
...
@@ -145,15 +145,20 @@ static void sta_rx_agg_session_timer_expired(unsigned long data)
struct
tid_ampdu_rx
*
tid_rx
;
unsigned
long
timeout
;
rcu_read_lock
();
tid_rx
=
rcu_dereference
(
sta
->
ampdu_mlme
.
tid_rx
[
*
ptid
]);
if
(
!
tid_rx
)
if
(
!
tid_rx
)
{
rcu_read_unlock
();
return
;
}
timeout
=
tid_rx
->
last_rx
+
TU_TO_JIFFIES
(
tid_rx
->
timeout
);
if
(
time_is_after_jiffies
(
timeout
))
{
mod_timer
(
&
tid_rx
->
session_timer
,
timeout
);
rcu_read_unlock
();
return
;
}
rcu_read_unlock
();
#ifdef CONFIG_MAC80211_HT_DEBUG
printk
(
KERN_DEBUG
"rx session timer expired on tid %d
\n
"
,
(
u16
)
*
ptid
);
...
...
net/mac80211/cfg.c
浏览文件 @
cbe461c5
...
...
@@ -533,16 +533,16 @@ static void ieee80211_get_et_stats(struct wiphy *wiphy,
sinfo
.
filled
=
0
;
sta_set_sinfo
(
sta
,
&
sinfo
);
if
(
sinfo
.
filled
|
STATION_INFO_TX_BITRATE
)
if
(
sinfo
.
filled
&
STATION_INFO_TX_BITRATE
)
data
[
i
]
=
100000
*
cfg80211_calculate_bitrate
(
&
sinfo
.
txrate
);
i
++
;
if
(
sinfo
.
filled
|
STATION_INFO_RX_BITRATE
)
if
(
sinfo
.
filled
&
STATION_INFO_RX_BITRATE
)
data
[
i
]
=
100000
*
cfg80211_calculate_bitrate
(
&
sinfo
.
rxrate
);
i
++
;
if
(
sinfo
.
filled
|
STATION_INFO_SIGNAL_AVG
)
if
(
sinfo
.
filled
&
STATION_INFO_SIGNAL_AVG
)
data
[
i
]
=
(
u8
)
sinfo
.
signal_avg
;
i
++
;
}
else
{
...
...
net/mac80211/iface.c
浏览文件 @
cbe461c5
...
...
@@ -637,6 +637,18 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
ieee80211_configure_filter
(
local
);
break
;
default:
mutex_lock
(
&
local
->
mtx
);
if
(
local
->
hw_roc_dev
==
sdata
->
dev
&&
local
->
hw_roc_channel
)
{
/* ignore return value since this is racy */
drv_cancel_remain_on_channel
(
local
);
ieee80211_queue_work
(
&
local
->
hw
,
&
local
->
hw_roc_done
);
}
mutex_unlock
(
&
local
->
mtx
);
flush_work
(
&
local
->
hw_roc_start
);
flush_work
(
&
local
->
hw_roc_done
);
flush_work
(
&
sdata
->
work
);
/*
* When we get here, the interface is marked down.
...
...
net/mac80211/mlme.c
浏览文件 @
cbe461c5
...
...
@@ -1220,6 +1220,22 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
sdata
->
vif
.
bss_conf
.
qos
=
true
;
}
static
void
__ieee80211_stop_poll
(
struct
ieee80211_sub_if_data
*
sdata
)
{
lockdep_assert_held
(
&
sdata
->
local
->
mtx
);
sdata
->
u
.
mgd
.
flags
&=
~
(
IEEE80211_STA_CONNECTION_POLL
|
IEEE80211_STA_BEACON_POLL
);
ieee80211_run_deferred_scan
(
sdata
->
local
);
}
static
void
ieee80211_stop_poll
(
struct
ieee80211_sub_if_data
*
sdata
)
{
mutex_lock
(
&
sdata
->
local
->
mtx
);
__ieee80211_stop_poll
(
sdata
);
mutex_unlock
(
&
sdata
->
local
->
mtx
);
}
static
u32
ieee80211_handle_bss_capability
(
struct
ieee80211_sub_if_data
*
sdata
,
u16
capab
,
bool
erp_valid
,
u8
erp
)
{
...
...
@@ -1285,8 +1301,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
sdata
->
u
.
mgd
.
flags
|=
IEEE80211_STA_RESET_SIGNAL_AVE
;
/* just to be sure */
sdata
->
u
.
mgd
.
flags
&=
~
(
IEEE80211_STA_CONNECTION_POLL
|
IEEE80211_STA_BEACON_POLL
);
ieee80211_stop_poll
(
sdata
);
ieee80211_led_assoc
(
local
,
1
);
...
...
@@ -1456,8 +1471,7 @@ static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
return
;
}
ifmgd
->
flags
&=
~
(
IEEE80211_STA_CONNECTION_POLL
|
IEEE80211_STA_BEACON_POLL
);
__ieee80211_stop_poll
(
sdata
);
mutex_lock
(
&
local
->
iflist_mtx
);
ieee80211_recalc_ps
(
local
,
-
1
);
...
...
@@ -1477,7 +1491,6 @@ static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
round_jiffies_up
(
jiffies
+
IEEE80211_CONNECTION_IDLE_TIME
));
out:
ieee80211_run_deferred_scan
(
local
);
mutex_unlock
(
&
local
->
mtx
);
}
...
...
@@ -2408,7 +2421,11 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
net_dbg_ratelimited
(
"%s: cancelling probereq poll due to a received beacon
\n
"
,
sdata
->
name
);
#endif
mutex_lock
(
&
local
->
mtx
);
ifmgd
->
flags
&=
~
IEEE80211_STA_BEACON_POLL
;
ieee80211_run_deferred_scan
(
local
);
mutex_unlock
(
&
local
->
mtx
);
mutex_lock
(
&
local
->
iflist_mtx
);
ieee80211_recalc_ps
(
local
,
-
1
);
mutex_unlock
(
&
local
->
iflist_mtx
);
...
...
@@ -2595,8 +2612,7 @@ static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
struct
ieee80211_if_managed
*
ifmgd
=
&
sdata
->
u
.
mgd
;
u8
frame_buf
[
DEAUTH_DISASSOC_LEN
];
ifmgd
->
flags
&=
~
(
IEEE80211_STA_CONNECTION_POLL
|
IEEE80211_STA_BEACON_POLL
);
ieee80211_stop_poll
(
sdata
);
ieee80211_set_disassoc
(
sdata
,
IEEE80211_STYPE_DEAUTH
,
reason
,
false
,
frame_buf
);
...
...
@@ -2874,8 +2890,7 @@ static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
u32
flags
;
if
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_STATION
)
{
sdata
->
u
.
mgd
.
flags
&=
~
(
IEEE80211_STA_BEACON_POLL
|
IEEE80211_STA_CONNECTION_POLL
);
__ieee80211_stop_poll
(
sdata
);
/* let's probe the connection once */
flags
=
sdata
->
local
->
hw
.
flags
;
...
...
@@ -2944,7 +2959,10 @@ void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata)
if
(
test_and_clear_bit
(
TMR_RUNNING_CHANSW
,
&
ifmgd
->
timers_running
))
add_timer
(
&
ifmgd
->
chswitch_timer
);
ieee80211_sta_reset_beacon_monitor
(
sdata
);
mutex_lock
(
&
sdata
->
local
->
mtx
);
ieee80211_restart_sta_timer
(
sdata
);
mutex_unlock
(
&
sdata
->
local
->
mtx
);
}
#endif
...
...
net/mac80211/offchannel.c
浏览文件 @
cbe461c5
...
...
@@ -234,6 +234,22 @@ static void ieee80211_hw_roc_done(struct work_struct *work)
return
;
}
/* was never transmitted */
if
(
local
->
hw_roc_skb
)
{
u64
cookie
;
cookie
=
local
->
hw_roc_cookie
^
2
;
cfg80211_mgmt_tx_status
(
local
->
hw_roc_dev
,
cookie
,
local
->
hw_roc_skb
->
data
,
local
->
hw_roc_skb
->
len
,
false
,
GFP_KERNEL
);
kfree_skb
(
local
->
hw_roc_skb
);
local
->
hw_roc_skb
=
NULL
;
local
->
hw_roc_skb_for_status
=
NULL
;
}
if
(
!
local
->
hw_roc_for_tx
)
cfg80211_remain_on_channel_expired
(
local
->
hw_roc_dev
,
local
->
hw_roc_cookie
,
...
...
net/mac80211/sta_info.c
浏览文件 @
cbe461c5
...
...
@@ -378,7 +378,7 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
/* make the station visible */
sta_info_hash_add
(
local
,
sta
);
list_add
(
&
sta
->
list
,
&
local
->
sta_list
);
list_add
_rcu
(
&
sta
->
list
,
&
local
->
sta_list
);
set_sta_flag
(
sta
,
WLAN_STA_INSERTED
);
...
...
@@ -688,7 +688,7 @@ int __must_check __sta_info_destroy(struct sta_info *sta)
if
(
ret
)
return
ret
;
list_del
(
&
sta
->
list
);
list_del
_rcu
(
&
sta
->
list
);
mutex_lock
(
&
local
->
key_mtx
);
for
(
i
=
0
;
i
<
NUM_DEFAULT_KEYS
;
i
++
)
...
...
net/mac80211/tx.c
浏览文件 @
cbe461c5
...
...
@@ -1737,7 +1737,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
__le16
fc
;
struct
ieee80211_hdr
hdr
;
struct
ieee80211s_hdr
mesh_hdr
__maybe_unused
;
struct
mesh_path
__maybe_unused
*
mppath
=
NULL
;
struct
mesh_path
__maybe_unused
*
mppath
=
NULL
,
*
mpath
=
NULL
;
const
u8
*
encaps_data
;
int
encaps_len
,
skip_header_bytes
;
int
nh_pos
,
h_pos
;
...
...
@@ -1803,8 +1803,11 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
goto
fail
;
}
rcu_read_lock
();
if
(
!
is_multicast_ether_addr
(
skb
->
data
))
mppath
=
mpp_path_lookup
(
skb
->
data
,
sdata
);
if
(
!
is_multicast_ether_addr
(
skb
->
data
))
{
mpath
=
mesh_path_lookup
(
skb
->
data
,
sdata
);
if
(
!
mpath
)
mppath
=
mpp_path_lookup
(
skb
->
data
,
sdata
);
}
/*
* Use address extension if it is a packet from
...
...
net/mac80211/util.c
浏览文件 @
cbe461c5
...
...
@@ -1271,7 +1271,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
enum
ieee80211_sta_state
state
;
for
(
state
=
IEEE80211_STA_NOTEXIST
;
state
<
sta
->
sta_state
-
1
;
state
++
)
state
<
sta
->
sta_state
;
state
++
)
WARN_ON
(
drv_sta_state
(
local
,
sta
->
sdata
,
sta
,
state
,
state
+
1
));
}
...
...
net/wireless/ibss.c
浏览文件 @
cbe461c5
...
...
@@ -42,6 +42,7 @@ void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid)
cfg80211_hold_bss
(
bss_from_pub
(
bss
));
wdev
->
current_bss
=
bss_from_pub
(
bss
);
wdev
->
sme_state
=
CFG80211_SME_CONNECTED
;
cfg80211_upload_connect_keys
(
wdev
);
nl80211_send_ibss_bssid
(
wiphy_to_dev
(
wdev
->
wiphy
),
dev
,
bssid
,
...
...
@@ -60,7 +61,7 @@ void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp)
struct
cfg80211_event
*
ev
;
unsigned
long
flags
;
CFG80211_DEV_WARN_ON
(
!
wdev
->
ssid_len
);
CFG80211_DEV_WARN_ON
(
wdev
->
sme_state
!=
CFG80211_SME_CONNECTING
);
ev
=
kzalloc
(
sizeof
(
*
ev
),
gfp
);
if
(
!
ev
)
...
...
@@ -115,9 +116,11 @@ int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
#ifdef CONFIG_CFG80211_WEXT
wdev
->
wext
.
ibss
.
channel
=
params
->
channel
;
#endif
wdev
->
sme_state
=
CFG80211_SME_CONNECTING
;
err
=
rdev
->
ops
->
join_ibss
(
&
rdev
->
wiphy
,
dev
,
params
);
if
(
err
)
{
wdev
->
connect_keys
=
NULL
;
wdev
->
sme_state
=
CFG80211_SME_IDLE
;
return
err
;
}
...
...
@@ -169,6 +172,7 @@ static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext)
}
wdev
->
current_bss
=
NULL
;
wdev
->
sme_state
=
CFG80211_SME_IDLE
;
wdev
->
ssid_len
=
0
;
#ifdef CONFIG_CFG80211_WEXT
if
(
!
nowext
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录