Skip to content

Commit 03afb6e

Browse files
committed
Merge tag 'wireless-drivers-for-davem-2017-12-08' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers
Kalle Valo says: ==================== wireless-drivers fixes for 4.15 Second set of fixes for 4.15. This time a lot of iwlwifi patches and two brcmfmac patches. Most important here are the MIC and IVC fixes for iwlwifi to unbreak 9000 series. iwlwifi * fix rate-scaling to not start lowest possible rate * fix the TX queue hang detection for AP/GO modes * fix the TX queue hang timeout in monitor interfaces * fix packet injection * remove a wrong error message when dumping PCI registers * fix race condition with RF-kill * tell mac80211 when the MIC has been stripped (9000 series) * tell mac80211 when the IVC has been stripped (9000 series) * add 2 new PCI IDs, one for 9000 and one for 22000 * fix a queue hang due during a P2P Remain-on-Channel operation brcmfmac * fix a race which sometimes caused a crash during sdio unbind * fix a kernel-doc related build error ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 8a7b741 + a41886f commit 03afb6e

File tree

15 files changed

+122
-27
lines changed

15 files changed

+122
-27
lines changed

drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,7 +2070,7 @@ static int brcmf_sdio_txpkt_hdalign(struct brcmf_sdio *bus, struct sk_buff *pkt)
20702070
return head_pad;
20712071
}
20722072

2073-
/**
2073+
/*
20742074
* struct brcmf_skbuff_cb reserves first two bytes in sk_buff::cb for
20752075
* bus layer usage.
20762076
*/
@@ -4121,8 +4121,8 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
41214121
sdio_release_host(sdiodev->func[1]);
41224122
fail:
41234123
brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), err);
4124-
device_release_driver(dev);
41254124
device_release_driver(&sdiodev->func[2]->dev);
4125+
device_release_driver(dev);
41264126
}
41274127

41284128
struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)

