@@ -1062,7 +1062,7 @@ struct iwl_causes_list {
1062
1062
u8 addr ;
1063
1063
};
1064
1064
1065
- static struct iwl_causes_list causes_list [] = {
1065
+ static const struct iwl_causes_list causes_list_common [] = {
1066
1066
{MSIX_FH_INT_CAUSES_D2S_CH0_NUM , CSR_MSIX_FH_INT_MASK_AD , 0 },
1067
1067
{MSIX_FH_INT_CAUSES_D2S_CH1_NUM , CSR_MSIX_FH_INT_MASK_AD , 0x1 },
1068
1068
{MSIX_FH_INT_CAUSES_S2D , CSR_MSIX_FH_INT_MASK_AD , 0x3 },
@@ -1073,30 +1073,50 @@ static struct iwl_causes_list causes_list[] = {
1073
1073
{MSIX_HW_INT_CAUSES_REG_CT_KILL , CSR_MSIX_HW_INT_MASK_AD , 0x16 },
1074
1074
{MSIX_HW_INT_CAUSES_REG_RF_KILL , CSR_MSIX_HW_INT_MASK_AD , 0x17 },
1075
1075
{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 },
1077
1076
{MSIX_HW_INT_CAUSES_REG_SCD , CSR_MSIX_HW_INT_MASK_AD , 0x2A },
1078
1077
{MSIX_HW_INT_CAUSES_REG_FH_TX , CSR_MSIX_HW_INT_MASK_AD , 0x2B },
1079
1078
{MSIX_HW_INT_CAUSES_REG_HW_ERR , CSR_MSIX_HW_INT_MASK_AD , 0x2D },
1080
1079
{MSIX_HW_INT_CAUSES_REG_HAP , CSR_MSIX_HW_INT_MASK_AD , 0x2E },
1081
1080
};
1082
1081
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
+
1083
1103
static void iwl_pcie_map_non_rx_causes (struct iwl_trans * trans )
1084
1104
{
1085
1105
struct iwl_trans_pcie * trans_pcie = IWL_TRANS_GET_PCIE_TRANS (trans );
1086
1106
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
-
1090
1107
/*
1091
1108
* Access all non RX causes and map them to the default irq.
1092
1109
* In case we are missing at least one interrupt vector,
1093
1110
* the first interrupt vector will serve non-RX and FBQ causes.
1094
1111
*/
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 );
1100
1120
}
1101
1121
1102
1122
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)
3384
3404
3385
3405
if (trans_pcie -> msix_enabled ) {
3386
3406
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 ;
3388
3411
} else {
3389
3412
inta_addr = CSR_INT ;
3390
3413
sw_err_bit = CSR_INT_BIT_SW_ERR ;
0 commit comments