|
@@ -5827,6 +5827,7 @@ static void i40e_handle_mdd_event(struct i40e_pf *pf)
|
|
|
{
|
|
|
struct i40e_hw *hw = &pf->hw;
|
|
|
bool mdd_detected = false;
|
|
|
+ bool pf_mdd_detected = false;
|
|
|
struct i40e_vf *vf;
|
|
|
u32 reg;
|
|
|
int i;
|
|
@@ -5866,6 +5867,30 @@ static void i40e_handle_mdd_event(struct i40e_pf *pf)
|
|
|
mdd_detected = true;
|
|
|
}
|
|
|
|
|
|
+ if (mdd_detected) {
|
|
|
+ reg = rd32(hw, I40E_PF_MDET_TX);
|
|
|
+ if (reg & I40E_PF_MDET_TX_VALID_MASK) {
|
|
|
+ wr32(hw, I40E_PF_MDET_TX, 0xFFFF);
|
|
|
+ dev_info(&pf->pdev->dev,
|
|
|
+ "MDD TX event is for this function 0x%08x, requesting PF reset.\n",
|
|
|
+ reg);
|
|
|
+ pf_mdd_detected = true;
|
|
|
+ }
|
|
|
+ reg = rd32(hw, I40E_PF_MDET_RX);
|
|
|
+ if (reg & I40E_PF_MDET_RX_VALID_MASK) {
|
|
|
+ wr32(hw, I40E_PF_MDET_RX, 0xFFFF);
|
|
|
+ dev_info(&pf->pdev->dev,
|
|
|
+ "MDD RX event is for this function 0x%08x, requesting PF reset.\n",
|
|
|
+ reg);
|
|
|
+ pf_mdd_detected = true;
|
|
|
+ }
|
|
|
+ /* Queue belongs to the PF, initiate a reset */
|
|
|
+ if (pf_mdd_detected) {
|
|
|
+ set_bit(__I40E_PF_RESET_REQUESTED, &pf->state);
|
|
|
+ i40e_service_event_schedule(pf);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/* see if one of the VFs needs its hand slapped */
|
|
|
for (i = 0; i < pf->num_alloc_vfs && mdd_detected; i++) {
|
|
|
vf = &(pf->vf[i]);
|