static int t1_pci_intr_handler(adapter_t *adapter) { u32 pcix_cause; pci_read_config_dword(adapter->pdev, A_PCICFG_INTR_CAUSE, &pcix_cause); if (pcix_cause) { pci_write_config_dword(adapter->pdev, A_PCICFG_INTR_CAUSE, pcix_cause); t1_fatal_err(adapter); /* PCI errors are fatal */ } return 0; }
/* 3. Deassert rx_reset_link */ static int tricn_init(adapter_t *adapter) { int i = 0; int sme = 1; int stat = 0; int timeout = 0; int is_ready = 0; int dynamic_deskew = 0; if (dynamic_deskew) sme = 0; /* 1 */ timeout=1000; do { stat = readl(adapter->regs + A_ESPI_RX_RESET); is_ready = (stat & 0x4); timeout--; udelay(5); } while (!is_ready || (timeout==0)); writel(0x2, adapter->regs + A_ESPI_RX_RESET); if (timeout==0) { CH_ERR("ESPI : ERROR : Timeout tricn_init() \n"); t1_fatal_err(adapter); } /* 2 */ if (sme) { tricn_write(adapter, 0, 0, 0, TRICN_CNFG, 0x81); tricn_write(adapter, 0, 1, 0, TRICN_CNFG, 0x81); tricn_write(adapter, 0, 2, 0, TRICN_CNFG, 0x81); } for (i=1; i<= 8; i++) tricn_write(adapter, 0, 0, i, TRICN_CNFG, 0xf1); for (i=1; i<= 2; i++) tricn_write(adapter, 0, 1, i, TRICN_CNFG, 0xf1); for (i=1; i<= 3; i++) tricn_write(adapter, 0, 2, i, TRICN_CNFG, 0xe1); for (i=4; i<= 4; i++) tricn_write(adapter, 0, 2, i, TRICN_CNFG, 0xf1); for (i=5; i<= 5; i++) tricn_write(adapter, 0, 2, i, TRICN_CNFG, 0xe1); for (i=6; i<= 6; i++) tricn_write(adapter, 0, 2, i, TRICN_CNFG, 0xf1); for (i=7; i<= 7; i++) tricn_write(adapter, 0, 2, i, TRICN_CNFG, 0x80); for (i=8; i<= 8; i++) tricn_write(adapter, 0, 2, i, TRICN_CNFG, 0xf1); /* 3 */ writel(0x3, adapter->regs + A_ESPI_RX_RESET); return 0; }
int t1_mc4_intr_handler(struct pemc4 *mc4) { adapter_t *adapter = mc4->adapter; u32 cause = t1_read_reg_4(adapter, A_MC4_INT_CAUSE); if (cause & F_MC4_CORR_ERR) { mc4->intr_cnt.corr_err++; CH_WARN("%s: MC4 correctable error at addr 0x%x, " "data 0x%x 0x%x 0x%x 0x%x 0x%x\n", adapter_name(adapter), G_MC4_CE_ADDR(t1_read_reg_4(adapter, A_MC4_CE_ADDR)), t1_read_reg_4(adapter, A_MC4_CE_DATA0), t1_read_reg_4(adapter, A_MC4_CE_DATA1), t1_read_reg_4(adapter, A_MC4_CE_DATA2), t1_read_reg_4(adapter, A_MC4_CE_DATA3), t1_read_reg_4(adapter, A_MC4_CE_DATA4)); } if (cause & F_MC4_UNCORR_ERR) { mc4->intr_cnt.uncorr_err++; CH_ALERT("%s: MC4 uncorrectable error at addr 0x%x, " "data 0x%x 0x%x 0x%x 0x%x 0x%x\n", adapter_name(adapter), G_MC4_UE_ADDR(t1_read_reg_4(adapter, A_MC4_UE_ADDR)), t1_read_reg_4(adapter, A_MC4_UE_DATA0), t1_read_reg_4(adapter, A_MC4_UE_DATA1), t1_read_reg_4(adapter, A_MC4_UE_DATA2), t1_read_reg_4(adapter, A_MC4_UE_DATA3), t1_read_reg_4(adapter, A_MC4_UE_DATA4)); } if (cause & F_MC4_ADDR_ERR) { mc4->intr_cnt.addr_err++; CH_ALERT("%s: MC4 address error\n", adapter_name(adapter)); } if (cause & MC4_INT_FATAL) t1_fatal_err(adapter); t1_write_reg_4(mc4->adapter, A_MC4_INT_CAUSE, cause); return 0; }
int t1_mc3_intr_handler(struct pemc3 *mc3) { adapter_t *adapter = mc3->adapter; int cause_reg = A_MC3_INT_CAUSE; u32 cause; #ifdef CONFIG_CHELSIO_T1_1G if (!t1_is_asic(adapter)) cause_reg = FPGA_MC3_REG_INTRCAUSE; #endif cause = t1_read_reg_4(adapter, cause_reg); if (cause & F_MC3_CORR_ERR) { mc3->intr_cnt.corr_err++; CH_WARN("%s: MC3 correctable error at addr 0x%x, " "data 0x%x 0x%x 0x%x 0x%x 0x%x\n", adapter_name(adapter), G_MC3_CE_ADDR(t1_read_reg_4(adapter, A_MC3_CE_ADDR)), t1_read_reg_4(adapter, A_MC3_CE_DATA0), t1_read_reg_4(adapter, A_MC3_CE_DATA1), t1_read_reg_4(adapter, A_MC3_CE_DATA2), t1_read_reg_4(adapter, A_MC3_CE_DATA3), t1_read_reg_4(adapter, A_MC3_CE_DATA4)); } if (cause & F_MC3_UNCORR_ERR) { mc3->intr_cnt.uncorr_err++; CH_ALERT("%s: MC3 uncorrectable error at addr 0x%x, " "data 0x%x 0x%x 0x%x 0x%x 0x%x\n", adapter_name(adapter), G_MC3_UE_ADDR(t1_read_reg_4(adapter, A_MC3_UE_ADDR)), t1_read_reg_4(adapter, A_MC3_UE_DATA0), t1_read_reg_4(adapter, A_MC3_UE_DATA1), t1_read_reg_4(adapter, A_MC3_UE_DATA2), t1_read_reg_4(adapter, A_MC3_UE_DATA3), t1_read_reg_4(adapter, A_MC3_UE_DATA4)); } if (G_MC3_PARITY_ERR(cause)) { mc3->intr_cnt.parity_err++; CH_ALERT("%s: MC3 parity error 0x%x\n", adapter_name(adapter), G_MC3_PARITY_ERR(cause)); } if (cause & F_MC3_ADDR_ERR) { mc3->intr_cnt.addr_err++; CH_ALERT("%s: MC3 address error\n", adapter_name(adapter)); } if (cause & MC3_INTR_FATAL) t1_fatal_err(adapter); if (t1_is_T1B(adapter)) { /* * Workaround for T1B bug: we must write to enable register to * clear interrupts. */ t1_write_reg_4(adapter, A_MC3_INT_ENABLE, cause); /* restore enable */ t1_write_reg_4(adapter, A_MC3_INT_ENABLE, MC3_INTR_MASK); } else t1_write_reg_4(adapter, cause_reg, cause); return 0; }