Re: [PATCH] octeon: request_irq() failure ignored in cvm_oct_configure_common_hw()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Roel Kluin wrote:
Produce an error if request_irq() fails and clean up properly.

Signed-off-by: Roel Kluin <roel.kluin@xxxxxxxxx>
---
This is all a bit whacky, at this point the only sane thing I can think
of doing is to panic if we cannot get the irq.
Panic from driver which fails on request_irq is not a sane thing at all.
There is just /proc entry creation, tasklet init and the things done in
cvm_oct_configure_common_hw. I believe it's not that hard to revert the
initialization properly.

Thanks,

How about this? Can I move the request_irq() like this?


Do you have the hardware necessary to test this? You don't say how any of these patches were tested.

If you don't have hardware, I can try to test it in the next few days.

David Daney



Roel

diff --git a/drivers/staging/octeon/ethernet.c b/drivers/staging/octeon/ethernet.c
index b847951..9ada8e3 100644
--- a/drivers/staging/octeon/ethernet.c
+++ b/drivers/staging/octeon/ethernet.c
@@ -185,9 +185,19 @@ out:
 /**
  * Configure common hardware for all interfaces
  */
-static __init void cvm_oct_configure_common_hw(void)
+static __init int cvm_oct_configure_common_hw(void)
 {
 	int r;
+
+	/* Register an IRQ hander for to receive POW interrupts */
+	r = request_irq(OCTEON_IRQ_WORKQ0 + pow_receive_group,
+			cvm_oct_do_interrupt, IRQF_SHARED, "Ethernet",
+			cvm_oct_device);
+	if (r != 0) {
+		pr_err("cvm_oct_configure_common_hw: request_irq failed");
+		return r;
+	}
+
 	/* Setup the FPA */
 	cvmx_fpa_enable();
 	cvm_oct_mem_fill_fpa(CVMX_FPA_PACKET_POOL, CVMX_FPA_PACKET_POOL_SIZE,
@@ -206,17 +216,13 @@ static __init void cvm_oct_configure_common_hw(void)
 	if (!octeon_is_simulation())
 		cvmx_write_csr(CVMX_SMIX_EN(0), 1);
- /* Register an IRQ hander for to receive POW interrupts */
-	r = request_irq(OCTEON_IRQ_WORKQ0 + pow_receive_group,
-			cvm_oct_do_interrupt, IRQF_SHARED, "Ethernet",
-			cvm_oct_device);
-
 #if defined(CONFIG_SMP) && 0
 	if (USE_MULTICORE_RECEIVE) {
 		irq_set_affinity(OCTEON_IRQ_WORKQ0 + pow_receive_group,
 				 cpu_online_mask);
 	}
 #endif
+	return 0;
 }
/**
@@ -617,12 +623,15 @@ static int __init cvm_oct_init_module(void)
 	int interface;
 	int fau = FAU_NUM_PACKET_BUFFERS_TO_FREE;
 	int qos;
+	int r;
pr_notice("cavium-ethernet %s\n", OCTEON_ETHERNET_VERSION); cvm_oct_proc_initialize();
 	cvm_oct_rx_initialize();
-	cvm_oct_configure_common_hw();
+	r = cvm_oct_configure_common_hw();
+	if (r != 0)
+		goto out_rx_shutdown;
cvmx_helper_initialize_packet_io_global(); @@ -806,6 +815,11 @@ static int __init cvm_oct_init_module(void)
 	mod_timer(&cvm_oct_poll_timer, jiffies + HZ);
return 0;
+
+out_rx_shutdown:
+	cvm_oct_rx_shutdown();
+	cvm_oct_proc_shutdown();
+	return r;
 }
/**

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel

[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux