Lines Matching refs:udev
174 struct rte_uio_pci_dev *udev = info->priv; in igbuio_pci_irqcontrol() local
175 struct pci_dev *pdev = udev->pdev; in igbuio_pci_irqcontrol()
178 struct irq_data *irq = irq_get_irq_data(udev->info.irq); in igbuio_pci_irqcontrol()
183 if (udev->mode == RTE_INTR_MODE_MSIX || udev->mode == RTE_INTR_MODE_MSI) { in igbuio_pci_irqcontrol()
190 igbuio_mask_irq(pdev, udev->mode, irq_state); in igbuio_pci_irqcontrol()
194 if (udev->mode == RTE_INTR_MODE_LEGACY) in igbuio_pci_irqcontrol()
209 struct rte_uio_pci_dev *udev = (struct rte_uio_pci_dev *)dev_id; in igbuio_pci_irqhandler() local
210 struct uio_info *info = &udev->info; in igbuio_pci_irqhandler()
213 if (udev->mode == RTE_INTR_MODE_LEGACY && in igbuio_pci_irqhandler()
214 !pci_check_and_mask_intx(udev->pdev)) in igbuio_pci_irqhandler()
224 igbuio_pci_enable_interrupts(struct rte_uio_pci_dev *udev) in igbuio_pci_enable_interrupts() argument
236 if (pci_enable_msix(udev->pdev, &msix_entry, 1) == 0) { in igbuio_pci_enable_interrupts()
237 dev_dbg(&udev->pdev->dev, "using MSI-X"); in igbuio_pci_enable_interrupts()
238 udev->info.irq_flags = IRQF_NO_THREAD; in igbuio_pci_enable_interrupts()
239 udev->info.irq = msix_entry.vector; in igbuio_pci_enable_interrupts()
240 udev->mode = RTE_INTR_MODE_MSIX; in igbuio_pci_enable_interrupts()
244 if (pci_alloc_irq_vectors(udev->pdev, 1, 1, PCI_IRQ_MSIX) == 1) { in igbuio_pci_enable_interrupts()
245 dev_dbg(&udev->pdev->dev, "using MSI-X"); in igbuio_pci_enable_interrupts()
246 udev->info.irq_flags = IRQF_NO_THREAD; in igbuio_pci_enable_interrupts()
247 udev->info.irq = pci_irq_vector(udev->pdev, 0); in igbuio_pci_enable_interrupts()
248 udev->mode = RTE_INTR_MODE_MSIX; in igbuio_pci_enable_interrupts()
256 if (pci_enable_msi(udev->pdev) == 0) { in igbuio_pci_enable_interrupts()
257 dev_dbg(&udev->pdev->dev, "using MSI"); in igbuio_pci_enable_interrupts()
258 udev->info.irq_flags = IRQF_NO_THREAD; in igbuio_pci_enable_interrupts()
259 udev->info.irq = udev->pdev->irq; in igbuio_pci_enable_interrupts()
260 udev->mode = RTE_INTR_MODE_MSI; in igbuio_pci_enable_interrupts()
264 if (pci_alloc_irq_vectors(udev->pdev, 1, 1, PCI_IRQ_MSI) == 1) { in igbuio_pci_enable_interrupts()
265 dev_dbg(&udev->pdev->dev, "using MSI"); in igbuio_pci_enable_interrupts()
266 udev->info.irq_flags = IRQF_NO_THREAD; in igbuio_pci_enable_interrupts()
267 udev->info.irq = pci_irq_vector(udev->pdev, 0); in igbuio_pci_enable_interrupts()
268 udev->mode = RTE_INTR_MODE_MSI; in igbuio_pci_enable_interrupts()
274 if (pci_intx_mask_supported(udev->pdev)) { in igbuio_pci_enable_interrupts()
275 dev_dbg(&udev->pdev->dev, "using INTX"); in igbuio_pci_enable_interrupts()
276 udev->info.irq_flags = IRQF_SHARED | IRQF_NO_THREAD; in igbuio_pci_enable_interrupts()
277 udev->info.irq = udev->pdev->irq; in igbuio_pci_enable_interrupts()
278 udev->mode = RTE_INTR_MODE_LEGACY; in igbuio_pci_enable_interrupts()
281 dev_notice(&udev->pdev->dev, "PCI INTX mask not supported\n"); in igbuio_pci_enable_interrupts()
284 udev->mode = RTE_INTR_MODE_NONE; in igbuio_pci_enable_interrupts()
285 udev->info.irq = UIO_IRQ_NONE; in igbuio_pci_enable_interrupts()
289 dev_err(&udev->pdev->dev, "invalid IRQ mode %u", in igbuio_pci_enable_interrupts()
291 udev->info.irq = UIO_IRQ_NONE; in igbuio_pci_enable_interrupts()
295 if (udev->info.irq != UIO_IRQ_NONE) in igbuio_pci_enable_interrupts()
296 err = request_irq(udev->info.irq, igbuio_pci_irqhandler, in igbuio_pci_enable_interrupts()
297 udev->info.irq_flags, udev->info.name, in igbuio_pci_enable_interrupts()
298 udev); in igbuio_pci_enable_interrupts()
299 dev_info(&udev->pdev->dev, "uio device registered with irq %ld\n", in igbuio_pci_enable_interrupts()
300 udev->info.irq); in igbuio_pci_enable_interrupts()
306 igbuio_pci_disable_interrupts(struct rte_uio_pci_dev *udev) in igbuio_pci_disable_interrupts() argument
308 if (udev->info.irq) { in igbuio_pci_disable_interrupts()
309 free_irq(udev->info.irq, udev); in igbuio_pci_disable_interrupts()
310 udev->info.irq = 0; in igbuio_pci_disable_interrupts()
314 if (udev->mode == RTE_INTR_MODE_MSIX) in igbuio_pci_disable_interrupts()
315 pci_disable_msix(udev->pdev); in igbuio_pci_disable_interrupts()
316 if (udev->mode == RTE_INTR_MODE_MSI) in igbuio_pci_disable_interrupts()
317 pci_disable_msi(udev->pdev); in igbuio_pci_disable_interrupts()
319 if (udev->mode == RTE_INTR_MODE_MSIX || in igbuio_pci_disable_interrupts()
320 udev->mode == RTE_INTR_MODE_MSI) in igbuio_pci_disable_interrupts()
321 pci_free_irq_vectors(udev->pdev); in igbuio_pci_disable_interrupts()
332 struct rte_uio_pci_dev *udev = info->priv; in igbuio_pci_open() local
333 struct pci_dev *dev = udev->pdev; in igbuio_pci_open()
336 if (atomic_inc_return(&udev->refcnt) != 1) in igbuio_pci_open()
343 err = igbuio_pci_enable_interrupts(udev); in igbuio_pci_open()
345 atomic_dec(&udev->refcnt); in igbuio_pci_open()
354 struct rte_uio_pci_dev *udev = info->priv; in igbuio_pci_release() local
355 struct pci_dev *dev = udev->pdev; in igbuio_pci_release()
357 if (atomic_dec_and_test(&udev->refcnt)) { in igbuio_pci_release()
359 igbuio_pci_disable_interrupts(udev); in igbuio_pci_release()
575 struct rte_uio_pci_dev *udev; in igbuio_pci_probe() local
588 udev = kzalloc(sizeof(struct rte_uio_pci_dev), GFP_KERNEL); in igbuio_pci_probe()
589 if (!udev) in igbuio_pci_probe()
606 err = igbuio_setup_bars(dev, &udev->info); in igbuio_pci_probe()
624 udev->info.name = "igb_uio"; in igbuio_pci_probe()
625 udev->info.version = "0.1"; in igbuio_pci_probe()
626 udev->info.irqcontrol = igbuio_pci_irqcontrol; in igbuio_pci_probe()
627 udev->info.open = igbuio_pci_open; in igbuio_pci_probe()
628 udev->info.release = igbuio_pci_release; in igbuio_pci_probe()
629 udev->info.priv = udev; in igbuio_pci_probe()
630 udev->pdev = dev; in igbuio_pci_probe()
631 atomic_set(&udev->refcnt, 0); in igbuio_pci_probe()
638 err = uio_register_device(&dev->dev, &udev->info); in igbuio_pci_probe()
642 pci_set_drvdata(dev, udev); in igbuio_pci_probe()
670 igbuio_pci_release_iomem(&udev->info); in igbuio_pci_probe()
673 kfree(udev); in igbuio_pci_probe()
681 struct rte_uio_pci_dev *udev = pci_get_drvdata(dev); in igbuio_pci_remove() local
683 igbuio_pci_release(&udev->info, NULL); in igbuio_pci_remove()
686 uio_unregister_device(&udev->info); in igbuio_pci_remove()
687 igbuio_pci_release_iomem(&udev->info); in igbuio_pci_remove()
690 kfree(udev); in igbuio_pci_remove()