Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
e7322f32
Commit
e7322f32
authored
Oct 29, 2014
by
Emmanuel Grumbach
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'iwlwifi-fixes/master' into iwlwifi-next
parents
35a9ad8a
7f2ac8fb
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
106 additions
and
44 deletions
+106
-44
drivers/net/wireless/iwlwifi/dvm/mac80211.c
drivers/net/wireless/iwlwifi/dvm/mac80211.c
+13
-11
drivers/net/wireless/iwlwifi/iwl-8000.c
drivers/net/wireless/iwlwifi/iwl-8000.c
+2
-1
drivers/net/wireless/iwlwifi/iwl-trans.h
drivers/net/wireless/iwlwifi/iwl-trans.h
+2
-0
drivers/net/wireless/iwlwifi/mvm/coex.c
drivers/net/wireless/iwlwifi/mvm/coex.c
+2
-2
drivers/net/wireless/iwlwifi/mvm/coex_legacy.c
drivers/net/wireless/iwlwifi/mvm/coex_legacy.c
+2
-2
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
+34
-1
drivers/net/wireless/iwlwifi/mvm/fw-api.h
drivers/net/wireless/iwlwifi/mvm/fw-api.h
+1
-0
drivers/net/wireless/iwlwifi/mvm/fw.c
drivers/net/wireless/iwlwifi/mvm/fw.c
+9
-0
drivers/net/wireless/iwlwifi/mvm/mac80211.c
drivers/net/wireless/iwlwifi/mvm/mac80211.c
+23
-9
drivers/net/wireless/iwlwifi/mvm/ops.c
drivers/net/wireless/iwlwifi/mvm/ops.c
+1
-0
drivers/net/wireless/iwlwifi/mvm/scan.c
drivers/net/wireless/iwlwifi/mvm/scan.c
+2
-1
drivers/net/wireless/iwlwifi/mvm/time-event.c
drivers/net/wireless/iwlwifi/mvm/time-event.c
+1
-1
drivers/net/wireless/iwlwifi/mvm/tx.c
drivers/net/wireless/iwlwifi/mvm/tx.c
+2
-6
drivers/net/wireless/iwlwifi/pcie/trans.c
drivers/net/wireless/iwlwifi/pcie/trans.c
+12
-10
No files found.
drivers/net/wireless/iwlwifi/dvm/mac80211.c
View file @
e7322f32
...
...
@@ -1095,6 +1095,7 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
u32
queues
,
bool
drop
)
{
struct
iwl_priv
*
priv
=
IWL_MAC80211_GET_DVM
(
hw
);
u32
scd_queues
;
mutex_lock
(
&
priv
->
mutex
);
IWL_DEBUG_MAC80211
(
priv
,
"enter
\n
"
);
...
...
@@ -1108,18 +1109,19 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
goto
done
;
}
/*
* mac80211 will not push any more frames for transmit
* until the flush is completed
*/
if
(
drop
)
{
IWL_DEBUG_MAC80211
(
priv
,
"send flush command
\n
"
);
if
(
iwlagn_txfifo_flush
(
priv
,
0
))
{
IWL_ERR
(
priv
,
"flush request fail
\n
"
);
goto
done
;
}
scd_queues
=
BIT
(
priv
->
cfg
->
base_params
->
num_of_queues
)
-
1
;
scd_queues
&=
~
(
BIT
(
IWL_IPAN_CMD_QUEUE_NUM
)
|
BIT
(
IWL_DEFAULT_CMD_QUEUE_NUM
));
if
(
vif
)
scd_queues
&=
~
BIT
(
vif
->
hw_queue
[
IEEE80211_AC_VO
]);
IWL_DEBUG_TX_QUEUES
(
priv
,
"Flushing SCD queues: 0x%x
\n
"
,
scd_queues
);
if
(
iwlagn_txfifo_flush
(
priv
,
scd_queues
))
{
IWL_ERR
(
priv
,
"flush request fail
\n
"
);
goto
done
;
}
IWL_DEBUG_
MAC80211
(
priv
,
"wait transmit/flush all frames
\n
"
);
IWL_DEBUG_
TX_QUEUES
(
priv
,
"wait transmit/flush all frames
\n
"
);
iwl_trans_wait_tx_queue_empty
(
priv
->
trans
,
0xffffffff
);
done:
mutex_unlock
(
&
priv
->
mutex
);
...
...
drivers/net/wireless/iwlwifi/iwl-8000.c
View file @
e7322f32
...
...
@@ -82,7 +82,8 @@
#define IWL8000_TX_POWER_VERSION 0xffff
/* meaningless */
#define IWL8000_FW_PRE "iwlwifi-8000"
#define IWL8000_MODULE_FIRMWARE(api) IWL8000_FW_PRE __stringify(api) ".ucode"
#define IWL8000_MODULE_FIRMWARE(api) \
IWL8000_FW_PRE "-" __stringify(api) ".ucode"
#define NVM_HW_SECTION_NUM_FAMILY_8000 10
#define DEFAULT_NVM_FILE_FAMILY_8000 "iwl_nvm_8000.bin"
...
...
drivers/net/wireless/iwlwifi/iwl-trans.h
View file @
e7322f32
...
...
@@ -563,6 +563,7 @@ enum iwl_trans_state {
* Set during transport allocation.
* @hw_id_str: a string with info about HW ID. Set during transport allocation.
* @pm_support: set to true in start_hw if link pm is supported
* @ltr_enabled: set to true if the LTR is enabled
* @dev_cmd_pool: pool for Tx cmd allocation - for internal use only.
* The user should use iwl_trans_{alloc,free}_tx_cmd.
* @dev_cmd_headroom: room needed for the transport's private use before the
...
...
@@ -589,6 +590,7 @@ struct iwl_trans {
u8
rx_mpdu_cmd
,
rx_mpdu_cmd_hdr_size
;
bool
pm_support
;
bool
ltr_enabled
;
/* The following fields are internal only */
struct
kmem_cache
*
dev_cmd_pool
;
...
...
drivers/net/wireless/iwlwifi/mvm/coex.c
View file @
e7322f32
...
...
@@ -303,8 +303,8 @@ static const __le64 iwl_ci_mask[][3] = {
};
static
const
__le32
iwl_bt_mprio_lut
[
BT_COEX_MULTI_PRIO_LUT_SIZE
]
=
{
cpu_to_le32
(
0x2
8412201
),
cpu_to_le32
(
0x
111184
51
),
cpu_to_le32
(
0x2
e402280
),
cpu_to_le32
(
0x
7711a7
51
),
};
struct
corunning_block_luts
{
...
...
drivers/net/wireless/iwlwifi/mvm/coex_legacy.c
View file @
e7322f32
...
...
@@ -291,8 +291,8 @@ static const __le64 iwl_ci_mask[][3] = {
};
static
const
__le32
iwl_bt_mprio_lut
[
BT_COEX_MULTI_PRIO_LUT_SIZE
]
=
{
cpu_to_le32
(
0x2
8412201
),
cpu_to_le32
(
0x
111184
51
),
cpu_to_le32
(
0x2
e402280
),
cpu_to_le32
(
0x
7711a7
51
),
};
struct
corunning_block_luts
{
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
View file @
e7322f32
...
...
@@ -68,13 +68,46 @@
/* Power Management Commands, Responses, Notifications */
/**
* enum iwl_ltr_config_flags - masks for LTR config command flags
* @LTR_CFG_FLAG_FEATURE_ENABLE: Feature operational status
* @LTR_CFG_FLAG_HW_DIS_ON_SHADOW_REG_ACCESS: allow LTR change on shadow
* memory access
* @LTR_CFG_FLAG_HW_EN_SHRT_WR_THROUGH: allow LTR msg send on ANY LTR
* reg change
* @LTR_CFG_FLAG_HW_DIS_ON_D0_2_D3: allow LTR msg send on transition from
* D0 to D3
* @LTR_CFG_FLAG_SW_SET_SHORT: fixed static short LTR register
* @LTR_CFG_FLAG_SW_SET_LONG: fixed static short LONG register
* @LTR_CFG_FLAG_DENIE_C10_ON_PD: allow going into C10 on PD
*/
enum
iwl_ltr_config_flags
{
LTR_CFG_FLAG_FEATURE_ENABLE
=
BIT
(
0
),
LTR_CFG_FLAG_HW_DIS_ON_SHADOW_REG_ACCESS
=
BIT
(
1
),
LTR_CFG_FLAG_HW_EN_SHRT_WR_THROUGH
=
BIT
(
2
),
LTR_CFG_FLAG_HW_DIS_ON_D0_2_D3
=
BIT
(
3
),
LTR_CFG_FLAG_SW_SET_SHORT
=
BIT
(
4
),
LTR_CFG_FLAG_SW_SET_LONG
=
BIT
(
5
),
LTR_CFG_FLAG_DENIE_C10_ON_PD
=
BIT
(
6
),
};
/**
* struct iwl_ltr_config_cmd - configures the LTR
* @flags: See %enum iwl_ltr_config_flags
*/
struct
iwl_ltr_config_cmd
{
__le32
flags
;
__le32
static_long
;
__le32
static_short
;
}
__packed
;
/* Radio LP RX Energy Threshold measured in dBm */
#define POWER_LPRX_RSSI_THRESHOLD 75
#define POWER_LPRX_RSSI_THRESHOLD_MAX 94
#define POWER_LPRX_RSSI_THRESHOLD_MIN 30
/**
* enum iwl_
scan
_flags - masks for power table command flags
* enum iwl_
power
_flags - masks for power table command flags
* @POWER_FLAGS_POWER_SAVE_ENA_MSK: '1' Allow to save power by turning off
* receiver and transmitter. '0' - does not allow.
* @POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK: '0' Driver disables power management,
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api.h
View file @
e7322f32
...
...
@@ -157,6 +157,7 @@ enum {
/* Power - legacy power table command */
POWER_TABLE_CMD
=
0x77
,
PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION
=
0x78
,
LTR_CONFIG
=
0xee
,
/* Thermal Throttling*/
REPLY_THERMAL_MNG_BACKOFF
=
0x7e
,
...
...
drivers/net/wireless/iwlwifi/mvm/fw.c
View file @
e7322f32
...
...
@@ -480,6 +480,15 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
/* Initialize tx backoffs to the minimal possible */
iwl_mvm_tt_tx_backoff
(
mvm
,
0
);
if
(
mvm
->
trans
->
ltr_enabled
)
{
struct
iwl_ltr_config_cmd
cmd
=
{
.
flags
=
cpu_to_le32
(
LTR_CFG_FLAG_FEATURE_ENABLE
),
};
WARN_ON
(
iwl_mvm_send_cmd_pdu
(
mvm
,
LTR_CONFIG
,
0
,
sizeof
(
cmd
),
&
cmd
));
}
ret
=
iwl_mvm_power_update_device
(
mvm
);
if
(
ret
)
goto
error
;
...
...
drivers/net/wireless/iwlwifi/mvm/mac80211.c
View file @
e7322f32
...
...
@@ -526,7 +526,8 @@ static void iwl_mvm_mac_tx(struct ieee80211_hw *hw,
}
if
(
IEEE80211_SKB_CB
(
skb
)
->
hw_queue
==
IWL_MVM_OFFCHANNEL_QUEUE
&&
!
test_bit
(
IWL_MVM_STATUS_ROC_RUNNING
,
&
mvm
->
status
))
!
test_bit
(
IWL_MVM_STATUS_ROC_RUNNING
,
&
mvm
->
status
)
&&
!
test_bit
(
IWL_MVM_STATUS_ROC_AUX_RUNNING
,
&
mvm
->
status
))
goto
drop
;
/* treat non-bufferable MMPDUs as broadcast if sta is sleeping */
...
...
@@ -1734,6 +1735,13 @@ iwl_mvm_bss_info_changed_ap_ibss(struct iwl_mvm *mvm,
if
(
changes
&
BSS_CHANGED_BEACON
&&
iwl_mvm_mac_ctxt_beacon_changed
(
mvm
,
vif
))
IWL_WARN
(
mvm
,
"Failed updating beacon data
\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
void
iwl_mvm_bss_info_changed
(
struct
ieee80211_hw
*
hw
,
...
...
@@ -2367,14 +2375,19 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,
/* Set the node address */
memcpy
(
aux_roc_req
.
node_addr
,
vif
->
addr
,
ETH_ALEN
);
lockdep_assert_held
(
&
mvm
->
mutex
);
spin_lock_bh
(
&
mvm
->
time_event_lock
);
if
(
WARN_ON
(
te_data
->
id
==
HOT_SPOT_CMD
))
{
spin_unlock_bh
(
&
mvm
->
time_event_lock
);
return
-
EIO
;
}
te_data
->
vif
=
vif
;
te_data
->
duration
=
duration
;
te_data
->
id
=
HOT_SPOT_CMD
;
lockdep_assert_held
(
&
mvm
->
mutex
);
spin_lock_bh
(
&
mvm
->
time_event_lock
);
list_add_tail
(
&
te_data
->
list
,
&
mvm
->
time_event_list
);
spin_unlock_bh
(
&
mvm
->
time_event_lock
);
/*
...
...
@@ -2430,22 +2443,23 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
IWL_DEBUG_MAC80211
(
mvm
,
"enter (%d, %d, %d)
\n
"
,
channel
->
hw_value
,
duration
,
type
);
mutex_lock
(
&
mvm
->
mutex
);
switch
(
vif
->
type
)
{
case
NL80211_IFTYPE_STATION
:
/* Use aux roc framework (HS20) */
ret
=
iwl_mvm_send_aux_roc_cmd
(
mvm
,
channel
,
vif
,
duration
);
return
ret
;
goto
out_unlock
;
case
NL80211_IFTYPE_P2P_DEVICE
:
/* handle below */
break
;
default:
IWL_ERR
(
mvm
,
"vif isn't P2P_DEVICE: %d
\n
"
,
vif
->
type
);
return
-
EINVAL
;
ret
=
-
EINVAL
;
goto
out_unlock
;
}
mutex_lock
(
&
mvm
->
mutex
);
for
(
i
=
0
;
i
<
NUM_PHY_CTX
;
i
++
)
{
phy_ctxt
=
&
mvm
->
phy_ctxts
[
i
];
if
(
phy_ctxt
->
ref
==
0
||
mvmvif
->
phy_ctxt
==
phy_ctxt
)
...
...
drivers/net/wireless/iwlwifi/mvm/ops.c
View file @
e7322f32
...
...
@@ -336,6 +336,7 @@ static const char *const iwl_mvm_cmd_strings[REPLY_MAX] = {
CMD
(
DTS_MEASUREMENT_NOTIFICATION
),
CMD
(
REPLY_THERMAL_MNG_BACKOFF
),
CMD
(
MAC_PM_POWER_TABLE
),
CMD
(
LTR_CONFIG
),
CMD
(
BT_COEX_CI
),
CMD
(
BT_COEX_UPDATE_SW_BOOST
),
CMD
(
BT_COEX_UPDATE_CORUN_LUT
),
...
...
drivers/net/wireless/iwlwifi/mvm/scan.c
View file @
e7322f32
...
...
@@ -459,7 +459,8 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
basic_ssid
?
1
:
0
);
cmd
->
tx_cmd
.
tx_flags
=
cpu_to_le32
(
TX_CMD_FLG_SEQ_CTL
|
TX_CMD_FLG_BT_DIS
);
3
<<
TX_CMD_FLG_BT_PRIO_POS
);
cmd
->
tx_cmd
.
sta_id
=
mvm
->
aux_sta
.
sta_id
;
cmd
->
tx_cmd
.
life_time
=
cpu_to_le32
(
TX_CMD_LIFE_TIME_INFINITE
);
cmd
->
tx_cmd
.
rate_n_flags
=
...
...
drivers/net/wireless/iwlwifi/mvm/time-event.c
View file @
e7322f32
...
...
@@ -305,8 +305,8 @@ static int iwl_mvm_aux_roc_te_handle_notif(struct iwl_mvm *mvm,
te_data
->
running
=
false
;
te_data
->
vif
=
NULL
;
te_data
->
uid
=
0
;
te_data
->
id
=
TE_MAX
;
}
else
if
(
le32_to_cpu
(
notif
->
action
)
==
TE_V2_NOTIF_HOST_EVENT_START
)
{
set_bit
(
IWL_MVM_STATUS_ROC_RUNNING
,
&
mvm
->
status
);
set_bit
(
IWL_MVM_STATUS_ROC_AUX_RUNNING
,
&
mvm
->
status
);
te_data
->
running
=
true
;
ieee80211_ready_on_channel
(
mvm
->
hw
);
/* Start TE */
...
...
drivers/net/wireless/iwlwifi/mvm/tx.c
View file @
e7322f32
...
...
@@ -175,14 +175,10 @@ static void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm,
/*
* for data packets, rate info comes from the table inside the fw. This
* table is controlled by LINK_QUALITY commands. Exclude ctrl port
* frames like EAPOLs which should be treated as mgmt frames. This
* avoids them being sent initially in high rates which increases the
* chances for completion of the 4-Way handshake.
* table is controlled by LINK_QUALITY commands
*/
if
(
ieee80211_is_data
(
fc
)
&&
sta
&&
!
(
info
->
control
.
flags
&
IEEE80211_TX_CTRL_PORT_CTRL_PROTO
))
{
if
(
ieee80211_is_data
(
fc
)
&&
sta
)
{
tx_cmd
->
initial_rate_index
=
0
;
tx_cmd
->
tx_flags
|=
cpu_to_le32
(
TX_CMD_FLG_STA_RATE
);
return
;
...
...
drivers/net/wireless/iwlwifi/pcie/trans.c
View file @
e7322f32
...
...
@@ -174,6 +174,7 @@ static void iwl_pcie_apm_config(struct iwl_trans *trans)
{
struct
iwl_trans_pcie
*
trans_pcie
=
IWL_TRANS_GET_PCIE_TRANS
(
trans
);
u16
lctl
;
u16
cap
;
/*
* HW bug W/A for instability in PCIe bus L0S->L1 transition.
...
...
@@ -184,16 +185,17 @@ static void iwl_pcie_apm_config(struct iwl_trans *trans)
* power savings, even without L1.
*/
pcie_capability_read_word
(
trans_pcie
->
pci_dev
,
PCI_EXP_LNKCTL
,
&
lctl
);
if
(
lctl
&
PCI_EXP_LNKCTL_ASPM_L1
)
{
/* L1-ASPM enabled; disable(!) L0S */
if
(
lctl
&
PCI_EXP_LNKCTL_ASPM_L1
)
iwl_set_bit
(
trans
,
CSR_GIO_REG
,
CSR_GIO_REG_VAL_L0S_ENABLED
);
dev_info
(
trans
->
dev
,
"L1 Enabled; Disabling L0S
\n
"
);
}
else
{
/* L1-ASPM disabled; enable(!) L0S */
else
iwl_clear_bit
(
trans
,
CSR_GIO_REG
,
CSR_GIO_REG_VAL_L0S_ENABLED
);
dev_info
(
trans
->
dev
,
"L1 Disabled; Enabling L0S
\n
"
);
}
trans
->
pm_support
=
!
(
lctl
&
PCI_EXP_LNKCTL_ASPM_L0S
);
pcie_capability_read_word
(
trans_pcie
->
pci_dev
,
PCI_EXP_DEVCTL2
,
&
cap
);
trans
->
ltr_enabled
=
cap
&
PCI_EXP_DEVCTL2_LTR_EN
;
dev_info
(
trans
->
dev
,
"L1 %sabled - LTR %sabled
\n
"
,
(
lctl
&
PCI_EXP_LNKCTL_ASPM_L1
)
?
"En"
:
"Dis"
,
trans
->
ltr_enabled
?
"En"
:
"Dis"
);
}
/*
...
...
@@ -428,7 +430,7 @@ static int iwl_pcie_apm_stop_master(struct iwl_trans *trans)
ret
=
iwl_poll_bit
(
trans
,
CSR_RESET
,
CSR_RESET_REG_FLAG_MASTER_DISABLED
,
CSR_RESET_REG_FLAG_MASTER_DISABLED
,
100
);
if
(
ret
)
if
(
ret
<
0
)
IWL_WARN
(
trans
,
"Master Disable Timed Out, 100 usec
\n
"
);
IWL_DEBUG_INFO
(
trans
,
"stop master
\n
"
);
...
...
@@ -544,7 +546,7 @@ static int iwl_pcie_prepare_card_hw(struct iwl_trans *trans)
msleep
(
25
);
}
IWL_
DEBUG_INFO
(
trans
,
"got NIC after %d iterations
\n
"
,
iter
);
IWL_
ERR
(
trans
,
"Couldn't prepare the card
\n
"
);
return
ret
;
}
...
...
@@ -1043,7 +1045,7 @@ static int iwl_trans_pcie_d3_resume(struct iwl_trans *trans,
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY
,
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY
,
25000
);
if
(
ret
)
{
if
(
ret
<
0
)
{
IWL_ERR
(
trans
,
"Failed to resume the device (mac ready)
\n
"
);
return
ret
;
}
...
...
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