Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
d91a48cb
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看板
提交
d91a48cb
编写于
5月 16, 2014
作者:
J
John W. Linville
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next
上级
75e58071
af7c603e
变更
51
隐藏空白更改
内联
并排
Showing
51 changed file
with
443 addition
and
368 deletion
+443
-368
drivers/net/wireless/iwlwifi/Kconfig
drivers/net/wireless/iwlwifi/Kconfig
+1
-2
drivers/net/wireless/iwlwifi/dvm/calib.c
drivers/net/wireless/iwlwifi/dvm/calib.c
+0
-1
drivers/net/wireless/iwlwifi/dvm/debugfs.c
drivers/net/wireless/iwlwifi/dvm/debugfs.c
+3
-4
drivers/net/wireless/iwlwifi/dvm/devices.c
drivers/net/wireless/iwlwifi/dvm/devices.c
+0
-2
drivers/net/wireless/iwlwifi/dvm/lib.c
drivers/net/wireless/iwlwifi/dvm/lib.c
+7
-10
drivers/net/wireless/iwlwifi/dvm/main.c
drivers/net/wireless/iwlwifi/dvm/main.c
+11
-16
drivers/net/wireless/iwlwifi/dvm/power.c
drivers/net/wireless/iwlwifi/dvm/power.c
+2
-2
drivers/net/wireless/iwlwifi/dvm/rs.c
drivers/net/wireless/iwlwifi/dvm/rs.c
+5
-5
drivers/net/wireless/iwlwifi/dvm/rx.c
drivers/net/wireless/iwlwifi/dvm/rx.c
+1
-1
drivers/net/wireless/iwlwifi/dvm/rxon.c
drivers/net/wireless/iwlwifi/dvm/rxon.c
+9
-9
drivers/net/wireless/iwlwifi/dvm/scan.c
drivers/net/wireless/iwlwifi/dvm/scan.c
+1
-2
drivers/net/wireless/iwlwifi/dvm/sta.c
drivers/net/wireless/iwlwifi/dvm/sta.c
+13
-16
drivers/net/wireless/iwlwifi/dvm/tt.c
drivers/net/wireless/iwlwifi/dvm/tt.c
+1
-1
drivers/net/wireless/iwlwifi/dvm/tx.c
drivers/net/wireless/iwlwifi/dvm/tx.c
+12
-12
drivers/net/wireless/iwlwifi/dvm/ucode.c
drivers/net/wireless/iwlwifi/dvm/ucode.c
+3
-3
drivers/net/wireless/iwlwifi/iwl-8000.c
drivers/net/wireless/iwlwifi/iwl-8000.c
+3
-0
drivers/net/wireless/iwlwifi/iwl-config.h
drivers/net/wireless/iwlwifi/iwl-config.h
+2
-1
drivers/net/wireless/iwlwifi/iwl-debug.c
drivers/net/wireless/iwlwifi/iwl-debug.c
+2
-4
drivers/net/wireless/iwlwifi/iwl-debug.h
drivers/net/wireless/iwlwifi/iwl-debug.h
+33
-8
drivers/net/wireless/iwlwifi/iwl-drv.c
drivers/net/wireless/iwlwifi/iwl-drv.c
+5
-0
drivers/net/wireless/iwlwifi/iwl-fw.h
drivers/net/wireless/iwlwifi/iwl-fw.h
+7
-1
drivers/net/wireless/iwlwifi/iwl-io.c
drivers/net/wireless/iwlwifi/iwl-io.c
+18
-0
drivers/net/wireless/iwlwifi/iwl-io.h
drivers/net/wireless/iwlwifi/iwl-io.h
+1
-0
drivers/net/wireless/iwlwifi/iwl-modparams.h
drivers/net/wireless/iwlwifi/iwl-modparams.h
+1
-0
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
+2
-2
drivers/net/wireless/iwlwifi/iwl-phy-db.c
drivers/net/wireless/iwlwifi/iwl-phy-db.c
+4
-5
drivers/net/wireless/iwlwifi/iwl-prph.h
drivers/net/wireless/iwlwifi/iwl-prph.h
+3
-0
drivers/net/wireless/iwlwifi/iwl-trans.h
drivers/net/wireless/iwlwifi/iwl-trans.h
+21
-10
drivers/net/wireless/iwlwifi/mvm/coex.c
drivers/net/wireless/iwlwifi/mvm/coex.c
+26
-42
drivers/net/wireless/iwlwifi/mvm/d3.c
drivers/net/wireless/iwlwifi/mvm/d3.c
+11
-16
drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
+2
-2
drivers/net/wireless/iwlwifi/mvm/debugfs.c
drivers/net/wireless/iwlwifi/mvm/debugfs.c
+4
-5
drivers/net/wireless/iwlwifi/mvm/fw.c
drivers/net/wireless/iwlwifi/mvm/fw.c
+14
-3
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
+34
-60
drivers/net/wireless/iwlwifi/mvm/mac80211.c
drivers/net/wireless/iwlwifi/mvm/mac80211.c
+24
-22
drivers/net/wireless/iwlwifi/mvm/mvm.h
drivers/net/wireless/iwlwifi/mvm/mvm.h
+3
-1
drivers/net/wireless/iwlwifi/mvm/nvm.c
drivers/net/wireless/iwlwifi/mvm/nvm.c
+38
-38
drivers/net/wireless/iwlwifi/mvm/ops.c
drivers/net/wireless/iwlwifi/mvm/ops.c
+9
-4
drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c
drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c
+14
-1
drivers/net/wireless/iwlwifi/mvm/power.c
drivers/net/wireless/iwlwifi/mvm/power.c
+40
-8
drivers/net/wireless/iwlwifi/mvm/quota.c
drivers/net/wireless/iwlwifi/mvm/quota.c
+1
-1
drivers/net/wireless/iwlwifi/mvm/rs.c
drivers/net/wireless/iwlwifi/mvm/rs.c
+4
-4
drivers/net/wireless/iwlwifi/mvm/scan.c
drivers/net/wireless/iwlwifi/mvm/scan.c
+6
-7
drivers/net/wireless/iwlwifi/mvm/sta.c
drivers/net/wireless/iwlwifi/mvm/sta.c
+9
-9
drivers/net/wireless/iwlwifi/mvm/time-event.c
drivers/net/wireless/iwlwifi/mvm/time-event.c
+2
-2
drivers/net/wireless/iwlwifi/mvm/tt.c
drivers/net/wireless/iwlwifi/mvm/tt.c
+0
-1
drivers/net/wireless/iwlwifi/mvm/tx.c
drivers/net/wireless/iwlwifi/mvm/tx.c
+1
-1
drivers/net/wireless/iwlwifi/mvm/utils.c
drivers/net/wireless/iwlwifi/mvm/utils.c
+2
-2
drivers/net/wireless/iwlwifi/pcie/drv.c
drivers/net/wireless/iwlwifi/pcie/drv.c
+7
-7
drivers/net/wireless/iwlwifi/pcie/trans.c
drivers/net/wireless/iwlwifi/pcie/trans.c
+16
-10
drivers/net/wireless/iwlwifi/pcie/tx.c
drivers/net/wireless/iwlwifi/pcie/tx.c
+5
-5
未找到文件。
drivers/net/wireless/iwlwifi/Kconfig
浏览文件 @
d91a48cb
...
...
@@ -42,7 +42,7 @@ config IWLWIFI
config IWLWIFI_LEDS
bool
depends on IWLWIFI
depends on LEDS_CLASS
depends on LEDS_CLASS
=y || LEDS_CLASS=IWLWIFI
select LEDS_TRIGGERS
select MAC80211_LEDS
default y
...
...
@@ -128,7 +128,6 @@ config IWLWIFI_DEBUG_EXPERIMENTAL_UCODE
Enable use of experimental ucode for testing and debugging.
config IWLWIFI_DEVICE_TRACING
bool "iwlwifi device access tracing"
depends on IWLWIFI
depends on EVENT_TRACING
...
...
drivers/net/wireless/iwlwifi/dvm/calib.c
浏览文件 @
d91a48cb
...
...
@@ -94,7 +94,6 @@ int iwl_send_calib_results(struct iwl_priv *priv)
{
struct
iwl_host_cmd
hcmd
=
{
.
id
=
REPLY_PHY_CALIBRATION_CMD
,
.
flags
=
CMD_SYNC
,
};
struct
iwl_calib_result
*
res
;
...
...
drivers/net/wireless/iwlwifi/dvm/debugfs.c
浏览文件 @
d91a48cb
...
...
@@ -1481,7 +1481,7 @@ static ssize_t iwl_dbgfs_ucode_bt_stats_read(struct file *file,
/* make request to uCode to retrieve statistics information */
mutex_lock
(
&
priv
->
mutex
);
ret
=
iwl_send_statistics_request
(
priv
,
CMD_SYNC
,
false
);
ret
=
iwl_send_statistics_request
(
priv
,
0
,
false
);
mutex_unlock
(
&
priv
->
mutex
);
if
(
ret
)
...
...
@@ -1868,7 +1868,7 @@ static ssize_t iwl_dbgfs_clear_ucode_statistics_write(struct file *file,
/* make request to uCode to retrieve statistics information */
mutex_lock
(
&
priv
->
mutex
);
iwl_send_statistics_request
(
priv
,
CMD_SYNC
,
true
);
iwl_send_statistics_request
(
priv
,
0
,
true
);
mutex_unlock
(
&
priv
->
mutex
);
return
count
;
...
...
@@ -2188,7 +2188,6 @@ static int iwl_cmd_echo_test(struct iwl_priv *priv)
struct
iwl_host_cmd
cmd
=
{
.
id
=
REPLY_ECHO
,
.
len
=
{
0
},
.
flags
=
CMD_SYNC
,
};
ret
=
iwl_dvm_send_cmd
(
priv
,
&
cmd
);
...
...
@@ -2320,7 +2319,7 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct file *file,
mutex_lock
(
&
priv
->
mutex
);
/* take the return value to make compiler happy - it will fail anyway */
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_ERROR
,
CMD_SYNC
,
0
,
NULL
);
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_ERROR
,
0
,
0
,
NULL
);
mutex_unlock
(
&
priv
->
mutex
);
...
...
drivers/net/wireless/iwlwifi/dvm/devices.c
浏览文件 @
d91a48cb
...
...
@@ -417,7 +417,6 @@ static int iwl5000_hw_channel_switch(struct iwl_priv *priv,
struct
iwl_host_cmd
hcmd
=
{
.
id
=
REPLY_CHANNEL_SWITCH
,
.
len
=
{
sizeof
(
cmd
),
},
.
flags
=
CMD_SYNC
,
.
data
=
{
&
cmd
,
},
};
...
...
@@ -579,7 +578,6 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
struct
iwl_host_cmd
hcmd
=
{
.
id
=
REPLY_CHANNEL_SWITCH
,
.
len
=
{
sizeof
(
*
cmd
),
},
.
flags
=
CMD_SYNC
,
.
dataflags
[
0
]
=
IWL_HCMD_DFL_NOCOPY
,
};
int
err
;
...
...
drivers/net/wireless/iwlwifi/dvm/lib.c
浏览文件 @
d91a48cb
...
...
@@ -81,7 +81,7 @@ int iwlagn_send_tx_power(struct iwl_priv *priv)
else
tx_ant_cfg_cmd
=
REPLY_TX_POWER_DBM_CMD
;
return
iwl_dvm_send_cmd_pdu
(
priv
,
tx_ant_cfg_cmd
,
CMD_SYNC
,
return
iwl_dvm_send_cmd_pdu
(
priv
,
tx_ant_cfg_cmd
,
0
,
sizeof
(
tx_power_cmd
),
&
tx_power_cmd
);
}
...
...
@@ -141,7 +141,6 @@ int iwlagn_txfifo_flush(struct iwl_priv *priv, u32 scd_q_msk)
struct
iwl_host_cmd
cmd
=
{
.
id
=
REPLY_TXFIFO_FLUSH
,
.
len
=
{
sizeof
(
struct
iwl_txfifo_flush_cmd
),
},
.
flags
=
CMD_SYNC
,
.
data
=
{
&
flush_cmd
,
},
};
...
...
@@ -333,12 +332,12 @@ void iwlagn_send_advance_bt_config(struct iwl_priv *priv)
memcpy
(
&
bt_cmd_v2
.
basic
,
&
basic
,
sizeof
(
basic
));
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_BT_CONFIG
,
CMD_SYNC
,
sizeof
(
bt_cmd_v2
),
&
bt_cmd_v2
);
0
,
sizeof
(
bt_cmd_v2
),
&
bt_cmd_v2
);
}
else
{
memcpy
(
&
bt_cmd_v1
.
basic
,
&
basic
,
sizeof
(
basic
));
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_BT_CONFIG
,
CMD_SYNC
,
sizeof
(
bt_cmd_v1
),
&
bt_cmd_v1
);
0
,
sizeof
(
bt_cmd_v1
),
&
bt_cmd_v1
);
}
if
(
ret
)
IWL_ERR
(
priv
,
"failed to send BT Coex Config
\n
"
);
...
...
@@ -1044,7 +1043,6 @@ int iwlagn_send_patterns(struct iwl_priv *priv,
struct
iwl_host_cmd
cmd
=
{
.
id
=
REPLY_WOWLAN_PATTERNS
,
.
dataflags
[
0
]
=
IWL_HCMD_DFL_NOCOPY
,
.
flags
=
CMD_SYNC
,
};
int
i
,
err
;
...
...
@@ -1201,7 +1199,6 @@ int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan)
if
(
key_data
.
use_rsc_tsc
)
{
struct
iwl_host_cmd
rsc_tsc_cmd
=
{
.
id
=
REPLY_WOWLAN_TSC_RSC_PARAMS
,
.
flags
=
CMD_SYNC
,
.
data
[
0
]
=
key_data
.
rsc_tsc
,
.
dataflags
[
0
]
=
IWL_HCMD_DFL_NOCOPY
,
.
len
[
0
]
=
sizeof
(
*
key_data
.
rsc_tsc
),
...
...
@@ -1215,7 +1212,7 @@ int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan)
if
(
key_data
.
use_tkip
)
{
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_WOWLAN_TKIP_PARAMS
,
CMD_SYNC
,
sizeof
(
tkip_cmd
),
0
,
sizeof
(
tkip_cmd
),
&
tkip_cmd
);
if
(
ret
)
goto
out
;
...
...
@@ -1231,20 +1228,20 @@ int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan)
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_WOWLAN_KEK_KCK_MATERIAL
,
CMD_SYNC
,
sizeof
(
kek_kck_cmd
),
0
,
sizeof
(
kek_kck_cmd
),
&
kek_kck_cmd
);
if
(
ret
)
goto
out
;
}
}
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_D3_CONFIG
,
CMD_SYNC
,
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_D3_CONFIG
,
0
,
sizeof
(
d3_cfg_cmd
),
&
d3_cfg_cmd
);
if
(
ret
)
goto
out
;
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_WOWLAN_WAKEUP_FILTER
,
CMD_SYNC
,
sizeof
(
wakeup_filter_cmd
),
0
,
sizeof
(
wakeup_filter_cmd
),
&
wakeup_filter_cmd
);
if
(
ret
)
goto
out
;
...
...
drivers/net/wireless/iwlwifi/dvm/main.c
浏览文件 @
d91a48cb
...
...
@@ -128,7 +128,6 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
struct
iwl_tx_beacon_cmd
*
tx_beacon_cmd
;
struct
iwl_host_cmd
cmd
=
{
.
id
=
REPLY_TX_BEACON
,
.
flags
=
CMD_SYNC
,
};
struct
ieee80211_tx_info
*
info
;
u32
frame_size
;
...
...
@@ -311,8 +310,7 @@ int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags, bool clear)
sizeof
(
struct
iwl_statistics_cmd
),
&
statistics_cmd
);
else
return
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_STATISTICS_CMD
,
CMD_SYNC
,
return
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_STATISTICS_CMD
,
0
,
sizeof
(
struct
iwl_statistics_cmd
),
&
statistics_cmd
);
}
...
...
@@ -622,7 +620,7 @@ static void iwl_rf_kill_ct_config(struct iwl_priv *priv)
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_CT_KILL_CONFIG_CMD
,
CMD_SYNC
,
sizeof
(
adv_cmd
),
&
adv_cmd
);
0
,
sizeof
(
adv_cmd
),
&
adv_cmd
);
if
(
ret
)
IWL_ERR
(
priv
,
"REPLY_CT_KILL_CONFIG_CMD failed
\n
"
);
else
...
...
@@ -637,7 +635,7 @@ static void iwl_rf_kill_ct_config(struct iwl_priv *priv)
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_CT_KILL_CONFIG_CMD
,
CMD_SYNC
,
sizeof
(
cmd
),
&
cmd
);
0
,
sizeof
(
cmd
),
&
cmd
);
if
(
ret
)
IWL_ERR
(
priv
,
"REPLY_CT_KILL_CONFIG_CMD failed
\n
"
);
else
...
...
@@ -673,9 +671,7 @@ static int iwlagn_send_tx_ant_config(struct iwl_priv *priv, u8 valid_tx_ant)
if
(
IWL_UCODE_API
(
priv
->
fw
->
ucode_ver
)
>
1
)
{
IWL_DEBUG_HC
(
priv
,
"select valid tx ant: %u
\n
"
,
valid_tx_ant
);
return
iwl_dvm_send_cmd_pdu
(
priv
,
TX_ANT_CONFIGURATION_CMD
,
CMD_SYNC
,
return
iwl_dvm_send_cmd_pdu
(
priv
,
TX_ANT_CONFIGURATION_CMD
,
0
,
sizeof
(
struct
iwl_tx_ant_config_cmd
),
&
tx_ant_cmd
);
}
else
{
...
...
@@ -703,7 +699,7 @@ static void iwl_send_bt_config(struct iwl_priv *priv)
(
bt_cmd
.
flags
==
BT_COEX_DISABLE
)
?
"disable"
:
"active"
);
if
(
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_BT_CONFIG
,
CMD_SYNC
,
sizeof
(
struct
iwl_bt_cmd
),
&
bt_cmd
))
0
,
sizeof
(
struct
iwl_bt_cmd
),
&
bt_cmd
))
IWL_ERR
(
priv
,
"failed to send BT Coex Config
\n
"
);
}
...
...
@@ -987,7 +983,7 @@ static void iwl_bg_restart(struct work_struct *data)
ieee80211_restart_hw
(
priv
->
hw
);
else
IWL_ERR
(
priv
,
"Cannot request restart before registrating with mac80211"
);
"Cannot request restart before registrating with mac80211
\n
"
);
}
else
{
WARN_ON
(
1
);
}
...
...
@@ -1127,7 +1123,6 @@ static void iwl_option_config(struct iwl_priv *priv)
static
int
iwl_eeprom_init_hw_params
(
struct
iwl_priv
*
priv
)
{
struct
iwl_nvm_data
*
data
=
priv
->
nvm_data
;
char
*
debug_msg
;
if
(
data
->
sku_cap_11n_enable
&&
!
priv
->
cfg
->
ht_params
)
{
...
...
@@ -1141,8 +1136,8 @@ static int iwl_eeprom_init_hw_params(struct iwl_priv *priv)
return
-
EINVAL
;
}
debug_msg
=
"Device SKU: 24GHz %s %s, 52GHz %s %s, 11.n %s %s
\n
"
;
IWL_DEBUG_INFO
(
priv
,
debug_msg
,
IWL_DEBUG_INFO
(
priv
,
"Device SKU: 24GHz %s %s, 52GHz %s %s, 11.n %s %s
\n
"
,
data
->
sku_cap_band_24GHz_enable
?
""
:
"NOT"
,
"enabled"
,
data
->
sku_cap_band_52GHz_enable
?
""
:
"NOT"
,
"enabled"
,
data
->
sku_cap_11n_enable
?
""
:
"NOT"
,
"enabled"
);
...
...
@@ -1350,7 +1345,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
iwl_set_hw_params
(
priv
);
if
(
!
(
priv
->
nvm_data
->
sku_cap_ipan_enable
))
{
IWL_DEBUG_INFO
(
priv
,
"Your EEPROM disabled PAN"
);
IWL_DEBUG_INFO
(
priv
,
"Your EEPROM disabled PAN
\n
"
);
ucode_flags
&=
~
IWL_UCODE_TLV_FLAGS_PAN
;
/*
* if not PAN, then don't support P2P -- might be a uCode
...
...
@@ -2019,10 +2014,10 @@ void iwlagn_lift_passive_no_rx(struct iwl_priv *priv)
for
(
mq
=
0
;
mq
<
IWLAGN_FIRST_AMPDU_QUEUE
;
mq
++
)
{
if
(
!
test_bit
(
mq
,
&
priv
->
transport_queue_stop
))
{
IWL_DEBUG_TX_QUEUES
(
priv
,
"Wake queue %d"
,
mq
);
IWL_DEBUG_TX_QUEUES
(
priv
,
"Wake queue %d
\n
"
,
mq
);
ieee80211_wake_queue
(
priv
->
hw
,
mq
);
}
else
{
IWL_DEBUG_TX_QUEUES
(
priv
,
"Don't wake queue %d"
,
mq
);
IWL_DEBUG_TX_QUEUES
(
priv
,
"Don't wake queue %d
\n
"
,
mq
);
}
}
...
...
drivers/net/wireless/iwlwifi/dvm/power.c
浏览文件 @
d91a48cb
...
...
@@ -278,7 +278,7 @@ static int iwl_set_power(struct iwl_priv *priv, struct iwl_powertable_cmd *cmd)
le32_to_cpu
(
cmd
->
sleep_interval
[
3
]),
le32_to_cpu
(
cmd
->
sleep_interval
[
4
]));
return
iwl_dvm_send_cmd_pdu
(
priv
,
POWER_TABLE_CMD
,
CMD_SYNC
,
return
iwl_dvm_send_cmd_pdu
(
priv
,
POWER_TABLE_CMD
,
0
,
sizeof
(
struct
iwl_powertable_cmd
),
cmd
);
}
...
...
@@ -361,7 +361,7 @@ int iwl_power_set_mode(struct iwl_priv *priv, struct iwl_powertable_cmd *cmd,
memcpy
(
&
priv
->
power_data
.
sleep_cmd
,
cmd
,
sizeof
(
*
cmd
));
}
else
IWL_ERR
(
priv
,
"set power fail, ret = %d"
,
ret
);
IWL_ERR
(
priv
,
"set power fail, ret = %d
\n
"
,
ret
);
return
ret
;
}
...
...
drivers/net/wireless/iwlwifi/dvm/rs.c
浏览文件 @
d91a48cb
...
...
@@ -1453,7 +1453,7 @@ static int rs_move_legacy_other(struct iwl_priv *priv,
tbl
->
action
=
IWL_LEGACY_SWITCH_SISO
;
break
;
default:
IWL_ERR
(
priv
,
"Invalid BT load %d"
,
priv
->
bt_traffic_load
);
IWL_ERR
(
priv
,
"Invalid BT load %d
\n
"
,
priv
->
bt_traffic_load
);
break
;
}
...
...
@@ -1628,7 +1628,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
tbl
->
action
=
IWL_SISO_SWITCH_ANTENNA1
;
break
;
default:
IWL_ERR
(
priv
,
"Invalid BT load %d"
,
priv
->
bt_traffic_load
);
IWL_ERR
(
priv
,
"Invalid BT load %d
\n
"
,
priv
->
bt_traffic_load
);
break
;
}
...
...
@@ -1799,7 +1799,7 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv,
tbl
->
action
=
IWL_MIMO2_SWITCH_SISO_A
;
break
;
default:
IWL_ERR
(
priv
,
"Invalid BT load %d"
,
priv
->
bt_traffic_load
);
IWL_ERR
(
priv
,
"Invalid BT load %d
\n
"
,
priv
->
bt_traffic_load
);
break
;
}
...
...
@@ -1969,7 +1969,7 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv,
tbl
->
action
=
IWL_MIMO3_SWITCH_SISO_A
;
break
;
default:
IWL_ERR
(
priv
,
"Invalid BT load %d"
,
priv
->
bt_traffic_load
);
IWL_ERR
(
priv
,
"Invalid BT load %d
\n
"
,
priv
->
bt_traffic_load
);
break
;
}
...
...
@@ -2709,7 +2709,7 @@ static void rs_initialize_lq(struct iwl_priv *priv,
rs_set_expected_tpt_table
(
lq_sta
,
tbl
);
rs_fill_link_cmd
(
NULL
,
lq_sta
,
rate
);
priv
->
stations
[
lq_sta
->
lq
.
sta_id
].
lq
=
&
lq_sta
->
lq
;
iwl_send_lq_cmd
(
priv
,
ctx
,
&
lq_sta
->
lq
,
CMD_SYNC
,
true
);
iwl_send_lq_cmd
(
priv
,
ctx
,
&
lq_sta
->
lq
,
0
,
true
);
}
static
void
rs_get_rate
(
void
*
priv_r
,
struct
ieee80211_sta
*
sta
,
void
*
priv_sta
,
...
...
drivers/net/wireless/iwlwifi/dvm/rx.c
浏览文件 @
d91a48cb
...
...
@@ -786,7 +786,7 @@ static void iwlagn_pass_packet_to_mac80211(struct iwl_priv *priv,
memcpy
(
IEEE80211_SKB_RXCB
(
skb
),
stats
,
sizeof
(
*
stats
));
ieee80211_rx
_ni
(
priv
->
hw
,
skb
);
ieee80211_rx
(
priv
->
hw
,
skb
);
}
static
u32
iwlagn_translate_rx_status
(
struct
iwl_priv
*
priv
,
u32
decrypt_in
)
...
...
drivers/net/wireless/iwlwifi/dvm/rxon.c
浏览文件 @
d91a48cb
...
...
@@ -104,7 +104,7 @@ static int iwlagn_disable_bss(struct iwl_priv *priv,
send
->
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
ctx
->
rxon_cmd
,
CMD_SYNC
,
sizeof
(
*
send
),
send
);
0
,
sizeof
(
*
send
),
send
);
send
->
filter_flags
=
old_filter
;
...
...
@@ -134,7 +134,7 @@ static int iwlagn_disable_pan(struct iwl_priv *priv,
send
->
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
send
->
dev_type
=
RXON_DEV_TYPE_P2P
;
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
ctx
->
rxon_cmd
,
CMD_SYNC
,
sizeof
(
*
send
),
send
);
0
,
sizeof
(
*
send
),
send
);
send
->
filter_flags
=
old_filter
;
send
->
dev_type
=
old_dev_type
;
...
...
@@ -160,7 +160,7 @@ static int iwlagn_disconn_pan(struct iwl_priv *priv,
int
ret
;
send
->
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
ctx
->
rxon_cmd
,
CMD_SYNC
,
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
ctx
->
rxon_cmd
,
0
,
sizeof
(
*
send
),
send
);
send
->
filter_flags
=
old_filter
;
...
...
@@ -189,7 +189,7 @@ static void iwlagn_update_qos(struct iwl_priv *priv,
ctx
->
qos_data
.
qos_active
,
ctx
->
qos_data
.
def_qos_parm
.
qos_flags
);
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
ctx
->
qos_cmd
,
CMD_SYNC
,
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
ctx
->
qos_cmd
,
0
,
sizeof
(
struct
iwl_qosparam_cmd
),
&
ctx
->
qos_data
.
def_qos_parm
);
if
(
ret
)
...
...
@@ -353,7 +353,7 @@ static int iwl_send_rxon_timing(struct iwl_priv *priv,
le16_to_cpu
(
ctx
->
timing
.
atim_window
));
return
iwl_dvm_send_cmd_pdu
(
priv
,
ctx
->
rxon_timing_cmd
,
CMD_SYNC
,
sizeof
(
ctx
->
timing
),
&
ctx
->
timing
);
0
,
sizeof
(
ctx
->
timing
),
&
ctx
->
timing
);
}
static
int
iwlagn_rxon_disconn
(
struct
iwl_priv
*
priv
,
...
...
@@ -495,7 +495,7 @@ static int iwlagn_rxon_connect(struct iwl_priv *priv,
* Associated RXON doesn't clear the station table in uCode,
* so we don't need to restore stations etc. after this.
*/
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
ctx
->
rxon_cmd
,
CMD_SYNC
,
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
ctx
->
rxon_cmd
,
0
,
sizeof
(
struct
iwl_rxon_cmd
),
&
ctx
->
staging
);
if
(
ret
)
{
IWL_ERR
(
priv
,
"Error setting new RXON (%d)
\n
"
,
ret
);
...
...
@@ -610,7 +610,7 @@ int iwlagn_set_pan_params(struct iwl_priv *priv)
cmd
.
slots
[
0
].
width
=
cpu_to_le16
(
slot0
);
cmd
.
slots
[
1
].
width
=
cpu_to_le16
(
slot1
);
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_WIPAN_PARAMS
,
CMD_SYNC
,
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_WIPAN_PARAMS
,
0
,
sizeof
(
cmd
),
&
cmd
);
if
(
ret
)
IWL_ERR
(
priv
,
"Error setting PAN parameters (%d)
\n
"
,
ret
);
...
...
@@ -823,7 +823,7 @@ static int iwl_check_rxon_cmd(struct iwl_priv *priv,
if
((
rxon
->
flags
&
(
RXON_FLG_CCK_MSK
|
RXON_FLG_AUTO_DETECT_MSK
))
==
(
RXON_FLG_CCK_MSK
|
RXON_FLG_AUTO_DETECT_MSK
))
{
IWL_WARN
(
priv
,
"CCK and auto detect"
);
IWL_WARN
(
priv
,
"CCK and auto detect
\n
"
);
errors
|=
BIT
(
8
);
}
...
...
@@ -1395,7 +1395,7 @@ static void iwlagn_chain_noise_reset(struct iwl_priv *priv)
priv
->
phy_calib_chain_noise_reset_cmd
);
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_PHY_CALIBRATION_CMD
,
CMD_SYNC
,
sizeof
(
cmd
),
&
cmd
);
0
,
sizeof
(
cmd
),
&
cmd
);
if
(
ret
)
IWL_ERR
(
priv
,
"Could not send REPLY_PHY_CALIBRATION_CMD
\n
"
);
...
...
drivers/net/wireless/iwlwifi/dvm/scan.c
浏览文件 @
d91a48cb
...
...
@@ -59,7 +59,7 @@ static int iwl_send_scan_abort(struct iwl_priv *priv)
int
ret
;
struct
iwl_host_cmd
cmd
=
{
.
id
=
REPLY_SCAN_ABORT_CMD
,
.
flags
=
CMD_
SYNC
|
CMD_
WANT_SKB
,
.
flags
=
CMD_WANT_SKB
,
};
__le32
*
status
;
...
...
@@ -639,7 +639,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
struct
iwl_host_cmd
cmd
=
{
.
id
=
REPLY_SCAN_CMD
,
.
len
=
{
sizeof
(
struct
iwl_scan_cmd
),
},
.
flags
=
CMD_SYNC
,
};
struct
iwl_scan_cmd
*
scan
;
struct
iwl_rxon_context
*
ctx
=
&
priv
->
contexts
[
IWL_RXON_CTX_BSS
];
...
...
drivers/net/wireless/iwlwifi/dvm/sta.c
浏览文件 @
d91a48cb
...
...
@@ -39,7 +39,7 @@ static int iwl_sta_ucode_activate(struct iwl_priv *priv, u8 sta_id)
lockdep_assert_held
(
&
priv
->
sta_lock
);
if
(
sta_id
>=
IWLAGN_STATION_COUNT
)
{
IWL_ERR
(
priv
,
"invalid sta_id %u"
,
sta_id
);
IWL_ERR
(
priv
,
"invalid sta_id %u
\n
"
,
sta_id
);
return
-
EINVAL
;
}
if
(
!
(
priv
->
stations
[
sta_id
].
used
&
IWL_STA_DRIVER_ACTIVE
))
...
...
@@ -165,7 +165,7 @@ int iwl_send_add_sta(struct iwl_priv *priv,
iwl_free_resp
(
&
cmd
);
if
(
cmd
.
handler_status
)
IWL_ERR
(
priv
,
"%s - error in the CMD response %d"
,
__func__
,
IWL_ERR
(
priv
,
"%s - error in the CMD response %d
\n
"
,
__func__
,
cmd
.
handler_status
);
return
cmd
.
handler_status
;
...
...
@@ -261,7 +261,7 @@ int iwl_sta_update_ht(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
cmd
.
station_flags
=
flags
;
cmd
.
sta
.
sta_id
=
sta_id
;
return
iwl_send_add_sta
(
priv
,
&
cmd
,
CMD_SYNC
);
return
iwl_send_add_sta
(
priv
,
&
cmd
,
0
);
}
static
void
iwl_set_ht_add_station
(
struct
iwl_priv
*
priv
,
u8
index
,
...
...
@@ -413,7 +413,7 @@ int iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
spin_unlock_bh
(
&
priv
->
sta_lock
);
/* Add station to device's station table */
ret
=
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
CMD_SYNC
);
ret
=
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
0
);
if
(
ret
)
{
spin_lock_bh
(
&
priv
->
sta_lock
);
IWL_ERR
(
priv
,
"Adding station %pM failed.
\n
"
,
...
...
@@ -456,7 +456,6 @@ static int iwl_send_remove_station(struct iwl_priv *priv,
struct
iwl_host_cmd
cmd
=
{
.
id
=
REPLY_REMOVE_STA
,
.
len
=
{
sizeof
(
struct
iwl_rem_sta_cmd
),
},
.
flags
=
CMD_SYNC
,
.
data
=
{
&
rm_sta_cmd
,
},
};
...
...
@@ -740,7 +739,7 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
send_lq
=
true
;
}
spin_unlock_bh
(
&
priv
->
sta_lock
);
ret
=
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
CMD_SYNC
);
ret
=
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
0
);
if
(
ret
)
{
spin_lock_bh
(
&
priv
->
sta_lock
);
IWL_ERR
(
priv
,
"Adding station %pM failed.
\n
"
,
...
...
@@ -756,8 +755,7 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
* current LQ command
*/
if
(
send_lq
)
iwl_send_lq_cmd
(
priv
,
ctx
,
&
lq
,
CMD_SYNC
,
true
);
iwl_send_lq_cmd
(
priv
,
ctx
,
&
lq
,
0
,
true
);
spin_lock_bh
(
&
priv
->
sta_lock
);
priv
->
stations
[
i
].
used
&=
~
IWL_STA_UCODE_INPROGRESS
;
}
...
...
@@ -968,7 +966,7 @@ int iwlagn_add_bssid_station(struct iwl_priv *priv,
return
-
ENOMEM
;
}
ret
=
iwl_send_lq_cmd
(
priv
,
ctx
,
link_cmd
,
CMD_SYNC
,
true
);
ret
=
iwl_send_lq_cmd
(
priv
,
ctx
,
link_cmd
,
0
,
true
);
if
(
ret
)
IWL_ERR
(
priv
,
"Link quality command failed (%d)
\n
"
,
ret
);
...
...
@@ -999,7 +997,6 @@ static int iwl_send_static_wepkey_cmd(struct iwl_priv *priv,
struct
iwl_host_cmd
cmd
=
{
.
id
=
ctx
->
wep_key_cmd
,
.
data
=
{
wep_cmd
,
},
.
flags
=
CMD_SYNC
,
};
might_sleep
();
...
...
@@ -1248,7 +1245,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
sta_cmd
.
sta
.
modify_mask
=
STA_MODIFY_KEY_MASK
;
sta_cmd
.
mode
=
STA_CONTROL_MODIFY_MSK
;
return
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
CMD_SYNC
);
return
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
0
);
}
int
iwl_set_dynamic_key
(
struct
iwl_priv
*
priv
,
...
...
@@ -1284,13 +1281,13 @@ int iwl_set_dynamic_key(struct iwl_priv *priv,
ieee80211_get_key_rx_seq
(
keyconf
,
0
,
&
seq
);
ieee80211_get_tkip_rx_p1k
(
keyconf
,
addr
,
seq
.
tkip
.
iv32
,
p1k
);
ret
=
iwlagn_send_sta_key
(
priv
,
keyconf
,
sta_id
,
seq
.
tkip
.
iv32
,
p1k
,
CMD_SYNC
);
seq
.
tkip
.
iv32
,
p1k
,
0
);
break
;
case
WLAN_CIPHER_SUITE_CCMP
:
case
WLAN_CIPHER_SUITE_WEP40
:
case
WLAN_CIPHER_SUITE_WEP104
:
ret
=
iwlagn_send_sta_key
(
priv
,
keyconf
,
sta_id
,
0
,
NULL
,
CMD_SYNC
);
0
,
NULL
,
0
);
break
;
default:
IWL_ERR
(
priv
,
"Unknown cipher %x
\n
"
,
keyconf
->
cipher
);
...
...
@@ -1409,7 +1406,7 @@ int iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid)
memcpy
(
&
sta_cmd
,
&
priv
->
stations
[
sta_id
].
sta
,
sizeof
(
struct
iwl_addsta_cmd
));
spin_unlock_bh
(
&
priv
->
sta_lock
);
return
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
CMD_SYNC
);
return
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
0
);
}
int
iwl_sta_rx_agg_start
(
struct
iwl_priv
*
priv
,
struct
ieee80211_sta
*
sta
,
...
...
@@ -1433,7 +1430,7 @@ int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
memcpy
(
&
sta_cmd
,
&
priv
->
stations
[
sta_id
].
sta
,
sizeof
(
struct
iwl_addsta_cmd
));
spin_unlock_bh
(
&
priv
->
sta_lock
);
return
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
CMD_SYNC
);
return
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
0
);
}
int
iwl_sta_rx_agg_stop
(
struct
iwl_priv
*
priv
,
struct
ieee80211_sta
*
sta
,
...
...
@@ -1458,7 +1455,7 @@ int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
memcpy
(
&
sta_cmd
,
&
priv
->
stations
[
sta_id
].
sta
,
sizeof
(
struct
iwl_addsta_cmd
));
spin_unlock_bh
(
&
priv
->
sta_lock
);
return
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
CMD_SYNC
);
return
iwl_send_add_sta
(
priv
,
&
sta_cmd
,
0
);
}
...
...
drivers/net/wireless/iwlwifi/dvm/tt.c
浏览文件 @
d91a48cb
...
...
@@ -236,7 +236,7 @@ static void iwl_prepare_ct_kill_task(struct iwl_priv *priv)
{
IWL_DEBUG_TEMP
(
priv
,
"Prepare to enter IWL_TI_CT_KILL
\n
"
);
/* make request to retrieve statistics information */
iwl_send_statistics_request
(
priv
,
CMD_SYNC
,
false
);
iwl_send_statistics_request
(
priv
,
0
,
false
);
/* Reschedule the ct_kill wait timer */
mod_timer
(
&
priv
->
thermal_throttle
.
ct_kill_waiting_tm
,
jiffies
+
msecs_to_jiffies
(
CT_KILL_WAITING_DURATION
));
...
...
drivers/net/wireless/iwlwifi/dvm/tx.c
浏览文件 @
d91a48cb
...
...
@@ -402,10 +402,10 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
/* aggregation is on for this <sta,tid> */
if
(
info
->
flags
&
IEEE80211_TX_CTL_AMPDU
&&
tid_data
->
agg
.
state
!=
IWL_AGG_ON
)
{
IWL_ERR
(
priv
,
"TX_CTL_AMPDU while not in AGG:"
"
Tx flags = 0x%08x, agg.state = %d
"
,
IWL_ERR
(
priv
,
"
TX_CTL_AMPDU while not in AGG: Tx flags = 0x%08x, agg.state = %d
\n
"
,
info
->
flags
,
tid_data
->
agg
.
state
);
IWL_ERR
(
priv
,
"sta_id = %d, tid = %d seq_num = %d"
,
IWL_ERR
(
priv
,
"sta_id = %d, tid = %d seq_num = %d
\n
"
,
sta_id
,
tid
,
IEEE80211_SEQ_TO_SN
(
tid_data
->
seq_number
));
goto
drop_unlock_sta
;
...
...
@@ -416,7 +416,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
*/
if
(
WARN_ONCE
(
tid_data
->
agg
.
state
!=
IWL_AGG_ON
&&
tid_data
->
agg
.
state
!=
IWL_AGG_OFF
,
"Tx while agg.state = %d
"
,
tid_data
->
agg
.
state
))
"Tx while agg.state = %d
\n
"
,
tid_data
->
agg
.
state
))
goto
drop_unlock_sta
;
seq_number
=
tid_data
->
seq_number
;
...
...
@@ -778,8 +778,8 @@ static void iwlagn_check_ratid_empty(struct iwl_priv *priv, int sta_id, u8 tid)
/* There are no packets for this RA / TID in the HW any more */
if
(
tid_data
->
agg
.
ssn
==
tid_data
->
next_reclaimed
)
{
IWL_DEBUG_TX_QUEUES
(
priv
,
"Can continue DELBA flow ssn = next_recl =
"
" %d"
,
tid_data
->
next_reclaimed
);
"Can continue DELBA flow ssn = next_recl =
%d
\n
"
,
tid_data
->
next_reclaimed
);
iwl_trans_txq_disable
(
priv
->
trans
,
tid_data
->
agg
.
txq_id
);
iwlagn_dealloc_agg_txq
(
priv
,
tid_data
->
agg
.
txq_id
);
...
...
@@ -791,8 +791,8 @@ static void iwlagn_check_ratid_empty(struct iwl_priv *priv, int sta_id, u8 tid)
/* There are no packets for this RA / TID in the HW any more */
if
(
tid_data
->
agg
.
ssn
==
tid_data
->
next_reclaimed
)
{
IWL_DEBUG_TX_QUEUES
(
priv
,
"Can continue ADDBA flow ssn = next_recl =
"
" %d"
,
tid_data
->
next_reclaimed
);
"Can continue ADDBA flow ssn = next_recl =
%d
\n
"
,
tid_data
->
next_reclaimed
);
tid_data
->
agg
.
state
=
IWL_AGG_STARTING
;
ieee80211_start_tx_ba_cb_irqsafe
(
vif
,
addr
,
tid
);
}
...
...
@@ -1216,8 +1216,8 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
ctx
->
vif
->
type
==
NL80211_IFTYPE_STATION
)
{
/* block and stop all queues */
priv
->
passive_no_rx
=
true
;
IWL_DEBUG_TX_QUEUES
(
priv
,
"stop all queues: "
"passive channel
"
);
IWL_DEBUG_TX_QUEUES
(
priv
,
"stop all queues: passive channel
\n
"
);
ieee80211_stop_queues
(
priv
->
hw
);
IWL_DEBUG_TX_REPLY
(
priv
,
...
...
@@ -1271,7 +1271,7 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
while
(
!
skb_queue_empty
(
&
skbs
))
{
skb
=
__skb_dequeue
(
&
skbs
);
ieee80211_tx_status
_ni
(
priv
->
hw
,
skb
);
ieee80211_tx_status
(
priv
->
hw
,
skb
);
}
return
0
;
...
...
@@ -1411,7 +1411,7 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
while
(
!
skb_queue_empty
(
&
reclaimed_skbs
))
{
skb
=
__skb_dequeue
(
&
reclaimed_skbs
);
ieee80211_tx_status
_ni
(
priv
->
hw
,
skb
);
ieee80211_tx_status
(
priv
->
hw
,
skb
);
}
return
0
;
...
...
drivers/net/wireless/iwlwifi/dvm/ucode.c
浏览文件 @
d91a48cb
...
...
@@ -172,7 +172,7 @@ static int iwl_send_wimax_coex(struct iwl_priv *priv)
memset
(
&
coex_cmd
,
0
,
sizeof
(
coex_cmd
));
return
iwl_dvm_send_cmd_pdu
(
priv
,
COEX_PRIORITY_TABLE_CMD
,
CMD_SYNC
,
COEX_PRIORITY_TABLE_CMD
,
0
,
sizeof
(
coex_cmd
),
&
coex_cmd
);
}
...
...
@@ -205,7 +205,7 @@ void iwl_send_prio_tbl(struct iwl_priv *priv)
memcpy
(
prio_tbl_cmd
.
prio_tbl
,
iwl_bt_prio_tbl
,
sizeof
(
iwl_bt_prio_tbl
));
if
(
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_BT_COEX_PRIO_TABLE
,
CMD_SYNC
,
REPLY_BT_COEX_PRIO_TABLE
,
0
,
sizeof
(
prio_tbl_cmd
),
&
prio_tbl_cmd
))
IWL_ERR
(
priv
,
"failed to send BT prio tbl command
\n
"
);
}
...
...
@@ -218,7 +218,7 @@ int iwl_send_bt_env(struct iwl_priv *priv, u8 action, u8 type)
env_cmd
.
action
=
action
;
env_cmd
.
type
=
type
;
ret
=
iwl_dvm_send_cmd_pdu
(
priv
,
REPLY_BT_COEX_PROT_ENV
,
CMD_SYNC
,
REPLY_BT_COEX_PROT_ENV
,
0
,
sizeof
(
env_cmd
),
&
env_cmd
);
if
(
ret
)
IWL_ERR
(
priv
,
"failed to send BT env command
\n
"
);
...
...
drivers/net/wireless/iwlwifi/iwl-8000.c
浏览文件 @
d91a48cb
...
...
@@ -83,6 +83,7 @@
#define IWL8000_MODULE_FIRMWARE(api) IWL8000_FW_PRE __stringify(api) ".ucode"
#define NVM_HW_SECTION_NUM_FAMILY_8000 10
#define DEFAULT_NVM_FILE_FAMILY_8000 "iwl_nvm_8000.bin"
static
const
struct
iwl_base_params
iwl8000_base_params
=
{
.
eeprom_size
=
OTP_LOW_IMAGE_SIZE_FAMILY_8000
,
...
...
@@ -118,6 +119,7 @@ const struct iwl_cfg iwl8260_2ac_cfg = {
.
ht_params
=
&
iwl8000_ht_params
,
.
nvm_ver
=
IWL8000_NVM_VERSION
,
.
nvm_calib_ver
=
IWL8000_TX_POWER_VERSION
,
.
default_nvm_file
=
DEFAULT_NVM_FILE_FAMILY_8000
,
};
const
struct
iwl_cfg
iwl8260_n_cfg
=
{
...
...
@@ -127,6 +129,7 @@ const struct iwl_cfg iwl8260_n_cfg = {
.
ht_params
=
&
iwl8000_ht_params
,
.
nvm_ver
=
IWL8000_NVM_VERSION
,
.
nvm_calib_ver
=
IWL8000_TX_POWER_VERSION
,
.
default_nvm_file
=
DEFAULT_NVM_FILE_FAMILY_8000
,
};
MODULE_FIRMWARE
(
IWL8000_MODULE_FIRMWARE
(
IWL8000_UCODE_API_OK
));
drivers/net/wireless/iwlwifi/iwl-config.h
浏览文件 @
d91a48cb
...
...
@@ -195,7 +195,7 @@ struct iwl_ht_params {
/* lower blocks contain EEPROM image and calibration data */
#define OTP_LOW_IMAGE_SIZE (2 * 512 * sizeof(u16))
/* 2 KB */
#define OTP_LOW_IMAGE_SIZE_FAMILY_7000 (
4 * 512 * sizeof(u16))
/* 4
KB */
#define OTP_LOW_IMAGE_SIZE_FAMILY_7000 (
16 * 512 * sizeof(u16))
/* 16
KB */
#define OTP_LOW_IMAGE_SIZE_FAMILY_8000 (32 * 512 * sizeof(u16))
/* 32 KB */
struct
iwl_eeprom_params
{
...
...
@@ -275,6 +275,7 @@ struct iwl_cfg {
bool
lp_xtal_workaround
;
const
struct
iwl_pwr_tx_backoff
*
pwr_tx_backoffs
;
bool
no_power_up_nic_in_init
;
const
char
*
default_nvm_file
;
};
/*
...
...
drivers/net/wireless/iwlwifi/iwl-debug.c
浏览文件 @
d91a48cb
...
...
@@ -61,8 +61,6 @@
*
*****************************************************************************/
#define DEBUG
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/export.h>
...
...
@@ -128,8 +126,8 @@ void __iwl_dbg(struct device *dev,
#ifdef CONFIG_IWLWIFI_DEBUG
if
(
iwl_have_debug_level
(
level
)
&&
(
!
limit
||
net_ratelimit
()))
dev_
dbg
(
dev
,
"%c %s %pV"
,
in_interrupt
()
?
'I'
:
'U'
,
function
,
&
vaf
);
dev_
printk
(
KERN_DEBUG
,
dev
,
"%c %s %pV"
,
in_interrupt
()
?
'I'
:
'U'
,
function
,
&
vaf
);
#endif
trace_iwlwifi_dbg
(
level
,
in_interrupt
(),
function
,
&
vaf
);
va_end
(
args
);
...
...
drivers/net/wireless/iwlwifi/iwl-debug.h
浏览文件 @
d91a48cb
...
...
@@ -47,12 +47,32 @@ void __iwl_warn(struct device *dev, const char *fmt, ...) __printf(2, 3);
void
__iwl_info
(
struct
device
*
dev
,
const
char
*
fmt
,
...)
__printf
(
2
,
3
);
void
__iwl_crit
(
struct
device
*
dev
,
const
char
*
fmt
,
...)
__printf
(
2
,
3
);
/* not all compilers can evaluate strlen() at compile time, so use sizeof() */
#define CHECK_FOR_NEWLINE(f) BUILD_BUG_ON(f[sizeof(f) - 2] != '\n')
/* No matter what is m (priv, bus, trans), this will work */
#define IWL_ERR(m, f, a...) __iwl_err((m)->dev, false, false, f, ## a)
#define IWL_ERR_DEV(d, f, a...) __iwl_err((d), false, false, f, ## a)
#define IWL_WARN(m, f, a...) __iwl_warn((m)->dev, f, ## a)
#define IWL_INFO(m, f, a...) __iwl_info((m)->dev, f, ## a)
#define IWL_CRIT(m, f, a...) __iwl_crit((m)->dev, f, ## a)
#define IWL_ERR_DEV(d, f, a...) \
do { \
CHECK_FOR_NEWLINE(f); \
__iwl_err((d), false, false, f, ## a); \
} while (0)
#define IWL_ERR(m, f, a...) \
IWL_ERR_DEV((m)->dev, f, ## a)
#define IWL_WARN(m, f, a...) \
do { \
CHECK_FOR_NEWLINE(f); \
__iwl_warn((m)->dev, f, ## a); \
} while (0)
#define IWL_INFO(m, f, a...) \
do { \
CHECK_FOR_NEWLINE(f); \
__iwl_info((m)->dev, f, ## a); \
} while (0)
#define IWL_CRIT(m, f, a...) \
do { \
CHECK_FOR_NEWLINE(f); \
__iwl_crit((m)->dev, f, ## a); \
} while (0)
#if defined(CONFIG_IWLWIFI_DEBUG) || defined(CONFIG_IWLWIFI_DEVICE_TRACING)
void
__iwl_dbg
(
struct
device
*
dev
,
...
...
@@ -72,12 +92,17 @@ do { \
DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \
} while (0)
#define __IWL_DEBUG_DEV(dev, level, limit, fmt, args...) \
do { \
CHECK_FOR_NEWLINE(fmt); \
__iwl_dbg(dev, level, limit, __func__, fmt, ##args); \
} while (0)
#define IWL_DEBUG(m, level, fmt, args...) \
__
iwl_dbg((m)->dev, level, false, __func__
, fmt, ##args)
__
IWL_DEBUG_DEV((m)->dev, level, false
, fmt, ##args)
#define IWL_DEBUG_DEV(dev, level, fmt, args...) \
__
iwl_dbg((dev), level, false, __func__
, fmt, ##args)
__
IWL_DEBUG_DEV(dev, level, false
, fmt, ##args)
#define IWL_DEBUG_LIMIT(m, level, fmt, args...) \
__
iwl_dbg((m)->dev, level, true, __func__
, fmt, ##args)
__
IWL_DEBUG_DEV((m)->dev, level, true
, fmt, ##args)
#ifdef CONFIG_IWLWIFI_DEBUG
#define iwl_print_hex_dump(m, level, p, len) \
...
...
drivers/net/wireless/iwlwifi/iwl-drv.c
浏览文件 @
d91a48cb
...
...
@@ -1243,6 +1243,7 @@ struct iwl_mod_params iwlwifi_mod_params = {
.
bt_coex_active
=
true
,
.
power_level
=
IWL_POWER_INDEX_1
,
.
wd_disable
=
true
,
.
uapsd_disable
=
false
,
/* the rest are 0 by default */
};
IWL_EXPORT_SYMBOL
(
iwlwifi_mod_params
);
...
...
@@ -1356,6 +1357,10 @@ MODULE_PARM_DESC(wd_disable,
module_param_named
(
nvm_file
,
iwlwifi_mod_params
.
nvm_file
,
charp
,
S_IRUGO
);
MODULE_PARM_DESC
(
nvm_file
,
"NVM file name"
);
module_param_named
(
uapsd_disable
,
iwlwifi_mod_params
.
uapsd_disable
,
bool
,
S_IRUGO
);
MODULE_PARM_DESC
(
uapsd_disable
,
"disable U-APSD functionality (default: N)"
);
/*
* set bt_coex_active to true, uCode will do kill/defer
* every time the priority line is asserted (BT is sending signals on the
...
...
drivers/net/wireless/iwlwifi/iwl-fw.h
浏览文件 @
d91a48cb
...
...
@@ -74,7 +74,7 @@
* @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
* @IWL_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P.
* @IWL_UCODE_TLV_FLAGS_DW_BC_TABLE: The SCD byte count table is in DWORDS
* @IWL_UCODE_TLV_FLAGS_UAPSD: This uCode image supports uAPSD
* @IWL_UCODE_TLV_FLAGS_UAPSD
_SUPPORT
: This uCode image supports uAPSD
* @IWL_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan
* offload profile config command.
* @IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six
...
...
@@ -107,6 +107,7 @@ enum iwl_ucode_tlv_flag {
IWL_UCODE_TLV_FLAGS_P2P_PM
=
BIT
(
21
),
IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_DCM
=
BIT
(
22
),
IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_SCM
=
BIT
(
23
),
IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT
=
BIT
(
24
),
IWL_UCODE_TLV_FLAGS_EBS_SUPPORT
=
BIT
(
25
),
IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD
=
BIT
(
26
),
IWL_UCODE_TLV_FLAGS_BCAST_FILTERING
=
BIT
(
29
),
...
...
@@ -196,6 +197,11 @@ struct fw_img {
bool
is_dual_cpus
;
};
struct
iwl_sf_region
{
u32
addr
;
u32
size
;
};
/* uCode version contains 4 values: Major/Minor/API/Serial */
#define IWL_UCODE_MAJOR(ver) (((ver) & 0xFF000000) >> 24)
#define IWL_UCODE_MINOR(ver) (((ver) & 0x00FF0000) >> 16)
...
...
drivers/net/wireless/iwlwifi/iwl-io.c
浏览文件 @
d91a48cb
...
...
@@ -33,6 +33,7 @@
#include "iwl-io.h"
#include "iwl-csr.h"
#include "iwl-debug.h"
#include "iwl-prph.h"
#include "iwl-fh.h"
#define IWL_POLL_INTERVAL 10
/* microseconds */
...
...
@@ -183,6 +184,23 @@ void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask)
}
IWL_EXPORT_SYMBOL
(
iwl_clear_bits_prph
);
void
iwl_force_nmi
(
struct
iwl_trans
*
trans
)
{
/*
* In HW previous to the 8000 HW family, and in the 8000 HW family
* itself when the revision step==0, the DEVICE_SET_NMI_REG is used
* to force an NMI. Otherwise, a different register -
* DEVICE_SET_NMI_8000B_REG - is used.
*/
if
((
trans
->
cfg
->
device_family
!=
IWL_DEVICE_FAMILY_8000
)
||
((
trans
->
hw_rev
&
0xc
)
==
0x0
))
iwl_write_prph
(
trans
,
DEVICE_SET_NMI_REG
,
DEVICE_SET_NMI_VAL
);
else
iwl_write_prph
(
trans
,
DEVICE_SET_NMI_8000B_REG
,
DEVICE_SET_NMI_8000B_VAL
);
}
IWL_EXPORT_SYMBOL
(
iwl_force_nmi
);
static
const
char
*
get_fh_string
(
int
cmd
)
{
#define IWL_CMD(x) case x: return #x
...
...
drivers/net/wireless/iwlwifi/iwl-io.h
浏览文件 @
d91a48cb
...
...
@@ -80,6 +80,7 @@ void iwl_set_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask);
void
iwl_set_bits_mask_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
bits
,
u32
mask
);
void
iwl_clear_bits_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
mask
);
void
iwl_force_nmi
(
struct
iwl_trans
*
trans
);
/* Error handling */
int
iwl_dump_fh
(
struct
iwl_trans
*
trans
,
char
**
buf
);
...
...
drivers/net/wireless/iwlwifi/iwl-modparams.h
浏览文件 @
d91a48cb
...
...
@@ -119,6 +119,7 @@ struct iwl_mod_params {
#endif
int
ant_coupling
;
char
*
nvm_file
;
bool
uapsd_disable
;
};
#endif
/* #__iwl_modparams_h__ */
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
浏览文件 @
d91a48cb
...
...
@@ -128,7 +128,7 @@ static const u8 iwl_nvm_channels[] = {
static
const
u8
iwl_nvm_channels_family_8000
[]
=
{
/* 2.4 GHz */
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
/* 5 GHz */
36
,
40
,
44
,
48
,
52
,
56
,
60
,
64
,
68
,
72
,
76
,
80
,
84
,
88
,
92
,
96
,
100
,
104
,
108
,
112
,
116
,
120
,
124
,
128
,
132
,
136
,
140
,
144
,
...
...
@@ -138,7 +138,7 @@ static const u8 iwl_nvm_channels_family_8000[] = {
#define IWL_NUM_CHANNELS ARRAY_SIZE(iwl_nvm_channels)
#define IWL_NUM_CHANNELS_FAMILY_8000 ARRAY_SIZE(iwl_nvm_channels_family_8000)
#define NUM_2GHZ_CHANNELS 14
#define NUM_2GHZ_CHANNELS_FAMILY_8000 1
3
#define NUM_2GHZ_CHANNELS_FAMILY_8000 1
4
#define FIRST_2GHZ_HT_MINUS 5
#define LAST_2GHZ_HT_PLUS 9
#define LAST_5GHZ_HT 161
...
...
drivers/net/wireless/iwlwifi/iwl-phy-db.c
浏览文件 @
d91a48cb
...
...
@@ -345,7 +345,6 @@ static int iwl_send_phy_db_cmd(struct iwl_phy_db *phy_db, u16 type,
struct
iwl_phy_db_cmd
phy_db_cmd
;
struct
iwl_host_cmd
cmd
=
{
.
id
=
PHY_DB_CMD
,
.
flags
=
CMD_SYNC
,
};
IWL_DEBUG_INFO
(
phy_db
->
trans
,
...
...
@@ -393,13 +392,13 @@ static int iwl_phy_db_send_all_channel_groups(
entry
->
data
);
if
(
err
)
{
IWL_ERR
(
phy_db
->
trans
,
"Can't SEND phy_db section %d (%d), err %d"
,
"Can't SEND phy_db section %d (%d), err %d
\n
"
,
type
,
i
,
err
);
return
err
;
}
IWL_DEBUG_INFO
(
phy_db
->
trans
,
"Sent PHY_DB HCMD, type = %d num = %d"
,
"Sent PHY_DB HCMD, type = %d num = %d
\n
"
,
type
,
i
);
}
...
...
@@ -451,7 +450,7 @@ int iwl_send_phy_db_data(struct iwl_phy_db *phy_db)
IWL_NUM_PAPD_CH_GROUPS
);
if
(
err
)
{
IWL_ERR
(
phy_db
->
trans
,
"Cannot send channel specific PAPD groups"
);
"Cannot send channel specific PAPD groups
\n
"
);
return
err
;
}
...
...
@@ -461,7 +460,7 @@ int iwl_send_phy_db_data(struct iwl_phy_db *phy_db)
IWL_NUM_TXP_CH_GROUPS
);
if
(
err
)
{
IWL_ERR
(
phy_db
->
trans
,
"Cannot send channel specific TX power groups"
);
"Cannot send channel specific TX power groups
\n
"
);
return
err
;
}
...
...
drivers/net/wireless/iwlwifi/iwl-prph.h
浏览文件 @
d91a48cb
...
...
@@ -105,6 +105,9 @@
/* Device NMI register */
#define DEVICE_SET_NMI_REG 0x00a01c30
#define DEVICE_SET_NMI_VAL 0x1
#define DEVICE_SET_NMI_8000B_REG 0x00a01c24
#define DEVICE_SET_NMI_8000B_VAL 0x1000000
/* Shared registers (0x0..0x3ff, via target indirect or periphery */
#define SHR_BASE 0x00a10000
...
...
drivers/net/wireless/iwlwifi/iwl-trans.h
浏览文件 @
d91a48cb
...
...
@@ -189,10 +189,9 @@ static inline u32 iwl_rx_packet_payload_len(const struct iwl_rx_packet *pkt)
/**
* enum CMD_MODE - how to send the host commands ?
*
* @CMD_SYNC: The caller will be stalled until the fw responds to the command
* @CMD_ASYNC: Return right away and don't wait for the response
* @CMD_WANT_SKB:
valid only with CMD_SYNC. The caller needs the buffer of the
* response. The caller needs to call iwl_free_resp when done.
* @CMD_WANT_SKB:
Not valid with CMD_ASYNC. The caller needs the buffer of
*
the
response. The caller needs to call iwl_free_resp when done.
* @CMD_HIGH_PRIO: The command is high priority - it goes to the front of the
* command queue, but after other high priority commands. valid only
* with CMD_ASYNC.
...
...
@@ -202,7 +201,6 @@ static inline u32 iwl_rx_packet_payload_len(const struct iwl_rx_packet *pkt)
* (i.e. mark it as non-idle).
*/
enum
CMD_MODE
{
CMD_SYNC
=
0
,
CMD_ASYNC
=
BIT
(
0
),
CMD_WANT_SKB
=
BIT
(
1
),
CMD_SEND_IN_RFKILL
=
BIT
(
2
),
...
...
@@ -427,7 +425,7 @@ struct iwl_trans;
* @send_cmd:send a host command. Must return -ERFKILL if RFkill is asserted.
* If RFkill is asserted in the middle of a SYNC host command, it must
* return -ERFKILL straight away.
* May sleep only if CMD_
SYNC is
set
* May sleep only if CMD_
ASYNC is not
set
* @tx: send an skb
* Must be atomic
* @reclaim: free packet until ssn. Returns a list of freed packets.
...
...
@@ -475,6 +473,8 @@ struct iwl_trans_ops {
void
(
*
op_mode_leave
)(
struct
iwl_trans
*
iwl_trans
);
int
(
*
start_fw
)(
struct
iwl_trans
*
trans
,
const
struct
fw_img
*
fw
,
bool
run_in_rfkill
);
int
(
*
update_sf
)(
struct
iwl_trans
*
trans
,
struct
iwl_sf_region
*
st_fwrd_space
);
void
(
*
fw_alive
)(
struct
iwl_trans
*
trans
,
u32
scd_addr
);
void
(
*
stop_device
)(
struct
iwl_trans
*
trans
);
...
...
@@ -638,6 +638,17 @@ static inline int iwl_trans_start_fw(struct iwl_trans *trans,
return
trans
->
ops
->
start_fw
(
trans
,
fw
,
run_in_rfkill
);
}
static
inline
int
iwl_trans_update_sf
(
struct
iwl_trans
*
trans
,
struct
iwl_sf_region
*
st_fwrd_space
)
{
might_sleep
();
if
(
trans
->
ops
->
update_sf
)
return
trans
->
ops
->
update_sf
(
trans
,
st_fwrd_space
);
return
0
;
}
static
inline
void
iwl_trans_stop_device
(
struct
iwl_trans
*
trans
)
{
might_sleep
();
...
...
@@ -696,7 +707,7 @@ static inline int iwl_trans_send_cmd(struct iwl_trans *trans,
return
-
EIO
;
if
(
unlikely
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
))
{
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
IWL_ERR
(
trans
,
"%s bad state = %d
\n
"
,
__func__
,
trans
->
state
);
return
-
EIO
;
}
...
...
@@ -738,7 +749,7 @@ static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb,
return
-
EIO
;
if
(
unlikely
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
))
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
IWL_ERR
(
trans
,
"%s bad state = %d
\n
"
,
__func__
,
trans
->
state
);
return
trans
->
ops
->
tx
(
trans
,
skb
,
dev_cmd
,
queue
);
}
...
...
@@ -747,7 +758,7 @@ static inline void iwl_trans_reclaim(struct iwl_trans *trans, int queue,
int
ssn
,
struct
sk_buff_head
*
skbs
)
{
if
(
unlikely
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
))
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
IWL_ERR
(
trans
,
"%s bad state = %d
\n
"
,
__func__
,
trans
->
state
);
trans
->
ops
->
reclaim
(
trans
,
queue
,
ssn
,
skbs
);
}
...
...
@@ -764,7 +775,7 @@ static inline void iwl_trans_txq_enable(struct iwl_trans *trans, int queue,
might_sleep
();
if
(
unlikely
((
trans
->
state
!=
IWL_TRANS_FW_ALIVE
)))
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
IWL_ERR
(
trans
,
"%s bad state = %d
\n
"
,
__func__
,
trans
->
state
);
trans
->
ops
->
txq_enable
(
trans
,
queue
,
fifo
,
sta_id
,
tid
,
frame_limit
,
ssn
);
...
...
@@ -781,7 +792,7 @@ static inline int iwl_trans_wait_tx_queue_empty(struct iwl_trans *trans,
u32
txq_bm
)
{
if
(
unlikely
(
trans
->
state
!=
IWL_TRANS_FW_ALIVE
))
IWL_ERR
(
trans
,
"%s bad state = %d"
,
__func__
,
trans
->
state
);
IWL_ERR
(
trans
,
"%s bad state = %d
\n
"
,
__func__
,
trans
->
state
);
return
trans
->
ops
->
wait_tx_queue_empty
(
trans
,
txq_bm
);
}
...
...
drivers/net/wireless/iwlwifi/mvm/coex.c
浏览文件 @
d91a48cb
...
...
@@ -106,7 +106,7 @@ static const u8 iwl_bt_prio_tbl[BT_COEX_PRIO_TBL_EVT_MAX] = {
static
int
iwl_send_bt_prio_tbl
(
struct
iwl_mvm
*
mvm
)
{
return
iwl_mvm_send_cmd_pdu
(
mvm
,
BT_COEX_PRIO_TABLE
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
BT_COEX_PRIO_TABLE
,
0
,
sizeof
(
struct
iwl_bt_coex_prio_tbl_cmd
),
&
iwl_bt_prio_tbl
);
}
...
...
@@ -124,10 +124,10 @@ const u32 iwl_bt_cts_kill_msk[BT_KILL_MSK_MAX] = {
};
static
const
__le32
iwl_bt_prio_boost
[
BT_COEX_BOOST_SIZE
]
=
{
cpu_to_le32
(
0xf0f0f0f0
),
cpu_to_le32
(
0xc0c0c0c0
),
cpu_to_le32
(
0xfcfcfcfc
),
cpu_to_le32
(
0xf
f00ff00
),
cpu_to_le32
(
0xf0f0f0f0
),
/* 50% */
cpu_to_le32
(
0xc0c0c0c0
),
/* 25% */
cpu_to_le32
(
0xfcfcfcfc
),
/* 75% */
cpu_to_le32
(
0xf
efefefe
),
/* 87.5% */
};
static
const
__le32
iwl_single_shared_ant
[
BT_COEX_MAX_LUT
][
BT_COEX_LUT_SIZE
]
=
{
...
...
@@ -300,8 +300,8 @@ static const __le64 iwl_ci_mask[][3] = {
};
static
const
__le32
iwl_bt_mprio_lut
[
BT_COEX_MULTI_PRIO_LUT_SIZE
]
=
{
cpu_to_le32
(
0x2
2002200
),
cpu_to_le32
(
0x
3311331
1
),
cpu_to_le32
(
0x2
8412201
),
cpu_to_le32
(
0x
1111845
1
),
};
struct
corunning_block_luts
{
...
...
@@ -565,7 +565,6 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
.
id
=
BT_CONFIG
,
.
len
=
{
sizeof
(
*
bt_cmd
),
},
.
dataflags
=
{
IWL_HCMD_DFL_NOCOPY
,
},
.
flags
=
CMD_SYNC
,
};
int
ret
;
u32
flags
;
...
...
@@ -663,7 +662,6 @@ static int iwl_mvm_bt_udpate_ctrl_kill_msk(struct iwl_mvm *mvm,
.
data
[
0
]
=
&
bt_cmd
,
.
len
=
{
sizeof
(
*
bt_cmd
),
},
.
dataflags
=
{
IWL_HCMD_DFL_NOCOPY
,
},
.
flags
=
CMD_SYNC
,
};
int
ret
=
0
;
...
...
@@ -803,23 +801,10 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
switch
(
vif
->
type
)
{
case
NL80211_IFTYPE_STATION
:
/* Count BSSes vifs */
data
->
num_bss_ifaces
++
;
/* default smps_mode for BSS / P2P client is AUTOMATIC */
smps_mode
=
IEEE80211_SMPS_AUTOMATIC
;
data
->
num_bss_ifaces
++
;
/*
* Count unassoc BSSes, relax SMSP constraints
* and disable reduced Tx Power
*/
if
(
!
vif
->
bss_conf
.
assoc
)
{
iwl_mvm_update_smps
(
mvm
,
vif
,
IWL_MVM_SMPS_REQ_BT_COEX
,
smps_mode
);
if
(
iwl_mvm_bt_coex_reduced_txp
(
mvm
,
mvmvif
->
ap_sta_id
,
false
))
IWL_ERR
(
mvm
,
"Couldn't send BT_CONFIG cmd
\n
"
);
return
;
}
break
;
case
NL80211_IFTYPE_AP
:
/* default smps_mode for AP / GO is OFF */
...
...
@@ -845,6 +830,7 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
/* ... relax constraints and disable rssi events */
iwl_mvm_update_smps
(
mvm
,
vif
,
IWL_MVM_SMPS_REQ_BT_COEX
,
smps_mode
);
data
->
reduced_tx_power
=
false
;
if
(
vif
->
type
==
NL80211_IFTYPE_STATION
)
iwl_mvm_bt_coex_enable_rssi_event
(
mvm
,
vif
,
false
,
0
);
return
;
...
...
@@ -857,6 +843,11 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
smps_mode
=
vif
->
type
==
NL80211_IFTYPE_AP
?
IEEE80211_SMPS_OFF
:
IEEE80211_SMPS_DYNAMIC
;
/* relax SMPS contraints for next association */
if
(
!
vif
->
bss_conf
.
assoc
)
smps_mode
=
IEEE80211_SMPS_AUTOMATIC
;
IWL_DEBUG_COEX
(
data
->
mvm
,
"mac %d: bt_status %d bt_activity_grading %d smps_req %d
\n
"
,
mvmvif
->
id
,
data
->
notif
->
bt_status
,
bt_activity_grading
,
...
...
@@ -903,26 +894,21 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
/* if secondary is not NULL, it might be a GO */
data
->
secondary
=
chanctx_conf
;
/* don't reduce the Tx power if in loose scheme */
/*
* don't reduce the Tx power if one of these is true:
* we are in LOOSE
* single share antenna product
* BT is active
* we are associated
*/
if
(
iwl_get_coex_type
(
mvm
,
vif
)
==
BT_COEX_LOOSE_LUT
||
mvm
->
cfg
->
bt_shared_single_ant
)
{
mvm
->
cfg
->
bt_shared_single_ant
||
!
vif
->
bss_conf
.
assoc
||
!
data
->
notif
->
bt_status
)
{
data
->
reduced_tx_power
=
false
;
iwl_mvm_bt_coex_enable_rssi_event
(
mvm
,
vif
,
false
,
0
);
return
;
}
/* reduced Txpower only if BT is on, so ...*/
if
(
!
data
->
notif
->
bt_status
)
{
/* ... cancel reduced Tx power ... */
if
(
iwl_mvm_bt_coex_reduced_txp
(
mvm
,
mvmvif
->
ap_sta_id
,
false
))
IWL_ERR
(
mvm
,
"Couldn't send BT_CONFIG cmd
\n
"
);
data
->
reduced_tx_power
=
false
;
/* ... and there is no need to get reports on RSSI any more. */
iwl_mvm_bt_coex_enable_rssi_event
(
mvm
,
vif
,
false
,
0
);
return
;
}
/* try to get the avg rssi from fw */
ave_rssi
=
mvmvif
->
bf_data
.
ave_beacon_signal
;
...
...
@@ -1022,9 +1008,9 @@ static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm)
/* Don't spam the fw with the same command over and over */
if
(
memcmp
(
&
cmd
,
&
mvm
->
last_bt_ci_cmd
,
sizeof
(
cmd
)))
{
if
(
iwl_mvm_send_cmd_pdu
(
mvm
,
BT_COEX_CI
,
CMD_SYNC
,
if
(
iwl_mvm_send_cmd_pdu
(
mvm
,
BT_COEX_CI
,
0
,
sizeof
(
cmd
),
&
cmd
))
IWL_ERR
(
mvm
,
"Failed to send BT_CI cmd"
);
IWL_ERR
(
mvm
,
"Failed to send BT_CI cmd
\n
"
);
memcpy
(
&
mvm
->
last_bt_ci_cmd
,
&
cmd
,
sizeof
(
cmd
));
}
...
...
@@ -1039,7 +1025,6 @@ static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm)
IWL_ERR
(
mvm
,
"Failed to update the ctrl_kill_msk
\n
"
);
}
/* upon association, the fw will send in BT Coex notification */
int
iwl_mvm_rx_bt_coex_notif
(
struct
iwl_mvm
*
mvm
,
struct
iwl_rx_cmd_buffer
*
rxb
,
struct
iwl_device_cmd
*
dev_cmd
)
...
...
@@ -1278,7 +1263,6 @@ int iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,
.
id
=
BT_CONFIG
,
.
len
=
{
sizeof
(
*
bt_cmd
),
},
.
dataflags
=
{
IWL_HCMD_DFL_NOCOPY
,
},
.
flags
=
CMD_SYNC
,
};
if
(
!
IWL_MVM_BT_COEX_CORUNNING
)
...
...
drivers/net/wireless/iwlwifi/mvm/d3.c
浏览文件 @
d91a48cb
...
...
@@ -193,8 +193,7 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
wkc
.
wep_key
.
key_offset
=
data
->
wep_key_idx
;
}
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
WEP_KEY
,
CMD_SYNC
,
sizeof
(
wkc
),
&
wkc
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
WEP_KEY
,
0
,
sizeof
(
wkc
),
&
wkc
);
data
->
error
=
ret
!=
0
;
mvm
->
ptk_ivlen
=
key
->
iv_len
;
...
...
@@ -341,7 +340,6 @@ static int iwl_mvm_send_patterns(struct iwl_mvm *mvm,
struct
iwl_host_cmd
cmd
=
{
.
id
=
WOWLAN_PATTERNS
,
.
dataflags
[
0
]
=
IWL_HCMD_DFL_NOCOPY
,
.
flags
=
CMD_SYNC
,
};
int
i
,
err
;
...
...
@@ -518,7 +516,6 @@ static int iwl_mvm_send_remote_wake_cfg(struct iwl_mvm *mvm,
.
id
=
REMOTE_WAKE_CONFIG_CMD
,
.
len
=
{
sizeof
(
*
cfg
),
},
.
dataflags
=
{
IWL_HCMD_DFL_NOCOPY
,
},
.
flags
=
CMD_SYNC
,
};
int
ret
;
...
...
@@ -719,7 +716,7 @@ static int iwl_mvm_d3_reprogram(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
for
(
i
=
1
;
i
<
MAX_BINDINGS
;
i
++
)
quota_cmd
.
quotas
[
i
].
id_and_color
=
cpu_to_le32
(
FW_CTXT_INVALID
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
TIME_QUOTA_CMD
,
CMD_SYNC
,
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
TIME_QUOTA_CMD
,
0
,
sizeof
(
quota_cmd
),
&
quota_cmd
);
if
(
ret
)
IWL_ERR
(
mvm
,
"Failed to send quota: %d
\n
"
,
ret
);
...
...
@@ -739,7 +736,7 @@ static int iwl_mvm_get_last_nonqos_seq(struct iwl_mvm *mvm,
};
struct
iwl_host_cmd
cmd
=
{
.
id
=
NON_QOS_TX_COUNTER_CMD
,
.
flags
=
CMD_
SYNC
|
CMD_
WANT_SKB
,
.
flags
=
CMD_WANT_SKB
,
};
int
err
;
u32
size
;
...
...
@@ -781,7 +778,7 @@ void iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
mvmvif
->
seqno_valid
=
false
;
if
(
iwl_mvm_send_cmd_pdu
(
mvm
,
NON_QOS_TX_COUNTER_CMD
,
CMD_SYNC
,
if
(
iwl_mvm_send_cmd_pdu
(
mvm
,
NON_QOS_TX_COUNTER_CMD
,
0
,
sizeof
(
query_cmd
),
&
query_cmd
))
IWL_ERR
(
mvm
,
"failed to set non-QoS seqno
\n
"
);
}
...
...
@@ -796,7 +793,7 @@ iwl_mvm_send_wowlan_config_cmd(struct iwl_mvm *mvm,
if
(
mvm
->
fw
->
ucode_capa
.
api
[
0
]
&
IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID
)
cmd_len
=
sizeof
(
*
cmd
);
return
iwl_mvm_send_cmd_pdu
(
mvm
,
WOWLAN_CONFIGURATION
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
WOWLAN_CONFIGURATION
,
0
,
cmd_len
,
cmd
);
}
...
...
@@ -825,7 +822,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
};
struct
iwl_host_cmd
d3_cfg_cmd
=
{
.
id
=
D3_CONFIG_CMD
,
.
flags
=
CMD_
SYNC
|
CMD_
WANT_SKB
,
.
flags
=
CMD_WANT_SKB
,
.
data
[
0
]
=
&
d3_cfg_cmd_data
,
.
len
[
0
]
=
sizeof
(
d3_cfg_cmd_data
),
};
...
...
@@ -975,7 +972,6 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
if
(
key_data
.
use_rsc_tsc
)
{
struct
iwl_host_cmd
rsc_tsc_cmd
=
{
.
id
=
WOWLAN_TSC_RSC_PARAM
,
.
flags
=
CMD_SYNC
,
.
data
[
0
]
=
key_data
.
rsc_tsc
,
.
dataflags
[
0
]
=
IWL_HCMD_DFL_NOCOPY
,
.
len
[
0
]
=
sizeof
(
*
key_data
.
rsc_tsc
),
...
...
@@ -989,7 +985,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
if
(
key_data
.
use_tkip
)
{
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
WOWLAN_TKIP_PARAM
,
CMD_SYNC
,
sizeof
(
tkip_cmd
),
0
,
sizeof
(
tkip_cmd
),
&
tkip_cmd
);
if
(
ret
)
goto
out
;
...
...
@@ -1006,8 +1002,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
kek_kck_cmd
.
replay_ctr
=
mvmvif
->
rekey_data
.
replay_ctr
;
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
WOWLAN_KEK_KCK_MATERIAL
,
CMD_SYNC
,
WOWLAN_KEK_KCK_MATERIAL
,
0
,
sizeof
(
kek_kck_cmd
),
&
kek_kck_cmd
);
if
(
ret
)
...
...
@@ -1023,7 +1018,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
if
(
ret
)
goto
out
;
ret
=
iwl_mvm_send_proto_offload
(
mvm
,
vif
,
false
,
CMD_SYNC
);
ret
=
iwl_mvm_send_proto_offload
(
mvm
,
vif
,
false
,
0
);
if
(
ret
)
goto
out
;
...
...
@@ -1466,7 +1461,7 @@ static bool iwl_mvm_query_wakeup_reasons(struct iwl_mvm *mvm,
}
err_info
;
struct
iwl_host_cmd
cmd
=
{
.
id
=
WOWLAN_GET_STATUSES
,
.
flags
=
CMD_
SYNC
|
CMD_
WANT_SKB
,
.
flags
=
CMD_WANT_SKB
,
};
struct
iwl_wowlan_status_data
status
;
struct
iwl_wowlan_status
*
fw_status
;
...
...
@@ -1492,7 +1487,7 @@ static bool iwl_mvm_query_wakeup_reasons(struct iwl_mvm *mvm,
}
/* only for tracing for now */
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
OFFLOADS_QUERY_CMD
,
CMD_SYNC
,
0
,
NULL
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
OFFLOADS_QUERY_CMD
,
0
,
0
,
NULL
);
if
(
ret
)
IWL_ERR
(
mvm
,
"failed to query offload statistics (%d)
\n
"
,
ret
);
...
...
drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
浏览文件 @
d91a48cb
...
...
@@ -452,9 +452,9 @@ static ssize_t iwl_dbgfs_bf_params_write(struct ieee80211_vif *vif, char *buf,
mutex_lock
(
&
mvm
->
mutex
);
iwl_dbgfs_update_bf
(
vif
,
param
,
value
);
if
(
param
==
MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER
&&
!
value
)
ret
=
iwl_mvm_disable_beacon_filter
(
mvm
,
vif
,
CMD_SYNC
);
ret
=
iwl_mvm_disable_beacon_filter
(
mvm
,
vif
,
0
);
else
ret
=
iwl_mvm_enable_beacon_filter
(
mvm
,
vif
,
CMD_SYNC
);
ret
=
iwl_mvm_enable_beacon_filter
(
mvm
,
vif
,
0
);
mutex_unlock
(
&
mvm
->
mutex
);
return
ret
?:
count
;
...
...
drivers/net/wireless/iwlwifi/mvm/debugfs.c
浏览文件 @
d91a48cb
...
...
@@ -65,7 +65,6 @@
#include "mvm.h"
#include "sta.h"
#include "iwl-io.h"
#include "iwl-prph.h"
#include "debugfs.h"
#include "iwl-fw-error-dump.h"
...
...
@@ -681,7 +680,7 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,
mvm
->
restart_fw
++
;
/* take the return value to make compiler happy - it will fail anyway */
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
REPLY_ERROR
,
CMD_SYNC
,
0
,
NULL
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
REPLY_ERROR
,
0
,
0
,
NULL
);
mutex_unlock
(
&
mvm
->
mutex
);
...
...
@@ -691,7 +690,7 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,
static
ssize_t
iwl_dbgfs_fw_nmi_write
(
struct
iwl_mvm
*
mvm
,
char
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
iwl_
write_prph
(
mvm
->
trans
,
DEVICE_SET_NMI_REG
,
1
);
iwl_
force_nmi
(
mvm
->
trans
);
return
count
;
}
...
...
@@ -838,7 +837,7 @@ static ssize_t iwl_dbgfs_bcast_filters_write(struct iwl_mvm *mvm, char *buf,
/* send updated bcast filtering configuration */
if
(
mvm
->
dbgfs_bcast_filtering
.
override
&&
iwl_mvm_bcast_filter_build_cmd
(
mvm
,
&
cmd
))
err
=
iwl_mvm_send_cmd_pdu
(
mvm
,
BCAST_FILTER_CMD
,
CMD_SYNC
,
err
=
iwl_mvm_send_cmd_pdu
(
mvm
,
BCAST_FILTER_CMD
,
0
,
sizeof
(
cmd
),
&
cmd
);
mutex_unlock
(
&
mvm
->
mutex
);
...
...
@@ -910,7 +909,7 @@ static ssize_t iwl_dbgfs_bcast_filters_macs_write(struct iwl_mvm *mvm,
/* send updated bcast filtering configuration */
if
(
mvm
->
dbgfs_bcast_filtering
.
override
&&
iwl_mvm_bcast_filter_build_cmd
(
mvm
,
&
cmd
))
err
=
iwl_mvm_send_cmd_pdu
(
mvm
,
BCAST_FILTER_CMD
,
CMD_SYNC
,
err
=
iwl_mvm_send_cmd_pdu
(
mvm
,
BCAST_FILTER_CMD
,
0
,
sizeof
(
cmd
),
&
cmd
);
mutex_unlock
(
&
mvm
->
mutex
);
...
...
drivers/net/wireless/iwlwifi/mvm/fw.c
浏览文件 @
d91a48cb
...
...
@@ -99,7 +99,7 @@ static int iwl_send_tx_ant_cfg(struct iwl_mvm *mvm, u8 valid_tx_ant)
};
IWL_DEBUG_FW
(
mvm
,
"select valid tx ant: %u
\n
"
,
valid_tx_ant
);
return
iwl_mvm_send_cmd_pdu
(
mvm
,
TX_ANT_CONFIGURATION_CMD
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
TX_ANT_CONFIGURATION_CMD
,
0
,
sizeof
(
tx_ant_cmd
),
&
tx_ant_cmd
);
}
...
...
@@ -137,6 +137,8 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
alive_data
->
scd_base_addr
=
le32_to_cpu
(
palive2
->
scd_base_ptr
);
mvm
->
umac_error_event_table
=
le32_to_cpu
(
palive2
->
error_info_addr
);
mvm
->
sf_space
.
addr
=
le32_to_cpu
(
palive2
->
st_fwrd_addr
);
mvm
->
sf_space
.
size
=
le32_to_cpu
(
palive2
->
st_fwrd_size
);
alive_data
->
valid
=
le16_to_cpu
(
palive2
->
status
)
==
IWL_ALIVE_STATUS_OK
;
...
...
@@ -180,6 +182,7 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
int
ret
,
i
;
enum
iwl_ucode_type
old_type
=
mvm
->
cur_ucode
;
static
const
u8
alive_cmd
[]
=
{
MVM_ALIVE
};
struct
iwl_sf_region
st_fwrd_space
;
fw
=
iwl_get_ucode_image
(
mvm
,
ucode_type
);
if
(
WARN_ON
(
!
fw
))
...
...
@@ -215,6 +218,14 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
return
-
EIO
;
}
/*
* update the sdio allocation according to the pointer we get in the
* alive notification.
*/
st_fwrd_space
.
addr
=
mvm
->
sf_space
.
addr
;
st_fwrd_space
.
size
=
mvm
->
sf_space
.
size
;
ret
=
iwl_trans_update_sf
(
mvm
->
trans
,
&
st_fwrd_space
);
iwl_trans_fw_alive
(
mvm
->
trans
,
alive_data
.
scd_base_addr
);
/*
...
...
@@ -256,7 +267,7 @@ static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm)
IWL_DEBUG_INFO
(
mvm
,
"Sending Phy CFG command: 0x%x
\n
"
,
phy_cfg_cmd
.
phy_cfg
);
return
iwl_mvm_send_cmd_pdu
(
mvm
,
PHY_CONFIGURATION_CMD
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
PHY_CONFIGURATION_CMD
,
0
,
sizeof
(
phy_cfg_cmd
),
&
phy_cfg_cmd
);
}
...
...
@@ -303,7 +314,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
}
/* In case we read the NVM from external file, load it to the NIC */
if
(
iwlwifi_mod_params
.
nvm_fil
e
)
if
(
mvm
->
nvm_file_nam
e
)
iwl_mvm_load_nvm_to_nic
(
mvm
);
ret
=
iwl_nvm_check_version
(
mvm
->
nvm_data
,
mvm
->
trans
);
...
...
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
浏览文件 @
d91a48cb
...
...
@@ -685,7 +685,7 @@ static void iwl_mvm_mac_ctxt_cmd_common(struct iwl_mvm *mvm,
static
int
iwl_mvm_mac_ctxt_send_cmd
(
struct
iwl_mvm
*
mvm
,
struct
iwl_mac_ctx_cmd
*
cmd
)
{
int
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
MAC_CONTEXT_CMD
,
CMD_SYNC
,
int
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
MAC_CONTEXT_CMD
,
0
,
sizeof
(
*
cmd
),
cmd
);
if
(
ret
)
IWL_ERR
(
mvm
,
"Failed to send MAC context (action:%d): %d
\n
"
,
...
...
@@ -693,14 +693,37 @@ static int iwl_mvm_mac_ctxt_send_cmd(struct iwl_mvm *mvm,
return
ret
;
}
/*
* Fill the specific data for mac context of type station or p2p client
*/
static
void
iwl_mvm_mac_ctxt_cmd_fill_sta
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
struct
iwl_mac_data_sta
*
ctxt_sta
,
bool
force_assoc_off
)
static
int
iwl_mvm_mac_ctxt_cmd_sta
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
u32
action
,
bool
force_assoc_off
)
{
struct
iwl_mac_ctx_cmd
cmd
=
{};
struct
iwl_mac_data_sta
*
ctxt_sta
;
WARN_ON
(
vif
->
type
!=
NL80211_IFTYPE_STATION
);
/* Fill the common data for all mac context types */
iwl_mvm_mac_ctxt_cmd_common
(
mvm
,
vif
,
&
cmd
,
action
);
if
(
vif
->
p2p
)
{
struct
ieee80211_p2p_noa_attr
*
noa
=
&
vif
->
bss_conf
.
p2p_noa_attr
;
cmd
.
p2p_sta
.
ctwin
=
cpu_to_le32
(
noa
->
oppps_ctwindow
&
IEEE80211_P2P_OPPPS_CTWINDOW_MASK
);
ctxt_sta
=
&
cmd
.
p2p_sta
.
sta
;
}
else
{
/* Allow beacons to pass through as long as we are not
* associated, or we do not have dtim period information.
*/
if
(
!
vif
->
bss_conf
.
assoc
||
!
vif
->
bss_conf
.
dtim_period
)
cmd
.
filter_flags
|=
cpu_to_le32
(
MAC_FILTER_IN_BEACON
);
else
cmd
.
filter_flags
&=
~
cpu_to_le32
(
MAC_FILTER_IN_BEACON
);
ctxt_sta
=
&
cmd
.
sta
;
}
/* We need the dtim_period to set the MAC as associated */
if
(
vif
->
bss_conf
.
assoc
&&
vif
->
bss_conf
.
dtim_period
&&
!
force_assoc_off
)
{
...
...
@@ -752,51 +775,6 @@ static void iwl_mvm_mac_ctxt_cmd_fill_sta(struct iwl_mvm *mvm,
ctxt_sta
->
listen_interval
=
cpu_to_le32
(
mvm
->
hw
->
conf
.
listen_interval
);
ctxt_sta
->
assoc_id
=
cpu_to_le32
(
vif
->
bss_conf
.
aid
);
}
static
int
iwl_mvm_mac_ctxt_cmd_station
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
u32
action
)
{
struct
iwl_mac_ctx_cmd
cmd
=
{};
WARN_ON
(
vif
->
type
!=
NL80211_IFTYPE_STATION
||
vif
->
p2p
);
/* Fill the common data for all mac context types */
iwl_mvm_mac_ctxt_cmd_common
(
mvm
,
vif
,
&
cmd
,
action
);
/* Allow beacons to pass through as long as we are not associated,or we
* do not have dtim period information */
if
(
!
vif
->
bss_conf
.
assoc
||
!
vif
->
bss_conf
.
dtim_period
)
cmd
.
filter_flags
|=
cpu_to_le32
(
MAC_FILTER_IN_BEACON
);
else
cmd
.
filter_flags
&=
~
cpu_to_le32
(
MAC_FILTER_IN_BEACON
);
/* Fill the data specific for station mode */
iwl_mvm_mac_ctxt_cmd_fill_sta
(
mvm
,
vif
,
&
cmd
.
sta
,
action
==
FW_CTXT_ACTION_ADD
);
return
iwl_mvm_mac_ctxt_send_cmd
(
mvm
,
&
cmd
);
}
static
int
iwl_mvm_mac_ctxt_cmd_p2p_client
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
u32
action
)
{
struct
iwl_mac_ctx_cmd
cmd
=
{};
struct
ieee80211_p2p_noa_attr
*
noa
=
&
vif
->
bss_conf
.
p2p_noa_attr
;
WARN_ON
(
vif
->
type
!=
NL80211_IFTYPE_STATION
||
!
vif
->
p2p
);
/* Fill the common data for all mac context types */
iwl_mvm_mac_ctxt_cmd_common
(
mvm
,
vif
,
&
cmd
,
action
);
/* Fill the data specific for station mode */
iwl_mvm_mac_ctxt_cmd_fill_sta
(
mvm
,
vif
,
&
cmd
.
p2p_sta
.
sta
,
action
==
FW_CTXT_ACTION_ADD
);
cmd
.
p2p_sta
.
ctwin
=
cpu_to_le32
(
noa
->
oppps_ctwindow
&
IEEE80211_P2P_OPPPS_CTWINDOW_MASK
);
return
iwl_mvm_mac_ctxt_send_cmd
(
mvm
,
&
cmd
);
}
...
...
@@ -1138,12 +1116,8 @@ static int iwl_mvm_mac_ctx_send(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
{
switch
(
vif
->
type
)
{
case
NL80211_IFTYPE_STATION
:
if
(
!
vif
->
p2p
)
return
iwl_mvm_mac_ctxt_cmd_station
(
mvm
,
vif
,
action
);
else
return
iwl_mvm_mac_ctxt_cmd_p2p_client
(
mvm
,
vif
,
action
);
return
iwl_mvm_mac_ctxt_cmd_sta
(
mvm
,
vif
,
action
,
action
==
FW_CTXT_ACTION_ADD
);
break
;
case
NL80211_IFTYPE_AP
:
if
(
!
vif
->
p2p
)
...
...
@@ -1211,7 +1185,7 @@ int iwl_mvm_mac_ctxt_remove(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
mvmvif
->
color
));
cmd
.
action
=
cpu_to_le32
(
FW_CTXT_ACTION_REMOVE
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
MAC_CONTEXT_CMD
,
CMD_SYNC
,
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
MAC_CONTEXT_CMD
,
0
,
sizeof
(
cmd
),
&
cmd
);
if
(
ret
)
{
IWL_ERR
(
mvm
,
"Failed to remove MAC context: %d
\n
"
,
ret
);
...
...
drivers/net/wireless/iwlwifi/mvm/mac80211.c
浏览文件 @
d91a48cb
...
...
@@ -276,7 +276,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
IEEE80211_HW_AMPDU_AGGREGATION
|
IEEE80211_HW_TIMING_BEACON_ONLY
|
IEEE80211_HW_CONNECTION_MONITOR
|
IEEE80211_HW_SUPPORTS_UAPSD
|
IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS
|
IEEE80211_HW_SUPPORTS_STATIC_SMPS
;
...
...
@@ -286,8 +285,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
IEEE80211_RADIOTAP_MCS_HAVE_STBC
;
hw
->
radiotap_vht_details
|=
IEEE80211_RADIOTAP_VHT_KNOWN_STBC
;
hw
->
rate_control_algorithm
=
"iwl-mvm-rs"
;
hw
->
uapsd_queues
=
IWL_UAPSD_AC_INFO
;
hw
->
uapsd_max_sp_len
=
IWL_UAPSD_MAX_SP
;
/*
* Enable 11w if advertised by firmware and software crypto
...
...
@@ -298,9 +295,13 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
!
iwlwifi_mod_params
.
sw_crypto
)
hw
->
flags
|=
IEEE80211_HW_MFP_CAPABLE
;
/* Disable uAPSD due to firmware issues */
if
(
true
)
hw
->
flags
&=
~
IEEE80211_HW_SUPPORTS_UAPSD
;
if
(
mvm
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT
&&
IWL_UCODE_API
(
mvm
->
fw
->
ucode_ver
)
>=
9
&&
!
iwlwifi_mod_params
.
uapsd_disable
)
{
hw
->
flags
|=
IEEE80211_HW_SUPPORTS_UAPSD
;
hw
->
uapsd_queues
=
IWL_UAPSD_AC_INFO
;
hw
->
uapsd_max_sp_len
=
IWL_UAPSD_MAX_SP
;
}
hw
->
sta_data_size
=
sizeof
(
struct
iwl_mvm_sta
);
hw
->
vif_data_size
=
sizeof
(
struct
iwl_mvm_vif
);
...
...
@@ -772,7 +773,7 @@ static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
.
pwr_restriction
=
cpu_to_le16
(
tx_power
),
};
return
iwl_mvm_send_cmd_pdu
(
mvm
,
REDUCE_TX_POWER_CMD
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
REDUCE_TX_POWER_CMD
,
0
,
sizeof
(
reduce_txpwr_cmd
),
&
reduce_txpwr_cmd
);
}
...
...
@@ -836,7 +837,7 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
goto
out_release
;
/* beacon filtering */
ret
=
iwl_mvm_disable_beacon_filter
(
mvm
,
vif
,
CMD_SYNC
);
ret
=
iwl_mvm_disable_beacon_filter
(
mvm
,
vif
,
0
);
if
(
ret
)
goto
out_remove_mac
;
...
...
@@ -1243,7 +1244,7 @@ static int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm,
if
(
!
iwl_mvm_bcast_filter_build_cmd
(
mvm
,
&
cmd
))
return
0
;
return
iwl_mvm_send_cmd_pdu
(
mvm
,
BCAST_FILTER_CMD
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
BCAST_FILTER_CMD
,
0
,
sizeof
(
cmd
),
&
cmd
);
}
#else
...
...
@@ -1350,7 +1351,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
iwl_mvm_remove_time_event
(
mvm
,
mvmvif
,
&
mvmvif
->
time_event_data
);
iwl_mvm_sf_update
(
mvm
,
vif
,
false
);
WARN_ON
(
iwl_mvm_enable_beacon_filter
(
mvm
,
vif
,
CMD_SYNC
));
WARN_ON
(
iwl_mvm_enable_beacon_filter
(
mvm
,
vif
,
0
));
}
else
if
(
changes
&
(
BSS_CHANGED_PS
|
BSS_CHANGED_P2P_PS
|
BSS_CHANGED_QOS
))
{
ret
=
iwl_mvm_power_update_mac
(
mvm
,
vif
);
...
...
@@ -1364,16 +1365,16 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
}
if
(
changes
&
BSS_CHANGED_CQM
)
{
IWL_DEBUG_MAC80211
(
mvm
,
"cqm info_changed"
);
IWL_DEBUG_MAC80211
(
mvm
,
"cqm info_changed
\n
"
);
/* reset cqm events tracking */
mvmvif
->
bf_data
.
last_cqm_event
=
0
;
ret
=
iwl_mvm_update_beacon_filter
(
mvm
,
vif
,
false
,
CMD_SYNC
);
ret
=
iwl_mvm_update_beacon_filter
(
mvm
,
vif
,
false
,
0
);
if
(
ret
)
IWL_ERR
(
mvm
,
"failed to update CQM thresholds
\n
"
);
}
if
(
changes
&
BSS_CHANGED_ARP_FILTER
)
{
IWL_DEBUG_MAC80211
(
mvm
,
"arp filter changed"
);
IWL_DEBUG_MAC80211
(
mvm
,
"arp filter changed
\n
"
);
iwl_mvm_configure_bcast_filter
(
mvm
,
vif
);
}
}
...
...
@@ -1512,6 +1513,9 @@ static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw,
mutex_lock
(
&
mvm
->
mutex
);
if
(
changes
&
BSS_CHANGED_IDLE
&&
!
bss_conf
->
idle
)
iwl_mvm_sched_scan_stop
(
mvm
,
true
);
switch
(
vif
->
type
)
{
case
NL80211_IFTYPE_STATION
:
iwl_mvm_bss_info_changed_station
(
mvm
,
vif
,
bss_conf
,
changes
);
...
...
@@ -1542,7 +1546,7 @@ static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw,
switch
(
mvm
->
scan_status
)
{
case
IWL_MVM_SCAN_SCHED
:
ret
=
iwl_mvm_sched_scan_stop
(
mvm
);
ret
=
iwl_mvm_sched_scan_stop
(
mvm
,
true
);
if
(
ret
)
{
ret
=
-
EBUSY
;
goto
out
;
...
...
@@ -1731,13 +1735,12 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
new_state
==
IEEE80211_STA_AUTHORIZED
)
{
/* enable beacon filtering */
if
(
vif
->
bss_conf
.
dtim_period
)
WARN_ON
(
iwl_mvm_enable_beacon_filter
(
mvm
,
vif
,
CMD_SYNC
));
WARN_ON
(
iwl_mvm_enable_beacon_filter
(
mvm
,
vif
,
0
));
ret
=
0
;
}
else
if
(
old_state
==
IEEE80211_STA_AUTHORIZED
&&
new_state
==
IEEE80211_STA_ASSOC
)
{
/* disable beacon filtering */
WARN_ON
(
iwl_mvm_disable_beacon_filter
(
mvm
,
vif
,
CMD_SYNC
));
WARN_ON
(
iwl_mvm_disable_beacon_filter
(
mvm
,
vif
,
0
));
ret
=
0
;
}
else
if
(
old_state
==
IEEE80211_STA_ASSOC
&&
new_state
==
IEEE80211_STA_AUTH
)
{
...
...
@@ -1887,7 +1890,7 @@ static int iwl_mvm_mac_sched_scan_stop(struct ieee80211_hw *hw,
int
ret
;
mutex_lock
(
&
mvm
->
mutex
);
ret
=
iwl_mvm_sched_scan_stop
(
mvm
);
ret
=
iwl_mvm_sched_scan_stop
(
mvm
,
false
);
mutex_unlock
(
&
mvm
->
mutex
);
iwl_mvm_wait_for_async_handlers
(
mvm
);
...
...
@@ -2183,10 +2186,10 @@ static void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
return
;
mutex_lock
(
&
mvm
->
mutex
);
iwl_mvm_bt_coex_vif_change
(
mvm
);
iwl_mvm_phy_ctxt_changed
(
mvm
,
phy_ctxt
,
&
ctx
->
min_def
,
ctx
->
rx_chains_static
,
ctx
->
rx_chains_dynamic
);
iwl_mvm_bt_coex_vif_change
(
mvm
);
mutex_unlock
(
&
mvm
->
mutex
);
}
...
...
@@ -2363,9 +2366,8 @@ static int __iwl_mvm_mac_testmode_cmd(struct iwl_mvm *mvm,
return
-
EINVAL
;
if
(
nla_get_u32
(
tb
[
IWL_MVM_TM_ATTR_BEACON_FILTER_STATE
]))
return
iwl_mvm_enable_beacon_filter
(
mvm
,
vif
,
CMD_SYNC
);
return
iwl_mvm_disable_beacon_filter
(
mvm
,
vif
,
CMD_SYNC
);
return
iwl_mvm_enable_beacon_filter
(
mvm
,
vif
,
0
);
return
iwl_mvm_disable_beacon_filter
(
mvm
,
vif
,
0
);
}
return
-
EOPNOTSUPP
;
...
...
drivers/net/wireless/iwlwifi/mvm/mvm.h
浏览文件 @
d91a48cb
...
...
@@ -490,6 +490,7 @@ struct iwl_mvm {
u32
log_event_table
;
u32
umac_error_event_table
;
bool
support_umac_log
;
struct
iwl_sf_region
sf_space
;
u32
ampdu_ref
;
...
...
@@ -501,6 +502,7 @@ struct iwl_mvm {
u8
queue_to_mac80211
[
IWL_MAX_HW_QUEUES
];
atomic_t
queue_stop_count
[
IWL_MAX_HW_QUEUES
];
const
char
*
nvm_file_name
;
struct
iwl_nvm_data
*
nvm_data
;
/* NVM sections */
struct
iwl_nvm_section
nvm_sections
[
NVM_MAX_NUM_SECTIONS
];
...
...
@@ -856,7 +858,7 @@ int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
struct
cfg80211_sched_scan_request
*
req
);
int
iwl_mvm_sched_scan_start
(
struct
iwl_mvm
*
mvm
,
struct
cfg80211_sched_scan_request
*
req
);
int
iwl_mvm_sched_scan_stop
(
struct
iwl_mvm
*
mvm
);
int
iwl_mvm_sched_scan_stop
(
struct
iwl_mvm
*
mvm
,
bool
notify
);
int
iwl_mvm_rx_sched_scan_results
(
struct
iwl_mvm
*
mvm
,
struct
iwl_rx_cmd_buffer
*
rxb
,
struct
iwl_device_cmd
*
cmd
);
...
...
drivers/net/wireless/iwlwifi/mvm/nvm.c
浏览文件 @
d91a48cb
...
...
@@ -74,6 +74,12 @@
#define NVM_WRITE_OPCODE 1
#define NVM_READ_OPCODE 0
/* load nvm chunk response */
enum
{
READ_NVM_CHUNK_SUCCEED
=
0
,
READ_NVM_CHUNK_NOT_VALID_ADDRESS
=
1
};
/*
* prepare the NVM host command w/ the pointers to the nvm buffer
* and send it to fw
...
...
@@ -90,7 +96,7 @@ static int iwl_nvm_write_chunk(struct iwl_mvm *mvm, u16 section,
struct
iwl_host_cmd
cmd
=
{
.
id
=
NVM_ACCESS_CMD
,
.
len
=
{
sizeof
(
struct
iwl_nvm_access_cmd
),
length
},
.
flags
=
CMD_S
YNC
|
CMD_S
END_IN_RFKILL
,
.
flags
=
CMD_SEND_IN_RFKILL
,
.
data
=
{
&
nvm_access_cmd
,
data
},
/* data may come from vmalloc, so use _DUP */
.
dataflags
=
{
0
,
IWL_HCMD_DFL_DUP
},
...
...
@@ -112,7 +118,7 @@ static int iwl_nvm_read_chunk(struct iwl_mvm *mvm, u16 section,
struct
iwl_rx_packet
*
pkt
;
struct
iwl_host_cmd
cmd
=
{
.
id
=
NVM_ACCESS_CMD
,
.
flags
=
CMD_
SYNC
|
CMD_
WANT_SKB
|
CMD_SEND_IN_RFKILL
,
.
flags
=
CMD_WANT_SKB
|
CMD_SEND_IN_RFKILL
,
.
data
=
{
&
nvm_access_cmd
,
},
};
int
ret
,
bytes_read
,
offset_read
;
...
...
@@ -139,10 +145,26 @@ static int iwl_nvm_read_chunk(struct iwl_mvm *mvm, u16 section,
offset_read
=
le16_to_cpu
(
nvm_resp
->
offset
);
resp_data
=
nvm_resp
->
data
;
if
(
ret
)
{
IWL_ERR
(
mvm
,
"NVM access command failed with status %d (device: %s)
\n
"
,
ret
,
mvm
->
cfg
->
name
);
ret
=
-
EINVAL
;
if
((
offset
!=
0
)
&&
(
ret
==
READ_NVM_CHUNK_NOT_VALID_ADDRESS
))
{
/*
* meaning of NOT_VALID_ADDRESS:
* driver try to read chunk from address that is
* multiple of 2K and got an error since addr is empty.
* meaning of (offset != 0): driver already
* read valid data from another chunk so this case
* is not an error.
*/
IWL_DEBUG_EEPROM
(
mvm
->
trans
->
dev
,
"NVM access command failed on offset 0x%x since that section size is multiple 2K
\n
"
,
offset
);
ret
=
0
;
}
else
{
IWL_DEBUG_EEPROM
(
mvm
->
trans
->
dev
,
"NVM access command failed with status %d (device: %s)
\n
"
,
ret
,
mvm
->
cfg
->
name
);
ret
=
-
EIO
;
}
goto
exit
;
}
...
...
@@ -211,9 +233,9 @@ static int iwl_nvm_read_section(struct iwl_mvm *mvm, u16 section,
while
(
ret
==
length
)
{
ret
=
iwl_nvm_read_chunk
(
mvm
,
section
,
offset
,
length
,
data
);
if
(
ret
<
0
)
{
IWL_
ERR
(
mvm
,
"Cannot read NVM from section %d offset %d, length %d
\n
"
,
section
,
offset
,
length
);
IWL_
DEBUG_EEPROM
(
mvm
->
trans
->
dev
,
"Cannot read NVM from section %d offset %d, length %d
\n
"
,
section
,
offset
,
length
);
return
ret
;
}
offset
+=
ret
;
...
...
@@ -318,16 +340,16 @@ static int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm)
* get here after that we assume the NVM request can be satisfied
* synchronously.
*/
ret
=
request_firmware
(
&
fw_entry
,
iwlwifi_mod_params
.
nvm_fil
e
,
ret
=
request_firmware
(
&
fw_entry
,
mvm
->
nvm_file_nam
e
,
mvm
->
trans
->
dev
);
if
(
ret
)
{
IWL_ERR
(
mvm
,
"ERROR: %s isn't available %d
\n
"
,
iwlwifi_mod_params
.
nvm_fil
e
,
ret
);
mvm
->
nvm_file_nam
e
,
ret
);
return
ret
;
}
IWL_INFO
(
mvm
,
"Loaded NVM file %s (%zu bytes)
\n
"
,
iwlwifi_mod_params
.
nvm_fil
e
,
fw_entry
->
size
);
mvm
->
nvm_file_nam
e
,
fw_entry
->
size
);
if
(
fw_entry
->
size
<
sizeof
(
*
file_sec
))
{
IWL_ERR
(
mvm
,
"NVM file too small
\n
"
);
...
...
@@ -436,32 +458,14 @@ int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm)
int
iwl_nvm_init
(
struct
iwl_mvm
*
mvm
,
bool
read_nvm_from_nic
)
{
int
ret
,
i
,
section
;
int
ret
,
section
;
u8
*
nvm_buffer
,
*
temp
;
int
nvm_to_read
[
NVM_MAX_NUM_SECTIONS
];
int
num_of_sections_to_read
;
if
(
WARN_ON_ONCE
(
mvm
->
cfg
->
nvm_hw_section_num
>=
NVM_MAX_NUM_SECTIONS
))
return
-
EINVAL
;
/* load NVM values from nic */
if
(
read_nvm_from_nic
)
{
/* list of NVM sections we are allowed/need to read */
if
(
mvm
->
trans
->
cfg
->
device_family
!=
IWL_DEVICE_FAMILY_8000
)
{
nvm_to_read
[
0
]
=
mvm
->
cfg
->
nvm_hw_section_num
;
nvm_to_read
[
1
]
=
NVM_SECTION_TYPE_SW
;
nvm_to_read
[
2
]
=
NVM_SECTION_TYPE_CALIBRATION
;
nvm_to_read
[
3
]
=
NVM_SECTION_TYPE_PRODUCTION
;
num_of_sections_to_read
=
4
;
}
else
{
nvm_to_read
[
0
]
=
NVM_SECTION_TYPE_SW
;
nvm_to_read
[
1
]
=
NVM_SECTION_TYPE_CALIBRATION
;
nvm_to_read
[
2
]
=
NVM_SECTION_TYPE_PRODUCTION
;
nvm_to_read
[
3
]
=
NVM_SECTION_TYPE_REGULATORY
;
nvm_to_read
[
4
]
=
NVM_SECTION_TYPE_MAC_OVERRIDE
;
num_of_sections_to_read
=
5
;
}
/* Read From FW NVM */
IWL_DEBUG_EEPROM
(
mvm
->
trans
->
dev
,
"Read from NVM
\n
"
);
...
...
@@ -469,12 +473,11 @@ int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
GFP_KERNEL
);
if
(
!
nvm_buffer
)
return
-
ENOMEM
;
for
(
i
=
0
;
i
<
num_of_sections_to_read
;
i
++
)
{
section
=
nvm_to_read
[
i
];
for
(
section
=
0
;
section
<
NVM_MAX_NUM_SECTIONS
;
section
++
)
{
/* we override the constness for initial read */
ret
=
iwl_nvm_read_section
(
mvm
,
section
,
nvm_buffer
);
if
(
ret
<
0
)
break
;
continue
;
temp
=
kmemdup
(
nvm_buffer
,
ret
,
GFP_KERNEL
);
if
(
!
temp
)
{
ret
=
-
ENOMEM
;
...
...
@@ -503,17 +506,14 @@ int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
mvm
->
nvm_hw_blob
.
size
=
ret
;
break
;
}
WARN
(
1
,
"section: %d"
,
section
);
}
#endif
}
kfree
(
nvm_buffer
);
if
(
ret
<
0
)
return
ret
;
}
/* load external NVM if configured */
if
(
iwlwifi_mod_params
.
nvm_fil
e
)
{
if
(
mvm
->
nvm_file_nam
e
)
{
/* move to External NVM flow */
ret
=
iwl_mvm_read_external_nvm
(
mvm
);
if
(
ret
)
...
...
drivers/net/wireless/iwlwifi/mvm/ops.c
浏览文件 @
d91a48cb
...
...
@@ -466,8 +466,13 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
min_backoff
=
calc_min_backoff
(
trans
,
cfg
);
iwl_mvm_tt_initialize
(
mvm
,
min_backoff
);
/* set the nvm_file_name according to priority */
if
(
iwlwifi_mod_params
.
nvm_file
)
mvm
->
nvm_file_name
=
iwlwifi_mod_params
.
nvm_file
;
else
mvm
->
nvm_file_name
=
mvm
->
cfg
->
default_nvm_file
;
if
(
WARN
(
cfg
->
no_power_up_nic_in_init
&&
!
iwlwifi_mod_params
.
nvm_fil
e
,
if
(
WARN
(
cfg
->
no_power_up_nic_in_init
&&
!
mvm
->
nvm_file_nam
e
,
"not allowing power-up and not having nvm_file
\n
"
))
goto
out_free
;
...
...
@@ -477,7 +482,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
* and not in the file.
* for nics with no_power_up_nic_in_init: rely completley on nvm_file
*/
if
(
cfg
->
no_power_up_nic_in_init
&&
iwlwifi_mod_params
.
nvm_fil
e
)
{
if
(
cfg
->
no_power_up_nic_in_init
&&
mvm
->
nvm_file_nam
e
)
{
err
=
iwl_nvm_init
(
mvm
,
false
);
if
(
err
)
goto
out_free
;
...
...
@@ -525,7 +530,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
out_free:
iwl_phy_db_free
(
mvm
->
phy_db
);
kfree
(
mvm
->
scan_cmd
);
if
(
!
cfg
->
no_power_up_nic_in_init
||
!
iwlwifi_mod_params
.
nvm_fil
e
)
if
(
!
cfg
->
no_power_up_nic_in_init
||
!
mvm
->
nvm_file_nam
e
)
iwl_trans_op_mode_leave
(
trans
);
ieee80211_free_hw
(
mvm
->
hw
);
return
NULL
;
...
...
@@ -1163,7 +1168,7 @@ static void iwl_mvm_d0i3_exit_work(struct work_struct *wk)
struct
iwl_mvm
*
mvm
=
container_of
(
wk
,
struct
iwl_mvm
,
d0i3_exit_work
);
struct
iwl_host_cmd
get_status_cmd
=
{
.
id
=
WOWLAN_GET_STATUSES
,
.
flags
=
CMD_
SYNC
|
CMD_
HIGH_PRIO
|
CMD_WANT_SKB
,
.
flags
=
CMD_HIGH_PRIO
|
CMD_WANT_SKB
,
};
struct
iwl_wowlan_status
*
status
;
int
ret
;
...
...
drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c
浏览文件 @
d91a48cb
...
...
@@ -156,6 +156,19 @@ static void iwl_mvm_phy_ctxt_cmd_data(struct iwl_mvm *mvm,
idle_cnt
=
chains_static
;
active_cnt
=
chains_dynamic
;
/* In scenarios where we only ever use a single-stream rates,
* i.e. legacy 11b/g/a associations, single-stream APs or even
* static SMPS, enable both chains to get diversity, improving
* the case where we're far enough from the AP that attenuation
* between the two antennas is sufficiently different to impact
* performance.
*/
if
(
active_cnt
==
1
&&
num_of_ant
(
mvm
->
fw
->
valid_rx_ant
)
>
1
&&
!
mvm
->
cfg
->
rx_with_siso_diversity
)
{
idle_cnt
=
2
;
active_cnt
=
2
;
}
cmd
->
rxchain_info
=
cpu_to_le32
(
mvm
->
fw
->
valid_rx_ant
<<
PHY_RX_CHAIN_VALID_POS
);
cmd
->
rxchain_info
|=
cpu_to_le32
(
idle_cnt
<<
PHY_RX_CHAIN_CNT_POS
);
...
...
@@ -187,7 +200,7 @@ static int iwl_mvm_phy_ctxt_apply(struct iwl_mvm *mvm,
iwl_mvm_phy_ctxt_cmd_data
(
mvm
,
&
cmd
,
chandef
,
chains_static
,
chains_dynamic
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
PHY_CONTEXT_CMD
,
CMD_SYNC
,
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
PHY_CONTEXT_CMD
,
0
,
sizeof
(
struct
iwl_phy_context_cmd
),
&
cmd
);
if
(
ret
)
...
...
drivers/net/wireless/iwlwifi/mvm/power.c
浏览文件 @
d91a48cb
...
...
@@ -142,7 +142,7 @@ int iwl_mvm_update_beacon_abort(struct iwl_mvm *mvm,
mvmvif
->
bf_data
.
ba_enabled
=
enable
;
iwl_mvm_beacon_filter_set_cqm_params
(
mvm
,
vif
,
&
cmd
);
iwl_mvm_beacon_filter_debugfs_parameters
(
vif
,
&
cmd
);
return
iwl_mvm_beacon_filter_send_cmd
(
mvm
,
&
cmd
,
CMD_SYNC
);
return
iwl_mvm_beacon_filter_send_cmd
(
mvm
,
&
cmd
,
0
);
}
static
void
iwl_mvm_power_log
(
struct
iwl_mvm
*
mvm
,
...
...
@@ -268,10 +268,30 @@ static void iwl_mvm_power_configure_uapsd(struct iwl_mvm *mvm,
IWL_MVM_PS_HEAVY_RX_THLD_PERCENT
;
}
static
void
iwl_mvm_binding_iterator
(
void
*
_data
,
u8
*
mac
,
struct
ieee80211_vif
*
vif
)
{
unsigned
long
*
data
=
_data
;
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
if
(
!
mvmvif
->
phy_ctxt
)
return
;
if
(
vif
->
type
==
NL80211_IFTYPE_STATION
||
vif
->
type
==
NL80211_IFTYPE_AP
)
__set_bit
(
mvmvif
->
phy_ctxt
->
id
,
data
);
}
static
bool
iwl_mvm_power_allow_uapsd
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
)
{
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
unsigned
long
phy_ctxt_counter
=
0
;
ieee80211_iterate_active_interfaces_atomic
(
mvm
->
hw
,
IEEE80211_IFACE_ITER_NORMAL
,
iwl_mvm_binding_iterator
,
&
phy_ctxt_counter
);
if
(
!
memcmp
(
mvmvif
->
uapsd_misbehaving_bssid
,
vif
->
bss_conf
.
bssid
,
ETH_ALEN
))
...
...
@@ -289,6 +309,13 @@ static bool iwl_mvm_power_allow_uapsd(struct iwl_mvm *mvm,
IEEE80211_P2P_OPPPS_ENABLE_BIT
))
return
false
;
/*
* Avoid using uAPSD if client is in DCM -
* low latency issue in Miracast
*/
if
(
hweight8
(
phy_ctxt_counter
)
>=
2
)
return
false
;
return
true
;
}
...
...
@@ -429,7 +456,7 @@ static int iwl_mvm_power_send_cmd(struct iwl_mvm *mvm,
memcpy
(
&
iwl_mvm_vif_from_mac80211
(
vif
)
->
mac_pwr_cmd
,
&
cmd
,
sizeof
(
cmd
));
#endif
return
iwl_mvm_send_cmd_pdu
(
mvm
,
MAC_PM_POWER_TABLE
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
MAC_PM_POWER_TABLE
,
0
,
sizeof
(
cmd
),
&
cmd
);
}
...
...
@@ -455,7 +482,7 @@ int iwl_mvm_power_update_device(struct iwl_mvm *mvm)
"Sending device power command with flags = 0x%X
\n
"
,
cmd
.
flags
);
return
iwl_mvm_send_cmd_pdu
(
mvm
,
POWER_TABLE_CMD
,
CMD_SYNC
,
sizeof
(
cmd
),
return
iwl_mvm_send_cmd_pdu
(
mvm
,
POWER_TABLE_CMD
,
0
,
sizeof
(
cmd
),
&
cmd
);
}
...
...
@@ -613,11 +640,15 @@ iwl_mvm_power_set_pm(struct iwl_mvm *mvm,
ap_same_channel
=
(
bss_mvmvif
->
phy_ctxt
->
id
==
ap_mvmvif
->
phy_ctxt
->
id
);
/*
bss is not stand alone: enable PM if alone on its channel
*/
if
(
vifs
->
bss_active
&&
!
(
client_same_channel
||
ap_same_channel
)
&&
/*
clients are not stand alone: enable PM if DCM
*/
if
(
!
(
client_same_channel
||
ap_same_channel
)
&&
(
mvm
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_DCM
))
{
if
(
vifs
->
bss_active
)
bss_mvmvif
->
pm_enabled
=
true
;
return
;
if
(
vifs
->
p2p_active
&&
(
mvm
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_P2P_PM
))
p2p_mvmvif
->
pm_enabled
=
true
;
return
;
}
/*
...
...
@@ -871,9 +902,10 @@ int iwl_mvm_update_d0i3_power_mode(struct iwl_mvm *mvm,
if
(
WARN_ON
(
!
dtimper_msec
))
return
0
;
cmd
.
flags
|=
cpu_to_le16
(
POWER_FLAGS_SKIP_OVER_DTIM_MSK
);
cmd
.
skip_dtim_periods
=
300
/
dtimper_msec
;
if
(
cmd
.
skip_dtim_periods
)
cmd
.
flags
|=
cpu_to_le16
(
POWER_FLAGS_SKIP_OVER_DTIM_MSK
);
}
iwl_mvm_power_log
(
mvm
,
&
cmd
);
#ifdef CONFIG_IWLWIFI_DEBUGFS
...
...
drivers/net/wireless/iwlwifi/mvm/quota.c
浏览文件 @
d91a48cb
...
...
@@ -285,7 +285,7 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
iwl_mvm_adjust_quota_for_noa
(
mvm
,
&
cmd
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
TIME_QUOTA_CMD
,
CMD_SYNC
,
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
TIME_QUOTA_CMD
,
0
,
sizeof
(
cmd
),
&
cmd
);
if
(
ret
)
IWL_ERR
(
mvm
,
"Failed to send quota: %d
\n
"
,
ret
);
...
...
drivers/net/wireless/iwlwifi/mvm/rs.c
浏览文件 @
d91a48cb
...
...
@@ -1866,7 +1866,7 @@ static bool rs_tpc_perform(struct iwl_mvm *mvm,
#ifdef CONFIG_MAC80211_DEBUGFS
if
(
lq_sta
->
dbg_fixed_txp_reduction
<=
TPC_MAX_REDUCTION
)
{
IWL_DEBUG_RATE
(
mvm
,
"fixed tpc: %d"
,
IWL_DEBUG_RATE
(
mvm
,
"fixed tpc: %d
\n
"
,
lq_sta
->
dbg_fixed_txp_reduction
);
lq_sta
->
lq
.
reduced_tpc
=
lq_sta
->
dbg_fixed_txp_reduction
;
return
cur
!=
lq_sta
->
dbg_fixed_txp_reduction
;
...
...
@@ -1883,7 +1883,7 @@ static bool rs_tpc_perform(struct iwl_mvm *mvm,
if
(
!
rs_tpc_allowed
(
mvm
,
vif
,
rate
,
band
))
{
IWL_DEBUG_RATE
(
mvm
,
"tpc is not allowed. remove txp restrictions"
);
"tpc is not allowed. remove txp restrictions
\n
"
);
lq_sta
->
lq
.
reduced_tpc
=
TPC_NO_REDUCTION
;
return
cur
!=
TPC_NO_REDUCTION
;
}
...
...
@@ -1909,12 +1909,12 @@ static bool rs_tpc_perform(struct iwl_mvm *mvm,
/* override actions if we are on the edge */
if
(
weak
==
TPC_INVALID
&&
action
==
TPC_ACTION_DECREASE
)
{
IWL_DEBUG_RATE
(
mvm
,
"already in lowest txp, stay"
);
IWL_DEBUG_RATE
(
mvm
,
"already in lowest txp, stay
\n
"
);
action
=
TPC_ACTION_STAY
;
}
else
if
(
strong
==
TPC_INVALID
&&
(
action
==
TPC_ACTION_INCREASE
||
action
==
TPC_ACTION_NO_RESTIRCTION
))
{
IWL_DEBUG_RATE
(
mvm
,
"already in highest txp, stay"
);
IWL_DEBUG_RATE
(
mvm
,
"already in highest txp, stay
\n
"
);
action
=
TPC_ACTION_STAY
;
}
...
...
drivers/net/wireless/iwlwifi/mvm/scan.c
浏览文件 @
d91a48cb
...
...
@@ -306,7 +306,6 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
.
id
=
SCAN_REQUEST_CMD
,
.
len
=
{
0
,
},
.
data
=
{
mvm
->
scan_cmd
,
},
.
flags
=
CMD_SYNC
,
.
dataflags
=
{
IWL_HCMD_DFL_NOCOPY
,
},
};
struct
iwl_scan_cmd
*
cmd
=
mvm
->
scan_cmd
;
...
...
@@ -517,7 +516,7 @@ int iwl_mvm_cancel_scan(struct iwl_mvm *mvm)
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
,
0
,
0
,
NULL
);
if
(
ret
)
{
IWL_ERR
(
mvm
,
"Couldn't send SCAN_ABORT_CMD: %d
\n
"
,
ret
);
/* mac80211's state will be cleaned in the nic_restart flow */
...
...
@@ -749,7 +748,6 @@ int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm,
struct
iwl_scan_offload_cfg
*
scan_cfg
;
struct
iwl_host_cmd
cmd
=
{
.
id
=
SCAN_OFFLOAD_CONFIG_CMD
,
.
flags
=
CMD_SYNC
,
};
struct
iwl_mvm_scan_params
params
=
{};
...
...
@@ -807,7 +805,6 @@ int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
struct
iwl_scan_offload_blacklist
*
blacklist
;
struct
iwl_host_cmd
cmd
=
{
.
id
=
SCAN_OFFLOAD_UPDATE_PROFILES_CMD
,
.
flags
=
CMD_SYNC
,
.
len
[
1
]
=
sizeof
(
*
profile_cfg
),
.
dataflags
[
0
]
=
IWL_HCMD_DFL_NOCOPY
,
.
dataflags
[
1
]
=
IWL_HCMD_DFL_NOCOPY
,
...
...
@@ -898,7 +895,7 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
scan_req
.
flags
|=
cpu_to_le16
(
IWL_SCAN_OFFLOAD_FLAG_EBS_ACCURATE_MODE
);
return
iwl_mvm_send_cmd_pdu
(
mvm
,
SCAN_OFFLOAD_REQUEST_CMD
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
SCAN_OFFLOAD_REQUEST_CMD
,
0
,
sizeof
(
scan_req
),
&
scan_req
);
}
...
...
@@ -907,7 +904,6 @@ static int iwl_mvm_send_sched_scan_abort(struct iwl_mvm *mvm)
int
ret
;
struct
iwl_host_cmd
cmd
=
{
.
id
=
SCAN_OFFLOAD_ABORT_CMD
,
.
flags
=
CMD_SYNC
,
};
u32
status
;
...
...
@@ -936,7 +932,7 @@ static int iwl_mvm_send_sched_scan_abort(struct iwl_mvm *mvm)
return
ret
;
}
int
iwl_mvm_sched_scan_stop
(
struct
iwl_mvm
*
mvm
)
int
iwl_mvm_sched_scan_stop
(
struct
iwl_mvm
*
mvm
,
bool
notify
)
{
int
ret
;
struct
iwl_notification_wait
wait_scan_done
;
...
...
@@ -974,5 +970,8 @@ int iwl_mvm_sched_scan_stop(struct iwl_mvm *mvm)
*/
mvm
->
scan_status
=
IWL_MVM_SCAN_NONE
;
if
(
notify
)
ieee80211_sched_scan_stopped
(
mvm
->
hw
);
return
0
;
}
drivers/net/wireless/iwlwifi/mvm/sta.c
浏览文件 @
d91a48cb
...
...
@@ -327,7 +327,7 @@ static int iwl_mvm_rm_sta_common(struct iwl_mvm *mvm, u8 sta_id)
return
-
EINVAL
;
}
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
REMOVE_STA
,
CMD_SYNC
,
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
REMOVE_STA
,
0
,
sizeof
(
rm_sta_cmd
),
&
rm_sta_cmd
);
if
(
ret
)
{
IWL_ERR
(
mvm
,
"Failed to remove station. Id=%d
\n
"
,
sta_id
);
...
...
@@ -1053,12 +1053,12 @@ static int iwl_mvm_send_sta_key(struct iwl_mvm *mvm,
cmd
.
sta_id
=
sta_id
;
status
=
ADD_STA_SUCCESS
;
if
(
cmd_flags
==
CMD_SYNC
)
ret
=
iwl_mvm_send_cmd_pdu_status
(
mvm
,
ADD_STA_KEY
,
sizeof
(
cmd
),
&
cmd
,
&
status
);
else
if
(
cmd_flags
&
CMD_ASYNC
)
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
ADD_STA_KEY
,
CMD_ASYNC
,
sizeof
(
cmd
),
&
cmd
);
else
ret
=
iwl_mvm_send_cmd_pdu_status
(
mvm
,
ADD_STA_KEY
,
sizeof
(
cmd
),
&
cmd
,
&
status
);
switch
(
status
)
{
case
ADD_STA_SUCCESS
:
...
...
@@ -1111,7 +1111,7 @@ static int iwl_mvm_send_sta_igtk(struct iwl_mvm *mvm,
remove_key
?
"removing"
:
"installing"
,
igtk_cmd
.
sta_id
);
return
iwl_mvm_send_cmd_pdu
(
mvm
,
MGMT_MCAST_KEY
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
MGMT_MCAST_KEY
,
0
,
sizeof
(
igtk_cmd
),
&
igtk_cmd
);
}
...
...
@@ -1198,15 +1198,15 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
ieee80211_get_key_rx_seq
(
keyconf
,
0
,
&
seq
);
ieee80211_get_tkip_rx_p1k
(
keyconf
,
addr
,
seq
.
tkip
.
iv32
,
p1k
);
ret
=
iwl_mvm_send_sta_key
(
mvm
,
mvm_sta
,
keyconf
,
sta_id
,
seq
.
tkip
.
iv32
,
p1k
,
CMD_SYNC
);
seq
.
tkip
.
iv32
,
p1k
,
0
);
break
;
case
WLAN_CIPHER_SUITE_CCMP
:
ret
=
iwl_mvm_send_sta_key
(
mvm
,
mvm_sta
,
keyconf
,
sta_id
,
0
,
NULL
,
CMD_SYNC
);
0
,
NULL
,
0
);
break
;
default:
ret
=
iwl_mvm_send_sta_key
(
mvm
,
mvm_sta
,
keyconf
,
sta_id
,
0
,
NULL
,
CMD_SYNC
);
sta_id
,
0
,
NULL
,
0
);
}
if
(
ret
)
...
...
drivers/net/wireless/iwlwifi/mvm/time-event.c
浏览文件 @
d91a48cb
...
...
@@ -312,7 +312,7 @@ static int iwl_mvm_time_event_send_add(struct iwl_mvm *mvm,
ARRAY_SIZE
(
time_event_response
),
iwl_mvm_time_event_response
,
te_data
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
TIME_EVENT_CMD
,
CMD_SYNC
,
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
TIME_EVENT_CMD
,
0
,
sizeof
(
*
te_cmd
),
te_cmd
);
if
(
ret
)
{
IWL_ERR
(
mvm
,
"Couldn't send TIME_EVENT_CMD: %d
\n
"
,
ret
);
...
...
@@ -434,7 +434,7 @@ void iwl_mvm_remove_time_event(struct iwl_mvm *mvm,
cpu_to_le32
(
FW_CMD_ID_AND_COLOR
(
mvmvif
->
id
,
mvmvif
->
color
));
IWL_DEBUG_TE
(
mvm
,
"Removing TE 0x%x
\n
"
,
le32_to_cpu
(
time_cmd
.
id
));
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
TIME_EVENT_CMD
,
CMD_SYNC
,
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
TIME_EVENT_CMD
,
0
,
sizeof
(
time_cmd
),
&
time_cmd
);
if
(
WARN_ON
(
ret
))
return
;
...
...
drivers/net/wireless/iwlwifi/mvm/tt.c
浏览文件 @
d91a48cb
...
...
@@ -409,7 +409,6 @@ void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff)
.
id
=
REPLY_THERMAL_MNG_BACKOFF
,
.
len
=
{
sizeof
(
u32
),
},
.
data
=
{
&
backoff
,
},
.
flags
=
CMD_SYNC
,
};
backoff
=
max
(
backoff
,
mvm
->
thermal_throttle
.
min_backoff
);
...
...
drivers/net/wireless/iwlwifi/mvm/tx.c
浏览文件 @
d91a48cb
...
...
@@ -958,7 +958,7 @@ int iwl_mvm_flush_tx_path(struct iwl_mvm *mvm, u32 tfd_msk, bool sync)
.
flush_ctl
=
cpu_to_le16
(
DUMP_TX_FIFO_FLUSH
),
};
u32
flags
=
sync
?
CMD_SYNC
:
CMD_ASYNC
;
u32
flags
=
sync
?
0
:
CMD_ASYNC
;
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
TXPATH_FLUSH
,
flags
,
sizeof
(
flush_cmd
),
&
flush_cmd
);
...
...
drivers/net/wireless/iwlwifi/mvm/utils.c
浏览文件 @
d91a48cb
...
...
@@ -144,7 +144,7 @@ int iwl_mvm_send_cmd_status(struct iwl_mvm *mvm, struct iwl_host_cmd *cmd,
"cmd flags %x"
,
cmd
->
flags
))
return
-
EINVAL
;
cmd
->
flags
|=
CMD_
SYNC
|
CMD_
WANT_SKB
;
cmd
->
flags
|=
CMD_WANT_SKB
;
ret
=
iwl_trans_send_cmd
(
mvm
->
trans
,
cmd
);
if
(
ret
==
-
ERFKILL
)
{
...
...
@@ -599,7 +599,7 @@ 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
=
init
?
CMD_SYNC
:
CMD_ASYNC
,
.
flags
=
init
?
0
:
CMD_ASYNC
,
.
data
=
{
lq
,
},
};
...
...
drivers/net/wireless/iwlwifi/pcie/drv.c
浏览文件 @
d91a48cb
...
...
@@ -417,7 +417,7 @@ static u64 splx_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splx)
splx
->
package
.
count
!=
2
||
splx
->
package
.
elements
[
0
].
type
!=
ACPI_TYPE_INTEGER
||
splx
->
package
.
elements
[
0
].
integer
.
value
!=
0
)
{
IWL_ERR
(
trans
,
"Unsupported splx structure"
);
IWL_ERR
(
trans
,
"Unsupported splx structure
\n
"
);
return
0
;
}
...
...
@@ -426,14 +426,14 @@ static u64 splx_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splx)
limits
->
package
.
count
<
2
||
limits
->
package
.
elements
[
0
].
type
!=
ACPI_TYPE_INTEGER
||
limits
->
package
.
elements
[
1
].
type
!=
ACPI_TYPE_INTEGER
)
{
IWL_ERR
(
trans
,
"Invalid limits element"
);
IWL_ERR
(
trans
,
"Invalid limits element
\n
"
);
return
0
;
}
domain_type
=
&
limits
->
package
.
elements
[
0
];
power_limit
=
&
limits
->
package
.
elements
[
1
];
if
(
!
(
domain_type
->
integer
.
value
&
SPL_DOMAINTYPE_WIFI
))
{
IWL_DEBUG_INFO
(
trans
,
"WiFi power is not limited"
);
IWL_DEBUG_INFO
(
trans
,
"WiFi power is not limited
\n
"
);
return
0
;
}
...
...
@@ -450,26 +450,26 @@ static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev)
pxsx_handle
=
ACPI_HANDLE
(
&
pdev
->
dev
);
if
(
!
pxsx_handle
)
{
IWL_DEBUG_INFO
(
trans
,
"Could not retrieve root port ACPI handle"
);
"Could not retrieve root port ACPI handle
\n
"
);
return
;
}
/* Get the method's handle */
status
=
acpi_get_handle
(
pxsx_handle
,
(
acpi_string
)
SPL_METHOD
,
&
handle
);
if
(
ACPI_FAILURE
(
status
))
{
IWL_DEBUG_INFO
(
trans
,
"SPL method not found"
);
IWL_DEBUG_INFO
(
trans
,
"SPL method not found
\n
"
);
return
;
}
/* Call SPLC with no arguments */
status
=
acpi_evaluate_object
(
handle
,
NULL
,
NULL
,
&
splx
);
if
(
ACPI_FAILURE
(
status
))
{
IWL_ERR
(
trans
,
"SPLC invocation failed (0x%x)"
,
status
);
IWL_ERR
(
trans
,
"SPLC invocation failed (0x%x)
\n
"
,
status
);
return
;
}
trans
->
dflt_pwr_limit
=
splx_get_pwr_limit
(
trans
,
splx
.
pointer
);
IWL_DEBUG_INFO
(
trans
,
"Default power limit set to %lld"
,
IWL_DEBUG_INFO
(
trans
,
"Default power limit set to %lld
\n
"
,
trans
->
dflt_pwr_limit
);
kfree
(
splx
.
pointer
);
}
...
...
drivers/net/wireless/iwlwifi/pcie/trans.c
浏览文件 @
d91a48cb
...
...
@@ -454,6 +454,7 @@ static int iwl_pcie_prepare_card_hw(struct iwl_trans *trans)
{
int
ret
;
int
t
=
0
;
int
iter
;
IWL_DEBUG_INFO
(
trans
,
"iwl_trans_prepare_card_hw enter
\n
"
);
...
...
@@ -462,18 +463,23 @@ static int iwl_pcie_prepare_card_hw(struct iwl_trans *trans)
if
(
ret
>=
0
)
return
0
;
/* If HW is not ready, prepare the conditions to check again */
iwl_set_bit
(
trans
,
CSR_HW_IF_CONFIG_REG
,
CSR_HW_IF_CONFIG_REG_PREPARE
);
for
(
iter
=
0
;
iter
<
10
;
iter
++
)
{
/* If HW is not ready, prepare the conditions to check again */
iwl_set_bit
(
trans
,
CSR_HW_IF_CONFIG_REG
,
CSR_HW_IF_CONFIG_REG_PREPARE
);
do
{
ret
=
iwl_pcie_set_hw_ready
(
trans
);
if
(
ret
>=
0
)
return
0
;
do
{
ret
=
iwl_pcie_set_hw_ready
(
trans
);
if
(
ret
>=
0
)
return
0
;
usleep_range
(
200
,
1000
);
t
+=
200
;
}
while
(
t
<
150000
);
msleep
(
25
);
}
usleep_range
(
200
,
1000
);
t
+=
200
;
}
while
(
t
<
150000
);
IWL_DEBUG_INFO
(
trans
,
"got NIC after %d iterations
\n
"
,
iter
);
return
ret
;
}
...
...
drivers/net/wireless/iwlwifi/pcie/tx.c
浏览文件 @
d91a48cb
...
...
@@ -201,7 +201,7 @@ static void iwl_pcie_txq_stuck_timer(unsigned long data)
IWL_ERR
(
trans
,
"scratch %d = 0x%08x
\n
"
,
i
,
le32_to_cpu
(
txq
->
scratchbufs
[
i
].
scratch
));
iwl_
write_prph
(
trans
,
DEVICE_SET_NMI_REG
,
1
);
iwl_
force_nmi
(
trans
);
}
/*
...
...
@@ -332,12 +332,12 @@ void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans)
for
(
i
=
0
;
i
<
trans
->
cfg
->
base_params
->
num_of_queues
;
i
++
)
{
struct
iwl_txq
*
txq
=
&
trans_pcie
->
txq
[
i
];
spin_lock
(
&
txq
->
lock
);
spin_lock
_bh
(
&
txq
->
lock
);
if
(
trans_pcie
->
txq
[
i
].
need_update
)
{
iwl_pcie_txq_inc_wr_ptr
(
trans
,
txq
);
trans_pcie
->
txq
[
i
].
need_update
=
false
;
}
spin_unlock
(
&
txq
->
lock
);
spin_unlock
_bh
(
&
txq
->
lock
);
}
}
...
...
@@ -1029,7 +1029,7 @@ static void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx)
if
(
nfreed
++
>
0
)
{
IWL_ERR
(
trans
,
"HCMD skipped: index (%d) %d %d
\n
"
,
idx
,
q
->
write_ptr
,
q
->
read_ptr
);
iwl_
write_prph
(
trans
,
DEVICE_SET_NMI_REG
,
1
);
iwl_
force_nmi
(
trans
);
}
}
...
...
@@ -1600,7 +1600,7 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
get_cmd_string
(
trans_pcie
,
cmd
->
id
));
ret
=
-
ETIMEDOUT
;
iwl_
write_prph
(
trans
,
DEVICE_SET_NMI_REG
,
1
);
iwl_
force_nmi
(
trans
);
iwl_trans_fw_error
(
trans
);
goto
cancel
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录