hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/net/ethernet/chelsio/cxgb/sge.c
....@@ -940,11 +940,10 @@
940940 /*
941941 * SGE 'Error' interrupt handler
942942 */
943
-bool t1_sge_intr_error_handler(struct sge *sge)
943
+int t1_sge_intr_error_handler(struct sge *sge)
944944 {
945945 struct adapter *adapter = sge->adapter;
946946 u32 cause = readl(adapter->regs + A_SG_INT_CAUSE);
947
- bool wake = false;
948947
949948 if (adapter->port[0].dev->hw_features & NETIF_F_TSO)
950949 cause &= ~F_PACKET_TOO_BIG;
....@@ -968,14 +967,11 @@
968967 sge->stats.pkt_mismatch++;
969968 pr_alert("%s: SGE packet mismatch\n", adapter->name);
970969 }
971
- if (cause & SGE_INT_FATAL) {
972
- t1_interrupts_disable(adapter);
973
- adapter->pending_thread_intr |= F_PL_INTR_SGE_ERR;
974
- wake = true;
975
- }
970
+ if (cause & SGE_INT_FATAL)
971
+ t1_fatal_err(adapter);
976972
977973 writel(cause, adapter->regs + A_SG_INT_CAUSE);
978
- return wake;
974
+ return 0;
979975 }
980976
981977 const struct sge_intr_counts *t1_sge_get_intr_counts(const struct sge *sge)
....@@ -1623,46 +1619,11 @@
16231619 return work_done;
16241620 }
16251621
1626
-irqreturn_t t1_interrupt_thread(int irq, void *data)
1627
-{
1628
- struct adapter *adapter = data;
1629
- u32 pending_thread_intr;
1630
-
1631
- spin_lock_irq(&adapter->async_lock);
1632
- pending_thread_intr = adapter->pending_thread_intr;
1633
- adapter->pending_thread_intr = 0;
1634
- spin_unlock_irq(&adapter->async_lock);
1635
-
1636
- if (!pending_thread_intr)
1637
- return IRQ_NONE;
1638
-
1639
- if (pending_thread_intr & F_PL_INTR_EXT)
1640
- t1_elmer0_ext_intr_handler(adapter);
1641
-
1642
- /* This error is fatal, interrupts remain off */
1643
- if (pending_thread_intr & F_PL_INTR_SGE_ERR) {
1644
- pr_alert("%s: encountered fatal error, operation suspended\n",
1645
- adapter->name);
1646
- t1_sge_stop(adapter->sge);
1647
- return IRQ_HANDLED;
1648
- }
1649
-
1650
- spin_lock_irq(&adapter->async_lock);
1651
- adapter->slow_intr_mask |= F_PL_INTR_EXT;
1652
-
1653
- writel(F_PL_INTR_EXT, adapter->regs + A_PL_CAUSE);
1654
- writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA,
1655
- adapter->regs + A_PL_ENABLE);
1656
- spin_unlock_irq(&adapter->async_lock);
1657
-
1658
- return IRQ_HANDLED;
1659
-}
1660
-
16611622 irqreturn_t t1_interrupt(int irq, void *data)
16621623 {
16631624 struct adapter *adapter = data;
16641625 struct sge *sge = adapter->sge;
1665
- irqreturn_t handled;
1626
+ int handled;
16661627
16671628 if (likely(responses_pending(adapter))) {
16681629 writel(F_PL_INTR_SGE_DATA, adapter->regs + A_PL_CAUSE);
....@@ -1684,10 +1645,10 @@
16841645 handled = t1_slow_intr_handler(adapter);
16851646 spin_unlock(&adapter->async_lock);
16861647
1687
- if (handled == IRQ_NONE)
1648
+ if (!handled)
16881649 sge->stats.unhandled_irqs++;
16891650
1690
- return handled;
1651
+ return IRQ_RETVAL(handled != 0);
16911652 }
16921653
16931654 /*