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

📄 es2lan.c

📁 grub源码分析文档
💻 C
📖 第 1 页 / 共 3 页
字号:
	/* Transmit Descriptor Control 1 */	reg = er32(TXDCTL(1));	reg |= (1 << 22);	ew32(TXDCTL(1), reg);	/* Transmit Arbitration Control 0 */	reg = er32(TARC(0));	reg &= ~(0xF << 27); /* 30:27 */	if (hw->phy.media_type != e1000_media_type_copper)		reg &= ~(1 << 20);	ew32(TARC(0), reg);	/* Transmit Arbitration Control 1 */	reg = er32(TARC(1));	if (er32(TCTL) & E1000_TCTL_MULR)		reg &= ~(1 << 28);	else		reg |= (1 << 28);	ew32(TARC(1), reg);}/** *  e1000_copper_link_setup_gg82563_80003es2lan - Configure GG82563 Link *  @hw: pointer to the HW structure * *  Setup some GG82563 PHY registers for obtaining link **/static s32 e1000_copper_link_setup_gg82563_80003es2lan(struct e1000_hw *hw){	struct e1000_phy_info *phy = &hw->phy;	s32 ret_val;	u32 ctrl_ext;	u32 i = 0;	u16 data, data2;	ret_val = e1e_rphy(hw, GG82563_PHY_MAC_SPEC_CTRL, &data);	if (ret_val)		return ret_val;	data |= GG82563_MSCR_ASSERT_CRS_ON_TX;	/* Use 25MHz for both link down and 1000Base-T for Tx clock. */	data |= GG82563_MSCR_TX_CLK_1000MBPS_25;	ret_val = e1e_wphy(hw, GG82563_PHY_MAC_SPEC_CTRL, data);	if (ret_val)		return ret_val;	/*	 * Options:	 *   MDI/MDI-X = 0 (default)	 *   0 - Auto for all speeds	 *   1 - MDI mode	 *   2 - MDI-X mode	 *   3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)	 */	ret_val = e1e_rphy(hw, GG82563_PHY_SPEC_CTRL, &data);	if (ret_val)		return ret_val;	data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK;	switch (phy->mdix) {	case 1:		data |= GG82563_PSCR_CROSSOVER_MODE_MDI;		break;	case 2:		data |= GG82563_PSCR_CROSSOVER_MODE_MDIX;		break;	case 0:	default:		data |= GG82563_PSCR_CROSSOVER_MODE_AUTO;		break;	}	/*	 * Options:	 *   disable_polarity_correction = 0 (default)	 *       Automatic Correction for Reversed Cable Polarity	 *   0 - Disabled	 *   1 - Enabled	 */	data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE;	if (phy->disable_polarity_correction)		data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE;	ret_val = e1e_wphy(hw, GG82563_PHY_SPEC_CTRL, data);	if (ret_val)		return ret_val;	/* SW Reset the PHY so all changes take effect */	ret_val = e1000e_commit_phy(hw);	if (ret_val) {		hw_dbg(hw, "Error Resetting the PHY\n");		return ret_val;	}	/* Bypass Rx and Tx FIFO's */	ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_OFFSET_FIFO_CTRL,					E1000_KMRNCTRLSTA_FIFO_CTRL_RX_BYPASS |					E1000_KMRNCTRLSTA_FIFO_CTRL_TX_BYPASS);	if (ret_val)		return ret_val;	ret_val = e1000e_read_kmrn_reg(hw,				       E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE,				       &data);	if (ret_val)		return ret_val;	data |= E1000_KMRNCTRLSTA_OPMODE_E_IDLE;	ret_val = e1000e_write_kmrn_reg(hw,				        E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE,				        data);	if (ret_val)		return ret_val;	ret_val = e1e_rphy(hw, GG82563_PHY_SPEC_CTRL_2, &data);	if (ret_val)		return ret_val;	data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG;	ret_val = e1e_wphy(hw, GG82563_PHY_SPEC_CTRL_2, data);	if (ret_val)		return ret_val;	ctrl_ext = er32(CTRL_EXT);	ctrl_ext &= ~(E1000_CTRL_EXT_LINK_MODE_MASK);	ew32(CTRL_EXT, ctrl_ext);	ret_val = e1e_rphy(hw, GG82563_PHY_PWR_MGMT_CTRL, &data);	if (ret_val)		return ret_val;	/*	 * Do not init these registers when the HW is in IAMT mode, since the	 * firmware will have already initialized them.  We only initialize	 * them if the HW is not in IAMT mode.	 */	if (!e1000e_check_mng_mode(hw)) {		/* Enable Electrical Idle on the PHY */		data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE;		ret_val = e1e_wphy(hw, GG82563_PHY_PWR_MGMT_CTRL, data);		if (ret_val)			return ret_val;		do {			ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL,			                   &data);			if (ret_val)				return ret_val;			ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL,			                   &data2);			if (ret_val)				return ret_val;			i++;		} while ((data != data2) && (i < GG82563_MAX_KMRN_RETRY));		data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;		ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, data);		if (ret_val)			return ret_val;	}	/*	 * Workaround: Disable padding in Kumeran interface in the MAC	 * and in the PHY to avoid CRC errors.	 */	ret_val = e1e_rphy(hw, GG82563_PHY_INBAND_CTRL, &data);	if (ret_val)		return ret_val;	data |= GG82563_ICR_DIS_PADDING;	ret_val = e1e_wphy(hw, GG82563_PHY_INBAND_CTRL, data);	if (ret_val)		return ret_val;	return 0;}/** *  e1000_setup_copper_link_80003es2lan - Setup Copper Link for ESB2 *  @hw: pointer to the HW structure * *  Essentially a wrapper for setting up all things "copper" related. *  This is a function pointer entry point called by the mac module. **/static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw){	u32 ctrl;	s32 ret_val;	u16 reg_data;	ctrl = er32(CTRL);	ctrl |= E1000_CTRL_SLU;	ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);	ew32(CTRL, ctrl);	/*	 * Set the mac to wait the maximum time between each	 * iteration and increase the max iterations when	 * polling the phy; this fixes erroneous timeouts at 10Mbps.	 */	ret_val = e1000e_write_kmrn_reg(hw, GG82563_REG(0x34, 4), 0xFFFF);	if (ret_val)		return ret_val;	ret_val = e1000e_read_kmrn_reg(hw, GG82563_REG(0x34, 9), &reg_data);	if (ret_val)		return ret_val;	reg_data |= 0x3F;	ret_val = e1000e_write_kmrn_reg(hw, GG82563_REG(0x34, 9), reg_data);	if (ret_val)		return ret_val;	ret_val = e1000e_read_kmrn_reg(hw,				      E1000_KMRNCTRLSTA_OFFSET_INB_CTRL,				      &reg_data);	if (ret_val)		return ret_val;	reg_data |= E1000_KMRNCTRLSTA_INB_CTRL_DIS_PADDING;	ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_OFFSET_INB_CTRL,				        reg_data);	if (ret_val)		return ret_val;	ret_val = e1000_copper_link_setup_gg82563_80003es2lan(hw);	if (ret_val)		return ret_val;	ret_val = e1000e_setup_copper_link(hw);	return 0;}/** *  e1000_cfg_kmrn_10_100_80003es2lan - Apply "quirks" for 10/100 operation *  @hw: pointer to the HW structure *  @duplex: current duplex setting * *  Configure the KMRN interface by applying last minute quirks for *  10/100 operation. **/static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex){	s32 ret_val;	u32 tipg;	u32 i = 0;	u16 reg_data, reg_data2;	reg_data = E1000_KMRNCTRLSTA_HD_CTRL_10_100_DEFAULT;	ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_OFFSET_HD_CTRL,				        reg_data);	if (ret_val)		return ret_val;	/* Configure Transmit Inter-Packet Gap */	tipg = er32(TIPG);	tipg &= ~E1000_TIPG_IPGT_MASK;	tipg |= DEFAULT_TIPG_IPGT_10_100_80003ES2LAN;	ew32(TIPG, tipg);	do {		ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);		if (ret_val)			return ret_val;		ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data2);		if (ret_val)			return ret_val;		i++;	} while ((reg_data != reg_data2) && (i < GG82563_MAX_KMRN_RETRY));	if (duplex == HALF_DUPLEX)		reg_data |= GG82563_KMCR_PASS_FALSE_CARRIER;	else		reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;	ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);	return 0;}/** *  e1000_cfg_kmrn_1000_80003es2lan - Apply "quirks" for gigabit operation *  @hw: pointer to the HW structure * *  Configure the KMRN interface by applying last minute quirks for *  gigabit operation. **/static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw){	s32 ret_val;	u16 reg_data, reg_data2;	u32 tipg;	u32 i = 0;	reg_data = E1000_KMRNCTRLSTA_HD_CTRL_1000_DEFAULT;	ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_OFFSET_HD_CTRL,				        reg_data);	if (ret_val)		return ret_val;	/* Configure Transmit Inter-Packet Gap */	tipg = er32(TIPG);	tipg &= ~E1000_TIPG_IPGT_MASK;	tipg |= DEFAULT_TIPG_IPGT_1000_80003ES2LAN;	ew32(TIPG, tipg);	do {		ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);		if (ret_val)			return ret_val;		ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data2);		if (ret_val)			return ret_val;		i++;	} while ((reg_data != reg_data2) && (i < GG82563_MAX_KMRN_RETRY));	reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;	ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);	return ret_val;}/** *  e1000_clear_hw_cntrs_80003es2lan - Clear device specific hardware counters *  @hw: pointer to the HW structure * *  Clears the hardware counters by reading the counter registers. **/static void e1000_clear_hw_cntrs_80003es2lan(struct e1000_hw *hw){	u32 temp;	e1000e_clear_hw_cntrs_base(hw);	temp = er32(PRC64);	temp = er32(PRC127);	temp = er32(PRC255);	temp = er32(PRC511);	temp = er32(PRC1023);	temp = er32(PRC1522);	temp = er32(PTC64);	temp = er32(PTC127);	temp = er32(PTC255);	temp = er32(PTC511);	temp = er32(PTC1023);	temp = er32(PTC1522);	temp = er32(ALGNERRC);	temp = er32(RXERRC);	temp = er32(TNCRS);	temp = er32(CEXTERR);	temp = er32(TSCTC);	temp = er32(TSCTFC);	temp = er32(MGTPRC);	temp = er32(MGTPDC);	temp = er32(MGTPTC);	temp = er32(IAC);	temp = er32(ICRXOC);	temp = er32(ICRXPTC);	temp = er32(ICRXATC);	temp = er32(ICTXPTC);	temp = er32(ICTXATC);	temp = er32(ICTXQEC);	temp = er32(ICTXQMTC);	temp = er32(ICRXDMTC);}static struct e1000_mac_operations es2_mac_ops = {	.mng_mode_enab		= E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT,	/* check_for_link dependent on media type */	.cleanup_led		= e1000e_cleanup_led_generic,	.clear_hw_cntrs		= e1000_clear_hw_cntrs_80003es2lan,	.get_bus_info		= e1000e_get_bus_info_pcie,	.get_link_up_info	= e1000_get_link_up_info_80003es2lan,	.led_on			= e1000e_led_on_generic,	.led_off		= e1000e_led_off_generic,	.update_mc_addr_list	= e1000e_update_mc_addr_list_generic,	.reset_hw		= e1000_reset_hw_80003es2lan,	.init_hw		= e1000_init_hw_80003es2lan,	.setup_link		= e1000e_setup_link,	/* setup_physical_interface dependent on media type */};static struct e1000_phy_operations es2_phy_ops = {	.acquire_phy		= e1000_acquire_phy_80003es2lan,	.check_reset_block	= e1000e_check_reset_block_generic,	.commit_phy	 	= e1000e_phy_sw_reset,	.force_speed_duplex 	= e1000_phy_force_speed_duplex_80003es2lan,	.get_cfg_done       	= e1000_get_cfg_done_80003es2lan,	.get_cable_length   	= e1000_get_cable_length_80003es2lan,	.get_phy_info       	= e1000e_get_phy_info_m88,	.read_phy_reg       	= e1000_read_phy_reg_gg82563_80003es2lan,	.release_phy		= e1000_release_phy_80003es2lan,	.reset_phy	  	= e1000e_phy_hw_reset_generic,	.set_d0_lplu_state  	= NULL,	.set_d3_lplu_state  	= e1000e_set_d3_lplu_state,	.write_phy_reg      	= e1000_write_phy_reg_gg82563_80003es2lan,};static struct e1000_nvm_operations es2_nvm_ops = {	.acquire_nvm		= e1000_acquire_nvm_80003es2lan,	.read_nvm		= e1000e_read_nvm_eerd,	.release_nvm		= e1000_release_nvm_80003es2lan,	.update_nvm		= e1000e_update_nvm_checksum_generic,	.valid_led_default	= e1000e_valid_led_default,	.validate_nvm		= e1000e_validate_nvm_checksum_generic,	.write_nvm		= e1000_write_nvm_80003es2lan,};struct e1000_info e1000_es2_info = {	.mac			= e1000_80003es2lan,	.flags			= FLAG_HAS_HW_VLAN_FILTER				  | FLAG_HAS_MSI				  | FLAG_HAS_JUMBO_FRAMES				  | FLAG_HAS_WOL				  | FLAG_APME_IN_CTRL3				  | FLAG_RX_CSUM_ENABLED				  | FLAG_HAS_CTRLEXT_ON_LOAD				  | FLAG_RX_NEEDS_RESTART /* errata */				  | FLAG_TARC_SET_BIT_ZERO /* errata */				  | FLAG_APME_CHECK_PORT_B				  | FLAG_DISABLE_FC_PAUSE_TIME /* errata */				  | FLAG_TIPG_MEDIUM_FOR_80003ESLAN,	.pba			= 38,	.get_variants		= e1000_get_variants_80003es2lan,	.mac_ops		= &es2_mac_ops,	.phy_ops		= &es2_phy_ops,	.nvm_ops		= &es2_nvm_ops,};

⌨️ 快捷键说明

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