Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
59731bb8
Commit
59731bb8
authored
Jun 26, 2013
by
John W. Linville
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-john' of
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next
parents
729d8d18
bd4ace2a
Changes
31
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
251 additions
and
2044 deletions
+251
-2044
drivers/net/wireless/iwlwifi/Kconfig
drivers/net/wireless/iwlwifi/Kconfig
+0
-10
drivers/net/wireless/iwlwifi/Makefile
drivers/net/wireless/iwlwifi/Makefile
+0
-1
drivers/net/wireless/iwlwifi/dvm/Makefile
drivers/net/wireless/iwlwifi/dvm/Makefile
+0
-1
drivers/net/wireless/iwlwifi/dvm/agn.h
drivers/net/wireless/iwlwifi/dvm/agn.h
+0
-37
drivers/net/wireless/iwlwifi/dvm/dev.h
drivers/net/wireless/iwlwifi/dvm/dev.h
+1
-12
drivers/net/wireless/iwlwifi/dvm/lib.c
drivers/net/wireless/iwlwifi/dvm/lib.c
+0
-6
drivers/net/wireless/iwlwifi/dvm/mac80211.c
drivers/net/wireless/iwlwifi/dvm/mac80211.c
+0
-2
drivers/net/wireless/iwlwifi/dvm/main.c
drivers/net/wireless/iwlwifi/dvm/main.c
+2
-13
drivers/net/wireless/iwlwifi/dvm/rs.c
drivers/net/wireless/iwlwifi/dvm/rs.c
+12
-31
drivers/net/wireless/iwlwifi/dvm/rx.c
drivers/net/wireless/iwlwifi/dvm/rx.c
+12
-28
drivers/net/wireless/iwlwifi/dvm/testmode.c
drivers/net/wireless/iwlwifi/dvm/testmode.c
+0
-471
drivers/net/wireless/iwlwifi/dvm/tx.c
drivers/net/wireless/iwlwifi/dvm/tx.c
+0
-12
drivers/net/wireless/iwlwifi/iwl-7000.c
drivers/net/wireless/iwlwifi/iwl-7000.c
+6
-6
drivers/net/wireless/iwlwifi/iwl-config.h
drivers/net/wireless/iwlwifi/iwl-config.h
+1
-0
drivers/net/wireless/iwlwifi/iwl-drv.c
drivers/net/wireless/iwlwifi/iwl-drv.c
+0
-16
drivers/net/wireless/iwlwifi/iwl-modparams.h
drivers/net/wireless/iwlwifi/iwl-modparams.h
+0
-6
drivers/net/wireless/iwlwifi/iwl-test.c
drivers/net/wireless/iwlwifi/iwl-test.c
+0
-852
drivers/net/wireless/iwlwifi/iwl-test.h
drivers/net/wireless/iwlwifi/iwl-test.h
+0
-161
drivers/net/wireless/iwlwifi/iwl-testmode.h
drivers/net/wireless/iwlwifi/iwl-testmode.h
+0
-309
drivers/net/wireless/iwlwifi/iwl-trans.h
drivers/net/wireless/iwlwifi/iwl-trans.h
+0
-2
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
+20
-1
drivers/net/wireless/iwlwifi/mvm/d3.c
drivers/net/wireless/iwlwifi/mvm/d3.c
+6
-0
drivers/net/wireless/iwlwifi/mvm/debugfs.c
drivers/net/wireless/iwlwifi/mvm/debugfs.c
+26
-1
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
+5
-0
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
+51
-5
drivers/net/wireless/iwlwifi/mvm/mvm.h
drivers/net/wireless/iwlwifi/mvm/mvm.h
+7
-1
drivers/net/wireless/iwlwifi/mvm/power.c
drivers/net/wireless/iwlwifi/mvm/power.c
+20
-2
drivers/net/wireless/iwlwifi/mvm/rs.c
drivers/net/wireless/iwlwifi/mvm/rs.c
+12
-18
drivers/net/wireless/iwlwifi/mvm/tt.c
drivers/net/wireless/iwlwifi/mvm/tt.c
+20
-2
drivers/net/wireless/iwlwifi/pcie/rx.c
drivers/net/wireless/iwlwifi/pcie/rx.c
+41
-30
drivers/net/wireless/iwlwifi/pcie/trans.c
drivers/net/wireless/iwlwifi/pcie/trans.c
+9
-8
No files found.
drivers/net/wireless/iwlwifi/Kconfig
View file @
59731bb8
...
...
@@ -128,16 +128,6 @@ config IWLWIFI_DEVICE_TRACING
occur.
endmenu
config IWLWIFI_DEVICE_TESTMODE
def_bool y
depends on IWLWIFI
depends on NL80211_TESTMODE
help
This option enables the testmode support for iwlwifi device through
NL80211_TESTMODE. This provide the capabilities of enable user space
validation applications to interacts with the device through the
generic netlink message via NL80211_TESTMODE channel.
config IWLWIFI_P2P
def_bool y
bool "iwlwifi experimental P2P support"
...
...
drivers/net/wireless/iwlwifi/Makefile
View file @
59731bb8
...
...
@@ -13,7 +13,6 @@ iwlwifi-$(CONFIG_IWLMVM) += iwl-7000.o
iwlwifi-objs
+=
$
(
iwlwifi-m
)
iwlwifi-$(CONFIG_IWLWIFI_DEVICE_TRACING)
+=
iwl-devtrace.o
iwlwifi-$(CONFIG_IWLWIFI_DEVICE_TESTMODE)
+=
iwl-test.o
ccflags-y
+=
-D__CHECK_ENDIAN__
-I
$(src)
...
...
drivers/net/wireless/iwlwifi/dvm/Makefile
View file @
59731bb8
...
...
@@ -8,6 +8,5 @@ iwldvm-objs += scan.o led.o
iwldvm-objs
+=
rxon.o devices.o
iwldvm-$(CONFIG_IWLWIFI_DEBUGFS)
+=
debugfs.o
iwldvm-$(CONFIG_IWLWIFI_DEVICE_TESTMODE)
+=
testmode.o
ccflags-y
+=
-D__CHECK_ENDIAN__
-I
$(src)
/../
drivers/net/wireless/iwlwifi/dvm/agn.h
View file @
59731bb8
...
...
@@ -405,43 +405,6 @@ static inline __le32 iwl_hw_set_rate_n_flags(u8 rate, u32 flags)
extern
int
iwl_alive_start
(
struct
iwl_priv
*
priv
);
/* testmode support */
#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
extern
int
iwlagn_mac_testmode_cmd
(
struct
ieee80211_hw
*
hw
,
void
*
data
,
int
len
);
extern
int
iwlagn_mac_testmode_dump
(
struct
ieee80211_hw
*
hw
,
struct
sk_buff
*
skb
,
struct
netlink_callback
*
cb
,
void
*
data
,
int
len
);
extern
void
iwl_testmode_init
(
struct
iwl_priv
*
priv
);
extern
void
iwl_testmode_free
(
struct
iwl_priv
*
priv
);
#else
static
inline
int
iwlagn_mac_testmode_cmd
(
struct
ieee80211_hw
*
hw
,
void
*
data
,
int
len
)
{
return
-
ENOSYS
;
}
static
inline
int
iwlagn_mac_testmode_dump
(
struct
ieee80211_hw
*
hw
,
struct
sk_buff
*
skb
,
struct
netlink_callback
*
cb
,
void
*
data
,
int
len
)
{
return
-
ENOSYS
;
}
static
inline
void
iwl_testmode_init
(
struct
iwl_priv
*
priv
)
{
}
static
inline
void
iwl_testmode_free
(
struct
iwl_priv
*
priv
)
{
}
#endif
#ifdef CONFIG_IWLWIFI_DEBUG
void
iwl_print_rx_config_cmd
(
struct
iwl_priv
*
priv
,
enum
iwl_rxon_context_id
ctxid
);
...
...
drivers/net/wireless/iwlwifi/dvm/dev.h
View file @
59731bb8
...
...
@@ -52,8 +52,6 @@
#include "rs.h"
#include "tt.h"
#include "iwl-test.h"
/* CT-KILL constants */
#define CT_KILL_THRESHOLD_LEGACY 110
/* in Celsius */
#define CT_KILL_THRESHOLD 114
/* in Celsius */
...
...
@@ -691,10 +689,6 @@ struct iwl_priv {
struct
iwl_spectrum_notification
measure_report
;
u8
measurement_status
;
#define IWL_OWNERSHIP_DRIVER 0
#define IWL_OWNERSHIP_TM 1
u8
ucode_owner
;
/* ucode beacon time */
u32
ucode_beacon_time
;
int
missed_beacon_threshold
;
...
...
@@ -889,7 +883,7 @@ struct iwl_priv {
#endif
/* CONFIG_IWLWIFI_DEBUGFS */
struct
iwl_nvm_data
*
nvm_data
;
/* eeprom blob for debugfs
/testmode
*/
/* eeprom blob for debugfs */
u8
*
eeprom_blob
;
size_t
eeprom_blob_size
;
...
...
@@ -905,11 +899,6 @@ struct iwl_priv {
unsigned
long
blink_on
,
blink_off
;
bool
led_registered
;
#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
struct
iwl_test
tst
;
u32
tm_fixed_rate
;
#endif
/* WoWLAN GTK rekey data */
u8
kck
[
NL80211_KCK_LEN
],
kek
[
NL80211_KEK_LEN
];
__le64
replay_ctr
;
...
...
drivers/net/wireless/iwlwifi/dvm/lib.c
View file @
59731bb8
...
...
@@ -1288,12 +1288,6 @@ int iwl_dvm_send_cmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
if
(
!
(
cmd
->
flags
&
CMD_ASYNC
))
lockdep_assert_held
(
&
priv
->
mutex
);
if
(
priv
->
ucode_owner
==
IWL_OWNERSHIP_TM
&&
!
(
cmd
->
flags
&
CMD_ON_DEMAND
))
{
IWL_DEBUG_HC
(
priv
,
"tm own the uCode, no regular hcmd send
\n
"
);
return
-
EIO
;
}
return
iwl_trans_send_cmd
(
priv
->
trans
,
cmd
);
}
...
...
drivers/net/wireless/iwlwifi/dvm/mac80211.c
View file @
59731bb8
...
...
@@ -1766,8 +1766,6 @@ struct ieee80211_ops iwlagn_hw_ops = {
.
remain_on_channel
=
iwlagn_mac_remain_on_channel
,
.
cancel_remain_on_channel
=
iwlagn_mac_cancel_remain_on_channel
,
.
rssi_callback
=
iwlagn_mac_rssi_callback
,
CFG80211_TESTMODE_CMD
(
iwlagn_mac_testmode_cmd
)
CFG80211_TESTMODE_DUMP
(
iwlagn_mac_testmode_dump
)
.
set_tim
=
iwlagn_mac_set_tim
,
};
...
...
drivers/net/wireless/iwlwifi/dvm/main.c
View file @
59731bb8
...
...
@@ -1105,8 +1105,6 @@ static int iwl_init_drv(struct iwl_priv *priv)
priv
->
missed_beacon_threshold
=
IWL_MISSED_BEACON_THRESHOLD_DEF
;
priv
->
agg_tids_count
=
0
;
priv
->
ucode_owner
=
IWL_OWNERSHIP_DRIVER
;
priv
->
rx_statistics_jiffies
=
jiffies
;
/* Choose which receivers/antennas to use */
...
...
@@ -1172,12 +1170,6 @@ static void iwl_option_config(struct iwl_priv *priv)
IWL_INFO
(
priv
,
"CONFIG_IWLWIFI_DEVICE_TRACING disabled
\n
"
);
#endif
#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
IWL_INFO
(
priv
,
"CONFIG_IWLWIFI_DEVICE_TESTMODE enabled
\n
"
);
#else
IWL_INFO
(
priv
,
"CONFIG_IWLWIFI_DEVICE_TESTMODE disabled
\n
"
);
#endif
#ifdef CONFIG_IWLWIFI_P2P
IWL_INFO
(
priv
,
"CONFIG_IWLWIFI_P2P enabled
\n
"
);
#else
...
...
@@ -1355,8 +1347,8 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
IWL_BT_ANTENNA_COUPLING_THRESHOLD
)
?
true
:
false
;
/*
enable/disable bt channel inhibition
*/
priv
->
bt_ch_announce
=
iwlwifi_mod_params
.
bt_ch_announc
e
;
/*
bt channel inhibition enabled
*/
priv
->
bt_ch_announce
=
tru
e
;
IWL_DEBUG_INFO
(
priv
,
"BT channel inhibition is %s
\n
"
,
(
priv
->
bt_ch_announce
)
?
"On"
:
"Off"
);
...
...
@@ -1451,7 +1443,6 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
********************/
iwl_setup_deferred_work
(
priv
);
iwl_setup_rx_handlers
(
priv
);
iwl_testmode_init
(
priv
);
iwl_power_initialize
(
priv
);
iwl_tt_initialize
(
priv
);
...
...
@@ -1488,7 +1479,6 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
iwlagn_mac_unregister
(
priv
);
out_destroy_workqueue:
iwl_tt_exit
(
priv
);
iwl_testmode_free
(
priv
);
iwl_cancel_deferred_work
(
priv
);
destroy_workqueue
(
priv
->
workqueue
);
priv
->
workqueue
=
NULL
;
...
...
@@ -1510,7 +1500,6 @@ static void iwl_op_mode_dvm_stop(struct iwl_op_mode *op_mode)
IWL_DEBUG_INFO
(
priv
,
"*** UNLOAD DRIVER ***
\n
"
);
iwl_testmode_free
(
priv
);
iwlagn_mac_unregister
(
priv
);
iwl_tt_exit
(
priv
);
...
...
drivers/net/wireless/iwlwifi/dvm/rs.c
View file @
59731bb8
...
...
@@ -351,12 +351,6 @@ static void rs_program_fix_rate(struct iwl_priv *priv,
lq_sta
->
active_mimo2_rate
=
0x1FD0
;
/* 6 - 60 MBits, no 9, no CCK */
lq_sta
->
active_mimo3_rate
=
0x1FD0
;
/* 6 - 60 MBits, no 9, no CCK */
#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
/* testmode has higher priority to overwirte the fixed rate */
if
(
priv
->
tm_fixed_rate
)
lq_sta
->
dbg_fixed_rate
=
priv
->
tm_fixed_rate
;
#endif
IWL_DEBUG_RATE
(
priv
,
"sta_id %d rate 0x%X
\n
"
,
lq_sta
->
lq
.
sta_id
,
lq_sta
->
dbg_fixed_rate
);
...
...
@@ -419,23 +413,18 @@ static int rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
load
=
rs_tl_get_load
(
lq_data
,
tid
);
if
((
iwlwifi_mod_params
.
auto_agg
)
||
(
load
>
IWL_AGG_LOAD_THRESHOLD
))
{
IWL_DEBUG_HT
(
priv
,
"Starting Tx agg: STA: %pM tid: %d
\n
"
,
sta
->
addr
,
tid
);
ret
=
ieee80211_start_tx_ba_session
(
sta
,
tid
,
5000
);
if
(
ret
==
-
EAGAIN
)
{
/*
* driver and mac80211 is out of sync
* this might be cause by reloading firmware
* stop the tx ba session here
*/
IWL_ERR
(
priv
,
"Fail start Tx agg on tid: %d
\n
"
,
tid
);
ieee80211_stop_tx_ba_session
(
sta
,
tid
);
}
}
else
{
IWL_DEBUG_HT
(
priv
,
"Aggregation not enabled for tid %d "
"because load = %u
\n
"
,
tid
,
load
);
IWL_DEBUG_HT
(
priv
,
"Starting Tx agg: STA: %pM tid: %d
\n
"
,
sta
->
addr
,
tid
);
ret
=
ieee80211_start_tx_ba_session
(
sta
,
tid
,
5000
);
if
(
ret
==
-
EAGAIN
)
{
/*
* driver and mac80211 is out of sync
* this might be cause by reloading firmware
* stop the tx ba session here
*/
IWL_ERR
(
priv
,
"Fail start Tx agg on tid: %d
\n
"
,
tid
);
ieee80211_stop_tx_ba_session
(
sta
,
tid
);
}
return
ret
;
}
...
...
@@ -1083,11 +1072,6 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
if
(
sta
&&
sta
->
supp_rates
[
sband
->
band
])
rs_rate_scale_perform
(
priv
,
skb
,
sta
,
lq_sta
);
#if defined(CONFIG_MAC80211_DEBUGFS) && defined(CONFIG_IWLWIFI_DEVICE_TESTMODE)
if
((
priv
->
tm_fixed_rate
)
&&
(
priv
->
tm_fixed_rate
!=
lq_sta
->
dbg_fixed_rate
))
rs_program_fix_rate
(
priv
,
lq_sta
);
#endif
if
(
priv
->
lib
->
bt_params
&&
priv
->
lib
->
bt_params
->
advanced_bt_coexist
)
rs_bt_update_lq
(
priv
,
ctx
,
lq_sta
);
}
...
...
@@ -2913,9 +2897,6 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i
if
(
sband
->
band
==
IEEE80211_BAND_5GHZ
)
lq_sta
->
last_txrate_idx
+=
IWL_FIRST_OFDM_RATE
;
lq_sta
->
is_agg
=
0
;
#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
priv
->
tm_fixed_rate
=
0
;
#endif
#ifdef CONFIG_MAC80211_DEBUGFS
lq_sta
->
dbg_fixed_rate
=
0
;
#endif
...
...
drivers/net/wireless/iwlwifi/dvm/rx.c
View file @
59731bb8
...
...
@@ -335,8 +335,7 @@ static void iwlagn_recover_from_statistics(struct iwl_priv *priv,
if
(
msecs
<
99
)
return
;
if
(
iwlwifi_mod_params
.
plcp_check
&&
!
iwlagn_good_plcp_health
(
priv
,
cur_ofdm
,
cur_ofdm_ht
,
msecs
))
if
(
!
iwlagn_good_plcp_health
(
priv
,
cur_ofdm
,
cur_ofdm_ht
,
msecs
))
iwl_force_rf_reset
(
priv
,
false
);
}
...
...
@@ -1120,32 +1119,17 @@ int iwl_rx_dispatch(struct iwl_op_mode *op_mode, struct iwl_rx_cmd_buffer *rxb,
*/
iwl_notification_wait_notify
(
&
priv
->
notif_wait
,
pkt
);
#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
/*
* RX data may be forwarded to userspace in one
* of two cases: the user owns the fw through testmode or when
* the user requested to monitor the rx w/o affecting the regular flow.
* In these cases the iwl_test object will handle forwarding the rx
* data to user space.
* Note that if the ownership flag != IWL_OWNERSHIP_TM the flow
* continues.
*/
iwl_test_rx
(
&
priv
->
tst
,
rxb
);
#endif
if
(
priv
->
ucode_owner
!=
IWL_OWNERSHIP_TM
)
{
/* Based on type of command response or notification,
* handle those that need handling via function in
* rx_handlers table. See iwl_setup_rx_handlers() */
if
(
priv
->
rx_handlers
[
pkt
->
hdr
.
cmd
])
{
priv
->
rx_handlers_stats
[
pkt
->
hdr
.
cmd
]
++
;
err
=
priv
->
rx_handlers
[
pkt
->
hdr
.
cmd
]
(
priv
,
rxb
,
cmd
);
}
else
{
/* No handling needed */
IWL_DEBUG_RX
(
priv
,
"No handler needed for %s, 0x%02x
\n
"
,
iwl_dvm_get_cmd_string
(
pkt
->
hdr
.
cmd
),
pkt
->
hdr
.
cmd
);
}
/* Based on type of command response or notification,
* handle those that need handling via function in
* rx_handlers table. See iwl_setup_rx_handlers() */
if
(
priv
->
rx_handlers
[
pkt
->
hdr
.
cmd
])
{
priv
->
rx_handlers_stats
[
pkt
->
hdr
.
cmd
]
++
;
err
=
priv
->
rx_handlers
[
pkt
->
hdr
.
cmd
]
(
priv
,
rxb
,
cmd
);
}
else
{
/* No handling needed */
IWL_DEBUG_RX
(
priv
,
"No handler needed for %s, 0x%02x
\n
"
,
iwl_dvm_get_cmd_string
(
pkt
->
hdr
.
cmd
),
pkt
->
hdr
.
cmd
);
}
return
err
;
}
drivers/net/wireless/iwlwifi/dvm/testmode.c
deleted
100644 → 0
View file @
729d8d18
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/tx.c
View file @
59731bb8
...
...
@@ -162,18 +162,6 @@ static void iwlagn_tx_cmd_build_rate(struct iwl_priv *priv,
if
(
ieee80211_is_data
(
fc
))
{
tx_cmd
->
initial_rate_index
=
0
;
tx_cmd
->
tx_flags
|=
TX_CMD_FLG_STA_RATE_MSK
;
#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
if
(
priv
->
tm_fixed_rate
)
{
/*
* rate overwrite by testmode
* we not only send lq command to change rate
* we also re-enforce per data pkt base.
*/
tx_cmd
->
tx_flags
&=
~
TX_CMD_FLG_STA_RATE_MSK
;
memcpy
(
&
tx_cmd
->
rate_n_flags
,
&
priv
->
tm_fixed_rate
,
sizeof
(
tx_cmd
->
rate_n_flags
));
}
#endif
return
;
}
else
if
(
ieee80211_is_back_req
(
fc
))
tx_cmd
->
tx_flags
|=
TX_CMD_FLG_STA_RATE_MSK
;
...
...
drivers/net/wireless/iwlwifi/iwl-7000.c
View file @
59731bb8
...
...
@@ -67,16 +67,16 @@
#include "iwl-agn-hw.h"
/* Highest firmware API version supported */
#define IWL7260_UCODE_API_MAX
6
#define IWL3160_UCODE_API_MAX
6
#define IWL7260_UCODE_API_MAX
7
#define IWL3160_UCODE_API_MAX
7
/* Oldest version we won't warn about */
#define IWL7260_UCODE_API_OK
6
#define IWL3160_UCODE_API_OK
6
#define IWL7260_UCODE_API_OK
7
#define IWL3160_UCODE_API_OK
7
/* Lowest firmware API version supported */
#define IWL7260_UCODE_API_MIN
6
#define IWL3160_UCODE_API_MIN
6
#define IWL7260_UCODE_API_MIN
7
#define IWL3160_UCODE_API_MIN
7
/* NVM versions */
#define IWL7260_NVM_VERSION 0x0a1d
...
...
drivers/net/wireless/iwlwifi/iwl-config.h
View file @
59731bb8
...
...
@@ -222,6 +222,7 @@ struct iwl_cfg {
const
u32
max_inst_size
;
u8
valid_tx_ant
;
u8
valid_rx_ant
;
bool
bt_shared_single_ant
;
u16
nvm_ver
;
u16
nvm_calib_ver
;
/* params not likely to change within a device family */
...
...
drivers/net/wireless/iwlwifi/iwl-drv.c
View file @
59731bb8
...
...
@@ -1111,11 +1111,8 @@ void iwl_drv_stop(struct iwl_drv *drv)
/* shared module parameters */
struct
iwl_mod_params
iwlwifi_mod_params
=
{
.
restart_fw
=
true
,
.
plcp_check
=
true
,
.
bt_coex_active
=
true
,
.
power_level
=
IWL_POWER_INDEX_1
,
.
bt_ch_announce
=
true
,
.
auto_agg
=
true
,
.
wd_disable
=
true
,
/* the rest are 0 by default */
};
...
...
@@ -1223,14 +1220,6 @@ module_param_named(antenna_coupling, iwlwifi_mod_params.ant_coupling,
MODULE_PARM_DESC
(
antenna_coupling
,
"specify antenna coupling in dB (defualt: 0 dB)"
);
module_param_named
(
bt_ch_inhibition
,
iwlwifi_mod_params
.
bt_ch_announce
,
bool
,
S_IRUGO
);
MODULE_PARM_DESC
(
bt_ch_inhibition
,
"Enable BT channel inhibition (default: enable)"
);
module_param_named
(
plcp_check
,
iwlwifi_mod_params
.
plcp_check
,
bool
,
S_IRUGO
);
MODULE_PARM_DESC
(
plcp_check
,
"Check plcp health (default: 1 [enabled])"
);
module_param_named
(
wd_disable
,
iwlwifi_mod_params
.
wd_disable
,
int
,
S_IRUGO
);
MODULE_PARM_DESC
(
wd_disable
,
"Disable stuck queue watchdog timer 0=system default, "
...
...
@@ -1272,8 +1261,3 @@ module_param_named(power_level, iwlwifi_mod_params.power_level,
int
,
S_IRUGO
);
MODULE_PARM_DESC
(
power_level
,
"default power save level (range from 1 - 5, default: 1)"
);
module_param_named
(
auto_agg
,
iwlwifi_mod_params
.
auto_agg
,
bool
,
S_IRUGO
);
MODULE_PARM_DESC
(
auto_agg
,
"enable agg w/o check traffic load (default: enable)"
);
drivers/net/wireless/iwlwifi/iwl-modparams.h
View file @
59731bb8
...
...
@@ -93,7 +93,6 @@ enum iwl_power_level {
* use IWL_DISABLE_HT_* constants
* @amsdu_size_8K: enable 8K amsdu size, default = 0
* @restart_fw: restart firmware, default = 1
* @plcp_check: enable plcp health check, default = true
* @wd_disable: enable stuck queue check, default = 0
* @bt_coex_active: enable bt coex, default = true
* @led_mode: system default, default = 0
...
...
@@ -101,15 +100,12 @@ enum iwl_power_level {
* @power_level: power level, default = 1
* @debug_level: levels are IWL_DL_*
* @ant_coupling: antenna coupling in dB, default = 0
* @bt_ch_announce: BT channel inhibition, default = enable
* @auto_agg: enable agg. without check, default = true
*/
struct
iwl_mod_params
{
int
sw_crypto
;
unsigned
int
disable_11n
;
int
amsdu_size_8K
;
bool
restart_fw
;
bool
plcp_check
;
int
wd_disable
;
bool
bt_coex_active
;
int
led_mode
;
...
...
@@ -119,8 +115,6 @@ struct iwl_mod_params {
u32
debug_level
;
#endif
int
ant_coupling
;
bool
bt_ch_announce
;
bool
auto_agg
;
char
*
nvm_file
;
};
...
...
drivers/net/wireless/iwlwifi/iwl-test.c
deleted
100644 → 0
View file @
729d8d18
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-test.h
deleted
100644 → 0
View file @
729d8d18
/******************************************************************************
*
* This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license.
*
* GPL LICENSE SUMMARY
*
* Copyright(c) 2010 - 2013 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
* USA
*
* The full GNU General Public License is included in this distribution
* in the file called COPYING.
*
* Contact Information:
* Intel Linux Wireless <ilw@linux.intel.com>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
*
* Copyright(c) 2010 - 2013 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
#ifndef __IWL_TEST_H__
#define __IWL_TEST_H__
#include <linux/types.h>
#include "iwl-trans.h"
struct
iwl_test_trace
{
u32
size
;
u32
tsize
;
u32
nchunks
;
u8
*
cpu_addr
;
u8
*
trace_addr
;
dma_addr_t
dma_addr
;
bool
enabled
;
};
struct
iwl_test_mem
{
u32
size
;
u32
nchunks
;
u8
*
addr
;
bool
in_read
;
};
/*
* struct iwl_test_ops: callback to the op mode
*
* The structure defines the callbacks that the op_mode should handle,
* inorder to handle logic that is out of the scope of iwl_test. The
* op_mode must set all the callbacks.
* @send_cmd: handler that is used by the test object to request the
* op_mode to send a command to the fw.
*
* @valid_hw_addr: handler that is used by the test object to request the
* op_mode to check if the given address is a valid address.
*
* @get_fw_ver: handler used to get the FW version.
*
* @alloc_reply: handler used by the test object to request the op_mode
* to allocate an skb for sending a reply to the user, and initialize
* the skb. It is assumed that the test object only fills the required
* attributes.
*
* @reply: handler used by the test object to request the op_mode to reply
* to a request. The skb is an skb previously allocated by the the
* alloc_reply callback.
I
* @alloc_event: handler used by the test object to request the op_mode
* to allocate an skb for sending an event, and initialize
* the skb. It is assumed that the test object only fills the required
* attributes.
*
* @reply: handler used by the test object to request the op_mode to send
* an event. The skb is an skb previously allocated by the the
* alloc_event callback.
*/
struct
iwl_test_ops
{
int
(
*
send_cmd
)(
struct
iwl_op_mode
*
op_modes
,
struct
iwl_host_cmd
*
cmd
);
bool
(
*
valid_hw_addr
)(
u32
addr
);
u32
(
*
get_fw_ver
)(
struct
iwl_op_mode
*
op_mode
);
struct
sk_buff
*
(
*
alloc_reply
)(
struct
iwl_op_mode
*
op_mode
,
int
len
);
int
(
*
reply
)(
struct
iwl_op_mode
*
op_mode
,
struct
sk_buff
*
skb
);
struct
sk_buff
*
(
*
alloc_event
)(
struct
iwl_op_mode
*
op_mode
,
int
len
);
void
(
*
event
)(
struct
iwl_op_mode
*
op_mode
,
struct
sk_buff
*
skb
);
};
struct
iwl_test
{
struct
iwl_trans
*
trans
;
struct
iwl_test_ops
*
ops
;
struct
iwl_test_trace
trace
;
struct
iwl_test_mem
mem
;
bool
notify
;
};
void
iwl_test_init
(
struct
iwl_test
*
tst
,
struct
iwl_trans
*
trans
,
struct
iwl_test_ops
*
ops
);
void
iwl_test_free
(
struct
iwl_test
*
tst
);
int
iwl_test_parse
(
struct
iwl_test
*
tst
,
struct
nlattr
**
tb
,
void
*
data
,
int
len
);
int
iwl_test_handle_cmd
(
struct
iwl_test
*
tst
,
struct
nlattr
**
tb
);
int
iwl_test_dump
(
struct
iwl_test
*
tst
,
u32
cmd
,
struct
sk_buff
*
skb
,
struct
netlink_callback
*
cb
);
void
iwl_test_rx
(
struct
iwl_test
*
tst
,
struct
iwl_rx_cmd_buffer
*
rxb
);
static
inline
void
iwl_test_enable_notifications
(
struct
iwl_test
*
tst
,
bool
enable
)
{
tst
->
notify
=
enable
;
}
#endif
drivers/net/wireless/iwlwifi/iwl-testmode.h
deleted
100644 → 0
View file @
729d8d18
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-trans.h
View file @
59731bb8
...
...
@@ -183,14 +183,12 @@ struct iwl_rx_packet {
* @CMD_ASYNC: Return right away and don't want 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_ON_DEMAND: This command is sent by the test mode pipe.
*/
enum
CMD_MODE
{
CMD_SYNC
=
0
,
CMD_ASYNC
=
BIT
(
0
),
CMD_WANT_SKB
=
BIT
(
1
),
CMD_SEND_IN_RFKILL
=
BIT
(
2
),
CMD_ON_DEMAND
=
BIT
(
3
),
};
#define DEF_CMD_PAYLOAD_SIZE 320
...
...
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
View file @
59731bb8
...
...
@@ -202,6 +202,22 @@ static const __le32 iwl_concurrent_lookup[BT_COEX_LUT_SIZE] = {
cpu_to_le32
(
0x00000000
),
};
/* single shared antenna */
static
const
__le32
iwl_single_shared_ant_lookup
[
BT_COEX_LUT_SIZE
]
=
{
cpu_to_le32
(
0x40000000
),
cpu_to_le32
(
0x00000000
),
cpu_to_le32
(
0x44000000
),
cpu_to_le32
(
0x00000000
),
cpu_to_le32
(
0x40000000
),
cpu_to_le32
(
0x00000000
),
cpu_to_le32
(
0x44000000
),
cpu_to_le32
(
0x00000000
),
cpu_to_le32
(
0xC0004000
),
cpu_to_le32
(
0xF0005000
),
cpu_to_le32
(
0xC0004000
),
cpu_to_le32
(
0xF0005000
),
};
int
iwl_send_bt_init_conf
(
struct
iwl_mvm
*
mvm
)
{
struct
iwl_bt_coex_cmd
cmd
=
{
...
...
@@ -225,7 +241,10 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
BT_VALID_REDUCED_TX_POWER
|
BT_VALID_LUT
);
if
(
is_loose_coex
())
if
(
mvm
->
cfg
->
bt_shared_single_ant
)
memcpy
(
&
cmd
.
decision_lut
,
iwl_single_shared_ant_lookup
,
sizeof
(
iwl_single_shared_ant_lookup
));
else
if
(
is_loose_coex
())
memcpy
(
&
cmd
.
decision_lut
,
iwl_loose_lookup
,
sizeof
(
iwl_tight_lookup
));
else
...
...
drivers/net/wireless/iwlwifi/mvm/d3.c
View file @
59731bb8
...
...
@@ -1026,6 +1026,12 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
if
(
ret
)
goto
out
;
#ifdef CONFIG_IWLWIFI_DEBUGFS
if
(
mvm
->
d3_wake_sysassert
)
d3_cfg_cmd_data
.
wakeup_flags
|=
cpu_to_le32
(
IWL_WAKEUP_D3_CONFIG_FW_ERROR
);
#endif
/* must be last -- this switches firmware state */
ret
=
iwl_mvm_send_cmd
(
mvm
,
&
d3_cfg_cmd
);
if
(
ret
)
...
...
drivers/net/wireless/iwlwifi/mvm/debugfs.c
View file @
59731bb8
...
...
@@ -344,6 +344,13 @@ static void iwl_dbgfs_update_pm(struct iwl_mvm *mvm,
case
MVM_DEBUGFS_PM_DISABLE_POWER_OFF
:
IWL_DEBUG_POWER
(
mvm
,
"disable_power_off=%d
\n
"
,
val
);
dbgfs_pm
->
disable_power_off
=
val
;
case
MVM_DEBUGFS_PM_LPRX_ENA
:
IWL_DEBUG_POWER
(
mvm
,
"lprx %s
\n
"
,
val
?
"enabled"
:
"disabled"
);
dbgfs_pm
->
lprx_ena
=
val
;
break
;
case
MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD
:
IWL_DEBUG_POWER
(
mvm
,
"lprx_rssi_threshold=%d
\n
"
,
val
);
dbgfs_pm
->
lprx_rssi_threshold
=
val
;
break
;
}
}
...
...
@@ -387,6 +394,17 @@ static ssize_t iwl_dbgfs_pm_params_write(struct file *file,
if
(
sscanf
(
buf
+
18
,
"%d"
,
&
val
)
!=
1
)
return
-
EINVAL
;
param
=
MVM_DEBUGFS_PM_DISABLE_POWER_OFF
;
}
else
if
(
!
strncmp
(
"lprx="
,
buf
,
5
))
{
if
(
sscanf
(
buf
+
5
,
"%d"
,
&
val
)
!=
1
)
return
-
EINVAL
;
param
=
MVM_DEBUGFS_PM_LPRX_ENA
;
}
else
if
(
!
strncmp
(
"lprx_rssi_threshold="
,
buf
,
20
))
{
if
(
sscanf
(
buf
+
20
,
"%d"
,
&
val
)
!=
1
)
return
-
EINVAL
;
if
(
val
>
POWER_LPRX_RSSI_THRESHOLD_MAX
||
val
<
POWER_LPRX_RSSI_THRESHOLD_MIN
)
return
-
EINVAL
;
param
=
MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD
;
}
else
{
return
-
EINVAL
;
}
...
...
@@ -421,7 +439,7 @@ static ssize_t iwl_dbgfs_pm_params_read(struct file *file,
le32_to_cpu
(
cmd
.
skip_dtim_periods
));
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"power_scheme = %d
\n
"
,
iwlmvm_mod_params
.
power_scheme
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"flags =
%d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"flags =
0x%x
\n
"
,
le16_to_cpu
(
cmd
.
flags
));
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"keep_alive = %d
\n
"
,
cmd
.
keep_alive_seconds
);
...
...
@@ -435,6 +453,10 @@ static ssize_t iwl_dbgfs_pm_params_read(struct file *file,
le32_to_cpu
(
cmd
.
rx_data_timeout
));
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"tx_data_timeout = %d
\n
"
,
le32_to_cpu
(
cmd
.
tx_data_timeout
));
if
(
cmd
.
flags
&
cpu_to_le16
(
POWER_FLAGS_LPRX_ENA_MSK
))
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"lprx_rssi_threshold = %d
\n
"
,
le32_to_cpu
(
cmd
.
lprx_rssi_threshold
));
}
return
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
pos
);
...
...
@@ -939,6 +961,9 @@ int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)
#ifdef CONFIG_PM_SLEEP
MVM_DEBUGFS_ADD_FILE
(
d3_sram
,
mvm
->
debugfs_dir
,
S_IRUSR
|
S_IWUSR
);
MVM_DEBUGFS_ADD_FILE
(
d3_test
,
mvm
->
debugfs_dir
,
S_IRUSR
);
if
(
!
debugfs_create_bool
(
"d3_wake_sysassert"
,
S_IRUSR
|
S_IWUSR
,
mvm
->
debugfs_dir
,
&
mvm
->
d3_wake_sysassert
))
goto
err
;
#endif
/*
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
View file @
59731bb8
...
...
@@ -66,6 +66,11 @@
/* Power Management Commands, Responses, Notifications */
/* Radio LP RX Energy Threshold measured in dBm */
#define POWER_LPRX_RSSI_THRESHOLD 75
#define POWER_LPRX_RSSI_THRESHOLD_MAX 94
#define POWER_LPRX_RSSI_THRESHOLD_MIN 30
/**
* enum iwl_scan_flags - masks for power table command flags
* @POWER_FLAGS_POWER_SAVE_ENA_MSK: '1' Allow to save power by turning off
...
...
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
View file @
59731bb8
...
...
@@ -865,6 +865,30 @@ int iwl_mvm_mac_ctxt_beacon_changed(struct iwl_mvm *mvm,
return
ret
;
}
struct
iwl_mvm_mac_ap_iterator_data
{
struct
iwl_mvm
*
mvm
;
struct
ieee80211_vif
*
vif
;
u32
beacon_device_ts
;
u16
beacon_int
;
};
/* Find the beacon_device_ts and beacon_int for a managed interface */
static
void
iwl_mvm_mac_ap_iterator
(
void
*
_data
,
u8
*
mac
,
struct
ieee80211_vif
*
vif
)
{
struct
iwl_mvm_mac_ap_iterator_data
*
data
=
_data
;
if
(
vif
->
type
!=
NL80211_IFTYPE_STATION
||
!
vif
->
bss_conf
.
assoc
)
return
;
/* Station client has higher priority over P2P client*/
if
(
vif
->
p2p
&&
data
->
beacon_device_ts
)
return
;
data
->
beacon_device_ts
=
vif
->
bss_conf
.
sync_device_ts
;
data
->
beacon_int
=
vif
->
bss_conf
.
beacon_int
;
}
/*
* Fill the specific data for mac context of type AP of P2P GO
*/
...
...
@@ -874,6 +898,11 @@ static void iwl_mvm_mac_ctxt_cmd_fill_ap(struct iwl_mvm *mvm,
bool
add
)
{
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
struct
iwl_mvm_mac_ap_iterator_data
data
=
{
.
mvm
=
mvm
,
.
vif
=
vif
,
.
beacon_device_ts
=
0
};
ctxt_ap
->
bi
=
cpu_to_le32
(
vif
->
bss_conf
.
beacon_int
);
ctxt_ap
->
bi_reciprocal
=
...
...
@@ -887,16 +916,33 @@ static void iwl_mvm_mac_ctxt_cmd_fill_ap(struct iwl_mvm *mvm,
ctxt_ap
->
mcast_qid
=
cpu_to_le32
(
vif
->
cab_queue
);
/*
* Only
read the system
time when the MAC is being added, when we
* Only
set the beacon
time when the MAC is being added, when we
* just modify the MAC then we should keep the time -- the firmware
* can otherwise have a "jumping" TBTT.
*/
if
(
add
)
mvmvif
->
ap_beacon_time
=
iwl_read_prph
(
mvm
->
trans
,
DEVICE_SYSTEM_TIME_REG
);
if
(
add
)
{
/*
* If there is a station/P2P client interface which is
* associated, set the AP's TBTT far enough from the station's
* TBTT. Otherwise, set it to the current system time
*/
ieee80211_iterate_active_interfaces_atomic
(
mvm
->
hw
,
IEEE80211_IFACE_ITER_RESUME_ALL
,
iwl_mvm_mac_ap_iterator
,
&
data
);
if
(
data
.
beacon_device_ts
)
{
u32
rand
=
(
prandom_u32
()
%
(
80
-
20
))
+
20
;
mvmvif
->
ap_beacon_time
=
data
.
beacon_device_ts
+
ieee80211_tu_to_usec
(
data
.
beacon_int
*
rand
/
100
);
}
else
{
mvmvif
->
ap_beacon_time
=
iwl_read_prph
(
mvm
->
trans
,
DEVICE_SYSTEM_TIME_REG
);
}
}
ctxt_ap
->
beacon_time
=
cpu_to_le32
(
mvmvif
->
ap_beacon_time
);
ctxt_ap
->
beacon_tsf
=
0
;
/* unused */
/* TODO: Assume that the beacon id == mac context id */
...
...
drivers/net/wireless/iwlwifi/mvm/mvm.h
View file @
59731bb8
...
...
@@ -73,7 +73,6 @@
#include "iwl-trans.h"
#include "iwl-notif-wait.h"
#include "iwl-eeprom-parse.h"
#include "iwl-test.h"
#include "iwl-trans.h"
#include "sta.h"
#include "fw-api.h"
...
...
@@ -159,6 +158,8 @@ enum iwl_dbgfs_pm_mask {
MVM_DEBUGFS_PM_RX_DATA_TIMEOUT
=
BIT
(
3
),
MVM_DEBUGFS_PM_TX_DATA_TIMEOUT
=
BIT
(
4
),
MVM_DEBUGFS_PM_DISABLE_POWER_OFF
=
BIT
(
5
),
MVM_DEBUGFS_PM_LPRX_ENA
=
BIT
(
6
),
MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD
=
BIT
(
7
),
};
struct
iwl_dbgfs_pm
{
...
...
@@ -168,6 +169,8 @@ struct iwl_dbgfs_pm {
bool
skip_over_dtim
;
u8
skip_dtim_periods
;
bool
disable_power_off
;
bool
lprx_ena
;
u32
lprx_rssi_threshold
;
int
mask
;
};
...
...
@@ -353,12 +356,14 @@ struct iwl_tt_params {
* @dynamic_smps: Is thermal throttling enabled dynamic_smps?
* @tx_backoff: The current thremal throttling tx backoff in uSec.
* @params: Parameters to configure the thermal throttling algorithm.
* @throttle: Is thermal throttling is active?
*/
struct
iwl_mvm_tt_mgmt
{
struct
delayed_work
ct_kill_exit
;
bool
dynamic_smps
;
u32
tx_backoff
;
const
struct
iwl_tt_params
*
params
;
bool
throttle
;
};
struct
iwl_mvm
{
...
...
@@ -461,6 +466,7 @@ struct iwl_mvm {
struct
wiphy_wowlan_support
wowlan
;
int
gtk_ivlen
,
gtk_icvlen
,
ptk_ivlen
,
ptk_icvlen
;
#ifdef CONFIG_IWLWIFI_DEBUGFS
u32
d3_wake_sysassert
;
/* must be u32 for debugfs_create_bool */
bool
d3_test_active
;
bool
store_d3_resume_sram
;
void
*
d3_resume_sram
;
...
...
drivers/net/wireless/iwlwifi/mvm/power.c
View file @
59731bb8
...
...
@@ -137,11 +137,12 @@ static void iwl_mvm_power_log(struct iwl_mvm *mvm,
le32_to_cpu
(
cmd
->
rx_data_timeout
));
IWL_DEBUG_POWER
(
mvm
,
"Tx timeout = %u usec
\n
"
,
le32_to_cpu
(
cmd
->
tx_data_timeout
));
IWL_DEBUG_POWER
(
mvm
,
"LP RX RSSI threshold = %u
\n
"
,
cmd
->
lprx_rssi_threshold
);
if
(
cmd
->
flags
&
cpu_to_le16
(
POWER_FLAGS_SKIP_OVER_DTIM_MSK
))
IWL_DEBUG_POWER
(
mvm
,
"DTIM periods to skip = %u
\n
"
,
le32_to_cpu
(
cmd
->
skip_dtim_periods
));
if
(
cmd
->
flags
&
cpu_to_le16
(
POWER_FLAGS_LPRX_ENA_MSK
))
IWL_DEBUG_POWER
(
mvm
,
"LP RX RSSI threshold = %u
\n
"
,
le32_to_cpu
(
cmd
->
lprx_rssi_threshold
));
}
}
...
...
@@ -181,6 +182,14 @@ void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
cmd
->
flags
|=
cpu_to_le16
(
POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK
);
if
(
vif
->
bss_conf
.
beacon_rate
&&
(
vif
->
bss_conf
.
beacon_rate
->
bitrate
==
10
||
vif
->
bss_conf
.
beacon_rate
->
bitrate
==
60
))
{
cmd
->
flags
|=
cpu_to_le16
(
POWER_FLAGS_LPRX_ENA_MSK
);
cmd
->
lprx_rssi_threshold
=
cpu_to_le32
(
POWER_LPRX_RSSI_THRESHOLD
);
}
dtimper
=
hw
->
conf
.
ps_dtim_period
?:
1
;
/* Check if radar detection is required on current channel */
...
...
@@ -236,6 +245,15 @@ void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
if
(
mvmvif
->
dbgfs_pm
.
mask
&
MVM_DEBUGFS_PM_SKIP_DTIM_PERIODS
)
cmd
->
skip_dtim_periods
=
cpu_to_le32
(
mvmvif
->
dbgfs_pm
.
skip_dtim_periods
);
if
(
mvmvif
->
dbgfs_pm
.
mask
&
MVM_DEBUGFS_PM_LPRX_ENA
)
{
if
(
mvmvif
->
dbgfs_pm
.
lprx_ena
)
cmd
->
flags
|=
cpu_to_le16
(
POWER_FLAGS_LPRX_ENA_MSK
);
else
cmd
->
flags
&=
cpu_to_le16
(
~
POWER_FLAGS_LPRX_ENA_MSK
);
}
if
(
mvmvif
->
dbgfs_pm
.
mask
&
MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD
)
cmd
->
lprx_rssi_threshold
=
cpu_to_le32
(
mvmvif
->
dbgfs_pm
.
lprx_rssi_threshold
);
#endif
/* CONFIG_IWLWIFI_DEBUGFS */
}
...
...
drivers/net/wireless/iwlwifi/mvm/rs.c
View file @
59731bb8
...
...
@@ -412,24 +412,18 @@ static int rs_tl_turn_on_agg_for_tid(struct iwl_mvm *mvm,
return
ret
;
}
if
((
iwlwifi_mod_params
.
auto_agg
)
||
(
load
>
IWL_AGG_LOAD_THRESHOLD
))
{
IWL_DEBUG_HT
(
mvm
,
"Starting Tx agg: STA: %pM tid: %d
\n
"
,
sta
->
addr
,
tid
);
ret
=
ieee80211_start_tx_ba_session
(
sta
,
tid
,
5000
);
if
(
ret
==
-
EAGAIN
)
{
/*
* driver and mac80211 is out of sync
* this might be cause by reloading firmware
* stop the tx ba session here
*/
IWL_ERR
(
mvm
,
"Fail start Tx agg on tid: %d
\n
"
,
tid
);
ieee80211_stop_tx_ba_session
(
sta
,
tid
);
}
}
else
{
IWL_DEBUG_HT
(
mvm
,
"Aggregation not enabled for tid %d because load = %u
\n
"
,
tid
,
load
);
IWL_DEBUG_HT
(
mvm
,
"Starting Tx agg: STA: %pM tid: %d
\n
"
,
sta
->
addr
,
tid
);
ret
=
ieee80211_start_tx_ba_session
(
sta
,
tid
,
5000
);
if
(
ret
==
-
EAGAIN
)
{
/*
* driver and mac80211 is out of sync
* this might be cause by reloading firmware
* stop the tx ba session here
*/
IWL_ERR
(
mvm
,
"Fail start Tx agg on tid: %d
\n
"
,
tid
);
ieee80211_stop_tx_ba_session
(
sta
,
tid
);
}
return
ret
;
}
...
...
drivers/net/wireless/iwlwifi/mvm/tt.c
View file @
59731bb8
...
...
@@ -427,6 +427,7 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
const
struct
iwl_tt_params
*
params
=
mvm
->
thermal_throttle
.
params
;
struct
iwl_mvm_tt_mgmt
*
tt
=
&
mvm
->
thermal_throttle
;
s32
temperature
=
mvm
->
temperature
;
bool
throttle_enable
=
false
;
int
i
;
u32
tx_backoff
;
...
...
@@ -445,6 +446,7 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
ieee80211_iterate_active_interfaces_atomic
(
mvm
->
hw
,
IEEE80211_IFACE_ITER_NORMAL
,
iwl_mvm_tt_smps_iterator
,
mvm
);
throttle_enable
=
true
;
}
else
if
(
tt
->
dynamic_smps
&&
temperature
<=
params
->
dynamic_smps_exit
)
{
IWL_DEBUG_TEMP
(
mvm
,
"Disable dynamic SMPS
\n
"
);
...
...
@@ -456,10 +458,12 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
}
if
(
params
->
support_tx_protection
)
{
if
(
temperature
>=
params
->
tx_protection_entry
)
if
(
temperature
>=
params
->
tx_protection_entry
)
{
iwl_mvm_tt_tx_protection
(
mvm
,
true
);
else
if
(
temperature
<=
params
->
tx_protection_exit
)
throttle_enable
=
true
;
}
else
if
(
temperature
<=
params
->
tx_protection_exit
)
{
iwl_mvm_tt_tx_protection
(
mvm
,
false
);
}
}
if
(
params
->
support_tx_backoff
)
{
...
...
@@ -469,9 +473,22 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
break
;
tx_backoff
=
params
->
tx_backoff
[
i
].
backoff
;
}
if
(
tx_backoff
!=
0
)
throttle_enable
=
true
;
if
(
tt
->
tx_backoff
!=
tx_backoff
)
iwl_mvm_tt_tx_backoff
(
mvm
,
tx_backoff
);
}
if
(
!
tt
->
throttle
&&
throttle_enable
)
{
IWL_WARN
(
mvm
,
"Due to high temperature thermal throttling initiated
\n
"
);
tt
->
throttle
=
true
;
}
else
if
(
tt
->
throttle
&&
!
tt
->
dynamic_smps
&&
tt
->
tx_backoff
==
0
&&
temperature
<=
params
->
tx_protection_exit
)
{
IWL_WARN
(
mvm
,
"Temperature is back to normal thermal throttling stopped
\n
"
);
tt
->
throttle
=
false
;
}
}
static
const
struct
iwl_tt_params
iwl7000_tt_params
=
{
...
...
@@ -502,6 +519,7 @@ void iwl_mvm_tt_initialize(struct iwl_mvm *mvm)
IWL_DEBUG_TEMP
(
mvm
,
"Initialize Thermal Throttling
\n
"
);
tt
->
params
=
&
iwl7000_tt_params
;
tt
->
throttle
=
false
;
INIT_DELAYED_WORK
(
&
tt
->
ct_kill_exit
,
check_exit_ctkill
);
}
...
...
drivers/net/wireless/iwlwifi/pcie/rx.c
View file @
59731bb8
...
...
@@ -110,9 +110,10 @@
/*
* iwl_rxq_space - Return number of free slots available in queue.
*/
static
int
iwl_rxq_space
(
const
struct
iwl_rxq
*
q
)
static
int
iwl_rxq_space
(
const
struct
iwl_rxq
*
rx
q
)
{
int
s
=
q
->
read
-
q
->
write
;
int
s
=
rxq
->
read
-
rxq
->
write
;
if
(
s
<=
0
)
s
+=
RX_QUEUE_SIZE
;
/* keep some buffer to not confuse full and empty queue */
...
...
@@ -143,21 +144,22 @@ int iwl_pcie_rx_stop(struct iwl_trans *trans)
/*
* iwl_pcie_rxq_inc_wr_ptr - Update the write pointer for the RX queue
*/
static
void
iwl_pcie_rxq_inc_wr_ptr
(
struct
iwl_trans
*
trans
,
struct
iwl_rxq
*
q
)
static
void
iwl_pcie_rxq_inc_wr_ptr
(
struct
iwl_trans
*
trans
,
struct
iwl_rxq
*
rxq
)
{
unsigned
long
flags
;
u32
reg
;
spin_lock_irqsave
(
&
q
->
lock
,
flags
);
spin_lock_irqsave
(
&
rx
q
->
lock
,
flags
);
if
(
q
->
need_update
==
0
)
if
(
rx
q
->
need_update
==
0
)
goto
exit_unlock
;
if
(
trans
->
cfg
->
base_params
->
shadow_reg_enable
)
{
/* shadow register enabled */
/* Device expects a multiple of 8 */
q
->
write_actual
=
(
q
->
write
&
~
0x7
);
iwl_write32
(
trans
,
FH_RSCSR_CHNL0_WPTR
,
q
->
write_actual
);
rxq
->
write_actual
=
(
rx
q
->
write
&
~
0x7
);
iwl_write32
(
trans
,
FH_RSCSR_CHNL0_WPTR
,
rx
q
->
write_actual
);
}
else
{
struct
iwl_trans_pcie
*
trans_pcie
=
IWL_TRANS_GET_PCIE_TRANS
(
trans
);
...
...
@@ -175,22 +177,22 @@ static void iwl_pcie_rxq_inc_wr_ptr(struct iwl_trans *trans, struct iwl_rxq *q)
goto
exit_unlock
;
}
q
->
write_actual
=
(
q
->
write
&
~
0x7
);
rxq
->
write_actual
=
(
rx
q
->
write
&
~
0x7
);
iwl_write_direct32
(
trans
,
FH_RSCSR_CHNL0_WPTR
,
q
->
write_actual
);
rx
q
->
write_actual
);
/* Else device is assumed to be awake */
}
else
{
/* Device expects a multiple of 8 */
q
->
write_actual
=
(
q
->
write
&
~
0x7
);
rxq
->
write_actual
=
(
rx
q
->
write
&
~
0x7
);
iwl_write_direct32
(
trans
,
FH_RSCSR_CHNL0_WPTR
,
q
->
write_actual
);
rx
q
->
write_actual
);
}
}
q
->
need_update
=
0
;
rx
q
->
need_update
=
0
;
exit_unlock:
spin_unlock_irqrestore
(
&
q
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
rx
q
->
lock
,
flags
);
}
/*
...
...
@@ -355,19 +357,16 @@ static void iwl_pcie_rxq_free_rbs(struct iwl_trans *trans)
struct
iwl_rxq
*
rxq
=
&
trans_pcie
->
rxq
;
int
i
;
/* Fill the rx_used queue with _all_ of the Rx buffers */
lockdep_assert_held
(
&
rxq
->
lock
);
for
(
i
=
0
;
i
<
RX_FREE_BUFFERS
+
RX_QUEUE_SIZE
;
i
++
)
{
/* In the reset function, these buffers may have been allocated
* to an SKB, so we need to unmap and free potential storage */
if
(
rxq
->
pool
[
i
].
page
!=
NULL
)
{
dma_unmap_page
(
trans
->
dev
,
rxq
->
pool
[
i
].
page_dma
,
PAGE_SIZE
<<
trans_pcie
->
rx_page_order
,
DMA_FROM_DEVICE
);
__free_pages
(
rxq
->
pool
[
i
].
page
,
trans_pcie
->
rx_page_order
);
rxq
->
pool
[
i
].
page
=
NULL
;
}
list_add_tail
(
&
rxq
->
pool
[
i
].
list
,
&
rxq
->
rx_used
);
if
(
!
rxq
->
pool
[
i
].
page
)
continue
;
dma_unmap_page
(
trans
->
dev
,
rxq
->
pool
[
i
].
page_dma
,
PAGE_SIZE
<<
trans_pcie
->
rx_page_order
,
DMA_FROM_DEVICE
);
__free_pages
(
rxq
->
pool
[
i
].
page
,
trans_pcie
->
rx_page_order
);
rxq
->
pool
[
i
].
page
=
NULL
;
}
}
...
...
@@ -491,6 +490,20 @@ static void iwl_pcie_rx_hw_init(struct iwl_trans *trans, struct iwl_rxq *rxq)
iwl_write8
(
trans
,
CSR_INT_COALESCING
,
IWL_HOST_INT_TIMEOUT_DEF
);
}
static
void
iwl_pcie_rx_init_rxb_lists
(
struct
iwl_rxq
*
rxq
)
{
int
i
;
lockdep_assert_held
(
&
rxq
->
lock
);
INIT_LIST_HEAD
(
&
rxq
->
rx_free
);
INIT_LIST_HEAD
(
&
rxq
->
rx_used
);
rxq
->
free_count
=
0
;
for
(
i
=
0
;
i
<
RX_FREE_BUFFERS
+
RX_QUEUE_SIZE
;
i
++
)
list_add
(
&
rxq
->
pool
[
i
].
list
,
&
rxq
->
rx_used
);
}
int
iwl_pcie_rx_init
(
struct
iwl_trans
*
trans
)
{
struct
iwl_trans_pcie
*
trans_pcie
=
IWL_TRANS_GET_PCIE_TRANS
(
trans
);
...
...
@@ -505,13 +518,12 @@ int iwl_pcie_rx_init(struct iwl_trans *trans)
}
spin_lock_irqsave
(
&
rxq
->
lock
,
flags
);
INIT_LIST_HEAD
(
&
rxq
->
rx_free
);
INIT_LIST_HEAD
(
&
rxq
->
rx_used
);
INIT_WORK
(
&
trans_pcie
->
rx_replenish
,
iwl_pcie_rx_replenish_work
);
INIT_WORK
(
&
trans_pcie
->
rx_replenish
,
iwl_pcie_rx_replenish_work
);
/* free all first - we might be reconfigured for a different size */
iwl_pcie_rxq_free_rbs
(
trans
);
iwl_pcie_rx_init_rxb_lists
(
rxq
);
for
(
i
=
0
;
i
<
RX_QUEUE_SIZE
;
i
++
)
rxq
->
queue
[
i
]
=
NULL
;
...
...
@@ -520,7 +532,6 @@ int iwl_pcie_rx_init(struct iwl_trans *trans)
* not restocked the Rx queue with fresh buffers */
rxq
->
read
=
rxq
->
write
=
0
;
rxq
->
write_actual
=
0
;
rxq
->
free_count
=
0
;
memset
(
rxq
->
rb_stts
,
0
,
sizeof
(
*
rxq
->
rb_stts
));
spin_unlock_irqrestore
(
&
rxq
->
lock
,
flags
);
...
...
drivers/net/wireless/iwlwifi/pcie/trans.c
View file @
59731bb8
...
...
@@ -838,8 +838,9 @@ static bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans, bool silent,
unsigned
long
*
flags
)
{
int
ret
;
struct
iwl_trans_pcie
*
pcie_trans
=
IWL_TRANS_GET_PCIE_TRANS
(
trans
);
spin_lock_irqsave
(
&
pcie_trans
->
reg_lock
,
*
flags
);
struct
iwl_trans_pcie
*
trans_pcie
=
IWL_TRANS_GET_PCIE_TRANS
(
trans
);
spin_lock_irqsave
(
&
trans_pcie
->
reg_lock
,
*
flags
);
/* this bit wakes up the NIC */
__iwl_trans_pcie_set_bit
(
trans
,
CSR_GP_CNTRL
,
...
...
@@ -875,7 +876,7 @@ static bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans, bool silent,
WARN_ONCE
(
1
,
"Timeout waiting for hardware access (CSR_GP_CNTRL 0x%08x)
\n
"
,
val
);
spin_unlock_irqrestore
(
&
pcie_trans
->
reg_lock
,
*
flags
);
spin_unlock_irqrestore
(
&
trans_pcie
->
reg_lock
,
*
flags
);
return
false
;
}
}
...
...
@@ -884,22 +885,22 @@ static bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans, bool silent,
* Fool sparse by faking we release the lock - sparse will
* track nic_access anyway.
*/
__release
(
&
pcie_trans
->
reg_lock
);
__release
(
&
trans_pcie
->
reg_lock
);
return
true
;
}
static
void
iwl_trans_pcie_release_nic_access
(
struct
iwl_trans
*
trans
,
unsigned
long
*
flags
)
{
struct
iwl_trans_pcie
*
pcie_trans
=
IWL_TRANS_GET_PCIE_TRANS
(
trans
);
struct
iwl_trans_pcie
*
trans_pcie
=
IWL_TRANS_GET_PCIE_TRANS
(
trans
);
lockdep_assert_held
(
&
pcie_trans
->
reg_lock
);
lockdep_assert_held
(
&
trans_pcie
->
reg_lock
);
/*
* Fool sparse by faking we acquiring the lock - sparse will
* track nic_access anyway.
*/
__acquire
(
&
pcie_trans
->
reg_lock
);
__acquire
(
&
trans_pcie
->
reg_lock
);
__iwl_trans_pcie_clear_bit
(
trans
,
CSR_GP_CNTRL
,
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ
);
...
...
@@ -910,7 +911,7 @@ static void iwl_trans_pcie_release_nic_access(struct iwl_trans *trans,
* scheduled on different CPUs (after we drop reg_lock).
*/
mmiowb
();
spin_unlock_irqrestore
(
&
pcie_trans
->
reg_lock
,
*
flags
);
spin_unlock_irqrestore
(
&
trans_pcie
->
reg_lock
,
*
flags
);
}
static
int
iwl_trans_pcie_read_mem
(
struct
iwl_trans
*
trans
,
u32
addr
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment