Skip to content

Commit 571836a

Browse files
mgolantlucacoelho
authored andcommitted
iwlwifi: pcie: update sw error interrupt for BZ family
The cause for sw error in BZ device family was changed Signed-off-by: Mike Golant <[email protected]> Signed-off-by: Luca Coelho <[email protected]> Link: https://lore.kernel.org/r/iwlwifi.20211024165252.f674cd409b8e.I519f554d0a22d4711077785ec2bd7c564997241f@changeid Signed-off-by: Luca Coelho <[email protected]>
1 parent f06bc8a commit 571836a

File tree

3 files changed

+42
-13
lines changed

3 files changed

+42
-13
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,7 @@ enum msix_hw_int_causes {
605605
MSIX_HW_INT_CAUSES_REG_WAKEUP = BIT(1),
606606
MSIX_HW_INT_CAUSES_REG_IML = BIT(1),
607607
MSIX_HW_INT_CAUSES_REG_RESET_DONE = BIT(2),
608+
MSIX_HW_INT_CAUSES_REG_SW_ERR_BZ = BIT(5),
608609
MSIX_HW_INT_CAUSES_REG_CT_KILL = BIT(6),
609610
MSIX_HW_INT_CAUSES_REG_RF_KILL = BIT(7),
610611
MSIX_HW_INT_CAUSES_REG_PERIODIC = BIT(8),

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2149,6 +2149,7 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void *dev_id)
21492149
u32 inta_fh_msk = ~MSIX_FH_INT_CAUSES_DATA_QUEUE;
21502150
u32 inta_fh, inta_hw;
21512151
bool polling = false;
2152+
bool sw_err;
21522153

21532154
if (trans_pcie->shared_vec_mask & IWL_SHARED_IRQ_NON_RX)
21542155
inta_fh_msk |= MSIX_FH_INT_CAUSES_Q0;
@@ -2221,9 +2222,13 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void *dev_id)
22212222
wake_up(&trans_pcie->ucode_write_waitq);
22222223
}
22232224