drivers/net/wireless/intel/iwlwifi/fw/api/txq.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@
6868
* @IWL_MVM_DQA_CMD_QUEUE: a queue reserved for sending HCMDs to the FW
6969
* @IWL_MVM_DQA_AUX_QUEUE: a queue reserved for aux frames
7070
* @IWL_MVM_DQA_P2P_DEVICE_QUEUE: a queue reserved for P2P device frames
71+
* @IWL_MVM_DQA_INJECT_MONITOR_QUEUE: a queue reserved for injection using
72+
* monitor mode. Note this queue is the same as the queue for P2P device
73+
* but we can't have active monitor mode along with P2P device anyway.
7174
* @IWL_MVM_DQA_GCAST_QUEUE: a queue reserved for P2P GO/SoftAP GCAST frames
7275
* @IWL_MVM_DQA_BSS_CLIENT_QUEUE: a queue reserved for BSS activity, to ensure
7376
* that we are never left without the possibility to connect to an AP.
@@ -87,6 +90,7 @@ enum iwl_mvm_dqa_txq {
8790
IWL_MVM_DQA_CMD_QUEUE = 0,
8891
IWL_MVM_DQA_AUX_QUEUE = 1,
8992
IWL_MVM_DQA_P2P_DEVICE_QUEUE = 2,
93+
IWL_MVM_DQA_INJECT_MONITOR_QUEUE = 2,
9094
IWL_MVM_DQA_GCAST_QUEUE = 3,
9195
IWL_MVM_DQA_BSS_CLIENT_QUEUE = 4,
9296
IWL_MVM_DQA_MIN_MGMT_QUEUE = 5,

drivers/net/wireless/intel/iwlwifi/fw/dbg.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,6 @@ static inline void iwl_fw_dbg_stop_recording(struct iwl_fw_runtime *fwrt)
209209

210210
static inline void iwl_fw_dump_conf_clear(struct iwl_fw_runtime *fwrt)
211211
{
212-
iwl_fw_dbg_stop_recording(fwrt);
213-
214212
fwrt->dump.conf = FW_DBG_INVALID;
215213
}
216214

drivers/net/wireless/intel/iwlwifi/iwl-trans.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@
117117
#define FH_RSCSR_FRAME_INVALID 0x55550000
118118
#define FH_RSCSR_FRAME_ALIGN 0x40
119119
#define FH_RSCSR_RPA_EN BIT(25)
120+
#define FH_RSCSR_RADA_EN BIT(26)
120121
#define FH_RSCSR_RXQ_POS 16
121122
#define FH_RSCSR_RXQ_MASK 0x3F0000
122123

@@ -128,7 +129,8 @@ struct iwl_rx_packet {
128129
* 31: flag flush RB request
129130
* 30: flag ignore TC (terminal counter) request
130131
* 29: flag fast IRQ request
131-
* 28-26: Reserved
132+
* 28-27: Reserved
133+
* 26: RADA enabled
132134
* 25: Offload enabled
133135
* 24: RPF enabled
134136
* 23: RSS enabled

drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -787,7 +787,7 @@ static int iwl_mvm_mac_ctxt_cmd_listener(struct iwl_mvm *mvm,
787787
u32 action)
788788
{
789789
struct iwl_mac_ctx_cmd cmd = {};
790-
u32 tfd_queue_msk = 0;
790+
u32 tfd_queue_msk = BIT(mvm->snif_queue);
791791
int ret;
792792

793793
WARN_ON(vif->type != NL80211_IFTYPE_MONITOR);

drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,7 @@ struct iwl_mvm {
972972

973973
/* Tx queues */
974974
u16 aux_queue;
975+
u16 snif_queue;
975976
u16 probe_queue;
976977
u16 p2p_dev_queue;
977978

@@ -1060,6 +1061,7 @@ struct iwl_mvm {
10601061
* @IWL_MVM_STATUS_ROC_AUX_RUNNING: AUX remain-on-channel is running
10611062
* @IWL_MVM_STATUS_D3_RECONFIG: D3 reconfiguration is being done
10621063
* @IWL_MVM_STATUS_FIRMWARE_RUNNING: firmware is running
1064+
* @IWL_MVM_STATUS_NEED_FLUSH_P2P: need to flush P2P bcast STA
10631065
*/
10641066
enum iwl_mvm_status {
10651067
IWL_MVM_STATUS_HW_RFKILL,
@@ -1071,6 +1073,7 @@ enum iwl_mvm_status {
10711073
IWL_MVM_STATUS_ROC_AUX_RUNNING,
10721074
IWL_MVM_STATUS_D3_RECONFIG,
10731075
IWL_MVM_STATUS_FIRMWARE_RUNNING,
1076+
IWL_MVM_STATUS_NEED_FLUSH_P2P,
10741077
};
10751078

10761079
/* Keep track of completed init configuration */

drivers/net/wireless/intel/iwlwifi/mvm/ops.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
624624
mvm->fw_restart = iwlwifi_mod_params.fw_restart ? -1 : 0;
625625

626626
mvm->aux_queue = IWL_MVM_DQA_AUX_QUEUE;
627+
mvm->snif_queue = IWL_MVM_DQA_INJECT_MONITOR_QUEUE;
627628
mvm->probe_queue = IWL_MVM_DQA_AP_PROBE_RESP_QUEUE;
628629
mvm->p2p_dev_queue = IWL_MVM_DQA_P2P_DEVICE_QUEUE;
629630

drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm,
213213
struct ieee80211_rx_status *rx_status)
214214
{
215215
int energy_a, energy_b, max_energy;
216+
u32 rate_flags = le32_to_cpu(desc->rate_n_flags);
216217

217218
energy_a = desc->energy_a;
218219
energy_a = energy_a ? -energy_a : S8_MIN;
@@ -224,16 +225,17 @@ static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm,
224225
energy_a, energy_b, max_energy);
225226

226227
rx_status->signal = max_energy;
227-
rx_status->chains = 0; /* TODO: phy info */
228+
rx_status->chains =
229+
(rate_flags & RATE_MCS_ANT_AB_MSK) >> RATE_MCS_ANT_POS;
228230
rx_status->chain_signal[0] = energy_a;
229231
rx_status->chain_signal[1] = energy_b;
230232
rx_status->chain_signal[2] = S8_MIN;
231233
}
232234

233235
static int iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
234236
struct ieee80211_rx_status *stats,
235-
struct iwl_rx_mpdu_desc *desc, int queue,
236-
u8 *crypt_len)
237+
struct iwl_rx_mpdu_desc *desc, u32 pkt_flags,
238+
int queue, u8 *crypt_len)
237239
{
238240
u16 status = le16_to_cpu(desc->status);
239241

@@ -253,6 +255,8 @@ static int iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
253255
return -1;
254256

255257
stats->flag |= RX_FLAG_DECRYPTED;
258+
if (pkt_flags & FH_RSCSR_RADA_EN)
259+
stats->flag |= RX_FLAG_MIC_STRIPPED;
256260
*crypt_len = IEEE80211_CCMP_HDR_LEN;
257261
return 0;
258262
case IWL_RX_MPDU_STATUS_SEC_TKIP:
@@ -270,6 +274,10 @@ static int iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
270274
if ((status & IWL_RX_MPDU_STATUS_SEC_MASK) ==
271275
IWL_RX_MPDU_STATUS_SEC_WEP)
272276
*crypt_len = IEEE80211_WEP_IV_LEN;
277+
278+
if (pkt_flags & FH_RSCSR_RADA_EN)
279+
stats->flag |= RX_FLAG_ICV_STRIPPED;
280+
273281
return 0;
274282
case IWL_RX_MPDU_STATUS_SEC_EXT_ENC:
275283
if (!(status & IWL_RX_MPDU_STATUS_MIC_OK))
@@ -848,7 +856,9 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
848856

849857
rx_status = IEEE80211_SKB_RXCB(skb);
850858

851-
if (iwl_mvm_rx_crypto(mvm, hdr, rx_status, desc, queue, &crypt_len)) {
859+
if (iwl_mvm_rx_crypto(mvm, hdr, rx_status, desc,
860+
le32_to_cpu(pkt->len_n_flags), queue,
861+
&crypt_len)) {
852862
kfree_skb(skb);
853863
return;
854864
}

drivers/net/wireless/intel/iwlwifi/mvm/sta.c

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1709,29 +1709,29 @@ void iwl_mvm_dealloc_int_sta(struct iwl_mvm *mvm, struct iwl_mvm_int_sta *sta)
17091709
sta->sta_id = IWL_MVM_INVALID_STA;
17101710
}
17111711

1712-
static void iwl_mvm_enable_aux_queue(struct iwl_mvm *mvm)
1712+
static void iwl_mvm_enable_aux_snif_queue(struct iwl_mvm *mvm, u16 *queue,
1713+
u8 sta_id, u8 fifo)
17131714
{
17141715
unsigned int wdg_timeout = iwlmvm_mod_params.tfd_q_hang_detect ?
17151716
mvm->cfg->base_params->wd_timeout :
17161717
IWL_WATCHDOG_DISABLED;
17171718

17181719
if (iwl_mvm_has_new_tx_api(mvm)) {
1719-
int queue = iwl_mvm_tvqm_enable_txq(mvm, mvm->aux_queue,
1720-
mvm->aux_sta.sta_id,
1721-
IWL_MAX_TID_COUNT,
1722-
wdg_timeout);
1723-
mvm->aux_queue = queue;
1720+
int tvqm_queue =
1721+
iwl_mvm_tvqm_enable_txq(mvm, *queue, sta_id,
1722+
IWL_MAX_TID_COUNT,
1723+
wdg_timeout);
1724+
*queue = tvqm_queue;
17241725
} else {
17251726
struct iwl_trans_txq_scd_cfg cfg = {
1726-
.fifo = IWL_MVM_TX_FIFO_MCAST,
1727-
.sta_id = mvm->aux_sta.sta_id,
1727+
.fifo = fifo,
1728+
.sta_id = sta_id,
17281729
.tid = IWL_MAX_TID_COUNT,
17291730
.aggregate = false,
17301731
.frame_limit = IWL_FRAME_LIMIT,
17311732
};
17321733

1733-
iwl_mvm_enable_txq(mvm, mvm->aux_queue, mvm->aux_queue, 0, &cfg,
1734-
wdg_timeout);
1734+
iwl_mvm_enable_txq(mvm, *queue, *queue, 0, &cfg, wdg_timeout);
17351735
}
17361736
}
17371737

@@ -1750,7 +1750,9 @@ int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
17501750

17511751
/* Map Aux queue to fifo - needs to happen before adding Aux station */
17521752
if (!iwl_mvm_has_new_tx_api(mvm))
1753-
iwl_mvm_enable_aux_queue(mvm);
1753+
iwl_mvm_enable_aux_snif_queue(mvm, &mvm->aux_queue,
1754+
mvm->aux_sta.sta_id,
1755+
IWL_MVM_TX_FIFO_MCAST);
17541756

17551757
ret = iwl_mvm_add_int_sta_common(mvm, &mvm->aux_sta, NULL,
17561758
MAC_INDEX_AUX, 0);
@@ -1764,18 +1766,41 @@ int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
17641766
* to firmware so enable queue here - after the station was added
17651767
*/
17661768
if (iwl_mvm_has_new_tx_api(mvm))
1767-
iwl_mvm_enable_aux_queue(mvm);
1769+
iwl_mvm_enable_aux_snif_queue(mvm, &mvm->aux_queue,
1770+
mvm->aux_sta.sta_id,
1771+
IWL_MVM_TX_FIFO_MCAST);
17681772

17691773
return 0;
17701774
}
17711775

17721776
int iwl_mvm_add_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
17731777
{
17741778
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1779+
int ret;
17751780

17761781
lockdep_assert_held(&mvm->mutex);
1777-
return iwl_mvm_add_int_sta_common(mvm, &mvm->snif_sta, vif->addr,
1782+
1783+
/* Map snif queue to fifo - must happen before adding snif station */
1784+
if (!iwl_mvm_has_new_tx_api(mvm))
1785+
iwl_mvm_enable_aux_snif_queue(mvm, &mvm->snif_queue,
1786+
mvm->snif_sta.sta_id,
1787+
IWL_MVM_TX_FIFO_BE);
1788+
1789+
ret = iwl_mvm_add_int_sta_common(mvm, &mvm->snif_sta, vif->addr,
17781790
mvmvif->id, 0);
1791+
if (ret)
1792+
return ret;
1793+
1794+
/*
1795+
* For 22000 firmware and on we cannot add queue to a station unknown
1796+
* to firmware so enable queue here - after the station was added
1797+
*/
1798+
if (iwl_mvm_has_new_tx_api(mvm))
1799+
iwl_mvm_enable_aux_snif_queue(mvm, &mvm->snif_queue,
1800+
mvm->snif_sta.sta_id,
1801+
IWL_MVM_TX_FIFO_BE);
1802+
1803+
return 0;
17791804
}
17801805

17811806
int iwl_mvm_rm_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
@@ -1784,6 +1809,8 @@ int iwl_mvm_rm_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
17841809

17851810
lockdep_assert_held(&mvm->mutex);
17861811

1812+
iwl_mvm_disable_txq(mvm, mvm->snif_queue, mvm->snif_queue,
1813+
IWL_MAX_TID_COUNT, 0);
17871814
ret = iwl_mvm_rm_sta_common(mvm, mvm->snif_sta.sta_id);
17881815
if (ret)
17891816
IWL_WARN(mvm, "Failed sending remove station\n");

drivers/net/wireless/intel/iwlwifi/mvm/time-event.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,24 @@ void iwl_mvm_roc_done_wk(struct work_struct *wk)
132132
* executed, and a new time event means a new command.
133133
*/
134134
iwl_mvm_flush_sta(mvm, &mvm->aux_sta, true, CMD_ASYNC);
135+
136+
/* Do the same for the P2P device queue (STA) */
137+
if (test_and_clear_bit(IWL_MVM_STATUS_NEED_FLUSH_P2P, &mvm->status)) {
138+
struct iwl_mvm_vif *mvmvif;
139+
140+
/*
141+
* NB: access to this pointer would be racy, but the flush bit
142+
* can only be set when we had a P2P-Device VIF, and we have a
143+
* flush of this work in iwl_mvm_prepare_mac_removal() so it's
144+
* not really racy.
145+
*/
146+
147+
if (!WARN_ON(!mvm->p2p_device_vif)) {
148+
mvmvif = iwl_mvm_vif_from_mac80211(mvm->p2p_device_vif);
149+
iwl_mvm_flush_sta(mvm, &mvmvif->bcast_sta, true,
150+
CMD_ASYNC);
151+
}
152+
}
135153
}
136154

137155
static void iwl_mvm_roc_finished(struct iwl_mvm *mvm)
@@ -855,10 +873,12 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm)
855873

856874
mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif);
857875

