diff options
Diffstat (limited to 'debian/patches-rt/0155-chelsio-cxgb-Replace-the-workqueue-with-threaded-int.patch')
-rw-r--r-- | debian/patches-rt/0155-chelsio-cxgb-Replace-the-workqueue-with-threaded-int.patch | 271 |
1 files changed, 0 insertions, 271 deletions
diff --git a/debian/patches-rt/0155-chelsio-cxgb-Replace-the-workqueue-with-threaded-int.patch b/debian/patches-rt/0155-chelsio-cxgb-Replace-the-workqueue-with-threaded-int.patch deleted file mode 100644 index b54957fa3..000000000 --- a/debian/patches-rt/0155-chelsio-cxgb-Replace-the-workqueue-with-threaded-int.patch +++ /dev/null @@ -1,271 +0,0 @@ -From 7740cb6404f4997bd1188a2f9872ff4bfd056443 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> -Date: Tue, 2 Feb 2021 18:01:03 +0100 -Subject: [PATCH 155/296] chelsio: cxgb: Replace the workqueue with threaded - interrupt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.35-rt39.tar.xz - -The external interrupt (F_PL_INTR_EXT) needs to be handled in a process -context and this is accomplished by utilizing a workqueue. - -The process context can also be provided by a threaded interrupt instead -of a workqueue. The threaded interrupt can be used later for other -interrupt related processing which require non-atomic context without -using yet another workqueue. free_irq() also ensures that the thread is -done which is currently missing (the worker could continue after the -module has been removed). - -Save pending flags in pending_thread_intr. Use the same mechanism -to disable F_PL_INTR_EXT as interrupt source like it is used before the -worker is scheduled. Enable the interrupt again once -t1_elmer0_ext_intr_handler() is done. - -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - drivers/net/ethernet/chelsio/cxgb/common.h | 5 +-- - drivers/net/ethernet/chelsio/cxgb/cxgb2.c | 44 ++-------------------- - drivers/net/ethernet/chelsio/cxgb/sge.c | 33 ++++++++++++++-- - drivers/net/ethernet/chelsio/cxgb/sge.h | 1 + - drivers/net/ethernet/chelsio/cxgb/subr.c | 26 +++++++++---- - 5 files changed, 55 insertions(+), 54 deletions(-) - -diff --git a/drivers/net/ethernet/chelsio/cxgb/common.h b/drivers/net/ethernet/chelsio/cxgb/common.h -index 6475060649e9..e999a9b9fe6c 100644 ---- a/drivers/net/ethernet/chelsio/cxgb/common.h -+++ b/drivers/net/ethernet/chelsio/cxgb/common.h -@@ -238,7 +238,6 @@ struct adapter { - int msg_enable; - u32 mmio_len; - -- struct work_struct ext_intr_handler_task; - struct adapter_params params; - - /* Terminator modules. */ -@@ -257,6 +256,7 @@ struct adapter { - - /* guards async operations */ - spinlock_t async_lock ____cacheline_aligned; -+ u32 pending_thread_intr; - u32 slow_intr_mask; - int t1powersave; - }; -@@ -334,8 +334,7 @@ void t1_interrupts_enable(adapter_t *adapter); - void t1_interrupts_disable(adapter_t *adapter); - void t1_interrupts_clear(adapter_t *adapter); - int t1_elmer0_ext_intr_handler(adapter_t *adapter); --void t1_elmer0_ext_intr(adapter_t *adapter); --int t1_slow_intr_handler(adapter_t *adapter); -+irqreturn_t t1_slow_intr_handler(adapter_t *adapter); - - int t1_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc); - const struct board_info *t1_get_board_info(unsigned int board_id); -diff --git a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c -index 0e4a0f413960..bd6f3c532d72 100644 ---- a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c -+++ b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c -@@ -211,9 +211,10 @@ static int cxgb_up(struct adapter *adapter) - t1_interrupts_clear(adapter); - - adapter->params.has_msi = !disable_msi && !pci_enable_msi(adapter->pdev); -- err = request_irq(adapter->pdev->irq, t1_interrupt, -- adapter->params.has_msi ? 0 : IRQF_SHARED, -- adapter->name, adapter); -+ err = request_threaded_irq(adapter->pdev->irq, t1_interrupt, -+ t1_interrupt_thread, -+ adapter->params.has_msi ? 0 : IRQF_SHARED, -+ adapter->name, adapter); - if (err) { - if (adapter->params.has_msi) - pci_disable_msi(adapter->pdev); -@@ -916,41 +917,6 @@ static void mac_stats_task(struct work_struct *work) - spin_unlock(&adapter->work_lock); - } - --/* -- * Processes elmer0 external interrupts in process context. -- */ --static void ext_intr_task(struct work_struct *work) --{ -- struct adapter *adapter = -- container_of(work, struct adapter, ext_intr_handler_task); -- -- t1_elmer0_ext_intr_handler(adapter); -- -- /* Now reenable external interrupts */ -- spin_lock_irq(&adapter->async_lock); -- adapter->slow_intr_mask |= F_PL_INTR_EXT; -- writel(F_PL_INTR_EXT, adapter->regs + A_PL_CAUSE); -- writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, -- adapter->regs + A_PL_ENABLE); -- spin_unlock_irq(&adapter->async_lock); --} -- --/* -- * Interrupt-context handler for elmer0 external interrupts. -- */ --void t1_elmer0_ext_intr(struct adapter *adapter) --{ -- /* -- * Schedule a task to handle external interrupts as we require -- * a process context. We disable EXT interrupts in the interim -- * and let the task reenable them when it's done. -- */ -- adapter->slow_intr_mask &= ~F_PL_INTR_EXT; -- writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, -- adapter->regs + A_PL_ENABLE); -- schedule_work(&adapter->ext_intr_handler_task); --} -- - void t1_fatal_err(struct adapter *adapter) - { - if (adapter->flags & FULL_INIT_DONE) { -@@ -1062,8 +1028,6 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) - spin_lock_init(&adapter->async_lock); - spin_lock_init(&adapter->mac_lock); - -- INIT_WORK(&adapter->ext_intr_handler_task, -- ext_intr_task); - INIT_DELAYED_WORK(&adapter->stats_update_task, - mac_stats_task); - -diff --git a/drivers/net/ethernet/chelsio/cxgb/sge.c b/drivers/net/ethernet/chelsio/cxgb/sge.c -index 2d9c2b5a690a..5aef9ae1ecfe 100644 ---- a/drivers/net/ethernet/chelsio/cxgb/sge.c -+++ b/drivers/net/ethernet/chelsio/cxgb/sge.c -@@ -1619,11 +1619,38 @@ int t1_poll(struct napi_struct *napi, int budget) - return work_done; - } - -+irqreturn_t t1_interrupt_thread(int irq, void *data) -+{ -+ struct adapter *adapter = data; -+ u32 pending_thread_intr; -+ -+ spin_lock_irq(&adapter->async_lock); -+ pending_thread_intr = adapter->pending_thread_intr; -+ adapter->pending_thread_intr = 0; -+ spin_unlock_irq(&adapter->async_lock); -+ -+ if (!pending_thread_intr) -+ return IRQ_NONE; -+ -+ if (pending_thread_intr & F_PL_INTR_EXT) -+ t1_elmer0_ext_intr_handler(adapter); -+ -+ spin_lock_irq(&adapter->async_lock); -+ adapter->slow_intr_mask |= F_PL_INTR_EXT; -+ -+ writel(F_PL_INTR_EXT, adapter->regs + A_PL_CAUSE); -+ writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, -+ adapter->regs + A_PL_ENABLE); -+ spin_unlock_irq(&adapter->async_lock); -+ -+ return IRQ_HANDLED; -+} -+ - irqreturn_t t1_interrupt(int irq, void *data) - { - struct adapter *adapter = data; - struct sge *sge = adapter->sge; -- int handled; -+ irqreturn_t handled; - - if (likely(responses_pending(adapter))) { - writel(F_PL_INTR_SGE_DATA, adapter->regs + A_PL_CAUSE); -@@ -1645,10 +1672,10 @@ irqreturn_t t1_interrupt(int irq, void *data) - handled = t1_slow_intr_handler(adapter); - spin_unlock(&adapter->async_lock); - -- if (!handled) -+ if (handled == IRQ_NONE) - sge->stats.unhandled_irqs++; - -- return IRQ_RETVAL(handled != 0); -+ return handled; - } - - /* -diff --git a/drivers/net/ethernet/chelsio/cxgb/sge.h b/drivers/net/ethernet/chelsio/cxgb/sge.h -index a1ba591b3431..76516d2a8aa9 100644 ---- a/drivers/net/ethernet/chelsio/cxgb/sge.h -+++ b/drivers/net/ethernet/chelsio/cxgb/sge.h -@@ -74,6 +74,7 @@ struct sge *t1_sge_create(struct adapter *, struct sge_params *); - int t1_sge_configure(struct sge *, struct sge_params *); - int t1_sge_set_coalesce_params(struct sge *, struct sge_params *); - void t1_sge_destroy(struct sge *); -+irqreturn_t t1_interrupt_thread(int irq, void *data); - irqreturn_t t1_interrupt(int irq, void *cookie); - int t1_poll(struct napi_struct *, int); - -diff --git a/drivers/net/ethernet/chelsio/cxgb/subr.c b/drivers/net/ethernet/chelsio/cxgb/subr.c -index ea0f8741d7cf..d90ad07ff1a4 100644 ---- a/drivers/net/ethernet/chelsio/cxgb/subr.c -+++ b/drivers/net/ethernet/chelsio/cxgb/subr.c -@@ -210,7 +210,7 @@ static int fpga_phy_intr_handler(adapter_t *adapter) - /* - * Slow path interrupt handler for FPGAs. - */ --static int fpga_slow_intr(adapter_t *adapter) -+static irqreturn_t fpga_slow_intr(adapter_t *adapter) - { - u32 cause = readl(adapter->regs + A_PL_CAUSE); - -@@ -238,7 +238,7 @@ static int fpga_slow_intr(adapter_t *adapter) - if (cause) - writel(cause, adapter->regs + A_PL_CAUSE); - -- return cause != 0; -+ return cause == 0 ? IRQ_NONE : IRQ_HANDLED; - } - #endif - -@@ -842,13 +842,14 @@ void t1_interrupts_clear(adapter_t* adapter) - /* - * Slow path interrupt handler for ASICs. - */ --static int asic_slow_intr(adapter_t *adapter) -+static irqreturn_t asic_slow_intr(adapter_t *adapter) - { - u32 cause = readl(adapter->regs + A_PL_CAUSE); -+ irqreturn_t ret = IRQ_HANDLED; - - cause &= adapter->slow_intr_mask; - if (!cause) -- return 0; -+ return IRQ_NONE; - if (cause & F_PL_INTR_SGE_ERR) - t1_sge_intr_error_handler(adapter->sge); - if (cause & F_PL_INTR_TP) -@@ -857,16 +858,25 @@ static int asic_slow_intr(adapter_t *adapter) - t1_espi_intr_handler(adapter->espi); - if (cause & F_PL_INTR_PCIX) - t1_pci_intr_handler(adapter); -- if (cause & F_PL_INTR_EXT) -- t1_elmer0_ext_intr(adapter); -+ if (cause & F_PL_INTR_EXT) { -+ /* Wake the threaded interrupt to handle external interrupts as -+ * we require a process context. We disable EXT interrupts in -+ * the interim and let the thread reenable them when it's done. -+ */ -+ adapter->pending_thread_intr |= F_PL_INTR_EXT; -+ adapter->slow_intr_mask &= ~F_PL_INTR_EXT; -+ writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, -+ adapter->regs + A_PL_ENABLE); -+ ret = IRQ_WAKE_THREAD; -+ } - - /* Clear the interrupts just processed. */ - writel(cause, adapter->regs + A_PL_CAUSE); - readl(adapter->regs + A_PL_CAUSE); /* flush writes */ -- return 1; -+ return ret; - } - --int t1_slow_intr_handler(adapter_t *adapter) -+irqreturn_t t1_slow_intr_handler(adapter_t *adapter) - { - #ifdef CONFIG_CHELSIO_T1_1G - if (!t1_is_asic(adapter)) --- -2.30.2 - |