Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
01925efd
cloud-kernel
项目概览
openanolis
/
cloud-kernel
接近 2 年 前同步成功
通知
170
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
01925efd
编写于
11月 04, 2013
作者:
J
John W. Linville
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
Conflicts: drivers/net/wireless/iwlwifi/pcie/drv.c
上级
a1b13b9a
8ce9beac
变更
54
隐藏空白更改
内联
并排
Showing
54 changed file
with
415 addition
and
209 deletion
+415
-209
drivers/bcma/driver_pci.c
drivers/bcma/driver_pci.c
+26
-23
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath5k/base.c
+3
-3
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/main.c
+11
-12
drivers/net/wireless/ath/ath9k/recv.c
drivers/net/wireless/ath/ath9k/recv.c
+0
-7
drivers/net/wireless/ath/ath9k/xmit.c
drivers/net/wireless/ath/ath9k/xmit.c
+20
-6
drivers/net/wireless/b43/phy_n.c
drivers/net/wireless/b43/phy_n.c
+2
-1
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
+13
-15
drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+2
-1
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+8
-6
drivers/net/wireless/brcm80211/brcmfmac/usb.c
drivers/net/wireless/brcm80211/brcmfmac/usb.c
+1
-1
drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+4
-0
drivers/net/wireless/cw1200/cw1200_spi.c
drivers/net/wireless/cw1200/cw1200_spi.c
+9
-19
drivers/net/wireless/cw1200/fwio.c
drivers/net/wireless/cw1200/fwio.c
+1
-1
drivers/net/wireless/cw1200/hwbus.h
drivers/net/wireless/cw1200/hwbus.h
+0
-1
drivers/net/wireless/cw1200/hwio.c
drivers/net/wireless/cw1200/hwio.c
+0
-15
drivers/net/wireless/iwlwifi/dvm/tx.c
drivers/net/wireless/iwlwifi/dvm/tx.c
+3
-11
drivers/net/wireless/iwlwifi/iwl-6000.c
drivers/net/wireless/iwlwifi/iwl-6000.c
+6
-0
drivers/net/wireless/iwlwifi/iwl-config.h
drivers/net/wireless/iwlwifi/iwl-config.h
+1
-0
drivers/net/wireless/iwlwifi/iwl-trans.h
drivers/net/wireless/iwlwifi/iwl-trans.h
+14
-12
drivers/net/wireless/iwlwifi/mvm/power.c
drivers/net/wireless/iwlwifi/mvm/power.c
+4
-1
drivers/net/wireless/iwlwifi/mvm/scan.c
drivers/net/wireless/iwlwifi/mvm/scan.c
+14
-4
drivers/net/wireless/iwlwifi/pcie/drv.c
drivers/net/wireless/iwlwifi/pcie/drv.c
+42
-0
drivers/net/wireless/iwlwifi/pcie/tx.c
drivers/net/wireless/iwlwifi/pcie/tx.c
+28
-5
drivers/net/wireless/mwifiex/11n_aggr.c
drivers/net/wireless/mwifiex/11n_aggr.c
+2
-1
drivers/net/wireless/mwifiex/11n_aggr.h
drivers/net/wireless/mwifiex/11n_aggr.h
+1
-1
drivers/net/wireless/mwifiex/cmdevt.c
drivers/net/wireless/mwifiex/cmdevt.c
+2
-3
drivers/net/wireless/mwifiex/join.c
drivers/net/wireless/mwifiex/join.c
+8
-2
drivers/net/wireless/mwifiex/main.c
drivers/net/wireless/mwifiex/main.c
+4
-2
drivers/net/wireless/mwifiex/sta_event.c
drivers/net/wireless/mwifiex/sta_event.c
+2
-1
drivers/net/wireless/mwifiex/usb.c
drivers/net/wireless/mwifiex/usb.c
+0
-7
drivers/net/wireless/mwifiex/wmm.c
drivers/net/wireless/mwifiex/wmm.c
+1
-2
drivers/net/wireless/p54/p54usb.c
drivers/net/wireless/p54/p54usb.c
+2
-0
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2400pci.c
+1
-1
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rt2x00/rt2800usb.c
+8
-4
drivers/net/wireless/rt2x00/rt2x00mac.c
drivers/net/wireless/rt2x00/rt2x00mac.c
+3
-0
drivers/net/wireless/rt2x00/rt2x00pci.c
drivers/net/wireless/rt2x00/rt2x00pci.c
+1
-8
drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+2
-1
drivers/net/wireless/rtlwifi/wifi.h
drivers/net/wireless/rtlwifi/wifi.h
+1
-1
include/linux/bcma/bcma_driver_pci.h
include/linux/bcma/bcma_driver_pci.h
+1
-0
net/mac80211/cfg.c
net/mac80211/cfg.c
+1
-1
net/mac80211/ieee80211_i.h
net/mac80211/ieee80211_i.h
+4
-0
net/mac80211/mlme.c
net/mac80211/mlme.c
+86
-9
net/mac80211/offchannel.c
net/mac80211/offchannel.c
+2
-0
net/mac80211/rate.c
net/mac80211/rate.c
+12
-3
net/mac80211/rx.c
net/mac80211/rx.c
+3
-0
net/mac80211/scan.c
net/mac80211/scan.c
+19
-0
net/mac80211/status.c
net/mac80211/status.c
+3
-0
net/mac80211/tx.c
net/mac80211/tx.c
+2
-1
net/mac80211/util.c
net/mac80211/util.c
+5
-4
net/wireless/core.c
net/wireless/core.c
+13
-10
net/wireless/core.h
net/wireless/core.h
+3
-0
net/wireless/ibss.c
net/wireless/ibss.c
+3
-0
net/wireless/nl80211.c
net/wireless/nl80211.c
+2
-2
net/wireless/radiotap.c
net/wireless/radiotap.c
+6
-1
未找到文件。
drivers/bcma/driver_pci.c
浏览文件 @
01925efd
...
...
@@ -210,25 +210,6 @@ static void bcma_core_pci_config_fixup(struct bcma_drv_pci *pc)
}
}
static
void
bcma_core_pci_power_save
(
struct
bcma_drv_pci
*
pc
,
bool
up
)
{
u16
data
;
if
(
pc
->
core
->
id
.
rev
>=
15
&&
pc
->
core
->
id
.
rev
<=
20
)
{
data
=
up
?
0x74
:
0x7C
;
bcma_pcie_mdio_writeread
(
pc
,
BCMA_CORE_PCI_MDIO_BLK1
,
BCMA_CORE_PCI_MDIO_BLK1_MGMT1
,
0x7F64
);
bcma_pcie_mdio_writeread
(
pc
,
BCMA_CORE_PCI_MDIO_BLK1
,
BCMA_CORE_PCI_MDIO_BLK1_MGMT3
,
data
);
}
else
if
(
pc
->
core
->
id
.
rev
>=
21
&&
pc
->
core
->
id
.
rev
<=
22
)
{
data
=
up
?
0x75
:
0x7D
;
bcma_pcie_mdio_writeread
(
pc
,
BCMA_CORE_PCI_MDIO_BLK1
,
BCMA_CORE_PCI_MDIO_BLK1_MGMT1
,
0x7E65
);
bcma_pcie_mdio_writeread
(
pc
,
BCMA_CORE_PCI_MDIO_BLK1
,
BCMA_CORE_PCI_MDIO_BLK1_MGMT3
,
data
);
}
}
/**************************************************
* Init.
**************************************************/
...
...
@@ -255,6 +236,32 @@ void bcma_core_pci_init(struct bcma_drv_pci *pc)
bcma_core_pci_clientmode_init
(
pc
);
}
void
bcma_core_pci_power_save
(
struct
bcma_bus
*
bus
,
bool
up
)
{
struct
bcma_drv_pci
*
pc
;
u16
data
;
if
(
bus
->
hosttype
!=
BCMA_HOSTTYPE_PCI
)
return
;
pc
=
&
bus
->
drv_pci
[
0
];
if
(
pc
->
core
->
id
.
rev
>=
15
&&
pc
->
core
->
id
.
rev
<=
20
)
{
data
=
up
?
0x74
:
0x7C
;
bcma_pcie_mdio_writeread
(
pc
,
BCMA_CORE_PCI_MDIO_BLK1
,
BCMA_CORE_PCI_MDIO_BLK1_MGMT1
,
0x7F64
);
bcma_pcie_mdio_writeread
(
pc
,
BCMA_CORE_PCI_MDIO_BLK1
,
BCMA_CORE_PCI_MDIO_BLK1_MGMT3
,
data
);
}
else
if
(
pc
->
core
->
id
.
rev
>=
21
&&
pc
->
core
->
id
.
rev
<=
22
)
{
data
=
up
?
0x75
:
0x7D
;
bcma_pcie_mdio_writeread
(
pc
,
BCMA_CORE_PCI_MDIO_BLK1
,
BCMA_CORE_PCI_MDIO_BLK1_MGMT1
,
0x7E65
);
bcma_pcie_mdio_writeread
(
pc
,
BCMA_CORE_PCI_MDIO_BLK1
,
BCMA_CORE_PCI_MDIO_BLK1_MGMT3
,
data
);
}
}
EXPORT_SYMBOL_GPL
(
bcma_core_pci_power_save
);
int
bcma_core_pci_irq_ctl
(
struct
bcma_drv_pci
*
pc
,
struct
bcma_device
*
core
,
bool
enable
)
{
...
...
@@ -310,8 +317,6 @@ void bcma_core_pci_up(struct bcma_bus *bus)
pc
=
&
bus
->
drv_pci
[
0
];
bcma_core_pci_power_save
(
pc
,
true
);
bcma_core_pci_extend_L1timer
(
pc
,
true
);
}
EXPORT_SYMBOL_GPL
(
bcma_core_pci_up
);
...
...
@@ -326,7 +331,5 @@ void bcma_core_pci_down(struct bcma_bus *bus)
pc
=
&
bus
->
drv_pci
[
0
];
bcma_core_pci_extend_L1timer
(
pc
,
false
);
bcma_core_pci_power_save
(
pc
,
false
);
}
EXPORT_SYMBOL_GPL
(
bcma_core_pci_down
);
drivers/net/wireless/ath/ath5k/base.c
浏览文件 @
01925efd
...
...
@@ -1663,15 +1663,15 @@ ath5k_tx_frame_completed(struct ath5k_hw *ah, struct sk_buff *skb,
ah
->
stats
.
tx_bytes_count
+=
skb
->
len
;
info
=
IEEE80211_SKB_CB
(
skb
);
size
=
min_t
(
int
,
sizeof
(
info
->
status
.
rates
),
sizeof
(
bf
->
rates
));
memcpy
(
info
->
status
.
rates
,
bf
->
rates
,
size
);
tries
[
0
]
=
info
->
status
.
rates
[
0
].
count
;
tries
[
1
]
=
info
->
status
.
rates
[
1
].
count
;
tries
[
2
]
=
info
->
status
.
rates
[
2
].
count
;
ieee80211_tx_info_clear_status
(
info
);
size
=
min_t
(
int
,
sizeof
(
info
->
status
.
rates
),
sizeof
(
bf
->
rates
));
memcpy
(
info
->
status
.
rates
,
bf
->
rates
,
size
);
for
(
i
=
0
;
i
<
ts
->
ts_final_idx
;
i
++
)
{
struct
ieee80211_tx_rate
*
r
=
&
info
->
status
.
rates
[
i
];
...
...
drivers/net/wireless/ath/ath9k/main.c
浏览文件 @
01925efd
...
...
@@ -208,6 +208,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
struct
ath_hw
*
ah
=
sc
->
sc_ah
;
struct
ath_common
*
common
=
ath9k_hw_common
(
ah
);
unsigned
long
flags
;
int
i
;
if
(
ath_startrecv
(
sc
)
!=
0
)
{
ath_err
(
common
,
"Unable to restart recv logic
\n
"
);
...
...
@@ -235,6 +236,15 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
}
work:
ath_restart_work
(
sc
);
for
(
i
=
0
;
i
<
ATH9K_NUM_TX_QUEUES
;
i
++
)
{
if
(
!
ATH_TXQ_SETUP
(
sc
,
i
))
continue
;
spin_lock_bh
(
&
sc
->
tx
.
txq
[
i
].
axq_lock
);
ath_txq_schedule
(
sc
,
&
sc
->
tx
.
txq
[
i
]);
spin_unlock_bh
(
&
sc
->
tx
.
txq
[
i
].
axq_lock
);
}
}
ieee80211_wake_queues
(
sc
->
hw
);
...
...
@@ -619,21 +629,10 @@ irqreturn_t ath_isr(int irq, void *dev)
static
int
ath_reset
(
struct
ath_softc
*
sc
)
{
int
i
,
r
;
int
r
;
ath9k_ps_wakeup
(
sc
);
r
=
ath_reset_internal
(
sc
,
NULL
);
for
(
i
=
0
;
i
<
ATH9K_NUM_TX_QUEUES
;
i
++
)
{
if
(
!
ATH_TXQ_SETUP
(
sc
,
i
))
continue
;
spin_lock_bh
(
&
sc
->
tx
.
txq
[
i
].
axq_lock
);
ath_txq_schedule
(
sc
,
&
sc
->
tx
.
txq
[
i
]);
spin_unlock_bh
(
&
sc
->
tx
.
txq
[
i
].
axq_lock
);
}
ath9k_ps_restore
(
sc
);
return
r
;
...
...
drivers/net/wireless/ath/ath9k/recv.c
浏览文件 @
01925efd
...
...
@@ -1342,13 +1342,6 @@ static void ath9k_antenna_check(struct ath_softc *sc,
if
(
!
(
ah
->
caps
.
hw_caps
&
ATH9K_HW_CAP_ANT_DIV_COMB
))
return
;
/*
* All MPDUs in an aggregate will use the same LNA
* as the first MPDU.
*/
if
(
rs
->
rs_isaggr
&&
!
rs
->
rs_firstaggr
)
return
;
/*
* Change the default rx antenna if rx diversity
* chooses the other antenna 3 times in a row.
...
...
drivers/net/wireless/ath/ath9k/xmit.c
浏览文件 @
01925efd
...
...
@@ -399,6 +399,7 @@ static struct ath_buf* ath_clone_txbuf(struct ath_softc *sc, struct ath_buf *bf)
tbf
->
bf_buf_addr
=
bf
->
bf_buf_addr
;
memcpy
(
tbf
->
bf_desc
,
bf
->
bf_desc
,
sc
->
sc_ah
->
caps
.
tx_desc_len
);
tbf
->
bf_state
=
bf
->
bf_state
;
tbf
->
bf_state
.
stale
=
false
;
return
tbf
;
}
...
...
@@ -1390,11 +1391,15 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
u16
tid
,
u16
*
ssn
)
{
struct
ath_atx_tid
*
txtid
;
struct
ath_txq
*
txq
;
struct
ath_node
*
an
;
u8
density
;
an
=
(
struct
ath_node
*
)
sta
->
drv_priv
;
txtid
=
ATH_AN_2_TID
(
an
,
tid
);
txq
=
txtid
->
ac
->
txq
;
ath_txq_lock
(
sc
,
txq
);
/* update ampdu factor/density, they may have changed. This may happen
* in HT IBSS when a beacon with HT-info is received after the station
...
...
@@ -1418,6 +1423,8 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
memset
(
txtid
->
tx_buf
,
0
,
sizeof
(
txtid
->
tx_buf
));
txtid
->
baw_head
=
txtid
->
baw_tail
=
0
;
ath_txq_unlock_complete
(
sc
,
txq
);
return
0
;
}
...
...
@@ -1556,8 +1563,10 @@ void ath9k_release_buffered_frames(struct ieee80211_hw *hw,
__skb_unlink
(
bf
->
bf_mpdu
,
tid_q
);
list_add_tail
(
&
bf
->
list
,
&
bf_q
);
ath_set_rates
(
tid
->
an
->
vif
,
tid
->
an
->
sta
,
bf
);
ath_tx_addto_baw
(
sc
,
tid
,
bf
);
bf
->
bf_state
.
bf_type
&=
~
BUF_AGGR
;
if
(
bf_isampdu
(
bf
))
{
ath_tx_addto_baw
(
sc
,
tid
,
bf
);
bf
->
bf_state
.
bf_type
&=
~
BUF_AGGR
;
}
if
(
bf_tail
)
bf_tail
->
bf_next
=
bf
;
...
...
@@ -1944,7 +1953,9 @@ static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
if
(
bf_is_ampdu_not_probing
(
bf
))
txq
->
axq_ampdu_depth
++
;
bf
=
bf
->
bf_lastbf
->
bf_next
;
bf_last
=
bf
->
bf_lastbf
;
bf
=
bf_last
->
bf_next
;
bf_last
->
bf_next
=
NULL
;
}
}
}
...
...
@@ -1952,15 +1963,18 @@ static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
static
void
ath_tx_send_normal
(
struct
ath_softc
*
sc
,
struct
ath_txq
*
txq
,
struct
ath_atx_tid
*
tid
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_tx_info
*
tx_info
=
IEEE80211_SKB_CB
(
skb
);
struct
ath_frame_info
*
fi
=
get_frame_info
(
skb
);
struct
list_head
bf_head
;
struct
ath_buf
*
bf
;
bf
=
fi
->
bf
;
struct
ath_buf
*
bf
=
fi
->
bf
;
INIT_LIST_HEAD
(
&
bf_head
);
list_add_tail
(
&
bf
->
list
,
&
bf_head
);
bf
->
bf_state
.
bf_type
=
0
;
if
(
tid
&&
(
tx_info
->
flags
&
IEEE80211_TX_CTL_AMPDU
))
{
bf
->
bf_state
.
bf_type
=
BUF_AMPDU
;
ath_tx_addto_baw
(
sc
,
tid
,
bf
);
}
bf
->
bf_next
=
NULL
;
bf
->
bf_lastbf
=
bf
;
...
...
drivers/net/wireless/b43/phy_n.c
浏览文件 @
01925efd
...
...
@@ -164,7 +164,8 @@ static void b43_nphy_rf_ctl_override_rev7(struct b43_wldev *dev, u16 field,
}
en_addr
=
en_addrs
[
override
][
i
];
val_addr
=
(
i
==
0
)
?
e
->
val_addr_core0
:
e
->
val_addr_core1
;
if
(
e
)
val_addr
=
(
i
==
0
)
?
e
->
val_addr_core0
:
e
->
val_addr_core1
;
if
(
off
)
{
b43_phy_mask
(
dev
,
en_addr
,
~
en_mask
);
...
...
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
浏览文件 @
01925efd
...
...
@@ -476,8 +476,6 @@ static struct sdio_driver brcmf_sdmmc_driver = {
static
int
brcmf_sdio_pd_probe
(
struct
platform_device
*
pdev
)
{
int
ret
;
brcmf_dbg
(
SDIO
,
"Enter
\n
"
);
brcmfmac_sdio_pdata
=
dev_get_platdata
(
&
pdev
->
dev
);
...
...
@@ -485,11 +483,7 @@ static int brcmf_sdio_pd_probe(struct platform_device *pdev)
if
(
brcmfmac_sdio_pdata
->
power_on
)
brcmfmac_sdio_pdata
->
power_on
();
ret
=
sdio_register_driver
(
&
brcmf_sdmmc_driver
);
if
(
ret
)
brcmf_err
(
"sdio_register_driver failed: %d
\n
"
,
ret
);
return
ret
;
return
0
;
}
static
int
brcmf_sdio_pd_remove
(
struct
platform_device
*
pdev
)
...
...
@@ -512,6 +506,15 @@ static struct platform_driver brcmf_sdio_pd = {
}
};
void
brcmf_sdio_register
(
void
)
{
int
ret
;
ret
=
sdio_register_driver
(
&
brcmf_sdmmc_driver
);
if
(
ret
)
brcmf_err
(
"sdio_register_driver failed: %d
\n
"
,
ret
);
}
void
brcmf_sdio_exit
(
void
)
{
brcmf_dbg
(
SDIO
,
"Enter
\n
"
);
...
...
@@ -522,18 +525,13 @@ void brcmf_sdio_exit(void)
sdio_unregister_driver
(
&
brcmf_sdmmc_driver
);
}
void
brcmf_sdio_init
(
void
)
void
__init
brcmf_sdio_init
(
void
)
{
int
ret
;
brcmf_dbg
(
SDIO
,
"Enter
\n
"
);
ret
=
platform_driver_probe
(
&
brcmf_sdio_pd
,
brcmf_sdio_pd_probe
);
if
(
ret
==
-
ENODEV
)
{
brcmf_dbg
(
SDIO
,
"No platform data available, registering without.
\n
"
);
ret
=
sdio_register_driver
(
&
brcmf_sdmmc_driver
);
}
if
(
ret
)
brcmf_err
(
"driver registration failed: %d
\n
"
,
ret
);
if
(
ret
==
-
ENODEV
)
brcmf_dbg
(
SDIO
,
"No platform data available.
\n
"
);
}
drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
浏览文件 @
01925efd
...
...
@@ -156,10 +156,11 @@ extern int brcmf_bus_start(struct device *dev);
#ifdef CONFIG_BRCMFMAC_SDIO
extern
void
brcmf_sdio_exit
(
void
);
extern
void
brcmf_sdio_init
(
void
);
extern
void
brcmf_sdio_register
(
void
);
#endif
#ifdef CONFIG_BRCMFMAC_USB
extern
void
brcmf_usb_exit
(
void
);
extern
void
brcmf_usb_
init
(
void
);
extern
void
brcmf_usb_
register
(
void
);
#endif
#endif
/* _BRCMF_BUS_H_ */
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
浏览文件 @
01925efd
...
...
@@ -1225,21 +1225,23 @@ u32 brcmf_get_chip_info(struct brcmf_if *ifp)
return
bus
->
chip
<<
4
|
bus
->
chiprev
;
}
static
void
brcmf_driver_
init
(
struct
work_struct
*
work
)
static
void
brcmf_driver_
register
(
struct
work_struct
*
work
)
{
brcmf_debugfs_init
();
#ifdef CONFIG_BRCMFMAC_SDIO
brcmf_sdio_
init
();
brcmf_sdio_
register
();
#endif
#ifdef CONFIG_BRCMFMAC_USB
brcmf_usb_
init
();
brcmf_usb_
register
();
#endif
}
static
DECLARE_WORK
(
brcmf_driver_work
,
brcmf_driver_
init
);
static
DECLARE_WORK
(
brcmf_driver_work
,
brcmf_driver_
register
);
static
int
__init
brcmfmac_module_init
(
void
)
{
brcmf_debugfs_init
();
#ifdef CONFIG_BRCMFMAC_SDIO
brcmf_sdio_init
();
#endif
if
(
!
schedule_work
(
&
brcmf_driver_work
))
return
-
EBUSY
;
...
...
drivers/net/wireless/brcm80211/brcmfmac/usb.c
浏览文件 @
01925efd
...
...
@@ -1536,7 +1536,7 @@ void brcmf_usb_exit(void)
brcmf_release_fw
(
&
fw_image_list
);
}
void
brcmf_usb_
init
(
void
)
void
brcmf_usb_
register
(
void
)
{
brcmf_dbg
(
USB
,
"Enter
\n
"
);
INIT_LIST_HEAD
(
&
fw_image_list
);
...
...
drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
浏览文件 @
01925efd
...
...
@@ -457,6 +457,8 @@ static int brcms_ops_start(struct ieee80211_hw *hw)
if
(
err
!=
0
)
brcms_err
(
wl
->
wlc
->
hw
->
d11core
,
"%s: brcms_up() returned %d
\n
"
,
__func__
,
err
);
bcma_core_pci_power_save
(
wl
->
wlc
->
hw
->
d11core
->
bus
,
true
);
return
err
;
}
...
...
@@ -479,6 +481,8 @@ static void brcms_ops_stop(struct ieee80211_hw *hw)
return
;
}
bcma_core_pci_power_save
(
wl
->
wlc
->
hw
->
d11core
->
bus
,
false
);
/* put driver in down state */
spin_lock_bh
(
&
wl
->
lock
);
brcms_down
(
wl
);
...
...
drivers/net/wireless/cw1200/cw1200_spi.c
浏览文件 @
01925efd
...
...
@@ -42,7 +42,6 @@ struct hwbus_priv {
spinlock_t
lock
;
/* Serialize all bus operations */
wait_queue_head_t
wq
;
int
claimed
;
int
irq_disabled
;
};
#define SDIO_TO_SPI_ADDR(addr) ((addr & 0x1f)>>2)
...
...
@@ -238,9 +237,9 @@ static irqreturn_t cw1200_spi_irq_handler(int irq, void *dev_id)
struct
hwbus_priv
*
self
=
dev_id
;
if
(
self
->
core
)
{
disable_irq_nosync
(
self
->
func
->
irq
);
self
->
irq_disabled
=
1
;
cw1200_spi_lock
(
self
);
cw1200_irq_handler
(
self
->
core
);
cw1200_spi_unlock
(
self
);
return
IRQ_HANDLED
;
}
else
{
return
IRQ_NONE
;
...
...
@@ -253,9 +252,10 @@ static int cw1200_spi_irq_subscribe(struct hwbus_priv *self)
pr_debug
(
"SW IRQ subscribe
\n
"
);
ret
=
request_any_context_irq
(
self
->
func
->
irq
,
cw1200_spi_irq_handler
,
IRQF_TRIGGER_HIGH
,
"cw1200_wlan_irq"
,
self
);
ret
=
request_threaded_irq
(
self
->
func
->
irq
,
NULL
,
cw1200_spi_irq_handler
,
IRQF_TRIGGER_HIGH
|
IRQF_ONESHOT
,
"cw1200_wlan_irq"
,
self
);
if
(
WARN_ON
(
ret
<
0
))
goto
exit
;
...
...
@@ -273,22 +273,13 @@ static int cw1200_spi_irq_subscribe(struct hwbus_priv *self)
static
int
cw1200_spi_irq_unsubscribe
(
struct
hwbus_priv
*
self
)
{
int
ret
=
0
;
pr_debug
(
"SW IRQ unsubscribe
\n
"
);
disable_irq_wake
(
self
->
func
->
irq
);
free_irq
(
self
->
func
->
irq
,
self
);
return
0
;
}
static
int
cw1200_spi_irq_enable
(
struct
hwbus_priv
*
self
,
int
enable
)
{
/* Disables are handled by the interrupt handler */
if
(
enable
&&
self
->
irq_disabled
)
{
enable_irq
(
self
->
func
->
irq
);
self
->
irq_disabled
=
0
;
}
return
0
;
return
ret
;
}
static
int
cw1200_spi_off
(
const
struct
cw1200_platform_data_spi
*
pdata
)
...
...
@@ -368,7 +359,6 @@ static struct hwbus_ops cw1200_spi_hwbus_ops = {
.
unlock
=
cw1200_spi_unlock
,
.
align_size
=
cw1200_spi_align_size
,
.
power_mgmt
=
cw1200_spi_pm
,
.
irq_enable
=
cw1200_spi_irq_enable
,
};
/* Probe Function to be called by SPI stack when device is discovered */
...
...
drivers/net/wireless/cw1200/fwio.c
浏览文件 @
01925efd
...
...
@@ -485,7 +485,7 @@ int cw1200_load_firmware(struct cw1200_common *priv)
/* Enable interrupt signalling */
priv
->
hwbus_ops
->
lock
(
priv
->
hwbus_priv
);
ret
=
__cw1200_irq_enable
(
priv
,
2
);
ret
=
__cw1200_irq_enable
(
priv
,
1
);
priv
->
hwbus_ops
->
unlock
(
priv
->
hwbus_priv
);
if
(
ret
<
0
)
goto
unsubscribe
;
...
...
drivers/net/wireless/cw1200/hwbus.h
浏览文件 @
01925efd
...
...
@@ -28,7 +28,6 @@ struct hwbus_ops {
void
(
*
unlock
)(
struct
hwbus_priv
*
self
);
size_t
(
*
align_size
)(
struct
hwbus_priv
*
self
,
size_t
size
);
int
(
*
power_mgmt
)(
struct
hwbus_priv
*
self
,
bool
suspend
);
int
(
*
irq_enable
)(
struct
hwbus_priv
*
self
,
int
enable
);
};
#endif
/* CW1200_HWBUS_H */
drivers/net/wireless/cw1200/hwio.c
浏览文件 @
01925efd
...
...
@@ -273,21 +273,6 @@ int __cw1200_irq_enable(struct cw1200_common *priv, int enable)
u16
val16
;
int
ret
;
/* We need to do this hack because the SPI layer can sleep on I/O
and the general path involves I/O to the device in interrupt
context.
However, the initial enable call needs to go to the hardware.
We don't worry about shutdown because we do a full reset which
clears the interrupt enabled bits.
*/
if
(
priv
->
hwbus_ops
->
irq_enable
)
{
ret
=
priv
->
hwbus_ops
->
irq_enable
(
priv
->
hwbus_priv
,
enable
);
if
(
ret
||
enable
<
2
)
return
ret
;
}
if
(
HIF_8601_SILICON
==
priv
->
hw_type
)
{
ret
=
__cw1200_reg_read_32
(
priv
,
ST90TDS_CONFIG_REG_ID
,
&
val32
);
if
(
ret
<
0
)
{
...
...
drivers/net/wireless/iwlwifi/dvm/tx.c
浏览文件 @
01925efd
...
...
@@ -433,27 +433,19 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
/* Copy MAC header from skb into command buffer */
memcpy
(
tx_cmd
->
hdr
,
hdr
,
hdr_len
);
txq_id
=
info
->
hw_queue
;
if
(
is_agg
)
txq_id
=
priv
->
tid_data
[
sta_id
][
tid
].
agg
.
txq_id
;
else
if
(
info
->
flags
&
IEEE80211_TX_CTL_SEND_AFTER_DTIM
)
{
/*
* Send this frame after DTIM -- there's a special queue
* reserved for this for contexts that support AP mode.
*/
txq_id
=
ctx
->
mcast_queue
;
/*
* The microcode will clear the more data
* bit in the last frame it transmits.
*/
hdr
->
frame_control
|=
cpu_to_le16
(
IEEE80211_FCTL_MOREDATA
);
}
else
if
(
info
->
flags
&
IEEE80211_TX_CTL_TX_OFFCHAN
)
txq_id
=
IWL_AUX_QUEUE
;
else
txq_id
=
ctx
->
ac_to_queue
[
skb_get_queue_mapping
(
skb
)];
}
WARN_ON_ONCE
(
!
is_agg
&&
txq_id
!=
info
->
hw_queue
);
WARN_ON_ONCE
(
is_agg
&&
priv
->
queue_to_mac80211
[
txq_id
]
!=
info
->
hw_queue
);
...
...
drivers/net/wireless/iwlwifi/iwl-6000.c
浏览文件 @
01925efd
...
...
@@ -240,6 +240,12 @@ const struct iwl_cfg iwl6035_2agn_cfg = {
.
ht_params
=
&
iwl6000_ht_params
,
};
const
struct
iwl_cfg
iwl6035_2agn_sff_cfg
=
{
.
name
=
"Intel(R) Centrino(R) Ultimate-N 6235 AGN"
,
IWL_DEVICE_6035
,
.
ht_params
=
&
iwl6000_ht_params
,
};
const
struct
iwl_cfg
iwl1030_bgn_cfg
=
{
.
name
=
"Intel(R) Centrino(R) Wireless-N 1030 BGN"
,
IWL_DEVICE_6030
,
...
...
drivers/net/wireless/iwlwifi/iwl-config.h
浏览文件 @
01925efd
...
...
@@ -280,6 +280,7 @@ extern const struct iwl_cfg iwl2000_2bgn_cfg;
extern
const
struct
iwl_cfg
iwl2000_2bgn_d_cfg
;
extern
const
struct
iwl_cfg
iwl2030_2bgn_cfg
;
extern
const
struct
iwl_cfg
iwl6035_2agn_cfg
;
extern
const
struct
iwl_cfg
iwl6035_2agn_sff_cfg
;
extern
const
struct
iwl_cfg
iwl105_bgn_cfg
;
extern
const
struct
iwl_cfg
iwl105_bgn_d_cfg
;
extern
const
struct
iwl_cfg
iwl135_bgn_cfg
;
...
...
drivers/net/wireless/iwlwifi/iwl-trans.h
浏览文件 @
01925efd
...
...
@@ -601,8 +601,10 @@ static inline int iwl_trans_send_cmd(struct iwl_trans *trans,
{
int
ret
;
WARN_ONCE
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
if
(
unlikely
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
))
{
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
return
-
EIO
;
}
if
(
!
(
cmd
->
flags
&
CMD_ASYNC
))
lock_map_acquire_read
(
&
trans
->
sync_cmd_lockdep_map
);
...
...
@@ -638,8 +640,8 @@ static inline void iwl_trans_free_tx_cmd(struct iwl_trans *trans,
static
inline
int
iwl_trans_tx
(
struct
iwl_trans
*
trans
,
struct
sk_buff
*
skb
,
struct
iwl_device_cmd
*
dev_cmd
,
int
queue
)
{
WARN_ONCE
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
if
(
unlikely
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
))
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
return
trans
->
ops
->
tx
(
trans
,
skb
,
dev_cmd
,
queue
);
}
...
...
@@ -647,16 +649,16 @@ static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb,
static
inline
void
iwl_trans_reclaim
(
struct
iwl_trans
*
trans
,
int
queue
,
int
ssn
,
struct
sk_buff_head
*
skbs
)
{
WARN_ONCE
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
if
(
unlikely
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
))
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
trans
->
ops
->
reclaim
(
trans
,
queue
,
ssn
,
skbs
);
}
static
inline
void
iwl_trans_txq_disable
(
struct
iwl_trans
*
trans
,
int
queue
)
{
WARN_ONCE
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
if
(
unlikely
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
))
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
trans
->
ops
->
txq_disable
(
trans
,
queue
);
}
...
...
@@ -667,8 +669,8 @@ static inline void iwl_trans_txq_enable(struct iwl_trans *trans, int queue,
{
might_sleep
();
WARN_ONCE
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
if
(
unlikely
((
trans
->
state
!=
IWL_TRANS_FW_ALIVE
)))
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
trans
->
ops
->
txq_enable
(
trans
,
queue
,
fifo
,
sta_id
,
tid
,
frame_limit
,
ssn
);
...
...
@@ -683,8 +685,8 @@ static inline void iwl_trans_ac_txq_enable(struct iwl_trans *trans, int queue,
static
inline
int
iwl_trans_wait_tx_queue_empty
(
struct
iwl_trans
*
trans
)
{
WARN_ONCE
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
if
(
unlikely
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
))
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
return
trans
->
ops
->
wait_tx_queue_empty
(
trans
);
}
...
...
drivers/net/wireless/iwlwifi/mvm/power.c
浏览文件 @
01925efd
...
...
@@ -273,7 +273,10 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
if
(
!
mvmvif
->
queue_params
[
ac
].
uapsd
)
continue
;
cmd
->
flags
|=
cpu_to_le16
(
POWER_FLAGS_ADVANCE_PM_ENA_MSK
);
if
(
mvm
->
cur_ucode
!=
IWL_UCODE_WOWLAN
)
cmd
->
flags
|=
cpu_to_le16
(
POWER_FLAGS_ADVANCE_PM_ENA_MSK
);
cmd
->
uapsd_ac_flags
|=
BIT
(
ac
);
/* QNDP TID - the highest TID with no admission control */
...
...
drivers/net/wireless/iwlwifi/mvm/scan.c
浏览文件 @
01925efd
...
...
@@ -97,10 +97,10 @@ static inline __le32 iwl_mvm_scan_max_out_time(struct ieee80211_vif *vif)
static
inline
__le32
iwl_mvm_scan_suspend_time
(
struct
ieee80211_vif
*
vif
)
{
if
(
vif
->
bss_conf
.
assoc
)
return
cpu_to_le32
(
vif
->
bss_conf
.
beacon_int
);
else
if
(
!
vif
->
bss_conf
.
assoc
)
return
0
;
return
cpu_to_le32
(
ieee80211_tu_to_usec
(
vif
->
bss_conf
.
beacon_int
));
}
static
inline
__le32
...
...
@@ -423,6 +423,11 @@ static bool iwl_mvm_scan_abort_notif(struct iwl_notif_wait_data *notif_wait,
return
false
;
}
/*
* If scan cannot be aborted, it means that we had a
* SCAN_COMPLETE_NOTIFICATION in the pipe and it called
* ieee80211_scan_completed already.
*/
IWL_DEBUG_SCAN
(
mvm
,
"Scan cannot be aborted, exit now: %d
\n
"
,
*
resp
);
return
true
;
...
...
@@ -446,14 +451,19 @@ void iwl_mvm_cancel_scan(struct iwl_mvm *mvm)
SCAN_COMPLETE_NOTIFICATION
};
int
ret
;
if
(
mvm
->
scan_status
==
IWL_MVM_SCAN_NONE
)
return
;
iwl_init_notification_wait
(
&
mvm
->
notif_wait
,
&
wait_scan_abort
,
scan_abort_notif
,
ARRAY_SIZE
(
scan_abort_notif
),
iwl_mvm_scan_abort_notif
,
NULL
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
SCAN_ABORT_CMD
,
CMD_SYNC
,
0
,
NULL
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
SCAN_ABORT_CMD
,
CMD_SYNC
|
CMD_SEND_IN_RFKILL
,
0
,
NULL
);
if
(
ret
)
{
IWL_ERR
(
mvm
,
"Couldn't send SCAN_ABORT_CMD: %d
\n
"
,
ret
);
/* mac80211's state will be cleaned in the fw_restart flow */
goto
out_remove_notif
;
}
...
...
drivers/net/wireless/iwlwifi/pcie/drv.c
浏览文件 @
01925efd
...
...
@@ -139,13 +139,16 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
/* 6x00 Series */
{
IWL_PCI_DEVICE
(
0x422B
,
0x1101
,
iwl6000_3agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x422B
,
0x1108
,
iwl6000_3agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x422B
,
0x1121
,
iwl6000_3agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x422B
,
0x1128
,
iwl6000_3agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x422C
,
0x1301
,
iwl6000i_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x422C
,
0x1306
,
iwl6000i_2abg_cfg
)},
{
IWL_PCI_DEVICE
(
0x422C
,
0x1307
,
iwl6000i_2bg_cfg
)},
{
IWL_PCI_DEVICE
(
0x422C
,
0x1321
,
iwl6000i_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x422C
,
0x1326
,
iwl6000i_2abg_cfg
)},
{
IWL_PCI_DEVICE
(
0x4238
,
0x1111
,
iwl6000_3agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x4238
,
0x1118
,
iwl6000_3agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x4239
,
0x1311
,
iwl6000i_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x4239
,
0x1316
,
iwl6000i_2abg_cfg
)},
...
...
@@ -153,12 +156,16 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
{
IWL_PCI_DEVICE
(
0x0082
,
0x1301
,
iwl6005_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x0082
,
0x1306
,
iwl6005_2abg_cfg
)},
{
IWL_PCI_DEVICE
(
0x0082
,
0x1307
,
iwl6005_2bg_cfg
)},
{
IWL_PCI_DEVICE
(
0x0082
,
0x1308
,
iwl6005_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x0082
,
0x1321
,
iwl6005_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x0082
,
0x1326
,
iwl6005_2abg_cfg
)},
{
IWL_PCI_DEVICE
(
0x0082
,
0x1328
,
iwl6005_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x0085
,
0x1311
,
iwl6005_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x0085
,
0x1318
,
iwl6005_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x0085
,
0x1316
,
iwl6005_2abg_cfg
)},
{
IWL_PCI_DEVICE
(
0x0082
,
0xC020
,
iwl6005_2agn_sff_cfg
)},
{
IWL_PCI_DEVICE
(
0x0085
,
0xC220
,
iwl6005_2agn_sff_cfg
)},
{
IWL_PCI_DEVICE
(
0x0085
,
0xC228
,
iwl6005_2agn_sff_cfg
)},
{
IWL_PCI_DEVICE
(
0x0082
,
0x4820
,
iwl6005_2agn_d_cfg
)},
{
IWL_PCI_DEVICE
(
0x0082
,
0x1304
,
iwl6005_2agn_mow1_cfg
)},
/* low 5GHz active */
{
IWL_PCI_DEVICE
(
0x0082
,
0x1305
,
iwl6005_2agn_mow2_cfg
)},
/* high 5GHz active */
...
...
@@ -240,8 +247,11 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
/* 6x35 Series */
{
IWL_PCI_DEVICE
(
0x088E
,
0x4060
,
iwl6035_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x088E
,
0x406A
,
iwl6035_2agn_sff_cfg
)},
{
IWL_PCI_DEVICE
(
0x088F
,
0x4260
,
iwl6035_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x088F
,
0x426A
,
iwl6035_2agn_sff_cfg
)},
{
IWL_PCI_DEVICE
(
0x088E
,
0x4460
,
iwl6035_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x088E
,
0x446A
,
iwl6035_2agn_sff_cfg
)},
{
IWL_PCI_DEVICE
(
0x088E
,
0x4860
,
iwl6035_2agn_cfg
)},
{
IWL_PCI_DEVICE
(
0x088F
,
0x5260
,
iwl6035_2agn_cfg
)},
...
...
@@ -260,54 +270,86 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
#if IS_ENABLED(CONFIG_IWLMVM)
/* 7260 Series */
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4070
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4072
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4170
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4060
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x406A
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4160
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4062
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4162
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x4270
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x4272
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x4260
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x426A
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x4262
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4470
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4472
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4460
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x446A
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4462
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4870
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x486E
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4A70
,
iwl7260_2ac_cfg_high_temp
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4A6E
,
iwl7260_2ac_cfg_high_temp
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4A6C
,
iwl7260_2ac_cfg_high_temp
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4570
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4560
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x4370
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x4360
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x5070
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4020
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x402A
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x4220
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4420
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC070
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC072
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC170
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC060
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC06A
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC160
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC062
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC162
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC770
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC760
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0xC270
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0xC272
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0xC260
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0xC26A
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0xC262
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC470
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC472
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC460
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC462
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC570
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC560
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0xC370
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC360
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC020
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC02A
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0xC220
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0xC420
,
iwl7260_2n_cfg
)},
/* 3160 Series */
{
IWL_PCI_DEVICE
(
0x08B3
,
0x0070
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x0072
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x0170
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x0172
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x0060
,
iwl3160_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x0062
,
iwl3160_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B4
,
0x0270
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B4
,
0x0272
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x0470
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x0472
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B4
,
0x0370
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8070
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8072
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8170
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8172
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8060
,
iwl3160_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8062
,
iwl3160_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B4
,
0x8270
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8470
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8570
,
iwl3160_2ac_cfg
)},
/* 7265 Series */
{
IWL_PCI_DEVICE
(
0x095A
,
0x5010
,
iwl7265_2ac_cfg
)},
...
...
drivers/net/wireless/iwlwifi/pcie/tx.c
浏览文件 @
01925efd
...
...
@@ -1102,6 +1102,8 @@ void iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, int fifo,
* non-AGG queue.
*/
iwl_clear_bits_prph
(
trans
,
SCD_AGGR_SEL
,
BIT
(
txq_id
));
ssn
=
trans_pcie
->
txq
[
txq_id
].
q
.
read_ptr
;
}
/* Place first TFD at index corresponding to start sequence number.
...
...
@@ -1463,7 +1465,8 @@ void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
spin_unlock_bh
(
&
txq
->
lock
);
}
#define HOST_COMPLETE_TIMEOUT (2 * HZ)
#define HOST_COMPLETE_TIMEOUT (2 * HZ)
#define COMMAND_POKE_TIMEOUT (HZ / 10)
static
int
iwl_pcie_send_hcmd_async
(
struct
iwl_trans
*
trans
,
struct
iwl_host_cmd
*
cmd
)
...
...
@@ -1491,6 +1494,7 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
struct
iwl_trans_pcie
*
trans_pcie
=
IWL_TRANS_GET_PCIE_TRANS
(
trans
);
int
cmd_idx
;
int
ret
;
int
timeout
=
HOST_COMPLETE_TIMEOUT
;
IWL_DEBUG_INFO
(
trans
,
"Attempting to send sync command %s
\n
"
,
get_cmd_string
(
trans_pcie
,
cmd
->
id
));
...
...
@@ -1515,10 +1519,29 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
return
ret
;
}
ret
=
wait_event_timeout
(
trans_pcie
->
wait_command_queue
,
!
test_bit
(
STATUS_HCMD_ACTIVE
,
&
trans_pcie
->
status
),
HOST_COMPLETE_TIMEOUT
);
while
(
timeout
>
0
)
{
unsigned
long
flags
;
timeout
-=
COMMAND_POKE_TIMEOUT
;
ret
=
wait_event_timeout
(
trans_pcie
->
wait_command_queue
,
!
test_bit
(
STATUS_HCMD_ACTIVE
,
&
trans_pcie
->
status
),
COMMAND_POKE_TIMEOUT
);
if
(
ret
)
break
;
/* poke the device - it may have lost the command */
if
(
iwl_trans_grab_nic_access
(
trans
,
true
,
&
flags
))
{
iwl_trans_release_nic_access
(
trans
,
&
flags
);
IWL_DEBUG_INFO
(
trans
,
"Tried to wake NIC for command %s
\n
"
,
get_cmd_string
(
trans_pcie
,
cmd
->
id
));
}
else
{
IWL_ERR
(
trans
,
"Failed to poke NIC for command %s
\n
"
,
get_cmd_string
(
trans_pcie
,
cmd
->
id
));
break
;
}
}
if
(
!
ret
)
{
if
(
test_bit
(
STATUS_HCMD_ACTIVE
,
&
trans_pcie
->
status
))
{
struct
iwl_txq
*
txq
=
...
...
drivers/net/wireless/mwifiex/11n_aggr.c
浏览文件 @
01925efd
...
...
@@ -150,7 +150,7 @@ mwifiex_11n_form_amsdu_txpd(struct mwifiex_private *priv,
*/
int
mwifiex_11n_aggregate_pkt
(
struct
mwifiex_private
*
priv
,
struct
mwifiex_ra_list_tbl
*
pra_list
,
int
headroom
,
struct
mwifiex_ra_list_tbl
*
pra_list
,
int
ptrindex
,
unsigned
long
ra_list_flags
)
__releases
(
&
priv
->
wmm
.
ra_list_spinlock
)
{
...
...
@@ -160,6 +160,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
int
pad
=
0
,
ret
;
struct
mwifiex_tx_param
tx_param
;
struct
txpd
*
ptx_pd
=
NULL
;
int
headroom
=
adapter
->
iface_type
==
MWIFIEX_USB
?
0
:
INTF_HEADER_LEN
;
skb_src
=
skb_peek
(
&
pra_list
->
skb_head
);
if
(
!
skb_src
)
{
...
...
drivers/net/wireless/mwifiex/11n_aggr.h
浏览文件 @
01925efd
...
...
@@ -26,7 +26,7 @@
int
mwifiex_11n_deaggregate_pkt
(
struct
mwifiex_private
*
priv
,
struct
sk_buff
*
skb
);
int
mwifiex_11n_aggregate_pkt
(
struct
mwifiex_private
*
priv
,
struct
mwifiex_ra_list_tbl
*
ptr
,
int
headroom
,
struct
mwifiex_ra_list_tbl
*
ptr
,
int
ptr_index
,
unsigned
long
flags
)
__releases
(
&
priv
->
wmm
.
ra_list_spinlock
);
...
...
drivers/net/wireless/mwifiex/cmdevt.c
浏览文件 @
01925efd
...
...
@@ -1155,7 +1155,7 @@ int mwifiex_ret_802_11_hs_cfg(struct mwifiex_private *priv,
uint32_t
conditions
=
le32_to_cpu
(
phs_cfg
->
params
.
hs_config
.
conditions
);
if
(
phs_cfg
->
action
==
cpu_to_le16
(
HS_ACTIVATE
)
&&
adapter
->
iface_type
==
MWIFIEX_SDIO
)
{
adapter
->
iface_type
!=
MWIFIEX_USB
)
{
mwifiex_hs_activated_event
(
priv
,
true
);
return
0
;
}
else
{
...
...
@@ -1167,8 +1167,7 @@ int mwifiex_ret_802_11_hs_cfg(struct mwifiex_private *priv,
}
if
(
conditions
!=
HS_CFG_CANCEL
)
{
adapter
->
is_hs_configured
=
true
;
if
(
adapter
->
iface_type
==
MWIFIEX_USB
||
adapter
->
iface_type
==
MWIFIEX_PCIE
)
if
(
adapter
->
iface_type
==
MWIFIEX_USB
)
mwifiex_hs_activated_event
(
priv
,
true
);
}
else
{
adapter
->
is_hs_configured
=
false
;
...
...
drivers/net/wireless/mwifiex/join.c
浏览文件 @
01925efd
...
...
@@ -1422,13 +1422,19 @@ static int mwifiex_deauthenticate_infra(struct mwifiex_private *priv, u8 *mac)
*/
int
mwifiex_deauthenticate
(
struct
mwifiex_private
*
priv
,
u8
*
mac
)
{
int
ret
=
0
;
if
(
!
priv
->
media_connected
)
return
0
;
switch
(
priv
->
bss_mode
)
{
case
NL80211_IFTYPE_STATION
:
case
NL80211_IFTYPE_P2P_CLIENT
:
return
mwifiex_deauthenticate_infra
(
priv
,
mac
);
ret
=
mwifiex_deauthenticate_infra
(
priv
,
mac
);
if
(
ret
)
cfg80211_disconnected
(
priv
->
netdev
,
0
,
NULL
,
0
,
GFP_KERNEL
);
break
;
case
NL80211_IFTYPE_ADHOC
:
return
mwifiex_send_cmd_sync
(
priv
,
HostCmd_CMD_802_11_AD_HOC_STOP
,
...
...
@@ -1440,7 +1446,7 @@ int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac)
break
;
}
return
0
;
return
ret
;
}
EXPORT_SYMBOL_GPL
(
mwifiex_deauthenticate
);
...
...
drivers/net/wireless/mwifiex/main.c
浏览文件 @
01925efd
...
...
@@ -358,10 +358,12 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
}
}
while
(
true
);
if
((
adapter
->
int_status
)
||
IS_CARD_RX_RCVD
(
adapter
))
spin_lock_irqsave
(
&
adapter
->
main_proc_lock
,
flags
);
if
((
adapter
->
int_status
)
||
IS_CARD_RX_RCVD
(
adapter
))
{
spin_unlock_irqrestore
(
&
adapter
->
main_proc_lock
,
flags
);
goto
process_start
;
}
spin_lock_irqsave
(
&
adapter
->
main_proc_lock
,
flags
);
adapter
->
mwifiex_processing
=
false
;
spin_unlock_irqrestore
(
&
adapter
->
main_proc_lock
,
flags
);
...
...
drivers/net/wireless/mwifiex/sta_event.c
浏览文件 @
01925efd
...
...
@@ -118,7 +118,8 @@ mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code)
dev_dbg
(
adapter
->
dev
,
"info: successfully disconnected from %pM: reason code %d
\n
"
,
priv
->
cfg_bssid
,
reason_code
);
if
(
priv
->
bss_mode
==
NL80211_IFTYPE_STATION
)
{
if
(
priv
->
bss_mode
==
NL80211_IFTYPE_STATION
||
priv
->
bss_mode
==
NL80211_IFTYPE_P2P_CLIENT
)
{
cfg80211_disconnected
(
priv
->
netdev
,
reason_code
,
NULL
,
0
,
GFP_KERNEL
);
}
...
...
drivers/net/wireless/mwifiex/usb.c
浏览文件 @
01925efd
...
...
@@ -447,9 +447,6 @@ static int mwifiex_usb_suspend(struct usb_interface *intf, pm_message_t message)
*/
adapter
->
is_suspended
=
true
;
for
(
i
=
0
;
i
<
adapter
->
priv_num
;
i
++
)
netif_carrier_off
(
adapter
->
priv
[
i
]
->
netdev
);
if
(
atomic_read
(
&
card
->
rx_cmd_urb_pending
)
&&
card
->
rx_cmd
.
urb
)
usb_kill_urb
(
card
->
rx_cmd
.
urb
);
...
...
@@ -509,10 +506,6 @@ static int mwifiex_usb_resume(struct usb_interface *intf)
MWIFIEX_RX_CMD_BUF_SIZE
);
}
for
(
i
=
0
;
i
<
adapter
->
priv_num
;
i
++
)
if
(
adapter
->
priv
[
i
]
->
media_connected
)
netif_carrier_on
(
adapter
->
priv
[
i
]
->
netdev
);
/* Disable Host Sleep */
if
(
adapter
->
hs_activated
)
mwifiex_cancel_hs
(
mwifiex_get_priv
(
adapter
,
...
...
drivers/net/wireless/mwifiex/wmm.c
浏览文件 @
01925efd
...
...
@@ -1239,8 +1239,7 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter)
if
(
enable_tx_amsdu
&&
mwifiex_is_amsdu_allowed
(
priv
,
tid
)
&&
mwifiex_is_11n_aggragation_possible
(
priv
,
ptr
,
adapter
->
tx_buf_size
))
mwifiex_11n_aggregate_pkt
(
priv
,
ptr
,
INTF_HEADER_LEN
,
ptr_index
,
flags
);
mwifiex_11n_aggregate_pkt
(
priv
,
ptr
,
ptr_index
,
flags
);
/* ra_list_spinlock has been freed in
mwifiex_11n_aggregate_pkt() */
else
...
...
drivers/net/wireless/p54/p54usb.c
浏览文件 @
01925efd
...
...
@@ -83,6 +83,7 @@ static struct usb_device_id p54u_table[] = {
{
USB_DEVICE
(
0x06a9
,
0x000e
)},
/* Westell 802.11g USB (A90-211WG-01) */
{
USB_DEVICE
(
0x06b9
,
0x0121
)},
/* Thomson SpeedTouch 121g */
{
USB_DEVICE
(
0x0707
,
0xee13
)},
/* SMC 2862W-G version 2 */
{
USB_DEVICE
(
0x07aa
,
0x0020
)},
/* Corega WLUSB2GTST USB */
{
USB_DEVICE
(
0x0803
,
0x4310
)},
/* Zoom 4410a */
{
USB_DEVICE
(
0x083a
,
0x4521
)},
/* Siemens Gigaset USB Adapter 54 version 2 */
{
USB_DEVICE
(
0x083a
,
0x4531
)},
/* T-Com Sinus 154 data II */
...
...
@@ -979,6 +980,7 @@ static int p54u_load_firmware(struct ieee80211_hw *dev,
if
(
err
)
{
dev_err
(
&
priv
->
udev
->
dev
,
"(p54usb) cannot load firmware %s "
"(%d)!
\n
"
,
p54u_fwlist
[
i
].
fw
,
err
);
usb_put_dev
(
udev
);
}
return
err
;
...
...
drivers/net/wireless/rt2x00/rt2400pci.c
浏览文件 @
01925efd
...
...
@@ -1261,7 +1261,7 @@ static void rt2400pci_fill_rxdone(struct queue_entry *entry,
*/
rxdesc
->
timestamp
=
((
u64
)
rx_high
<<
32
)
|
rx_low
;
rxdesc
->
signal
=
rt2x00_get_field32
(
word2
,
RXD_W2_SIGNAL
)
&
~
0x08
;
rxdesc
->
rssi
=
rt2x00_get_field32
(
word
2
,
RXD_W3_RSSI
)
-
rxdesc
->
rssi
=
rt2x00_get_field32
(
word
3
,
RXD_W3_RSSI
)
-
entry
->
queue
->
rt2x00dev
->
rssi_offset
;
rxdesc
->
size
=
rt2x00_get_field32
(
word0
,
RXD_W0_DATABYTE_COUNT
);
...
...
drivers/net/wireless/rt2x00/rt2800usb.c
浏览文件 @
01925efd
...
...
@@ -148,6 +148,8 @@ static bool rt2800usb_txstatus_timeout(struct rt2x00_dev *rt2x00dev)
return
false
;
}
#define TXSTATUS_READ_INTERVAL 1000000
static
bool
rt2800usb_tx_sta_fifo_read_completed
(
struct
rt2x00_dev
*
rt2x00dev
,
int
urb_status
,
u32
tx_status
)
{
...
...
@@ -176,8 +178,9 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev,
queue_work
(
rt2x00dev
->
workqueue
,
&
rt2x00dev
->
txdone_work
);
if
(
rt2800usb_txstatus_pending
(
rt2x00dev
))
{
/* Read register after 250 us */
hrtimer_start
(
&
rt2x00dev
->
txstatus_timer
,
ktime_set
(
0
,
250000
),
/* Read register after 1 ms */
hrtimer_start
(
&
rt2x00dev
->
txstatus_timer
,
ktime_set
(
0
,
TXSTATUS_READ_INTERVAL
),
HRTIMER_MODE_REL
);
return
false
;
}
...
...
@@ -202,8 +205,9 @@ static void rt2800usb_async_read_tx_status(struct rt2x00_dev *rt2x00dev)
if
(
test_and_set_bit
(
TX_STATUS_READING
,
&
rt2x00dev
->
flags
))
return
;
/* Read TX_STA_FIFO register after 500 us */
hrtimer_start
(
&
rt2x00dev
->
txstatus_timer
,
ktime_set
(
0
,
500000
),
/* Read TX_STA_FIFO register after 2 ms */
hrtimer_start
(
&
rt2x00dev
->
txstatus_timer
,
ktime_set
(
0
,
2
*
TXSTATUS_READ_INTERVAL
),
HRTIMER_MODE_REL
);
}
...
...
drivers/net/wireless/rt2x00/rt2x00mac.c
浏览文件 @
01925efd
...
...
@@ -754,6 +754,9 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
struct
rt2x00_dev
*
rt2x00dev
=
hw
->
priv
;
struct
data_queue
*
queue
;
if
(
!
test_bit
(
DEVICE_STATE_PRESENT
,
&
rt2x00dev
->
flags
))
return
;
tx_queue_for_each
(
rt2x00dev
,
queue
)
rt2x00queue_flush_queue
(
queue
,
drop
);
}
...
...
drivers/net/wireless/rt2x00/rt2x00pci.c
浏览文件 @
01925efd
...
...
@@ -105,13 +105,11 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)
goto
exit_release_regions
;
}
pci_enable_msi
(
pci_dev
);
hw
=
ieee80211_alloc_hw
(
sizeof
(
struct
rt2x00_dev
),
ops
->
hw
);
if
(
!
hw
)
{
rt2x00_probe_err
(
"Failed to allocate hardware
\n
"
);
retval
=
-
ENOMEM
;
goto
exit_
disable_msi
;
goto
exit_
release_regions
;
}
pci_set_drvdata
(
pci_dev
,
hw
);
...
...
@@ -152,9 +150,6 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)
exit_free_device:
ieee80211_free_hw
(
hw
);
exit_disable_msi:
pci_disable_msi
(
pci_dev
);
exit_release_regions:
pci_release_regions
(
pci_dev
);
...
...
@@ -179,8 +174,6 @@ void rt2x00pci_remove(struct pci_dev *pci_dev)
rt2x00pci_free_reg
(
rt2x00dev
);
ieee80211_free_hw
(
hw
);
pci_disable_msi
(
pci_dev
);
/*
* Free the PCI device data.
*/
...
...
drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
浏览文件 @
01925efd
...
...
@@ -343,7 +343,8 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,
(
bool
)
GET_RX_DESC_PAGGR
(
pdesc
));
rx_status
->
mactime
=
GET_RX_DESC_TSFL
(
pdesc
);
if
(
phystatus
)
{
p_drvinfo
=
(
struct
rx_fwinfo_92c
*
)(
pdesc
+
RTL_RX_DESC_SIZE
);
p_drvinfo
=
(
struct
rx_fwinfo_92c
*
)(
skb
->
data
+
stats
->
rx_bufshift
);
rtl92c_translate_rx_signal_stuff
(
hw
,
skb
,
stats
,
pdesc
,
p_drvinfo
);
}
...
...
drivers/net/wireless/rtlwifi/wifi.h
浏览文件 @
01925efd
...
...
@@ -2055,7 +2055,7 @@ struct rtl_priv {
that it points to the data allocated
beyond this structure like:
rtl_pci_priv or rtl_usb_priv */
u8
priv
[
0
];
u8
priv
[
0
]
__aligned
(
sizeof
(
void
*
))
;
};
#define rtl_priv(hw) (((struct rtl_priv *)(hw)->priv))
...
...
include/linux/bcma/bcma_driver_pci.h
浏览文件 @
01925efd
...
...
@@ -242,6 +242,7 @@ extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
struct
bcma_device
*
core
,
bool
enable
);
extern
void
bcma_core_pci_up
(
struct
bcma_bus
*
bus
);
extern
void
bcma_core_pci_down
(
struct
bcma_bus
*
bus
);
extern
void
bcma_core_pci_power_save
(
struct
bcma_bus
*
bus
,
bool
up
);
extern
int
bcma_core_pci_pcibios_map_irq
(
const
struct
pci_dev
*
dev
);
extern
int
bcma_core_pci_plat_dev_init
(
struct
pci_dev
*
dev
);
...
...
net/mac80211/cfg.c
浏览文件 @
01925efd
...
...
@@ -3564,7 +3564,7 @@ static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
return
-
EINVAL
;
}
band
=
chanctx_conf
->
def
.
chan
->
band
;
sta
=
sta_info_get
(
sdata
,
peer
);
sta
=
sta_info_get
_bss
(
sdata
,
peer
);
if
(
sta
)
{
qos
=
test_sta_flag
(
sta
,
WLAN_STA_WME
);
}
else
{
...
...
net/mac80211/ieee80211_i.h
浏览文件 @
01925efd
...
...
@@ -334,6 +334,7 @@ enum ieee80211_sta_flags {
IEEE80211_STA_DISABLE_VHT
=
BIT
(
11
),
IEEE80211_STA_DISABLE_80P80MHZ
=
BIT
(
12
),
IEEE80211_STA_DISABLE_160MHZ
=
BIT
(
13
),
IEEE80211_STA_DISABLE_WMM
=
BIT
(
14
),
};
struct
ieee80211_mgd_auth_data
{
...
...
@@ -893,6 +894,8 @@ struct tpt_led_trigger {
* that the scan completed.
* @SCAN_ABORTED: Set for our scan work function when the driver reported
* a scan complete for an aborted scan.
* @SCAN_HW_CANCELLED: Set for our scan work function when the scan is being
* cancelled.
*/
enum
{
SCAN_SW_SCANNING
,
...
...
@@ -900,6 +903,7 @@ enum {
SCAN_ONCHANNEL_SCANNING
,
SCAN_COMPLETED
,
SCAN_ABORTED
,
SCAN_HW_CANCELLED
,
};
/**
...
...
net/mac80211/mlme.c
浏览文件 @
01925efd
...
...
@@ -2527,7 +2527,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
*/
ifmgd
->
wmm_last_param_set
=
-
1
;
if
(
elems
.
wmm_param
)
if
(
!
(
ifmgd
->
flags
&
IEEE80211_STA_DISABLE_WMM
)
&&
elems
.
wmm_param
)
ieee80211_sta_wmm_params
(
local
,
sdata
,
elems
.
wmm_param
,
elems
.
wmm_param_len
);
else
...
...
@@ -2955,7 +2955,8 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
ieee80211_sta_process_chanswitch
(
sdata
,
rx_status
->
mactime
,
&
elems
,
true
);
if
(
ieee80211_sta_wmm_params
(
local
,
sdata
,
elems
.
wmm_param
,
if
(
!
(
ifmgd
->
flags
&
IEEE80211_STA_DISABLE_WMM
)
&&
ieee80211_sta_wmm_params
(
local
,
sdata
,
elems
.
wmm_param
,
elems
.
wmm_param_len
))
changed
|=
BSS_CHANGED_QOS
;
...
...
@@ -3937,6 +3938,44 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
return
err
;
}
static
bool
ieee80211_usable_wmm_params
(
struct
ieee80211_sub_if_data
*
sdata
,
const
u8
*
wmm_param
,
int
len
)
{
const
u8
*
pos
;
size_t
left
;
if
(
len
<
8
)
return
false
;
if
(
wmm_param
[
5
]
!=
1
/* version */
)
return
false
;
pos
=
wmm_param
+
8
;
left
=
len
-
8
;
for
(;
left
>=
4
;
left
-=
4
,
pos
+=
4
)
{
u8
aifsn
=
pos
[
0
]
&
0x0f
;
u8
ecwmin
=
pos
[
1
]
&
0x0f
;
u8
ecwmax
=
(
pos
[
1
]
&
0xf0
)
>>
4
;
int
aci
=
(
pos
[
0
]
>>
5
)
&
0x03
;
if
(
aifsn
<
2
)
{
sdata_info
(
sdata
,
"AP has invalid WMM params (AIFSN=%d for ACI %d), disabling WMM
\n
"
,
aifsn
,
aci
);
return
false
;
}
if
(
ecwmin
>
ecwmax
)
{
sdata_info
(
sdata
,
"AP has invalid WMM params (ECWmin/max=%d/%d for ACI %d), disabling WMM
\n
"
,
ecwmin
,
ecwmax
,
aci
);
return
false
;
}
}
return
true
;
}
int
ieee80211_mgd_assoc
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
cfg80211_assoc_request
*
req
)
{
...
...
@@ -3994,9 +4033,45 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
}
/* prepare assoc data */
ifmgd
->
beacon_crc_valid
=
false
;
assoc_data
->
wmm
=
bss
->
wmm_used
&&
(
local
->
hw
.
queues
>=
IEEE80211_NUM_ACS
);
if
(
assoc_data
->
wmm
)
{
/* try to check validity of WMM params IE */
const
struct
cfg80211_bss_ies
*
ies
;
const
u8
*
wp
,
*
start
,
*
end
;
rcu_read_lock
();
ies
=
rcu_dereference
(
req
->
bss
->
ies
);
start
=
ies
->
data
;
end
=
start
+
ies
->
len
;
while
(
true
)
{
wp
=
cfg80211_find_vendor_ie
(
WLAN_OUI_MICROSOFT
,
WLAN_OUI_TYPE_MICROSOFT_WMM
,
start
,
end
-
start
);
if
(
!
wp
)
break
;
start
=
wp
+
wp
[
1
]
+
2
;
/* if this IE is too short, try the next */
if
(
wp
[
1
]
<=
4
)
continue
;
/* if this IE is WMM params, we found what we wanted */
if
(
wp
[
6
]
==
1
)
break
;
}
if
(
!
wp
||
!
ieee80211_usable_wmm_params
(
sdata
,
wp
+
2
,
wp
[
1
]
-
2
))
{
assoc_data
->
wmm
=
false
;
ifmgd
->
flags
|=
IEEE80211_STA_DISABLE_WMM
;
}
rcu_read_unlock
();
}
/*
* IEEE802.11n does not allow TKIP/WEP as pairwise ciphers in HT mode.
* We still associate in non-HT mode (11a/b/g) if any one of these
...
...
@@ -4026,18 +4101,22 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
/* Also disable HT if we don't support it or the AP doesn't use WMM */
sband
=
local
->
hw
.
wiphy
->
bands
[
req
->
bss
->
channel
->
band
];
if
(
!
sband
->
ht_cap
.
ht_supported
||
local
->
hw
.
queues
<
IEEE80211_NUM_ACS
||
!
bss
->
wmm_used
)
{
local
->
hw
.
queues
<
IEEE80211_NUM_ACS
||
!
bss
->
wmm_used
||
ifmgd
->
flags
&
IEEE80211_STA_DISABLE_WMM
)
{
ifmgd
->
flags
|=
IEEE80211_STA_DISABLE_HT
;
if
(
!
bss
->
wmm_used
)
if
(
!
bss
->
wmm_used
&&
!
(
ifmgd
->
flags
&
IEEE80211_STA_DISABLE_WMM
))
netdev_info
(
sdata
->
dev
,
"disabling HT as WMM/QoS is not supported by the AP
\n
"
);
}
/* disable VHT if we don't support it or the AP doesn't use WMM */
if
(
!
sband
->
vht_cap
.
vht_supported
||
local
->
hw
.
queues
<
IEEE80211_NUM_ACS
||
!
bss
->
wmm_used
)
{
local
->
hw
.
queues
<
IEEE80211_NUM_ACS
||
!
bss
->
wmm_used
||
ifmgd
->
flags
&
IEEE80211_STA_DISABLE_WMM
)
{
ifmgd
->
flags
|=
IEEE80211_STA_DISABLE_VHT
;
if
(
!
bss
->
wmm_used
)
if
(
!
bss
->
wmm_used
&&
!
(
ifmgd
->
flags
&
IEEE80211_STA_DISABLE_WMM
))
netdev_info
(
sdata
->
dev
,
"disabling VHT as WMM/QoS is not supported by the AP
\n
"
);
}
...
...
@@ -4066,8 +4145,6 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
sdata
->
smps_mode
=
ifmgd
->
req_smps
;
assoc_data
->
capability
=
req
->
bss
->
capability
;
assoc_data
->
wmm
=
bss
->
wmm_used
&&
(
local
->
hw
.
queues
>=
IEEE80211_NUM_ACS
);
assoc_data
->
supp_rates
=
bss
->
supp_rates
;
assoc_data
->
supp_rates_len
=
bss
->
supp_rates_len
;
...
...
net/mac80211/offchannel.c
浏览文件 @
01925efd
...
...
@@ -394,6 +394,8 @@ void ieee80211_sw_roc_work(struct work_struct *work)
if
(
started
)
ieee80211_start_next_roc
(
local
);
else
if
(
list_empty
(
&
local
->
roc_list
))
ieee80211_run_deferred_scan
(
local
);
}
out_unlock:
...
...
net/mac80211/rate.c
浏览文件 @
01925efd
...
...
@@ -235,7 +235,8 @@ static void rc_send_low_basicrate(s8 *idx, u32 basic_rates,
static
void
__rate_control_send_low
(
struct
ieee80211_hw
*
hw
,
struct
ieee80211_supported_band
*
sband
,
struct
ieee80211_sta
*
sta
,
struct
ieee80211_tx_info
*
info
)
struct
ieee80211_tx_info
*
info
,
u32
rate_mask
)
{
int
i
;
u32
rate_flags
=
...
...
@@ -247,6 +248,12 @@ static void __rate_control_send_low(struct ieee80211_hw *hw,
info
->
control
.
rates
[
0
].
idx
=
0
;
for
(
i
=
0
;
i
<
sband
->
n_bitrates
;
i
++
)
{
if
(
!
(
rate_mask
&
BIT
(
i
)))
continue
;
if
((
rate_flags
&
sband
->
bitrates
[
i
].
flags
)
!=
rate_flags
)
continue
;
if
(
!
rate_supported
(
sta
,
sband
->
band
,
i
))
continue
;
...
...
@@ -274,7 +281,8 @@ bool rate_control_send_low(struct ieee80211_sta *pubsta,
bool
use_basicrate
=
false
;
if
(
!
pubsta
||
!
priv_sta
||
rc_no_data_or_no_ack_use_min
(
txrc
))
{
__rate_control_send_low
(
txrc
->
hw
,
sband
,
pubsta
,
info
);
__rate_control_send_low
(
txrc
->
hw
,
sband
,
pubsta
,
info
,
txrc
->
rate_idx_mask
);
if
(
!
pubsta
&&
txrc
->
bss
)
{
mcast_rate
=
txrc
->
bss_conf
->
mcast_rate
[
sband
->
band
];
...
...
@@ -656,7 +664,8 @@ void ieee80211_get_tx_rates(struct ieee80211_vif *vif,
rate_control_apply_mask
(
sdata
,
sta
,
sband
,
info
,
dest
,
max_rates
);
if
(
dest
[
0
].
idx
<
0
)
__rate_control_send_low
(
&
sdata
->
local
->
hw
,
sband
,
sta
,
info
);
__rate_control_send_low
(
&
sdata
->
local
->
hw
,
sband
,
sta
,
info
,
sdata
->
rc_rateidx_mask
[
info
->
band
]);
if
(
sta
)
rate_fixup_ratelist
(
vif
,
sband
,
info
,
dest
,
max_rates
);
...
...
net/mac80211/rx.c
浏览文件 @
01925efd
...
...
@@ -3073,6 +3073,9 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
case
NL80211_IFTYPE_ADHOC
:
if
(
!
bssid
)
return
0
;
if
(
ether_addr_equal
(
sdata
->
vif
.
addr
,
hdr
->
addr2
)
||
ether_addr_equal
(
sdata
->
u
.
ibss
.
bssid
,
hdr
->
addr2
))
return
0
;
if
(
ieee80211_is_beacon
(
hdr
->
frame_control
))
{
return
1
;
}
else
if
(
!
ieee80211_bssid_match
(
bssid
,
sdata
->
u
.
ibss
.
bssid
))
{
...
...
net/mac80211/scan.c
浏览文件 @
01925efd
...
...
@@ -238,6 +238,9 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_local *local)
enum
ieee80211_band
band
;
int
i
,
ielen
,
n_chans
;
if
(
test_bit
(
SCAN_HW_CANCELLED
,
&
local
->
scanning
))
return
false
;
do
{
if
(
local
->
hw_scan_band
==
IEEE80211_NUM_BANDS
)
return
false
;
...
...
@@ -939,7 +942,23 @@ void ieee80211_scan_cancel(struct ieee80211_local *local)
if
(
!
local
->
scan_req
)
goto
out
;
/*
* We have a scan running and the driver already reported completion,
* but the worker hasn't run yet or is stuck on the mutex - mark it as
* cancelled.
*/
if
(
test_bit
(
SCAN_HW_SCANNING
,
&
local
->
scanning
)
&&
test_bit
(
SCAN_COMPLETED
,
&
local
->
scanning
))
{
set_bit
(
SCAN_HW_CANCELLED
,
&
local
->
scanning
);
goto
out
;
}
if
(
test_bit
(
SCAN_HW_SCANNING
,
&
local
->
scanning
))
{
/*
* Make sure that __ieee80211_scan_completed doesn't trigger a
* scan on another band.
*/
set_bit
(
SCAN_HW_CANCELLED
,
&
local
->
scanning
);
if
(
local
->
ops
->
cancel_hw_scan
)
drv_cancel_hw_scan
(
local
,
rcu_dereference_protected
(
local
->
scan_sdata
,
...
...
net/mac80211/status.c
浏览文件 @
01925efd
...
...
@@ -180,6 +180,9 @@ static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb)
struct
ieee80211_local
*
local
=
sta
->
local
;
struct
ieee80211_sub_if_data
*
sdata
=
sta
->
sdata
;
if
(
local
->
hw
.
flags
&
IEEE80211_HW_REPORTS_TX_ACK_STATUS
)
sta
->
last_rx
=
jiffies
;
if
(
ieee80211_is_data_qos
(
mgmt
->
frame_control
))
{
struct
ieee80211_hdr
*
hdr
=
(
void
*
)
skb
->
data
;
u8
*
qc
=
ieee80211_get_qos_ctl
(
hdr
);
...
...
net/mac80211/tx.c
浏览文件 @
01925efd
...
...
@@ -1120,7 +1120,8 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata,
tx
->
sta
=
rcu_dereference
(
sdata
->
u
.
vlan
.
sta
);
if
(
!
tx
->
sta
&&
sdata
->
dev
->
ieee80211_ptr
->
use_4addr
)
return
TX_DROP
;
}
else
if
(
info
->
flags
&
IEEE80211_TX_CTL_INJECTED
||
}
else
if
(
info
->
flags
&
(
IEEE80211_TX_CTL_INJECTED
|
IEEE80211_TX_INTFL_NL80211_FRAME_TX
)
||
tx
->
sdata
->
control_port_protocol
==
tx
->
skb
->
protocol
)
{
tx
->
sta
=
sta_info_get_bss
(
sdata
,
hdr
->
addr1
);
}
...
...
net/mac80211/util.c
浏览文件 @
01925efd
...
...
@@ -2101,7 +2101,7 @@ int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
{
struct
ieee80211_local
*
local
=
sdata
->
local
;
struct
ieee80211_supported_band
*
sband
;
int
rate
,
s
kip
,
s
hift
;
int
rate
,
shift
;
u8
i
,
exrates
,
*
pos
;
u32
basic_rates
=
sdata
->
vif
.
bss_conf
.
basic_rates
;
u32
rate_flags
;
...
...
@@ -2129,14 +2129,11 @@ int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
pos
=
skb_put
(
skb
,
exrates
+
2
);
*
pos
++
=
WLAN_EID_EXT_SUPP_RATES
;
*
pos
++
=
exrates
;
skip
=
0
;
for
(
i
=
8
;
i
<
sband
->
n_bitrates
;
i
++
)
{
u8
basic
=
0
;
if
((
rate_flags
&
sband
->
bitrates
[
i
].
flags
)
!=
rate_flags
)
continue
;
if
(
skip
++
<
8
)
continue
;
if
(
need_basic
&&
basic_rates
&
BIT
(
i
))
basic
=
0x80
;
rate
=
DIV_ROUND_UP
(
sband
->
bitrates
[
i
].
bitrate
,
...
...
@@ -2239,6 +2236,10 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
}
rate
=
cfg80211_calculate_bitrate
(
&
ri
);
if
(
WARN_ONCE
(
!
rate
,
"Invalid bitrate: flags=0x%x, idx=%d, vht_nss=%d
\n
"
,
status
->
flag
,
status
->
rate_idx
,
status
->
vht_nss
))
return
0
;
/* rewind from end of MPDU */
if
(
status
->
flag
&
RX_FLAG_MACTIME_END
)
...
...
net/wireless/core.c
浏览文件 @
01925efd
...
...
@@ -566,18 +566,13 @@ int wiphy_register(struct wiphy *wiphy)
/* check and set up bitrates */
ieee80211_set_bitrate_flags
(
wiphy
);
rtnl_lock
();
res
=
device_add
(
&
rdev
->
wiphy
.
dev
);
if
(
res
)
return
res
;
res
=
rfkill_register
(
rdev
->
rfkill
);
if
(
res
)
{
device_del
(
&
rdev
->
wiphy
.
dev
);
rtnl_unlock
(
);
return
res
;
}
rtnl_lock
();
/* set up regulatory info */
wiphy_regulatory_register
(
wiphy
);
...
...
@@ -606,6 +601,15 @@ int wiphy_register(struct wiphy *wiphy)
rdev
->
wiphy
.
registered
=
true
;
rtnl_unlock
();
res
=
rfkill_register
(
rdev
->
rfkill
);
if
(
res
)
{
rfkill_destroy
(
rdev
->
rfkill
);
rdev
->
rfkill
=
NULL
;
wiphy_unregister
(
&
rdev
->
wiphy
);
return
res
;
}
return
0
;
}
EXPORT_SYMBOL
(
wiphy_register
);
...
...
@@ -640,7 +644,8 @@ void wiphy_unregister(struct wiphy *wiphy)
rtnl_unlock
();
__count
==
0
;
}));
rfkill_unregister
(
rdev
->
rfkill
);
if
(
rdev
->
rfkill
)
rfkill_unregister
(
rdev
->
rfkill
);
rtnl_lock
();
rdev
->
wiphy
.
registered
=
false
;
...
...
@@ -953,8 +958,6 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
case
NETDEV_PRE_UP
:
if
(
!
(
wdev
->
wiphy
->
interface_modes
&
BIT
(
wdev
->
iftype
)))
return
notifier_from_errno
(
-
EOPNOTSUPP
);
if
(
rfkill_blocked
(
rdev
->
rfkill
))
return
notifier_from_errno
(
-
ERFKILL
);
ret
=
cfg80211_can_add_interface
(
rdev
,
wdev
->
iftype
);
if
(
ret
)
return
notifier_from_errno
(
ret
);
...
...
net/wireless/core.h
浏览文件 @
01925efd
...
...
@@ -402,6 +402,9 @@ static inline int
cfg80211_can_add_interface
(
struct
cfg80211_registered_device
*
rdev
,
enum
nl80211_iftype
iftype
)
{
if
(
rfkill_blocked
(
rdev
->
rfkill
))
return
-
ERFKILL
;
return
cfg80211_can_change_interface
(
rdev
,
NULL
,
iftype
);
}
...
...
net/wireless/ibss.c
浏览文件 @
01925efd
...
...
@@ -263,6 +263,8 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
if
(
chan
->
flags
&
IEEE80211_CHAN_DISABLED
)
continue
;
wdev
->
wext
.
ibss
.
chandef
.
chan
=
chan
;
wdev
->
wext
.
ibss
.
chandef
.
center_freq1
=
chan
->
center_freq
;
break
;
}
...
...
@@ -347,6 +349,7 @@ int cfg80211_ibss_wext_siwfreq(struct net_device *dev,
if
(
chan
)
{
wdev
->
wext
.
ibss
.
chandef
.
chan
=
chan
;
wdev
->
wext
.
ibss
.
chandef
.
width
=
NL80211_CHAN_WIDTH_20_NOHT
;
wdev
->
wext
.
ibss
.
chandef
.
center_freq1
=
freq
;
wdev
->
wext
.
ibss
.
channel_fixed
=
true
;
}
else
{
/* cfg80211_ibss_wext_join will pick one if needed */
...
...
net/wireless/nl80211.c
浏览文件 @
01925efd
...
...
@@ -2421,7 +2421,7 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
change
=
true
;
}
if
(
flags
&&
(
*
flags
&
NL80211_MNT
R_FLAG_ACTIVE
)
&&
if
(
flags
&&
(
*
flags
&
MONITO
R_FLAG_ACTIVE
)
&&
!
(
rdev
->
wiphy
.
features
&
NL80211_FEATURE_ACTIVE_MONITOR
))
return
-
EOPNOTSUPP
;
...
...
@@ -2483,7 +2483,7 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
info
->
attrs
[
NL80211_ATTR_MNTR_FLAGS
]
:
NULL
,
&
flags
);
if
(
!
err
&&
(
flags
&
NL80211_MNT
R_FLAG_ACTIVE
)
&&
if
(
!
err
&&
(
flags
&
MONITO
R_FLAG_ACTIVE
)
&&
!
(
rdev
->
wiphy
.
features
&
NL80211_FEATURE_ACTIVE_MONITOR
))
return
-
EOPNOTSUPP
;
...
...
net/wireless/radiotap.c
浏览文件 @
01925efd
...
...
@@ -97,6 +97,10 @@ int ieee80211_radiotap_iterator_init(
struct
ieee80211_radiotap_header
*
radiotap_header
,
int
max_length
,
const
struct
ieee80211_radiotap_vendor_namespaces
*
vns
)
{
/* check the radiotap header can actually be present */
if
(
max_length
<
sizeof
(
struct
ieee80211_radiotap_header
))
return
-
EINVAL
;
/* Linux only supports version 0 radiotap format */
if
(
radiotap_header
->
it_version
)
return
-
EINVAL
;
...
...
@@ -131,7 +135,8 @@ int ieee80211_radiotap_iterator_init(
*/
if
((
unsigned
long
)
iterator
->
_arg
-
(
unsigned
long
)
iterator
->
_rtheader
>
(
unsigned
long
)
iterator
->
_rtheader
+
sizeof
(
uint32_t
)
>
(
unsigned
long
)
iterator
->
_max_length
)
return
-
EINVAL
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录