forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
kernel/drivers/net/ethernet/chelsio/cxgb/subr.c
....@@ -170,7 +170,7 @@
170170 t1_link_negotiated(adapter, port_id, link_ok, speed, duplex, fc);
171171 }
172172
173
-static int t1_pci_intr_handler(adapter_t *adapter)
173
+static bool t1_pci_intr_handler(adapter_t *adapter)
174174 {
175175 u32 pcix_cause;
176176
....@@ -179,9 +179,13 @@
179179 if (pcix_cause) {
180180 pci_write_config_dword(adapter->pdev, A_PCICFG_INTR_CAUSE,
181181 pcix_cause);
182
- t1_fatal_err(adapter); /* PCI errors are fatal */
182
+ /* PCI errors are fatal */
183
+ t1_interrupts_disable(adapter);
184
+ adapter->pending_thread_intr |= F_PL_INTR_SGE_ERR;
185
+ pr_alert("%s: PCI error encountered.\n", adapter->name);
186
+ return true;
183187 }
184
- return 0;
188
+ return false;
185189 }
186190
187191 #ifdef CONFIG_CHELSIO_T1_1G
....@@ -210,13 +214,16 @@
210214 /*
211215 * Slow path interrupt handler for FPGAs.
212216 */
213
-static int fpga_slow_intr(adapter_t *adapter)
217
+static irqreturn_t fpga_slow_intr(adapter_t *adapter)
214218 {
215219 u32 cause = readl(adapter->regs + A_PL_CAUSE);
220
+ irqreturn_t ret = IRQ_NONE;
216221
217222 cause &= ~F_PL_INTR_SGE_DATA;
218
- if (cause & F_PL_INTR_SGE_ERR)
219
- t1_sge_intr_error_handler(adapter->sge);
223
+ if (cause & F_PL_INTR_SGE_ERR) {
224
+ if (t1_sge_intr_error_handler(adapter->sge))
225
+ ret = IRQ_WAKE_THREAD;
226
+ }
220227
221228 if (cause & FPGA_PCIX_INTERRUPT_GMAC)
222229 fpga_phy_intr_handler(adapter);
....@@ -231,14 +238,19 @@
231238 /* Clear TP interrupt */
232239 writel(tp_cause, adapter->regs + FPGA_TP_ADDR_INTERRUPT_CAUSE);
233240 }
234
- if (cause & FPGA_PCIX_INTERRUPT_PCIX)
235
- t1_pci_intr_handler(adapter);
241
+ if (cause & FPGA_PCIX_INTERRUPT_PCIX) {
242
+ if (t1_pci_intr_handler(adapter))
243
+ ret = IRQ_WAKE_THREAD;
244
+ }
236245
237246 /* Clear the interrupts just processed. */
238247 if (cause)
239248 writel(cause, adapter->regs + A_PL_CAUSE);
240249
241
- return cause != 0;
250
+ if (ret != IRQ_NONE)
251
+ return ret;
252
+
253
+ return cause == 0 ? IRQ_NONE : IRQ_HANDLED;
242254 }
243255 #endif
244256
....@@ -842,31 +854,45 @@
842854 /*
843855 * Slow path interrupt handler for ASICs.
844856 */
845
-static int asic_slow_intr(adapter_t *adapter)
857
+static irqreturn_t asic_slow_intr(adapter_t *adapter)
846858 {
847859 u32 cause = readl(adapter->regs + A_PL_CAUSE);
860
+ irqreturn_t ret = IRQ_HANDLED;
848861
849862 cause &= adapter->slow_intr_mask;
850863 if (!cause)
851
- return 0;
852
- if (cause & F_PL_INTR_SGE_ERR)
853
- t1_sge_intr_error_handler(adapter->sge);
864
+ return IRQ_NONE;
865
+ if (cause & F_PL_INTR_SGE_ERR) {
866
+ if (t1_sge_intr_error_handler(adapter->sge))
867
+ ret = IRQ_WAKE_THREAD;
868
+ }
854869 if (cause & F_PL_INTR_TP)
855870 t1_tp_intr_handler(adapter->tp);
856871 if (cause & F_PL_INTR_ESPI)
857872 t1_espi_intr_handler(adapter->espi);
858
- if (cause & F_PL_INTR_PCIX)
859
- t1_pci_intr_handler(adapter);
860
- if (cause & F_PL_INTR_EXT)
861
- t1_elmer0_ext_intr(adapter);
873
+ if (cause & F_PL_INTR_PCIX) {
874
+ if (t1_pci_intr_handler(adapter))
875
+ ret = IRQ_WAKE_THREAD;
876
+ }
877
+ if (cause & F_PL_INTR_EXT) {
878
+ /* Wake the threaded interrupt to handle external interrupts as
879
+ * we require a process context. We disable EXT interrupts in
880
+ * the interim and let the thread reenable them when it's done.
881
+ */
882
+ adapter->pending_thread_intr |= F_PL_INTR_EXT;
883
+ adapter->slow_intr_mask &= ~F_PL_INTR_EXT;
884
+ writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA,
885
+ adapter->regs + A_PL_ENABLE);
886
+ ret = IRQ_WAKE_THREAD;
887
+ }
862888
863889 /* Clear the interrupts just processed. */
864890 writel(cause, adapter->regs + A_PL_CAUSE);
865891 readl(adapter->regs + A_PL_CAUSE); /* flush writes */
866
- return 1;
892
+ return ret;
867893 }
868894
869
-int t1_slow_intr_handler(adapter_t *adapter)
895
+irqreturn_t t1_slow_intr_handler(adapter_t *adapter)
870896 {
871897 #ifdef CONFIG_CHELSIO_T1_1G
872898 if (!t1_is_asic(adapter))