|
@@ -1152,13 +1152,19 @@ static void iwl_pcie_conf_msix_hw(struct iwl_trans_pcie *trans_pcie)
|
|
struct iwl_trans *trans = trans_pcie->trans;
|
|
struct iwl_trans *trans = trans_pcie->trans;
|
|
|
|
|
|
if (!trans_pcie->msix_enabled) {
|
|
if (!trans_pcie->msix_enabled) {
|
|
- if (trans->cfg->mq_rx_supported)
|
|
|
|
|
|
+ if (trans->cfg->mq_rx_supported &&
|
|
|
|
+ test_bit(STATUS_DEVICE_ENABLED, &trans->status))
|
|
iwl_write_prph(trans, UREG_CHICK,
|
|
iwl_write_prph(trans, UREG_CHICK,
|
|
UREG_CHICK_MSI_ENABLE);
|
|
UREG_CHICK_MSI_ENABLE);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
|
|
- iwl_write_prph(trans, UREG_CHICK, UREG_CHICK_MSIX_ENABLE);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * The IVAR table needs to be configured again after reset,
|
|
|
|
+ * but if the device is disabled, we can't write to
|
|
|
|
+ * prph.
|
|
|
|
+ */
|
|
|
|
+ if (test_bit(STATUS_DEVICE_ENABLED, &trans->status))
|
|
|
|
+ iwl_write_prph(trans, UREG_CHICK, UREG_CHICK_MSIX_ENABLE);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Each cause from the causes list above and the RX causes is
|
|
* Each cause from the causes list above and the RX causes is
|
|
@@ -1457,6 +1463,7 @@ static int iwl_trans_pcie_d3_resume(struct iwl_trans *trans,
|
|
enum iwl_d3_status *status,
|
|
enum iwl_d3_status *status,
|
|
bool test, bool reset)
|
|
bool test, bool reset)
|
|
{
|
|
{
|
|
|
|
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
|
u32 val;
|
|
u32 val;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
@@ -1469,11 +1476,15 @@ static int iwl_trans_pcie_d3_resume(struct iwl_trans *trans,
|
|
iwl_pcie_enable_rx_wake(trans, true);
|
|
iwl_pcie_enable_rx_wake(trans, true);
|
|
|
|
|
|
/*
|
|
/*
|
|
- * Also enables interrupts - none will happen as the device doesn't
|
|
|
|
- * know we're waking it up, only when the opmode actually tells it
|
|
|
|
- * after this call.
|
|
|
|
|
|
+ * Reconfigure IVAR table in case of MSIX or reset ict table in
|
|
|
|
+ * MSI mode since HW reset erased it.
|
|
|
|
+ * Also enables interrupts - none will happen as
|
|
|
|
+ * the device doesn't know we're waking it up, only when
|
|
|
|
+ * the opmode actually tells it after this call.
|
|
*/
|
|
*/
|
|
- iwl_pcie_reset_ict(trans);
|
|
|
|
|
|
+ iwl_pcie_conf_msix_hw(trans_pcie);
|
|
|
|
+ if (!trans_pcie->msix_enabled)
|
|
|
|
+ iwl_pcie_reset_ict(trans);
|
|
iwl_enable_interrupts(trans);
|
|
iwl_enable_interrupts(trans);
|
|
|
|
|
|
iwl_set_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
|
iwl_set_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|