858-
if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE)
876+
if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE) {
859877
iwl_mvm_remove_time_event(mvm, mvmvif, te_data);
860-
else
878+
set_bit(IWL_MVM_STATUS_NEED_FLUSH_P2P, &mvm->status);
879+
} else {
861880
iwl_mvm_remove_aux_roc_te(mvm, mvmvif, te_data);
881+
}
862882

863883
iwl_mvm_roc_finished(mvm);
864884
}

drivers/net/wireless/intel/iwlwifi/mvm/tx.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,8 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
657657
if (ap_sta_id != IWL_MVM_INVALID_STA)
658658
sta_id = ap_sta_id;
659659
} else if (info.control.vif->type == NL80211_IFTYPE_MONITOR) {
660-
queue = mvm->aux_queue;
660+
queue = mvm->snif_queue;
661+
sta_id = mvm->snif_sta.sta_id;
661662
}
662663
}
663664

drivers/net/wireless/intel/iwlwifi/mvm/utils.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1134,9 +1134,18 @@ unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
11341134
unsigned int default_timeout =
11351135
cmd_q ? IWL_DEF_WD_TIMEOUT : mvm->cfg->base_params->wd_timeout;
11361136

1137-
if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_TXQ_TIMERS))
1137+
if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_TXQ_TIMERS)) {
1138+
/*
1139+
* We can't know when the station is asleep or awake, so we
1140+
* must disable the queue hang detection.
1141+
*/
1142+
if (fw_has_capa(&mvm->fw->ucode_capa,
1143+
IWL_UCODE_TLV_CAPA_STA_PM_NOTIF) &&
1144+
vif && vif->type == NL80211_IFTYPE_AP)
1145+
return IWL_WATCHDOG_DISABLED;
11381146
return iwlmvm_mod_params.tfd_q_hang_detect ?
11391147
default_timeout : IWL_WATCHDOG_DISABLED;
1148+
}
11401149

