Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
6fe5468f
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 大约 4 年
通知
14
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
6fe5468f
编写于
4月 10, 2013
作者:
J
John W. Linville
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
Conflicts: drivers/net/wireless/rt2x00/rt2x00pci.c
上级
deb09280
69a2bac8
变更
26
隐藏空白更改
内联
并排
Showing
26 changed file
with
460 addition
and
347 deletion
+460
-347
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/main.c
+4
-0
drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+3
-3
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+25
-21
drivers/net/wireless/iwlwifi/dvm/rxon.c
drivers/net/wireless/iwlwifi/dvm/rxon.c
+8
-10
drivers/net/wireless/iwlwifi/dvm/tx.c
drivers/net/wireless/iwlwifi/dvm/tx.c
+1
-1
drivers/net/wireless/mwifiex/cfg80211.c
drivers/net/wireless/mwifiex/cfg80211.c
+2
-1
drivers/net/wireless/mwifiex/scan.c
drivers/net/wireless/mwifiex/scan.c
+9
-2
drivers/net/wireless/rt2x00/Kconfig
drivers/net/wireless/rt2x00/Kconfig
+7
-0
drivers/net/wireless/rt2x00/Makefile
drivers/net/wireless/rt2x00/Makefile
+1
-0
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2400pci.c
+1
-0
drivers/net/wireless/rt2x00/rt2500pci.c
drivers/net/wireless/rt2x00/rt2500pci.c
+1
-0
drivers/net/wireless/rt2x00/rt2800pci.c
drivers/net/wireless/rt2x00/rt2800pci.c
+1
-0
drivers/net/wireless/rt2x00/rt2x00mmio.c
drivers/net/wireless/rt2x00/rt2x00mmio.c
+216
-0
drivers/net/wireless/rt2x00/rt2x00mmio.h
drivers/net/wireless/rt2x00/rt2x00mmio.h
+119
-0
drivers/net/wireless/rt2x00/rt2x00pci.c
drivers/net/wireless/rt2x00/rt2x00pci.c
+0
-176
drivers/net/wireless/rt2x00/rt2x00pci.h
drivers/net/wireless/rt2x00/rt2x00pci.h
+0
-88
drivers/net/wireless/rt2x00/rt61pci.c
drivers/net/wireless/rt2x00/rt61pci.c
+1
-0
drivers/nfc/microread/mei.c
drivers/nfc/microread/mei.c
+17
-21
net/mac80211/cfg.c
net/mac80211/cfg.c
+4
-2
net/mac80211/chan.c
net/mac80211/chan.c
+14
-3
net/mac80211/ieee80211_i.h
net/mac80211/ieee80211_i.h
+3
-1
net/mac80211/iface.c
net/mac80211/iface.c
+1
-1
net/mac80211/offchannel.c
net/mac80211/offchannel.c
+17
-6
net/nfc/llcp/llcp.c
net/nfc/llcp/llcp.c
+0
-8
net/nfc/llcp/sock.c
net/nfc/llcp/sock.c
+3
-3
net/wireless/sme.c
net/wireless/sme.c
+2
-0
未找到文件。
drivers/net/wireless/ath/ath9k/main.c
浏览文件 @
6fe5468f
...
...
@@ -280,6 +280,10 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan)
if
(
r
)
{
ath_err
(
common
,
"Unable to reset channel, reset status %d
\n
"
,
r
);
ath9k_hw_enable_interrupts
(
ah
);
ath9k_queue_reset
(
sc
,
RESET_TYPE_BB_HANG
);
goto
out
;
}
...
...
drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
浏览文件 @
6fe5468f
...
...
@@ -3303,15 +3303,15 @@ static int _brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus)
goto
err
;
}
/* External image takes precedence if specified */
if
(
brcmf_sdbrcm_download_code_file
(
bus
))
{
brcmf_err
(
"dongle image file download failed
\n
"
);
goto
err
;
}
/* External nvram takes precedence if specified */
if
(
brcmf_sdbrcm_download_nvram
(
bus
))
if
(
brcmf_sdbrcm_download_nvram
(
bus
))
{
brcmf_err
(
"dongle nvram file download failed
\n
"
);
goto
err
;
}
/* Take arm out of reset */
if
(
brcmf_sdbrcm_download_state
(
bus
,
false
))
{
...
...
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
浏览文件 @
6fe5468f
...
...
@@ -1844,8 +1844,10 @@ static s32
brcmf_add_keyext
(
struct
wiphy
*
wiphy
,
struct
net_device
*
ndev
,
u8
key_idx
,
const
u8
*
mac_addr
,
struct
key_params
*
params
)
{
struct
brcmf_if
*
ifp
=
netdev_priv
(
ndev
);
struct
brcmf_wsec_key
key
;
s32
err
=
0
;
u8
keybuf
[
8
];
memset
(
&
key
,
0
,
sizeof
(
key
));
key
.
index
=
(
u32
)
key_idx
;
...
...
@@ -1869,8 +1871,9 @@ brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev,
brcmf_dbg
(
CONN
,
"Setting the key index %d
\n
"
,
key
.
index
);
memcpy
(
key
.
data
,
params
->
key
,
key
.
len
);
if
(
params
->
cipher
==
WLAN_CIPHER_SUITE_TKIP
)
{
u8
keybuf
[
8
];
if
((
ifp
->
vif
->
mode
!=
WL_MODE_AP
)
&&
(
params
->
cipher
==
WLAN_CIPHER_SUITE_TKIP
))
{
brcmf_dbg
(
CONN
,
"Swapping RX/TX MIC key
\n
"
);
memcpy
(
keybuf
,
&
key
.
data
[
24
],
sizeof
(
keybuf
));
memcpy
(
&
key
.
data
[
24
],
&
key
.
data
[
16
],
sizeof
(
keybuf
));
memcpy
(
&
key
.
data
[
16
],
keybuf
,
sizeof
(
keybuf
));
...
...
@@ -1966,7 +1969,7 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
break
;
case
WLAN_CIPHER_SUITE_TKIP
:
if
(
ifp
->
vif
->
mode
!=
WL_MODE_AP
)
{
brcmf_dbg
(
CONN
,
"Swapping key
\n
"
);
brcmf_dbg
(
CONN
,
"Swapping
RX/TX MIC
key
\n
"
);
memcpy
(
keybuf
,
&
key
.
data
[
24
],
sizeof
(
keybuf
));
memcpy
(
&
key
.
data
[
24
],
&
key
.
data
[
16
],
sizeof
(
keybuf
));
memcpy
(
&
key
.
data
[
16
],
keybuf
,
sizeof
(
keybuf
));
...
...
@@ -2071,8 +2074,7 @@ brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
err
=
-
EAGAIN
;
goto
done
;
}
switch
(
wsec
&
~
SES_OW_ENABLED
)
{
case
WEP_ENABLED
:
if
(
wsec
&
WEP_ENABLED
)
{
sec
=
&
profile
->
sec
;
if
(
sec
->
cipher_pairwise
&
WLAN_CIPHER_SUITE_WEP40
)
{
params
.
cipher
=
WLAN_CIPHER_SUITE_WEP40
;
...
...
@@ -2081,16 +2083,13 @@ brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
params
.
cipher
=
WLAN_CIPHER_SUITE_WEP104
;
brcmf_dbg
(
CONN
,
"WLAN_CIPHER_SUITE_WEP104
\n
"
);
}
break
;
case
TKIP_ENABLED
:
}
else
if
(
wsec
&
TKIP_ENABLED
)
{
params
.
cipher
=
WLAN_CIPHER_SUITE_TKIP
;
brcmf_dbg
(
CONN
,
"WLAN_CIPHER_SUITE_TKIP
\n
"
);
break
;
case
AES_ENABLED
:
}
else
if
(
wsec
&
AES_ENABLED
)
{
params
.
cipher
=
WLAN_CIPHER_SUITE_AES_CMAC
;
brcmf_dbg
(
CONN
,
"WLAN_CIPHER_SUITE_AES_CMAC
\n
"
);
break
;
default:
}
else
{
brcmf_err
(
"Invalid algo (0x%x)
\n
"
,
wsec
);
err
=
-
EINVAL
;
goto
done
;
...
...
@@ -3774,8 +3773,9 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
static
int
brcmf_cfg80211_stop_ap
(
struct
wiphy
*
wiphy
,
struct
net_device
*
ndev
)
{
struct
brcmf_if
*
ifp
=
netdev_priv
(
ndev
);
s32
err
=
-
EPERM
;
s32
err
;
struct
brcmf_fil_bss_enable_le
bss_enable
;
struct
brcmf_join_params
join_params
;
brcmf_dbg
(
TRACE
,
"Enter
\n
"
);
...
...
@@ -3783,16 +3783,21 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
/* Due to most likely deauths outstanding we sleep */
/* first to make sure they get processed by fw. */
msleep
(
400
);
err
=
brcmf_fil_cmd_int_set
(
ifp
,
BRCMF_C_SET_AP
,
0
);
if
(
err
<
0
)
{
brcmf_err
(
"setting AP mode failed %d
\n
"
,
err
);
goto
exit
;
}
memset
(
&
join_params
,
0
,
sizeof
(
join_params
));
err
=
brcmf_fil_cmd_data_set
(
ifp
,
BRCMF_C_SET_SSID
,
&
join_params
,
sizeof
(
join_params
));
if
(
err
<
0
)
brcmf_err
(
"SET SSID error (%d)
\n
"
,
err
);
err
=
brcmf_fil_cmd_int_set
(
ifp
,
BRCMF_C_UP
,
0
);
if
(
err
<
0
)
{
if
(
err
<
0
)
brcmf_err
(
"BRCMF_C_UP error %d
\n
"
,
err
);
goto
exit
;
}
err
=
brcmf_fil_cmd_int_set
(
ifp
,
BRCMF_C_SET_AP
,
0
);
if
(
err
<
0
)
brcmf_err
(
"setting AP mode failed %d
\n
"
,
err
);
err
=
brcmf_fil_cmd_int_set
(
ifp
,
BRCMF_C_SET_INFRA
,
0
);
if
(
err
<
0
)
brcmf_err
(
"setting INFRA mode failed %d
\n
"
,
err
);
}
else
{
bss_enable
.
bsscfg_idx
=
cpu_to_le32
(
ifp
->
bssidx
);
bss_enable
.
enable
=
cpu_to_le32
(
0
);
...
...
@@ -3805,7 +3810,6 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
set_bit
(
BRCMF_VIF_STATUS_AP_CREATING
,
&
ifp
->
vif
->
sme_state
);
clear_bit
(
BRCMF_VIF_STATUS_AP_CREATED
,
&
ifp
->
vif
->
sme_state
);
exit:
return
err
;
}
...
...
drivers/net/wireless/iwlwifi/dvm/rxon.c
浏览文件 @
6fe5468f
...
...
@@ -1419,6 +1419,14 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
mutex_lock
(
&
priv
->
mutex
);
if
(
changes
&
BSS_CHANGED_IDLE
&&
bss_conf
->
idle
)
{
/*
* If we go idle, then clearly no "passive-no-rx"
* workaround is needed any more, this is a reset.
*/
iwlagn_lift_passive_no_rx
(
priv
);
}
if
(
unlikely
(
!
iwl_is_ready
(
priv
)))
{
IWL_DEBUG_MAC80211
(
priv
,
"leave - not ready
\n
"
);
mutex_unlock
(
&
priv
->
mutex
);
...
...
@@ -1450,16 +1458,6 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
priv
->
timestamp
=
bss_conf
->
sync_tsf
;
ctx
->
staging
.
filter_flags
|=
RXON_FILTER_ASSOC_MSK
;
}
else
{
/*
* If we disassociate while there are pending
* frames, just wake up the queues and let the
* frames "escape" ... This shouldn't really
* be happening to start with, but we should
* not get stuck in this case either since it
* can happen if userspace gets confused.
*/
iwlagn_lift_passive_no_rx
(
priv
);
ctx
->
staging
.
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
if
(
ctx
->
ctxid
==
IWL_RXON_CTX_BSS
)
...
...
drivers/net/wireless/iwlwifi/dvm/tx.c
浏览文件 @
6fe5468f
...
...
@@ -1193,7 +1193,7 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
memset
(
&
info
->
status
,
0
,
sizeof
(
info
->
status
));
if
(
status
==
TX_STATUS_FAIL_PASSIVE_NO_RX
&&
iwl_is_associated_ctx
(
ctx
)
&&
ctx
->
vif
&&
ctx
->
vif
&&
ctx
->
vif
->
type
==
NL80211_IFTYPE_STATION
)
{
/* block and stop all queues */
priv
->
passive_no_rx
=
true
;
...
...
drivers/net/wireless/mwifiex/cfg80211.c
浏览文件 @
6fe5468f
...
...
@@ -1904,7 +1904,8 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy,
}
}
for
(
i
=
0
;
i
<
request
->
n_channels
;
i
++
)
{
for
(
i
=
0
;
i
<
min_t
(
u32
,
request
->
n_channels
,
MWIFIEX_USER_SCAN_CHAN_MAX
);
i
++
)
{
chan
=
request
->
channels
[
i
];
priv
->
user_scan_cfg
->
chan_list
[
i
].
chan_number
=
chan
->
hw_value
;
priv
->
user_scan_cfg
->
chan_list
[
i
].
radio_type
=
chan
->
band
;
...
...
drivers/net/wireless/mwifiex/scan.c
浏览文件 @
6fe5468f
...
...
@@ -1393,8 +1393,10 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
queue_work
(
adapter
->
workqueue
,
&
adapter
->
main_work
);
/* Perform internal scan synchronously */
if
(
!
priv
->
scan_request
)
if
(
!
priv
->
scan_request
)
{
dev_dbg
(
adapter
->
dev
,
"wait internal scan
\n
"
);
mwifiex_wait_queue_complete
(
adapter
,
cmd_node
);
}
}
else
{
spin_unlock_irqrestore
(
&
adapter
->
scan_pending_q_lock
,
flags
);
...
...
@@ -1793,7 +1795,12 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
/* Need to indicate IOCTL complete */
if
(
adapter
->
curr_cmd
->
wait_q_enabled
)
{
adapter
->
cmd_wait_q
.
status
=
0
;
mwifiex_complete_cmd
(
adapter
,
adapter
->
curr_cmd
);
if
(
!
priv
->
scan_request
)
{
dev_dbg
(
adapter
->
dev
,
"complete internal scan
\n
"
);
mwifiex_complete_cmd
(
adapter
,
adapter
->
curr_cmd
);
}
}
if
(
priv
->
report_scan_result
)
priv
->
report_scan_result
=
false
;
...
...
drivers/net/wireless/rt2x00/Kconfig
浏览文件 @
6fe5468f
...
...
@@ -20,6 +20,7 @@ if RT2X00
config RT2400PCI
tristate "Ralink rt2400 (PCI/PCMCIA) support"
depends on PCI
select RT2X00_LIB_MMIO
select RT2X00_LIB_PCI
select EEPROM_93CX6
---help---
...
...
@@ -31,6 +32,7 @@ config RT2400PCI
config RT2500PCI
tristate "Ralink rt2500 (PCI/PCMCIA) support"
depends on PCI
select RT2X00_LIB_MMIO
select RT2X00_LIB_PCI
select EEPROM_93CX6
---help---
...
...
@@ -43,6 +45,7 @@ config RT61PCI
tristate "Ralink rt2501/rt61 (PCI/PCMCIA) support"
depends on PCI
select RT2X00_LIB_PCI
select RT2X00_LIB_MMIO
select RT2X00_LIB_FIRMWARE
select RT2X00_LIB_CRYPTO
select CRC_ITU_T
...
...
@@ -57,6 +60,7 @@ config RT2800PCI
tristate "Ralink rt27xx/rt28xx/rt30xx (PCI/PCIe/PCMCIA) support"
depends on PCI || SOC_RT288X || SOC_RT305X
select RT2800_LIB
select RT2X00_LIB_MMIO
select RT2X00_LIB_PCI if PCI
select RT2X00_LIB_SOC if SOC_RT288X || SOC_RT305X
select RT2X00_LIB_FIRMWARE
...
...
@@ -192,6 +196,9 @@ endif
config RT2800_LIB
tristate
config RT2X00_LIB_MMIO
tristate
config RT2X00_LIB_PCI
tristate
select RT2X00_LIB
...
...
drivers/net/wireless/rt2x00/Makefile
浏览文件 @
6fe5468f
...
...
@@ -9,6 +9,7 @@ rt2x00lib-$(CONFIG_RT2X00_LIB_FIRMWARE) += rt2x00firmware.o
rt2x00lib-$(CONFIG_RT2X00_LIB_LEDS)
+=
rt2x00leds.o
obj-$(CONFIG_RT2X00_LIB)
+=
rt2x00lib.o
obj-$(CONFIG_RT2X00_LIB_MMIO)
+=
rt2x00mmio.o
obj-$(CONFIG_RT2X00_LIB_PCI)
+=
rt2x00pci.o
obj-$(CONFIG_RT2X00_LIB_SOC)
+=
rt2x00soc.o
obj-$(CONFIG_RT2X00_LIB_USB)
+=
rt2x00usb.o
...
...
drivers/net/wireless/rt2x00/rt2400pci.c
浏览文件 @
6fe5468f
...
...
@@ -34,6 +34,7 @@
#include <linux/slab.h>
#include "rt2x00.h"
#include "rt2x00mmio.h"
#include "rt2x00pci.h"
#include "rt2400pci.h"
...
...
drivers/net/wireless/rt2x00/rt2500pci.c
浏览文件 @
6fe5468f
...
...
@@ -34,6 +34,7 @@
#include <linux/slab.h>
#include "rt2x00.h"
#include "rt2x00mmio.h"
#include "rt2x00pci.h"
#include "rt2500pci.h"
...
...
drivers/net/wireless/rt2x00/rt2800pci.c
浏览文件 @
6fe5468f
...
...
@@ -41,6 +41,7 @@
#include <linux/eeprom_93cx6.h>
#include "rt2x00.h"
#include "rt2x00mmio.h"
#include "rt2x00pci.h"
#include "rt2x00soc.h"
#include "rt2800lib.h"
...
...
drivers/net/wireless/rt2x00/rt2x00mmio.c
0 → 100644
浏览文件 @
6fe5468f
/*
Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
<http://rt2x00.serialmonkey.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the
Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
Module: rt2x00mmio
Abstract: rt2x00 generic mmio device routines.
*/
#include <linux/dma-mapping.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include "rt2x00.h"
#include "rt2x00mmio.h"
/*
* Register access.
*/
int
rt2x00pci_regbusy_read
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
const
struct
rt2x00_field32
field
,
u32
*
reg
)
{
unsigned
int
i
;
if
(
!
test_bit
(
DEVICE_STATE_PRESENT
,
&
rt2x00dev
->
flags
))
return
0
;
for
(
i
=
0
;
i
<
REGISTER_BUSY_COUNT
;
i
++
)
{
rt2x00pci_register_read
(
rt2x00dev
,
offset
,
reg
);
if
(
!
rt2x00_get_field32
(
*
reg
,
field
))
return
1
;
udelay
(
REGISTER_BUSY_DELAY
);
}
printk_once
(
KERN_ERR
"%s() Indirect register access failed: "
"offset=0x%.08x, value=0x%.08x
\n
"
,
__func__
,
offset
,
*
reg
);
*
reg
=
~
0
;
return
0
;
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_regbusy_read
);
bool
rt2x00pci_rxdone
(
struct
rt2x00_dev
*
rt2x00dev
)
{
struct
data_queue
*
queue
=
rt2x00dev
->
rx
;
struct
queue_entry
*
entry
;
struct
queue_entry_priv_pci
*
entry_priv
;
struct
skb_frame_desc
*
skbdesc
;
int
max_rx
=
16
;
while
(
--
max_rx
)
{
entry
=
rt2x00queue_get_entry
(
queue
,
Q_INDEX
);
entry_priv
=
entry
->
priv_data
;
if
(
rt2x00dev
->
ops
->
lib
->
get_entry_state
(
entry
))
break
;
/*
* Fill in desc fields of the skb descriptor
*/
skbdesc
=
get_skb_frame_desc
(
entry
->
skb
);
skbdesc
->
desc
=
entry_priv
->
desc
;
skbdesc
->
desc_len
=
entry
->
queue
->
desc_size
;
/*
* DMA is already done, notify rt2x00lib that
* it finished successfully.
*/
rt2x00lib_dmastart
(
entry
);
rt2x00lib_dmadone
(
entry
);
/*
* Send the frame to rt2x00lib for further processing.
*/
rt2x00lib_rxdone
(
entry
,
GFP_ATOMIC
);
}
return
!
max_rx
;
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_rxdone
);
void
rt2x00pci_flush_queue
(
struct
data_queue
*
queue
,
bool
drop
)
{
unsigned
int
i
;
for
(
i
=
0
;
!
rt2x00queue_empty
(
queue
)
&&
i
<
10
;
i
++
)
msleep
(
10
);
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_flush_queue
);
/*
* Device initialization handlers.
*/
static
int
rt2x00pci_alloc_queue_dma
(
struct
rt2x00_dev
*
rt2x00dev
,
struct
data_queue
*
queue
)
{
struct
queue_entry_priv_pci
*
entry_priv
;
void
*
addr
;
dma_addr_t
dma
;
unsigned
int
i
;
/*
* Allocate DMA memory for descriptor and buffer.
*/
addr
=
dma_alloc_coherent
(
rt2x00dev
->
dev
,
queue
->
limit
*
queue
->
desc_size
,
&
dma
,
GFP_KERNEL
);
if
(
!
addr
)
return
-
ENOMEM
;
memset
(
addr
,
0
,
queue
->
limit
*
queue
->
desc_size
);
/*
* Initialize all queue entries to contain valid addresses.
*/
for
(
i
=
0
;
i
<
queue
->
limit
;
i
++
)
{
entry_priv
=
queue
->
entries
[
i
].
priv_data
;
entry_priv
->
desc
=
addr
+
i
*
queue
->
desc_size
;
entry_priv
->
desc_dma
=
dma
+
i
*
queue
->
desc_size
;
}
return
0
;
}
static
void
rt2x00pci_free_queue_dma
(
struct
rt2x00_dev
*
rt2x00dev
,
struct
data_queue
*
queue
)
{
struct
queue_entry_priv_pci
*
entry_priv
=
queue
->
entries
[
0
].
priv_data
;
if
(
entry_priv
->
desc
)
dma_free_coherent
(
rt2x00dev
->
dev
,
queue
->
limit
*
queue
->
desc_size
,
entry_priv
->
desc
,
entry_priv
->
desc_dma
);
entry_priv
->
desc
=
NULL
;
}
int
rt2x00pci_initialize
(
struct
rt2x00_dev
*
rt2x00dev
)
{
struct
data_queue
*
queue
;
int
status
;
/*
* Allocate DMA
*/
queue_for_each
(
rt2x00dev
,
queue
)
{
status
=
rt2x00pci_alloc_queue_dma
(
rt2x00dev
,
queue
);
if
(
status
)
goto
exit
;
}
/*
* Register interrupt handler.
*/
status
=
request_irq
(
rt2x00dev
->
irq
,
rt2x00dev
->
ops
->
lib
->
irq_handler
,
IRQF_SHARED
,
rt2x00dev
->
name
,
rt2x00dev
);
if
(
status
)
{
ERROR
(
rt2x00dev
,
"IRQ %d allocation failed (error %d).
\n
"
,
rt2x00dev
->
irq
,
status
);
goto
exit
;
}
return
0
;
exit:
queue_for_each
(
rt2x00dev
,
queue
)
rt2x00pci_free_queue_dma
(
rt2x00dev
,
queue
);
return
status
;
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_initialize
);
void
rt2x00pci_uninitialize
(
struct
rt2x00_dev
*
rt2x00dev
)
{
struct
data_queue
*
queue
;
/*
* Free irq line.
*/
free_irq
(
rt2x00dev
->
irq
,
rt2x00dev
);
/*
* Free DMA
*/
queue_for_each
(
rt2x00dev
,
queue
)
rt2x00pci_free_queue_dma
(
rt2x00dev
,
queue
);
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_uninitialize
);
/*
* rt2x00mmio module information.
*/
MODULE_AUTHOR
(
DRV_PROJECT
);
MODULE_VERSION
(
DRV_VERSION
);
MODULE_DESCRIPTION
(
"rt2x00 mmio library"
);
MODULE_LICENSE
(
"GPL"
);
drivers/net/wireless/rt2x00/rt2x00mmio.h
0 → 100644
浏览文件 @
6fe5468f
/*
Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
<http://rt2x00.serialmonkey.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the
Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
Module: rt2x00mmio
Abstract: Data structures for the rt2x00mmio module.
*/
#ifndef RT2X00MMIO_H
#define RT2X00MMIO_H
#include <linux/io.h>
/*
* Register access.
*/
static
inline
void
rt2x00pci_register_read
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
u32
*
value
)
{
*
value
=
readl
(
rt2x00dev
->
csr
.
base
+
offset
);
}
static
inline
void
rt2x00pci_register_multiread
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
void
*
value
,
const
u32
length
)
{
memcpy_fromio
(
value
,
rt2x00dev
->
csr
.
base
+
offset
,
length
);
}
static
inline
void
rt2x00pci_register_write
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
u32
value
)
{
writel
(
value
,
rt2x00dev
->
csr
.
base
+
offset
);
}
static
inline
void
rt2x00pci_register_multiwrite
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
const
void
*
value
,
const
u32
length
)
{
__iowrite32_copy
(
rt2x00dev
->
csr
.
base
+
offset
,
value
,
length
>>
2
);
}
/**
* rt2x00pci_regbusy_read - Read from register with busy check
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
* @offset: Register offset
* @field: Field to check if register is busy
* @reg: Pointer to where register contents should be stored
*
* This function will read the given register, and checks if the
* register is busy. If it is, it will sleep for a couple of
* microseconds before reading the register again. If the register
* is not read after a certain timeout, this function will return
* FALSE.
*/
int
rt2x00pci_regbusy_read
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
const
struct
rt2x00_field32
field
,
u32
*
reg
);
/**
* struct queue_entry_priv_pci: Per entry PCI specific information
*
* @desc: Pointer to device descriptor
* @desc_dma: DMA pointer to &desc.
* @data: Pointer to device's entry memory.
* @data_dma: DMA pointer to &data.
*/
struct
queue_entry_priv_pci
{
__le32
*
desc
;
dma_addr_t
desc_dma
;
};
/**
* rt2x00pci_rxdone - Handle RX done events
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
*
* Returns true if there are still rx frames pending and false if all
* pending rx frames were processed.
*/
bool
rt2x00pci_rxdone
(
struct
rt2x00_dev
*
rt2x00dev
);
/**
* rt2x00pci_flush_queue - Flush data queue
* @queue: Data queue to stop
* @drop: True to drop all pending frames.
*
* This will wait for a maximum of 100ms, waiting for the queues
* to become empty.
*/
void
rt2x00pci_flush_queue
(
struct
data_queue
*
queue
,
bool
drop
);
/*
* Device initialization handlers.
*/
int
rt2x00pci_initialize
(
struct
rt2x00_dev
*
rt2x00dev
);
void
rt2x00pci_uninitialize
(
struct
rt2x00_dev
*
rt2x00dev
);
#endif
/* RT2X00MMIO_H */
drivers/net/wireless/rt2x00/rt2x00pci.c
浏览文件 @
6fe5468f
...
...
@@ -32,182 +32,6 @@
#include "rt2x00.h"
#include "rt2x00pci.h"
/*
* Register access.
*/
int
rt2x00pci_regbusy_read
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
const
struct
rt2x00_field32
field
,
u32
*
reg
)
{
unsigned
int
i
;
if
(
!
test_bit
(
DEVICE_STATE_PRESENT
,
&
rt2x00dev
->
flags
))
return
0
;
for
(
i
=
0
;
i
<
REGISTER_BUSY_COUNT
;
i
++
)
{
rt2x00pci_register_read
(
rt2x00dev
,
offset
,
reg
);
if
(
!
rt2x00_get_field32
(
*
reg
,
field
))
return
1
;
udelay
(
REGISTER_BUSY_DELAY
);
}
printk_once
(
KERN_ERR
"%s() Indirect register access failed: "
"offset=0x%.08x, value=0x%.08x
\n
"
,
__func__
,
offset
,
*
reg
);
*
reg
=
~
0
;
return
0
;
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_regbusy_read
);
bool
rt2x00pci_rxdone
(
struct
rt2x00_dev
*
rt2x00dev
)
{
struct
data_queue
*
queue
=
rt2x00dev
->
rx
;
struct
queue_entry
*
entry
;
struct
queue_entry_priv_pci
*
entry_priv
;
struct
skb_frame_desc
*
skbdesc
;
int
max_rx
=
16
;
while
(
--
max_rx
)
{
entry
=
rt2x00queue_get_entry
(
queue
,
Q_INDEX
);
entry_priv
=
entry
->
priv_data
;
if
(
rt2x00dev
->
ops
->
lib
->
get_entry_state
(
entry
))
break
;
/*
* Fill in desc fields of the skb descriptor
*/
skbdesc
=
get_skb_frame_desc
(
entry
->
skb
);
skbdesc
->
desc
=
entry_priv
->
desc
;
skbdesc
->
desc_len
=
entry
->
queue
->
desc_size
;
/*
* DMA is already done, notify rt2x00lib that
* it finished successfully.
*/
rt2x00lib_dmastart
(
entry
);
rt2x00lib_dmadone
(
entry
);
/*
* Send the frame to rt2x00lib for further processing.
*/
rt2x00lib_rxdone
(
entry
,
GFP_ATOMIC
);
}
return
!
max_rx
;
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_rxdone
);
void
rt2x00pci_flush_queue
(
struct
data_queue
*
queue
,
bool
drop
)
{
unsigned
int
i
;
for
(
i
=
0
;
!
rt2x00queue_empty
(
queue
)
&&
i
<
10
;
i
++
)
msleep
(
10
);
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_flush_queue
);
/*
* Device initialization handlers.
*/
static
int
rt2x00pci_alloc_queue_dma
(
struct
rt2x00_dev
*
rt2x00dev
,
struct
data_queue
*
queue
)
{
struct
queue_entry_priv_pci
*
entry_priv
;
void
*
addr
;
dma_addr_t
dma
;
unsigned
int
i
;
/*
* Allocate DMA memory for descriptor and buffer.
*/
addr
=
dma_alloc_coherent
(
rt2x00dev
->
dev
,
queue
->
limit
*
queue
->
desc_size
,
&
dma
,
GFP_KERNEL
);
if
(
!
addr
)
return
-
ENOMEM
;
memset
(
addr
,
0
,
queue
->
limit
*
queue
->
desc_size
);
/*
* Initialize all queue entries to contain valid addresses.
*/
for
(
i
=
0
;
i
<
queue
->
limit
;
i
++
)
{
entry_priv
=
queue
->
entries
[
i
].
priv_data
;
entry_priv
->
desc
=
addr
+
i
*
queue
->
desc_size
;
entry_priv
->
desc_dma
=
dma
+
i
*
queue
->
desc_size
;
}
return
0
;
}
static
void
rt2x00pci_free_queue_dma
(
struct
rt2x00_dev
*
rt2x00dev
,
struct
data_queue
*
queue
)
{
struct
queue_entry_priv_pci
*
entry_priv
=
queue
->
entries
[
0
].
priv_data
;
if
(
entry_priv
->
desc
)
dma_free_coherent
(
rt2x00dev
->
dev
,
queue
->
limit
*
queue
->
desc_size
,
entry_priv
->
desc
,
entry_priv
->
desc_dma
);
entry_priv
->
desc
=
NULL
;
}
int
rt2x00pci_initialize
(
struct
rt2x00_dev
*
rt2x00dev
)
{
struct
data_queue
*
queue
;
int
status
;
/*
* Allocate DMA
*/
queue_for_each
(
rt2x00dev
,
queue
)
{
status
=
rt2x00pci_alloc_queue_dma
(
rt2x00dev
,
queue
);
if
(
status
)
goto
exit
;
}
/*
* Register interrupt handler.
*/
status
=
request_irq
(
rt2x00dev
->
irq
,
rt2x00dev
->
ops
->
lib
->
irq_handler
,
IRQF_SHARED
,
rt2x00dev
->
name
,
rt2x00dev
);
if
(
status
)
{
ERROR
(
rt2x00dev
,
"IRQ %d allocation failed (error %d).
\n
"
,
rt2x00dev
->
irq
,
status
);
goto
exit
;
}
return
0
;
exit:
queue_for_each
(
rt2x00dev
,
queue
)
rt2x00pci_free_queue_dma
(
rt2x00dev
,
queue
);
return
status
;
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_initialize
);
void
rt2x00pci_uninitialize
(
struct
rt2x00_dev
*
rt2x00dev
)
{
struct
data_queue
*
queue
;
/*
* Free irq line.
*/
free_irq
(
rt2x00dev
->
irq
,
rt2x00dev
);
/*
* Free DMA
*/
queue_for_each
(
rt2x00dev
,
queue
)
rt2x00pci_free_queue_dma
(
rt2x00dev
,
queue
);
}
EXPORT_SYMBOL_GPL
(
rt2x00pci_uninitialize
);
/*
* PCI driver handlers.
*/
...
...
drivers/net/wireless/rt2x00/rt2x00pci.h
浏览文件 @
6fe5468f
...
...
@@ -35,94 +35,6 @@
*/
#define PCI_DEVICE_DATA(__ops) .driver_data = (kernel_ulong_t)(__ops)
/*
* Register access.
*/
static
inline
void
rt2x00pci_register_read
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
u32
*
value
)
{
*
value
=
readl
(
rt2x00dev
->
csr
.
base
+
offset
);
}
static
inline
void
rt2x00pci_register_multiread
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
void
*
value
,
const
u32
length
)
{
memcpy_fromio
(
value
,
rt2x00dev
->
csr
.
base
+
offset
,
length
);
}
static
inline
void
rt2x00pci_register_write
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
u32
value
)
{
writel
(
value
,
rt2x00dev
->
csr
.
base
+
offset
);
}
static
inline
void
rt2x00pci_register_multiwrite
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
const
void
*
value
,
const
u32
length
)
{
__iowrite32_copy
(
rt2x00dev
->
csr
.
base
+
offset
,
value
,
length
>>
2
);
}
/**
* rt2x00pci_regbusy_read - Read from register with busy check
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
* @offset: Register offset
* @field: Field to check if register is busy
* @reg: Pointer to where register contents should be stored
*
* This function will read the given register, and checks if the
* register is busy. If it is, it will sleep for a couple of
* microseconds before reading the register again. If the register
* is not read after a certain timeout, this function will return
* FALSE.
*/
int
rt2x00pci_regbusy_read
(
struct
rt2x00_dev
*
rt2x00dev
,
const
unsigned
int
offset
,
const
struct
rt2x00_field32
field
,
u32
*
reg
);
/**
* struct queue_entry_priv_pci: Per entry PCI specific information
*
* @desc: Pointer to device descriptor
* @desc_dma: DMA pointer to &desc.
* @data: Pointer to device's entry memory.
* @data_dma: DMA pointer to &data.
*/
struct
queue_entry_priv_pci
{
__le32
*
desc
;
dma_addr_t
desc_dma
;
};
/**
* rt2x00pci_rxdone - Handle RX done events
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
*
* Returns true if there are still rx frames pending and false if all
* pending rx frames were processed.
*/
bool
rt2x00pci_rxdone
(
struct
rt2x00_dev
*
rt2x00dev
);
/**
* rt2x00pci_flush_queue - Flush data queue
* @queue: Data queue to stop
* @drop: True to drop all pending frames.
*
* This will wait for a maximum of 100ms, waiting for the queues
* to become empty.
*/
void
rt2x00pci_flush_queue
(
struct
data_queue
*
queue
,
bool
drop
);
/*
* Device initialization handlers.
*/
int
rt2x00pci_initialize
(
struct
rt2x00_dev
*
rt2x00dev
);
void
rt2x00pci_uninitialize
(
struct
rt2x00_dev
*
rt2x00dev
);
/*
* PCI driver handlers.
*/
...
...
drivers/net/wireless/rt2x00/rt61pci.c
浏览文件 @
6fe5468f
...
...
@@ -35,6 +35,7 @@
#include <linux/eeprom_93cx6.h>
#include "rt2x00.h"
#include "rt2x00mmio.h"
#include "rt2x00pci.h"
#include "rt61pci.h"
...
...
drivers/nfc/microread/mei.c
浏览文件 @
6fe5468f
...
...
@@ -22,7 +22,7 @@
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/mei_bus.h>
#include <linux/mei_
cl_
bus.h>
#include <linux/nfc.h>
#include <net/nfc/hci.h>
...
...
@@ -32,9 +32,6 @@
#define MICROREAD_DRIVER_NAME "microread"
#define MICROREAD_UUID UUID_LE(0x0bb17a78, 0x2a8e, 0x4c50, 0x94, \
0xd4, 0x50, 0x26, 0x67, 0x23, 0x77, 0x5c)
struct
mei_nfc_hdr
{
u8
cmd
;
u8
status
;
...
...
@@ -48,7 +45,7 @@ struct mei_nfc_hdr {
#define MEI_NFC_MAX_READ (MEI_NFC_HEADER_SIZE + MEI_NFC_MAX_HCI_PAYLOAD)
struct
microread_mei_phy
{
struct
mei_
device
*
mei_
device
;
struct
mei_
cl_device
*
device
;
struct
nfc_hci_dev
*
hdev
;
int
powered
;
...
...
@@ -105,14 +102,14 @@ static int microread_mei_write(void *phy_id, struct sk_buff *skb)
MEI_DUMP_SKB_OUT
(
"mei frame sent"
,
skb
);
r
=
mei_send
(
phy
->
device
,
skb
->
data
,
skb
->
len
);
r
=
mei_
cl_
send
(
phy
->
device
,
skb
->
data
,
skb
->
len
);
if
(
r
>
0
)
r
=
0
;
return
r
;
}
static
void
microread_event_cb
(
struct
mei_device
*
device
,
u32
events
,
static
void
microread_event_cb
(
struct
mei_
cl_
device
*
device
,
u32
events
,
void
*
context
)
{
struct
microread_mei_phy
*
phy
=
context
;
...
...
@@ -120,7 +117,7 @@ static void microread_event_cb(struct mei_device *device, u32 events,
if
(
phy
->
hard_fault
!=
0
)
return
;
if
(
events
&
BIT
(
MEI_EVENT_RX
))
{
if
(
events
&
BIT
(
MEI_
CL_
EVENT_RX
))
{
struct
sk_buff
*
skb
;
int
reply_size
;
...
...
@@ -128,7 +125,7 @@ static void microread_event_cb(struct mei_device *device, u32 events,
if
(
!
skb
)
return
;
reply_size
=
mei_recv
(
device
,
skb
->
data
,
MEI_NFC_MAX_READ
);
reply_size
=
mei_
cl_
recv
(
device
,
skb
->
data
,
MEI_NFC_MAX_READ
);
if
(
reply_size
<
MEI_NFC_HEADER_SIZE
)
{
kfree
(
skb
);
return
;
...
...
@@ -149,8 +146,8 @@ static struct nfc_phy_ops mei_phy_ops = {
.
disable
=
microread_mei_disable
,
};
static
int
microread_mei_probe
(
struct
mei_device
*
device
,
const
struct
mei_id
*
id
)
static
int
microread_mei_probe
(
struct
mei_
cl_
device
*
device
,
const
struct
mei_
cl_device_
id
*
id
)
{
struct
microread_mei_phy
*
phy
;
int
r
;
...
...
@@ -164,9 +161,9 @@ static int microread_mei_probe(struct mei_device *device,
}
phy
->
device
=
device
;
mei_
set_client
data
(
device
,
phy
);
mei_
cl_set_drv
data
(
device
,
phy
);
r
=
mei_register_event_cb
(
device
,
microread_event_cb
,
phy
);
r
=
mei_
cl_
register_event_cb
(
device
,
microread_event_cb
,
phy
);
if
(
r
)
{
pr_err
(
MICROREAD_DRIVER_NAME
": event cb registration failed
\n
"
);
goto
err_out
;
...
...
@@ -186,9 +183,9 @@ static int microread_mei_probe(struct mei_device *device,
return
r
;
}
static
int
microread_mei_remove
(
struct
mei_device
*
device
)
static
int
microread_mei_remove
(
struct
mei_
cl_
device
*
device
)
{
struct
microread_mei_phy
*
phy
=
mei_
get_client
data
(
device
);
struct
microread_mei_phy
*
phy
=
mei_
cl_get_drv
data
(
device
);
pr_info
(
"Removing microread
\n
"
);
...
...
@@ -202,16 +199,15 @@ static int microread_mei_remove(struct mei_device *device)
return
0
;
}
static
struct
mei_id
microread_mei_tbl
[]
=
{
{
MICROREAD_DRIVER_NAME
,
MICROREAD_UUID
},
static
struct
mei_
cl_device_
id
microread_mei_tbl
[]
=
{
{
MICROREAD_DRIVER_NAME
},
/* required last entry */
{
}
};
MODULE_DEVICE_TABLE
(
mei
,
microread_mei_tbl
);
static
struct
mei_driver
microread_driver
=
{
static
struct
mei_
cl_
driver
microread_driver
=
{
.
id_table
=
microread_mei_tbl
,
.
name
=
MICROREAD_DRIVER_NAME
,
...
...
@@ -225,7 +221,7 @@ static int microread_mei_init(void)
pr_debug
(
DRIVER_DESC
": %s
\n
"
,
__func__
);
r
=
mei_driver_register
(
&
microread_driver
);
r
=
mei_
cl_
driver_register
(
&
microread_driver
);
if
(
r
)
{
pr_err
(
MICROREAD_DRIVER_NAME
": driver registration failed
\n
"
);
return
r
;
...
...
@@ -236,7 +232,7 @@ static int microread_mei_init(void)
static
void
microread_mei_exit
(
void
)
{
mei_driver_unregister
(
&
microread_driver
);
mei_
cl_
driver_unregister
(
&
microread_driver
);
}
module_init
(
microread_mei_init
);
...
...
net/mac80211/cfg.c
浏览文件 @
6fe5468f
...
...
@@ -2641,7 +2641,7 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local,
list_del
(
&
dep
->
list
);
mutex_unlock
(
&
local
->
mtx
);
ieee80211_roc_notify_destroy
(
dep
);
ieee80211_roc_notify_destroy
(
dep
,
true
);
return
0
;
}
...
...
@@ -2681,7 +2681,7 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local,
ieee80211_start_next_roc
(
local
);
mutex_unlock
(
&
local
->
mtx
);
ieee80211_roc_notify_destroy
(
found
);
ieee80211_roc_notify_destroy
(
found
,
true
);
}
else
{
/* work may be pending so use it all the time */
found
->
abort
=
true
;
...
...
@@ -2691,6 +2691,8 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local,
/* work will clean up etc */
flush_delayed_work
(
&
found
->
work
);
WARN_ON
(
!
found
->
to_be_freed
);
kfree
(
found
);
}
return
0
;
...
...
net/mac80211/chan.c
浏览文件 @
6fe5468f
...
...
@@ -63,6 +63,7 @@ ieee80211_new_chanctx(struct ieee80211_local *local,
enum
ieee80211_chanctx_mode
mode
)
{
struct
ieee80211_chanctx
*
ctx
;
u32
changed
;
int
err
;
lockdep_assert_held
(
&
local
->
chanctx_mtx
);
...
...
@@ -76,6 +77,13 @@ ieee80211_new_chanctx(struct ieee80211_local *local,
ctx
->
conf
.
rx_chains_dynamic
=
1
;
ctx
->
mode
=
mode
;
/* acquire mutex to prevent idle from changing */
mutex_lock
(
&
local
->
mtx
);
/* turn idle off *before* setting channel -- some drivers need that */
changed
=
ieee80211_idle_off
(
local
);
if
(
changed
)
ieee80211_hw_config
(
local
,
changed
);
if
(
!
local
->
use_chanctx
)
{
local
->
_oper_channel_type
=
cfg80211_get_chandef_type
(
chandef
);
...
...
@@ -85,14 +93,17 @@ ieee80211_new_chanctx(struct ieee80211_local *local,
err
=
drv_add_chanctx
(
local
,
ctx
);
if
(
err
)
{
kfree
(
ctx
);
return
ERR_PTR
(
err
);
ctx
=
ERR_PTR
(
err
);
ieee80211_recalc_idle
(
local
);
goto
out
;
}
}
/* and keep the mutex held until the new chanctx is on the list */
list_add_rcu
(
&
ctx
->
list
,
&
local
->
chanctx_list
);
mutex_lock
(
&
local
->
mtx
);
ieee80211_recalc_idle
(
local
);
out:
mutex_unlock
(
&
local
->
mtx
);
return
ctx
;
...
...
net/mac80211/ieee80211_i.h
浏览文件 @
6fe5468f
...
...
@@ -309,6 +309,7 @@ struct ieee80211_roc_work {
struct
ieee80211_channel
*
chan
;
bool
started
,
abort
,
hw_begun
,
notified
;
bool
to_be_freed
;
unsigned
long
hw_start_time
;
...
...
@@ -1330,7 +1331,7 @@ void ieee80211_offchannel_return(struct ieee80211_local *local);
void
ieee80211_roc_setup
(
struct
ieee80211_local
*
local
);
void
ieee80211_start_next_roc
(
struct
ieee80211_local
*
local
);
void
ieee80211_roc_purge
(
struct
ieee80211_sub_if_data
*
sdata
);
void
ieee80211_roc_notify_destroy
(
struct
ieee80211_roc_work
*
roc
);
void
ieee80211_roc_notify_destroy
(
struct
ieee80211_roc_work
*
roc
,
bool
free
);
void
ieee80211_sw_roc_work
(
struct
work_struct
*
work
);
void
ieee80211_handle_roc_started
(
struct
ieee80211_roc_work
*
roc
);
...
...
@@ -1344,6 +1345,7 @@ int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
enum
nl80211_iftype
type
);
void
ieee80211_if_remove
(
struct
ieee80211_sub_if_data
*
sdata
);
void
ieee80211_remove_interfaces
(
struct
ieee80211_local
*
local
);
u32
ieee80211_idle_off
(
struct
ieee80211_local
*
local
);
void
ieee80211_recalc_idle
(
struct
ieee80211_local
*
local
);
void
ieee80211_adjust_monitor_flags
(
struct
ieee80211_sub_if_data
*
sdata
,
const
int
offset
);
...
...
net/mac80211/iface.c
浏览文件 @
6fe5468f
...
...
@@ -78,7 +78,7 @@ void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)
ieee80211_bss_info_change_notify
(
sdata
,
BSS_CHANGED_TXPOWER
);
}
static
u32
ieee80211_idle_off
(
struct
ieee80211_local
*
local
)
u32
ieee80211_idle_off
(
struct
ieee80211_local
*
local
)
{
if
(
!
(
local
->
hw
.
conf
.
flags
&
IEEE80211_CONF_IDLE
))
return
0
;
...
...
net/mac80211/offchannel.c
浏览文件 @
6fe5468f
...
...
@@ -297,10 +297,13 @@ void ieee80211_start_next_roc(struct ieee80211_local *local)
}
}
void
ieee80211_roc_notify_destroy
(
struct
ieee80211_roc_work
*
roc
)
void
ieee80211_roc_notify_destroy
(
struct
ieee80211_roc_work
*
roc
,
bool
free
)
{
struct
ieee80211_roc_work
*
dep
,
*
tmp
;
if
(
WARN_ON
(
roc
->
to_be_freed
))
return
;
/* was never transmitted */
if
(
roc
->
frame
)
{
cfg80211_mgmt_tx_status
(
&
roc
->
sdata
->
wdev
,
...
...
@@ -316,9 +319,12 @@ void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc)
GFP_KERNEL
);
list_for_each_entry_safe
(
dep
,
tmp
,
&
roc
->
dependents
,
list
)
ieee80211_roc_notify_destroy
(
dep
);
ieee80211_roc_notify_destroy
(
dep
,
true
);
kfree
(
roc
);
if
(
free
)
kfree
(
roc
);
else
roc
->
to_be_freed
=
true
;
}
void
ieee80211_sw_roc_work
(
struct
work_struct
*
work
)
...
...
@@ -331,6 +337,9 @@ void ieee80211_sw_roc_work(struct work_struct *work)
mutex_lock
(
&
local
->
mtx
);
if
(
roc
->
to_be_freed
)
goto
out_unlock
;
if
(
roc
->
abort
)
goto
finish
;
...
...
@@ -370,7 +379,7 @@ void ieee80211_sw_roc_work(struct work_struct *work)
finish:
list_del
(
&
roc
->
list
);
started
=
roc
->
started
;
ieee80211_roc_notify_destroy
(
roc
);
ieee80211_roc_notify_destroy
(
roc
,
!
roc
->
abort
);
if
(
started
)
{
ieee80211_flush_queues
(
local
,
NULL
);
...
...
@@ -410,7 +419,7 @@ static void ieee80211_hw_roc_done(struct work_struct *work)
list_del
(
&
roc
->
list
);
ieee80211_roc_notify_destroy
(
roc
);
ieee80211_roc_notify_destroy
(
roc
,
true
);
/* if there's another roc, start it now */
ieee80211_start_next_roc
(
local
);
...
...
@@ -460,12 +469,14 @@ void ieee80211_roc_purge(struct ieee80211_sub_if_data *sdata)
list_for_each_entry_safe
(
roc
,
tmp
,
&
tmp_list
,
list
)
{
if
(
local
->
ops
->
remain_on_channel
)
{
list_del
(
&
roc
->
list
);
ieee80211_roc_notify_destroy
(
roc
);
ieee80211_roc_notify_destroy
(
roc
,
true
);
}
else
{
ieee80211_queue_delayed_work
(
&
local
->
hw
,
&
roc
->
work
,
0
);
/* work will clean up etc */
flush_delayed_work
(
&
roc
->
work
);
WARN_ON
(
!
roc
->
to_be_freed
);
kfree
(
roc
);
}
}
...
...
net/nfc/llcp/llcp.c
浏览文件 @
6fe5468f
...
...
@@ -107,8 +107,6 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen,
accept_sk
->
sk_state_change
(
sk
);
bh_unlock_sock
(
accept_sk
);
sock_orphan
(
accept_sk
);
}
if
(
listen
==
true
)
{
...
...
@@ -134,8 +132,6 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen,
bh_unlock_sock
(
sk
);
sock_orphan
(
sk
);
sk_del_node_init
(
sk
);
}
...
...
@@ -164,8 +160,6 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen,
bh_unlock_sock
(
sk
);
sock_orphan
(
sk
);
sk_del_node_init
(
sk
);
}
...
...
@@ -869,7 +863,6 @@ static void nfc_llcp_recv_ui(struct nfc_llcp_local *local,
skb_get
(
skb
);
}
else
{
pr_err
(
"Receive queue is full
\n
"
);
kfree_skb
(
skb
);
}
nfc_llcp_sock_put
(
llcp_sock
);
...
...
@@ -1072,7 +1065,6 @@ static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
skb_get
(
skb
);
}
else
{
pr_err
(
"Receive queue is full
\n
"
);
kfree_skb
(
skb
);
}
}
...
...
net/nfc/llcp/sock.c
浏览文件 @
6fe5468f
...
...
@@ -388,7 +388,9 @@ struct sock *nfc_llcp_accept_dequeue(struct sock *parent,
}
if
(
sk
->
sk_state
==
LLCP_CONNECTED
||
!
newsock
)
{
nfc_llcp_accept_unlink
(
sk
);
list_del_init
(
&
lsk
->
accept_queue
);
sock_put
(
sk
);
if
(
newsock
)
sock_graft
(
sk
,
newsock
);
...
...
@@ -582,8 +584,6 @@ static int llcp_sock_release(struct socket *sock)
nfc_llcp_accept_unlink
(
accept_sk
);
release_sock
(
accept_sk
);
sock_orphan
(
accept_sk
);
}
}
...
...
net/wireless/sme.c
浏览文件 @
6fe5468f
...
...
@@ -228,6 +228,7 @@ void cfg80211_conn_work(struct work_struct *work)
rtnl_lock
();
cfg80211_lock_rdev
(
rdev
);
mutex_lock
(
&
rdev
->
devlist_mtx
);
mutex_lock
(
&
rdev
->
sched_scan_mtx
);
list_for_each_entry
(
wdev
,
&
rdev
->
wdev_list
,
list
)
{
wdev_lock
(
wdev
);
...
...
@@ -252,6 +253,7 @@ void cfg80211_conn_work(struct work_struct *work)
wdev_unlock
(
wdev
);
}
mutex_unlock
(
&
rdev
->
sched_scan_mtx
);
mutex_unlock
(
&
rdev
->
devlist_mtx
);
cfg80211_unlock_rdev
(
rdev
);
rtnl_unlock
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录