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);