11411150
trigger = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_TXQ_TIMERS);
11421151
txq_timer = (void *)trigger->data;
@@ -1163,6 +1172,8 @@ unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
11631172
return le32_to_cpu(txq_timer->p2p_go);
11641173
case NL80211_IFTYPE_P2P_DEVICE:
11651174
return le32_to_cpu(txq_timer->p2p_device);
1175+
case NL80211_IFTYPE_MONITOR:
1176+
return default_timeout;
11661177
default:
11671178
WARN_ON(1);
11681179
return mvm->cfg->base_params->wd_timeout;

drivers/net/wireless/intel/iwlwifi/pcie/drv.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
553553
{IWL_PCI_DEVICE(0x271B, 0x0014, iwl9160_2ac_cfg)},
554554
{IWL_PCI_DEVICE(0x271B, 0x0210, iwl9160_2ac_cfg)},
555555
{IWL_PCI_DEVICE(0x271B, 0x0214, iwl9260_2ac_cfg)},
556+
{IWL_PCI_DEVICE(0x271C, 0x0214, iwl9260_2ac_cfg)},
556557
{IWL_PCI_DEVICE(0x2720, 0x0034, iwl9560_2ac_cfg)},
557558
{IWL_PCI_DEVICE(0x2720, 0x0038, iwl9560_2ac_cfg)},
558559
{IWL_PCI_DEVICE(0x2720, 0x003C, iwl9560_2ac_cfg)},
@@ -664,6 +665,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
664665
{IWL_PCI_DEVICE(0x2720, 0x0310, iwla000_2ac_cfg_hr_cdb)},
665666
{IWL_PCI_DEVICE(0x40C0, 0x0000, iwla000_2ax_cfg_hr)},
666667
{IWL_PCI_DEVICE(0x40C0, 0x0A10, iwla000_2ax_cfg_hr)},
668+
{IWL_PCI_DEVICE(0xA0F0, 0x0000, iwla000_2ax_cfg_hr)},
667669

668670
#endif /* CONFIG_IWLMVM */
669671

drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
*
5050
*****************************************************************************/
5151
#include "iwl-trans.h"
52+
#include "iwl-prph.h"
5253
#include "iwl-context-info.h"
5354
#include "internal.h"
5455

@@ -156,6 +157,11 @@ void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans, bool low_power)
156157

157158
trans_pcie->is_down = true;
158159

160+
/* Stop dbgc before stopping device */
161+
iwl_write_prph(trans, DBGC_IN_SAMPLE, 0);
162+
udelay(100);
163+
iwl_write_prph(trans, DBGC_OUT_CTRL, 0);
164+
159165
/* tell the device to stop sending interrupts */
160166
iwl_disable_interrupts(trans);
161167

0 commit comments

Comments
 (0)