int t1_espi_init(struct peespi *espi, int mac_type, int nports) { u32 status_enable_extra = 0; adapter_t *adapter = espi->adapter; /* Disable ESPI training. MACs that can handle it enable it below. */ writel(0, adapter->regs + A_ESPI_TRAIN); if (is_T2(adapter)) { writel(V_OUT_OF_SYNC_COUNT(4) | V_DIP2_PARITY_ERR_THRES(3) | V_DIP4_THRES(1), adapter->regs + A_ESPI_MISC_CONTROL); writel(nports == 4 ? 0x200040 : 0x1000080, adapter->regs + A_ESPI_MAXBURST1_MAXBURST2); } else writel(0x800100, adapter->regs + A_ESPI_MAXBURST1_MAXBURST2); if (mac_type == CHBT_MAC_PM3393) espi_setup_for_pm3393(adapter); else if (mac_type == CHBT_MAC_VSC7321) espi_setup_for_vsc7321(adapter); else if (mac_type == CHBT_MAC_IXF1010) { status_enable_extra = F_INTEL1010MODE; espi_setup_for_ixf1010(adapter, nports); } else return -1; writel(status_enable_extra | F_RXSTATUSENABLE, adapter->regs + A_ESPI_FIFO_STATUS_ENABLE); if (is_T2(adapter)) { tricn_init(adapter); /* * Always position the control at the 1st port egress IN * (sop,eop) counter to reduce PIOs for T/N210 workaround. */ espi->misc_ctrl = readl(adapter->regs + A_ESPI_MISC_CONTROL); espi->misc_ctrl &= ~MON_MASK; espi->misc_ctrl |= F_MONITORED_DIRECTION; if (adapter->params.nports == 1) espi->misc_ctrl |= F_MONITORED_INTERFACE; writel(espi->misc_ctrl, adapter->regs + A_ESPI_MISC_CONTROL); spin_lock_init(&espi->lock); } return 0; }
int t1_espi_init(struct peespi *espi, int mac_type, int nports) { u32 status_enable_extra = 0; adapter_t *adapter = espi->adapter; writel(0, adapter->regs + A_ESPI_TRAIN); if (is_T2(adapter)) { writel(V_OUT_OF_SYNC_COUNT(4) | V_DIP2_PARITY_ERR_THRES(3) | V_DIP4_THRES(1), adapter->regs + A_ESPI_MISC_CONTROL); writel(nports == 4 ? 0x200040 : 0x1000080, adapter->regs + A_ESPI_MAXBURST1_MAXBURST2); } else writel(0x800100, adapter->regs + A_ESPI_MAXBURST1_MAXBURST2); if (mac_type == CHBT_MAC_PM3393) espi_setup_for_pm3393(adapter); else if (mac_type == CHBT_MAC_VSC7321) espi_setup_for_vsc7321(adapter); else if (mac_type == CHBT_MAC_IXF1010) { status_enable_extra = F_INTEL1010MODE; espi_setup_for_ixf1010(adapter, nports); } else return -1; writel(status_enable_extra | F_RXSTATUSENABLE, adapter->regs + A_ESPI_FIFO_STATUS_ENABLE); if (is_T2(adapter)) { tricn_init(adapter); espi->misc_ctrl = readl(adapter->regs + A_ESPI_MISC_CONTROL); espi->misc_ctrl &= ~MON_MASK; espi->misc_ctrl |= F_MONITORED_DIRECTION; if (adapter->params.nports == 1) espi->misc_ctrl |= F_MONITORED_INTERFACE; writel(espi->misc_ctrl, adapter->regs + A_ESPI_MISC_CONTROL); spin_lock_init(&espi->lock); } return 0; }
/* 3. Init TriCN Hard Macro */ int t1_espi_init(struct peespi *espi, int mac_type, int nports) { u32 cnt; u32 status_enable_extra = 0; adapter_t *adapter = espi->adapter; u32 status, burstval = 0x800100; /* Disable ESPI training. MACs that can handle it enable it below. */ writel(0, adapter->regs + A_ESPI_TRAIN); if (is_T2(adapter)) { writel(V_OUT_OF_SYNC_COUNT(4) | V_DIP2_PARITY_ERR_THRES(3) | V_DIP4_THRES(1), adapter->regs + A_ESPI_MISC_CONTROL); if (nports == 4) { /* T204: maxburst1 = 0x40, maxburst2 = 0x20 */ burstval = 0x200040; } } writel(burstval, adapter->regs + A_ESPI_MAXBURST1_MAXBURST2); switch (mac_type) { case CHBT_MAC_PM3393: espi_setup_for_pm3393(adapter); break; default: return -1; } /* * Make sure any pending interrupts from the SPI are * Cleared before enabling the interrupt. */ writel(ESPI_INTR_MASK, espi->adapter->regs + A_ESPI_INTR_ENABLE); status = readl(espi->adapter->regs + A_ESPI_INTR_STATUS); if (status & F_DIP2PARITYERR) { cnt = readl(espi->adapter->regs + A_ESPI_DIP2_ERR_COUNT); } /* * For T1B we need to write 1 to clear ESPI interrupts. For T2+ we * write the status as is. */ if (status && t1_is_T1B(espi->adapter)) status = 1; writel(status, espi->adapter->regs + A_ESPI_INTR_STATUS); writel(status_enable_extra | F_RXSTATUSENABLE, adapter->regs + A_ESPI_FIFO_STATUS_ENABLE); if (is_T2(adapter)) { tricn_init(adapter); /* * Always position the control at the 1st port egress IN * (sop,eop) counter to reduce PIOs for T/N210 workaround. */ espi->misc_ctrl = (readl(adapter->regs + A_ESPI_MISC_CONTROL) & ~MON_MASK) | (F_MONITORED_DIRECTION | F_MONITORED_INTERFACE); writel(espi->misc_ctrl, adapter->regs + A_ESPI_MISC_CONTROL); spin_lock_init(&espi->lock); } return 0; }