Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Linux-御风守护者
linux
提交
d9a577c3
L
linux
项目概览
Linux-御风守护者
/
linux
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d9a577c3
编写于
12月 11, 2013
作者:
J
John W. Linville
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-john' of
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next
上级
d6b5075d
9d10849e
变更
30
展开全部
隐藏空白更改
内联
并排
Showing
30 changed file
with
1538 addition
and
1592 deletion
+1538
-1592
drivers/net/wireless/iwlwifi/dvm/rs.h
drivers/net/wireless/iwlwifi/dvm/rs.h
+0
-7
drivers/net/wireless/iwlwifi/dvm/tx.c
drivers/net/wireless/iwlwifi/dvm/tx.c
+1
-0
drivers/net/wireless/iwlwifi/iwl-config.h
drivers/net/wireless/iwlwifi/iwl-config.h
+6
-0
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
+2
-1
drivers/net/wireless/iwlwifi/iwl-prph.h
drivers/net/wireless/iwlwifi/iwl-prph.h
+3
-0
drivers/net/wireless/iwlwifi/mvm/Makefile
drivers/net/wireless/iwlwifi/mvm/Makefile
+1
-0
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
+7
-6
drivers/net/wireless/iwlwifi/mvm/d3.c
drivers/net/wireless/iwlwifi/mvm/d3.c
+27
-11
drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
+190
-0
drivers/net/wireless/iwlwifi/mvm/debugfs.c
drivers/net/wireless/iwlwifi/mvm/debugfs.c
+47
-589
drivers/net/wireless/iwlwifi/mvm/debugfs.h
drivers/net/wireless/iwlwifi/mvm/debugfs.h
+101
-0
drivers/net/wireless/iwlwifi/mvm/fw-api-bt-coex.h
drivers/net/wireless/iwlwifi/mvm/fw-api-bt-coex.h
+1
-0
drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h
drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h
+25
-2
drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
+2
-3
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
+42
-9
drivers/net/wireless/iwlwifi/mvm/mac80211.c
drivers/net/wireless/iwlwifi/mvm/mac80211.c
+16
-3
drivers/net/wireless/iwlwifi/mvm/mvm.h
drivers/net/wireless/iwlwifi/mvm/mvm.h
+8
-3
drivers/net/wireless/iwlwifi/mvm/nvm.c
drivers/net/wireless/iwlwifi/mvm/nvm.c
+23
-0
drivers/net/wireless/iwlwifi/mvm/quota.c
drivers/net/wireless/iwlwifi/mvm/quota.c
+1
-2
drivers/net/wireless/iwlwifi/mvm/rs.c
drivers/net/wireless/iwlwifi/mvm/rs.c
+874
-807
drivers/net/wireless/iwlwifi/mvm/rs.h
drivers/net/wireless/iwlwifi/mvm/rs.h
+70
-80
drivers/net/wireless/iwlwifi/mvm/scan.c
drivers/net/wireless/iwlwifi/mvm/scan.c
+40
-15
drivers/net/wireless/iwlwifi/mvm/sta.c
drivers/net/wireless/iwlwifi/mvm/sta.c
+7
-7
drivers/net/wireless/iwlwifi/mvm/sta.h
drivers/net/wireless/iwlwifi/mvm/sta.h
+6
-0
drivers/net/wireless/iwlwifi/mvm/tt.c
drivers/net/wireless/iwlwifi/mvm/tt.c
+1
-1
drivers/net/wireless/iwlwifi/mvm/tx.c
drivers/net/wireless/iwlwifi/mvm/tx.c
+6
-5
drivers/net/wireless/iwlwifi/mvm/utils.c
drivers/net/wireless/iwlwifi/mvm/utils.c
+2
-6
drivers/net/wireless/iwlwifi/pcie/drv.c
drivers/net/wireless/iwlwifi/pcie/drv.c
+5
-0
drivers/net/wireless/iwlwifi/pcie/rx.c
drivers/net/wireless/iwlwifi/pcie/rx.c
+11
-15
drivers/net/wireless/iwlwifi/pcie/tx.c
drivers/net/wireless/iwlwifi/pcie/tx.c
+13
-20
未找到文件。
drivers/net/wireless/iwlwifi/dvm/rs.h
浏览文件 @
d9a577c3
...
...
@@ -389,13 +389,6 @@ struct iwl_lq_sta {
u8
last_bt_traffic
;
};
static
inline
u8
num_of_ant
(
u8
mask
)
{
return
!!
((
mask
)
&
ANT_A
)
+
!!
((
mask
)
&
ANT_B
)
+
!!
((
mask
)
&
ANT_C
);
}
static
inline
u8
first_antenna
(
u8
mask
)
{
if
(
mask
&
ANT_A
)
...
...
drivers/net/wireless/iwlwifi/dvm/tx.c
浏览文件 @
d9a577c3
...
...
@@ -368,6 +368,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
goto
drop_unlock_priv
;
memset
(
dev_cmd
,
0
,
sizeof
(
*
dev_cmd
));
dev_cmd
->
hdr
.
cmd
=
REPLY_TX
;
tx_cmd
=
(
struct
iwl_tx_cmd
*
)
dev_cmd
->
payload
;
/* Total # bytes to be transmitted */
...
...
drivers/net/wireless/iwlwifi/iwl-config.h
浏览文件 @
d9a577c3
...
...
@@ -129,6 +129,12 @@ enum iwl_led_mode {
#define ANT_BC (ANT_B | ANT_C)
#define ANT_ABC (ANT_A | ANT_B | ANT_C)
static
inline
u8
num_of_ant
(
u8
mask
)
{
return
!!
((
mask
)
&
ANT_A
)
+
!!
((
mask
)
&
ANT_B
)
+
!!
((
mask
)
&
ANT_C
);
}
/*
* @max_ll_items: max number of OTP blocks
...
...
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
浏览文件 @
d9a577c3
...
...
@@ -283,7 +283,8 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
IEEE80211_VHT_MCS_NOT_SUPPORTED
<<
12
|
IEEE80211_VHT_MCS_NOT_SUPPORTED
<<
14
);
if
(
data
->
valid_rx_ant
==
1
||
cfg
->
rx_with_siso_diversity
)
{
if
(
num_of_ant
(
data
->
valid_rx_ant
)
==
1
||
cfg
->
rx_with_siso_diversity
)
{
vht_cap
->
cap
|=
IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN
|
IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN
;
/* this works because NOT_SUPPORTED == 3 */
...
...
drivers/net/wireless/iwlwifi/iwl-prph.h
浏览文件 @
d9a577c3
...
...
@@ -102,6 +102,9 @@
/* Device system time */
#define DEVICE_SYSTEM_TIME_REG 0xA0206C
/* Device NMI register */
#define DEVICE_SET_NMI_REG 0x00a01c30
/*****************************************************************************
* 7000/3000 series SHR DTS addresses *
*****************************************************************************/
...
...
drivers/net/wireless/iwlwifi/mvm/Makefile
浏览文件 @
d9a577c3
...
...
@@ -5,6 +5,7 @@ iwlmvm-y += scan.o time-event.o rs.o
iwlmvm-y
+=
power.o power_legacy.o bt-coex.o
iwlmvm-y
+=
led.o tt.o
iwlmvm-$(CONFIG_IWLWIFI_DEBUGFS)
+=
debugfs.o
iwlmvm-$(CONFIG_IWLWIFI_DEBUGFS)
+=
debugfs.o debugfs-vif.o
iwlmvm-$(CONFIG_PM_SLEEP)
+=
d3.o
ccflags-y
+=
-D__CHECK_ENDIAN__
-I
$(src)
/../
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
浏览文件 @
d9a577c3
...
...
@@ -396,7 +396,8 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
BT_VALID_ANT_ISOLATION
|
BT_VALID_ANT_ISOLATION_THRS
|
BT_VALID_TXTX_DELTA_FREQ_THRS
|
BT_VALID_TXRX_MAX_FREQ_0
);
BT_VALID_TXRX_MAX_FREQ_0
|
BT_VALID_SYNC_TO_SCO
);
if
(
mvm
->
cfg
->
bt_shared_single_ant
)
memcpy
(
&
bt_cmd
->
decision_lut
,
iwl_single_shared_ant
,
...
...
@@ -514,7 +515,7 @@ static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id,
if
(
IS_ERR_OR_NULL
(
sta
))
return
0
;
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
/* nothing to do */
if
(
mvmsta
->
bt_reduced_txpower
==
enable
)
...
...
@@ -846,7 +847,7 @@ static void iwl_mvm_bt_rssi_iterator(void *_data, u8 *mac,
if
(
IS_ERR_OR_NULL
(
sta
))
return
;
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
data
->
num_bss_ifaces
++
;
...
...
@@ -917,11 +918,11 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
u16
iwl_mvm_bt_coex_agg_time_limit
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_sta
*
sta
)
{
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
enum
iwl_bt_coex_lut_type
lut_type
;
if
(
le32_to_cpu
(
mvm
->
last_bt_notif
.
bt_activity_grading
)
<
BT_
LOW
_TRAFFIC
)
BT_
HIGH
_TRAFFIC
)
return
LINK_QUAL_AGG_TIME_LIMIT_DEF
;
lut_type
=
iwl_get_coex_type
(
mvm
,
mvmsta
->
vif
);
...
...
@@ -936,7 +937,7 @@ u16 iwl_mvm_bt_coex_agg_time_limit(struct iwl_mvm *mvm,
bool
iwl_mvm_bt_coex_is_mimo_allowed
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_sta
*
sta
)
{
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
if
(
le32_to_cpu
(
mvm
->
last_bt_notif
.
bt_activity_grading
)
<
BT_HIGH_TRAFFIC
)
...
...
drivers/net/wireless/iwlwifi/mvm/d3.c
浏览文件 @
d9a577c3
...
...
@@ -1216,10 +1216,6 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
if
(
len
>=
sizeof
(
u32
)
*
2
)
{
mvm
->
d3_test_pme_ptr
=
le32_to_cpup
((
__le32
*
)
d3_cfg_cmd
.
resp_pkt
->
data
);
}
else
if
(
test
)
{
/* in test mode we require the pointer */
ret
=
-
EIO
;
goto
out
;
}
#endif
iwl_free_resp
(
&
d3_cfg_cmd
);
...
...
@@ -1231,10 +1227,11 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
mvm
->
aux_sta
.
sta_id
=
old_aux_sta_id
;
mvm_ap_sta
->
sta_id
=
old_ap_sta_id
;
mvmvif
->
ap_sta_id
=
old_ap_sta_id
;
out_noreset:
kfree
(
key_data
.
rsc_tsc
);
if
(
ret
<
0
)
ieee80211_restart_hw
(
mvm
->
hw
);
out_noreset:
kfree
(
key_data
.
rsc_tsc
);
mutex_unlock
(
&
mvm
->
mutex
);
...
...
@@ -1537,10 +1534,16 @@ static bool iwl_mvm_setup_connection_keep(struct iwl_mvm *mvm,
struct
iwl_mvm_d3_gtk_iter_data
gtkdata
=
{
.
status
=
status
,
};
u32
disconnection_reasons
=
IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_MISSED_BEACON
|
IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_DEAUTH
;
if
(
!
status
||
!
vif
->
bss_conf
.
bssid
)
return
false
;
if
(
le32_to_cpu
(
status
->
wakeup_reasons
)
&
disconnection_reasons
)
return
false
;
/* find last GTK that we used initially, if any */
gtkdata
.
find_phase
=
true
;
ieee80211_iter_keys
(
mvm
->
hw
,
vif
,
...
...
@@ -1805,6 +1808,10 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
iwl_mvm_read_d3_sram
(
mvm
);
keep
=
iwl_mvm_query_wakeup_reasons
(
mvm
,
vif
);
#ifdef CONFIG_IWLWIFI_DEBUGFS
if
(
keep
)
mvm
->
keep_vif
=
vif
;
#endif
/* has unlocked the mutex, so skip that */
goto
out
;
...
...
@@ -1861,6 +1868,7 @@ static int iwl_mvm_d3_test_open(struct inode *inode, struct file *file)
return
err
;
}
mvm
->
d3_test_active
=
true
;
mvm
->
keep_vif
=
NULL
;
return
0
;
}
...
...
@@ -1871,10 +1879,14 @@ static ssize_t iwl_mvm_d3_test_read(struct file *file, char __user *user_buf,
u32
pme_asserted
;
while
(
true
)
{
pme_asserted
=
iwl_trans_read_mem32
(
mvm
->
trans
,
mvm
->
d3_test_pme_ptr
);
if
(
pme_asserted
)
break
;
/* read pme_ptr if available */
if
(
mvm
->
d3_test_pme_ptr
)
{
pme_asserted
=
iwl_trans_read_mem32
(
mvm
->
trans
,
mvm
->
d3_test_pme_ptr
);
if
(
pme_asserted
)
break
;
}
if
(
msleep_interruptible
(
100
))
break
;
}
...
...
@@ -1885,6 +1897,10 @@ static ssize_t iwl_mvm_d3_test_read(struct file *file, char __user *user_buf,
static
void
iwl_mvm_d3_test_disconn_work_iter
(
void
*
_data
,
u8
*
mac
,
struct
ieee80211_vif
*
vif
)
{
/* skip the one we keep connection on */
if
(
_data
==
vif
)
return
;
if
(
vif
->
type
==
NL80211_IFTYPE_STATION
)
ieee80211_connection_loss
(
vif
);
}
...
...
@@ -1911,7 +1927,7 @@ static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file)
ieee80211_iterate_active_interfaces_atomic
(
mvm
->
hw
,
IEEE80211_IFACE_ITER_NORMAL
,
iwl_mvm_d3_test_disconn_work_iter
,
NULL
);
iwl_mvm_d3_test_disconn_work_iter
,
mvm
->
keep_vif
);
ieee80211_wake_queues
(
mvm
->
hw
);
...
...
drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
0 → 100644
浏览文件 @
d9a577c3
/******************************************************************************
*
* This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license.
*
* GPL LICENSE SUMMARY
*
* Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
* USA
*
* The full GNU General Public License is included in this distribution
* in the file called COPYING.
*
* Contact Information:
* Intel Linux Wireless <ilw@linux.intel.com>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
*
* Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
#include "mvm.h"
#include "debugfs.h"
static
ssize_t
iwl_dbgfs_mac_params_read
(
struct
file
*
file
,
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
struct
ieee80211_vif
*
vif
=
file
->
private_data
;
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
struct
iwl_mvm
*
mvm
=
mvmvif
->
mvm
;
u8
ap_sta_id
;
struct
ieee80211_chanctx_conf
*
chanctx_conf
;
char
buf
[
512
];
int
bufsz
=
sizeof
(
buf
);
int
pos
=
0
;
int
i
;
mutex_lock
(
&
mvm
->
mutex
);
ap_sta_id
=
mvmvif
->
ap_sta_id
;
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"mac id/color: %d / %d
\n
"
,
mvmvif
->
id
,
mvmvif
->
color
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bssid: %pM
\n
"
,
vif
->
bss_conf
.
bssid
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"QoS:
\n
"
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
mvmvif
->
queue_params
);
i
++
)
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"
\t
%d: txop:%d - cw_min:%d - cw_max = %d - aifs = %d upasd = %d
\n
"
,
i
,
mvmvif
->
queue_params
[
i
].
txop
,
mvmvif
->
queue_params
[
i
].
cw_min
,
mvmvif
->
queue_params
[
i
].
cw_max
,
mvmvif
->
queue_params
[
i
].
aifs
,
mvmvif
->
queue_params
[
i
].
uapsd
);
if
(
vif
->
type
==
NL80211_IFTYPE_STATION
&&
ap_sta_id
!=
IWL_MVM_STATION_COUNT
)
{
struct
ieee80211_sta
*
sta
;
struct
iwl_mvm_sta
*
mvm_sta
;
sta
=
rcu_dereference_protected
(
mvm
->
fw_id_to_mac_id
[
ap_sta_id
],
lockdep_is_held
(
&
mvm
->
mutex
));
mvm_sta
=
(
void
*
)
sta
->
drv_priv
;
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"ap_sta_id %d - reduced Tx power %d
\n
"
,
ap_sta_id
,
mvm_sta
->
bt_reduced_txpower
);
}
rcu_read_lock
();
chanctx_conf
=
rcu_dereference
(
vif
->
chanctx_conf
);
if
(
chanctx_conf
)
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"idle rx chains %d, active rx chains: %d
\n
"
,
chanctx_conf
->
rx_chains_static
,
chanctx_conf
->
rx_chains_dynamic
);
rcu_read_unlock
();
mutex_unlock
(
&
mvm
->
mutex
);
return
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
pos
);
}
#define MVM_DEBUGFS_ADD_FILE_VIF(name, parent, mode) do { \
if (!debugfs_create_file(#name, mode, parent, vif, \
&iwl_dbgfs_##name##_ops)) \
goto err; \
} while (0)
MVM_DEBUGFS_READ_FILE_OPS
(
mac_params
);
void
iwl_mvm_vif_dbgfs_register
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
)
{
struct
dentry
*
dbgfs_dir
=
vif
->
debugfs_dir
;
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
char
buf
[
100
];
/*
* Check if debugfs directory already exist before creating it.
* This may happen when, for example, resetting hw or suspend-resume
*/
if
(
!
dbgfs_dir
||
mvmvif
->
dbgfs_dir
)
return
;
mvmvif
->
dbgfs_dir
=
debugfs_create_dir
(
"iwlmvm"
,
dbgfs_dir
);
mvmvif
->
mvm
=
mvm
;
if
(
!
mvmvif
->
dbgfs_dir
)
{
IWL_ERR
(
mvm
,
"Failed to create debugfs directory under %s
\n
"
,
dbgfs_dir
->
d_name
.
name
);
return
;
}
MVM_DEBUGFS_ADD_FILE_VIF
(
mac_params
,
mvmvif
->
dbgfs_dir
,
S_IRUSR
);
/*
* Create symlink for convenience pointing to interface specific
* debugfs entries for the driver. For example, under
* /sys/kernel/debug/iwlwifi/0000\:02\:00.0/iwlmvm/
* find
* netdev:wlan0 -> ../../../ieee80211/phy0/netdev:wlan0/iwlmvm/
*/
snprintf
(
buf
,
100
,
"../../../%s/%s/%s/%s"
,
dbgfs_dir
->
d_parent
->
d_parent
->
d_name
.
name
,
dbgfs_dir
->
d_parent
->
d_name
.
name
,
dbgfs_dir
->
d_name
.
name
,
mvmvif
->
dbgfs_dir
->
d_name
.
name
);
mvmvif
->
dbgfs_slink
=
debugfs_create_symlink
(
dbgfs_dir
->
d_name
.
name
,
mvm
->
debugfs_dir
,
buf
);
if
(
!
mvmvif
->
dbgfs_slink
)
IWL_ERR
(
mvm
,
"Can't create debugfs symbolic link under %s
\n
"
,
dbgfs_dir
->
d_name
.
name
);
return
;
err:
IWL_ERR
(
mvm
,
"Can't create debugfs entity
\n
"
);
}
void
iwl_mvm_vif_dbgfs_clean
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
)
{
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
debugfs_remove
(
mvmvif
->
dbgfs_slink
);
mvmvif
->
dbgfs_slink
=
NULL
;
debugfs_remove_recursive
(
mvmvif
->
dbgfs_dir
);
mvmvif
->
dbgfs_dir
=
NULL
;
}
drivers/net/wireless/iwlwifi/mvm/debugfs.c
浏览文件 @
d9a577c3
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/mvm/debugfs.h
0 → 100644
浏览文件 @
d9a577c3
/******************************************************************************
*
* This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license.
*
* GPL LICENSE SUMMARY
*
* Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
* USA
*
* The full GNU General Public License is included in this distribution
* in the file called COPYING.
*
* Contact Information:
* Intel Linux Wireless <ilw@linux.intel.com>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
*
* Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
#define MVM_DEBUGFS_READ_FILE_OPS(name) \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
.read = iwl_dbgfs_##name##_read, \
.open = simple_open, \
.llseek = generic_file_llseek, \
}
#define MVM_DEBUGFS_WRITE_WRAPPER(name, buflen, argtype) \
static ssize_t _iwl_dbgfs_##name##_write(struct file *file, \
const char __user *user_buf, \
size_t count, loff_t *ppos) \
{ \
argtype *arg = file->private_data; \
char buf[buflen] = {}; \
size_t buf_size = min(count, sizeof(buf) - 1); \
\
if (copy_from_user(buf, user_buf, buf_size)) \
return -EFAULT; \
\
return iwl_dbgfs_##name##_write(arg, buf, buf_size, ppos); \
} \
#define _MVM_DEBUGFS_READ_WRITE_FILE_OPS(name, buflen, argtype) \
MVM_DEBUGFS_WRITE_WRAPPER(name, buflen, argtype) \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
.write = _iwl_dbgfs_##name##_write, \
.read = iwl_dbgfs_##name##_read, \
.open = simple_open, \
.llseek = generic_file_llseek, \
};
#define _MVM_DEBUGFS_WRITE_FILE_OPS(name, buflen, argtype) \
MVM_DEBUGFS_WRITE_WRAPPER(name, buflen, argtype) \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
.write = _iwl_dbgfs_##name##_write, \
.open = simple_open, \
.llseek = generic_file_llseek, \
};
drivers/net/wireless/iwlwifi/mvm/fw-api-bt-coex.h
浏览文件 @
d9a577c3
...
...
@@ -127,6 +127,7 @@ enum iwl_bt_coex_valid_bit_msk {
BT_VALID_ANT_ISOLATION_THRS
=
BIT
(
15
),
BT_VALID_TXTX_DELTA_FREQ_THRS
=
BIT
(
16
),
BT_VALID_TXRX_MAX_FREQ_0
=
BIT
(
17
),
BT_VALID_SYNC_TO_SCO
=
BIT
(
18
),
};
/**
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h
浏览文件 @
d9a577c3
...
...
@@ -281,8 +281,31 @@ enum {
/* # entries in rate scale table to support Tx retries */
#define LQ_MAX_RETRY_NUM 16
/* Link quality command flags, only this one is available */
#define LQ_FLAG_SET_STA_TLC_RTS_MSK BIT(0)
/* Link quality command flags bit fields */
/* Bit 0: (0) Don't use RTS (1) Use RTS */
#define LQ_FLAG_USE_RTS_POS 0
#define LQ_FLAG_USE_RTS_MSK (1 << LQ_FLAG_USE_RTS_POS)
/* Bit 1-3: LQ command color. Used to match responses to LQ commands */
#define LQ_FLAG_COLOR_POS 1
#define LQ_FLAG_COLOR_MSK (7 << LQ_FLAG_COLOR_POS)
/* Bit 4-5: Tx RTS BW Signalling
* (0) No RTS BW signalling
* (1) Static BW signalling
* (2) Dynamic BW signalling
*/
#define LQ_FLAG_RTS_BW_SIG_POS 4
#define LQ_FLAG_RTS_BW_SIG_NONE (0 << LQ_FLAG_RTS_BW_SIG_POS)
#define LQ_FLAG_RTS_BW_SIG_STATIC (1 << LQ_FLAG_RTS_BW_SIG_POS)
#define LQ_FLAG_RTS_BW_SIG_DYNAMIC (2 << LQ_FLAG_RTS_BW_SIG_POS)
/* Bit 6: (0) No dynamic BW selection (1) Allow dynamic BW selection
* Dyanmic BW selection allows Tx with narrower BW then requested in rates
*/
#define LQ_FLAG_DYNAMIC_BW_POS 6
#define LQ_FLAG_DYNAMIC_BW_MSK (1 << LQ_FLAG_DYNAMIC_BW_POS)
/**
* struct iwl_lq_cmd - link quality command
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
浏览文件 @
d9a577c3
...
...
@@ -530,14 +530,13 @@ struct iwl_scan_offload_schedule {
/*
* iwl_scan_offload_flags
*
* IWL_SCAN_OFFLOAD_FLAG_FILTER_SSID: filter mode - upload every beacon or match
* ssid list.
* IWL_SCAN_OFFLOAD_FLAG_PASS_ALL: pass all results - no filtering.
* IWL_SCAN_OFFLOAD_FLAG_CACHED_CHANNEL: add cached channels to partial scan.
* IWL_SCAN_OFFLOAD_FLAG_ENERGY_SCAN: use energy based scan before partial scan
* on A band.
*/
enum
iwl_scan_offload_flags
{
IWL_SCAN_OFFLOAD_FLAG_
FILTER_SSID
=
BIT
(
0
),
IWL_SCAN_OFFLOAD_FLAG_
PASS_ALL
=
BIT
(
0
),
IWL_SCAN_OFFLOAD_FLAG_CACHED_CHANNEL
=
BIT
(
2
),
IWL_SCAN_OFFLOAD_FLAG_ENERGY_SCAN
=
BIT
(
3
),
};
...
...
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
浏览文件 @
d9a577c3
...
...
@@ -488,6 +488,40 @@ static void iwl_mvm_ack_rates(struct iwl_mvm *mvm,
*
ofdm_rates
=
ofdm
;
}
static
void
iwl_mvm_mac_ctxt_set_ht_flags
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
struct
iwl_mac_ctx_cmd
*
cmd
)
{
/* for both sta and ap, ht_operation_mode hold the protection_mode */
u8
protection_mode
=
vif
->
bss_conf
.
ht_operation_mode
&
IEEE80211_HT_OP_MODE_PROTECTION
;
/* The fw does not distinguish between ht and fat */
u32
ht_flag
=
MAC_PROT_FLG_HT_PROT
|
MAC_PROT_FLG_FAT_PROT
;
IWL_DEBUG_RATE
(
mvm
,
"protection mode set to %d
\n
"
,
protection_mode
);
/*
* See section 9.23.3.1 of IEEE 80211-2012.
* Nongreenfield HT STAs Present is not supported.
*/
switch
(
protection_mode
)
{
case
IEEE80211_HT_OP_MODE_PROTECTION_NONE
:
break
;
case
IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER
:
case
IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED
:
cmd
->
protection_flags
|=
cpu_to_le32
(
ht_flag
);
break
;
case
IEEE80211_HT_OP_MODE_PROTECTION_20MHZ
:
/* Protect when channel wider than 20MHz */
if
(
vif
->
bss_conf
.
chandef
.
width
>
NL80211_CHAN_WIDTH_20
)
cmd
->
protection_flags
|=
cpu_to_le32
(
ht_flag
);
break
;
default:
IWL_ERR
(
mvm
,
"Illegal protection mode %d
\n
"
,
protection_mode
);
break
;
}
}
static
void
iwl_mvm_mac_ctxt_cmd_common
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
struct
iwl_mac_ctx_cmd
*
cmd
,
...
...
@@ -495,6 +529,8 @@ static void iwl_mvm_mac_ctxt_cmd_common(struct iwl_mvm *mvm,
{
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
struct
ieee80211_chanctx_conf
*
chanctx
;
bool
ht_enabled
=
!!
(
vif
->
bss_conf
.
ht_operation_mode
&
IEEE80211_HT_OP_MODE_PROTECTION
);
u8
cck_ack_rates
,
ofdm_ack_rates
;
int
i
;
...
...
@@ -573,16 +609,13 @@ static void iwl_mvm_mac_ctxt_cmd_common(struct iwl_mvm *mvm,
cmd
->
protection_flags
|=
cpu_to_le32
(
MAC_PROT_FLG_SELF_CTS_EN
);
}
/*
* I think that we should enable these 2 flags regardless the HT PROT
* fields in the HT IE, but I am not sure. Someone knows whom to ask?...
*/
if
(
vif
->
bss_conf
.
chandef
.
width
!=
NL80211_CHAN_WIDTH_20_NOHT
)
{
IWL_DEBUG_RATE
(
mvm
,
"use_cts_prot %d, ht_operation_mode %d
\n
"
,
vif
->
bss_conf
.
use_cts_prot
,
vif
->
bss_conf
.
ht_operation_mode
);
if
(
vif
->
bss_conf
.
chandef
.
width
!=
NL80211_CHAN_WIDTH_20_NOHT
)
cmd
->
qos_flags
|=
cpu_to_le32
(
MAC_QOS_FLG_TGN
);
cmd
->
protection_flags
|=
cpu_to_le32
(
MAC_PROT_FLG_HT_PROT
|
MAC_PROT_FLG_FAT_PROT
);
}
if
(
ht_enabled
)
iwl_mvm_mac_ctxt_set_ht_flags
(
mvm
,
vif
,
cmd
);
cmd
->
filter_flags
=
cpu_to_le32
(
MAC_FILTER_ACCEPT_GRP
);
}
...
...
drivers/net/wireless/iwlwifi/mvm/mac80211.c
浏览文件 @
d9a577c3
...
...
@@ -256,7 +256,8 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
}
hw
->
wiphy
->
features
|=
NL80211_FEATURE_P2P_GO_CTWIN
|
NL80211_FEATURE_P2P_GO_OPPPS
;
NL80211_FEATURE_P2P_GO_OPPPS
|
NL80211_FEATURE_LOW_PRIORITY_SCAN
;
mvm
->
rts_threshold
=
IEEE80211_MAX_RTS_THRESHOLD
;
...
...
@@ -990,6 +991,17 @@ iwl_mvm_bss_info_changed_ap_ibss(struct iwl_mvm *mvm,
struct
ieee80211_bss_conf
*
bss_conf
,
u32
changes
)
{
enum
ieee80211_bss_change
ht_change
=
BSS_CHANGED_ERP_CTS_PROT
|
BSS_CHANGED_HT
|
BSS_CHANGED_BANDWIDTH
;
int
ret
;
if
(
changes
&
ht_change
)
{
ret
=
iwl_mvm_mac_ctxt_changed
(
mvm
,
vif
);
if
(
ret
)
IWL_ERR
(
mvm
,
"failed to update MAC %pM
\n
"
,
vif
->
addr
);
}
/* Need to send a new beacon template to the FW */
if
(
changes
&
BSS_CHANGED_BEACON
)
{
if
(
iwl_mvm_mac_ctxt_beacon_changed
(
mvm
,
vif
))
...
...
@@ -1080,7 +1092,7 @@ static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw,
struct
ieee80211_sta
*
sta
)
{
struct
iwl_mvm
*
mvm
=
IWL_MAC80211_GET_MVM
(
hw
);
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
switch
(
cmd
)
{
case
STA_NOTIFY_SLEEP
:
...
...
@@ -1149,7 +1161,8 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
ret
=
iwl_mvm_update_sta
(
mvm
,
vif
,
sta
);
if
(
ret
==
0
)
iwl_mvm_rs_rate_init
(
mvm
,
sta
,
mvmvif
->
phy_ctxt
->
channel
->
band
);
mvmvif
->
phy_ctxt
->
channel
->
band
,
true
);
}
else
if
(
old_state
==
IEEE80211_STA_ASSOC
&&
new_state
==
IEEE80211_STA_AUTHORIZED
)
{
/* enable beacon filtering */
...
...
drivers/net/wireless/iwlwifi/mvm/mvm.h
浏览文件 @
d9a577c3
...
...
@@ -323,9 +323,9 @@ struct iwl_mvm_vif {
#endif
#ifdef CONFIG_IWLWIFI_DEBUGFS
struct
iwl_mvm
*
mvm
;
struct
dentry
*
dbgfs_dir
;
struct
dentry
*
dbgfs_slink
;
void
*
dbgfs_data
;
struct
iwl_dbgfs_pm
dbgfs_pm
;
struct
iwl_dbgfs_bf
dbgfs_bf
;
#endif
...
...
@@ -494,6 +494,11 @@ struct iwl_mvm {
u32
dbgfs_sram_offset
,
dbgfs_sram_len
;
bool
disable_power_off
;
bool
disable_power_off_d3
;
struct
debugfs_blob_wrapper
nvm_hw_blob
;
struct
debugfs_blob_wrapper
nvm_sw_blob
;
struct
debugfs_blob_wrapper
nvm_calib_blob
;
struct
debugfs_blob_wrapper
nvm_prod_blob
;
#endif
struct
iwl_mvm_phy_ctxt
phy_ctxts
[
NUM_PHY_CTX
];
...
...
@@ -531,6 +536,7 @@ struct iwl_mvm {
bool
store_d3_resume_sram
;
void
*
d3_resume_sram
;
u32
d3_test_pme_ptr
;
struct
ieee80211_vif
*
keep_vif
;
#endif
#endif
...
...
@@ -750,8 +756,7 @@ iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
#endif
/* CONFIG_IWLWIFI_DEBUGFS */
/* rate scaling */
int
iwl_mvm_send_lq_cmd
(
struct
iwl_mvm
*
mvm
,
struct
iwl_lq_cmd
*
lq
,
u8
flags
,
bool
init
);
int
iwl_mvm_send_lq_cmd
(
struct
iwl_mvm
*
mvm
,
struct
iwl_lq_cmd
*
lq
,
bool
init
);
/* power managment */
static
inline
int
iwl_mvm_power_update_mode
(
struct
iwl_mvm
*
mvm
,
...
...
drivers/net/wireless/iwlwifi/mvm/nvm.c
浏览文件 @
d9a577c3
...
...
@@ -443,6 +443,29 @@ int iwl_nvm_init(struct iwl_mvm *mvm)
}
mvm
->
nvm_sections
[
section
].
data
=
temp
;
mvm
->
nvm_sections
[
section
].
length
=
ret
;
#ifdef CONFIG_IWLWIFI_DEBUGFS
switch
(
section
)
{
case
NVM_SECTION_TYPE_HW
:
mvm
->
nvm_hw_blob
.
data
=
temp
;
mvm
->
nvm_hw_blob
.
size
=
ret
;
break
;
case
NVM_SECTION_TYPE_SW
:
mvm
->
nvm_sw_blob
.
data
=
temp
;
mvm
->
nvm_sw_blob
.
size
=
ret
;
break
;
case
NVM_SECTION_TYPE_CALIBRATION
:
mvm
->
nvm_calib_blob
.
data
=
temp
;
mvm
->
nvm_calib_blob
.
size
=
ret
;
break
;
case
NVM_SECTION_TYPE_PRODUCTION
:
mvm
->
nvm_prod_blob
.
data
=
temp
;
mvm
->
nvm_prod_blob
.
size
=
ret
;
break
;
default:
WARN
(
1
,
"section: %d"
,
section
);
}
#endif
}
kfree
(
nvm_buffer
);
if
(
ret
<
0
)
...
...
drivers/net/wireless/iwlwifi/mvm/quota.c
浏览文件 @
d9a577c3
...
...
@@ -217,8 +217,7 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
}
else
{
cmd
.
quotas
[
idx
].
quota
=
cpu_to_le32
(
quota
*
data
.
n_interfaces
[
i
]);
cmd
.
quotas
[
idx
].
max_duration
=
cpu_to_le32
(
IWL_MVM_MAX_QUOTA
);
cmd
.
quotas
[
idx
].
max_duration
=
cpu_to_le32
(
0
);
}
idx
++
;
}
...
...
drivers/net/wireless/iwlwifi/mvm/rs.c
浏览文件 @
d9a577c3
此差异已折叠。
点击以展开。
drivers/net/wireless/iwlwifi/mvm/rs.h
浏览文件 @
d9a577c3
...
...
@@ -155,38 +155,7 @@ enum {
#define IWL_RATE_SCALE_SWITCH 10880
/* 85% */
#define IWL_RATE_HIGH_TH 10880
/* 85% */
#define IWL_RATE_INCREASE_TH 6400
/* 50% */
#define IWL_RATE_DECREASE_TH 1920
/* 15% */
/* possible actions when in legacy mode */
enum
{
IWL_LEGACY_SWITCH_ANTENNA
,
IWL_LEGACY_SWITCH_SISO
,
IWL_LEGACY_SWITCH_MIMO2
,
IWL_LEGACY_FIRST_ACTION
=
IWL_LEGACY_SWITCH_ANTENNA
,
IWL_LEGACY_LAST_ACTION
=
IWL_LEGACY_SWITCH_MIMO2
,
};
/* possible actions when in siso mode */
enum
{
IWL_SISO_SWITCH_ANTENNA
,
IWL_SISO_SWITCH_MIMO2
,
IWL_SISO_SWITCH_GI
,
IWL_SISO_FIRST_ACTION
=
IWL_SISO_SWITCH_ANTENNA
,
IWL_SISO_LAST_ACTION
=
IWL_SISO_SWITCH_GI
,
};
/* possible actions when in mimo mode */
enum
{
IWL_MIMO2_SWITCH_SISO_A
,
IWL_MIMO2_SWITCH_SISO_B
,
IWL_MIMO2_SWITCH_GI
,
IWL_MIMO2_FIRST_ACTION
=
IWL_MIMO2_SWITCH_SISO_A
,
IWL_MIMO2_LAST_ACTION
=
IWL_MIMO2_SWITCH_GI
,
};
#define IWL_MAX_SEARCH IWL_MIMO2_LAST_ACTION
#define IWL_ACTION_LIMIT 3
/* # possible actions */
#define RS_SR_FORCE_DECREASE 1920
/* 15% */
#define LINK_QUAL_AGG_TIME_LIMIT_DEF (4000)
/* 4 milliseconds */
#define LINK_QUAL_AGG_TIME_LIMIT_MAX (8000)
...
...
@@ -224,22 +193,45 @@ enum iwl_table_type {
LQ_MAX
,
};
#define is_legacy(tbl) (((tbl) == LQ_LEGACY_G) || ((tbl) == LQ_LEGACY_A))
#define is_ht_siso(tbl) ((tbl) == LQ_HT_SISO)
#define is_ht_mimo2(tbl) ((tbl) == LQ_HT_MIMO2)
#define is_vht_siso(tbl) ((tbl) == LQ_VHT_SISO)
#define is_vht_mimo2(tbl) ((tbl) == LQ_VHT_MIMO2)
#define is_siso(tbl) (is_ht_siso(tbl) || is_vht_siso(tbl))
#define is_mimo2(tbl) (is_ht_mimo2(tbl) || is_vht_mimo2(tbl))
#define is_mimo(tbl) (is_mimo2(tbl))
#define is_ht(tbl) (is_ht_siso(tbl) || is_ht_mimo2(tbl))
#define is_vht(tbl) (is_vht_siso(tbl) || is_vht_mimo2(tbl))
#define is_a_band(tbl) ((tbl) == LQ_LEGACY_A)
#define is_g_band(tbl) ((tbl) == LQ_LEGACY_G)
#define is_ht20(tbl) (tbl->bw == RATE_MCS_CHAN_WIDTH_20)
#define is_ht40(tbl) (tbl->bw == RATE_MCS_CHAN_WIDTH_40)
#define is_ht80(tbl) (tbl->bw == RATE_MCS_CHAN_WIDTH_80)
struct
rs_rate
{
int
index
;
enum
iwl_table_type
type
;
u8
ant
;
u32
bw
;
bool
sgi
;
};
#define is_type_legacy(type) (((type) == LQ_LEGACY_G) || \
((type) == LQ_LEGACY_A))
#define is_type_ht_siso(type) ((type) == LQ_HT_SISO)
#define is_type_ht_mimo2(type) ((type) == LQ_HT_MIMO2)
#define is_type_vht_siso(type) ((type) == LQ_VHT_SISO)
#define is_type_vht_mimo2(type) ((type) == LQ_VHT_MIMO2)
#define is_type_siso(type) (is_type_ht_siso(type) || is_type_vht_siso(type))
#define is_type_mimo2(type) (is_type_ht_mimo2(type) || is_type_vht_mimo2(type))
#define is_type_mimo(type) (is_type_mimo2(type))
#define is_type_ht(type) (is_type_ht_siso(type) || is_type_ht_mimo2(type))
#define is_type_vht(type) (is_type_vht_siso(type) || is_type_vht_mimo2(type))
#define is_type_a_band(type) ((type) == LQ_LEGACY_A)
#define is_type_g_band(type) ((type) == LQ_LEGACY_G)
#define is_legacy(rate) is_type_legacy((rate)->type)
#define is_ht_siso(rate) is_type_ht_siso((rate)->type)
#define is_ht_mimo2(rate) is_type_ht_mimo2((rate)->type)
#define is_vht_siso(rate) is_type_vht_siso((rate)->type)
#define is_vht_mimo2(rate) is_type_vht_mimo2((rate)->type)
#define is_siso(rate) is_type_siso((rate)->type)
#define is_mimo2(rate) is_type_mimo2((rate)->type)
#define is_mimo(rate) is_type_mimo((rate)->type)
#define is_ht(rate) is_type_ht((rate)->type)
#define is_vht(rate) is_type_vht((rate)->type)
#define is_a_band(rate) is_type_a_band((rate)->type)
#define is_g_band(rate) is_type_g_band((rate)->type)
#define is_ht20(rate) ((rate)->bw == RATE_MCS_CHAN_WIDTH_20)
#define is_ht40(rate) ((rate)->bw == RATE_MCS_CHAN_WIDTH_40)
#define is_ht80(rate) ((rate)->bw == RATE_MCS_CHAN_WIDTH_80)
#define IWL_MAX_MCS_DISPLAY_SIZE 12
...
...
@@ -257,7 +249,23 @@ struct iwl_rate_scale_data {
s32
success_ratio
;
/* per-cent * 128 */
s32
counter
;
/* number of frames attempted */
s32
average_tpt
;
/* success ratio * expected throughput */
unsigned
long
stamp
;
};
/* Possible Tx columns
* Tx Column = a combo of legacy/siso/mimo x antenna x SGI
*/
enum
rs_column
{
RS_COLUMN_LEGACY_ANT_A
=
0
,
RS_COLUMN_LEGACY_ANT_B
,
RS_COLUMN_SISO_ANT_A
,
RS_COLUMN_SISO_ANT_B
,
RS_COLUMN_SISO_ANT_A_SGI
,
RS_COLUMN_SISO_ANT_B_SGI
,
RS_COLUMN_MIMO2
,
RS_COLUMN_MIMO2_SGI
,
RS_COLUMN_LAST
=
RS_COLUMN_MIMO2_SGI
,
RS_COLUMN_INVALID
,
};
/**
...
...
@@ -267,17 +275,19 @@ struct iwl_rate_scale_data {
* one for "active", and one for "search".
*/
struct
iwl_scale_tbl_info
{
enum
iwl_table_type
lq_type
;
u8
ant_type
;
u8
is_SGI
;
/* 1 = short guard interval */
u32
bw
;
/* channel bandwidth; RATE_MCS_CHAN_WIDTH_XX */
u8
action
;
/* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */
u8
max_search
;
/* maximun number of tables we can search */
struct
rs_rate
rate
;
enum
rs_column
column
;
s32
*
expected_tpt
;
/* throughput metrics; expected_tpt_G, etc. */
u32
current_rate
;
/* rate_n_flags, uCode API format */
struct
iwl_rate_scale_data
win
[
IWL_RATE_COUNT
];
/* rate histories */
};
enum
{
RS_STATE_SEARCH_CYCLE_STARTED
,
RS_STATE_SEARCH_CYCLE_ENDED
,
RS_STATE_STAY_IN_COLUMN
,
};
/**
* struct iwl_lq_sta -- driver's rate scaling private structure
*
...
...
@@ -285,8 +295,7 @@ struct iwl_scale_tbl_info {
*/
struct
iwl_lq_sta
{
u8
active_tbl
;
/* index of active table, range 0-1 */
u8
enable_counter
;
/* indicates HT mode */
u8
stay_in_tbl
;
/* 1: disallow, 0: allow search for new mode */
u8
rs_state
;
/* RS_STATE_* */
u8
search_better_tbl
;
/* 1: currently trying alternate mode */
s32
last_tpt
;
...
...
@@ -299,7 +308,9 @@ struct iwl_lq_sta {
u32
total_success
;
/* total successful frames, any/all rates */
u64
flush_timer
;
/* time staying in mode before new search */
u8
action_counter
;
/* # mode-switch actions tried */
u32
visited_columns
;
/* Bitmask marking which Tx columns were
* explored during a search cycle
*/
bool
is_vht
;
enum
ieee80211_band
band
;
...
...
@@ -328,32 +339,11 @@ struct iwl_lq_sta {
u32
last_rate_n_flags
;
/* packets destined for this STA are aggregated */
u8
is_agg
;
/* BT traffic this sta was last updated in */
u8
last_bt_traffic
;
};
enum
iwl_bt_coex_profile_traffic_load
{
IWL_BT_COEX_TRAFFIC_LOAD_NONE
=
0
,
IWL_BT_COEX_TRAFFIC_LOAD_LOW
=
1
,
IWL_BT_COEX_TRAFFIC_LOAD_HIGH
=
2
,
IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS
=
3
,
/*
* There are no more even though below is a u8, the
* indication from the BT device only has two bits.
*/
};
static
inline
u8
num_of_ant
(
u8
mask
)
{
return
!!
((
mask
)
&
ANT_A
)
+
!!
((
mask
)
&
ANT_B
)
+
!!
((
mask
)
&
ANT_C
);
}
/* Initialize station's rate scaling information after adding station */
void
iwl_mvm_rs_rate_init
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_sta
*
sta
,
enum
ieee80211_band
band
);
enum
ieee80211_band
band
,
bool
init
);
/**
* iwl_rate_control_register - Register the rate control algorithm callbacks
...
...
drivers/net/wireless/iwlwifi/mvm/scan.c
浏览文件 @
d9a577c3
...
...
@@ -70,6 +70,9 @@
#define IWL_PLCP_QUIET_THRESH 1
#define IWL_ACTIVE_QUIET_TIME 10
#define LONG_OUT_TIME_PERIOD 600
#define SHORT_OUT_TIME_PERIOD 200
#define SUSPEND_TIME_PERIOD 100
static
inline
__le16
iwl_mvm_scan_rx_chain
(
struct
iwl_mvm
*
mvm
)
{
...
...
@@ -87,20 +90,22 @@ static inline __le16 iwl_mvm_scan_rx_chain(struct iwl_mvm *mvm)
return
cpu_to_le16
(
rx_chain
);
}
static
inline
__le32
iwl_mvm_scan_max_out_time
(
struct
ieee80211_vif
*
vif
)
static
inline
__le32
iwl_mvm_scan_max_out_time
(
struct
ieee80211_vif
*
vif
,
u32
flags
,
bool
is_assoc
)
{
if
(
vif
->
bss_conf
.
assoc
)
return
cpu_to_le32
(
200
*
1024
);
else
if
(
!
is_assoc
)
return
0
;
if
(
flags
&
NL80211_SCAN_FLAG_LOW_PRIORITY
)
return
cpu_to_le32
(
ieee80211_tu_to_usec
(
SHORT_OUT_TIME_PERIOD
));
return
cpu_to_le32
(
ieee80211_tu_to_usec
(
LONG_OUT_TIME_PERIOD
));
}
static
inline
__le32
iwl_mvm_scan_suspend_time
(
struct
ieee80211_vif
*
vif
)
static
inline
__le32
iwl_mvm_scan_suspend_time
(
struct
ieee80211_vif
*
vif
,
bool
is_assoc
)
{
if
(
!
vif
->
bss_conf
.
assoc
)
if
(
!
is_
assoc
)
return
0
;
return
cpu_to_le32
(
ieee80211_tu_to_usec
(
vif
->
bss_conf
.
beacon_int
));
return
cpu_to_le32
(
ieee80211_tu_to_usec
(
SUSPEND_TIME_PERIOD
));
}
static
inline
__le32
...
...
@@ -262,6 +267,15 @@ static u16 iwl_mvm_fill_probe_req(struct ieee80211_mgmt *frame, const u8 *ta,
return
(
u16
)
len
;
}
static
void
iwl_mvm_vif_assoc_iterator
(
void
*
data
,
u8
*
mac
,
struct
ieee80211_vif
*
vif
)
{
bool
*
is_assoc
=
data
;
if
(
vif
->
bss_conf
.
assoc
)
*
is_assoc
=
true
;
}
int
iwl_mvm_scan_request
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
struct
cfg80211_scan_request
*
req
)
...
...
@@ -274,6 +288,7 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
.
dataflags
=
{
IWL_HCMD_DFL_NOCOPY
,
},
};
struct
iwl_scan_cmd
*
cmd
=
mvm
->
scan_cmd
;
bool
is_assoc
=
false
;
int
ret
;
u32
status
;
int
ssid_len
=
0
;
...
...
@@ -289,13 +304,17 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
memset
(
cmd
,
0
,
sizeof
(
struct
iwl_scan_cmd
)
+
mvm
->
fw
->
ucode_capa
.
max_probe_length
+
(
MAX_NUM_SCAN_CHANNELS
*
sizeof
(
struct
iwl_scan_channel
)));
ieee80211_iterate_active_interfaces_atomic
(
mvm
->
hw
,
IEEE80211_IFACE_ITER_NORMAL
,
iwl_mvm_vif_assoc_iterator
,
&
is_assoc
);
cmd
->
channel_count
=
(
u8
)
req
->
n_channels
;
cmd
->
quiet_time
=
cpu_to_le16
(
IWL_ACTIVE_QUIET_TIME
);
cmd
->
quiet_plcp_th
=
cpu_to_le16
(
IWL_PLCP_QUIET_THRESH
);
cmd
->
rxchain_sel_flags
=
iwl_mvm_scan_rx_chain
(
mvm
);
cmd
->
max_out_time
=
iwl_mvm_scan_max_out_time
(
vif
);
cmd
->
suspend_time
=
iwl_mvm_scan_suspend_time
(
vif
);
cmd
->
max_out_time
=
iwl_mvm_scan_max_out_time
(
vif
,
req
->
flags
,
is_assoc
);
cmd
->
suspend_time
=
iwl_mvm_scan_suspend_time
(
vif
,
is_assoc
);
cmd
->
rxon_flags
=
iwl_mvm_scan_rxon_flags
(
req
);
cmd
->
filter_flags
=
cpu_to_le32
(
MAC_FILTER_ACCEPT_GRP
|
MAC_FILTER_IN_BEACON
);
...
...
@@ -522,6 +541,12 @@ static void iwl_build_scan_cmd(struct iwl_mvm *mvm,
struct
cfg80211_sched_scan_request
*
req
,
struct
iwl_scan_offload_cmd
*
scan
)
{
bool
is_assoc
=
false
;
ieee80211_iterate_active_interfaces_atomic
(
mvm
->
hw
,
IEEE80211_IFACE_ITER_NORMAL
,
iwl_mvm_vif_assoc_iterator
,
&
is_assoc
);
scan
->
channel_count
=
mvm
->
nvm_data
->
bands
[
IEEE80211_BAND_2GHZ
].
n_channels
+
mvm
->
nvm_data
->
bands
[
IEEE80211_BAND_5GHZ
].
n_channels
;
...
...
@@ -529,8 +554,9 @@ static void iwl_build_scan_cmd(struct iwl_mvm *mvm,
scan
->
quiet_plcp_th
=
cpu_to_le16
(
IWL_PLCP_QUIET_THRESH
);
scan
->
good_CRC_th
=
IWL_GOOD_CRC_TH_DEFAULT
;
scan
->
rx_chain
=
iwl_mvm_scan_rx_chain
(
mvm
);
scan
->
max_out_time
=
cpu_to_le32
(
200
*
1024
);
scan
->
suspend_time
=
iwl_mvm_scan_suspend_time
(
vif
);
scan
->
max_out_time
=
iwl_mvm_scan_max_out_time
(
vif
,
req
->
flags
,
is_assoc
);
scan
->
suspend_time
=
iwl_mvm_scan_suspend_time
(
vif
,
is_assoc
);
scan
->
filter_flags
|=
cpu_to_le32
(
MAC_FILTER_ACCEPT_GRP
|
MAC_FILTER_IN_BEACON
);
scan
->
scan_type
=
cpu_to_le32
(
SCAN_TYPE_BACKGROUND
);
...
...
@@ -817,11 +843,10 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
IWL_DEBUG_SCAN
(
mvm
,
"Sending scheduled scan with filtering, filter len %d
\n
"
,
req
->
n_match_sets
);
scan_req
.
flags
|=
cpu_to_le16
(
IWL_SCAN_OFFLOAD_FLAG_FILTER_SSID
);
}
else
{
IWL_DEBUG_SCAN
(
mvm
,
"Sending Scheduled scan without filtering
\n
"
);
scan_req
.
flags
|=
cpu_to_le16
(
IWL_SCAN_OFFLOAD_FLAG_PASS_ALL
);
}
return
iwl_mvm_send_cmd_pdu
(
mvm
,
SCAN_OFFLOAD_REQUEST_CMD
,
CMD_SYNC
,
...
...
drivers/net/wireless/iwlwifi/mvm/sta.c
浏览文件 @
d9a577c3
...
...
@@ -840,7 +840,7 @@ static const u8 tid_to_ac[] = {
int
iwl_mvm_sta_tx_agg_start
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
struct
ieee80211_sta
*
sta
,
u16
tid
,
u16
*
ssn
)
{
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
struct
iwl_mvm_tid_data
*
tid_data
;
int
txq_id
;
...
...
@@ -895,7 +895,7 @@ int iwl_mvm_sta_tx_agg_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
int
iwl_mvm_sta_tx_agg_oper
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
struct
ieee80211_sta
*
sta
,
u16
tid
,
u8
buf_size
)
{
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
struct
iwl_mvm_tid_data
*
tid_data
=
&
mvmsta
->
tid_data
[
tid
];
int
queue
,
fifo
,
ret
;
u16
ssn
;
...
...
@@ -945,13 +945,13 @@ int iwl_mvm_sta_tx_agg_oper(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
*/
}
return
iwl_mvm_send_lq_cmd
(
mvm
,
&
mvmsta
->
lq_sta
.
lq
,
CMD_ASYNC
,
false
);
return
iwl_mvm_send_lq_cmd
(
mvm
,
&
mvmsta
->
lq_sta
.
lq
,
false
);
}
int
iwl_mvm_sta_tx_agg_stop
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
struct
ieee80211_sta
*
sta
,
u16
tid
)
{
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
struct
iwl_mvm_tid_data
*
tid_data
=
&
mvmsta
->
tid_data
[
tid
];
u16
txq_id
;
int
err
;
...
...
@@ -1023,7 +1023,7 @@ int iwl_mvm_sta_tx_agg_stop(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
int
iwl_mvm_sta_tx_agg_flush
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
struct
ieee80211_sta
*
sta
,
u16
tid
)
{
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
struct
iwl_mvm_tid_data
*
tid_data
=
&
mvmsta
->
tid_data
[
tid
];
u16
txq_id
;
enum
iwl_mvm_agg_state
old_state
;
...
...
@@ -1416,7 +1416,7 @@ void iwl_mvm_update_tkip_key(struct iwl_mvm *mvm,
void
iwl_mvm_sta_modify_ps_wake
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_sta
*
sta
)
{
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
struct
iwl_mvm_add_sta_cmd_v6
cmd
=
{
.
add_modify
=
STA_MODE_MODIFY
,
.
sta_id
=
mvmsta
->
sta_id
,
...
...
@@ -1438,7 +1438,7 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm,
u16
sleep_state_flags
=
(
reason
==
IEEE80211_FRAME_RELEASE_UAPSD
)
?
STA_SLEEP_STATE_UAPSD
:
STA_SLEEP_STATE_PS_POLL
;
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
struct
iwl_mvm_add_sta_cmd_v6
cmd
=
{
.
add_modify
=
STA_MODE_MODIFY
,
.
sta_id
=
mvmsta
->
sta_id
,
...
...
drivers/net/wireless/iwlwifi/mvm/sta.h
浏览文件 @
d9a577c3
...
...
@@ -298,6 +298,12 @@ struct iwl_mvm_sta {
bool
tt_tx_protection
;
};
static
inline
struct
iwl_mvm_sta
*
iwl_mvm_sta_from_mac80211
(
struct
ieee80211_sta
*
sta
)
{
return
(
void
*
)
sta
->
drv_priv
;
}
/**
* struct iwl_mvm_int_sta - representation of an internal station (auxiliary or
* broadcast)
...
...
drivers/net/wireless/iwlwifi/mvm/tt.c
浏览文件 @
d9a577c3
...
...
@@ -388,7 +388,7 @@ static void iwl_mvm_tt_tx_protection(struct iwl_mvm *mvm, bool enable)
lockdep_is_held
(
&
mvm
->
mutex
));
if
(
IS_ERR_OR_NULL
(
sta
))
continue
;
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
if
(
enable
==
mvmsta
->
tt_tx_protection
)
continue
;
err
=
iwl_mvm_tx_protection
(
mvm
,
mvmsta
,
enable
);
...
...
drivers/net/wireless/iwlwifi/mvm/tx.c
浏览文件 @
d9a577c3
...
...
@@ -276,6 +276,7 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,
return
NULL
;
memset
(
dev_cmd
,
0
,
sizeof
(
*
dev_cmd
));
dev_cmd
->
hdr
.
cmd
=
TX_CMD
;
tx_cmd
=
(
struct
iwl_tx_cmd
*
)
dev_cmd
->
payload
;
if
(
info
->
control
.
hw_key
)
...
...
@@ -361,7 +362,7 @@ int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
u8
txq_id
=
info
->
hw_queue
;
bool
is_data_qos
=
false
,
is_ampdu
=
false
;
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
fc
=
hdr
->
frame_control
;
if
(
WARN_ON_ONCE
(
!
mvmsta
))
...
...
@@ -432,7 +433,7 @@ int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
static
void
iwl_mvm_check_ratid_empty
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_sta
*
sta
,
u8
tid
)
{
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
struct
iwl_mvm_tid_data
*
tid_data
=
&
mvmsta
->
tid_data
[
tid
];
struct
ieee80211_vif
*
vif
=
mvmsta
->
vif
;
...
...
@@ -662,7 +663,7 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
sta
=
rcu_dereference
(
mvm
->
fw_id_to_mac_id
[
sta_id
]);
if
(
!
IS_ERR_OR_NULL
(
sta
))
{
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
if
(
tid
!=
IWL_TID_NON_QOS
)
{
struct
iwl_mvm_tid_data
*
tid_data
=
...
...
@@ -793,7 +794,7 @@ static void iwl_mvm_rx_tx_cmd_agg(struct iwl_mvm *mvm,
sta
=
rcu_dereference
(
mvm
->
fw_id_to_mac_id
[
sta_id
]);
if
(
!
WARN_ON_ONCE
(
IS_ERR_OR_NULL
(
sta
)))
{
struct
iwl_mvm_sta
*
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
struct
iwl_mvm_sta
*
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
mvmsta
->
tid_data
[
tid
].
rate_n_flags
=
le32_to_cpu
(
tx_resp
->
initial_rate
);
}
...
...
@@ -849,7 +850,7 @@ int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
return
0
;
}
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
mvmsta
=
iwl_mvm_sta_from_mac80211
(
sta
)
;
tid_data
=
&
mvmsta
->
tid_data
[
tid
];
if
(
WARN_ONCE
(
tid_data
->
txq_id
!=
scd_flow
,
"Q %d, tid %d, flow %d"
,
...
...
drivers/net/wireless/iwlwifi/mvm/utils.c
浏览文件 @
d9a577c3
...
...
@@ -486,22 +486,18 @@ void iwl_mvm_dump_sram(struct iwl_mvm *mvm)
* this case to clear the state indicating that station creation is in
* progress.
*/
int
iwl_mvm_send_lq_cmd
(
struct
iwl_mvm
*
mvm
,
struct
iwl_lq_cmd
*
lq
,
u8
flags
,
bool
init
)
int
iwl_mvm_send_lq_cmd
(
struct
iwl_mvm
*
mvm
,
struct
iwl_lq_cmd
*
lq
,
bool
init
)
{
struct
iwl_host_cmd
cmd
=
{
.
id
=
LQ_CMD
,
.
len
=
{
sizeof
(
struct
iwl_lq_cmd
),
},
.
flags
=
flags
,
.
flags
=
init
?
CMD_SYNC
:
CMD_ASYNC
,
.
data
=
{
lq
,
},
};
if
(
WARN_ON
(
lq
->
sta_id
==
IWL_MVM_STATION_COUNT
))
return
-
EINVAL
;
if
(
WARN_ON
(
init
&&
(
cmd
.
flags
&
CMD_ASYNC
)))
return
-
EINVAL
;
return
iwl_mvm_send_cmd
(
mvm
,
&
cmd
);
}
...
...
drivers/net/wireless/iwlwifi/pcie/drv.c
浏览文件 @
d9a577c3
...
...
@@ -297,6 +297,9 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
{
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
,
0x5072
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x5170
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x5770
,
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
)},
...
...
@@ -350,6 +353,8 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
{
IWL_PCI_DEVICE
(
0x08B4
,
0x8270
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8470
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8570
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x1070
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x1170
,
iwl3160_2ac_cfg
)},
/* 7265 Series */
{
IWL_PCI_DEVICE
(
0x095A
,
0x5010
,
iwl7265_2ac_cfg
)},
...
...
drivers/net/wireless/iwlwifi/pcie/rx.c
浏览文件 @
d9a577c3
...
...
@@ -1126,7 +1126,6 @@ static irqreturn_t iwl_pcie_isr(int irq, void *data)
struct
iwl_trans
*
trans
=
data
;
struct
iwl_trans_pcie
*
trans_pcie
=
IWL_TRANS_GET_PCIE_TRANS
(
trans
);
u32
inta
,
inta_mask
;
irqreturn_t
ret
=
IRQ_NONE
;
lockdep_assert_held
(
&
trans_pcie
->
irq_lock
);
...
...
@@ -1155,7 +1154,16 @@ static irqreturn_t iwl_pcie_isr(int irq, void *data)
* or due to sporadic interrupts thrown from our NIC. */
if
(
!
inta
)
{
IWL_DEBUG_ISR
(
trans
,
"Ignore interrupt, inta == 0
\n
"
);
goto
none
;
/*
* Re-enable interrupts here since we don't have anything to
* service, but only in case the handler won't run. Note that
* the handler can be scheduled because of a previous
* interrupt.
*/
if
(
test_bit
(
STATUS_INT_ENABLED
,
&
trans_pcie
->
status
)
&&
!
trans_pcie
->
inta
)
iwl_enable_interrupts
(
trans
);
return
IRQ_NONE
;
}
if
((
inta
==
0xFFFFFFFF
)
||
((
inta
&
0xFFFFFFF0
)
==
0xa5a5a5a0
))
{
...
...
@@ -1173,19 +1181,7 @@ static irqreturn_t iwl_pcie_isr(int irq, void *data)
trans_pcie
->
inta
|=
inta
;
/* the thread will service interrupts and re-enable them */
if
(
likely
(
inta
))
return
IRQ_WAKE_THREAD
;
ret
=
IRQ_HANDLED
;
none:
/* re-enable interrupts here since we don't have anything to service. */
/* only Re-enable if disabled by irq and no schedules tasklet. */
if
(
test_bit
(
STATUS_INT_ENABLED
,
&
trans_pcie
->
status
)
&&
!
trans_pcie
->
inta
)
iwl_enable_interrupts
(
trans
);
return
ret
;
return
IRQ_WAKE_THREAD
;
}
/* interrupt handler using ict table, with this interrupt driver will
...
...
drivers/net/wireless/iwlwifi/pcie/tx.c
浏览文件 @
d9a577c3
...
...
@@ -1542,30 +1542,24 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
}
if
(
!
ret
)
{
if
(
test_bit
(
STATUS_HCMD_ACTIVE
,
&
trans_pcie
->
status
))
{
struct
iwl_txq
*
txq
=
&
trans_pcie
->
txq
[
trans_pcie
->
cmd_queue
];
struct
iwl_queue
*
q
=
&
txq
->
q
;
struct
iwl_txq
*
txq
=
&
trans_pcie
->
txq
[
trans_pcie
->
cmd_queue
];
struct
iwl_queue
*
q
=
&
txq
->
q
;
IWL_ERR
(
trans
,
"Error sending %s: time out after %dms.
\n
"
,
get_cmd_string
(
trans_pcie
,
cmd
->
id
),
jiffies_to_msecs
(
HOST_COMPLETE_TIMEOUT
));
IWL_ERR
(
trans
,
"Error sending %s: time out after %dms.
\n
"
,
get_cmd_string
(
trans_pcie
,
cmd
->
id
),
jiffies_to_msecs
(
HOST_COMPLETE_TIMEOUT
));
IWL_ERR
(
trans
,
"Current CMD queue read_ptr %d write_ptr %d
\n
"
,
q
->
read_ptr
,
q
->
write_ptr
);
IWL_ERR
(
trans
,
"Current CMD queue read_ptr %d write_ptr %d
\n
"
,
q
->
read_ptr
,
q
->
write_ptr
);
clear_bit
(
STATUS_HCMD_ACTIVE
,
&
trans_pcie
->
status
);
IWL_DEBUG_INFO
(
trans
,
"Clearing HCMD_ACTIVE for command %s
\n
"
,
get_cmd_string
(
trans_pcie
,
cmd
->
id
));
ret
=
-
ETIMEDOUT
;
clear_bit
(
STATUS_HCMD_ACTIVE
,
&
trans_pcie
->
status
);
IWL_DEBUG_INFO
(
trans
,
"Clearing HCMD_ACTIVE for command %s
\n
"
,
get_cmd_string
(
trans_pcie
,
cmd
->
id
));
ret
=
-
ETIMEDOUT
;
iwl_nic_error
(
trans
);
iwl_nic_error
(
trans
);
goto
cancel
;
}
goto
cancel
;
}
if
(
test_bit
(
STATUS_FW_ERROR
,
&
trans_pcie
->
status
))
{
...
...
@@ -1674,7 +1668,6 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
txq
->
entries
[
q
->
write_ptr
].
skb
=
skb
;
txq
->
entries
[
q
->
write_ptr
].
cmd
=
dev_cmd
;
dev_cmd
->
hdr
.
cmd
=
REPLY_TX
;
dev_cmd
->
hdr
.
sequence
=
cpu_to_le16
((
u16
)(
QUEUE_TO_SEQ
(
txq_id
)
|
INDEX_TO_SEQ
(
q
->
write_ptr
)));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录