diff mbox series

[02/12,net-next] qca_spi: Improve SPI IRQ handling

Message ID 20231214150944.55808-3-wahrenst@gmx.net (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series qca_spi: collection of improvements | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/apply fail Patch does not apply to net-next

Commit Message

Stefan Wahren Dec. 14, 2023, 3:09 p.m. UTC
The functions qcaspi_netdev_open/close are responsible of request &
free of the SPI interrupt, which wasn't the best choice because
allocation problems are discovered not during probe. So let us split
IRQ allocation & enabling, so we can take advantage of a device
managed IRQ.

Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
---
 drivers/net/ethernet/qualcomm/qca_spi.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

--
2.34.1

Comments

Andrew Lunn Dec. 17, 2023, 6:14 p.m. UTC | #1
On Thu, Dec 14, 2023 at 04:09:34PM +0100, Stefan Wahren wrote:
> The functions qcaspi_netdev_open/close are responsible of request &
> free of the SPI interrupt, which wasn't the best choice because
> allocation problems are discovered not during probe. So let us split
> IRQ allocation & enabling, so we can take advantage of a device
> managed IRQ.

Could you replace the kernel thread with a threaded interrupt handler?

      Andrew
Stefan Wahren Dec. 17, 2023, 7:17 p.m. UTC | #2
Hi Andrew,

Am 17.12.23 um 19:14 schrieb Andrew Lunn:
> On Thu, Dec 14, 2023 at 04:09:34PM +0100, Stefan Wahren wrote:
>> The functions qcaspi_netdev_open/close are responsible of request &
>> free of the SPI interrupt, which wasn't the best choice because
>> allocation problems are discovered not during probe. So let us split
>> IRQ allocation & enabling, so we can take advantage of a device
>> managed IRQ.
> Could you replace the kernel thread with a threaded interrupt handler?
the kernel thread is responsible for receiving, transmitting and reset
handling (there is no GPIO reset in this driver) which must be
synchronized along the same SPI interface. The interrupt just signalize
a chip reset or a received packet is available.

Could you please elaborate this request more in detail:
What is the problem with the kernel thread?
Why should i use the threaded interrupt as a replacement instead of e.g.
workqueue?

Please don't get me wrong, but i need to convince my employer for such a
big rewrite.

Regards

>
>        Andrew
Andrew Lunn Dec. 17, 2023, 10:48 p.m. UTC | #3
On Sun, Dec 17, 2023 at 08:17:56PM +0100, Stefan Wahren wrote:
> Hi Andrew,
> 
> Am 17.12.23 um 19:14 schrieb Andrew Lunn:
> > On Thu, Dec 14, 2023 at 04:09:34PM +0100, Stefan Wahren wrote:
> > > The functions qcaspi_netdev_open/close are responsible of request &
> > > free of the SPI interrupt, which wasn't the best choice because
> > > allocation problems are discovered not during probe. So let us split
> > > IRQ allocation & enabling, so we can take advantage of a device
> > > managed IRQ.
> > Could you replace the kernel thread with a threaded interrupt handler?
> the kernel thread is responsible for receiving, transmitting and reset
> handling (there is no GPIO reset in this driver) which must be
> synchronized along the same SPI interface. The interrupt just signalize
> a chip reset or a received packet is available.
> 
> Could you please elaborate this request more in detail:
> What is the problem with the kernel thread?
> Why should i use the threaded interrupt as a replacement instead of e.g.
> workqueue?
> 
> Please don't get me wrong, but i need to convince my employer for such a
> big rewrite.

I don't know this driver, which is why i asked the question. Its just
a suggestion. Maybe it makes no sense. But there have been other SPI
based Ethernet drivers which have been simplified by using threaded
interrupts rather than a kernel thread or a work queue, since the
interrupt core does all the thread management, and in particular the
creating and destroying of the thread which drivers often get wrong.

	 Andrew
Stefan Wahren Dec. 18, 2023, 10:23 a.m. UTC | #4
Hi Andrew,

Am 17.12.23 um 23:48 schrieb Andrew Lunn:
> On Sun, Dec 17, 2023 at 08:17:56PM +0100, Stefan Wahren wrote:
>> Hi Andrew,
>>
>> Am 17.12.23 um 19:14 schrieb Andrew Lunn:
>>> On Thu, Dec 14, 2023 at 04:09:34PM +0100, Stefan Wahren wrote:
>>>> The functions qcaspi_netdev_open/close are responsible of request &
>>>> free of the SPI interrupt, which wasn't the best choice because
>>>> allocation problems are discovered not during probe. So let us split
>>>> IRQ allocation & enabling, so we can take advantage of a device
>>>> managed IRQ.
>>> Could you replace the kernel thread with a threaded interrupt handler?
>> the kernel thread is responsible for receiving, transmitting and reset
>> handling (there is no GPIO reset in this driver) which must be
>> synchronized along the same SPI interface. The interrupt just signalize
>> a chip reset or a received packet is available.
>>
>> Could you please elaborate this request more in detail:
>> What is the problem with the kernel thread?
>> Why should i use the threaded interrupt as a replacement instead of e.g.
>> workqueue?
>>
>> Please don't get me wrong, but i need to convince my employer for such a
>> big rewrite.
> I don't know this driver, which is why i asked the question. Its just
> a suggestion. Maybe it makes no sense. But there have been other SPI
> based Ethernet drivers which have been simplified by using threaded
> interrupts rather than a kernel thread or a work queue, since the
> interrupt core does all the thread management, and in particular the
> creating and destroying of the thread which drivers often get wrong.
thanks for the explanation. I guess you refer to enc28j60 and i had a
look at commit 995585ecdf42 ("net: enc28j60: Use threaded interrupt
instead of workqueue"). The fact that the qca_spi driver has a kernel
thread which is kind of persistent (see patch 1 of this series) and the
request to change this confused me. So your suggestion is more about the
interrupt handling and not about the kernel thread which handles the SPI
communication.

Yes the usage of threaded IRQ makes sense especially this would allow to
support level triggered interrupts. But i think this complex change
should be a separate series.
> 	 Andrew
diff mbox series

Patch

diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c
index a9f01fb3455a..88f2468ba676 100644
--- a/drivers/net/ethernet/qualcomm/qca_spi.c
+++ b/drivers/net/ethernet/qualcomm/qca_spi.c
@@ -669,7 +669,6 @@  static int
 qcaspi_netdev_open(struct net_device *dev)
 {
 	struct qcaspi *qca = netdev_priv(dev);
-	int ret = 0;

 	if (!qca)
 		return -EINVAL;
@@ -679,13 +678,7 @@  qcaspi_netdev_open(struct net_device *dev)
 	qca->sync = QCASPI_SYNC_UNKNOWN;
 	qcafrm_fsm_init_spi(&qca->frm_handle);

-	ret = request_irq(qca->spi_dev->irq, qcaspi_intr_handler, 0,
-			  dev->name, qca);
-	if (ret) {
-		netdev_err(dev, "%s: unable to get IRQ %d (irqval=%d).\n",
-			   QCASPI_DRV_NAME, qca->spi_dev->irq, ret);
-		return ret;
-	}
+	enable_irq(qca->spi_dev->irq);

 	/* SPI thread takes care of TX queue */
 	kthread_unpark(qca->spi_thread);
@@ -702,7 +695,7 @@  qcaspi_netdev_close(struct net_device *dev)
 	kthread_park(qca->spi_thread);

 	qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0, wr_verify);
-	free_irq(qca->spi_dev->irq, qca);
+	disable_irq(qca->spi_dev->irq);

 	return 0;
 }
@@ -969,6 +962,15 @@  qca_spi_probe(struct spi_device *spi)

 	spi_set_drvdata(spi, qcaspi_devs);

+	ret = devm_request_irq(&spi->dev, spi->irq, qcaspi_intr_handler,
+			       IRQF_NO_AUTOEN, qca->net_dev->name, qca);
+	if (ret) {
+		dev_err(&spi->dev, "Unable to get IRQ %d (irqval=%d).\n",
+			spi->irq, ret);
+		free_netdev(qcaspi_devs);
+		return ret;
+	}
+
 	ret = of_get_ethdev_address(spi->dev.of_node, qca->net_dev);
 	if (ret) {
 		eth_hw_addr_random(qca->net_dev);