- struct bnxt_irq *irq;
-
- irq = bp->irq_tbl;
- if (irq) {
- if (irq->requested) {
- rte_intr_disable(&bp->pdev->intr_handle);
- rte_intr_callback_unregister(&bp->pdev->intr_handle,
- irq->handler,
- (void *)bp->eth_dev);
- irq->requested = 0;
+ struct rte_intr_handle *intr_handle = &bp->pdev->intr_handle;
+ struct bnxt_irq *irq = bp->irq_tbl;
+ int rc = 0;
+
+ if (!irq)
+ return 0;
+
+ if (irq->requested) {
+ int count = 0;
+
+ /*
+ * Callback deregistration will fail with rc -EAGAIN if the
+ * callback is currently active. Retry every 50 ms until
+ * successful or 500 ms has elapsed.
+ */
+ do {
+ rc = rte_intr_callback_unregister(intr_handle,
+ irq->handler,
+ bp->eth_dev);
+ if (rc >= 0) {
+ irq->requested = 0;
+ break;
+ }
+ rte_delay_ms(50);
+ } while (count++ < 10);
+
+ if (rc < 0) {
+ PMD_DRV_LOG(ERR, "irq cb unregister failed rc: %d\n",
+ rc);
+ return rc;