x86: return the irq_handler from register_irq()
register_irq() is a mess. This helps a little - at least the caller can
determine the vector assigned.
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/arch/riscv/trap.c b/kern/arch/riscv/trap.c
index 0e8a980..d3be282 100644
--- a/kern/arch/riscv/trap.c
+++ b/kern/arch/riscv/trap.c
@@ -343,7 +343,8 @@
printk("%s not implemented\n", __FUNCTION);
}
-int register_irq(int irq, isr_t handler, void *irq_arg, uint32_t tbdf)
+struct irq_handler *register_irq(int irq, isr_t handler, void *irq_arg,
+ uint32_t tbdf)
{
printk("%s not implemented\n", __FUNCTION);
return -1;
diff --git a/kern/arch/x86/trap.c b/kern/arch/x86/trap.c
index 7647360..15fbdc8 100644
--- a/kern/arch/x86/trap.c
+++ b/kern/arch/x86/trap.c
@@ -780,7 +780,8 @@
}
/* The irq field may be ignored based on the type of Bus. */
-int register_irq(int irq, isr_t handler, void *irq_arg, uint32_t tbdf)
+struct irq_handler *register_irq(int irq, isr_t handler, void *irq_arg,
+ uint32_t tbdf)
{
struct irq_handler *irq_h;
int vector;
@@ -792,7 +793,7 @@
vector = bus_irq_setup(irq_h);
if (vector == -1) {
kfree(irq_h);
- return -1;
+ return NULL;
}
printk("IRQ %d, vector %d (0x%x), type %s\n", irq, vector, vector,
irq_h->type);
@@ -811,7 +812,7 @@
* The lapic IRQs need to be unmasked on a per-core basis */
if (irq_h->unmask && strcmp(irq_h->type, "lapic"))
irq_h->unmask(irq_h, vector);
- return 0;
+ return irq_h;
}
/* These routing functions only allow the routing of an irq to a single core.
diff --git a/kern/drivers/dma/ioat/init.c b/kern/drivers/dma/ioat/init.c
index badca85..fda838f 100644
--- a/kern/drivers/dma/ioat/init.c
+++ b/kern/drivers/dma/ioat/init.c
@@ -412,6 +412,7 @@
int i, j, msixcnt;
int err = -EINVAL;
uint8_t intrctrl = 0;
+ struct irq_handler *irq_h;
#if 1 // AKAROS
/* Our IRQ setup needs a lot of work. Let's just assume MSI-X, since
@@ -435,12 +436,12 @@
* for msi/msix. Passing 0 for now, since -1 doesn't seem like
* a good idea. This tries to do too much, and you have no
* control / insight into what its doing. */
- err = register_irq(0 /* ignored for msi(x)! */,
- ioat_dma_do_interrupt_msix, ioat_chan,
- pci_to_tbdf(pdev));
+ irq_h = register_irq(0 /* ignored for msi(x)! */,
+ ioat_dma_do_interrupt_msix, ioat_chan,
+ pci_to_tbdf(pdev));
/* TODO: this is a mess - we also don't know if we're actually
* MSIX or not! We don't even know our vector... */
- if (err) {
+ if (!irq_h) {
warn("MSIX failed (cnt %d), leaking vectors etc!", i);
for (j = 0; j < i; j++) {
msix = &ioat_dma->msix_entries[j];
diff --git a/kern/drivers/net/bnx2x/bnx2x_cmn.c b/kern/drivers/net/bnx2x/bnx2x_cmn.c
index 835bd61..26cbb0a 100644
--- a/kern/drivers/net/bnx2x/bnx2x_cmn.c
+++ b/kern/drivers/net/bnx2x/bnx2x_cmn.c
@@ -1747,14 +1747,15 @@
static int bnx2x_req_msix_irqs(struct bnx2x *bp)
{
- int i, rc, offset = 0;
+ int i, offset = 0;
+ struct irq_handler *irq_h;
/* no default status block for vf */
if (IS_PF(bp)) {
- rc = register_irq(bp->msix_table[offset++].vector,
- bnx2x_msix_sp_int, bp->dev,
- pci_to_tbdf(bp->pdev));
- if (rc) {
+ irq_h = register_irq(bp->msix_table[offset++].vector,
+ bnx2x_msix_sp_int, bp->dev,
+ pci_to_tbdf(bp->pdev));
+ if (!irq_h) {
BNX2X_ERR("request sp irq failed\n");
return -EBUSY;
}
@@ -1763,9 +1764,9 @@
if (CNIC_SUPPORT(bp)) {
offset++;
// AKAROS_PORT
- rc = register_irq(0, bullshit_handler, 0,
- pci_to_tbdf(bp->pdev));
- if (rc) {
+ irq_h = register_irq(0, bullshit_handler, 0,
+ pci_to_tbdf(bp->pdev));
+ if (!irq_h) {
BNX2X_ERR("Fucked up getting a CNIC MSIX vector!");
return -EBUSY;
}
@@ -1776,11 +1777,12 @@
snprintf(fp->name, sizeof(fp->name), "%s-fp-%d",
bp->dev->name, i);
- rc = register_irq(bp->msix_table[offset].vector,
- bnx2x_msix_fp_int, fp, pci_to_tbdf(bp->pdev));
- if (rc) {
- BNX2X_ERR("request fp #%d irq (%d) failed rc %d\n", i,
- bp->msix_table[offset].vector, rc);
+ irq_h = register_irq(bp->msix_table[offset].vector,
+ bnx2x_msix_fp_int, fp,
+ pci_to_tbdf(bp->pdev));
+ if (!irq_h) {
+ BNX2X_ERR("request fp #%d irq (%d) failed\n", i,
+ bp->msix_table[offset].vector);
bnx2x_free_msix_irqs(bp, offset);
return -EBUSY;
}
diff --git a/kern/drivers/net/mlx4/eq.c b/kern/drivers/net/mlx4/eq.c
index 4589b08..3236ed9 100644
--- a/kern/drivers/net/mlx4/eq.c
+++ b/kern/drivers/net/mlx4/eq.c
@@ -1159,6 +1159,7 @@
int mlx4_init_eq_table(struct mlx4_dev *dev)
{
struct mlx4_priv *priv = mlx4_priv(dev);
+ struct irq_handler *irq_h;
int err;
int i;
@@ -1261,12 +1262,12 @@
priv->eq_table.eq + i,
pci_to_tbdf(PCIDEV));
#else
- err = register_irq(priv->eq_table.eq[i].irq,
- mlx4_msi_x_interrupt_akaros,
- priv->eq_table.eq + i,
- pci_to_tbdf(dev->persist->pdev));
+ irq_h = register_irq(priv->eq_table.eq[i].irq,
+ mlx4_msi_x_interrupt_akaros,
+ priv->eq_table.eq + i,
+ pci_to_tbdf(dev->persist->pdev));
#endif
- if (err)
+ if (!irq_h)
goto err_out_async;
priv->eq_table.eq[i].have_irq = 1;
diff --git a/kern/drivers/net/r8169.c b/kern/drivers/net/r8169.c
index e2372b8..d75ccb8 100644
--- a/kern/drivers/net/r8169.c
+++ b/kern/drivers/net/r8169.c
@@ -7813,10 +7813,8 @@
rtl_request_firmware(tp);
- retval = register_irq(pdev->irqline, rtl8169_interrupt, dev,
- pci_to_tbdf(pdev));
-
- if (retval < 0)
+ if (!register_irq(pdev->irqline, rtl8169_interrupt, dev,
+ pci_to_tbdf(pdev)))
goto err_release_fw_2;
rtl_lock_work(tp);
diff --git a/kern/include/trap.h b/kern/include/trap.h
index d8c2683..66d0d1b 100644
--- a/kern/include/trap.h
+++ b/kern/include/trap.h
@@ -14,7 +14,8 @@
typedef void (*isr_t)(struct hw_trapframe *hw_tf, void *data);
void idt_init(void);
-int register_irq(int irq, isr_t handler, void *irq_arg, uint32_t tbdf);
+struct irq_handler *register_irq(int irq, isr_t handler, void *irq_arg,
+ uint32_t tbdf);
int route_irqs(int cpu_vec, int coreid);
void print_trapframe(struct hw_trapframe *hw_tf);
void print_swtrapframe(struct sw_trapframe *sw_tf);