| 1538 | } |
| 1539 | |
| 1540 | int |
| 1541 | dev_fini(struct dev *dev, struct plt_pci_device *pci_dev) |
| 1542 | { |
| 1543 | struct plt_intr_handle *intr_handle = pci_dev->intr_handle; |
| 1544 | struct mbox *mbox; |
| 1545 | |
| 1546 | /* Check if this dev hosts npalf and has 1+ refs */ |
| 1547 | if (idev_npa_lf_active(dev) > 1) |
| 1548 | return -EAGAIN; |
| 1549 | |
| 1550 | /* Exiting the mbox sync thread */ |
| 1551 | if (dev->sync.start_thread) { |
| 1552 | dev->sync.start_thread = false; |
| 1553 | pthread_cond_signal(&dev->sync.pfvf_msg_cond); |
| 1554 | plt_thread_join(dev->sync.pfvf_msg_thread, NULL); |
| 1555 | pthread_mutex_destroy(&dev->sync.mutex); |
| 1556 | pthread_cond_destroy(&dev->sync.pfvf_msg_cond); |
| 1557 | } |
| 1558 | |
| 1559 | /* Clear references to this pci dev */ |
| 1560 | npa_lf_fini(); |
| 1561 | |
| 1562 | /* Releasing memory allocated for lmt region */ |
| 1563 | if (dev->lmt_mz) |
| 1564 | plt_memzone_free(dev->lmt_mz); |
| 1565 | |
| 1566 | dev_mbox_unregister_irq(pci_dev, dev); |
| 1567 | |
| 1568 | if (!dev_is_vf(dev)) |
| 1569 | dev_vf_flr_unregister_irqs(pci_dev, dev); |
| 1570 | /* Release PF - VF */ |
| 1571 | mbox = &dev->mbox_vfpf; |
| 1572 | if (mbox->hwbase && mbox->dev) |
| 1573 | dev_vf_mbase_put(pci_dev, mbox->hwbase); |
| 1574 | |
| 1575 | if (dev->ops) |
| 1576 | plt_free(dev->ops); |
| 1577 | |
| 1578 | mbox_fini(mbox); |
| 1579 | mbox = &dev->mbox_vfpf_up; |
| 1580 | mbox_fini(mbox); |
| 1581 | |
| 1582 | /* Release PF - AF */ |
| 1583 | mbox = dev->mbox; |
| 1584 | mbox_fini(mbox); |
| 1585 | mbox = &dev->mbox_up; |
| 1586 | mbox_fini(mbox); |
| 1587 | dev->mbox_active = 0; |
| 1588 | |
| 1589 | /* Disable MSIX vectors */ |
| 1590 | dev_irqs_disable(intr_handle); |
| 1591 | return 0; |
| 1592 | } |
no test coverage detected