⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subr.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		} else			phy->ops->autoneg_enable(phy); /* also resets PHY */	} else {		mac->ops->set_speed_duplex_fc(mac, -1, -1, fc);		lc->fc = (unsigned char)fc;		phy->ops->reset(phy, 0);	}	return 0;}/* * External interrupt handler for boards using elmer0. */int elmer0_ext_intr_handler(adapter_t *adapter){    	struct cphy *phy;	int phy_cause;    	u32 cause;	t1_tpi_read(adapter, A_ELMER0_INT_CAUSE, &cause);	switch (board_info(adapter)->board) {	case CHBT_BOARD_N210:	case CHBT_BOARD_N110:		if (cause & ELMER0_GP_BIT6) { /* Marvell 88x2010 interrupt */			phy = adapter->port[0].phy;			phy_cause = phy->ops->interrupt_handler(phy);			if (phy_cause & cphy_cause_link_change)				link_changed(adapter, 0);		}		break;	}	t1_tpi_write(adapter, A_ELMER0_INT_CAUSE, cause);	return 0;}/* Enables all interrupts. */void t1_interrupts_enable(adapter_t *adapter){	unsigned int i;	u32 pl_intr;	adapter->slow_intr_mask = F_PL_INTR_SGE_ERR;	t1_sge_intr_enable(adapter->sge);	if (adapter->espi) {		adapter->slow_intr_mask |= F_PL_INTR_ESPI;		t1_espi_intr_enable(adapter->espi);	}	/* Enable MAC/PHY interrupts for each port. */	for_each_port(adapter, i) {		adapter->port[i].mac->ops->interrupt_enable(adapter->port[i].mac);		adapter->port[i].phy->ops->interrupt_enable(adapter->port[i].phy);	}	/* Enable PCIX & external chip interrupts on ASIC boards. */	pl_intr = readl(adapter->regs + A_PL_ENABLE);	/* PCI-X interrupts */	pci_write_config_dword(adapter->pdev, A_PCICFG_INTR_ENABLE,			       0xffffffff);	adapter->slow_intr_mask |= F_PL_INTR_EXT | F_PL_INTR_PCIX;	pl_intr |= F_PL_INTR_EXT | F_PL_INTR_PCIX;	writel(pl_intr, adapter->regs + A_PL_ENABLE);}/* Disables all interrupts. */void t1_interrupts_disable(adapter_t* adapter){	unsigned int i;	t1_sge_intr_disable(adapter->sge);	if (adapter->espi)		t1_espi_intr_disable(adapter->espi);	/* Disable MAC/PHY interrupts for each port. */	for_each_port(adapter, i) {		adapter->port[i].mac->ops->interrupt_disable(adapter->port[i].mac);		adapter->port[i].phy->ops->interrupt_disable(adapter->port[i].phy);	}	/* Disable PCIX & external chip interrupts. */	writel(0, adapter->regs + A_PL_ENABLE);	/* PCI-X interrupts */	pci_write_config_dword(adapter->pdev, A_PCICFG_INTR_ENABLE, 0);	adapter->slow_intr_mask = 0;}/* Clears all interrupts */void t1_interrupts_clear(adapter_t* adapter){	unsigned int i;	u32 pl_intr;	t1_sge_intr_clear(adapter->sge);	if (adapter->espi)		t1_espi_intr_clear(adapter->espi);	/* Clear MAC/PHY interrupts for each port. */	for_each_port(adapter, i) {		adapter->port[i].mac->ops->interrupt_clear(adapter->port[i].mac);		adapter->port[i].phy->ops->interrupt_clear(adapter->port[i].phy);	}	/* Enable interrupts for external devices. */    	pl_intr = readl(adapter->regs + A_PL_CAUSE);	writel(pl_intr | F_PL_INTR_EXT | F_PL_INTR_PCIX,	       adapter->regs + A_PL_CAUSE);	/* PCI-X interrupts */	pci_write_config_dword(adapter->pdev, A_PCICFG_INTR_CAUSE, 0xffffffff);}/* * Slow path interrupt handler for ASICs. */int t1_slow_intr_handler(adapter_t *adapter){	u32 cause = readl(adapter->regs + A_PL_CAUSE);	cause &= adapter->slow_intr_mask;	if (!cause)		return 0;	if (cause & F_PL_INTR_SGE_ERR)		t1_sge_intr_error_handler(adapter->sge);	if (cause & F_PL_INTR_ESPI)		t1_espi_intr_handler(adapter->espi);	if (cause & F_PL_INTR_PCIX)		t1_pci_intr_handler(adapter);	if (cause & F_PL_INTR_EXT)		t1_elmer0_ext_intr(adapter);	/* Clear the interrupts just processed. */	writel(cause, adapter->regs + A_PL_CAUSE);	(void)readl(adapter->regs + A_PL_CAUSE); /* flush writes */	return 1;}/* Pause deadlock avoidance parameters */#define DROP_MSEC 16#define DROP_PKTS_CNT  1static void set_csum_offload(adapter_t *adapter, u32 csum_bit, int enable){	u32 val = readl(adapter->regs + A_TP_GLOBAL_CONFIG);	if (enable)		val |= csum_bit;	else		val &= ~csum_bit;	writel(val, adapter->regs + A_TP_GLOBAL_CONFIG);}void t1_tp_set_ip_checksum_offload(adapter_t *adapter, int enable){	set_csum_offload(adapter, F_IP_CSUM, enable);}void t1_tp_set_udp_checksum_offload(adapter_t *adapter, int enable){	set_csum_offload(adapter, F_UDP_CSUM, enable);}void t1_tp_set_tcp_checksum_offload(adapter_t *adapter, int enable){	set_csum_offload(adapter, F_TCP_CSUM, enable);}static void t1_tp_reset(adapter_t *adapter, unsigned int tp_clk){	u32 val;	val = F_TP_IN_CSPI_CPL | F_TP_IN_CSPI_CHECK_IP_CSUM |	      F_TP_IN_CSPI_CHECK_TCP_CSUM | F_TP_IN_ESPI_ETHERNET;	val |= F_TP_IN_ESPI_CHECK_IP_CSUM |	       F_TP_IN_ESPI_CHECK_TCP_CSUM;	writel(val, adapter->regs + A_TP_IN_CONFIG);	writel(F_TP_OUT_CSPI_CPL |	       F_TP_OUT_ESPI_ETHERNET |	       F_TP_OUT_ESPI_GENERATE_IP_CSUM |	       F_TP_OUT_ESPI_GENERATE_TCP_CSUM,	       adapter->regs + A_TP_OUT_CONFIG);	val = readl(adapter->regs + A_TP_GLOBAL_CONFIG);	val &= ~(F_IP_CSUM | F_UDP_CSUM | F_TCP_CSUM);	writel(val, adapter->regs + A_TP_GLOBAL_CONFIG);	/*	 * Enable pause frame deadlock prevention.	 */	if (is_T2(adapter)) {		u32 drop_ticks = DROP_MSEC * (tp_clk / 1000);		writel(F_ENABLE_TX_DROP | F_ENABLE_TX_ERROR |		       V_DROP_TICKS_CNT(drop_ticks) |		       V_NUM_PKTS_DROPPED(DROP_PKTS_CNT),		       adapter->regs + A_TP_TX_DROP_CONFIG);	}	writel(F_TP_RESET, adapter->regs + A_TP_RESET);}int __devinit t1_get_board_rev(adapter_t *adapter, const struct board_info *bi,			       struct adapter_params *p){	p->chip_version = bi->chip_term;	if (p->chip_version == CHBT_TERM_T1 ||	    p->chip_version == CHBT_TERM_T2) {		u32 val = readl(adapter->regs + A_TP_PC_CONFIG);		val = G_TP_PC_REV(val);		if (val == 2)			p->chip_revision = TERM_T1B;		else if (val == 3)			p->chip_revision = TERM_T2;		else			return -1;	} else		return -1;	return 0;}/* * Enable board components other than the Chelsio chip, such as external MAC * and PHY. */static int board_init(adapter_t *adapter, const struct board_info *bi){	switch (bi->board) {	case CHBT_BOARD_N110:	case CHBT_BOARD_N210:		writel(V_TPIPAR(0xf), adapter->regs + A_TPI_PAR);    		t1_tpi_write(adapter, A_ELMER0_GPO, 0x800);		break;	}	return 0;}/* * Initialize and configure the Terminator HW modules.  Note that external * MAC and PHYs are initialized separately. */int t1_init_hw_modules(adapter_t *adapter){	int err = -EIO;	const struct board_info *bi = board_info(adapter);	if (!bi->clock_mc4) {		u32 val = readl(adapter->regs + A_MC4_CFG);		writel(val | F_READY | F_MC4_SLOW, adapter->regs + A_MC4_CFG);		writel(F_M_BUS_ENABLE | F_TCAM_RESET,		       adapter->regs + A_MC5_CONFIG);	}	if (adapter->espi && t1_espi_init(adapter->espi, bi->chip_mac,					  bi->espi_nports))		goto out_err;	t1_tp_reset(adapter, bi->clock_core);	err = t1_sge_configure(adapter->sge, &adapter->params.sge);	if (err)		goto out_err;	err = 0; out_err:	return err;}/* * Determine a card's PCI mode. */static void __devinit get_pci_mode(adapter_t *adapter, struct chelsio_pci_params *p){	static unsigned short speed_map[] = { 33, 66, 100, 133 };	u32 pci_mode;	pci_read_config_dword(adapter->pdev, A_PCICFG_MODE, &pci_mode);	p->speed = speed_map[G_PCI_MODE_CLK(pci_mode)];	p->width = (pci_mode & F_PCI_MODE_64BIT) ? 64 : 32;	p->is_pcix = (pci_mode & F_PCI_MODE_PCIX) != 0;}/* * Release the structures holding the SW per-Terminator-HW-module state. */void t1_free_sw_modules(adapter_t *adapter){	unsigned int i;	for_each_port(adapter, i) {		struct cmac *mac = adapter->port[i].mac;		struct cphy *phy = adapter->port[i].phy;		if (mac)			mac->ops->destroy(mac);		if (phy)			phy->ops->destroy(phy);	}	if (adapter->sge)		t1_sge_destroy(adapter->sge);	if (adapter->espi)		t1_espi_destroy(adapter->espi);}static void __devinit init_link_config(struct link_config *lc,				       const struct board_info *bi){	lc->supported = bi->caps;	lc->requested_speed = lc->speed = SPEED_INVALID;	lc->requested_duplex = lc->duplex = DUPLEX_INVALID;	lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX;	if (lc->supported & SUPPORTED_Autoneg) {		lc->advertising = lc->supported;		lc->autoneg = AUTONEG_ENABLE;		lc->requested_fc |= PAUSE_AUTONEG;	} else {		lc->advertising = 0;		lc->autoneg = AUTONEG_DISABLE;	}}/* * Allocate and initialize the data structures that hold the SW state of * the Terminator HW modules. */int __devinit t1_init_sw_modules(adapter_t *adapter,				 const struct board_info *bi){	unsigned int i;	adapter->params.brd_info = bi;	adapter->params.nports = bi->port_number;	adapter->params.stats_update_period = bi->gmac->stats_update_period;	adapter->sge = t1_sge_create(adapter, &adapter->params.sge);	if (!adapter->sge) {		CH_ERR("%s: SGE initialization failed\n",		       adapter->name);		goto error;	}	if (bi->espi_nports && !(adapter->espi = t1_espi_create(adapter))) {		CH_ERR("%s: ESPI initialization failed\n",		       adapter->name);		goto error;	}	board_init(adapter, bi);	bi->mdio_ops->init(adapter, bi);	if (bi->gphy->reset)		bi->gphy->reset(adapter);	if (bi->gmac->reset)		bi->gmac->reset(adapter);	for_each_port(adapter, i) {		u8 hw_addr[6];		struct cmac *mac;		int phy_addr = bi->mdio_phybaseaddr + i;		adapter->port[i].phy = bi->gphy->create(adapter, phy_addr,							bi->mdio_ops);		if (!adapter->port[i].phy) {			CH_ERR("%s: PHY %d initialization failed\n",			       adapter->name, i);			goto error;		}		adapter->port[i].mac = mac = bi->gmac->create(adapter, i);		if (!mac) {			CH_ERR("%s: MAC %d initialization failed\n",			       adapter->name, i);			goto error;		}		/*		 * Get the port's MAC addresses either from the EEPROM if one		 * exists or the one hardcoded in the MAC.		 */		if (vpd_macaddress_get(adapter, i, hw_addr)) {			CH_ERR("%s: could not read MAC address from VPD ROM\n",			       adapter->port[i].dev->name);			goto error;		}		memcpy(adapter->port[i].dev->dev_addr, hw_addr, ETH_ALEN);		init_link_config(&adapter->port[i].link_config, bi);	}	get_pci_mode(adapter, &adapter->params.pci);	t1_interrupts_clear(adapter);	return 0; error:	t1_free_sw_modules(adapter);	return -1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -