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

📄 realtekr1000.cpp

📁 Mac OS X 下的网卡驱动
💻 CPP
📖 第 1 页 / 共 4 页
字号:
}bool RealtekR1000::R1000ProbeAndStartBoard(){	if (!R1000InitBoard()) return false;	curr_mtu_size = DEFAULT_MTU;	tx_pkt_len = DEFAULT_MTU + ETH_HDR_LEN;	rx_pkt_len = DEFAULT_MTU + ETH_HDR_LEN;	hw_rx_pkt_len = rx_pkt_len + 8;		//Config PHY	R1000HwPhyConfig();		DLog("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");	WriteMMIO8(0x82, 0x01);	if (mcfg < MCFG_METHOD_3)	{		DLog("Set PCI Latency=0x40\n");		pciDev->configWrite8(kIOPCIConfigLatencyTimer, 0x40);	}		if (mcfg == MCFG_METHOD_2)	{		DLog("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");		WriteMMIO8(0x82, 0x01);		DLog("Set PHY Reg 0x0bh = 0x00h\n");		WriteGMII32(0x0b, 0x0000);	//w 0x0b 15 0 0	}		int speed_opt = SPEED_100;	int duplex_opt = DUPLEX_FULL;	int autoneg_opt = AUTONEG_ENABLE;	int val = 0;			// if TBI is not endbled	if (!(ReadMMIO8(PHYstatus) & TBI_Enable))	{		val = ReadGMII32(PHY_AUTO_NEGO_REG);		val |= PHY_Cap_PAUSE | PHY_Cap_ASYM_PAUSE ;		R1000SetMedium(speed_opt, duplex_opt, autoneg_opt);	}// end of TBI is not enabled	else	{		IODelay(100);		DLog("1000Mbps Full-duplex operation, TBI Link %s!\n", (ReadMMIO32(TBICSR) & TBILinkOK) ? "OK" : "Failed" );	}// end of TBI is not enabled	#ifdef DEBUG		if (ReadMMIO8(PHYstatus) & LinkStatus)	{		DLog("Link Status: %s\n","Linked");		if (ReadMMIO8(PHYstatus) & _1000Mbps) DLog("Link Speed: 1000Mbps\n");		else if(ReadMMIO8(PHYstatus) & _100Mbps) DLog("Link Speed: 100Mbps\n");		else if(ReadMMIO8(PHYstatus) & _10Mbps) DLog("Link Speed: 10Mbps\n");		DLog("Duplex mode: %s\n", ReadMMIO8(PHYstatus) & FullDup ? "Full-Duplex" : "Half-Duplex");	}	else	{		DLog("Link Status: %s\n","Not Linked");	}#endif	return true;}	bool RealtekR1000::R1000StopBoard(){	return true;}bool RealtekR1000::R1000SetSpeedDuplex(ulong anar, ulong gbcr, ulong bmcr) {	unsigned int i = 0;	unsigned int bmsr;	WriteGMII32(PHY_AUTO_NEGO_REG, anar);	WriteGMII32(PHY_1000_CTRL_REG, gbcr);	WriteGMII32(PHY_CTRL_REG, bmcr);	for(i=0; i<10000; i++)	{		bmsr = ReadGMII32(PHY_STAT_REG);		if (bmsr & PHY_Auto_Neco_Comp) return true;	}	return false;	}bool RealtekR1000::R1000SetMedium(ushort speed, uchar duplex, uchar autoneg){	ulong anar=0, gbcr=0, bmcr=0, val=0;	val = ReadGMII32(PHY_AUTO_NEGO_REG);	val |= PHY_Cap_PAUSE | PHY_Cap_ASYM_PAUSE ;	bmcr = PHY_Restart_Auto_Nego|PHY_Enable_Auto_Nego;	if(autoneg == AUTONEG_ENABLE)	{		this->autoneg = AUTONEG_ENABLE;		anar = PHY_Cap_10_Half | PHY_Cap_10_Full | PHY_Cap_100_Half | PHY_Cap_100_Full;		gbcr = PHY_Cap_1000_Half | PHY_Cap_1000_Full;	}	else	{		this->autoneg = AUTONEG_DISABLE;		if(speed == SPEED_1000)		{			this->speed = SPEED_1000;			this->duplex = DUPLEX_FULL;			anar = PHY_Cap_10_Half | PHY_Cap_10_Full | PHY_Cap_100_Half | PHY_Cap_100_Full;			if ((mcfg == MCFG_METHOD_13) || (mcfg == MCFG_METHOD_14) ||				 (mcfg == MCFG_METHOD_15)) gbcr = PHY_Cap_Null;			else gbcr = PHY_Cap_1000_Half | PHY_Cap_1000_Full;		}		else if ((speed == SPEED_100) && (duplex == DUPLEX_FULL))		{			this->speed = SPEED_100;			this->duplex = DUPLEX_FULL;			anar = PHY_Cap_10_Half | PHY_Cap_10_Full | PHY_Cap_100_Half | PHY_Cap_100_Full;			gbcr = PHY_Cap_Null;		}		else if (( speed == SPEED_100) && (duplex == DUPLEX_HALF))		{			this->speed = SPEED_100;			this->duplex = DUPLEX_HALF;			anar = PHY_Cap_10_Half | PHY_Cap_10_Full | PHY_Cap_100_Half;			gbcr = PHY_Cap_Null;		}		else if((speed == SPEED_10) && (duplex == DUPLEX_FULL))		{			this->speed = SPEED_10;			this->duplex = DUPLEX_FULL;			anar = PHY_Cap_10_Half | PHY_Cap_10_Full;			gbcr = PHY_Cap_Null;		}		else if ((speed == SPEED_10) && (duplex == DUPLEX_HALF))		{			this->speed = SPEED_10;			this->duplex = DUPLEX_HALF;			anar = PHY_Cap_10_Half;			gbcr = PHY_Cap_Null;		}		else		{			this->speed = SPEED_100;			this->duplex = DUPLEX_FULL;			anar = PHY_Cap_10_Half|PHY_Cap_10_Full|PHY_Cap_100_Half|PHY_Cap_100_Full;			gbcr = PHY_Cap_Null;		}	}	//enable flow control	anar |=  val & 0xC1F;	return R1000SetSpeedDuplex(anar, gbcr, bmcr);}void RealtekR1000::R1000HwPhyReset(){	int val, phy_reset_expiretime = 50;	DLog("Reset PHY\n");	val = (ReadGMII32(0) | 0x8000) & 0xffff;	WriteGMII32(0, val);	do //waiting for phy reset	{		if (ReadGMII32(0) & 0x8000)		{			phy_reset_expiretime --;			IODelay(100);		}		else		{			break;		}	}	while (phy_reset_expiretime >= 0);}void RealtekR1000::R1000HwPhyConfig(){	DLog("PHY config\n");	if (mcfg == MCFG_METHOD_4 )	{#if 0		WriteGMII32(0x1F, 0x0001);		WriteGMII32(0x1b, 0x841e);		WriteGMII32(0x0e, 0x7bfb);		WriteGMII32(0x09, 0x273a);#endif		WriteGMII32(0x1F, 0x0002);		WriteGMII32(0x01, 0x90D0);		WriteGMII32(0x1F, 0x0000);	}	else if ((mcfg == MCFG_METHOD_2) || (mcfg == MCFG_METHOD_3))	{		WriteGMII32(0x1f, 0x0001);		WriteGMII32(0x06, 0x006e);		WriteGMII32(0x08, 0x0708);		WriteGMII32(0x15, 0x4000);		WriteGMII32(0x18, 0x65c7);		WriteGMII32(0x1f, 0x0001);		WriteGMII32(0x03, 0x00a1);		WriteGMII32(0x02, 0x0008);		WriteGMII32(0x01, 0x0120);		WriteGMII32(0x00, 0x1000);		WriteGMII32(0x04, 0x0800);		WriteGMII32(0x04, 0x0000);		WriteGMII32(0x03, 0xff41);		WriteGMII32(0x02, 0xdf60);		WriteGMII32(0x01, 0x0140);		WriteGMII32(0x00, 0x0077);		WriteGMII32(0x04, 0x7800);		WriteGMII32(0x04, 0x7000);		WriteGMII32(0x03, 0x802f);		WriteGMII32(0x02, 0x4f02);		WriteGMII32(0x01, 0x0409);		WriteGMII32(0x00, 0xf0f9);		WriteGMII32(0x04, 0x9800);		WriteGMII32(0x04, 0x9000);		WriteGMII32(0x03, 0xdf01);		WriteGMII32(0x02, 0xdf20);		WriteGMII32(0x01, 0xff95);		WriteGMII32(0x00, 0xba00);		WriteGMII32(0x04, 0xa800);		WriteGMII32(0x04, 0xa000);		WriteGMII32(0x03, 0xff41);		WriteGMII32(0x02, 0xdf20);		WriteGMII32(0x01, 0x0140);		WriteGMII32(0x00, 0x00bb);		WriteGMII32(0x04, 0xb800);		WriteGMII32(0x04, 0xb000);		WriteGMII32(0x03, 0xdf41);		WriteGMII32(0x02, 0xdc60);		WriteGMII32(0x01, 0x6340);		WriteGMII32(0x00, 0x007d);		WriteGMII32(0x04, 0xd800);		WriteGMII32(0x04, 0xd000);		WriteGMII32(0x03, 0xdf01);		WriteGMII32(0x02, 0xdf20);		WriteGMII32(0x01, 0x100a);		WriteGMII32(0x00, 0xa0ff);		WriteGMII32(0x04, 0xf800);		WriteGMII32(0x04, 0xf000);		WriteGMII32(0x1f, 0x0000);		WriteGMII32(0x0b, 0x0000);		WriteGMII32(0x00, 0x9200);#if 0		WriteGMII32(0x1F, 0x0001);		WriteGMII32(0x15, 0x1000);		WriteGMII32(0x18, 0x65C7);		WriteGMII32(0x04, 0x0000);		WriteGMII32(0x03, 0x00A1);		WriteGMII32(0x02, 0x0008);		WriteGMII32(0x01, 0x1020);		WriteGMII32(0x00, 0x1000);		WriteGMII32(0x04, 0x0800);		WriteGMII32(0x04, 0x0000);		WriteGMII32(0x04, 0x7000);		WriteGMII32(0x03, 0xFF41);		WriteGMII32(0x02, 0xDE60);		WriteGMII32(0x01, 0x0140);		WriteGMII32(0x00, 0x0077);		WriteGMII32(0x04, 0x7800);		WriteGMII32(0x04, 0x7000);		WriteGMII32(0x04, 0xA000);		WriteGMII32(0x03, 0xDF01);		WriteGMII32(0x02, 0xDF20);		WriteGMII32(0x01, 0xFF95);		WriteGMII32(0x00, 0xFA00);		WriteGMII32(0x04, 0xA800);		WriteGMII32(0x04, 0xA000);		WriteGMII32(0x04, 0xB000);		WriteGMII32(0x03, 0xFF41);		WriteGMII32(0x02, 0xDE20);		WriteGMII32(0x01, 0x0140);		WriteGMII32(0x00, 0x00BB);		WriteGMII32(0x04, 0xB800);		WriteGMII32(0x04, 0xB000);		WriteGMII32(0x04, 0xF000);		WriteGMII32(0x03, 0xDF01);		WriteGMII32(0x02, 0xDF20);		WriteGMII32(0x01, 0xFF95);		WriteGMII32(0x00, 0xBF00);		WriteGMII32(0x04, 0xF800);		WriteGMII32(0x04, 0xF000);		WriteGMII32(0x04, 0x0000);		WriteGMII32(0x1F, 0x0000);		WriteGMII32(0x0B, 0x0000);#endif	}		DLog("tell card we can powersave");	WriteMMIO8(Config1, ReadMMIO8(Config1) | PMEnable);	WriteMMIO8(Config5, ReadMMIO8(Config5) & PMEStatus);	}void RealtekR1000::R1000HwStart(){	u32 i;	u8 i8;	u16 i16;		if ((mcfg != MCFG_METHOD_5) && (mcfg != MCFG_METHOD_11) &&	   (mcfg != MCFG_METHOD_12) && (mcfg != MCFG_METHOD_13) &&	   (mcfg != MCFG_METHOD_14) && (mcfg != MCFG_METHOD_15))	{		/* Soft reset the chip. */		WriteMMIO8 ( ChipCmd, CmdReset);		/* Check that the chip has finished the reset. */		for (i = 1000; i > 0; i--)		{			if ((ReadMMIO8( ChipCmd ) & CmdReset) == 0) break;			else IODelay(10);		}					WriteMMIO8(Cfg9346, Cfg9346_Unlock);		WriteMMIO8(ChipCmd, CmdTxEnb | CmdRxEnb);		WriteMMIO8(ETThReg, ETTh);					// For gigabit rtl8169		WriteMMIO16(RxMaxSize, static_cast<unsigned short>(hw_rx_pkt_len));		// Set Rx Config register		i = r1000_rx_config | (ReadMMIO32(RxConfig) & rtl_chip_info[chipset].RxConfigMask);		WriteMMIO32(RxConfig, i);					/* Set DMA burst size and Interframe Gap Time */		WriteMMIO32(TxConfig, (TX_DMA_BURST << TxDMAShift) | (InterFrameGap << TxInterFrameGapShift));		WriteMMIO16(CPlusCmd, ReadMMIO16(CPlusCmd));				if(mcfg == MCFG_METHOD_2 || mcfg == MCFG_METHOD_3)		{			WriteMMIO16(CPlusCmd, (ReadMMIO16(CPlusCmd) | (1 << 14) | (1 << 3)));			DLog("Set MAC Reg C+CR Offset 0xE0: bit-3 and bit-14\n");		}		else		{			WriteMMIO16(CPlusCmd, (ReadMMIO16(CPlusCmd) | (1 << 3)));			DLog("Set MAC Reg C+CR Offset 0xE0: bit-3.\n");		}			{			WriteMMIO16(0xE2,0x0000);		}				//TO-DO: FIX-ME: Fixed?				cur_rx = 0;		WriteMMIO32(TxDescStartAddr, txdesc_phy_dma_addr);		WriteMMIO32(TxDescStartAddr + 4, 0x00);		WriteMMIO32(RxDescStartAddr, rxdesc_phy_dma_addr);		WriteMMIO32(RxDescStartAddr + 4, 0x00);		WriteMMIO8(Cfg9346, Cfg9346_Lock);		IODelay(10);				WriteMMIO32 ( RxMissed, 0 );		//TO-DO: FIX-ME		//r1000_set_rx_mode(netdev);		WriteMMIO16(MultiIntr, ReadMMIO16(MultiIntr) & 0xF000);		WriteMMIO16(IntrMask, r1000_intr_mask);	}	else	{		/* Soft reset the chip. */		WriteMMIO8(ChipCmd, CmdReset);		/* Check that the chip has finished the reset. */		for (i = 1000; i > 0; i--)		{			if ((ReadMMIO8(ChipCmd) & CmdReset) == 0) break;			else IODelay(10); //Microseconds		}					if (mcfg == MCFG_METHOD_13 )		{			pciDev->configWrite16(0x68, 0x00);			pciDev->configWrite16(0x69, 0x08);		}				if (mcfg == MCFG_METHOD_5)		{			i8 = ReadMMIO8(Config2);			i8 = i8 & 0x07;			if (i8 && 0x01)	WriteMMIO32(Off7Ch, 0x0007FFFF);				i = 0x0007FF00;			WriteMMIO32(Off7Ch, i);			i16 = pciDev->configRead16(0x04);			i16 = i16 & 0xEF;			pciDev->configWrite16(0x04, i16);		}				WriteMMIO8(Cfg9346, Cfg9346_Unlock);		WriteMMIO8(ETThReg, ETTh);				// For gigabit rtl8169		WriteMMIO16(RxMaxSize, static_cast<unsigned short>(hw_rx_pkt_len));		WriteMMIO16(CPlusCmd, ReadMMIO16(CPlusCmd));				if (mcfg == MCFG_METHOD_2 || mcfg == MCFG_METHOD_3)		{			WriteMMIO16(CPlusCmd, (ReadMMIO16(CPlusCmd) | (1 << 14) | (1 << 3)));			DLog("Set MAC Reg C+CR Offset 0xE0: bit-3 and bit-14\n");		}		else		{			WriteMMIO16(CPlusCmd, (ReadMMIO16(CPlusCmd) | (1 << 3)));			DLog("Set MAC Reg C+CR Offset 0xE0: bit-3.\n");		}				{			WriteMMIO16(0xE2,0x0000);		}				//TO-DO: FIX-ME: Fixed?		cur_rx = 0;		WriteMMIO32(TxDescStartAddr, txdesc_phy_dma_addr);		WriteMMIO32(TxDescStartAddr + 4, 0x00);		WriteMMIO32(RxDescStartAddr, rxdesc_phy_dma_addr);		WriteMMIO32(RxDescStartAddr + 4, 0x00);		WriteMMIO8(ChipCmd, CmdTxEnb | CmdRxEnb);		// Set Rx Config register		i = r1000_rx_config | (ReadMMIO32(RxConfig) & rtl_chip_info[chipset].RxConfigMask);		WriteMMIO32(RxConfig, i);		/* Set DMA burst size and Interframe Gap Time */		WriteMMIO32(TxConfig, (TX_DMA_BURST << TxDMAShift) | (InterFrameGap << TxInterFrameGapShift));		WriteMMIO8(Cfg9346, Cfg9346_Lock);		IODelay(10);				WriteMMIO32 (RxMissed, 0);		//TO-DO: FIX-ME		//r1000_set_rx_mode(netdev);		WriteMMIO16(MultiIntr, ReadMMIO16(MultiIntr) & 0xF000);		WriteMMIO16(IntrMask, r1000_intr_mask);	}		//TO-DO: FIX-ME	//netif_start_queue(netdev);}ulong RealtekR1000::ether_crc(int length, unsigned char *data){	int crc = -1;	while (--length >= 0) 	{		unsigned char current_octet = *data++;		int bit;		for (bit = 0; bit < 8; bit++, current_octet >>= 1)			crc = (crc << 1) ^ ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);	}	return crc;}bool RealtekR1000::AllocateDescriptorsMemory(){	//Allocating descriptor memory	IOByteCount len;		sizeof_txdesc_space = NUM_TX_DESC * sizeof(TxDesc) + 256;	tx_descMd = IOBufferMemoryDescriptor::withOptions(kIOMemoryPhysicallyContiguous,														sizeof_txdesc_space,														PAGE_SIZE);														

⌨️ 快捷键说明

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