2225+
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_BZ)
2226+
sw_err = inta_hw & MSIX_HW_INT_CAUSES_REG_SW_ERR_BZ;
2227+
else
2228+
sw_err = inta_hw & MSIX_HW_INT_CAUSES_REG_SW_ERR;
2229+
22242230
/* Error detected by uCode */
2225-
if ((inta_fh & MSIX_FH_INT_CAUSES_FH_ERR) ||
2226-
(inta_hw & MSIX_HW_INT_CAUSES_REG_SW_ERR)) {
2231+
if ((inta_fh & MSIX_FH_INT_CAUSES_FH_ERR) || sw_err) {
22272232
IWL_ERR(trans,
22282233
"Microcode SW error detected. Restarting 0x%X.\n",
22292234
inta_fh);

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

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,7 +1062,7 @@ struct iwl_causes_list {
10621062
u8 addr;
10631063
};
10641064

1065-
static struct iwl_causes_list causes_list[] = {
1065+
static const struct iwl_causes_list causes_list_common[] = {
10661066
{MSIX_FH_INT_CAUSES_D2S_CH0_NUM, CSR_MSIX_FH_INT_MASK_AD, 0},
10671067
{MSIX_FH_INT_CAUSES_D2S_CH1_NUM, CSR_MSIX_FH_INT_MASK_AD, 0x1},
10681068
{MSIX_FH_INT_CAUSES_S2D, CSR_MSIX_FH_INT_MASK_AD, 0x3},
@@ -1073,30 +1073,50 @@ static struct iwl_causes_list causes_list[] = {
10731073
{MSIX_HW_INT_CAUSES_REG_CT_KILL, CSR_MSIX_HW_INT_MASK_AD, 0x16},
10741074
{MSIX_HW_INT_CAUSES_REG_RF_KILL, CSR_MSIX_HW_INT_MASK_AD, 0x17},
10751075
{MSIX_HW_INT_CAUSES_REG_PERIODIC, CSR_MSIX_HW_INT_MASK_AD, 0x18},
1076-
{MSIX_HW_INT_CAUSES_REG_SW_ERR, CSR_MSIX_HW_INT_MASK_AD, 0x29},
10771076
{MSIX_HW_INT_CAUSES_REG_SCD, CSR_MSIX_HW_INT_MASK_AD, 0x2A},
10781077
{MSIX_HW_INT_CAUSES_REG_FH_TX, CSR_MSIX_HW_INT_MASK_AD, 0x2B},
10791078
{MSIX_HW_INT_CAUSES_REG_HW_ERR, CSR_MSIX_HW_INT_MASK_AD, 0x2D},
10801079
{MSIX_HW_INT_CAUSES_REG_HAP, CSR_MSIX_HW_INT_MASK_AD, 0x2E},
10811080
};
10821081

1082+
static const struct iwl_causes_list causes_list_pre_bz[] = {
1083+
{MSIX_HW_INT_CAUSES_REG_SW_ERR, CSR_MSIX_HW_INT_MASK_AD, 0x29},
1084+
};
1085+
1086+
static const struct iwl_causes_list causes_list_bz[] = {
1087+
{MSIX_HW_INT_CAUSES_REG_SW_ERR_BZ, CSR_MSIX_HW_INT_MASK_AD, 0x29},
1088+
};
1089+
1090+
static void iwl_pcie_map_list(struct iwl_trans *trans,
1091+
const struct iwl_causes_list *causes,
1092+
int arr_size, int val)
1093+
{
1094+
int i;
1095+
1096+
for (i = 0; i < arr_size; i++) {
1097+
iwl_write8(trans, CSR_MSIX_IVAR(causes[i].addr), val);
1098+
iwl_clear_bit(trans, causes[i].mask_reg,
1099+
causes[i].cause_num);
1100+
}
1101+
}
1102+
10831103
static void iwl_pcie_map_non_rx_causes(struct iwl_trans *trans)
10841104
{
10851105
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
10861106
int val = trans_pcie->def_irq | MSIX_NON_AUTO_CLEAR_CAUSE;
1087-
int i, arr_size = ARRAY_SIZE(causes_list);
1088-
struct iwl_causes_list *causes = causes_list;
1089-
10901107
/*
10911108
* Access all non RX causes and map them to the default irq.
10921109
* In case we are missing at least one interrupt vector,
10931110
* the first interrupt vector will serve non-RX and FBQ causes.
10941111
*/
1095-
for (i = 0; i < arr_size; i++) {
1096-
iwl_write8(trans, CSR_MSIX_IVAR(causes[i].addr), val);
1097-
iwl_clear_bit(trans, causes[i].mask_reg,
1098-
causes[i].cause_num);
1099-
}
1112+
iwl_pcie_map_list(trans, causes_list_common,
1113+
ARRAY_SIZE(causes_list_common), val);
1114+
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_BZ)
1115+
iwl_pcie_map_list(trans, causes_list_bz,
1116+
ARRAY_SIZE(causes_list_bz), val);
1117+
else
1118+
iwl_pcie_map_list(trans, causes_list_pre_bz,
1119+
ARRAY_SIZE(causes_list_pre_bz), val);
11001120
}
11011121

11021122
static void iwl_pcie_map_rx_causes(struct iwl_trans *trans)
@@ -3384,7 +3404,10 @@ static void iwl_trans_pcie_sync_nmi(struct iwl_trans *trans)
33843404

33853405
if (trans_pcie->msix_enabled) {
33863406
inta_addr = CSR_MSIX_HW_INT_CAUSES_AD;
3387-
sw_err_bit = MSIX_HW_INT_CAUSES_REG_SW_ERR;
3407+
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_BZ)
3408+
sw_err_bit = MSIX_HW_INT_CAUSES_REG_SW_ERR_BZ;
3409+
else
3410+
sw_err_bit = MSIX_HW_INT_CAUSES_REG_SW_ERR;
33883411
} else {
33893412
inta_addr = CSR_INT;
33903413
sw_err_bit = CSR_INT_BIT_SW_ERR;

0 commit comments

Comments
 (0)