|
@@ -138,6 +138,12 @@ void ehea_dump(void *adr, int len, char *msg)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void ehea_schedule_port_reset(struct ehea_port *port)
|
|
|
+{
|
|
|
+ if (!test_bit(__EHEA_DISABLE_PORT_RESET, &port->flags))
|
|
|
+ schedule_work(&port->reset_task);
|
|
|
+}
|
|
|
+
|
|
|
static void ehea_update_firmware_handles(void)
|
|
|
{
|
|
|
struct ehea_fw_handle_entry *arr = NULL;
|
|
@@ -588,7 +594,7 @@ static int ehea_treat_poll_error(struct ehea_port_res *pr, int rq,
|
|
|
"Resetting port.", pr->qp->init_attr.qp_nr);
|
|
|
ehea_dump(cqe, sizeof(*cqe), "CQE");
|
|
|
}
|
|
|
- schedule_work(&pr->port->reset_task);
|
|
|
+ ehea_schedule_port_reset(pr->port);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -766,7 +772,7 @@ static struct ehea_cqe *ehea_proc_cqes(struct ehea_port_res *pr, int my_quota)
|
|
|
ehea_error("Send Completion Error: Resetting port");
|
|
|
if (netif_msg_tx_err(pr->port))
|
|
|
ehea_dump(cqe, sizeof(*cqe), "Send CQE");
|
|
|
- schedule_work(&pr->port->reset_task);
|
|
|
+ ehea_schedule_port_reset(pr->port);
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -886,7 +892,7 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param)
|
|
|
eqe = ehea_poll_eq(port->qp_eq);
|
|
|
}
|
|
|
|
|
|
- schedule_work(&port->reset_task);
|
|
|
+ ehea_schedule_port_reset(port);
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
@@ -2606,13 +2612,14 @@ static int ehea_stop(struct net_device *dev)
|
|
|
if (netif_msg_ifdown(port))
|
|
|
ehea_info("disabling port %s", dev->name);
|
|
|
|
|
|
+ set_bit(__EHEA_DISABLE_PORT_RESET, &port->flags);
|
|
|
cancel_work_sync(&port->reset_task);
|
|
|
-
|
|
|
mutex_lock(&port->port_lock);
|
|
|
netif_stop_queue(dev);
|
|
|
port_napi_disable(port);
|
|
|
ret = ehea_down(dev);
|
|
|
mutex_unlock(&port->port_lock);
|
|
|
+ clear_bit(__EHEA_DISABLE_PORT_RESET, &port->flags);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -2942,7 +2949,7 @@ static void ehea_tx_watchdog(struct net_device *dev)
|
|
|
|
|
|
if (netif_carrier_ok(dev) &&
|
|
|
!test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))
|
|
|
- schedule_work(&port->reset_task);
|
|
|
+ ehea_schedule_port_reset(port);
|
|
|
}
|
|
|
|
|
|
int ehea_sense_adapter_attr(struct ehea_adapter *adapter)
|