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
Kirill Smelkov
linux
Commits
20416229
Commit
20416229
authored
Aug 02, 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
e3d52914
147fc9be
Changes
48
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
48 changed files
with
1309 additions
and
893 deletions
+1309
-893
MAINTAINERS
MAINTAINERS
+1
-1
drivers/net/wireless/iwlwifi/Kconfig
drivers/net/wireless/iwlwifi/Kconfig
+0
-17
drivers/net/wireless/iwlwifi/dvm/agn.h
drivers/net/wireless/iwlwifi/dvm/agn.h
+0
-6
drivers/net/wireless/iwlwifi/dvm/debugfs.c
drivers/net/wireless/iwlwifi/dvm/debugfs.c
+0
-15
drivers/net/wireless/iwlwifi/dvm/dev.h
drivers/net/wireless/iwlwifi/dvm/dev.h
+0
-7
drivers/net/wireless/iwlwifi/dvm/mac80211.c
drivers/net/wireless/iwlwifi/dvm/mac80211.c
+1
-171
drivers/net/wireless/iwlwifi/dvm/main.c
drivers/net/wireless/iwlwifi/dvm/main.c
+0
-62
drivers/net/wireless/iwlwifi/dvm/rs.c
drivers/net/wireless/iwlwifi/dvm/rs.c
+0
-3
drivers/net/wireless/iwlwifi/dvm/rxon.c
drivers/net/wireless/iwlwifi/dvm/rxon.c
+1
-5
drivers/net/wireless/iwlwifi/dvm/scan.c
drivers/net/wireless/iwlwifi/dvm/scan.c
+1
-104
drivers/net/wireless/iwlwifi/dvm/tx.c
drivers/net/wireless/iwlwifi/dvm/tx.c
+0
-19
drivers/net/wireless/iwlwifi/iwl-7000.c
drivers/net/wireless/iwlwifi/iwl-7000.c
+11
-0
drivers/net/wireless/iwlwifi/iwl-config.h
drivers/net/wireless/iwlwifi/iwl-config.h
+4
-0
drivers/net/wireless/iwlwifi/iwl-fw.h
drivers/net/wireless/iwlwifi/iwl-fw.h
+14
-5
drivers/net/wireless/iwlwifi/iwl-io.c
drivers/net/wireless/iwlwifi/iwl-io.c
+67
-0
drivers/net/wireless/iwlwifi/iwl-io.h
drivers/net/wireless/iwlwifi/iwl-io.h
+3
-0
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
+6
-2
drivers/net/wireless/iwlwifi/mvm/Makefile
drivers/net/wireless/iwlwifi/mvm/Makefile
+1
-1
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
+98
-64
drivers/net/wireless/iwlwifi/mvm/constants.h
drivers/net/wireless/iwlwifi/mvm/constants.h
+71
-0
drivers/net/wireless/iwlwifi/mvm/d3.c
drivers/net/wireless/iwlwifi/mvm/d3.c
+49
-17
drivers/net/wireless/iwlwifi/mvm/debugfs.c
drivers/net/wireless/iwlwifi/mvm/debugfs.c
+53
-63
drivers/net/wireless/iwlwifi/mvm/fw-api-d3.h
drivers/net/wireless/iwlwifi/mvm/fw-api-d3.h
+39
-10
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
+119
-24
drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
+4
-1
drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h
drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h
+0
-2
drivers/net/wireless/iwlwifi/mvm/fw-api.h
drivers/net/wireless/iwlwifi/mvm/fw-api.h
+26
-1
drivers/net/wireless/iwlwifi/mvm/fw.c
drivers/net/wireless/iwlwifi/mvm/fw.c
+0
-55
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
+2
-1
drivers/net/wireless/iwlwifi/mvm/mac80211.c
drivers/net/wireless/iwlwifi/mvm/mac80211.c
+34
-6
drivers/net/wireless/iwlwifi/mvm/mvm.h
drivers/net/wireless/iwlwifi/mvm/mvm.h
+64
-19
drivers/net/wireless/iwlwifi/mvm/ops.c
drivers/net/wireless/iwlwifi/mvm/ops.c
+53
-3
drivers/net/wireless/iwlwifi/mvm/power.c
drivers/net/wireless/iwlwifi/mvm/power.c
+134
-64
drivers/net/wireless/iwlwifi/mvm/power_legacy.c
drivers/net/wireless/iwlwifi/mvm/power_legacy.c
+319
-0
drivers/net/wireless/iwlwifi/mvm/quota.c
drivers/net/wireless/iwlwifi/mvm/quota.c
+8
-8
drivers/net/wireless/iwlwifi/mvm/rs.c
drivers/net/wireless/iwlwifi/mvm/rs.c
+4
-6
drivers/net/wireless/iwlwifi/mvm/rs.h
drivers/net/wireless/iwlwifi/mvm/rs.h
+2
-2
drivers/net/wireless/iwlwifi/mvm/rx.c
drivers/net/wireless/iwlwifi/mvm/rx.c
+46
-32
drivers/net/wireless/iwlwifi/mvm/scan.c
drivers/net/wireless/iwlwifi/mvm/scan.c
+2
-0
drivers/net/wireless/iwlwifi/mvm/sta.c
drivers/net/wireless/iwlwifi/mvm/sta.c
+1
-2
drivers/net/wireless/iwlwifi/mvm/tt.c
drivers/net/wireless/iwlwifi/mvm/tt.c
+29
-3
drivers/net/wireless/iwlwifi/mvm/tx.c
drivers/net/wireless/iwlwifi/mvm/tx.c
+2
-0
drivers/net/wireless/iwlwifi/mvm/utils.c
drivers/net/wireless/iwlwifi/mvm/utils.c
+23
-0
drivers/net/wireless/iwlwifi/pcie/drv.c
drivers/net/wireless/iwlwifi/pcie/drv.c
+3
-3
drivers/net/wireless/iwlwifi/pcie/internal.h
drivers/net/wireless/iwlwifi/pcie/internal.h
+0
-1
drivers/net/wireless/iwlwifi/pcie/rx.c
drivers/net/wireless/iwlwifi/pcie/rx.c
+1
-1
drivers/net/wireless/iwlwifi/pcie/trans.c
drivers/net/wireless/iwlwifi/pcie/trans.c
+11
-84
drivers/net/wireless/iwlwifi/pcie/tx.c
drivers/net/wireless/iwlwifi/pcie/tx.c
+2
-3
No files found.
MAINTAINERS
View file @
20416229
...
@@ -4362,7 +4362,7 @@ F: drivers/net/wireless/iwlegacy/
...
@@ -4362,7 +4362,7 @@ F: drivers/net/wireless/iwlegacy/
INTEL WIRELESS WIFI LINK (iwlwifi)
INTEL WIRELESS WIFI LINK (iwlwifi)
M: Johannes Berg <johannes.berg@intel.com>
M: Johannes Berg <johannes.berg@intel.com>
M:
Wey-Yi Guy <wey-yi.w.guy
@intel.com>
M:
Emmanuel Grumbach <emmanuel.grumbach
@intel.com>
M: Intel Linux Wireless <ilw@linux.intel.com>
M: Intel Linux Wireless <ilw@linux.intel.com>
L: linux-wireless@vger.kernel.org
L: linux-wireless@vger.kernel.org
W: http://intellinuxwireless.org
W: http://intellinuxwireless.org
...
...
drivers/net/wireless/iwlwifi/Kconfig
View file @
20416229
...
@@ -127,20 +127,3 @@ config IWLWIFI_DEVICE_TRACING
...
@@ -127,20 +127,3 @@ config IWLWIFI_DEVICE_TRACING
If unsure, say Y so we can help you better when problems
If unsure, say Y so we can help you better when problems
occur.
occur.
endmenu
endmenu
config IWLWIFI_P2P
def_bool y
bool "iwlwifi experimental P2P support"
depends on IWLWIFI
help
This option enables experimental P2P support for some devices
based on microcode support. Since P2P support is still under
development, this option may even enable it for some devices
now that turn out to not support it in the future due to
microcode restrictions.
To determine if your microcode supports the experimental P2P
offered by this option, check if the driver advertises AP
support when it is loaded.
Say Y only if you want to experiment with P2P.
drivers/net/wireless/iwlwifi/dvm/agn.h
View file @
20416229
...
@@ -106,7 +106,6 @@ extern const struct iwl_dvm_cfg iwl_dvm_6030_cfg;
...
@@ -106,7 +106,6 @@ extern const struct iwl_dvm_cfg iwl_dvm_6030_cfg;
#define STATUS_CHANNEL_SWITCH_PENDING 11
#define STATUS_CHANNEL_SWITCH_PENDING 11
#define STATUS_SCAN_COMPLETE 12
#define STATUS_SCAN_COMPLETE 12
#define STATUS_POWER_PMI 13
#define STATUS_POWER_PMI 13
#define STATUS_SCAN_ROC_EXPIRED 14
struct
iwl_ucode_capabilities
;
struct
iwl_ucode_capabilities
;
...
@@ -250,7 +249,6 @@ u8 iwl_toggle_tx_ant(struct iwl_priv *priv, u8 ant_idx, u8 valid);
...
@@ -250,7 +249,6 @@ u8 iwl_toggle_tx_ant(struct iwl_priv *priv, u8 ant_idx, u8 valid);
/* scan */
/* scan */
void
iwlagn_post_scan
(
struct
iwl_priv
*
priv
);
void
iwlagn_post_scan
(
struct
iwl_priv
*
priv
);
void
iwlagn_disable_roc
(
struct
iwl_priv
*
priv
);
int
iwl_force_rf_reset
(
struct
iwl_priv
*
priv
,
bool
external
);
int
iwl_force_rf_reset
(
struct
iwl_priv
*
priv
,
bool
external
);
void
iwl_init_scan_params
(
struct
iwl_priv
*
priv
);
void
iwl_init_scan_params
(
struct
iwl_priv
*
priv
);
int
iwl_scan_cancel
(
struct
iwl_priv
*
priv
);
int
iwl_scan_cancel
(
struct
iwl_priv
*
priv
);
...
@@ -265,10 +263,6 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv,
...
@@ -265,10 +263,6 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv,
enum
iwl_scan_type
scan_type
,
enum
iwl_scan_type
scan_type
,
enum
ieee80211_band
band
);
enum
ieee80211_band
band
);
void
iwl_scan_roc_expired
(
struct
iwl_priv
*
priv
);
void
iwl_scan_offchannel_skb
(
struct
iwl_priv
*
priv
);
void
iwl_scan_offchannel_skb_status
(
struct
iwl_priv
*
priv
);
/* For faster active scanning, scan will move to the next channel if fewer than
/* For faster active scanning, scan will move to the next channel if fewer than
* PLCP_QUIET_THRESH packets are heard on this channel within
* PLCP_QUIET_THRESH packets are heard on this channel within
* ACTIVE_QUIET_TIME after sending probe request. This shortens the dwell
* ACTIVE_QUIET_TIME after sending probe request. This shortens the dwell
...
...
drivers/net/wireless/iwlwifi/dvm/debugfs.c
View file @
20416229
...
@@ -69,19 +69,7 @@
...
@@ -69,19 +69,7 @@
} while (0)
} while (0)
/* file operation */
/* file operation */
#define DEBUGFS_READ_FUNC(name) \
static ssize_t iwl_dbgfs_##name##_read(struct file *file, \
char __user *user_buf, \
size_t count, loff_t *ppos);
#define DEBUGFS_WRITE_FUNC(name) \
static ssize_t iwl_dbgfs_##name##_write(struct file *file, \
const char __user *user_buf, \
size_t count, loff_t *ppos);
#define DEBUGFS_READ_FILE_OPS(name) \
#define DEBUGFS_READ_FILE_OPS(name) \
DEBUGFS_READ_FUNC(name); \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
.read = iwl_dbgfs_##name##_read, \
.read = iwl_dbgfs_##name##_read, \
.open = simple_open, \
.open = simple_open, \
...
@@ -89,7 +77,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \
...
@@ -89,7 +77,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \
};
};
#define DEBUGFS_WRITE_FILE_OPS(name) \
#define DEBUGFS_WRITE_FILE_OPS(name) \
DEBUGFS_WRITE_FUNC(name); \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
.write = iwl_dbgfs_##name##_write, \
.write = iwl_dbgfs_##name##_write, \
.open = simple_open, \
.open = simple_open, \
...
@@ -98,8 +85,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \
...
@@ -98,8 +85,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \
#define DEBUGFS_READ_WRITE_FILE_OPS(name) \
#define DEBUGFS_READ_WRITE_FILE_OPS(name) \
DEBUGFS_READ_FUNC(name); \
DEBUGFS_WRITE_FUNC(name); \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
.write = iwl_dbgfs_##name##_write, \
.write = iwl_dbgfs_##name##_write, \
.read = iwl_dbgfs_##name##_read, \
.read = iwl_dbgfs_##name##_read, \
...
...
drivers/net/wireless/iwlwifi/dvm/dev.h
View file @
20416229
...
@@ -540,7 +540,6 @@ struct iwl_rxon_context {
...
@@ -540,7 +540,6 @@ struct iwl_rxon_context {
enum
iwl_scan_type
{
enum
iwl_scan_type
{
IWL_SCAN_NORMAL
,
IWL_SCAN_NORMAL
,
IWL_SCAN_RADIO_RESET
,
IWL_SCAN_RADIO_RESET
,
IWL_SCAN_ROC
,
};
};
/**
/**
...
@@ -825,12 +824,6 @@ struct iwl_priv {
...
@@ -825,12 +824,6 @@ struct iwl_priv {
struct
reply_tx_error_statistics
reply_tx_stats
;
struct
reply_tx_error_statistics
reply_tx_stats
;
struct
reply_agg_tx_error_statistics
reply_agg_tx_stats
;
struct
reply_agg_tx_error_statistics
reply_agg_tx_stats
;
/* remain-on-channel offload support */
struct
ieee80211_channel
*
hw_roc_channel
;
struct
delayed_work
hw_roc_disable_work
;
int
hw_roc_duration
;
bool
hw_roc_setup
,
hw_roc_start_notified
;
/* bt coex */
/* bt coex */
u8
bt_enable_flag
;
u8
bt_enable_flag
;
u8
bt_status
;
u8
bt_status
;
...
...
drivers/net/wireless/iwlwifi/dvm/mac80211.c
View file @
20416229
...
@@ -76,29 +76,6 @@ static const struct ieee80211_iface_limit iwlagn_2sta_limits[] = {
...
@@ -76,29 +76,6 @@ static const struct ieee80211_iface_limit iwlagn_2sta_limits[] = {
},
},
};
};
static
const
struct
ieee80211_iface_limit
iwlagn_p2p_sta_go_limits
[]
=
{
{
.
max
=
1
,
.
types
=
BIT
(
NL80211_IFTYPE_STATION
),
},
{
.
max
=
1
,
.
types
=
BIT
(
NL80211_IFTYPE_P2P_GO
)
|
BIT
(
NL80211_IFTYPE_AP
),
},
};
static
const
struct
ieee80211_iface_limit
iwlagn_p2p_2sta_limits
[]
=
{
{
.
max
=
2
,
.
types
=
BIT
(
NL80211_IFTYPE_STATION
),
},
{
.
max
=
1
,
.
types
=
BIT
(
NL80211_IFTYPE_P2P_CLIENT
),
},
};
static
const
struct
ieee80211_iface_combination
static
const
struct
ieee80211_iface_combination
iwlagn_iface_combinations_dualmode
[]
=
{
iwlagn_iface_combinations_dualmode
[]
=
{
{
.
num_different_channels
=
1
,
{
.
num_different_channels
=
1
,
...
@@ -114,21 +91,6 @@ iwlagn_iface_combinations_dualmode[] = {
...
@@ -114,21 +91,6 @@ iwlagn_iface_combinations_dualmode[] = {
},
},
};
};
static
const
struct
ieee80211_iface_combination
iwlagn_iface_combinations_p2p
[]
=
{
{
.
num_different_channels
=
1
,
.
max_interfaces
=
2
,
.
beacon_int_infra_match
=
true
,
.
limits
=
iwlagn_p2p_sta_go_limits
,
.
n_limits
=
ARRAY_SIZE
(
iwlagn_p2p_sta_go_limits
),
},
{
.
num_different_channels
=
1
,
.
max_interfaces
=
2
,
.
limits
=
iwlagn_p2p_2sta_limits
,
.
n_limits
=
ARRAY_SIZE
(
iwlagn_p2p_2sta_limits
),
},
};
/*
/*
* Not a mac80211 entry point function, but it fits in with all the
* Not a mac80211 entry point function, but it fits in with all the
* other mac80211 functions grouped here.
* other mac80211 functions grouped here.
...
@@ -186,19 +148,13 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
...
@@ -186,19 +148,13 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
BUILD_BUG_ON
(
NUM_IWL_RXON_CTX
!=
2
);
BUILD_BUG_ON
(
NUM_IWL_RXON_CTX
!=
2
);
if
(
hw
->
wiphy
->
interface_modes
&
BIT
(
NL80211_IFTYPE_P2P_CLIENT
))
{
if
(
hw
->
wiphy
->
interface_modes
&
BIT
(
NL80211_IFTYPE_AP
))
{
hw
->
wiphy
->
iface_combinations
=
iwlagn_iface_combinations_p2p
;
hw
->
wiphy
->
n_iface_combinations
=
ARRAY_SIZE
(
iwlagn_iface_combinations_p2p
);
}
else
if
(
hw
->
wiphy
->
interface_modes
&
BIT
(
NL80211_IFTYPE_AP
))
{
hw
->
wiphy
->
iface_combinations
=
hw
->
wiphy
->
iface_combinations
=
iwlagn_iface_combinations_dualmode
;
iwlagn_iface_combinations_dualmode
;
hw
->
wiphy
->
n_iface_combinations
=
hw
->
wiphy
->
n_iface_combinations
=
ARRAY_SIZE
(
iwlagn_iface_combinations_dualmode
);
ARRAY_SIZE
(
iwlagn_iface_combinations_dualmode
);
}
}
hw
->
wiphy
->
max_remain_on_channel_duration
=
500
;
hw
->
wiphy
->
flags
|=
WIPHY_FLAG_CUSTOM_REGULATORY
|
hw
->
wiphy
->
flags
|=
WIPHY_FLAG_CUSTOM_REGULATORY
|
WIPHY_FLAG_DISABLE_BEACON_HINTS
|
WIPHY_FLAG_DISABLE_BEACON_HINTS
|
WIPHY_FLAG_IBSS_RSN
;
WIPHY_FLAG_IBSS_RSN
;
...
@@ -1156,126 +1112,6 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
...
@@ -1156,126 +1112,6 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
IWL_DEBUG_MAC80211
(
priv
,
"leave
\n
"
);
IWL_DEBUG_MAC80211
(
priv
,
"leave
\n
"
);
}
}
static
int
iwlagn_mac_remain_on_channel
(
struct
ieee80211_hw
*
hw
,
struct
ieee80211_vif
*
vif
,
struct
ieee80211_channel
*
channel
,
int
duration
,
enum
ieee80211_roc_type
type
)
{
struct
iwl_priv
*
priv
=
IWL_MAC80211_GET_DVM
(
hw
);
struct
iwl_rxon_context
*
ctx
=
&
priv
->
contexts
[
IWL_RXON_CTX_PAN
];
int
err
=
0
;
if
(
!
(
priv
->
valid_contexts
&
BIT
(
IWL_RXON_CTX_PAN
)))
return
-
EOPNOTSUPP
;
if
(
!
(
ctx
->
interface_modes
&
BIT
(
NL80211_IFTYPE_P2P_CLIENT
)))
return
-
EOPNOTSUPP
;
IWL_DEBUG_MAC80211
(
priv
,
"enter
\n
"
);
mutex_lock
(
&
priv
->
mutex
);
if
(
test_bit
(
STATUS_SCAN_HW
,
&
priv
->
status
))
{
/* mac80211 should not scan while ROC or ROC while scanning */
if
(
WARN_ON_ONCE
(
priv
->
scan_type
!=
IWL_SCAN_RADIO_RESET
))
{
err
=
-
EBUSY
;
goto
out
;
}
iwl_scan_cancel_timeout
(
priv
,
100
);
if
(
test_bit
(
STATUS_SCAN_HW
,
&
priv
->
status
))
{
err
=
-
EBUSY
;
goto
out
;
}
}
priv
->
hw_roc_channel
=
channel
;
/* convert from ms to TU */
priv
->
hw_roc_duration
=
DIV_ROUND_UP
(
1000
*
duration
,
1024
);
priv
->
hw_roc_start_notified
=
false
;
cancel_delayed_work
(
&
priv
->
hw_roc_disable_work
);
if
(
!
ctx
->
is_active
)
{
static
const
struct
iwl_qos_info
default_qos_data
=
{
.
def_qos_parm
=
{
.
ac
[
0
]
=
{
.
cw_min
=
cpu_to_le16
(
3
),
.
cw_max
=
cpu_to_le16
(
7
),
.
aifsn
=
2
,
.
edca_txop
=
cpu_to_le16
(
1504
),
},
.
ac
[
1
]
=
{
.
cw_min
=
cpu_to_le16
(
7
),
.
cw_max
=
cpu_to_le16
(
15
),
.
aifsn
=
2
,
.
edca_txop
=
cpu_to_le16
(
3008
),
},
.
ac
[
2
]
=
{
.
cw_min
=
cpu_to_le16
(
15
),
.
cw_max
=
cpu_to_le16
(
1023
),
.
aifsn
=
3
,
},
.
ac
[
3
]
=
{
.
cw_min
=
cpu_to_le16
(
15
),
.
cw_max
=
cpu_to_le16
(
1023
),
.
aifsn
=
7
,
},
},
};
ctx
->
is_active
=
true
;
ctx
->
qos_data
=
default_qos_data
;
ctx
->
staging
.
dev_type
=
RXON_DEV_TYPE_P2P
;
memcpy
(
ctx
->
staging
.
node_addr
,
priv
->
contexts
[
IWL_RXON_CTX_BSS
].
staging
.
node_addr
,
ETH_ALEN
);
memcpy
(
ctx
->
staging
.
bssid_addr
,
priv
->
contexts
[
IWL_RXON_CTX_BSS
].
staging
.
node_addr
,
ETH_ALEN
);
err
=
iwlagn_commit_rxon
(
priv
,
ctx
);
if
(
err
)
goto
out
;
ctx
->
staging
.
filter_flags
|=
RXON_FILTER_ASSOC_MSK
|
RXON_FILTER_PROMISC_MSK
|
RXON_FILTER_CTL2HOST_MSK
;
err
=
iwlagn_commit_rxon
(
priv
,
ctx
);
if
(
err
)
{
iwlagn_disable_roc
(
priv
);
goto
out
;
}
priv
->
hw_roc_setup
=
true
;
}
err
=
iwl_scan_initiate
(
priv
,
ctx
->
vif
,
IWL_SCAN_ROC
,
channel
->
band
);
if
(
err
)
iwlagn_disable_roc
(
priv
);
out:
mutex_unlock
(
&
priv
->
mutex
);
IWL_DEBUG_MAC80211
(
priv
,
"leave
\n
"
);
return
err
;
}
static
int
iwlagn_mac_cancel_remain_on_channel
(
struct
ieee80211_hw
*
hw
)
{
struct
iwl_priv
*
priv
=
IWL_MAC80211_GET_DVM
(
hw
);
if
(
!
(
priv
->
valid_contexts
&
BIT
(
IWL_RXON_CTX_PAN
)))
return
-
EOPNOTSUPP
;
IWL_DEBUG_MAC80211
(
priv
,
"enter
\n
"
);
mutex_lock
(
&
priv
->
mutex
);
iwl_scan_cancel_timeout
(
priv
,
priv
->
hw_roc_duration
);
iwlagn_disable_roc
(
priv
);
mutex_unlock
(
&
priv
->
mutex
);
IWL_DEBUG_MAC80211
(
priv
,
"leave
\n
"
);
return
0
;
}
static
void
iwlagn_mac_rssi_callback
(
struct
ieee80211_hw
*
hw
,
static
void
iwlagn_mac_rssi_callback
(
struct
ieee80211_hw
*
hw
,
struct
ieee80211_vif
*
vif
,
struct
ieee80211_vif
*
vif
,
enum
ieee80211_rssi_event
rssi_event
)
enum
ieee80211_rssi_event
rssi_event
)
...
@@ -1431,12 +1267,8 @@ static int iwlagn_mac_add_interface(struct ieee80211_hw *hw,
...
@@ -1431,12 +1267,8 @@ static int iwlagn_mac_add_interface(struct ieee80211_hw *hw,
IWL_DEBUG_MAC80211
(
priv
,
"enter: type %d, addr %pM
\n
"
,
IWL_DEBUG_MAC80211
(
priv
,
"enter: type %d, addr %pM
\n
"
,
viftype
,
vif
->
addr
);
viftype
,
vif
->
addr
);
cancel_delayed_work_sync
(
&
priv
->
hw_roc_disable_work
);
mutex_lock
(
&
priv
->
mutex
);
mutex_lock
(
&
priv
->
mutex
);
iwlagn_disable_roc
(
priv
);
if
(
!
iwl_is_ready_rf
(
priv
))
{
if
(
!
iwl_is_ready_rf
(
priv
))
{
IWL_WARN
(
priv
,
"Try to add interface when device not ready
\n
"
);
IWL_WARN
(
priv
,
"Try to add interface when device not ready
\n
"
);
err
=
-
EINVAL
;
err
=
-
EINVAL
;
...
@@ -1763,8 +1595,6 @@ struct ieee80211_ops iwlagn_hw_ops = {
...
@@ -1763,8 +1595,6 @@ struct ieee80211_ops iwlagn_hw_ops = {
.
channel_switch
=
iwlagn_mac_channel_switch
,
.
channel_switch
=
iwlagn_mac_channel_switch
,
.
flush
=
iwlagn_mac_flush
,
.
flush
=
iwlagn_mac_flush
,
.
tx_last_beacon
=
iwlagn_mac_tx_last_beacon
,
.
tx_last_beacon
=
iwlagn_mac_tx_last_beacon
,
.
remain_on_channel
=
iwlagn_mac_remain_on_channel
,
.
cancel_remain_on_channel
=
iwlagn_mac_cancel_remain_on_channel
,
.
rssi_callback
=
iwlagn_mac_rssi_callback
,
.
rssi_callback
=
iwlagn_mac_rssi_callback
,
.
set_tim
=
iwlagn_mac_set_tim
,
.
set_tim
=
iwlagn_mac_set_tim
,
};
};
...
...
drivers/net/wireless/iwlwifi/dvm/main.c
View file @
20416229
...
@@ -587,11 +587,6 @@ static void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags)
...
@@ -587,11 +587,6 @@ static void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags)
priv
->
contexts
[
IWL_RXON_CTX_PAN
].
interface_modes
=
priv
->
contexts
[
IWL_RXON_CTX_PAN
].
interface_modes
=
BIT
(
NL80211_IFTYPE_STATION
)
|
BIT
(
NL80211_IFTYPE_AP
);
BIT
(
NL80211_IFTYPE_STATION
)
|
BIT
(
NL80211_IFTYPE_AP
);
if
(
ucode_flags
&
IWL_UCODE_TLV_FLAGS_P2P
)
priv
->
contexts
[
IWL_RXON_CTX_PAN
].
interface_modes
|=
BIT
(
NL80211_IFTYPE_P2P_CLIENT
)
|
BIT
(
NL80211_IFTYPE_P2P_GO
);
priv
->
contexts
[
IWL_RXON_CTX_PAN
].
ap_devtype
=
RXON_DEV_TYPE_CP
;
priv
->
contexts
[
IWL_RXON_CTX_PAN
].
ap_devtype
=
RXON_DEV_TYPE_CP
;
priv
->
contexts
[
IWL_RXON_CTX_PAN
].
station_devtype
=
RXON_DEV_TYPE_2STA
;
priv
->
contexts
[
IWL_RXON_CTX_PAN
].
station_devtype
=
RXON_DEV_TYPE_2STA
;
priv
->
contexts
[
IWL_RXON_CTX_PAN
].
unused_devtype
=
RXON_DEV_TYPE_P2P
;
priv
->
contexts
[
IWL_RXON_CTX_PAN
].
unused_devtype
=
RXON_DEV_TYPE_P2P
;
...
@@ -854,14 +849,6 @@ void iwl_down(struct iwl_priv *priv)
...
@@ -854,14 +849,6 @@ void iwl_down(struct iwl_priv *priv)
iwl_scan_cancel_timeout
(
priv
,
200
);
iwl_scan_cancel_timeout
(
priv
,
200
);
/*
* If active, scanning won't cancel it, so say it expired.
* No race since we hold the mutex here and a new one
* can't come in at this time.
*/
if
(
priv
->
ucode_loaded
&&
priv
->
cur_ucode
!=
IWL_UCODE_INIT
)
ieee80211_remain_on_channel_expired
(
priv
->
hw
);
exit_pending
=
exit_pending
=
test_and_set_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
);
test_and_set_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
);
...
@@ -1002,41 +989,6 @@ static void iwl_bg_restart(struct work_struct *data)
...
@@ -1002,41 +989,6 @@ static void iwl_bg_restart(struct work_struct *data)
}
}
}
}
void
iwlagn_disable_roc
(
struct
iwl_priv
*
priv
)
{
struct
iwl_rxon_context
*
ctx
=
&
priv
->
contexts
[
IWL_RXON_CTX_PAN
];
lockdep_assert_held
(
&
priv
->
mutex
);
if
(
!
priv
->
hw_roc_setup
)
return
;
ctx
->
staging
.
dev_type
=
RXON_DEV_TYPE_P2P
;
ctx
->
staging
.
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
priv
->
hw_roc_channel
=
NULL
;
memset
(
ctx
->
staging
.
node_addr
,
0
,
ETH_ALEN
);
iwlagn_commit_rxon
(
priv
,
ctx
);
ctx
->
is_active
=
false
;
priv
->
hw_roc_setup
=
false
;
}
static
void
iwlagn_disable_roc_work
(
struct
work_struct
*
work
)
{
struct
iwl_priv
*
priv
=
container_of
(
work
,
struct
iwl_priv
,
hw_roc_disable_work
.
work
);
mutex_lock
(
&
priv
->
mutex
);
iwlagn_disable_roc
(
priv
);
mutex_unlock
(
&
priv
->
mutex
);
}
/*****************************************************************************
/*****************************************************************************
*
*
* driver setup and teardown
* driver setup and teardown
...
@@ -1053,8 +1005,6 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
...
@@ -1053,8 +1005,6 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
INIT_WORK
(
&
priv
->
tx_flush
,
iwl_bg_tx_flush
);
INIT_WORK
(
&
priv
->
tx_flush
,
iwl_bg_tx_flush
);
INIT_WORK
(
&
priv
->
bt_full_concurrency
,
iwl_bg_bt_full_concurrency
);
INIT_WORK
(
&
priv
->
bt_full_concurrency
,
iwl_bg_bt_full_concurrency
);
INIT_WORK
(
&
priv
->
bt_runtime_config
,
iwl_bg_bt_runtime_config
);
INIT_WORK
(
&
priv
->
bt_runtime_config
,
iwl_bg_bt_runtime_config
);
INIT_DELAYED_WORK
(
&
priv
->
hw_roc_disable_work
,
iwlagn_disable_roc_work
);
iwl_setup_scan_deferred_work
(
priv
);
iwl_setup_scan_deferred_work
(
priv
);
...
@@ -1082,7 +1032,6 @@ void iwl_cancel_deferred_work(struct iwl_priv *priv)
...
@@ -1082,7 +1032,6 @@ void iwl_cancel_deferred_work(struct iwl_priv *priv)
cancel_work_sync
(
&
priv
->
bt_full_concurrency
);
cancel_work_sync
(
&
priv
->
bt_full_concurrency
);
cancel_work_sync
(
&
priv
->
bt_runtime_config
);
cancel_work_sync
(
&
priv
->
bt_runtime_config
);
cancel_delayed_work_sync
(
&
priv
->
hw_roc_disable_work
);
del_timer_sync
(
&
priv
->
statistics_periodic
);
del_timer_sync
(
&
priv
->
statistics_periodic
);
del_timer_sync
(
&
priv
->
ucode_trace
);
del_timer_sync
(
&
priv
->
ucode_trace
);
...
@@ -1169,12 +1118,6 @@ static void iwl_option_config(struct iwl_priv *priv)
...
@@ -1169,12 +1118,6 @@ static void iwl_option_config(struct iwl_priv *priv)
#else
#else
IWL_INFO
(
priv
,
"CONFIG_IWLWIFI_DEVICE_TRACING disabled
\n
"
);
IWL_INFO
(
priv
,
"CONFIG_IWLWIFI_DEVICE_TRACING disabled
\n
"
);
#endif
#endif
#ifdef CONFIG_IWLWIFI_P2P
IWL_INFO
(
priv
,
"CONFIG_IWLWIFI_P2P enabled
\n
"
);
#else
IWL_INFO
(
priv
,
"CONFIG_IWLWIFI_P2P disabled
\n
"
);
#endif
}
}
static
int
iwl_eeprom_init_hw_params
(
struct
iwl_priv
*
priv
)
static
int
iwl_eeprom_init_hw_params
(
struct
iwl_priv
*
priv
)
...
@@ -1315,10 +1258,6 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
...
@@ -1315,10 +1258,6 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
ucode_flags
=
fw
->
ucode_capa
.
flags
;
ucode_flags
=
fw
->
ucode_capa
.
flags
;
#ifndef CONFIG_IWLWIFI_P2P
ucode_flags
&=
~
IWL_UCODE_TLV_FLAGS_P2P
;
#endif
if
(
ucode_flags
&
IWL_UCODE_TLV_FLAGS_PAN
)
{
if
(
ucode_flags
&
IWL_UCODE_TLV_FLAGS_PAN
)
{
priv
->
sta_key_max_num
=
STA_KEY_MAX_NUM_PAN
;
priv
->
sta_key_max_num
=
STA_KEY_MAX_NUM_PAN
;
trans_cfg
.
cmd_queue
=
IWL_IPAN_CMD_QUEUE_NUM
;
trans_cfg
.
cmd_queue
=
IWL_IPAN_CMD_QUEUE_NUM
;
...
@@ -1413,7 +1352,6 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
...
@@ -1413,7 +1352,6 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
* if not PAN, then don't support P2P -- might be a uCode
* if not PAN, then don't support P2P -- might be a uCode
* packaging bug or due to the eeprom check above
* packaging bug or due to the eeprom check above
*/
*/
ucode_flags
&=
~
IWL_UCODE_TLV_FLAGS_P2P
;
priv
->
sta_key_max_num
=
STA_KEY_MAX_NUM
;
priv
->
sta_key_max_num
=
STA_KEY_MAX_NUM
;
trans_cfg
.
cmd_queue
=
IWL_DEFAULT_CMD_QUEUE_NUM
;
trans_cfg
.
cmd_queue
=
IWL_DEFAULT_CMD_QUEUE_NUM
;
...
...
drivers/net/wireless/iwlwifi/dvm/rs.c
View file @
20416229
...
@@ -2826,9 +2826,6 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i
...
@@ -2826,9 +2826,6 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i
lq_sta
->
flush_timer
=
0
;
lq_sta
->
flush_timer
=
0
;
lq_sta
->
supp_rates
=
sta
->
supp_rates
[
sband
->
band
];
lq_sta
->
supp_rates
=
sta
->
supp_rates
[
sband
->
band
];
for
(
j
=
0
;
j
<
LQ_SIZE
;
j
++
)
for
(
i
=
0
;
i
<
IWL_RATE_COUNT
;
i
++
)
rs_rate_scale_clear_window
(
&
lq_sta
->
lq_info
[
j
].
win
[
i
]);
IWL_DEBUG_RATE
(
priv
,
"LQ: *** rate scale station global init for station %d ***
\n
"
,
IWL_DEBUG_RATE
(
priv
,
"LQ: *** rate scale station global init for station %d ***
\n
"
,
sta_id
);
sta_id
);
...
...
drivers/net/wireless/iwlwifi/dvm/rxon.c
View file @
20416229
...
@@ -564,11 +564,7 @@ int iwlagn_set_pan_params(struct iwl_priv *priv)
...
@@ -564,11 +564,7 @@ int iwlagn_set_pan_params(struct iwl_priv *priv)
cmd
.
slots
[
0
].
type
=
0
;
/* BSS */
cmd
.
slots
[
0
].
type
=
0
;
/* BSS */
cmd
.
slots
[
1
].
type
=
1
;
/* PAN */
cmd
.
slots
[
1
].
type
=
1
;
/* PAN */
if
(
priv
->
hw_roc_setup
)
{
if
(
ctx_bss
->
vif
&&
ctx_pan
->
vif
)
{
/* both contexts must be used for this to happen */
slot1
=
IWL_MIN_SLOT_TIME
;
slot0
=
3000
;
}
else
if
(
ctx_bss
->
vif
&&
ctx_pan
->
vif
)
{
int
bcnint
=
ctx_pan
->
beacon_int
;
int
bcnint
=
ctx_pan
->
beacon_int
;
int
dtim
=
ctx_pan
->
vif
->
bss_conf
.
dtim_period
?:
1
;
int
dtim
=
ctx_pan
->
vif
->
bss_conf
.
dtim_period
?:
1
;
...
...
drivers/net/wireless/iwlwifi/dvm/scan.c
View file @
20416229
...
@@ -100,9 +100,6 @@ static void iwl_complete_scan(struct iwl_priv *priv, bool aborted)
...
@@ -100,9 +100,6 @@ static void iwl_complete_scan(struct iwl_priv *priv, bool aborted)
ieee80211_scan_completed
(
priv
->
hw
,
aborted
);
ieee80211_scan_completed
(
priv
->
hw
,
aborted
);
}
}
if
(
priv
->
scan_type
==
IWL_SCAN_ROC
)
iwl_scan_roc_expired
(
priv
);
priv
->
scan_type
=
IWL_SCAN_NORMAL
;
priv
->
scan_type
=
IWL_SCAN_NORMAL
;
priv
->
scan_vif
=
NULL
;
priv
->
scan_vif
=
NULL
;
priv
->
scan_request
=
NULL
;
priv
->
scan_request
=
NULL
;
...
@@ -130,9 +127,6 @@ static void iwl_process_scan_complete(struct iwl_priv *priv)
...
@@ -130,9 +127,6 @@ static void iwl_process_scan_complete(struct iwl_priv *priv)
goto
out_settings
;
goto
out_settings
;
}
}
if
(
priv
->
scan_type
==
IWL_SCAN_ROC
)
iwl_scan_roc_expired
(
priv
);
if
(
priv
->
scan_type
!=
IWL_SCAN_NORMAL
&&
!
aborted
)
{
if
(
priv
->
scan_type
!=
IWL_SCAN_NORMAL
&&
!
aborted
)
{
int
err
;
int
err
;
...
@@ -284,12 +278,6 @@ static int iwl_rx_scan_start_notif(struct iwl_priv *priv,
...
@@ -284,12 +278,6 @@ static int iwl_rx_scan_start_notif(struct iwl_priv *priv,
le32_to_cpu
(
notif
->
tsf_low
),
le32_to_cpu
(
notif
->
tsf_low
),
notif
->
status
,
notif
->
beacon_timer
);
notif
->
status
,
notif
->
beacon_timer
);
if
(
priv
->
scan_type
==
IWL_SCAN_ROC
&&
!
priv
->
hw_roc_start_notified
)
{
ieee80211_ready_on_channel
(
priv
->
hw
);
priv
->
hw_roc_start_notified
=
true
;
}
return
0
;
return
0
;
}
}
...
@@ -697,8 +685,7 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
...
@@ -697,8 +685,7 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
scan
->
quiet_plcp_th
=
IWL_PLCP_QUIET_THRESH
;
scan
->
quiet_plcp_th
=
IWL_PLCP_QUIET_THRESH
;
scan
->
quiet_time
=
IWL_ACTIVE_QUIET_TIME
;
scan
->
quiet_time
=
IWL_ACTIVE_QUIET_TIME
;
if
(
priv
->
scan_type
!=
IWL_SCAN_ROC
&&
if
(
iwl_is_any_associated
(
priv
))
{
iwl_is_any_associated
(
priv
))
{
u16
interval
=
0
;
u16
interval
=
0
;
u32
extra
;
u32
extra
;
u32
suspend_time
=
100
;
u32
suspend_time
=
100
;
...
@@ -706,9 +693,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
...
@@ -706,9 +693,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
IWL_DEBUG_INFO
(
priv
,
"Scanning while associated...
\n
"
);
IWL_DEBUG_INFO
(
priv
,
"Scanning while associated...
\n
"
);
switch
(
priv
->
scan_type
)
{
switch
(
priv
->
scan_type
)
{
case
IWL_SCAN_ROC
:
WARN_ON
(
1
);
break
;
case
IWL_SCAN_RADIO_RESET
:
case
IWL_SCAN_RADIO_RESET
:
interval
=
0
;
interval
=
0
;
break
;
break
;
...
@@ -728,11 +712,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
...
@@ -728,11 +712,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
scan
->
suspend_time
=
cpu_to_le32
(
scan_suspend_time
);
scan
->
suspend_time
=
cpu_to_le32
(
scan_suspend_time
);
IWL_DEBUG_SCAN
(
priv
,
"suspend_time 0x%X beacon interval %d
\n
"
,
IWL_DEBUG_SCAN
(
priv
,
"suspend_time 0x%X beacon interval %d
\n
"
,
scan_suspend_time
,
interval
);
scan_suspend_time
,
interval
);
}
else
if
(
priv
->
scan_type
==
IWL_SCAN_ROC
)
{
scan
->
suspend_time
=
0
;
scan
->
max_out_time
=
0
;
scan
->
quiet_time
=
0
;
scan
->
quiet_plcp_th
=
0
;
}
}
switch
(
priv
->
scan_type
)
{
switch
(
priv
->
scan_type
)
{
...
@@ -774,9 +753,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
...
@@ -774,9 +753,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
}
else
}
else
IWL_DEBUG_SCAN
(
priv
,
"Start passive scan.
\n
"
);
IWL_DEBUG_SCAN
(
priv
,
"Start passive scan.
\n
"
);
break
;
break
;
case
IWL_SCAN_ROC
:
IWL_DEBUG_SCAN
(
priv
,
"Start ROC scan.
\n
"
);
break
;
}
}
scan
->
tx_cmd
.
tx_flags
=
TX_CMD_FLG_SEQ_CTL_MSK
;
scan
->
tx_cmd
.
tx_flags
=
TX_CMD_FLG_SEQ_CTL_MSK
;
...
@@ -898,7 +874,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
...
@@ -898,7 +874,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
scan_cmd_size
-
sizeof
(
*
scan
));
scan_cmd_size
-
sizeof
(
*
scan
));
break
;
break
;
case
IWL_SCAN_RADIO_RESET
:
case
IWL_SCAN_RADIO_RESET
:
case
IWL_SCAN_ROC
:
/* use bcast addr, will not be transmitted but must be valid */
/* use bcast addr, will not be transmitted but must be valid */
cmd_len
=
iwl_fill_probe_req
(
cmd_len
=
iwl_fill_probe_req
(
(
struct
ieee80211_mgmt
*
)
scan
->
data
,
(
struct
ieee80211_mgmt
*
)
scan
->
data
,
...
@@ -926,46 +901,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
...
@@ -926,46 +901,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
is_active
,
n_probes
,
is_active
,
n_probes
,
(
void
*
)
&
scan
->
data
[
cmd_len
]);
(
void
*
)
&
scan
->
data
[
cmd_len
]);
break
;
break
;
case
IWL_SCAN_ROC
:
{
struct
iwl_scan_channel
*
scan_ch
;
int
n_chan
,
i
;
u16
dwell
;
dwell
=
iwl_limit_dwell
(
priv
,
priv
->
hw_roc_duration
);
n_chan
=
DIV_ROUND_UP
(
priv
->
hw_roc_duration
,
dwell
);
scan
->
channel_count
=
n_chan
;
scan_ch
=
(
void
*
)
&
scan
->
data
[
cmd_len
];
for
(
i
=
0
;
i
<
n_chan
;
i
++
)
{
scan_ch
->
type
=
SCAN_CHANNEL_TYPE_PASSIVE
;
scan_ch
->
channel
=
cpu_to_le16
(
priv
->
hw_roc_channel
->
hw_value
);
if
(
i
==
n_chan
-
1
)
dwell
=
priv
->
hw_roc_duration
-
i
*
dwell
;
scan_ch
->
active_dwell
=
scan_ch
->
passive_dwell
=
cpu_to_le16
(
dwell
);
/* Set txpower levels to defaults */
scan_ch
->
dsp_atten
=
110
;
/* NOTE: if we were doing 6Mb OFDM for scans we'd use
* power level:
* scan_ch->tx_gain = ((1 << 5) | (2 << 3)) | 3;
*/
if
(
priv
->
hw_roc_channel
->
band
==
IEEE80211_BAND_5GHZ
)
scan_ch
->
tx_gain
=
((
1
<<
5
)
|
(
3
<<
3
))
|
3
;
else
scan_ch
->
tx_gain
=
((
1
<<
5
)
|
(
5
<<
3
));
scan_ch
++
;
}
}
break
;
}
}
if
(
scan
->
channel_count
==
0
)
{
if
(
scan
->
channel_count
==
0
)
{
...
@@ -1035,7 +970,6 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv,
...
@@ -1035,7 +970,6 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv,
IWL_DEBUG_SCAN
(
priv
,
"Starting %sscan...
\n
"
,
IWL_DEBUG_SCAN
(
priv
,
"Starting %sscan...
\n
"
,
scan_type
==
IWL_SCAN_NORMAL
?
""
:
scan_type
==
IWL_SCAN_NORMAL
?
""
:
scan_type
==
IWL_SCAN_ROC
?
"remain-on-channel "
:
"internal short "
);
"internal short "
);
set_bit
(
STATUS_SCANNING
,
&
priv
->
status
);
set_bit
(
STATUS_SCANNING
,
&
priv
->
status
);
...
@@ -1149,40 +1083,3 @@ void iwl_cancel_scan_deferred_work(struct iwl_priv *priv)
...
@@ -1149,40 +1083,3 @@ void iwl_cancel_scan_deferred_work(struct iwl_priv *priv)
mutex_unlock
(
&
priv
->
mutex
);
mutex_unlock
(
&
priv
->
mutex
);
}
}
}
}
void
iwl_scan_roc_expired
(
struct
iwl_priv
*
priv
)
{
/*
* The status bit should be set here, to prevent a race
* where the atomic_read returns 1, but before the execution continues
* iwl_scan_offchannel_skb_status() checks if the status bit is set
*/
set_bit
(
STATUS_SCAN_ROC_EXPIRED
,
&
priv
->
status
);
if
(
atomic_read
(
&
priv
->
num_aux_in_flight
)
==
0
)
{
ieee80211_remain_on_channel_expired
(
priv
->
hw
);
priv
->
hw_roc_channel
=
NULL
;
schedule_delayed_work
(
&
priv
->
hw_roc_disable_work
,
10
*
HZ
);
clear_bit
(
STATUS_SCAN_ROC_EXPIRED
,
&
priv
->
status
);
}
else
{
IWL_DEBUG_SCAN
(
priv
,
"ROC done with %d frames in aux
\n
"
,
atomic_read
(
&
priv
->
num_aux_in_flight
));
}
}
void
iwl_scan_offchannel_skb
(
struct
iwl_priv
*
priv
)
{
WARN_ON
(
!
priv
->
hw_roc_start_notified
);
atomic_inc
(
&
priv
->
num_aux_in_flight
);
}
void
iwl_scan_offchannel_skb_status
(
struct
iwl_priv
*
priv
)
{
if
(
atomic_dec_return
(
&
priv
->
num_aux_in_flight
)
==
0
&&
test_bit
(
STATUS_SCAN_ROC_EXPIRED
,
&
priv
->
status
))
{
IWL_DEBUG_SCAN
(
priv
,
"0 aux frames. Calling ROC expired
\n
"
);
iwl_scan_roc_expired
(
priv
);
}
}
drivers/net/wireless/iwlwifi/dvm/tx.c
View file @
20416229
...
@@ -478,9 +478,6 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
...
@@ -478,9 +478,6 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
if
(
sta_priv
&&
sta_priv
->
client
&&
!
is_agg
)
if
(
sta_priv
&&
sta_priv
->
client
&&
!
is_agg
)
atomic_inc
(
&
sta_priv
->
pending_frames
);
atomic_inc
(
&
sta_priv
->
pending_frames
);
if
(
info
->
flags
&
IEEE80211_TX_CTL_TX_OFFCHAN
)
iwl_scan_offchannel_skb
(
priv
);
return
0
;
return
0
;
drop_unlock_sta:
drop_unlock_sta:
...
@@ -1158,7 +1155,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
...
@@ -1158,7 +1155,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
;
struct
iwl_rxon_context
*
ctx
;
struct
iwl_rxon_context
*
ctx
;
bool
is_agg
=
(
txq_id
>=
IWLAGN_FIRST_AMPDU_QUEUE
);
bool
is_agg
=
(
txq_id
>=
IWLAGN_FIRST_AMPDU_QUEUE
);
bool
is_offchannel_skb
;
tid
=
(
tx_resp
->
ra_tid
&
IWLAGN_TX_RES_TID_MSK
)
>>
tid
=
(
tx_resp
->
ra_tid
&
IWLAGN_TX_RES_TID_MSK
)
>>
IWLAGN_TX_RES_TID_POS
;
IWLAGN_TX_RES_TID_POS
;
...
@@ -1178,8 +1174,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
...
@@ -1178,8 +1174,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
__skb_queue_head_init
(
&
skbs
);
__skb_queue_head_init
(
&
skbs
);
is_offchannel_skb
=
false
;
if
(
tx_resp
->
frame_count
==
1
)
{
if
(
tx_resp
->
frame_count
==
1
)
{
u16
next_reclaimed
=
le16_to_cpu
(
tx_resp
->
seq_ctl
);
u16
next_reclaimed
=
le16_to_cpu
(
tx_resp
->
seq_ctl
);
next_reclaimed
=
IEEE80211_SEQ_TO_SN
(
next_reclaimed
+
0x10
);
next_reclaimed
=
IEEE80211_SEQ_TO_SN
(
next_reclaimed
+
0x10
);
...
@@ -1256,8 +1250,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
...
@@ -1256,8 +1250,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
if
(
!
is_agg
)
if
(
!
is_agg
)
iwlagn_non_agg_tx_status
(
priv
,
ctx
,
hdr
->
addr1
);
iwlagn_non_agg_tx_status
(
priv
,
ctx
,
hdr
->
addr1
);
is_offchannel_skb
=
(
info
->
flags
&
IEEE80211_TX_CTL_TX_OFFCHAN
);
freed
++
;
freed
++
;
}
}
...
@@ -1271,14 +1263,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
...
@@ -1271,14 +1263,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
if
(
!
is_agg
&&
freed
!=
1
)
if
(
!
is_agg
&&
freed
!=
1
)
IWL_ERR
(
priv
,
"Q: %d, freed %d
\n
"
,
txq_id
,
freed
);
IWL_ERR
(
priv
,
"Q: %d, freed %d
\n
"
,
txq_id
,
freed
);
/*
* An offchannel frame can be send only on the AUX queue, where
* there is no aggregation (and reordering) so it only is single
* skb is expected to be processed.
*/
if
(
is_offchannel_skb
&&
freed
!=
1
)
IWL_ERR
(
priv
,
"OFFCHANNEL SKB freed %d
\n
"
,
freed
);
IWL_DEBUG_TX_REPLY
(
priv
,
"TXQ %d status %s (0x%08x)
\n
"
,
txq_id
,
IWL_DEBUG_TX_REPLY
(
priv
,
"TXQ %d status %s (0x%08x)
\n
"
,
txq_id
,
iwl_get_tx_fail_reason
(
status
),
status
);
iwl_get_tx_fail_reason
(
status
),
status
);
...
@@ -1298,9 +1282,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
...
@@ -1298,9 +1282,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
ieee80211_tx_status_ni
(
priv
->
hw
,
skb
);
ieee80211_tx_status_ni
(
priv
->
hw
,
skb
);
}
}
if
(
is_offchannel_skb
)
iwl_scan_offchannel_skb_status
(
priv
);
return
0
;
return
0
;
}
}
...
...
drivers/net/wireless/iwlwifi/iwl-7000.c
View file @
20416229
...
@@ -99,6 +99,7 @@ static const struct iwl_base_params iwl7000_base_params = {
...
@@ -99,6 +99,7 @@ static const struct iwl_base_params iwl7000_base_params = {
.
wd_timeout
=
IWL_LONG_WD_TIMEOUT
,
.
wd_timeout
=
IWL_LONG_WD_TIMEOUT
,
.
max_event_log_size
=
512
,
.
max_event_log_size
=
512
,
.
shadow_reg_enable
=
true
,
.
shadow_reg_enable
=
true
,
.
pcie_l1_allowed
=
true
,
};
};
static
const
struct
iwl_ht_params
iwl7000_ht_params
=
{
static
const
struct
iwl_ht_params
iwl7000_ht_params
=
{
...
@@ -126,6 +127,16 @@ const struct iwl_cfg iwl7260_2ac_cfg = {
...
@@ -126,6 +127,16 @@ const struct iwl_cfg iwl7260_2ac_cfg = {
.
nvm_calib_ver
=
IWL7260_TX_POWER_VERSION
,
.
nvm_calib_ver
=
IWL7260_TX_POWER_VERSION
,
};
};
const
struct
iwl_cfg
iwl7260_2ac_cfg_high_temp
=
{
.
name
=
"Intel(R) Dual Band Wireless AC 7260"
,
.
fw_name_pre
=
IWL7260_FW_PRE
,
IWL_DEVICE_7000
,
.
ht_params
=
&
iwl7000_ht_params
,
.
nvm_ver
=
IWL7260_NVM_VERSION
,
.
nvm_calib_ver
=
IWL7260_TX_POWER_VERSION
,
.
high_temp
=
true
,
};
const
struct
iwl_cfg
iwl7260_2n_cfg
=
{
const
struct
iwl_cfg
iwl7260_2n_cfg
=
{
.
name
=
"Intel(R) Dual Band Wireless N 7260"
,
.
name
=
"Intel(R) Dual Band Wireless N 7260"
,
.
fw_name_pre
=
IWL7260_FW_PRE
,
.
fw_name_pre
=
IWL7260_FW_PRE
,
...
...
drivers/net/wireless/iwlwifi/iwl-config.h
View file @
20416229
...
@@ -152,6 +152,7 @@ struct iwl_base_params {
...
@@ -152,6 +152,7 @@ struct iwl_base_params {
unsigned
int
wd_timeout
;
unsigned
int
wd_timeout
;
u32
max_event_log_size
;
u32
max_event_log_size
;
const
bool
shadow_reg_enable
;
const
bool
shadow_reg_enable
;
const
bool
pcie_l1_allowed
;
};
};
/*
/*
...
@@ -205,6 +206,7 @@ struct iwl_eeprom_params {
...
@@ -205,6 +206,7 @@ struct iwl_eeprom_params {
* @led_mode: 0=blinking, 1=On(RF On)/Off(RF Off)
* @led_mode: 0=blinking, 1=On(RF On)/Off(RF Off)
* @rx_with_siso_diversity: 1x1 device with rx antenna diversity
* @rx_with_siso_diversity: 1x1 device with rx antenna diversity
* @internal_wimax_coex: internal wifi/wimax combo device
* @internal_wimax_coex: internal wifi/wimax combo device
* @high_temp: Is this NIC is designated to be in high temperature.
*
*
* We enable the driver to be backward compatible wrt. hardware features.
* We enable the driver to be backward compatible wrt. hardware features.
* API differences in uCode shouldn't be handled here but through TLVs
* API differences in uCode shouldn't be handled here but through TLVs
...
@@ -233,6 +235,7 @@ struct iwl_cfg {
...
@@ -233,6 +235,7 @@ struct iwl_cfg {
enum
iwl_led_mode
led_mode
;
enum
iwl_led_mode
led_mode
;
const
bool
rx_with_siso_diversity
;
const
bool
rx_with_siso_diversity
;
const
bool
internal_wimax_coex
;
const
bool
internal_wimax_coex
;
bool
high_temp
;
};
};
/*
/*
...
@@ -283,6 +286,7 @@ extern const struct iwl_cfg iwl135_bgn_cfg;
...
@@ -283,6 +286,7 @@ extern const struct iwl_cfg iwl135_bgn_cfg;
#endif
/* CONFIG_IWLDVM */
#endif
/* CONFIG_IWLDVM */
#if IS_ENABLED(CONFIG_IWLMVM)
#if IS_ENABLED(CONFIG_IWLMVM)
extern
const
struct
iwl_cfg
iwl7260_2ac_cfg
;
extern
const
struct
iwl_cfg
iwl7260_2ac_cfg
;
extern
const
struct
iwl_cfg
iwl7260_2ac_cfg_high_temp
;
extern
const
struct
iwl_cfg
iwl7260_2n_cfg
;
extern
const
struct
iwl_cfg
iwl7260_2n_cfg
;
extern
const
struct
iwl_cfg
iwl7260_n_cfg
;
extern
const
struct
iwl_cfg
iwl7260_n_cfg
;
extern
const
struct
iwl_cfg
iwl3160_2ac_cfg
;
extern
const
struct
iwl_cfg
iwl3160_2ac_cfg
;
...
...
drivers/net/wireless/iwlwifi/iwl-fw.h
View file @
20416229
...
@@ -74,13 +74,22 @@
...
@@ -74,13 +74,22 @@
* @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
* @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_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_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_RX_ENERGY_API: supports rx signal strength api
* @IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six
* (rather than two) IPv6 addresses
* @IWL_UCODE_TLV_FLAGS_BF_UPDATED: new beacon filtering API
*/
*/
enum
iwl_ucode_tlv_flag
{
enum
iwl_ucode_tlv_flag
{
IWL_UCODE_TLV_FLAGS_PAN
=
BIT
(
0
),
IWL_UCODE_TLV_FLAGS_PAN
=
BIT
(
0
),
IWL_UCODE_TLV_FLAGS_NEWSCAN
=
BIT
(
1
),
IWL_UCODE_TLV_FLAGS_NEWSCAN
=
BIT
(
1
),
IWL_UCODE_TLV_FLAGS_MFP
=
BIT
(
2
),
IWL_UCODE_TLV_FLAGS_MFP
=
BIT
(
2
),
IWL_UCODE_TLV_FLAGS_P2P
=
BIT
(
3
),
IWL_UCODE_TLV_FLAGS_P2P
=
BIT
(
3
),
IWL_UCODE_TLV_FLAGS_DW_BC_TABLE
=
BIT
(
4
),
IWL_UCODE_TLV_FLAGS_DW_BC_TABLE
=
BIT
(
4
),
IWL_UCODE_TLV_FLAGS_UAPSD
=
BIT
(
6
),
IWL_UCODE_TLV_FLAGS_RX_ENERGY_API
=
BIT
(
8
),
IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS
=
BIT
(
10
),
IWL_UCODE_TLV_FLAGS_BF_UPDATED
=
BIT
(
11
),
};
};
/* The default calibrate table size if not specified by firmware file */
/* The default calibrate table size if not specified by firmware file */
...
...
drivers/net/wireless/iwlwifi/iwl-io.c
View file @
20416229
...
@@ -33,6 +33,8 @@
...
@@ -33,6 +33,8 @@
#include "iwl-io.h"
#include "iwl-io.h"
#include "iwl-csr.h"
#include "iwl-csr.h"
#include "iwl-debug.h"
#include "iwl-debug.h"
#include "iwl-fh.h"
#include "iwl-csr.h"
#define IWL_POLL_INTERVAL 10
/* microseconds */
#define IWL_POLL_INTERVAL 10
/* microseconds */
...
@@ -166,3 +168,68 @@ void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask)
...
@@ -166,3 +168,68 @@ void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask)
}
}
}
}
IWL_EXPORT_SYMBOL
(
iwl_clear_bits_prph
);
IWL_EXPORT_SYMBOL
(
iwl_clear_bits_prph
);
static
const
char
*
get_fh_string
(
int
cmd
)
{
#define IWL_CMD(x) case x: return #x
switch
(
cmd
)
{
IWL_CMD
(
FH_RSCSR_CHNL0_STTS_WPTR_REG
);
IWL_CMD
(
FH_RSCSR_CHNL0_RBDCB_BASE_REG
);
IWL_CMD
(
FH_RSCSR_CHNL0_WPTR
);
IWL_CMD
(
FH_MEM_RCSR_CHNL0_CONFIG_REG
);
IWL_CMD
(
FH_MEM_RSSR_SHARED_CTRL_REG
);
IWL_CMD
(
FH_MEM_RSSR_RX_STATUS_REG
);
IWL_CMD
(
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV
);
IWL_CMD
(
FH_TSSR_TX_STATUS_REG
);
IWL_CMD
(
FH_TSSR_TX_ERROR_REG
);
default:
return
"UNKNOWN"
;
}
#undef IWL_CMD
}
int
iwl_dump_fh
(
struct
iwl_trans
*
trans
,
char
**
buf
)
{
int
i
;
static
const
u32
fh_tbl
[]
=
{
FH_RSCSR_CHNL0_STTS_WPTR_REG
,
FH_RSCSR_CHNL0_RBDCB_BASE_REG
,
FH_RSCSR_CHNL0_WPTR
,
FH_MEM_RCSR_CHNL0_CONFIG_REG
,
FH_MEM_RSSR_SHARED_CTRL_REG
,
FH_MEM_RSSR_RX_STATUS_REG
,
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV
,
FH_TSSR_TX_STATUS_REG
,
FH_TSSR_TX_ERROR_REG
};
#ifdef CONFIG_IWLWIFI_DEBUGFS
if
(
buf
)
{
int
pos
=
0
;
size_t
bufsz
=
ARRAY_SIZE
(
fh_tbl
)
*
48
+
40
;
*
buf
=
kmalloc
(
bufsz
,
GFP_KERNEL
);
if
(
!*
buf
)
return
-
ENOMEM
;
pos
+=
scnprintf
(
*
buf
+
pos
,
bufsz
-
pos
,
"FH register values:
\n
"
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
fh_tbl
);
i
++
)
pos
+=
scnprintf
(
*
buf
+
pos
,
bufsz
-
pos
,
" %34s: 0X%08x
\n
"
,
get_fh_string
(
fh_tbl
[
i
]),
iwl_read_direct32
(
trans
,
fh_tbl
[
i
]));
return
pos
;
}
#endif
IWL_ERR
(
trans
,
"FH register values:
\n
"
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
fh_tbl
);
i
++
)
IWL_ERR
(
trans
,
" %34s: 0X%08x
\n
"
,
get_fh_string
(
fh_tbl
[
i
]),
iwl_read_direct32
(
trans
,
fh_tbl
[
i
]));
return
0
;
}
drivers/net/wireless/iwlwifi/iwl-io.h
View file @
20416229
...
@@ -77,4 +77,7 @@ void iwl_set_bits_mask_prph(struct iwl_trans *trans, u32 ofs,
...
@@ -77,4 +77,7 @@ void iwl_set_bits_mask_prph(struct iwl_trans *trans, u32 ofs,
u32
bits
,
u32
mask
);
u32
bits
,
u32
mask
);
void
iwl_clear_bits_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
mask
);
void
iwl_clear_bits_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
mask
);
/* Error handling */
int
iwl_dump_fh
(
struct
iwl_trans
*
trans
,
char
**
buf
);
#endif
#endif
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
View file @
20416229
...
@@ -118,6 +118,7 @@ static const u8 iwl_nvm_channels[] = {
...
@@ -118,6 +118,7 @@ static const u8 iwl_nvm_channels[] = {
#define LAST_2GHZ_HT_PLUS 9
#define LAST_2GHZ_HT_PLUS 9
#define LAST_5GHZ_HT 161
#define LAST_5GHZ_HT 161
#define DEFAULT_MAX_TX_POWER 16
/* rate data (static) */
/* rate data (static) */
static
struct
ieee80211_rate
iwl_cfg80211_rates
[]
=
{
static
struct
ieee80211_rate
iwl_cfg80211_rates
[]
=
{
...
@@ -232,8 +233,11 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
...
@@ -232,8 +233,11 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
/* Initialize regulatory-based run-time data */
/* Initialize regulatory-based run-time data */
/* TODO: read the real value from the NVM */
/*
channel
->
max_power
=
0
;
* Default value - highest tx power value. max_power
* is not used in mvm, and is used for backwards compatibility
*/
channel
->
max_power
=
DEFAULT_MAX_TX_POWER
;
is_5ghz
=
channel
->
band
==
IEEE80211_BAND_5GHZ
;
is_5ghz
=
channel
->
band
==
IEEE80211_BAND_5GHZ
;
IWL_DEBUG_EEPROM
(
dev
,
IWL_DEBUG_EEPROM
(
dev
,
"Ch. %d [%sGHz] %s%s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported
\n
"
,
"Ch. %d [%sGHz] %s%s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported
\n
"
,
...
...
drivers/net/wireless/iwlwifi/mvm/Makefile
View file @
20416229
...
@@ -2,7 +2,7 @@ obj-$(CONFIG_IWLMVM) += iwlmvm.o
...
@@ -2,7 +2,7 @@ obj-$(CONFIG_IWLMVM) += iwlmvm.o
iwlmvm-y
+=
fw.o mac80211.o nvm.o ops.o phy-ctxt.o mac-ctxt.o
iwlmvm-y
+=
fw.o mac80211.o nvm.o ops.o phy-ctxt.o mac-ctxt.o
iwlmvm-y
+=
utils.o rx.o tx.o binding.o quota.o sta.o
iwlmvm-y
+=
utils.o rx.o tx.o binding.o quota.o sta.o
iwlmvm-y
+=
scan.o time-event.o rs.o
iwlmvm-y
+=
scan.o time-event.o rs.o
iwlmvm-y
+=
power.o bt-coex.o
iwlmvm-y
+=
power.o
power_legacy.o
bt-coex.o
iwlmvm-y
+=
led.o tt.o
iwlmvm-y
+=
led.o tt.o
iwlmvm-$(CONFIG_IWLWIFI_DEBUGFS)
+=
debugfs.o
iwlmvm-$(CONFIG_IWLWIFI_DEBUGFS)
+=
debugfs.o
iwlmvm-$(CONFIG_PM_SLEEP)
+=
d3.o
iwlmvm-$(CONFIG_PM_SLEEP)
+=
d3.o
...
...
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
View file @
20416229
...
@@ -220,66 +220,87 @@ static const __le32 iwl_single_shared_ant_lookup[BT_COEX_LUT_SIZE] = {
...
@@ -220,66 +220,87 @@ static const __le32 iwl_single_shared_ant_lookup[BT_COEX_LUT_SIZE] = {
int
iwl_send_bt_init_conf
(
struct
iwl_mvm
*
mvm
)
int
iwl_send_bt_init_conf
(
struct
iwl_mvm
*
mvm
)
{
{
struct
iwl_bt_coex_cmd
cmd
=
{
struct
iwl_bt_coex_cmd
*
bt_cmd
;
.
max_kill
=
5
,
struct
iwl_host_cmd
cmd
=
{
.
bt3_time_t7_value
=
1
,
.
id
=
BT_CONFIG
,
.
bt3_prio_sample_time
=
2
,
.
len
=
{
sizeof
(
*
bt_cmd
),
},
.
bt3_timer_t2_value
=
0xc
,
.
dataflags
=
{
IWL_HCMD_DFL_NOCOPY
,
},
.
flags
=
CMD_SYNC
,
};
};
int
ret
;
int
ret
;
cmd
.
flags
=
iwlwifi_mod_params
.
bt_coex_active
?
/* go to CALIB state in internal BT-Coex state machine */
ret
=
iwl_send_bt_env
(
mvm
,
BT_COEX_ENV_OPEN
,
BT_COEX_PRIO_TBL_EVT_INIT_CALIB2
);
if
(
ret
)
return
ret
;
ret
=
iwl_send_bt_env
(
mvm
,
BT_COEX_ENV_CLOSE
,
BT_COEX_PRIO_TBL_EVT_INIT_CALIB2
);
if
(
ret
)
return
ret
;
bt_cmd
=
kzalloc
(
sizeof
(
*
bt_cmd
),
GFP_KERNEL
);
if
(
!
bt_cmd
)
return
-
ENOMEM
;
cmd
.
data
[
0
]
=
bt_cmd
;
bt_cmd
->
max_kill
=
5
;
bt_cmd
->
bt3_time_t7_value
=
1
;
bt_cmd
->
bt3_prio_sample_time
=
2
;
bt_cmd
->
bt3_timer_t2_value
=
0xc
;
bt_cmd
->
flags
=
iwlwifi_mod_params
.
bt_coex_active
?
BT_COEX_NW
:
BT_COEX_DISABLE
;
BT_COEX_NW
:
BT_COEX_DISABLE
;
cmd
.
flags
|=
BT_CH_PRIMARY_EN
|
BT_SYNC_2_BT_DISABLE
;
bt_cmd
->
flags
|=
BT_CH_PRIMARY_EN
|
BT_SYNC_2_BT_DISABLE
;
cmd
.
valid_bit_msk
=
cpu_to_le16
(
BT_VALID_ENABLE
|
bt_cmd
->
valid_bit_msk
=
cpu_to_le16
(
BT_VALID_ENABLE
|
BT_VALID_BT_PRIO_BOOST
|
BT_VALID_BT_PRIO_BOOST
|
BT_VALID_MAX_KILL
|
BT_VALID_MAX_KILL
|
BT_VALID_3W_TMRS
|
BT_VALID_3W_TMRS
|
BT_VALID_KILL_ACK
|
BT_VALID_KILL_ACK
|
BT_VALID_KILL_CTS
|
BT_VALID_KILL_CTS
|
BT_VALID_REDUCED_TX_POWER
|
BT_VALID_REDUCED_TX_POWER
|
BT_VALID_LUT
);
BT_VALID_LUT
);
if
(
mvm
->
cfg
->
bt_shared_single_ant
)
if
(
mvm
->
cfg
->
bt_shared_single_ant
)
memcpy
(
&
cmd
.
decision_lut
,
iwl_single_shared_ant_lookup
,
memcpy
(
&
bt_cmd
->
decision_lut
,
iwl_single_shared_ant_lookup
,
sizeof
(
iwl_single_shared_ant_lookup
));
sizeof
(
iwl_single_shared_ant_lookup
));
else
if
(
is_loose_coex
())
else
if
(
is_loose_coex
())
memcpy
(
&
cmd
.
decision_lut
,
iwl_loose_lookup
,
memcpy
(
&
bt_cmd
->
decision_lut
,
iwl_loose_lookup
,
sizeof
(
iwl_tight_lookup
));
sizeof
(
iwl_tight_lookup
));
else
else
memcpy
(
&
cmd
.
decision_lut
,
iwl_tight_lookup
,
memcpy
(
&
bt_cmd
->
decision_lut
,
iwl_tight_lookup
,
sizeof
(
iwl_tight_lookup
));
sizeof
(
iwl_tight_lookup
));
cmd
.
bt_prio_boost
=
cpu_to_le32
(
IWL_BT_DEFAULT_BOOST
);
bt_cmd
->
bt_prio_boost
=
cpu_to_le32
(
IWL_BT_DEFAULT_BOOST
);
cmd
.
kill_ack_msk
=
bt_cmd
->
kill_ack_msk
=
cpu_to_le32
(
iwl_bt_ack_kill_msk
[
BT_KILL_MSK_DEFAULT
]);
cpu_to_le32
(
iwl_bt_ack_kill_msk
[
BT_KILL_MSK_DEFAULT
]);
cmd
.
kill_cts_msk
=
bt_cmd
->
kill_cts_msk
=
cpu_to_le32
(
iwl_bt_cts_kill_msk
[
BT_KILL_MSK_DEFAULT
]);
cpu_to_le32
(
iwl_bt_cts_kill_msk
[
BT_KILL_MSK_DEFAULT
]);
memset
(
&
mvm
->
last_bt_notif
,
0
,
sizeof
(
mvm
->
last_bt_notif
));
memset
(
&
mvm
->
last_bt_notif
,
0
,
sizeof
(
mvm
->
last_bt_notif
));
/* go to CALIB state in internal BT-Coex state machine */
ret
=
iwl_mvm_send_cmd
(
mvm
,
&
cmd
);
ret
=
iwl_send_bt_env
(
mvm
,
BT_COEX_ENV_OPEN
,
BT_COEX_PRIO_TBL_EVT_INIT_CALIB2
);
if
(
ret
)
return
ret
;
ret
=
iwl_send_bt_env
(
mvm
,
BT_COEX_ENV_CLOSE
,
BT_COEX_PRIO_TBL_EVT_INIT_CALIB2
);
if
(
ret
)
return
ret
;
return
iwl_mvm_send_cmd_pdu
(
mvm
,
BT_CONFIG
,
CMD_SYNC
,
kfree
(
bt_cmd
);
sizeof
(
cmd
),
&
cmd
)
;
return
ret
;
}
}
static
int
iwl_mvm_bt_udpate_ctrl_kill_msk
(
struct
iwl_mvm
*
mvm
,
static
int
iwl_mvm_bt_udpate_ctrl_kill_msk
(
struct
iwl_mvm
*
mvm
,
bool
reduced_tx_power
)
bool
reduced_tx_power
)
{
{
enum
iwl_bt_kill_msk
bt_kill_msk
;
enum
iwl_bt_kill_msk
bt_kill_msk
;
struct
iwl_bt_coex_cmd
cmd
=
{}
;
struct
iwl_bt_coex_cmd
*
bt_cmd
;
struct
iwl_bt_coex_profile_notif
*
notif
=
&
mvm
->
last_bt_notif
;
struct
iwl_bt_coex_profile_notif
*
notif
=
&
mvm
->
last_bt_notif
;
struct
iwl_host_cmd
cmd
=
{
.
id
=
BT_CONFIG
,
.
data
[
0
]
=
&
bt_cmd
,
.
len
=
{
sizeof
(
*
bt_cmd
),
},
.
dataflags
=
{
IWL_HCMD_DFL_NOCOPY
,
},
.
flags
=
CMD_SYNC
,
};
int
ret
=
0
;
lockdep_assert_held
(
&
mvm
->
mutex
);
lockdep_assert_held
(
&
mvm
->
mutex
);
...
@@ -308,24 +329,40 @@ static int iwl_mvm_bt_udpate_ctrl_kill_msk(struct iwl_mvm *mvm,
...
@@ -308,24 +329,40 @@ static int iwl_mvm_bt_udpate_ctrl_kill_msk(struct iwl_mvm *mvm,
return
0
;
return
0
;
mvm
->
bt_kill_msk
=
bt_kill_msk
;
mvm
->
bt_kill_msk
=
bt_kill_msk
;
cmd
.
kill_ack_msk
=
cpu_to_le32
(
iwl_bt_ack_kill_msk
[
bt_kill_msk
]);
cmd
.
kill_cts_msk
=
cpu_to_le32
(
iwl_bt_cts_kill_msk
[
bt_kill_msk
]);
bt_cmd
=
kzalloc
(
sizeof
(
*
bt_cmd
),
GFP_KERNEL
);
cmd
.
valid_bit_msk
=
cpu_to_le16
(
BT_VALID_KILL_ACK
|
BT_VALID_KILL_CTS
);
if
(
!
bt_cmd
)
return
-
ENOMEM
;
cmd
.
data
[
0
]
=
bt_cmd
;
bt_cmd
->
kill_ack_msk
=
cpu_to_le32
(
iwl_bt_ack_kill_msk
[
bt_kill_msk
]);
bt_cmd
->
kill_cts_msk
=
cpu_to_le32
(
iwl_bt_cts_kill_msk
[
bt_kill_msk
]);
bt_cmd
->
valid_bit_msk
=
cpu_to_le16
(
BT_VALID_KILL_ACK
|
BT_VALID_KILL_CTS
);
IWL_DEBUG_COEX
(
mvm
,
"bt_kill_msk = %d
\n
"
,
bt_kill_msk
);
IWL_DEBUG_COEX
(
mvm
,
"bt_kill_msk = %d
\n
"
,
bt_kill_msk
);
return
iwl_mvm_send_cmd_pdu
(
mvm
,
BT_CONFIG
,
CMD_SYNC
,
sizeof
(
cmd
),
&
cmd
);
ret
=
iwl_mvm_send_cmd
(
mvm
,
&
cmd
);
kfree
(
bt_cmd
);
return
ret
;
}
}
static
int
iwl_mvm_bt_coex_reduced_txp
(
struct
iwl_mvm
*
mvm
,
u8
sta_id
,
static
int
iwl_mvm_bt_coex_reduced_txp
(
struct
iwl_mvm
*
mvm
,
u8
sta_id
,
bool
enable
)
bool
enable
)
{
{
struct
iwl_bt_coex_cmd
cmd
=
{
struct
iwl_bt_coex_cmd
*
bt_cmd
;
.
valid_bit_msk
=
cpu_to_le16
(
BT_VALID_REDUCED_TX_POWER
),
/* Send ASYNC since this can be sent from an atomic context */
.
bt_reduced_tx_power
=
sta_id
,
struct
iwl_host_cmd
cmd
=
{
.
id
=
BT_CONFIG
,
.
len
=
{
sizeof
(
*
bt_cmd
),
},
.
dataflags
=
{
IWL_HCMD_DFL_DUP
,
},
.
flags
=
CMD_ASYNC
,
};
};
struct
ieee80211_sta
*
sta
;
struct
ieee80211_sta
*
sta
;
struct
iwl_mvm_sta
*
mvmsta
;
struct
iwl_mvm_sta
*
mvmsta
;
int
ret
;
/* This can happen if the station has been removed right now */
/* This can happen if the station has been removed right now */
if
(
sta_id
==
IWL_MVM_STATION_COUNT
)
if
(
sta_id
==
IWL_MVM_STATION_COUNT
)
...
@@ -339,17 +376,26 @@ static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id,
...
@@ -339,17 +376,26 @@ static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id,
if
(
mvmsta
->
bt_reduced_txpower
==
enable
)
if
(
mvmsta
->
bt_reduced_txpower
==
enable
)
return
0
;
return
0
;
bt_cmd
=
kzalloc
(
sizeof
(
*
bt_cmd
),
GFP_ATOMIC
);
if
(
!
bt_cmd
)
return
-
ENOMEM
;
cmd
.
data
[
0
]
=
bt_cmd
;
bt_cmd
->
valid_bit_msk
=
cpu_to_le16
(
BT_VALID_REDUCED_TX_POWER
),
bt_cmd
->
bt_reduced_tx_power
=
sta_id
;
if
(
enable
)
if
(
enable
)
cmd
.
bt_reduced_tx_power
|=
BT_REDUCED_TX_POWER_BIT
;
bt_cmd
->
bt_reduced_tx_power
|=
BT_REDUCED_TX_POWER_BIT
;
IWL_DEBUG_COEX
(
mvm
,
"%sable reduced Tx Power for sta %d
\n
"
,
IWL_DEBUG_COEX
(
mvm
,
"%sable reduced Tx Power for sta %d
\n
"
,
enable
?
"en"
:
"dis"
,
sta_id
);
enable
?
"en"
:
"dis"
,
sta_id
);
mvmsta
->
bt_reduced_txpower
=
enable
;
mvmsta
->
bt_reduced_txpower
=
enable
;
/* Send ASYNC since this can be sent from an atomic context */
ret
=
iwl_mvm_send_cmd
(
mvm
,
&
cmd
);
return
iwl_mvm_send_cmd_pdu
(
mvm
,
BT_CONFIG
,
CMD_ASYNC
,
sizeof
(
cmd
),
&
cmd
);
kfree
(
bt_cmd
);
return
ret
;
}
}
struct
iwl_bt_iterator_data
{
struct
iwl_bt_iterator_data
{
...
@@ -384,6 +430,10 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
...
@@ -384,6 +430,10 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
smps_mode
=
IEEE80211_SMPS_AUTOMATIC
;
smps_mode
=
IEEE80211_SMPS_AUTOMATIC
;
/* non associated BSSes aren't to be considered */
if
(
!
vif
->
bss_conf
.
assoc
)
return
;
if
(
band
!=
IEEE80211_BAND_2GHZ
)
{
if
(
band
!=
IEEE80211_BAND_2GHZ
)
{
iwl_mvm_update_smps
(
mvm
,
vif
,
IWL_MVM_SMPS_REQ_BT_COEX
,
iwl_mvm_update_smps
(
mvm
,
vif
,
IWL_MVM_SMPS_REQ_BT_COEX
,
smps_mode
);
smps_mode
);
...
@@ -523,6 +573,8 @@ static void iwl_mvm_bt_rssi_iterator(void *_data, u8 *mac,
...
@@ -523,6 +573,8 @@ static void iwl_mvm_bt_rssi_iterator(void *_data, u8 *mac,
lockdep_is_held
(
&
mvm
->
mutex
));
lockdep_is_held
(
&
mvm
->
mutex
));
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
data
->
num_bss_ifaces
++
;
/*
/*
* This interface doesn't support reduced Tx power (because of low
* This interface doesn't support reduced Tx power (because of low
* RSSI probably), then set bt_kill_msk to default values.
* RSSI probably), then set bt_kill_msk to default values.
...
@@ -588,23 +640,5 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
...
@@ -588,23 +640,5 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
void
iwl_mvm_bt_coex_vif_assoc
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
)
void
iwl_mvm_bt_coex_vif_assoc
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
)
{
{
struct
ieee80211_chanctx_conf
*
chanctx_conf
;
enum
ieee80211_band
band
;
rcu_read_lock
();
chanctx_conf
=
rcu_dereference
(
vif
->
chanctx_conf
);
if
(
chanctx_conf
&&
chanctx_conf
->
def
.
chan
)
band
=
chanctx_conf
->
def
.
chan
->
band
;
else
band
=
-
1
;
rcu_read_unlock
();
/* if we are in 2GHz we will get a notification from the fw */
if
(
band
==
IEEE80211_BAND_2GHZ
)
return
;
/* else, we can remove all the constraints */
memset
(
&
mvm
->
last_bt_notif
,
0
,
sizeof
(
mvm
->
last_bt_notif
));
iwl_mvm_bt_coex_notif_handle
(
mvm
);
iwl_mvm_bt_coex_notif_handle
(
mvm
);
}
}
drivers/net/wireless/iwlwifi/mvm/constants.h
0 → 100644
View file @
20416229
/******************************************************************************
*
* 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) 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) 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 __MVM_CONSTANTS_H
#define __MVM_CONSTANTS_H
#define IWL_MVM_DEFAULT_PS_TX_DATA_TIMEOUT (100 * USEC_PER_MSEC)
#define IWL_MVM_DEFAULT_PS_RX_DATA_TIMEOUT (100 * USEC_PER_MSEC)
#define IWL_MVM_WOWLAN_PS_TX_DATA_TIMEOUT (10 * USEC_PER_MSEC)
#define IWL_MVM_WOWLAN_PS_RX_DATA_TIMEOUT (10 * USEC_PER_MSEC)
#endif
/* __MVM_CONSTANTS_H */
drivers/net/wireless/iwlwifi/mvm/d3.c
View file @
20416229
...
@@ -105,7 +105,7 @@ void iwl_mvm_ipv6_addr_change(struct ieee80211_hw *hw,
...
@@ -105,7 +105,7 @@ void iwl_mvm_ipv6_addr_change(struct ieee80211_hw *hw,
list_for_each_entry
(
ifa
,
&
idev
->
addr_list
,
if_list
)
{
list_for_each_entry
(
ifa
,
&
idev
->
addr_list
,
if_list
)
{
mvmvif
->
target_ipv6_addrs
[
idx
]
=
ifa
->
addr
;
mvmvif
->
target_ipv6_addrs
[
idx
]
=
ifa
->
addr
;
idx
++
;
idx
++
;
if
(
idx
>=
IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS
)
if
(
idx
>=
IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS
_MAX
)
break
;
break
;
}
}
read_unlock_bh
(
&
idev
->
lock
);
read_unlock_bh
(
&
idev
->
lock
);
...
@@ -373,36 +373,68 @@ static int iwl_mvm_send_patterns(struct iwl_mvm *mvm,
...
@@ -373,36 +373,68 @@ static int iwl_mvm_send_patterns(struct iwl_mvm *mvm,
static
int
iwl_mvm_send_proto_offload
(
struct
iwl_mvm
*
mvm
,
static
int
iwl_mvm_send_proto_offload
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
)
struct
ieee80211_vif
*
vif
)
{
{
struct
iwl_proto_offload_cmd
cmd
=
{};
union
{
struct
iwl_proto_offload_cmd_v1
v1
;
struct
iwl_proto_offload_cmd_v2
v2
;
}
cmd
=
{};
struct
iwl_proto_offload_cmd_common
*
common
;
u32
enabled
=
0
,
size
;
#if IS_ENABLED(CONFIG_IPV6)
#if IS_ENABLED(CONFIG_IPV6)
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
int
i
;
int
i
;
if
(
mvmvif
->
num_target_ipv6_addrs
)
{
if
(
mvm
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS
)
{
cmd
.
enabled
|=
cpu_to_le32
(
IWL_D3_PROTO_OFFLOAD_NS
);
if
(
mvmvif
->
num_target_ipv6_addrs
)
{
memcpy
(
cmd
.
ndp_mac_addr
,
vif
->
addr
,
ETH_ALEN
);
enabled
|=
IWL_D3_PROTO_OFFLOAD_NS
;
}
memcpy
(
cmd
.
v2
.
ndp_mac_addr
,
vif
->
addr
,
ETH_ALEN
);
}
BUILD_BUG_ON
(
sizeof
(
cmd
.
v2
.
target_ipv6_addr
[
0
])
!=
sizeof
(
mvmvif
->
target_ipv6_addrs
[
0
]));
for
(
i
=
0
;
i
<
min
(
mvmvif
->
num_target_ipv6_addrs
,
IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V2
);
i
++
)
memcpy
(
cmd
.
v2
.
target_ipv6_addr
[
i
],
&
mvmvif
->
target_ipv6_addrs
[
i
],
sizeof
(
cmd
.
v2
.
target_ipv6_addr
[
i
]));
}
else
{
if
(
mvmvif
->
num_target_ipv6_addrs
)
{
enabled
|=
IWL_D3_PROTO_OFFLOAD_NS
;
memcpy
(
cmd
.
v1
.
ndp_mac_addr
,
vif
->
addr
,
ETH_ALEN
);
}
BUILD_BUG_ON
(
sizeof
(
cmd
.
target_ipv6_addr
[
i
])
!=
BUILD_BUG_ON
(
sizeof
(
cmd
.
v1
.
target_ipv6_addr
[
0
])
!=
sizeof
(
mvmvif
->
target_ipv6_addrs
[
i
]));
sizeof
(
mvmvif
->
target_ipv6_addrs
[
0
]));
for
(
i
=
0
;
i
<
mvmvif
->
num_target_ipv6_addrs
;
i
++
)
for
(
i
=
0
;
i
<
min
(
mvmvif
->
num_target_ipv6_addrs
,
memcpy
(
cmd
.
target_ipv6_addr
[
i
],
IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1
);
i
++
)
&
mvmvif
->
target_ipv6_addrs
[
i
],
memcpy
(
cmd
.
v1
.
target_ipv6_addr
[
i
],
sizeof
(
cmd
.
target_ipv6_addr
[
i
]));
&
mvmvif
->
target_ipv6_addrs
[
i
],
sizeof
(
cmd
.
v1
.
target_ipv6_addr
[
i
]));
}
#endif
#endif
if
(
mvm
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS
)
{
common
=
&
cmd
.
v2
.
common
;
size
=
sizeof
(
cmd
.
v2
);
}
else
{
common
=
&
cmd
.
v1
.
common
;
size
=
sizeof
(
cmd
.
v1
);
}
if
(
vif
->
bss_conf
.
arp_addr_cnt
)
{
if
(
vif
->
bss_conf
.
arp_addr_cnt
)
{
cmd
.
enabled
|=
cpu_to_le32
(
IWL_D3_PROTO_OFFLOAD_ARP
)
;
enabled
|=
IWL_D3_PROTO_OFFLOAD_ARP
;
c
md
.
host_ipv4_addr
=
vif
->
bss_conf
.
arp_addr_list
[
0
];
c
ommon
->
host_ipv4_addr
=
vif
->
bss_conf
.
arp_addr_list
[
0
];
memcpy
(
c
md
.
arp_mac_addr
,
vif
->
addr
,
ETH_ALEN
);
memcpy
(
c
ommon
->
arp_mac_addr
,
vif
->
addr
,
ETH_ALEN
);
}
}
if
(
!
cmd
.
enabled
)
if
(
!
enabled
)
return
0
;
return
0
;
common
->
enabled
=
cpu_to_le32
(
enabled
);
return
iwl_mvm_send_cmd_pdu
(
mvm
,
PROT_OFFLOAD_CONFIG_CMD
,
CMD_SYNC
,
return
iwl_mvm_send_cmd_pdu
(
mvm
,
PROT_OFFLOAD_CONFIG_CMD
,
CMD_SYNC
,
size
of
(
cmd
)
,
&
cmd
);
size
,
&
cmd
);
}
}
enum
iwl_mvm_tcp_packet_type
{
enum
iwl_mvm_tcp_packet_type
{
...
...
drivers/net/wireless/iwlwifi/mvm/debugfs.c
View file @
20416229
...
@@ -424,40 +424,11 @@ static ssize_t iwl_dbgfs_pm_params_read(struct file *file,
...
@@ -424,40 +424,11 @@ static ssize_t iwl_dbgfs_pm_params_read(struct file *file,
struct
ieee80211_vif
*
vif
=
file
->
private_data
;
struct
ieee80211_vif
*
vif
=
file
->
private_data
;
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
struct
iwl_mvm_vif
*
mvmvif
=
iwl_mvm_vif_from_mac80211
(
vif
);
struct
iwl_mvm
*
mvm
=
mvmvif
->
dbgfs_data
;
struct
iwl_mvm
*
mvm
=
mvmvif
->
dbgfs_data
;
struct
iwl_powertable_cmd
cmd
=
{};
char
buf
[
256
];
char
buf
[
256
];
int
bufsz
=
sizeof
(
buf
);
int
bufsz
=
sizeof
(
buf
);
int
pos
=
0
;
int
pos
;
iwl_mvm_power_build_cmd
(
mvm
,
vif
,
&
cmd
);
pos
=
iwl_mvm_power_dbgfs_read
(
mvm
,
vif
,
buf
,
bufsz
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"disable_power_off = %d
\n
"
,
(
cmd
.
flags
&
cpu_to_le16
(
POWER_FLAGS_POWER_SAVE_ENA_MSK
))
?
0
:
1
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"skip_dtim_periods = %d
\n
"
,
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 = 0x%x
\n
"
,
le16_to_cpu
(
cmd
.
flags
));
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"keep_alive = %d
\n
"
,
cmd
.
keep_alive_seconds
);
if
(
cmd
.
flags
&
cpu_to_le16
(
POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK
))
{
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"skip_over_dtim = %d
\n
"
,
(
cmd
.
flags
&
cpu_to_le16
(
POWER_FLAGS_SKIP_OVER_DTIM_MSK
))
?
1
:
0
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"rx_data_timeout = %d
\n
"
,
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
);
return
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
pos
);
}
}
...
@@ -626,20 +597,19 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct file *file,
...
@@ -626,20 +597,19 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct file *file,
size_t
count
,
loff_t
*
ppos
)
size_t
count
,
loff_t
*
ppos
)
{
{
struct
iwl_mvm
*
mvm
=
file
->
private_data
;
struct
iwl_mvm
*
mvm
=
file
->
private_data
;
bool
restart_fw
=
iwlwifi_mod_params
.
restart_fw
;
int
ret
;
int
ret
;
iwlwifi_mod_params
.
restart_fw
=
true
;
mutex_lock
(
&
mvm
->
mutex
);
mutex_lock
(
&
mvm
->
mutex
);
/* allow one more restart that we're provoking here */
if
(
mvm
->
restart_fw
>=
0
)
mvm
->
restart_fw
++
;
/* take the return value to make compiler happy - it will fail anyway */
/* 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
,
CMD_SYNC
,
0
,
NULL
);
mutex_unlock
(
&
mvm
->
mutex
);
mutex_unlock
(
&
mvm
->
mutex
);
iwlwifi_mod_params
.
restart_fw
=
restart_fw
;
return
count
;
return
count
;
}
}
...
@@ -661,8 +631,14 @@ static void iwl_dbgfs_update_bf(struct ieee80211_vif *vif,
...
@@ -661,8 +631,14 @@ static void iwl_dbgfs_update_bf(struct ieee80211_vif *vif,
case
MVM_DEBUGFS_BF_ROAMING_STATE
:
case
MVM_DEBUGFS_BF_ROAMING_STATE
:
dbgfs_bf
->
bf_roaming_state
=
value
;
dbgfs_bf
->
bf_roaming_state
=
value
;
break
;
break
;
case
MVM_DEBUGFS_BF_TEMPERATURE_DELTA
:
case
MVM_DEBUGFS_BF_TEMP_THRESHOLD
:
dbgfs_bf
->
bf_temperature_delta
=
value
;
dbgfs_bf
->
bf_temp_threshold
=
value
;
break
;
case
MVM_DEBUGFS_BF_TEMP_FAST_FILTER
:
dbgfs_bf
->
bf_temp_fast_filter
=
value
;
break
;
case
MVM_DEBUGFS_BF_TEMP_SLOW_FILTER
:
dbgfs_bf
->
bf_temp_slow_filter
=
value
;
break
;
break
;
case
MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER
:
case
MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER
:
dbgfs_bf
->
bf_enable_beacon_filter
=
value
;
dbgfs_bf
->
bf_enable_beacon_filter
=
value
;
...
@@ -721,13 +697,27 @@ static ssize_t iwl_dbgfs_bf_params_write(struct file *file,
...
@@ -721,13 +697,27 @@ static ssize_t iwl_dbgfs_bf_params_write(struct file *file,
value
>
IWL_BF_ROAMING_STATE_MAX
)
value
>
IWL_BF_ROAMING_STATE_MAX
)
return
-
EINVAL
;
return
-
EINVAL
;
param
=
MVM_DEBUGFS_BF_ROAMING_STATE
;
param
=
MVM_DEBUGFS_BF_ROAMING_STATE
;
}
else
if
(
!
strncmp
(
"bf_temperature_delta="
,
buf
,
21
))
{
}
else
if
(
!
strncmp
(
"bf_temp_threshold="
,
buf
,
18
))
{
if
(
sscanf
(
buf
+
21
,
"%d"
,
&
value
)
!=
1
)
if
(
sscanf
(
buf
+
18
,
"%d"
,
&
value
)
!=
1
)
return
-
EINVAL
;
if
(
value
<
IWL_BF_TEMP_THRESHOLD_MIN
||
value
>
IWL_BF_TEMP_THRESHOLD_MAX
)
return
-
EINVAL
;
param
=
MVM_DEBUGFS_BF_TEMP_THRESHOLD
;
}
else
if
(
!
strncmp
(
"bf_temp_fast_filter="
,
buf
,
20
))
{
if
(
sscanf
(
buf
+
20
,
"%d"
,
&
value
)
!=
1
)
return
-
EINVAL
;
if
(
value
<
IWL_BF_TEMP_FAST_FILTER_MIN
||
value
>
IWL_BF_TEMP_FAST_FILTER_MAX
)
return
-
EINVAL
;
param
=
MVM_DEBUGFS_BF_TEMP_FAST_FILTER
;
}
else
if
(
!
strncmp
(
"bf_temp_slow_filter="
,
buf
,
20
))
{
if
(
sscanf
(
buf
+
20
,
"%d"
,
&
value
)
!=
1
)
return
-
EINVAL
;
return
-
EINVAL
;
if
(
value
<
IWL_BF_TEMP
ERATURE_DELTA
_MIN
||
if
(
value
<
IWL_BF_TEMP
_SLOW_FILTER
_MIN
||
value
>
IWL_BF_TEMP
ERATURE_DELTA
_MAX
)
value
>
IWL_BF_TEMP
_SLOW_FILTER
_MAX
)
return
-
EINVAL
;
return
-
EINVAL
;
param
=
MVM_DEBUGFS_BF_TEMP
ERATURE_DELTA
;
param
=
MVM_DEBUGFS_BF_TEMP
_SLOW_FILTER
;
}
else
if
(
!
strncmp
(
"bf_enable_beacon_filter="
,
buf
,
24
))
{
}
else
if
(
!
strncmp
(
"bf_enable_beacon_filter="
,
buf
,
24
))
{
if
(
sscanf
(
buf
+
24
,
"%d"
,
&
value
)
!=
1
)
if
(
sscanf
(
buf
+
24
,
"%d"
,
&
value
)
!=
1
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -789,41 +779,41 @@ static ssize_t iwl_dbgfs_bf_params_read(struct file *file,
...
@@ -789,41 +779,41 @@ static ssize_t iwl_dbgfs_bf_params_read(struct file *file,
int
pos
=
0
;
int
pos
=
0
;
const
size_t
bufsz
=
sizeof
(
buf
);
const
size_t
bufsz
=
sizeof
(
buf
);
struct
iwl_beacon_filter_cmd
cmd
=
{
struct
iwl_beacon_filter_cmd
cmd
=
{
.
bf_energy_delta
=
IWL_BF_ENERGY_DELTA_DEFAULT
,
IWL_BF_CMD_CONFIG_DEFAULTS
,
.
bf_roaming_energy_delta
=
IWL_BF_ROAMING_ENERGY_DELTA_DEFAULT
,
.
bf_enable_beacon_filter
=
.
bf_roaming_state
=
IWL_BF_ROAMING_STATE_DEFAULT
,
cpu_to_le32
(
IWL_BF_ENABLE_BEACON_FILTER_DEFAULT
),
.
bf_temperature_delta
=
IWL_BF_TEMPERATURE_DELTA_DEFAULT
,
.
ba_enable_beacon_abort
=
.
bf_enable_beacon_filter
=
IWL_BF_ENABLE_BEACON_FILTER_DEFAULT
,
cpu_to_le32
(
IWL_BA_ENABLE_BEACON_ABORT_DEFAULT
),
.
bf_debug_flag
=
IWL_BF_DEBUG_FLAG_DEFAULT
,
.
bf_escape_timer
=
cpu_to_le32
(
IWL_BF_ESCAPE_TIMER_DEFAULT
),
.
ba_escape_timer
=
cpu_to_le32
(
IWL_BA_ESCAPE_TIMER_DEFAULT
),
.
ba_enable_beacon_abort
=
IWL_BA_ENABLE_BEACON_ABORT_DEFAULT
,
};
};
iwl_mvm_beacon_filter_debugfs_parameters
(
vif
,
&
cmd
);
iwl_mvm_beacon_filter_debugfs_parameters
(
vif
,
&
cmd
);
if
(
mvmvif
->
bf_enabled
)
if
(
mvmvif
->
bf_enabled
)
cmd
.
bf_enable_beacon_filter
=
1
;
cmd
.
bf_enable_beacon_filter
=
cpu_to_le32
(
1
)
;
else
else
cmd
.
bf_enable_beacon_filter
=
0
;
cmd
.
bf_enable_beacon_filter
=
0
;
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_energy_delta = %d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_energy_delta = %d
\n
"
,
cmd
.
bf_energy_delta
);
le32_to_cpu
(
cmd
.
bf_energy_delta
)
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_roaming_energy_delta = %d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_roaming_energy_delta = %d
\n
"
,
cmd
.
bf_roaming_energy_delta
);
le32_to_cpu
(
cmd
.
bf_roaming_energy_delta
)
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_roaming_state = %d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_roaming_state = %d
\n
"
,
cmd
.
bf_roaming_state
);
le32_to_cpu
(
cmd
.
bf_roaming_state
));
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_temperature_delta = %d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_temp_threshold = %d
\n
"
,
cmd
.
bf_temperature_delta
);
le32_to_cpu
(
cmd
.
bf_temp_threshold
));
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_temp_fast_filter = %d
\n
"
,
le32_to_cpu
(
cmd
.
bf_temp_fast_filter
));
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_temp_slow_filter = %d
\n
"
,
le32_to_cpu
(
cmd
.
bf_temp_slow_filter
));
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_enable_beacon_filter = %d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_enable_beacon_filter = %d
\n
"
,
cmd
.
bf_enable_beacon_filter
);
le32_to_cpu
(
cmd
.
bf_enable_beacon_filter
)
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_debug_flag = %d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_debug_flag = %d
\n
"
,
cmd
.
bf_debug_flag
);
le32_to_cpu
(
cmd
.
bf_debug_flag
)
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_escape_timer = %d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"bf_escape_timer = %d
\n
"
,
cmd
.
bf_escape_timer
);
le32_to_cpu
(
cmd
.
bf_escape_timer
)
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"ba_escape_timer = %d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"ba_escape_timer = %d
\n
"
,
cmd
.
ba_escape_timer
);
le32_to_cpu
(
cmd
.
ba_escape_timer
)
);
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"ba_enable_beacon_abort = %d
\n
"
,
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"ba_enable_beacon_abort = %d
\n
"
,
cmd
.
ba_enable_beacon_abort
);
le32_to_cpu
(
cmd
.
ba_enable_beacon_abort
)
);
return
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
pos
);
return
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
pos
);
}
}
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api-d3.h
View file @
20416229
...
@@ -98,34 +98,63 @@ enum iwl_proto_offloads {
...
@@ -98,34 +98,63 @@ enum iwl_proto_offloads {
IWL_D3_PROTO_OFFLOAD_NS
=
BIT
(
1
),
IWL_D3_PROTO_OFFLOAD_NS
=
BIT
(
1
),
};
};
#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS 2
#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1 2
#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V2 6
#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX 6
/**
/**
* struct iwl_proto_offload_cmd
- ARP/NS offload configuration
* struct iwl_proto_offload_cmd
_common - ARP/NS offload common part
* @enabled: enable flags
* @enabled: enable flags
* @remote_ipv4_addr: remote address to answer to (or zero if all)
* @remote_ipv4_addr: remote address to answer to (or zero if all)
* @host_ipv4_addr: our IPv4 address to respond to queries for
* @host_ipv4_addr: our IPv4 address to respond to queries for
* @arp_mac_addr: our MAC address for ARP responses
* @arp_mac_addr: our MAC address for ARP responses
* @remote_ipv6_addr: remote address to answer to (or zero if all)
* @reserved: unused
* @solicited_node_ipv6_addr: broken -- solicited node address exists
* for each target address
* @target_ipv6_addr: our target addresses
* @ndp_mac_addr: neighbor soliciation response MAC address
*/
*/
struct
iwl_proto_offload_cmd
{
struct
iwl_proto_offload_cmd
_common
{
__le32
enabled
;
__le32
enabled
;
__be32
remote_ipv4_addr
;
__be32
remote_ipv4_addr
;
__be32
host_ipv4_addr
;
__be32
host_ipv4_addr
;
u8
arp_mac_addr
[
ETH_ALEN
];
u8
arp_mac_addr
[
ETH_ALEN
];
__le16
reserved1
;
__le16
reserved
;
}
__packed
;
/**
* struct iwl_proto_offload_cmd_v1 - ARP/NS offload configuration
* @common: common/IPv4 configuration
* @remote_ipv6_addr: remote address to answer to (or zero if all)
* @solicited_node_ipv6_addr: broken -- solicited node address exists
* for each target address
* @target_ipv6_addr: our target addresses
* @ndp_mac_addr: neighbor soliciation response MAC address
*/
struct
iwl_proto_offload_cmd_v1
{
struct
iwl_proto_offload_cmd_common
common
;
u8
remote_ipv6_addr
[
16
];
u8
remote_ipv6_addr
[
16
];
u8
solicited_node_ipv6_addr
[
16
];
u8
solicited_node_ipv6_addr
[
16
];
u8
target_ipv6_addr
[
IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS
][
16
];
u8
target_ipv6_addr
[
IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS
_V1
][
16
];
u8
ndp_mac_addr
[
ETH_ALEN
];
u8
ndp_mac_addr
[
ETH_ALEN
];
__le16
reserved2
;
__le16
reserved2
;
}
__packed
;
/* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_1 */
}
__packed
;
/* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_1 */
/**
* struct iwl_proto_offload_cmd_v2 - ARP/NS offload configuration
* @common: common/IPv4 configuration
* @remote_ipv6_addr: remote address to answer to (or zero if all)
* @solicited_node_ipv6_addr: broken -- solicited node address exists
* for each target address
* @target_ipv6_addr: our target addresses
* @ndp_mac_addr: neighbor soliciation response MAC address
*/
struct
iwl_proto_offload_cmd_v2
{
struct
iwl_proto_offload_cmd_common
common
;
u8
remote_ipv6_addr
[
16
];
u8
solicited_node_ipv6_addr
[
16
];
u8
target_ipv6_addr
[
IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V2
][
16
];
u8
ndp_mac_addr
[
ETH_ALEN
];
u8
numValidIPv6Addresses
;
u8
reserved2
[
3
];
}
__packed
;
/* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_2 */
/*
/*
* WOWLAN_PATTERNS
* WOWLAN_PATTERNS
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
View file @
20416229
...
@@ -79,6 +79,10 @@
...
@@ -79,6 +79,10 @@
* '1' Driver enables PM (use rest of parameters)
* '1' Driver enables PM (use rest of parameters)
* @POWER_FLAGS_SKIP_OVER_DTIM_MSK: '0' PM have to walk up every DTIM,
* @POWER_FLAGS_SKIP_OVER_DTIM_MSK: '0' PM have to walk up every DTIM,
* '1' PM could sleep over DTIM till listen Interval.
* '1' PM could sleep over DTIM till listen Interval.
* @POWER_FLAGS_SNOOZE_ENA_MSK: Enable snoozing only if uAPSD is enabled and all
* access categories are both delivery and trigger enabled.
* @POWER_FLAGS_BT_SCO_ENA: Enable BT SCO coex only if uAPSD and
* PBW Snoozing enabled
* @POWER_FLAGS_ADVANCE_PM_ENA_MSK: Advanced PM (uAPSD) enable mask
* @POWER_FLAGS_ADVANCE_PM_ENA_MSK: Advanced PM (uAPSD) enable mask
* @POWER_FLAGS_LPRX_ENA_MSK: Low Power RX enable.
* @POWER_FLAGS_LPRX_ENA_MSK: Low Power RX enable.
*/
*/
...
@@ -86,6 +90,8 @@ enum iwl_power_flags {
...
@@ -86,6 +90,8 @@ enum iwl_power_flags {
POWER_FLAGS_POWER_SAVE_ENA_MSK
=
BIT
(
0
),
POWER_FLAGS_POWER_SAVE_ENA_MSK
=
BIT
(
0
),
POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK
=
BIT
(
1
),
POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK
=
BIT
(
1
),
POWER_FLAGS_SKIP_OVER_DTIM_MSK
=
BIT
(
2
),
POWER_FLAGS_SKIP_OVER_DTIM_MSK
=
BIT
(
2
),
POWER_FLAGS_SNOOZE_ENA_MSK
=
BIT
(
5
),
POWER_FLAGS_BT_SCO_ENA
=
BIT
(
8
),
POWER_FLAGS_ADVANCE_PM_ENA_MSK
=
BIT
(
9
),
POWER_FLAGS_ADVANCE_PM_ENA_MSK
=
BIT
(
9
),
POWER_FLAGS_LPRX_ENA_MSK
=
BIT
(
11
),
POWER_FLAGS_LPRX_ENA_MSK
=
BIT
(
11
),
};
};
...
@@ -93,7 +99,8 @@ enum iwl_power_flags {
...
@@ -93,7 +99,8 @@ enum iwl_power_flags {
#define IWL_POWER_VEC_SIZE 5
#define IWL_POWER_VEC_SIZE 5
/**
/**
* struct iwl_powertable_cmd - Power Table Command
* struct iwl_powertable_cmd - legacy power command. Beside old API support this
* is used also with a new power API for device wide power settings.
* POWER_TABLE_CMD = 0x77 (command, has simple generic response)
* POWER_TABLE_CMD = 0x77 (command, has simple generic response)
*
*
* @flags: Power table command flags from POWER_FLAGS_*
* @flags: Power table command flags from POWER_FLAGS_*
...
@@ -124,6 +131,72 @@ struct iwl_powertable_cmd {
...
@@ -124,6 +131,72 @@ struct iwl_powertable_cmd {
__le32
lprx_rssi_threshold
;
__le32
lprx_rssi_threshold
;
}
__packed
;
}
__packed
;
/**
* struct iwl_mac_power_cmd - New power command containing uAPSD support
* MAC_PM_POWER_TABLE = 0xA9 (command, has simple generic response)
* @id_and_color: MAC contex identifier
* @flags: Power table command flags from POWER_FLAGS_*
* @keep_alive_seconds: Keep alive period in seconds. Default - 25 sec.
* Minimum allowed:- 3 * DTIM. Keep alive period must be
* set regardless of power scheme or current power state.
* FW use this value also when PM is disabled.
* @rx_data_timeout: Minimum time (usec) from last Rx packet for AM to
* PSM transition - legacy PM
* @tx_data_timeout: Minimum time (usec) from last Tx packet for AM to
* PSM transition - legacy PM
* @sleep_interval: not in use
* @skip_dtim_periods: Number of DTIM periods to skip if Skip over DTIM flag
* is set. For example, if it is required to skip over
* one DTIM, this value need to be set to 2 (DTIM periods).
* @rx_data_timeout_uapsd: Minimum time (usec) from last Rx packet for AM to
* PSM transition - uAPSD
* @tx_data_timeout_uapsd: Minimum time (usec) from last Tx packet for AM to
* PSM transition - uAPSD
* @lprx_rssi_threshold: Signal strength up to which LP RX can be enabled.
* Default: 80dbm
* @num_skip_dtim: Number of DTIMs to skip if Skip over DTIM flag is set
* @snooze_interval: TBD
* @snooze_window: TBD
* @snooze_step: TBD
* @qndp_tid: TID client shall use for uAPSD QNDP triggers
* @uapsd_ac_flags: Set trigger-enabled and delivery-enabled indication for
* each corresponding AC.
* Use IEEE80211_WMM_IE_STA_QOSINFO_AC* for correct values.
* @uapsd_max_sp: Use IEEE80211_WMM_IE_STA_QOSINFO_SP_* for correct
* values.
* @heavy_traffic_thr_tx_pkts: TX threshold measured in number of packets
* @heavy_traffic_thr_rx_pkts: RX threshold measured in number of packets
* @heavy_traffic_thr_tx_load: TX threshold measured in load's percentage
* @heavy_traffic_thr_rx_load: RX threshold measured in load's percentage
* @limited_ps_threshold:
*/
struct
iwl_mac_power_cmd
{
/* CONTEXT_DESC_API_T_VER_1 */
__le32
id_and_color
;
/* CLIENT_PM_POWER_TABLE_S_VER_1 */
__le16
flags
;
__le16
keep_alive_seconds
;
__le32
rx_data_timeout
;
__le32
tx_data_timeout
;
__le32
rx_data_timeout_uapsd
;
__le32
tx_data_timeout_uapsd
;
u8
lprx_rssi_threshold
;
u8
skip_dtim_periods
;
__le16
snooze_interval
;
__le16
snooze_window
;
u8
snooze_step
;
u8
qndp_tid
;
u8
uapsd_ac_flags
;
u8
uapsd_max_sp
;
u8
heavy_traffic_threshold_tx_packets
;
u8
heavy_traffic_threshold_rx_packets
;
u8
heavy_traffic_threshold_tx_percentage
;
u8
heavy_traffic_threshold_rx_percentage
;
u8
limited_ps_threshold
;
u8
reserved
;
}
__packed
;
/**
/**
* struct iwl_beacon_filter_cmd
* struct iwl_beacon_filter_cmd
* REPLY_BEACON_FILTERING_CMD = 0xd2 (command)
* REPLY_BEACON_FILTERING_CMD = 0xd2 (command)
...
@@ -143,11 +216,21 @@ struct iwl_powertable_cmd {
...
@@ -143,11 +216,21 @@ struct iwl_powertable_cmd {
* calculated for current beacon is less than the threshold, use
* calculated for current beacon is less than the threshold, use
* Roaming Energy Delta Threshold, otherwise use normal Energy Delta
* Roaming Energy Delta Threshold, otherwise use normal Energy Delta
* Threshold. Typical energy threshold is -72dBm.
* Threshold. Typical energy threshold is -72dBm.
* @bf_temperature_delta: Send Beacon to driver if delta in temperature values
* @bf_temp_threshold: This threshold determines the type of temperature
* calculated for this and the last passed beacon is greater than this
* filtering (Slow or Fast) that is selected (Units are in Celsuis):
* threshold. Zero value means that the temperature changeis ignored for
* If the current temperature is above this threshold - Fast filter
* will be used, If the current temperature is below this threshold -
* Slow filter will be used.
* @bf_temp_fast_filter: Send Beacon to driver if delta in temperature values
* calculated for this and the last passed beacon is greater than this
* threshold. Zero value means that the temperature change is ignored for
* beacon filtering; beacons will not be forced to be sent to driver
* beacon filtering; beacons will not be forced to be sent to driver
* regardless of whether its temerature has been changed.
* regardless of whether its temerature has been changed.
* @bf_temp_slow_filter: Send Beacon to driver if delta in temperature values
* calculated for this and the last passed beacon is greater than this
* threshold. Zero value means that the temperature change is ignored for
* beacon filtering; beacons will not be forced to be sent to driver
* regardless of whether its temerature has been changed.
* @bf_enable_beacon_filter: 1, beacon filtering is enabled; 0, disabled.
* @bf_enable_beacon_filter: 1, beacon filtering is enabled; 0, disabled.
* @bf_filter_escape_timer: Send beacons to to driver if no beacons were passed
* @bf_filter_escape_timer: Send beacons to to driver if no beacons were passed
* for a specific period of time. Units: Beacons.
* for a specific period of time. Units: Beacons.
...
@@ -156,17 +239,17 @@ struct iwl_powertable_cmd {
...
@@ -156,17 +239,17 @@ struct iwl_powertable_cmd {
* @ba_enable_beacon_abort: 1, beacon abort is enabled; 0, disabled.
* @ba_enable_beacon_abort: 1, beacon abort is enabled; 0, disabled.
*/
*/
struct
iwl_beacon_filter_cmd
{
struct
iwl_beacon_filter_cmd
{
u8
bf_energy_delta
;
__le32
bf_energy_delta
;
u8
bf_roaming_energy_delta
;
__le32
bf_roaming_energy_delta
;
u8
bf_roaming_state
;
__le32
bf_roaming_state
;
u8
bf_temperature_delta
;
__le32
bf_temp_threshold
;
u8
bf_enable_beacon_filter
;
__le32
bf_temp_fast_filter
;
u8
bf_debug_flag
;
__le32
bf_temp_slow_filter
;
__le16
reserved1
;
__le32
bf_enable_beacon_filter
;
__le32
bf_debug_flag
;
__le32
bf_escape_timer
;
__le32
bf_escape_timer
;
__le32
ba_escape_timer
;
__le32
ba_escape_timer
;
u8
ba_enable_beacon_abort
;
__le32
ba_enable_beacon_abort
;
u8
reserved2
[
3
];
}
__packed
;
}
__packed
;
/* Beacon filtering and beacon abort */
/* Beacon filtering and beacon abort */
...
@@ -182,9 +265,17 @@ struct iwl_beacon_filter_cmd {
...
@@ -182,9 +265,17 @@ struct iwl_beacon_filter_cmd {
#define IWL_BF_ROAMING_STATE_MAX 255
#define IWL_BF_ROAMING_STATE_MAX 255
#define IWL_BF_ROAMING_STATE_MIN 0
#define IWL_BF_ROAMING_STATE_MIN 0
#define IWL_BF_TEMPERATURE_DELTA_DEFAULT 5
#define IWL_BF_TEMP_THRESHOLD_DEFAULT 112
#define IWL_BF_TEMPERATURE_DELTA_MAX 255
#define IWL_BF_TEMP_THRESHOLD_MAX 255
#define IWL_BF_TEMPERATURE_DELTA_MIN 0
#define IWL_BF_TEMP_THRESHOLD_MIN 0
#define IWL_BF_TEMP_FAST_FILTER_DEFAULT 1
#define IWL_BF_TEMP_FAST_FILTER_MAX 255
#define IWL_BF_TEMP_FAST_FILTER_MIN 0
#define IWL_BF_TEMP_SLOW_FILTER_DEFAULT 5
#define IWL_BF_TEMP_SLOW_FILTER_MAX 255
#define IWL_BF_TEMP_SLOW_FILTER_MIN 0
#define IWL_BF_ENABLE_BEACON_FILTER_DEFAULT 1
#define IWL_BF_ENABLE_BEACON_FILTER_DEFAULT 1
...
@@ -194,19 +285,23 @@ struct iwl_beacon_filter_cmd {
...
@@ -194,19 +285,23 @@ struct iwl_beacon_filter_cmd {
#define IWL_BF_ESCAPE_TIMER_MAX 1024
#define IWL_BF_ESCAPE_TIMER_MAX 1024
#define IWL_BF_ESCAPE_TIMER_MIN 0
#define IWL_BF_ESCAPE_TIMER_MIN 0
#define IWL_BA_ESCAPE_TIMER_DEFAULT 3
#define IWL_BA_ESCAPE_TIMER_DEFAULT 6
#define IWL_BA_ESCAPE_TIMER_D3 6
#define IWL_BA_ESCAPE_TIMER_MAX 1024
#define IWL_BA_ESCAPE_TIMER_MAX 1024
#define IWL_BA_ESCAPE_TIMER_MIN 0
#define IWL_BA_ESCAPE_TIMER_MIN 0
#define IWL_BA_ENABLE_BEACON_ABORT_DEFAULT 1
#define IWL_BA_ENABLE_BEACON_ABORT_DEFAULT 1
#define IWL_BF_CMD_CONFIG_DEFAULTS \
#define IWL_BF_CMD_CONFIG_DEFAULTS \
.bf_energy_delta = IWL_BF_ENERGY_DELTA_DEFAULT, \
.bf_energy_delta = cpu_to_le32(IWL_BF_ENERGY_DELTA_DEFAULT), \
.bf_roaming_energy_delta = IWL_BF_ROAMING_ENERGY_DELTA_DEFAULT, \
.bf_roaming_energy_delta = \
.bf_roaming_state = IWL_BF_ROAMING_STATE_DEFAULT, \
cpu_to_le32(IWL_BF_ROAMING_ENERGY_DELTA_DEFAULT), \
.bf_temperature_delta = IWL_BF_TEMPERATURE_DELTA_DEFAULT, \
.bf_roaming_state = cpu_to_le32(IWL_BF_ROAMING_STATE_DEFAULT), \
.bf_debug_flag = IWL_BF_DEBUG_FLAG_DEFAULT, \
.bf_temp_threshold = cpu_to_le32(IWL_BF_TEMP_THRESHOLD_DEFAULT), \
.bf_escape_timer = cpu_to_le32(IWL_BF_ESCAPE_TIMER_DEFAULT), \
.bf_temp_fast_filter = cpu_to_le32(IWL_BF_TEMP_FAST_FILTER_DEFAULT), \
.bf_temp_slow_filter = cpu_to_le32(IWL_BF_TEMP_SLOW_FILTER_DEFAULT), \
.bf_debug_flag = cpu_to_le32(IWL_BF_DEBUG_FLAG_DEFAULT), \
.bf_escape_timer = cpu_to_le32(IWL_BF_ESCAPE_TIMER_DEFAULT), \
.ba_escape_timer = cpu_to_le32(IWL_BA_ESCAPE_TIMER_DEFAULT)
.ba_escape_timer = cpu_to_le32(IWL_BA_ESCAPE_TIMER_DEFAULT)
#endif
#endif
drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
View file @
20416229
...
@@ -138,6 +138,8 @@ struct iwl_ssid_ie {
...
@@ -138,6 +138,8 @@ struct iwl_ssid_ie {
*@SCAN_FLAGS_DELAYED_SCAN_LOWBAND:
*@SCAN_FLAGS_DELAYED_SCAN_LOWBAND:
*@SCAN_FLAGS_DELAYED_SCAN_HIGHBAND:
*@SCAN_FLAGS_DELAYED_SCAN_HIGHBAND:
*@SCAN_FLAGS_FRAGMENTED_SCAN:
*@SCAN_FLAGS_FRAGMENTED_SCAN:
*@SCAN_FLAGS_PASSIVE2ACTIVE: use active scan on channels that was active
* in the past hour, even if they are marked as passive.
*/
*/
enum
iwl_scan_flags
{
enum
iwl_scan_flags
{
SCAN_FLAGS_PERIODIC_SCAN
=
BIT
(
0
),
SCAN_FLAGS_PERIODIC_SCAN
=
BIT
(
0
),
...
@@ -145,6 +147,7 @@ enum iwl_scan_flags {
...
@@ -145,6 +147,7 @@ enum iwl_scan_flags {
SCAN_FLAGS_DELAYED_SCAN_LOWBAND
=
BIT
(
2
),
SCAN_FLAGS_DELAYED_SCAN_LOWBAND
=
BIT
(
2
),
SCAN_FLAGS_DELAYED_SCAN_HIGHBAND
=
BIT
(
3
),
SCAN_FLAGS_DELAYED_SCAN_HIGHBAND
=
BIT
(
3
),
SCAN_FLAGS_FRAGMENTED_SCAN
=
BIT
(
4
),
SCAN_FLAGS_FRAGMENTED_SCAN
=
BIT
(
4
),
SCAN_FLAGS_PASSIVE2ACTIVE
=
BIT
(
5
),
};
};
/**
/**
...
@@ -179,7 +182,7 @@ enum iwl_scan_type {
...
@@ -179,7 +182,7 @@ enum iwl_scan_type {
* @quiet_time: in msecs, dwell this time for active scan on quiet channels
* @quiet_time: in msecs, dwell this time for active scan on quiet channels
* @quiet_plcp_th: quiet PLCP threshold (channel is quiet if less than
* @quiet_plcp_th: quiet PLCP threshold (channel is quiet if less than
* this number of packets were received (typically 1)
* this number of packets were received (typically 1)
* @passive2active: is auto switching from passive to active
allowed (0 or 1)
* @passive2active: is auto switching from passive to active
during scan allowed
* @rxchain_sel_flags: RXON_RX_CHAIN_*
* @rxchain_sel_flags: RXON_RX_CHAIN_*
* @max_out_time: in usecs, max out of serving channel time
* @max_out_time: in usecs, max out of serving channel time
* @suspend_time: how long to pause scan when returning to service channel:
* @suspend_time: how long to pause scan when returning to service channel:
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h
View file @
20416229
...
@@ -91,7 +91,6 @@
...
@@ -91,7 +91,6 @@
* @TX_CMD_FLG_RESP_TO_DRV: zero this if the response should go only to FW
* @TX_CMD_FLG_RESP_TO_DRV: zero this if the response should go only to FW
* @TX_CMD_FLG_CCMP_AGG: this frame uses CCMP for aggregation acceleration
* @TX_CMD_FLG_CCMP_AGG: this frame uses CCMP for aggregation acceleration
* @TX_CMD_FLG_TKIP_MIC_DONE: FW already performed TKIP MIC calculation
* @TX_CMD_FLG_TKIP_MIC_DONE: FW already performed TKIP MIC calculation
* @TX_CMD_FLG_CTS_ONLY: send CTS only, no data after that
* @TX_CMD_FLG_DUR: disable duration overwriting used in PS-Poll Assoc-id
* @TX_CMD_FLG_DUR: disable duration overwriting used in PS-Poll Assoc-id
* @TX_CMD_FLG_FW_DROP: FW should mark frame to be dropped
* @TX_CMD_FLG_FW_DROP: FW should mark frame to be dropped
* @TX_CMD_FLG_EXEC_PAPD: execute PAPD
* @TX_CMD_FLG_EXEC_PAPD: execute PAPD
...
@@ -120,7 +119,6 @@ enum iwl_tx_flags {
...
@@ -120,7 +119,6 @@ enum iwl_tx_flags {
TX_CMD_FLG_RESP_TO_DRV
=
BIT
(
21
),
TX_CMD_FLG_RESP_TO_DRV
=
BIT
(
21
),
TX_CMD_FLG_CCMP_AGG
=
BIT
(
22
),
TX_CMD_FLG_CCMP_AGG
=
BIT
(
22
),
TX_CMD_FLG_TKIP_MIC_DONE
=
BIT
(
23
),
TX_CMD_FLG_TKIP_MIC_DONE
=
BIT
(
23
),
TX_CMD_FLG_CTS_ONLY
=
BIT
(
24
),
TX_CMD_FLG_DUR
=
BIT
(
25
),
TX_CMD_FLG_DUR
=
BIT
(
25
),
TX_CMD_FLG_FW_DROP
=
BIT
(
26
),
TX_CMD_FLG_FW_DROP
=
BIT
(
26
),
TX_CMD_FLG_EXEC_PAPD
=
BIT
(
27
),
TX_CMD_FLG_EXEC_PAPD
=
BIT
(
27
),
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api.h
View file @
20416229
...
@@ -136,7 +136,7 @@ enum {
...
@@ -136,7 +136,7 @@ enum {
CALIB_RES_NOTIF_PHY_DB
=
0x6b
,
CALIB_RES_NOTIF_PHY_DB
=
0x6b
,
/* PHY_DB_CMD = 0x6c, */
/* PHY_DB_CMD = 0x6c, */
/* Power */
/* Power
- legacy power table command
*/
POWER_TABLE_CMD
=
0x77
,
POWER_TABLE_CMD
=
0x77
,
/* Thermal Throttling*/
/* Thermal Throttling*/
...
@@ -159,6 +159,7 @@ enum {
...
@@ -159,6 +159,7 @@ enum {
TX_ANT_CONFIGURATION_CMD
=
0x98
,
TX_ANT_CONFIGURATION_CMD
=
0x98
,
BT_CONFIG
=
0x9b
,
BT_CONFIG
=
0x9b
,
STATISTICS_NOTIFICATION
=
0x9d
,
STATISTICS_NOTIFICATION
=
0x9d
,
REDUCE_TX_POWER_CMD
=
0x9f
,
/* RF-KILL commands and notifications */
/* RF-KILL commands and notifications */
CARD_STATE_CMD
=
0xa0
,
CARD_STATE_CMD
=
0xa0
,
...
@@ -166,6 +167,9 @@ enum {
...
@@ -166,6 +167,9 @@ enum {
MISSED_BEACONS_NOTIFICATION
=
0xa2
,
MISSED_BEACONS_NOTIFICATION
=
0xa2
,
/* Power - new power table command */
MAC_PM_POWER_TABLE
=
0xa9
,
REPLY_RX_PHY_CMD
=
0xc0
,
REPLY_RX_PHY_CMD
=
0xc0
,
REPLY_RX_MPDU_CMD
=
0xc1
,
REPLY_RX_MPDU_CMD
=
0xc1
,
BA_NOTIF
=
0xc5
,
BA_NOTIF
=
0xc5
,
...
@@ -223,6 +227,19 @@ struct iwl_tx_ant_cfg_cmd {
...
@@ -223,6 +227,19 @@ struct iwl_tx_ant_cfg_cmd {
__le32
valid
;
__le32
valid
;
}
__packed
;
}
__packed
;
/**
* struct iwl_reduce_tx_power_cmd - TX power reduction command
* REDUCE_TX_POWER_CMD = 0x9f
* @flags: (reserved for future implementation)
* @mac_context_id: id of the mac ctx for which we are reducing TX power.
* @pwr_restriction: TX power restriction in dBms.
*/
struct
iwl_reduce_tx_power_cmd
{
u8
flags
;
u8
mac_context_id
;
__le16
pwr_restriction
;
}
__packed
;
/* TX_REDUCED_POWER_API_S_VER_1 */
/*
/*
* Calibration control struct.
* Calibration control struct.
* Sent as part of the phy configuration command.
* Sent as part of the phy configuration command.
...
@@ -765,6 +782,14 @@ struct iwl_phy_context_cmd {
...
@@ -765,6 +782,14 @@ struct iwl_phy_context_cmd {
}
__packed
;
/* PHY_CONTEXT_CMD_API_VER_1 */
}
__packed
;
/* PHY_CONTEXT_CMD_API_VER_1 */
#define IWL_RX_INFO_PHY_CNT 8
#define IWL_RX_INFO_PHY_CNT 8
#define IWL_RX_INFO_ENERGY_ANT_ABC_IDX 1
#define IWL_RX_INFO_ENERGY_ANT_A_MSK 0x000000ff
#define IWL_RX_INFO_ENERGY_ANT_B_MSK 0x0000ff00
#define IWL_RX_INFO_ENERGY_ANT_C_MSK 0x00ff0000
#define IWL_RX_INFO_ENERGY_ANT_A_POS 0
#define IWL_RX_INFO_ENERGY_ANT_B_POS 8
#define IWL_RX_INFO_ENERGY_ANT_C_POS 16
#define IWL_RX_INFO_AGC_IDX 1
#define IWL_RX_INFO_AGC_IDX 1
#define IWL_RX_INFO_RSSI_AB_IDX 2
#define IWL_RX_INFO_RSSI_AB_IDX 2
#define IWL_OFDM_AGC_A_MSK 0x0000007f
#define IWL_OFDM_AGC_A_MSK 0x0000007f
...
...
drivers/net/wireless/iwlwifi/mvm/fw.c
View file @
20416229
...
@@ -78,22 +78,6 @@
...
@@ -78,22 +78,6 @@
#define UCODE_VALID_OK cpu_to_le32(0x1)
#define UCODE_VALID_OK cpu_to_le32(0x1)
/* Default calibration values for WkP - set to INIT image w/o running */
static
const
u8
wkp_calib_values_rx_iq_skew
[]
=
{
0x00
,
0x00
,
0x01
,
0x00
};
static
const
u8
wkp_calib_values_tx_iq_skew
[]
=
{
0x01
,
0x00
,
0x00
,
0x00
};
struct
iwl_calib_default_data
{
u16
size
;
void
*
data
;
};
#define CALIB_SIZE_N_DATA(_buf) {.size = sizeof(_buf), .data = &_buf}
static
const
struct
iwl_calib_default_data
wkp_calib_default_data
[
12
]
=
{
[
9
]
=
CALIB_SIZE_N_DATA
(
wkp_calib_values_tx_iq_skew
),
[
11
]
=
CALIB_SIZE_N_DATA
(
wkp_calib_values_rx_iq_skew
),
};
struct
iwl_mvm_alive_data
{
struct
iwl_mvm_alive_data
{
bool
valid
;
bool
valid
;
u32
scd_base_addr
;
u32
scd_base_addr
;
...
@@ -248,40 +232,6 @@ static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm)
...
@@ -248,40 +232,6 @@ static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm)
sizeof
(
phy_cfg_cmd
),
&
phy_cfg_cmd
);
sizeof
(
phy_cfg_cmd
),
&
phy_cfg_cmd
);
}
}
static
int
iwl_set_default_calibrations
(
struct
iwl_mvm
*
mvm
)
{
u8
cmd_raw
[
16
];
/* holds the variable size commands */
struct
iwl_set_calib_default_cmd
*
cmd
=
(
struct
iwl_set_calib_default_cmd
*
)
cmd_raw
;
int
ret
,
i
;
/* Setting default values for calibrations we don't run */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
wkp_calib_default_data
);
i
++
)
{
u16
cmd_len
;
if
(
wkp_calib_default_data
[
i
].
size
==
0
)
continue
;
memset
(
cmd_raw
,
0
,
sizeof
(
cmd_raw
));
cmd_len
=
wkp_calib_default_data
[
i
].
size
+
sizeof
(
cmd
);
cmd
->
calib_index
=
cpu_to_le16
(
i
);
cmd
->
length
=
cpu_to_le16
(
wkp_calib_default_data
[
i
].
size
);
if
(
WARN_ONCE
(
cmd_len
>
sizeof
(
cmd_raw
),
"Need to enlarge cmd_raw to %d
\n
"
,
cmd_len
))
break
;
memcpy
(
cmd
->
data
,
wkp_calib_default_data
[
i
].
data
,
wkp_calib_default_data
[
i
].
size
);
ret
=
iwl_mvm_send_cmd_pdu
(
mvm
,
SET_CALIB_DEFAULT_CMD
,
0
,
sizeof
(
*
cmd
)
+
wkp_calib_default_data
[
i
].
size
,
cmd
);
if
(
ret
)
return
ret
;
}
return
0
;
}
int
iwl_run_init_mvm_ucode
(
struct
iwl_mvm
*
mvm
,
bool
read_nvm
)
int
iwl_run_init_mvm_ucode
(
struct
iwl_mvm
*
mvm
,
bool
read_nvm
)
{
{
struct
iwl_notification_wait
calib_wait
;
struct
iwl_notification_wait
calib_wait
;
...
@@ -342,11 +292,6 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
...
@@ -342,11 +292,6 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
if
(
ret
)
if
(
ret
)
goto
error
;
goto
error
;
/* need to set default values */
ret
=
iwl_set_default_calibrations
(
mvm
);
if
(
ret
)
goto
error
;
/*
/*
* Send phy configurations command to init uCode
* Send phy configurations command to init uCode
* to start the 16.0 uCode init image internal calibrations.
* to start the 16.0 uCode init image internal calibrations.
...
...
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
View file @
20416229
...
@@ -264,7 +264,8 @@ static int iwl_mvm_mac_ctxt_allocate_resources(struct iwl_mvm *mvm,
...
@@ -264,7 +264,8 @@ static int iwl_mvm_mac_ctxt_allocate_resources(struct iwl_mvm *mvm,
return
0
;
return
0
;
/* Therefore, in recovery, we can't get here */
/* Therefore, in recovery, we can't get here */
WARN_ON_ONCE
(
test_bit
(
IWL_MVM_STATUS_IN_HW_RESTART
,
&
mvm
->
status
));
if
(
WARN_ON_ONCE
(
test_bit
(
IWL_MVM_STATUS_IN_HW_RESTART
,
&
mvm
->
status
)))
return
-
EBUSY
;
mvmvif
->
id
=
find_first_bit
(
data
.
available_mac_ids
,
mvmvif
->
id
=
find_first_bit
(
data
.
available_mac_ids
,
NUM_MAC_INDEX_DRIVER
);
NUM_MAC_INDEX_DRIVER
);
...
...
drivers/net/wireless/iwlwifi/mvm/mac80211.c
View file @
20416229
...
@@ -153,7 +153,9 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
...
@@ -153,7 +153,9 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
IEEE80211_HW_SUPPORTS_DYNAMIC_PS
|
IEEE80211_HW_SUPPORTS_DYNAMIC_PS
|
IEEE80211_HW_AMPDU_AGGREGATION
|
IEEE80211_HW_AMPDU_AGGREGATION
|
IEEE80211_HW_TIMING_BEACON_ONLY
|
IEEE80211_HW_TIMING_BEACON_ONLY
|
IEEE80211_HW_CONNECTION_MONITOR
;
IEEE80211_HW_CONNECTION_MONITOR
|
IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS
|
IEEE80211_HW_SUPPORTS_STATIC_SMPS
;
hw
->
queues
=
IWL_MVM_FIRST_AGG_QUEUE
;
hw
->
queues
=
IWL_MVM_FIRST_AGG_QUEUE
;
hw
->
offchannel_tx_hw_queue
=
IWL_MVM_OFFCHANNEL_QUEUE
;
hw
->
offchannel_tx_hw_queue
=
IWL_MVM_OFFCHANNEL_QUEUE
;
...
@@ -531,6 +533,7 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
...
@@ -531,6 +533,7 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
goto
out_release
;
goto
out_release
;
}
}
iwl_mvm_vif_dbgfs_register
(
mvm
,
vif
);
goto
out_unlock
;
goto
out_unlock
;
}
}
...
@@ -567,7 +570,8 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
...
@@ -567,7 +570,8 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
/* beacon filtering */
/* beacon filtering */
if
(
!
mvm
->
bf_allowed_vif
&&
if
(
!
mvm
->
bf_allowed_vif
&&
vif
->
type
==
NL80211_IFTYPE_STATION
&&
!
vif
->
p2p
){
vif
->
type
==
NL80211_IFTYPE_STATION
&&
!
vif
->
p2p
&&
mvm
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_BF_UPDATED
){
mvm
->
bf_allowed_vif
=
mvmvif
;
mvm
->
bf_allowed_vif
=
mvmvif
;
vif
->
driver_flags
|=
IEEE80211_VIF_BEACON_FILTER
;
vif
->
driver_flags
|=
IEEE80211_VIF_BEACON_FILTER
;
}
}
...
@@ -719,6 +723,20 @@ static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw,
...
@@ -719,6 +723,20 @@ static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw,
mutex_unlock
(
&
mvm
->
mutex
);
mutex_unlock
(
&
mvm
->
mutex
);
}
}
static
int
iwl_mvm_set_tx_power
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
s8
tx_power
)
{
/* FW is in charge of regulatory enforcement */
struct
iwl_reduce_tx_power_cmd
reduce_txpwr_cmd
=
{
.
mac_context_id
=
iwl_mvm_vif_from_mac80211
(
vif
)
->
id
,
.
pwr_restriction
=
cpu_to_le16
(
tx_power
),
};
return
iwl_mvm_send_cmd_pdu
(
mvm
,
REDUCE_TX_POWER_CMD
,
CMD_SYNC
,
sizeof
(
reduce_txpwr_cmd
),
&
reduce_txpwr_cmd
);
}
static
int
iwl_mvm_mac_config
(
struct
ieee80211_hw
*
hw
,
u32
changed
)
static
int
iwl_mvm_mac_config
(
struct
ieee80211_hw
*
hw
,
u32
changed
)
{
{
return
0
;
return
0
;
...
@@ -766,7 +784,6 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
...
@@ -766,7 +784,6 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
IWL_ERR
(
mvm
,
"failed to update quotas
\n
"
);
IWL_ERR
(
mvm
,
"failed to update quotas
\n
"
);
return
;
return
;
}
}
iwl_mvm_bt_coex_vif_assoc
(
mvm
,
vif
);
iwl_mvm_configure_mcast_filter
(
mvm
,
vif
);
iwl_mvm_configure_mcast_filter
(
mvm
,
vif
);
}
else
if
(
mvmvif
->
ap_sta_id
!=
IWL_MVM_STATION_COUNT
)
{
}
else
if
(
mvmvif
->
ap_sta_id
!=
IWL_MVM_STATION_COUNT
)
{
/* remove AP station now that the MAC is unassoc */
/* remove AP station now that the MAC is unassoc */
...
@@ -779,9 +796,15 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
...
@@ -779,9 +796,15 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
if
(
ret
)
if
(
ret
)
IWL_ERR
(
mvm
,
"failed to update quotas
\n
"
);
IWL_ERR
(
mvm
,
"failed to update quotas
\n
"
);
}
}
ret
=
iwl_mvm_power_update_mode
(
mvm
,
vif
);
if
(
!
(
mvm
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_UAPSD
))
{
if
(
ret
)
/* Workaround for FW bug, otherwise FW disables device
IWL_ERR
(
mvm
,
"failed to update power mode
\n
"
);
* power save upon disassociation
*/
ret
=
iwl_mvm_power_update_mode
(
mvm
,
vif
);
if
(
ret
)
IWL_ERR
(
mvm
,
"failed to update power mode
\n
"
);
}
iwl_mvm_bt_coex_vif_assoc
(
mvm
,
vif
);
}
else
if
(
changes
&
BSS_CHANGED_BEACON_INFO
)
{
}
else
if
(
changes
&
BSS_CHANGED_BEACON_INFO
)
{
/*
/*
* We received a beacon _after_ association so
* We received a beacon _after_ association so
...
@@ -794,6 +817,11 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
...
@@ -794,6 +817,11 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
if
(
ret
)
if
(
ret
)
IWL_ERR
(
mvm
,
"failed to update power mode
\n
"
);
IWL_ERR
(
mvm
,
"failed to update power mode
\n
"
);
}
}
if
(
changes
&
BSS_CHANGED_TXPOWER
)
{
IWL_DEBUG_CALIB
(
mvm
,
"Changing TX Power to %d
\n
"
,
bss_conf
->
txpower
);
iwl_mvm_set_tx_power
(
mvm
,
vif
,
bss_conf
->
txpower
);
}
}
}
static
int
iwl_mvm_start_ap
(
struct
ieee80211_hw
*
hw
,
struct
ieee80211_vif
*
vif
)
static
int
iwl_mvm_start_ap
(
struct
ieee80211_hw
*
hw
,
struct
ieee80211_vif
*
vif
)
...
...
drivers/net/wireless/iwlwifi/mvm/mvm.h
View file @
20416229
...
@@ -76,6 +76,7 @@
...
@@ -76,6 +76,7 @@
#include "iwl-trans.h"
#include "iwl-trans.h"
#include "sta.h"
#include "sta.h"
#include "fw-api.h"
#include "fw-api.h"
#include "constants.h"
#define IWL_INVALID_MAC80211_QUEUE 0xff
#define IWL_INVALID_MAC80211_QUEUE 0xff
#define IWL_MVM_MAX_ADDRESSES 5
#define IWL_MVM_MAX_ADDRESSES 5
...
@@ -91,6 +92,9 @@ enum iwl_mvm_tx_fifo {
...
@@ -91,6 +92,9 @@ enum iwl_mvm_tx_fifo {
};
};
extern
struct
ieee80211_ops
iwl_mvm_hw_ops
;
extern
struct
ieee80211_ops
iwl_mvm_hw_ops
;
extern
const
struct
iwl_mvm_power_ops
pm_legacy_ops
;
extern
const
struct
iwl_mvm_power_ops
pm_mac_ops
;
/**
/**
* struct iwl_mvm_mod_params - module parameters for iwlmvm
* struct iwl_mvm_mod_params - module parameters for iwlmvm
* @init_dbg: if true, then the NIC won't be stopped if the INIT fw asserted.
* @init_dbg: if true, then the NIC won't be stopped if the INIT fw asserted.
...
@@ -150,6 +154,17 @@ enum iwl_power_scheme {
...
@@ -150,6 +154,17 @@ enum iwl_power_scheme {
#define IWL_CONN_MAX_LISTEN_INTERVAL 70
#define IWL_CONN_MAX_LISTEN_INTERVAL 70
struct
iwl_mvm_power_ops
{
int
(
*
power_update_mode
)(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
);
int
(
*
power_disable
)(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
);
#ifdef CONFIG_IWLWIFI_DEBUGFS
int
(
*
power_dbgfs_read
)(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
char
*
buf
,
int
bufsz
);
#endif
};
#ifdef CONFIG_IWLWIFI_DEBUGFS
#ifdef CONFIG_IWLWIFI_DEBUGFS
enum
iwl_dbgfs_pm_mask
{
enum
iwl_dbgfs_pm_mask
{
MVM_DEBUGFS_PM_KEEP_ALIVE
=
BIT
(
0
),
MVM_DEBUGFS_PM_KEEP_ALIVE
=
BIT
(
0
),
...
@@ -163,7 +178,7 @@ enum iwl_dbgfs_pm_mask {
...
@@ -163,7 +178,7 @@ enum iwl_dbgfs_pm_mask {
};
};
struct
iwl_dbgfs_pm
{
struct
iwl_dbgfs_pm
{
u
8
keep_alive_seconds
;
u
16
keep_alive_seconds
;
u32
rx_data_timeout
;
u32
rx_data_timeout
;
u32
tx_data_timeout
;
u32
tx_data_timeout
;
bool
skip_over_dtim
;
bool
skip_over_dtim
;
...
@@ -180,24 +195,28 @@ enum iwl_dbgfs_bf_mask {
...
@@ -180,24 +195,28 @@ enum iwl_dbgfs_bf_mask {
MVM_DEBUGFS_BF_ENERGY_DELTA
=
BIT
(
0
),
MVM_DEBUGFS_BF_ENERGY_DELTA
=
BIT
(
0
),
MVM_DEBUGFS_BF_ROAMING_ENERGY_DELTA
=
BIT
(
1
),
MVM_DEBUGFS_BF_ROAMING_ENERGY_DELTA
=
BIT
(
1
),
MVM_DEBUGFS_BF_ROAMING_STATE
=
BIT
(
2
),
MVM_DEBUGFS_BF_ROAMING_STATE
=
BIT
(
2
),
MVM_DEBUGFS_BF_TEMPERATURE_DELTA
=
BIT
(
3
),
MVM_DEBUGFS_BF_TEMP_THRESHOLD
=
BIT
(
3
),
MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER
=
BIT
(
4
),
MVM_DEBUGFS_BF_TEMP_FAST_FILTER
=
BIT
(
4
),
MVM_DEBUGFS_BF_DEBUG_FLAG
=
BIT
(
5
),
MVM_DEBUGFS_BF_TEMP_SLOW_FILTER
=
BIT
(
5
),
MVM_DEBUGFS_BF_ESCAPE_TIMER
=
BIT
(
6
),
MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER
=
BIT
(
6
),
MVM_DEBUGFS_BA_ESCAPE_TIMER
=
BIT
(
7
),
MVM_DEBUGFS_BF_DEBUG_FLAG
=
BIT
(
7
),
MVM_DEBUGFS_BA_ENABLE_BEACON_ABORT
=
BIT
(
8
),
MVM_DEBUGFS_BF_ESCAPE_TIMER
=
BIT
(
8
),
MVM_DEBUGFS_BA_ESCAPE_TIMER
=
BIT
(
9
),
MVM_DEBUGFS_BA_ENABLE_BEACON_ABORT
=
BIT
(
10
),
};
};
struct
iwl_dbgfs_bf
{
struct
iwl_dbgfs_bf
{
u8
bf_energy_delta
;
u32
bf_energy_delta
;
u8
bf_roaming_energy_delta
;
u32
bf_roaming_energy_delta
;
u8
bf_roaming_state
;
u32
bf_roaming_state
;
u8
bf_temperature_delta
;
u32
bf_temp_threshold
;
u8
bf_enable_beacon_filter
;
u32
bf_temp_fast_filter
;
u8
bf_debug_flag
;
u32
bf_temp_slow_filter
;
u32
bf_enable_beacon_filter
;
u32
bf_debug_flag
;
u32
bf_escape_timer
;
u32
bf_escape_timer
;
u32
ba_escape_timer
;
u32
ba_escape_timer
;
u
8
ba_enable_beacon_abort
;
u
32
ba_enable_beacon_abort
;
int
mask
;
int
mask
;
};
};
#endif
#endif
...
@@ -268,7 +287,7 @@ struct iwl_mvm_vif {
...
@@ -268,7 +287,7 @@ struct iwl_mvm_vif {
#if IS_ENABLED(CONFIG_IPV6)
#if IS_ENABLED(CONFIG_IPV6)
/* IPv6 addresses for WoWLAN */
/* IPv6 addresses for WoWLAN */
struct
in6_addr
target_ipv6_addrs
[
IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS
];
struct
in6_addr
target_ipv6_addrs
[
IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS
_MAX
];
int
num_target_ipv6_addrs
;
int
num_target_ipv6_addrs
;
#endif
#endif
#endif
#endif
...
@@ -459,6 +478,9 @@ struct iwl_mvm {
...
@@ -459,6 +478,9 @@ struct iwl_mvm {
*/
*/
u8
vif_count
;
u8
vif_count
;
/* -1 for always, 0 for never, >0 for that many times */
s8
restart_fw
;
struct
led_classdev
led
;
struct
led_classdev
led
;
struct
ieee80211_vif
*
p2p_device_vif
;
struct
ieee80211_vif
*
p2p_device_vif
;
...
@@ -482,6 +504,8 @@ struct iwl_mvm {
...
@@ -482,6 +504,8 @@ struct iwl_mvm {
/* Thermal Throttling and CTkill */
/* Thermal Throttling and CTkill */
struct
iwl_mvm_tt_mgmt
thermal_throttle
;
struct
iwl_mvm_tt_mgmt
thermal_throttle
;
s32
temperature
;
/* Celsius */
s32
temperature
;
/* Celsius */
const
struct
iwl_mvm_power_ops
*
pm_ops
;
};
};
/* Extract MVM priv from op_mode and _hw */
/* Extract MVM priv from op_mode and _hw */
...
@@ -525,6 +549,7 @@ int iwl_mvm_legacy_rate_to_mac80211_idx(u32 rate_n_flags,
...
@@ -525,6 +549,7 @@ int iwl_mvm_legacy_rate_to_mac80211_idx(u32 rate_n_flags,
enum
ieee80211_band
band
);
enum
ieee80211_band
band
);
u8
iwl_mvm_mac80211_idx_to_hwrate
(
int
rate_idx
);
u8
iwl_mvm_mac80211_idx_to_hwrate
(
int
rate_idx
);
void
iwl_mvm_dump_nic_error_log
(
struct
iwl_mvm
*
mvm
);
void
iwl_mvm_dump_nic_error_log
(
struct
iwl_mvm
*
mvm
);
void
iwl_mvm_dump_sram
(
struct
iwl_mvm
*
mvm
);
u8
first_antenna
(
u8
mask
);
u8
first_antenna
(
u8
mask
);
u8
iwl_mvm_next_antenna
(
struct
iwl_mvm
*
mvm
,
u8
valid
,
u8
last_idx
);
u8
iwl_mvm_next_antenna
(
struct
iwl_mvm
*
mvm
,
u8
valid
,
u8
last_idx
);
...
@@ -660,10 +685,26 @@ int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq,
...
@@ -660,10 +685,26 @@ int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq,
u8
flags
,
bool
init
);
u8
flags
,
bool
init
);
/* power managment */
/* power managment */
int
iwl_mvm_power_update_mode
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
);
static
inline
int
iwl_mvm_power_update_mode
(
struct
iwl_mvm
*
mvm
,
int
iwl_mvm_power_disable
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
);
struct
ieee80211_vif
*
vif
)
void
iwl_mvm_power_build_cmd
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
{
struct
iwl_powertable_cmd
*
cmd
);
return
mvm
->
pm_ops
->
power_update_mode
(
mvm
,
vif
);
}
static
inline
int
iwl_mvm_power_disable
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
)
{
return
mvm
->
pm_ops
->
power_disable
(
mvm
,
vif
);
}
#ifdef CONFIG_IWLWIFI_DEBUGFS
static
inline
int
iwl_mvm_power_dbgfs_read
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
char
*
buf
,
int
bufsz
)
{
return
mvm
->
pm_ops
->
power_dbgfs_read
(
mvm
,
vif
,
buf
,
bufsz
);
}
#endif
int
iwl_mvm_leds_init
(
struct
iwl_mvm
*
mvm
);
int
iwl_mvm_leds_init
(
struct
iwl_mvm
*
mvm
);
void
iwl_mvm_leds_exit
(
struct
iwl_mvm
*
mvm
);
void
iwl_mvm_leds_exit
(
struct
iwl_mvm
*
mvm
);
...
@@ -707,6 +748,10 @@ int iwl_mvm_enable_beacon_filter(struct iwl_mvm *mvm,
...
@@ -707,6 +748,10 @@ int iwl_mvm_enable_beacon_filter(struct iwl_mvm *mvm,
struct
ieee80211_vif
*
vif
);
struct
ieee80211_vif
*
vif
);
int
iwl_mvm_disable_beacon_filter
(
struct
iwl_mvm
*
mvm
,
int
iwl_mvm_disable_beacon_filter
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
);
struct
ieee80211_vif
*
vif
);
int
iwl_mvm_beacon_filter_send_cmd
(
struct
iwl_mvm
*
mvm
,
struct
iwl_beacon_filter_cmd
*
cmd
);
int
iwl_mvm_update_beacon_abort
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
bool
enable
);
/* SMPS */
/* SMPS */
void
iwl_mvm_update_smps
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
void
iwl_mvm_update_smps
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
vif
,
...
...
drivers/net/wireless/iwlwifi/mvm/ops.c
View file @
20416229
...
@@ -275,6 +275,7 @@ static const char *iwl_mvm_cmd_strings[REPLY_MAX] = {
...
@@ -275,6 +275,7 @@ static const char *iwl_mvm_cmd_strings[REPLY_MAX] = {
CMD
(
BEACON_NOTIFICATION
),
CMD
(
BEACON_NOTIFICATION
),
CMD
(
BEACON_TEMPLATE_CMD
),
CMD
(
BEACON_TEMPLATE_CMD
),
CMD
(
STATISTICS_NOTIFICATION
),
CMD
(
STATISTICS_NOTIFICATION
),
CMD
(
REDUCE_TX_POWER_CMD
),
CMD
(
TX_ANT_CONFIGURATION_CMD
),
CMD
(
TX_ANT_CONFIGURATION_CMD
),
CMD
(
D3_CONFIG_CMD
),
CMD
(
D3_CONFIG_CMD
),
CMD
(
PROT_OFFLOAD_CONFIG_CMD
),
CMD
(
PROT_OFFLOAD_CONFIG_CMD
),
...
@@ -301,6 +302,7 @@ static const char *iwl_mvm_cmd_strings[REPLY_MAX] = {
...
@@ -301,6 +302,7 @@ static const char *iwl_mvm_cmd_strings[REPLY_MAX] = {
CMD
(
MCAST_FILTER_CMD
),
CMD
(
MCAST_FILTER_CMD
),
CMD
(
REPLY_BEACON_FILTERING_CMD
),
CMD
(
REPLY_BEACON_FILTERING_CMD
),
CMD
(
REPLY_THERMAL_MNG_BACKOFF
),
CMD
(
REPLY_THERMAL_MNG_BACKOFF
),
CMD
(
MAC_PM_POWER_TABLE
),
};
};
#undef CMD
#undef CMD
...
@@ -340,6 +342,8 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
...
@@ -340,6 +342,8 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
mvm
->
fw
=
fw
;
mvm
->
fw
=
fw
;
mvm
->
hw
=
hw
;
mvm
->
hw
=
hw
;
mvm
->
restart_fw
=
iwlwifi_mod_params
.
restart_fw
?
-
1
:
0
;
mutex_init
(
&
mvm
->
mutex
);
mutex_init
(
&
mvm
->
mutex
);
spin_lock_init
(
&
mvm
->
async_handlers_lock
);
spin_lock_init
(
&
mvm
->
async_handlers_lock
);
INIT_LIST_HEAD
(
&
mvm
->
time_event_list
);
INIT_LIST_HEAD
(
&
mvm
->
time_event_list
);
...
@@ -431,6 +435,11 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
...
@@ -431,6 +435,11 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
if
(
err
)
if
(
err
)
goto
out_unregister
;
goto
out_unregister
;
if
(
mvm
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_UAPSD
)
mvm
->
pm_ops
=
&
pm_mac_ops
;
else
mvm
->
pm_ops
=
&
pm_legacy_ops
;
return
op_mode
;
return
op_mode
;
out_unregister:
out_unregister:
...
@@ -638,6 +647,22 @@ static void iwl_mvm_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb)
...
@@ -638,6 +647,22 @@ static void iwl_mvm_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb)
ieee80211_free_txskb
(
mvm
->
hw
,
skb
);
ieee80211_free_txskb
(
mvm
->
hw
,
skb
);
}
}
struct
iwl_mvm_reprobe
{
struct
device
*
dev
;
struct
work_struct
work
;
};
static
void
iwl_mvm_reprobe_wk
(
struct
work_struct
*
wk
)
{
struct
iwl_mvm_reprobe
*
reprobe
;
reprobe
=
container_of
(
wk
,
struct
iwl_mvm_reprobe
,
work
);
if
(
device_reprobe
(
reprobe
->
dev
))
dev_err
(
reprobe
->
dev
,
"reprobe failed!
\n
"
);
kfree
(
reprobe
);
module_put
(
THIS_MODULE
);
}
static
void
iwl_mvm_nic_restart
(
struct
iwl_mvm
*
mvm
)
static
void
iwl_mvm_nic_restart
(
struct
iwl_mvm
*
mvm
)
{
{
iwl_abort_notification_waits
(
&
mvm
->
notif_wait
);
iwl_abort_notification_waits
(
&
mvm
->
notif_wait
);
...
@@ -649,9 +674,30 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
...
@@ -649,9 +674,30 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
* can't recover this since we're already half suspended.
* can't recover this since we're already half suspended.
*/
*/
if
(
test_and_set_bit
(
IWL_MVM_STATUS_IN_HW_RESTART
,
&
mvm
->
status
))
{
if
(
test_and_set_bit
(
IWL_MVM_STATUS_IN_HW_RESTART
,
&
mvm
->
status
))
{
IWL_ERR
(
mvm
,
"Firmware error during reconfiguration! Abort.
\n
"
);
struct
iwl_mvm_reprobe
*
reprobe
;
}
else
if
(
mvm
->
cur_ucode
==
IWL_UCODE_REGULAR
&&
iwlwifi_mod_params
.
restart_fw
)
{
IWL_ERR
(
mvm
,
"Firmware error during reconfiguration - reprobe!
\n
"
);
/*
* get a module reference to avoid doing this while unloading
* anyway and to avoid scheduling a work with code that's
* being removed.
*/
if
(
!
try_module_get
(
THIS_MODULE
))
{
IWL_ERR
(
mvm
,
"Module is being unloaded - abort
\n
"
);
return
;
}
reprobe
=
kzalloc
(
sizeof
(
*
reprobe
),
GFP_ATOMIC
);
if
(
!
reprobe
)
{
module_put
(
THIS_MODULE
);
return
;
}
reprobe
->
dev
=
mvm
->
trans
->
dev
;
INIT_WORK
(
&
reprobe
->
work
,
iwl_mvm_reprobe_wk
);
schedule_work
(
&
reprobe
->
work
);
}
else
if
(
mvm
->
cur_ucode
==
IWL_UCODE_REGULAR
&&
mvm
->
restart_fw
)
{
/*
/*
* This is a bit racy, but worst case we tell mac80211 about
* This is a bit racy, but worst case we tell mac80211 about
* a stopped/aborted (sched) scan when that was already done
* a stopped/aborted (sched) scan when that was already done
...
@@ -669,6 +715,8 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
...
@@ -669,6 +715,8 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
break
;
break
;
}
}
if
(
mvm
->
restart_fw
>
0
)
mvm
->
restart_fw
--
;
ieee80211_restart_hw
(
mvm
->
hw
);
ieee80211_restart_hw
(
mvm
->
hw
);
}
}
}
}
...
@@ -678,6 +726,8 @@ static void iwl_mvm_nic_error(struct iwl_op_mode *op_mode)
...
@@ -678,6 +726,8 @@ static void iwl_mvm_nic_error(struct iwl_op_mode *op_mode)
struct
iwl_mvm
*
mvm
=
IWL_OP_MODE_GET_MVM
(
op_mode
);
struct
iwl_mvm
*
mvm
=
IWL_OP_MODE_GET_MVM
(
op_mode
);
iwl_mvm_dump_nic_error_log
(
mvm
);
iwl_mvm_dump_nic_error_log
(
mvm
);
if
(
!
mvm
->
restart_fw
)
iwl_mvm_dump_sram
(
mvm
);
iwl_mvm_nic_restart
(
mvm
);
iwl_mvm_nic_restart
(
mvm
);
}
}
...
...
drivers/net/wireless/iwlwifi/mvm/power.c
View file @
20416229
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/mvm/power_legacy.c
0 → 100644
View file @
20416229
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/mvm/quota.c
View file @
20416229
...
@@ -132,7 +132,7 @@ static void iwl_mvm_quota_iterator(void *_data, u8 *mac,
...
@@ -132,7 +132,7 @@ static void iwl_mvm_quota_iterator(void *_data, u8 *mac,
int
iwl_mvm_update_quotas
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
newvif
)
int
iwl_mvm_update_quotas
(
struct
iwl_mvm
*
mvm
,
struct
ieee80211_vif
*
newvif
)
{
{
struct
iwl_time_quota_cmd
cmd
;
struct
iwl_time_quota_cmd
cmd
;
int
i
,
idx
,
ret
,
num_active_
binding
s
,
quota
,
quota_rem
;
int
i
,
idx
,
ret
,
num_active_
mac
s
,
quota
,
quota_rem
;
struct
iwl_mvm_quota_iterator_data
data
=
{
struct
iwl_mvm_quota_iterator_data
data
=
{
.
n_interfaces
=
{},
.
n_interfaces
=
{},
.
colors
=
{
-
1
,
-
1
,
-
1
,
-
1
},
.
colors
=
{
-
1
,
-
1
,
-
1
,
-
1
},
...
@@ -162,18 +162,17 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
...
@@ -162,18 +162,17 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
* IWL_MVM_MAX_QUOTA fragments. Divide these fragments
* IWL_MVM_MAX_QUOTA fragments. Divide these fragments
* equally between all the bindings that require quota
* equally between all the bindings that require quota
*/
*/
num_active_
binding
s
=
0
;
num_active_
mac
s
=
0
;
for
(
i
=
0
;
i
<
MAX_BINDINGS
;
i
++
)
{
for
(
i
=
0
;
i
<
MAX_BINDINGS
;
i
++
)
{
cmd
.
quotas
[
i
].
id_and_color
=
cpu_to_le32
(
FW_CTXT_INVALID
);
cmd
.
quotas
[
i
].
id_and_color
=
cpu_to_le32
(
FW_CTXT_INVALID
);
if
(
data
.
n_interfaces
[
i
]
>
0
)
num_active_macs
+=
data
.
n_interfaces
[
i
];
num_active_bindings
++
;
}
}
quota
=
0
;
quota
=
0
;
quota_rem
=
0
;
quota_rem
=
0
;
if
(
num_active_
binding
s
)
{
if
(
num_active_
mac
s
)
{
quota
=
IWL_MVM_MAX_QUOTA
/
num_active_
binding
s
;
quota
=
IWL_MVM_MAX_QUOTA
/
num_active_
mac
s
;
quota_rem
=
IWL_MVM_MAX_QUOTA
%
num_active_
binding
s
;
quota_rem
=
IWL_MVM_MAX_QUOTA
%
num_active_
mac
s
;
}
}
for
(
idx
=
0
,
i
=
0
;
i
<
MAX_BINDINGS
;
i
++
)
{
for
(
idx
=
0
,
i
=
0
;
i
<
MAX_BINDINGS
;
i
++
)
{
...
@@ -187,7 +186,8 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
...
@@ -187,7 +186,8 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
cmd
.
quotas
[
idx
].
quota
=
cpu_to_le32
(
0
);
cmd
.
quotas
[
idx
].
quota
=
cpu_to_le32
(
0
);
cmd
.
quotas
[
idx
].
max_duration
=
cpu_to_le32
(
0
);
cmd
.
quotas
[
idx
].
max_duration
=
cpu_to_le32
(
0
);
}
else
{
}
else
{
cmd
.
quotas
[
idx
].
quota
=
cpu_to_le32
(
quota
);
cmd
.
quotas
[
idx
].
quota
=
cpu_to_le32
(
quota
*
data
.
n_interfaces
[
i
]);
cmd
.
quotas
[
idx
].
max_duration
=
cmd
.
quotas
[
idx
].
max_duration
=
cpu_to_le32
(
IWL_MVM_MAX_QUOTA
);
cpu_to_le32
(
IWL_MVM_MAX_QUOTA
);
}
}
...
...
drivers/net/wireless/iwlwifi/mvm/rs.c
View file @
20416229
...
@@ -2688,9 +2688,6 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
...
@@ -2688,9 +2688,6 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
lq_sta
->
flush_timer
=
0
;
lq_sta
->
flush_timer
=
0
;
lq_sta
->
supp_rates
=
sta
->
supp_rates
[
sband
->
band
];
lq_sta
->
supp_rates
=
sta
->
supp_rates
[
sband
->
band
];
for
(
j
=
0
;
j
<
LQ_SIZE
;
j
++
)
for
(
i
=
0
;
i
<
IWL_RATE_COUNT
;
i
++
)
rs_rate_scale_clear_window
(
&
lq_sta
->
lq_info
[
j
].
win
[
i
]);
IWL_DEBUG_RATE
(
mvm
,
IWL_DEBUG_RATE
(
mvm
,
"LQ: *** rate scale station global init for station %d ***
\n
"
,
"LQ: *** rate scale station global init for station %d ***
\n
"
,
...
@@ -3194,13 +3191,14 @@ void iwl_mvm_rate_control_unregister(void)
...
@@ -3194,13 +3191,14 @@ void iwl_mvm_rate_control_unregister(void)
* iwl_mvm_tx_protection - Gets LQ command, change it to enable/disable
* iwl_mvm_tx_protection - Gets LQ command, change it to enable/disable
* Tx protection, according to this rquest and previous requests,
* Tx protection, according to this rquest and previous requests,
* and send the LQ command.
* and send the LQ command.
* @lq: The LQ command
* @mvmsta: The station
* @mvmsta: The station
* @enable: Enable Tx protection?
* @enable: Enable Tx protection?
*/
*/
int
iwl_mvm_tx_protection
(
struct
iwl_mvm
*
mvm
,
struct
iwl_
lq_cmd
*
lq
,
int
iwl_mvm_tx_protection
(
struct
iwl_mvm
*
mvm
,
struct
iwl_
mvm_sta
*
mvmsta
,
struct
iwl_mvm_sta
*
mvmsta
,
bool
enable
)
bool
enable
)
{
{
struct
iwl_lq_cmd
*
lq
=
&
mvmsta
->
lq_sta
.
lq
;
lockdep_assert_held
(
&
mvm
->
mutex
);
lockdep_assert_held
(
&
mvm
->
mutex
);
if
(
enable
)
{
if
(
enable
)
{
...
...
drivers/net/wireless/iwlwifi/mvm/rs.h
View file @
20416229
...
@@ -404,7 +404,7 @@ extern void iwl_mvm_rate_control_unregister(void);
...
@@ -404,7 +404,7 @@ extern void iwl_mvm_rate_control_unregister(void);
struct
iwl_mvm_sta
;
struct
iwl_mvm_sta
;
int
iwl_mvm_tx_protection
(
struct
iwl_mvm
*
mvm
,
struct
iwl_
lq_cmd
*
lq
,
int
iwl_mvm_tx_protection
(
struct
iwl_mvm
*
mvm
,
struct
iwl_
mvm_sta
*
mvmsta
,
struct
iwl_mvm_sta
*
mvmsta
,
bool
enable
);
bool
enable
);
#endif
/* __rs__ */
#endif
/* __rs__ */
drivers/net/wireless/iwlwifi/mvm/rx.c
View file @
20416229
...
@@ -124,24 +124,15 @@ static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
...
@@ -124,24 +124,15 @@ static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
ieee80211_rx_ni
(
mvm
->
hw
,
skb
);
ieee80211_rx_ni
(
mvm
->
hw
,
skb
);
}
}
/*
static
void
iwl_mvm_calc_rssi
(
struct
iwl_mvm
*
mvm
,
* iwl_mvm_calc_rssi - calculate the rssi in dBm
struct
iwl_rx_phy_info
*
phy_info
,
* @phy_info: the phy information for the coming packet
struct
ieee80211_rx_status
*
rx_status
)
*/
static
int
iwl_mvm_calc_rssi
(
struct
iwl_mvm
*
mvm
,
struct
iwl_rx_phy_info
*
phy_info
)
{
{
int
rssi_a
,
rssi_b
,
rssi_a_dbm
,
rssi_b_dbm
,
max_rssi_dbm
;
int
rssi_a
,
rssi_b
,
rssi_a_dbm
,
rssi_b_dbm
,
max_rssi_dbm
;
int
rssi_all_band_a
,
rssi_all_band_b
;
int
rssi_all_band_a
,
rssi_all_band_b
;
u32
agc_a
,
agc_b
,
max_agc
;
u32
agc_a
,
agc_b
,
max_agc
;
u32
val
;
u32
val
;
/* Find max rssi among 2 possible receivers.
* These values are measured by the Digital Signal Processor (DSP).
* They should stay fairly constant even as the signal strength varies,
* if the radio's Automatic Gain Control (AGC) is working right.
* AGC value (see below) will provide the "interesting" info.
*/
val
=
le32_to_cpu
(
phy_info
->
non_cfg_phy
[
IWL_RX_INFO_AGC_IDX
]);
val
=
le32_to_cpu
(
phy_info
->
non_cfg_phy
[
IWL_RX_INFO_AGC_IDX
]);
agc_a
=
(
val
&
IWL_OFDM_AGC_A_MSK
)
>>
IWL_OFDM_AGC_A_POS
;
agc_a
=
(
val
&
IWL_OFDM_AGC_A_MSK
)
>>
IWL_OFDM_AGC_A_POS
;
agc_b
=
(
val
&
IWL_OFDM_AGC_B_MSK
)
>>
IWL_OFDM_AGC_B_POS
;
agc_b
=
(
val
&
IWL_OFDM_AGC_B_MSK
)
>>
IWL_OFDM_AGC_B_POS
;
...
@@ -166,7 +157,45 @@ static int iwl_mvm_calc_rssi(struct iwl_mvm *mvm,
...
@@ -166,7 +157,45 @@ static int iwl_mvm_calc_rssi(struct iwl_mvm *mvm,
IWL_DEBUG_STATS
(
mvm
,
"Rssi In A %d B %d Max %d AGCA %d AGCB %d
\n
"
,
IWL_DEBUG_STATS
(
mvm
,
"Rssi In A %d B %d Max %d AGCA %d AGCB %d
\n
"
,
rssi_a_dbm
,
rssi_b_dbm
,
max_rssi_dbm
,
agc_a
,
agc_b
);
rssi_a_dbm
,
rssi_b_dbm
,
max_rssi_dbm
,
agc_a
,
agc_b
);
return
max_rssi_dbm
;
rx_status
->
signal
=
max_rssi_dbm
;
rx_status
->
chains
=
(
le16_to_cpu
(
phy_info
->
phy_flags
)
&
RX_RES_PHY_FLAGS_ANTENNA
)
>>
RX_RES_PHY_FLAGS_ANTENNA_POS
;
rx_status
->
chain_signal
[
0
]
=
rssi_a_dbm
;
rx_status
->
chain_signal
[
1
]
=
rssi_b_dbm
;
}
/*
* iwl_mvm_get_signal_strength - use new rx PHY INFO API
*/
static
void
iwl_mvm_get_signal_strength
(
struct
iwl_mvm
*
mvm
,
struct
iwl_rx_phy_info
*
phy_info
,
struct
ieee80211_rx_status
*
rx_status
)
{
int
energy_a
,
energy_b
,
energy_c
,
max_energy
;
u32
val
;
val
=
le32_to_cpu
(
phy_info
->
non_cfg_phy
[
IWL_RX_INFO_ENERGY_ANT_ABC_IDX
]);
energy_a
=
-
((
val
&
IWL_RX_INFO_ENERGY_ANT_A_MSK
)
>>
IWL_RX_INFO_ENERGY_ANT_A_POS
);
energy_b
=
-
((
val
&
IWL_RX_INFO_ENERGY_ANT_B_MSK
)
>>
IWL_RX_INFO_ENERGY_ANT_B_POS
);
energy_c
=
-
((
val
&
IWL_RX_INFO_ENERGY_ANT_C_MSK
)
>>
IWL_RX_INFO_ENERGY_ANT_C_POS
);
max_energy
=
max
(
energy_a
,
energy_b
);
max_energy
=
max
(
max_energy
,
energy_c
);
IWL_DEBUG_STATS
(
mvm
,
"energy In A %d B %d C %d , and max %d
\n
"
,
energy_a
,
energy_b
,
energy_c
,
max_energy
);
rx_status
->
signal
=
max_energy
;
rx_status
->
chains
=
(
le16_to_cpu
(
phy_info
->
phy_flags
)
&
RX_RES_PHY_FLAGS_ANTENNA
)
>>
RX_RES_PHY_FLAGS_ANTENNA_POS
;
rx_status
->
chain_signal
[
0
]
=
energy_a
;
rx_status
->
chain_signal
[
1
]
=
energy_b
;
rx_status
->
chain_signal
[
2
]
=
energy_c
;
}
}
/*
/*
...
@@ -289,29 +318,14 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
...
@@ -289,29 +318,14 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
*/
*/
/*rx_status.flag |= RX_FLAG_MACTIME_MPDU;*/
/*rx_status.flag |= RX_FLAG_MACTIME_MPDU;*/
/* Find max signal strength (dBm) among 3 antenna/receiver chains */
if
(
mvm
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_RX_ENERGY_API
)
rx_status
.
signal
=
iwl_mvm_calc_rssi
(
mvm
,
phy_info
);
iwl_mvm_get_signal_strength
(
mvm
,
phy_info
,
&
rx_status
);
else
iwl_mvm_calc_rssi
(
mvm
,
phy_info
,
&
rx_status
);
IWL_DEBUG_STATS_LIMIT
(
mvm
,
"Rssi %d, TSF %llu
\n
"
,
rx_status
.
signal
,
IWL_DEBUG_STATS_LIMIT
(
mvm
,
"Rssi %d, TSF %llu
\n
"
,
rx_status
.
signal
,
(
unsigned
long
long
)
rx_status
.
mactime
);
(
unsigned
long
long
)
rx_status
.
mactime
);
/*
* "antenna number"
*
* It seems that the antenna field in the phy flags value
* is actually a bit field. This is undefined by radiotap,
* it wants an actual antenna number but I always get "7"
* for most legacy frames I receive indicating that the
* same frame was received on all three RX chains.
*
* I think this field should be removed in favor of a
* new 802.11n radiotap field "RX chains" that is defined
* as a bitmask.
*/
rx_status
.
antenna
=
(
le16_to_cpu
(
phy_info
->
phy_flags
)
&
RX_RES_PHY_FLAGS_ANTENNA
)
>>
RX_RES_PHY_FLAGS_ANTENNA_POS
;
/* set the preamble flag if appropriate */
/* set the preamble flag if appropriate */
if
(
phy_info
->
phy_flags
&
cpu_to_le16
(
RX_RES_PHY_FLAGS_SHORT_PREAMBLE
))
if
(
phy_info
->
phy_flags
&
cpu_to_le16
(
RX_RES_PHY_FLAGS_SHORT_PREAMBLE
))
rx_status
.
flag
|=
RX_FLAG_SHORTPRE
;
rx_status
.
flag
|=
RX_FLAG_SHORTPRE
;
...
...
drivers/net/wireless/iwlwifi/mvm/scan.c
View file @
20416229
...
@@ -308,10 +308,12 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
...
@@ -308,10 +308,12 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
*/
*/
if
(
req
->
n_ssids
>
0
)
{
if
(
req
->
n_ssids
>
0
)
{
cmd
->
passive2active
=
cpu_to_le16
(
1
);
cmd
->
passive2active
=
cpu_to_le16
(
1
);
cmd
->
scan_flags
|=
SCAN_FLAGS_PASSIVE2ACTIVE
;
ssid
=
req
->
ssids
[
0
].
ssid
;
ssid
=
req
->
ssids
[
0
].
ssid
;
ssid_len
=
req
->
ssids
[
0
].
ssid_len
;
ssid_len
=
req
->
ssids
[
0
].
ssid_len
;
}
else
{
}
else
{
cmd
->
passive2active
=
0
;
cmd
->
passive2active
=
0
;
cmd
->
scan_flags
&=
~
SCAN_FLAGS_PASSIVE2ACTIVE
;
}
}
iwl_mvm_scan_fill_ssids
(
cmd
,
req
);
iwl_mvm_scan_fill_ssids
(
cmd
,
req
);
...
...
drivers/net/wireless/iwlwifi/mvm/sta.c
View file @
20416229
...
@@ -826,8 +826,7 @@ int iwl_mvm_sta_tx_agg_oper(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
...
@@ -826,8 +826,7 @@ int iwl_mvm_sta_tx_agg_oper(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
* method for HT traffic
* method for HT traffic
* this function also sends the LQ command
* this function also sends the LQ command
*/
*/
return
iwl_mvm_tx_protection
(
mvm
,
&
mvmsta
->
lq_sta
.
lq
,
return
iwl_mvm_tx_protection
(
mvm
,
mvmsta
,
true
);
mvmsta
,
true
);
/*
/*
* TODO: remove the TLC_RTS flag when we tear down the last
* TODO: remove the TLC_RTS flag when we tear down the last
* AGG session (agg_tids_count in DVM)
* AGG session (agg_tids_count in DVM)
...
...
drivers/net/wireless/iwlwifi/mvm/tt.c
View file @
20416229
...
@@ -391,8 +391,7 @@ static void iwl_mvm_tt_tx_protection(struct iwl_mvm *mvm, bool enable)
...
@@ -391,8 +391,7 @@ static void iwl_mvm_tt_tx_protection(struct iwl_mvm *mvm, bool enable)
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
mvmsta
=
(
void
*
)
sta
->
drv_priv
;
if
(
enable
==
mvmsta
->
tt_tx_protection
)
if
(
enable
==
mvmsta
->
tt_tx_protection
)
continue
;
continue
;
err
=
iwl_mvm_tx_protection
(
mvm
,
&
mvmsta
->
lq_sta
.
lq
,
err
=
iwl_mvm_tx_protection
(
mvm
,
mvmsta
,
enable
);
mvmsta
,
enable
);
if
(
err
)
{
if
(
err
)
{
IWL_ERR
(
mvm
,
"Failed to %s Tx protection
\n
"
,
IWL_ERR
(
mvm
,
"Failed to %s Tx protection
\n
"
,
enable
?
"enable"
:
"disable"
);
enable
?
"enable"
:
"disable"
);
...
@@ -513,12 +512,39 @@ static const struct iwl_tt_params iwl7000_tt_params = {
...
@@ -513,12 +512,39 @@ static const struct iwl_tt_params iwl7000_tt_params = {
.
support_tx_backoff
=
true
,
.
support_tx_backoff
=
true
,
};
};
static
const
struct
iwl_tt_params
iwl7000_high_temp_tt_params
=
{
.
ct_kill_entry
=
118
,
.
ct_kill_exit
=
96
,
.
ct_kill_duration
=
5
,
.
dynamic_smps_entry
=
114
,
.
dynamic_smps_exit
=
110
,
.
tx_protection_entry
=
114
,
.
tx_protection_exit
=
108
,
.
tx_backoff
=
{
{.
temperature
=
112
,
.
backoff
=
300
},
{.
temperature
=
113
,
.
backoff
=
800
},
{.
temperature
=
114
,
.
backoff
=
1500
},
{.
temperature
=
115
,
.
backoff
=
3000
},
{.
temperature
=
116
,
.
backoff
=
5000
},
{.
temperature
=
117
,
.
backoff
=
10000
},
},
.
support_ct_kill
=
true
,
.
support_dynamic_smps
=
true
,
.
support_tx_protection
=
true
,
.
support_tx_backoff
=
true
,
};
void
iwl_mvm_tt_initialize
(
struct
iwl_mvm
*
mvm
)
void
iwl_mvm_tt_initialize
(
struct
iwl_mvm
*
mvm
)
{
{
struct
iwl_mvm_tt_mgmt
*
tt
=
&
mvm
->
thermal_throttle
;
struct
iwl_mvm_tt_mgmt
*
tt
=
&
mvm
->
thermal_throttle
;
IWL_DEBUG_TEMP
(
mvm
,
"Initialize Thermal Throttling
\n
"
);
IWL_DEBUG_TEMP
(
mvm
,
"Initialize Thermal Throttling
\n
"
);
tt
->
params
=
&
iwl7000_tt_params
;
if
(
mvm
->
cfg
->
high_temp
)
tt
->
params
=
&
iwl7000_high_temp_tt_params
;
else
tt
->
params
=
&
iwl7000_tt_params
;
tt
->
throttle
=
false
;
tt
->
throttle
=
false
;
INIT_DELAYED_WORK
(
&
tt
->
ct_kill_exit
,
check_exit_ctkill
);
INIT_DELAYED_WORK
(
&
tt
->
ct_kill_exit
,
check_exit_ctkill
);
}
}
...
...
drivers/net/wireless/iwlwifi/mvm/tx.c
View file @
20416229
...
@@ -123,6 +123,8 @@ static void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
...
@@ -123,6 +123,8 @@ static void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
* it
* it
*/
*/
WARN_ON_ONCE
(
info
->
flags
&
IEEE80211_TX_CTL_AMPDU
);
WARN_ON_ONCE
(
info
->
flags
&
IEEE80211_TX_CTL_AMPDU
);
}
else
if
(
skb
->
protocol
==
cpu_to_be16
(
ETH_P_PAE
))
{
tx_cmd
->
pm_frame_timeout
=
cpu_to_le16
(
2
);
}
else
{
}
else
{
tx_cmd
->
pm_frame_timeout
=
0
;
tx_cmd
->
pm_frame_timeout
=
0
;
}
}
...
...
drivers/net/wireless/iwlwifi/mvm/utils.c
View file @
20416229
...
@@ -453,6 +453,29 @@ void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
...
@@ -453,6 +453,29 @@ void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
IWL_ERR
(
mvm
,
"0x%08X | flow_handler
\n
"
,
table
.
flow_handler
);
IWL_ERR
(
mvm
,
"0x%08X | flow_handler
\n
"
,
table
.
flow_handler
);
}
}
void
iwl_mvm_dump_sram
(
struct
iwl_mvm
*
mvm
)
{
const
struct
fw_img
*
img
;
int
ofs
,
len
=
0
;
u8
*
buf
;
if
(
!
mvm
->
ucode_loaded
)
return
;
img
=
&
mvm
->
fw
->
img
[
mvm
->
cur_ucode
];
ofs
=
img
->
sec
[
IWL_UCODE_SECTION_DATA
].
offset
;
len
=
img
->
sec
[
IWL_UCODE_SECTION_DATA
].
len
;
buf
=
kzalloc
(
len
,
GFP_KERNEL
);
if
(
!
buf
)
return
;
iwl_trans_read_mem_bytes
(
mvm
->
trans
,
ofs
,
buf
,
len
);
iwl_print_hex_error
(
mvm
->
trans
,
buf
,
len
);
kfree
(
buf
);
}
/**
/**
* iwl_mvm_send_lq_cmd() - Send link quality command
* iwl_mvm_send_lq_cmd() - Send link quality command
* @init: This command is sent as part of station initialization right
* @init: This command is sent as part of station initialization right
...
...
drivers/net/wireless/iwlwifi/pcie/drv.c
View file @
20416229
...
@@ -272,9 +272,9 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
...
@@ -272,9 +272,9 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4462
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4462
,
iwl7260_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4870
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4870
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x486E
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x486E
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4A70
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4A70
,
iwl7260_2ac_cfg
_high_temp
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4A6E
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4A6E
,
iwl7260_2ac_cfg
_high_temp
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4A6C
,
iwl7260_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4A6C
,
iwl7260_2ac_cfg
_high_temp
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4020
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4020
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x4220
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B2
,
0x4220
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4420
,
iwl7260_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B1
,
0x4420
,
iwl7260_2n_cfg
)},
...
...
drivers/net/wireless/iwlwifi/pcie/internal.h
View file @
20416229
...
@@ -392,7 +392,6 @@ void iwl_trans_pcie_tx_reset(struct iwl_trans *trans);
...
@@ -392,7 +392,6 @@ void iwl_trans_pcie_tx_reset(struct iwl_trans *trans);
/*****************************************************
/*****************************************************
* Error handling
* Error handling
******************************************************/
******************************************************/
int
iwl_pcie_dump_fh
(
struct
iwl_trans
*
trans
,
char
**
buf
);
void
iwl_pcie_dump_csr
(
struct
iwl_trans
*
trans
);
void
iwl_pcie_dump_csr
(
struct
iwl_trans
*
trans
);
/*****************************************************
/*****************************************************
...
...
drivers/net/wireless/iwlwifi/pcie/rx.c
View file @
20416229
...
@@ -793,7 +793,7 @@ static void iwl_pcie_irq_handle_error(struct iwl_trans *trans)
...
@@ -793,7 +793,7 @@ static void iwl_pcie_irq_handle_error(struct iwl_trans *trans)
}
}
iwl_pcie_dump_csr
(
trans
);
iwl_pcie_dump_csr
(
trans
);
iwl_
pcie_
dump_fh
(
trans
,
NULL
);
iwl_dump_fh
(
trans
,
NULL
);
set_bit
(
STATUS_FW_ERROR
,
&
trans_pcie
->
status
);
set_bit
(
STATUS_FW_ERROR
,
&
trans_pcie
->
status
);
clear_bit
(
STATUS_HCMD_ACTIVE
,
&
trans_pcie
->
status
);
clear_bit
(
STATUS_HCMD_ACTIVE
,
&
trans_pcie
->
status
);
...
...
drivers/net/wireless/iwlwifi/pcie/trans.c
View file @
20416229
...
@@ -1033,71 +1033,6 @@ static void iwl_trans_pcie_set_bits_mask(struct iwl_trans *trans, u32 reg,
...
@@ -1033,71 +1033,6 @@ static void iwl_trans_pcie_set_bits_mask(struct iwl_trans *trans, u32 reg,
spin_unlock_irqrestore
(
&
trans_pcie
->
reg_lock
,
flags
);
spin_unlock_irqrestore
(
&
trans_pcie
->
reg_lock
,
flags
);
}
}
static
const
char
*
get_fh_string
(
int
cmd
)
{
#define IWL_CMD(x) case x: return #x
switch
(
cmd
)
{
IWL_CMD
(
FH_RSCSR_CHNL0_STTS_WPTR_REG
);
IWL_CMD
(
FH_RSCSR_CHNL0_RBDCB_BASE_REG
);
IWL_CMD
(
FH_RSCSR_CHNL0_WPTR
);
IWL_CMD
(
FH_MEM_RCSR_CHNL0_CONFIG_REG
);
IWL_CMD
(
FH_MEM_RSSR_SHARED_CTRL_REG
);
IWL_CMD
(
FH_MEM_RSSR_RX_STATUS_REG
);
IWL_CMD
(
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV
);
IWL_CMD
(
FH_TSSR_TX_STATUS_REG
);
IWL_CMD
(
FH_TSSR_TX_ERROR_REG
);
default:
return
"UNKNOWN"
;
}
#undef IWL_CMD
}
int
iwl_pcie_dump_fh
(
struct
iwl_trans
*
trans
,
char
**
buf
)
{
int
i
;
static
const
u32
fh_tbl
[]
=
{
FH_RSCSR_CHNL0_STTS_WPTR_REG
,
FH_RSCSR_CHNL0_RBDCB_BASE_REG
,
FH_RSCSR_CHNL0_WPTR
,
FH_MEM_RCSR_CHNL0_CONFIG_REG
,
FH_MEM_RSSR_SHARED_CTRL_REG
,
FH_MEM_RSSR_RX_STATUS_REG
,
FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV
,
FH_TSSR_TX_STATUS_REG
,
FH_TSSR_TX_ERROR_REG
};
#ifdef CONFIG_IWLWIFI_DEBUGFS
if
(
buf
)
{
int
pos
=
0
;
size_t
bufsz
=
ARRAY_SIZE
(
fh_tbl
)
*
48
+
40
;
*
buf
=
kmalloc
(
bufsz
,
GFP_KERNEL
);
if
(
!*
buf
)
return
-
ENOMEM
;
pos
+=
scnprintf
(
*
buf
+
pos
,
bufsz
-
pos
,
"FH register values:
\n
"
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
fh_tbl
);
i
++
)
pos
+=
scnprintf
(
*
buf
+
pos
,
bufsz
-
pos
,
" %34s: 0X%08x
\n
"
,
get_fh_string
(
fh_tbl
[
i
]),
iwl_read_direct32
(
trans
,
fh_tbl
[
i
]));
return
pos
;
}
#endif
IWL_ERR
(
trans
,
"FH register values:
\n
"
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
fh_tbl
);
i
++
)
IWL_ERR
(
trans
,
" %34s: 0X%08x
\n
"
,
get_fh_string
(
fh_tbl
[
i
]),
iwl_read_direct32
(
trans
,
fh_tbl
[
i
]));
return
0
;
}
static
const
char
*
get_csr_string
(
int
cmd
)
static
const
char
*
get_csr_string
(
int
cmd
)
{
{
#define IWL_CMD(x) case x: return #x
#define IWL_CMD(x) case x: return #x
...
@@ -1178,18 +1113,7 @@ void iwl_pcie_dump_csr(struct iwl_trans *trans)
...
@@ -1178,18 +1113,7 @@ void iwl_pcie_dump_csr(struct iwl_trans *trans)
} while (0)
} while (0)
/* file operation */
/* file operation */
#define DEBUGFS_READ_FUNC(name) \
static ssize_t iwl_dbgfs_##name##_read(struct file *file, \
char __user *user_buf, \
size_t count, loff_t *ppos);
#define DEBUGFS_WRITE_FUNC(name) \
static ssize_t iwl_dbgfs_##name##_write(struct file *file, \
const char __user *user_buf, \
size_t count, loff_t *ppos);
#define DEBUGFS_READ_FILE_OPS(name) \
#define DEBUGFS_READ_FILE_OPS(name) \
DEBUGFS_READ_FUNC(name); \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
.read = iwl_dbgfs_##name##_read, \
.read = iwl_dbgfs_##name##_read, \
.open = simple_open, \
.open = simple_open, \
...
@@ -1197,7 +1121,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \
...
@@ -1197,7 +1121,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \
};
};
#define DEBUGFS_WRITE_FILE_OPS(name) \
#define DEBUGFS_WRITE_FILE_OPS(name) \
DEBUGFS_WRITE_FUNC(name); \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
.write = iwl_dbgfs_##name##_write, \
.write = iwl_dbgfs_##name##_write, \
.open = simple_open, \
.open = simple_open, \
...
@@ -1205,8 +1128,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \
...
@@ -1205,8 +1128,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \
};
};
#define DEBUGFS_READ_WRITE_FILE_OPS(name) \
#define DEBUGFS_READ_WRITE_FILE_OPS(name) \
DEBUGFS_READ_FUNC(name); \
DEBUGFS_WRITE_FUNC(name); \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
static const struct file_operations iwl_dbgfs_##name##_ops = { \
.write = iwl_dbgfs_##name##_write, \
.write = iwl_dbgfs_##name##_write, \
.read = iwl_dbgfs_##name##_read, \
.read = iwl_dbgfs_##name##_read, \
...
@@ -1390,7 +1311,7 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file,
...
@@ -1390,7 +1311,7 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file,
int
pos
=
0
;
int
pos
=
0
;
ssize_t
ret
=
-
EFAULT
;
ssize_t
ret
=
-
EFAULT
;
ret
=
pos
=
iwl_
pcie_
dump_fh
(
trans
,
&
buf
);
ret
=
pos
=
iwl_dump_fh
(
trans
,
&
buf
);
if
(
buf
)
{
if
(
buf
)
{
ret
=
simple_read_from_buffer
(
user_buf
,
ret
=
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
pos
);
count
,
ppos
,
buf
,
pos
);
...
@@ -1497,10 +1418,16 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
...
@@ -1497,10 +1418,16 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
spin_lock_init
(
&
trans_pcie
->
reg_lock
);
spin_lock_init
(
&
trans_pcie
->
reg_lock
);
init_waitqueue_head
(
&
trans_pcie
->
ucode_write_waitq
);
init_waitqueue_head
(
&
trans_pcie
->
ucode_write_waitq
);
/* W/A - seems to solve weird behavior. We need to remove this if we
if
(
!
cfg
->
base_params
->
pcie_l1_allowed
)
{
* don't want to stay in L1 all the time. This wastes a lot of power */
/*
pci_disable_link_state
(
pdev
,
PCIE_LINK_STATE_L0S
|
PCIE_LINK_STATE_L1
|
* W/A - seems to solve weird behavior. We need to remove this
PCIE_LINK_STATE_CLKPM
);
* if we don't want to stay in L1 all the time. This wastes a
* lot of power.
*/
pci_disable_link_state
(
pdev
,
PCIE_LINK_STATE_L0S
|
PCIE_LINK_STATE_L1
|
PCIE_LINK_STATE_CLKPM
);
}
if
(
pci_enable_device
(
pdev
))
{
if
(
pci_enable_device
(
pdev
))
{
err
=
-
ENODEV
;
err
=
-
ENODEV
;
...
...
drivers/net/wireless/iwlwifi/pcie/tx.c
View file @
20416229
...
@@ -1619,10 +1619,9 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
...
@@ -1619,10 +1619,9 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
txq
=
&
trans_pcie
->
txq
[
txq_id
];
txq
=
&
trans_pcie
->
txq
[
txq_id
];
q
=
&
txq
->
q
;
q
=
&
txq
->
q
;
if
(
unlikely
(
!
test_bit
(
txq_id
,
trans_pcie
->
queue_used
)))
{
if
(
WARN_ONCE
(
!
test_bit
(
txq_id
,
trans_pcie
->
queue_used
),
WARN_ON_ONCE
(
1
);
"TX on unused queue %d
\n
"
,
txq_id
))
return
-
EINVAL
;
return
-
EINVAL
;
}
spin_lock
(
&
txq
->
lock
);
spin_lock
(
&
txq
->
lock
);
...
...
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