@@ -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. */
@@ -256,7 +255,6 @@ struct adapter {
spinlock_t mac_lock;
/* guards async operations */
- spinlock_t async_lock ____cacheline_aligned;
u32 slow_intr_mask;
int t1powersave;
};
@@ -905,41 +905,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) {
@@ -1045,11 +1010,8 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
spin_lock_init(&adapter->tpi_lock);
spin_lock_init(&adapter->work_lock);
- 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);
@@ -1657,10 +1657,7 @@ irqreturn_t t1_irq_thread(int irq, void *data)
struct sge *sge = adapter->sge;
int handled;
- spin_lock(&adapter->async_lock);
handled = t1_slow_intr_handler(adapter);
- spin_unlock(&adapter->async_lock);
-
if (!handled)
sge->stats.unhandled_irqs++;
@@ -858,7 +858,7 @@ static int asic_slow_intr(adapter_t *adapter)
if (cause & F_PL_INTR_PCIX)
t1_pci_intr_handler(adapter);
if (cause & F_PL_INTR_EXT)
- t1_elmer0_ext_intr(adapter);
+ t1_elmer0_ext_intr_handler(adapter);
/* Clear the interrupts just processed. */
writel(cause, adapter->regs + A_PL_CAUSE);
cxgb's "elmer0" external interrupt handling code requires task context, so originally a workqueue was scheduled for it from the hardirq handler. Now that all of the external interrupt handling, elmer0 included, is run from a threaded-irq context, just directly call the real handler. Remove all the workqueue code that is now no longer needed, including the spinlock used for synchronizing the workqueue's NIC regsiters access against the irq handler. Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de> --- drivers/net/ethernet/chelsio/cxgb/common.h | 2 -- drivers/net/ethernet/chelsio/cxgb/cxgb2.c | 38 ---------------------- drivers/net/ethernet/chelsio/cxgb/sge.c | 3 -- drivers/net/ethernet/chelsio/cxgb/subr.c | 2 +- 4 files changed, 1 insertion(+), 44 deletions(-)