aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ice/ice_main.c
diff options
context:
space:
mode:
authorMichal Swiatkowski <michal.swiatkowski@intel.com>2019-04-16 13:21:14 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2019-05-04 16:42:53 -0400
commita52db6b2601f9904ce7fc4b32537823e5c1eb9ef (patch)
tree550ec91e854bb7a7a20baee39e97f77c75331d2f /drivers/net/ethernet/intel/ice/ice_main.c
parent819d899863dc019e5e5fff869578b056a93e35db (diff)
ice: Fix for allowing too many MDD events on VF
Disable VF if any malicious device driver (MDD) event is detected by hardware. Track vf->num_mdd_events for information about VF MDD events. Signed-off-by: Michal Swiatkowski <michal.swiatkowski@intel.com> Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_main.c')
-rw-r--r--drivers/net/ethernet/intel/ice/ice_main.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 6b27be93bdf5..2352b4129a62 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -1185,10 +1185,12 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
1185 for (i = 0; i < pf->num_alloc_vfs && mdd_detected; i++) { 1185 for (i = 0; i < pf->num_alloc_vfs && mdd_detected; i++) {
1186 struct ice_vf *vf = &pf->vf[i]; 1186 struct ice_vf *vf = &pf->vf[i];
1187 1187
1188 mdd_detected = false;
1189
1188 reg = rd32(hw, VP_MDET_TX_PQM(i)); 1190 reg = rd32(hw, VP_MDET_TX_PQM(i));
1189 if (reg & VP_MDET_TX_PQM_VALID_M) { 1191 if (reg & VP_MDET_TX_PQM_VALID_M) {
1190 wr32(hw, VP_MDET_TX_PQM(i), 0xFFFF); 1192 wr32(hw, VP_MDET_TX_PQM(i), 0xFFFF);
1191 vf->num_mdd_events++; 1193 mdd_detected = true;
1192 dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", 1194 dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n",
1193 i); 1195 i);
1194 } 1196 }
@@ -1196,7 +1198,7 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
1196 reg = rd32(hw, VP_MDET_TX_TCLAN(i)); 1198 reg = rd32(hw, VP_MDET_TX_TCLAN(i));
1197 if (reg & VP_MDET_TX_TCLAN_VALID_M) { 1199 if (reg & VP_MDET_TX_TCLAN_VALID_M) {
1198 wr32(hw, VP_MDET_TX_TCLAN(i), 0xFFFF); 1200 wr32(hw, VP_MDET_TX_TCLAN(i), 0xFFFF);
1199 vf->num_mdd_events++; 1201 mdd_detected = true;
1200 dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", 1202 dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n",
1201 i); 1203 i);
1202 } 1204 }
@@ -1204,7 +1206,7 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
1204 reg = rd32(hw, VP_MDET_TX_TDPU(i)); 1206 reg = rd32(hw, VP_MDET_TX_TDPU(i));
1205 if (reg & VP_MDET_TX_TDPU_VALID_M) { 1207 if (reg & VP_MDET_TX_TDPU_VALID_M) {
1206 wr32(hw, VP_MDET_TX_TDPU(i), 0xFFFF); 1208 wr32(hw, VP_MDET_TX_TDPU(i), 0xFFFF);
1207 vf->num_mdd_events++; 1209 mdd_detected = true;
1208 dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", 1210 dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n",
1209 i); 1211 i);
1210 } 1212 }
@@ -1212,14 +1214,13 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
1212 reg = rd32(hw, VP_MDET_RX(i)); 1214 reg = rd32(hw, VP_MDET_RX(i));
1213 if (reg & VP_MDET_RX_VALID_M) { 1215 if (reg & VP_MDET_RX_VALID_M) {
1214 wr32(hw, VP_MDET_RX(i), 0xFFFF); 1216 wr32(hw, VP_MDET_RX(i), 0xFFFF);
1215 vf->num_mdd_events++; 1217 mdd_detected = true;
1216 dev_info(&pf->pdev->dev, "RX driver issue detected on VF %d\n", 1218 dev_info(&pf->pdev->dev, "RX driver issue detected on VF %d\n",
1217 i); 1219 i);
1218 } 1220 }
1219 1221
1220 if (vf->num_mdd_events > ICE_DFLT_NUM_MDD_EVENTS_ALLOWED) { 1222 if (mdd_detected) {
1221 dev_info(&pf->pdev->dev, 1223 vf->num_mdd_events++;
1222 "Too many MDD events on VF %d, disabled\n", i);
1223 dev_info(&pf->pdev->dev, 1224 dev_info(&pf->pdev->dev,
1224 "Use PF Control I/F to re-enable the VF\n"); 1225 "Use PF Control I/F to re-enable the VF\n");
1225 set_bit(ICE_VF_STATE_DIS, vf->vf_states); 1226 set_bit(ICE_VF_STATE_DIS, vf->vf_states);