Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linuxkpi/common/include/linux/interrupt.h
Show All 31 Lines | |||||
#define _LINUX_INTERRUPT_H_ | #define _LINUX_INTERRUPT_H_ | ||||
#include <linux/cpu.h> | #include <linux/cpu.h> | ||||
#include <linux/device.h> | #include <linux/device.h> | ||||
#include <linux/pci.h> | #include <linux/pci.h> | ||||
#include <linux/irqreturn.h> | #include <linux/irqreturn.h> | ||||
#include <linux/hardirq.h> | #include <linux/hardirq.h> | ||||
#include <sys/param.h> | |||||
#include <sys/bus.h> | #include <sys/bus.h> | ||||
#include <sys/rman.h> | #include <sys/rman.h> | ||||
#include <sys/interrupt.h> | #include <sys/interrupt.h> | ||||
typedef irqreturn_t (*irq_handler_t)(int, void *); | typedef irqreturn_t (*irq_handler_t)(int, void *); | ||||
#define IRQF_SHARED RF_SHAREABLE | #define IRQF_SHARED RF_SHAREABLE | ||||
struct irq_ent { | struct irq_ent { | ||||
struct list_head links; | struct list_head links; | ||||
struct device *dev; | struct device *dev; | ||||
struct resource *res; | struct resource *res; | ||||
void *arg; | void *arg; | ||||
irqreturn_t (*handler)(int, void *); | irqreturn_t (*handler)(int, void *); | ||||
irqreturn_t (*thread_handler)(int, void *); | |||||
void *tag; | void *tag; | ||||
unsigned int irq; | unsigned int irq; | ||||
}; | }; | ||||
void linux_irq_handler(void *); | |||||
void lkpi_devm_irq_release(struct device *, void *); | |||||
void lkpi_irq_release(struct device *, struct irq_ent *); | |||||
static inline int | static inline int | ||||
linux_irq_rid(struct device *dev, unsigned int irq) | linux_irq_rid(struct device *dev, unsigned int irq) | ||||
{ | { | ||||
/* check for MSI- or MSIX- interrupt */ | /* check for MSI- or MSIX- interrupt */ | ||||
if (irq >= dev->irq_start && irq < dev->irq_end) | if (irq >= dev->irq_start && irq < dev->irq_end) | ||||
return (irq - dev->irq_start + 1); | return (irq - dev->irq_start + 1); | ||||
else | else | ||||
return (0); | return (0); | ||||
} | } | ||||
extern void linux_irq_handler(void *); | |||||
static inline struct irq_ent * | static inline struct irq_ent * | ||||
linux_irq_ent(struct device *dev, unsigned int irq) | linux_irq_ent(struct device *dev, unsigned int irq) | ||||
{ | { | ||||
struct irq_ent *irqe; | struct irq_ent *irqe; | ||||
list_for_each_entry(irqe, &dev->irqents, links) | list_for_each_entry(irqe, &dev->irqents, links) | ||||
if (irqe->irq == irq) | if (irqe->irq == irq) | ||||
return (irqe); | return (irqe); | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
static inline int | static inline int | ||||
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, | _request_irq(struct device *xdev, unsigned int irq, | ||||
const char *name, void *arg) | irq_handler_t handler, irq_handler_t thread_handler, | ||||
unsigned long flags, const char *name, void *arg) | |||||
{ | { | ||||
struct resource *res; | struct resource *res; | ||||
struct irq_ent *irqe; | struct irq_ent *irqe; | ||||
struct device *dev; | struct device *dev; | ||||
int error; | int error; | ||||
int rid; | int rid; | ||||
dev = linux_pci_find_irq_dev(irq); | dev = linux_pci_find_irq_dev(irq); | ||||
if (dev == NULL) | if (dev == NULL) | ||||
return -ENXIO; | return -ENXIO; | ||||
if (xdev != NULL && xdev != dev) | |||||
return -ENXIO; | |||||
rid = linux_irq_rid(dev, irq); | rid = linux_irq_rid(dev, irq); | ||||
res = bus_alloc_resource_any(dev->bsddev, SYS_RES_IRQ, &rid, | res = bus_alloc_resource_any(dev->bsddev, SYS_RES_IRQ, &rid, | ||||
flags | RF_ACTIVE); | flags | RF_ACTIVE); | ||||
if (res == NULL) | if (res == NULL) | ||||
return (-ENXIO); | return (-ENXIO); | ||||
irqe = kmalloc(sizeof(*irqe), GFP_KERNEL); | if (xdev != NULL) | ||||
irqe = lkpi_devres_alloc(lkpi_devm_irq_release, sizeof(*irqe), | |||||
GFP_KERNEL | __GFP_ZERO); | |||||
else | |||||
irqe = kzalloc(sizeof(*irqe), GFP_KERNEL); | |||||
irqe->dev = dev; | irqe->dev = dev; | ||||
irqe->res = res; | irqe->res = res; | ||||
irqe->arg = arg; | irqe->arg = arg; | ||||
irqe->handler = handler; | irqe->handler = handler; | ||||
irqe->thread_handler = thread_handler; | |||||
irqe->irq = irq; | irqe->irq = irq; | ||||
error = bus_setup_intr(dev->bsddev, res, INTR_TYPE_NET | INTR_MPSAFE, | error = bus_setup_intr(dev->bsddev, res, INTR_TYPE_NET | INTR_MPSAFE, | ||||
NULL, linux_irq_handler, irqe, &irqe->tag); | NULL, linux_irq_handler, irqe, &irqe->tag); | ||||
if (error) { | if (error) | ||||
goto errout; | |||||
list_add(&irqe->links, &dev->irqents); | |||||
hselasky: Please just use the default naming here. I.E. no call to bus_describe_intr(). The describe… | |||||
Done Inline ActionsThat was a pain for other drivers but I am game changing this for now. Update coming in a minute. bz: That was a pain for other drivers but I am game changing this for now. Update coming in a… | |||||
if (xdev != NULL) | |||||
devres_add(xdev, irqe); | |||||
return 0; | |||||
errout: | |||||
bus_release_resource(dev->bsddev, SYS_RES_IRQ, rid, irqe->res); | bus_release_resource(dev->bsddev, SYS_RES_IRQ, rid, irqe->res); | ||||
if (xdev != NULL) | |||||
devres_free(irqe); | |||||
else | |||||
kfree(irqe); | kfree(irqe); | ||||
return (-error); | return (-error); | ||||
} | } | ||||
list_add(&irqe->links, &dev->irqents); | |||||
return 0; | static inline int | ||||
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, | |||||
const char *name, void *arg) | |||||
{ | |||||
return (_request_irq(NULL, irq, handler, NULL, flags, name, arg)); | |||||
} | } | ||||
static inline int | static inline int | ||||
request_threaded_irq(int irq, irq_handler_t handler, | |||||
irq_handler_t thread_handler, unsigned long flags, | |||||
const char *name, void *arg) | |||||
{ | |||||
return (_request_irq(NULL, irq, handler, thread_handler, | |||||
flags, name, arg)); | |||||
} | |||||
static inline int | |||||
devm_request_threaded_irq(struct device *dev, int irq, | |||||
irq_handler_t handler, irq_handler_t thread_handler, | |||||
unsigned long flags, const char *name, void *arg) | |||||
{ | |||||
return (_request_irq(dev, irq, handler, thread_handler, | |||||
flags, name, arg)); | |||||
} | |||||
static inline int | |||||
enable_irq(unsigned int irq) | enable_irq(unsigned int irq) | ||||
{ | { | ||||
struct irq_ent *irqe; | struct irq_ent *irqe; | ||||
struct device *dev; | struct device *dev; | ||||
dev = linux_pci_find_irq_dev(irq); | dev = linux_pci_find_irq_dev(irq); | ||||
if (dev == NULL) | if (dev == NULL) | ||||
return -EINVAL; | return -EINVAL; | ||||
Show All 34 Lines | bind_irq_to_cpu(unsigned int irq, int cpu_id) | ||||
irqe = linux_irq_ent(dev, irq); | irqe = linux_irq_ent(dev, irq); | ||||
if (irqe == NULL) | if (irqe == NULL) | ||||
return (-ENOENT); | return (-ENOENT); | ||||
return (-bus_bind_intr(dev->bsddev, irqe->res, cpu_id)); | return (-bus_bind_intr(dev->bsddev, irqe->res, cpu_id)); | ||||
} | } | ||||
static inline void | static inline void | ||||
free_irq(unsigned int irq, void *device) | free_irq(unsigned int irq, void *device __unused) | ||||
{ | { | ||||
struct irq_ent *irqe; | struct irq_ent *irqe; | ||||
struct device *dev; | struct device *dev; | ||||
int rid; | |||||
dev = linux_pci_find_irq_dev(irq); | dev = linux_pci_find_irq_dev(irq); | ||||
if (dev == NULL) | if (dev == NULL) | ||||
return; | return; | ||||
rid = linux_irq_rid(dev, irq); | |||||
irqe = linux_irq_ent(dev, irq); | irqe = linux_irq_ent(dev, irq); | ||||
if (irqe == NULL) | if (irqe == NULL) | ||||
return; | return; | ||||
if (irqe->tag != NULL) | lkpi_irq_release(dev, irqe); | ||||
bus_teardown_intr(dev->bsddev, irqe->res, irqe->tag); | |||||
bus_release_resource(dev->bsddev, SYS_RES_IRQ, rid, irqe->res); | |||||
list_del(&irqe->links); | |||||
kfree(irqe); | kfree(irqe); | ||||
} | |||||
static inline void | |||||
devm_free_irq(struct device *xdev, unsigned int irq, void *p) | |||||
{ | |||||
struct device *dev; | |||||
struct irq_ent *irqe; | |||||
dev = linux_pci_find_irq_dev(irq); | |||||
if (dev == NULL) | |||||
return; | |||||
if (xdev != dev) | |||||
return; | |||||
irqe = linux_irq_ent(dev, irq); | |||||
if (irqe == NULL) | |||||
return; | |||||
lkpi_irq_release(dev, irqe); | |||||
lkpi_devres_unlink(dev, irqe); | |||||
lkpi_devres_free(irqe); | |||||
return; | |||||
} | } | ||||
static inline int | static inline int | ||||
irq_set_affinity_hint(int vector, cpumask_t *mask) | irq_set_affinity_hint(int vector, cpumask_t *mask) | ||||
{ | { | ||||
int error; | int error; | ||||
if (mask != NULL) | if (mask != NULL) | ||||
Show All 38 Lines |
Please just use the default naming here. I.E. no call to bus_describe_intr(). The describe field for IRQ's is very limited in length, and breaks mlx5's IRQ naming.