How to request irq for ep device?

In jetson sdk 32.5,
drivers/pci/endpoint/functions/pci-epf-tegra-vnet.c file uses polling for dma write completed as follows:

dma_common_wr8(tvnet->dma_base, DMA_WR_DATA_CH, DMA_WRITE_DOORBELL_OFF);             |                   ((transfer->dst_iova_addr >> 32) & 0xFFFFFFFF),
    desc_cnt->wr_cnt++;                                                                  |                   DMA_DAR_HIGH_OFF_WRCH);
    while (true) {                                                                       |    /* ring the door bell with channel number */
        val = dma_common_rd(tvnet->dma_base, DMA_WRITE_INT_STATUS_OFF);                  |    ep_dma_common_wr8(rc_xdma->dma_base, channel, DMA_WRITE_DOORBELL_OFF);
        if (val == BIT(DMA_WR_DATA_CH)) {                                                |
            dma_common_wr(tvnet->dma_base, val,                                          |    now = jiffies;
                      DMA_WRITE_INT_CLEAR_OFF);                                          |    while (true) {
            break;                                                                       |        val = ep_dma_common_rd(rc_xdma->dma_base, DMA_WRITE_INT_STATUS_OFF);
        }                                                                                |        if (BIT(channel) & val) {
        if (time_after(jiffies, timeout)) {                                              |            ep_dma_common_wr(rc_xdma->dma_base, val, DMA_WRITE_INT_CLEAR_OFF);
            dev_err(fdev, "dma took more time, reset dma engine\n");                     |            break;
            dma_common_wr(tvnet->dma_base,                                               |        }
                      DMA_WRITE_ENGINE_EN_OFF_DISABLE,                                   |
                      DMA_WRITE_ENGINE_EN_OFF);                                          |        if (time_after(jiffies, now + timeout)) {
            mdelay(1);                                                                   |            pr_err("DMA write timed out & poll end\n");
            dma_common_wr(tvnet->dma_base,                                               |            ep_dma_common_wr(rc_xdma->dma_base, DMA_WRITE_ENGINE_EN_OFF_DISABLE,
                      DMA_WRITE_ENGINE_EN_OFF_ENABLE,                                    |                      DMA_WRITE_ENGINE_EN_OFF);
                      DMA_WRITE_ENGINE_EN_OFF);                                          |            mdelay(1);
            desc_cnt->wr_cnt--;                                                          |            ep_dma_common_wr(rc_xdma->dma_base, DMA_WRITE_ENGINE_EN_OFF_ENABLE,
            pci_epc_unmap_addr(epc, tvnet->tx_dst_pci_addr);                             |                      DMA_WRITE_ENGINE_EN_OFF);
            dma_unmap_single(cdev, src_iova, len, DMA_TO_DEVICE);                        |            return -ETIMEDOUT;
            return NETDEV_TX_BUSY;                                                       |        }
        }                                                                                |    }

But I want to use interrupt by request_irq method instead of polling. What I should do to relize it?

We are using NAPI for better performance, hence you may see the polling logic. But, it is not pure polling, rather a hybrid way of using interrupts and polling.
Any specific reason why you want to use interrupts only? (which gives lesser performance compared to NAPI)

Hi, vidyas,

I’m sorry to response to you so late.
I don’t understand what you mean. We judge whether the data transmission is completed by polling DMA_WRITE_INT_STATUS_OFF register. Is it related to interruption?

The problem of polling DMA_WRITE_INT_STATUS_OFF register is that cpu utilization reaches 99%.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.