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

📄 ucc_geth.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	if (!(paddr_num < NUM_OF_PADDRS)) {		ugeth_warn("%s: Illegal paddr_num.", __FUNCTION__);		return -EINVAL;	}	p_82xx_addr_filt =	    (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram->	    addressfiltering;	/* Ethernet frames are defined in Little Endian mode,    */	/* therefore to insert the address we reverse the bytes. */	set_mac_addr(&p_82xx_addr_filt->paddr[paddr_num].h, p_enet_addr);	return 0;}#endif /* CONFIG_UGETH_FILTERING */static int hw_clear_addr_in_paddr(struct ucc_geth_private *ugeth, u8 paddr_num){	struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt;	if (!(paddr_num < NUM_OF_PADDRS)) {		ugeth_warn("%s: Illagel paddr_num.", __FUNCTION__);		return -EINVAL;	}	p_82xx_addr_filt =	    (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram->	    addressfiltering;	/* Writing address ff.ff.ff.ff.ff.ff disables address	recognition for this register */	out_be16(&p_82xx_addr_filt->paddr[paddr_num].h, 0xffff);	out_be16(&p_82xx_addr_filt->paddr[paddr_num].m, 0xffff);	out_be16(&p_82xx_addr_filt->paddr[paddr_num].l, 0xffff);	return 0;}static void hw_add_addr_in_hash(struct ucc_geth_private *ugeth,                                u8 *p_enet_addr){	struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt;	u32 cecr_subblock;	p_82xx_addr_filt =	    (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram->	    addressfiltering;	cecr_subblock =	    ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num);	/* Ethernet frames are defined in Little Endian mode,	therefor to insert */	/* the address to the hash (Big Endian mode), we reverse the bytes.*/	set_mac_addr(&p_82xx_addr_filt->taddr.h, p_enet_addr);	qe_issue_cmd(QE_SET_GROUP_ADDRESS, cecr_subblock,		     QE_CR_PROTOCOL_ETHERNET, 0);}#ifdef CONFIG_UGETH_MAGIC_PACKETstatic void magic_packet_detection_enable(struct ucc_geth_private *ugeth){	struct ucc_fast_private *uccf;	struct ucc_geth *ug_regs;	u32 maccfg2, uccm;	uccf = ugeth->uccf;	ug_regs = ugeth->ug_regs;	/* Enable interrupts for magic packet detection */	uccm = in_be32(uccf->p_uccm);	uccm |= UCCE_MPD;	out_be32(uccf->p_uccm, uccm);	/* Enable magic packet detection */	maccfg2 = in_be32(&ug_regs->maccfg2);	maccfg2 |= MACCFG2_MPE;	out_be32(&ug_regs->maccfg2, maccfg2);}static void magic_packet_detection_disable(struct ucc_geth_private *ugeth){	struct ucc_fast_private *uccf;	struct ucc_geth *ug_regs;	u32 maccfg2, uccm;	uccf = ugeth->uccf;	ug_regs = ugeth->ug_regs;	/* Disable interrupts for magic packet detection */	uccm = in_be32(uccf->p_uccm);	uccm &= ~UCCE_MPD;	out_be32(uccf->p_uccm, uccm);	/* Disable magic packet detection */	maccfg2 = in_be32(&ug_regs->maccfg2);	maccfg2 &= ~MACCFG2_MPE;	out_be32(&ug_regs->maccfg2, maccfg2);}#endif /* MAGIC_PACKET */static inline int compare_addr(u8 **addr1, u8 **addr2){	return memcmp(addr1, addr2, ENET_NUM_OCTETS_PER_ADDRESS);}#ifdef DEBUGstatic void get_statistics(struct ucc_geth_private *ugeth,			   struct ucc_geth_tx_firmware_statistics *			   tx_firmware_statistics,			   struct ucc_geth_rx_firmware_statistics *			   rx_firmware_statistics,			   struct ucc_geth_hardware_statistics *hardware_statistics){	struct ucc_fast *uf_regs;	struct ucc_geth *ug_regs;	struct ucc_geth_tx_firmware_statistics_pram *p_tx_fw_statistics_pram;	struct ucc_geth_rx_firmware_statistics_pram *p_rx_fw_statistics_pram;	ug_regs = ugeth->ug_regs;	uf_regs = (struct ucc_fast *) ug_regs;	p_tx_fw_statistics_pram = ugeth->p_tx_fw_statistics_pram;	p_rx_fw_statistics_pram = ugeth->p_rx_fw_statistics_pram;	/* Tx firmware only if user handed pointer and driver actually	gathers Tx firmware statistics */	if (tx_firmware_statistics && p_tx_fw_statistics_pram) {		tx_firmware_statistics->sicoltx =		    in_be32(&p_tx_fw_statistics_pram->sicoltx);		tx_firmware_statistics->mulcoltx =		    in_be32(&p_tx_fw_statistics_pram->mulcoltx);		tx_firmware_statistics->latecoltxfr =		    in_be32(&p_tx_fw_statistics_pram->latecoltxfr);		tx_firmware_statistics->frabortduecol =		    in_be32(&p_tx_fw_statistics_pram->frabortduecol);		tx_firmware_statistics->frlostinmactxer =		    in_be32(&p_tx_fw_statistics_pram->frlostinmactxer);		tx_firmware_statistics->carriersenseertx =		    in_be32(&p_tx_fw_statistics_pram->carriersenseertx);		tx_firmware_statistics->frtxok =		    in_be32(&p_tx_fw_statistics_pram->frtxok);		tx_firmware_statistics->txfrexcessivedefer =		    in_be32(&p_tx_fw_statistics_pram->txfrexcessivedefer);		tx_firmware_statistics->txpkts256 =		    in_be32(&p_tx_fw_statistics_pram->txpkts256);		tx_firmware_statistics->txpkts512 =		    in_be32(&p_tx_fw_statistics_pram->txpkts512);		tx_firmware_statistics->txpkts1024 =		    in_be32(&p_tx_fw_statistics_pram->txpkts1024);		tx_firmware_statistics->txpktsjumbo =		    in_be32(&p_tx_fw_statistics_pram->txpktsjumbo);	}	/* Rx firmware only if user handed pointer and driver actually	 * gathers Rx firmware statistics */	if (rx_firmware_statistics && p_rx_fw_statistics_pram) {		int i;		rx_firmware_statistics->frrxfcser =		    in_be32(&p_rx_fw_statistics_pram->frrxfcser);		rx_firmware_statistics->fraligner =		    in_be32(&p_rx_fw_statistics_pram->fraligner);		rx_firmware_statistics->inrangelenrxer =		    in_be32(&p_rx_fw_statistics_pram->inrangelenrxer);		rx_firmware_statistics->outrangelenrxer =		    in_be32(&p_rx_fw_statistics_pram->outrangelenrxer);		rx_firmware_statistics->frtoolong =		    in_be32(&p_rx_fw_statistics_pram->frtoolong);		rx_firmware_statistics->runt =		    in_be32(&p_rx_fw_statistics_pram->runt);		rx_firmware_statistics->verylongevent =		    in_be32(&p_rx_fw_statistics_pram->verylongevent);		rx_firmware_statistics->symbolerror =		    in_be32(&p_rx_fw_statistics_pram->symbolerror);		rx_firmware_statistics->dropbsy =		    in_be32(&p_rx_fw_statistics_pram->dropbsy);		for (i = 0; i < 0x8; i++)			rx_firmware_statistics->res0[i] =			    p_rx_fw_statistics_pram->res0[i];		rx_firmware_statistics->mismatchdrop =		    in_be32(&p_rx_fw_statistics_pram->mismatchdrop);		rx_firmware_statistics->underpkts =		    in_be32(&p_rx_fw_statistics_pram->underpkts);		rx_firmware_statistics->pkts256 =		    in_be32(&p_rx_fw_statistics_pram->pkts256);		rx_firmware_statistics->pkts512 =		    in_be32(&p_rx_fw_statistics_pram->pkts512);		rx_firmware_statistics->pkts1024 =		    in_be32(&p_rx_fw_statistics_pram->pkts1024);		rx_firmware_statistics->pktsjumbo =		    in_be32(&p_rx_fw_statistics_pram->pktsjumbo);		rx_firmware_statistics->frlossinmacer =		    in_be32(&p_rx_fw_statistics_pram->frlossinmacer);		rx_firmware_statistics->pausefr =		    in_be32(&p_rx_fw_statistics_pram->pausefr);		for (i = 0; i < 0x4; i++)			rx_firmware_statistics->res1[i] =			    p_rx_fw_statistics_pram->res1[i];		rx_firmware_statistics->removevlan =		    in_be32(&p_rx_fw_statistics_pram->removevlan);		rx_firmware_statistics->replacevlan =		    in_be32(&p_rx_fw_statistics_pram->replacevlan);		rx_firmware_statistics->insertvlan =		    in_be32(&p_rx_fw_statistics_pram->insertvlan);	}	/* Hardware only if user handed pointer and driver actually	gathers hardware statistics */	if (hardware_statistics && (in_be32(&uf_regs->upsmr) & UPSMR_HSE)) {		hardware_statistics->tx64 = in_be32(&ug_regs->tx64);		hardware_statistics->tx127 = in_be32(&ug_regs->tx127);		hardware_statistics->tx255 = in_be32(&ug_regs->tx255);		hardware_statistics->rx64 = in_be32(&ug_regs->rx64);		hardware_statistics->rx127 = in_be32(&ug_regs->rx127);		hardware_statistics->rx255 = in_be32(&ug_regs->rx255);		hardware_statistics->txok = in_be32(&ug_regs->txok);		hardware_statistics->txcf = in_be16(&ug_regs->txcf);		hardware_statistics->tmca = in_be32(&ug_regs->tmca);		hardware_statistics->tbca = in_be32(&ug_regs->tbca);		hardware_statistics->rxfok = in_be32(&ug_regs->rxfok);		hardware_statistics->rxbok = in_be32(&ug_regs->rxbok);		hardware_statistics->rbyt = in_be32(&ug_regs->rbyt);		hardware_statistics->rmca = in_be32(&ug_regs->rmca);		hardware_statistics->rbca = in_be32(&ug_regs->rbca);	}}static void dump_bds(struct ucc_geth_private *ugeth){	int i;	int length;	for (i = 0; i < ugeth->ug_info->numQueuesTx; i++) {		if (ugeth->p_tx_bd_ring[i]) {			length =			    (ugeth->ug_info->bdRingLenTx[i] *			     sizeof(struct qe_bd));			ugeth_info("TX BDs[%d]", i);			mem_disp(ugeth->p_tx_bd_ring[i], length);		}	}	for (i = 0; i < ugeth->ug_info->numQueuesRx; i++) {		if (ugeth->p_rx_bd_ring[i]) {			length =			    (ugeth->ug_info->bdRingLenRx[i] *			     sizeof(struct qe_bd));			ugeth_info("RX BDs[%d]", i);			mem_disp(ugeth->p_rx_bd_ring[i], length);		}	}}static void dump_regs(struct ucc_geth_private *ugeth){	int i;	ugeth_info("UCC%d Geth registers:", ugeth->ug_info->uf_info.ucc_num);	ugeth_info("Base address: 0x%08x", (u32) ugeth->ug_regs);	ugeth_info("maccfg1    : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->maccfg1,		   in_be32(&ugeth->ug_regs->maccfg1));	ugeth_info("maccfg2    : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->maccfg2,		   in_be32(&ugeth->ug_regs->maccfg2));	ugeth_info("ipgifg     : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->ipgifg,		   in_be32(&ugeth->ug_regs->ipgifg));	ugeth_info("hafdup     : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->hafdup,		   in_be32(&ugeth->ug_regs->hafdup));	ugeth_info("ifctl      : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->ifctl,		   in_be32(&ugeth->ug_regs->ifctl));	ugeth_info("ifstat     : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->ifstat,		   in_be32(&ugeth->ug_regs->ifstat));	ugeth_info("macstnaddr1: addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->macstnaddr1,		   in_be32(&ugeth->ug_regs->macstnaddr1));	ugeth_info("macstnaddr2: addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->macstnaddr2,		   in_be32(&ugeth->ug_regs->macstnaddr2));	ugeth_info("uempr      : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->uempr,		   in_be32(&ugeth->ug_regs->uempr));	ugeth_info("utbipar    : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->utbipar,		   in_be32(&ugeth->ug_regs->utbipar));	ugeth_info("uescr      : addr - 0x%08x, val - 0x%04x",		   (u32) & ugeth->ug_regs->uescr,		   in_be16(&ugeth->ug_regs->uescr));	ugeth_info("tx64       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->tx64,		   in_be32(&ugeth->ug_regs->tx64));	ugeth_info("tx127      : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->tx127,		   in_be32(&ugeth->ug_regs->tx127));	ugeth_info("tx255      : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->tx255,		   in_be32(&ugeth->ug_regs->tx255));	ugeth_info("rx64       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->rx64,		   in_be32(&ugeth->ug_regs->rx64));	ugeth_info("rx127      : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->rx127,		   in_be32(&ugeth->ug_regs->rx127));	ugeth_info("rx255      : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->rx255,		   in_be32(&ugeth->ug_regs->rx255));	ugeth_info("txok       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->txok,		   in_be32(&ugeth->ug_regs->txok));	ugeth_info("txcf       : addr - 0x%08x, val - 0x%04x",		   (u32) & ugeth->ug_regs->txcf,		   in_be16(&ugeth->ug_regs->txcf));	ugeth_info("tmca       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->tmca,		   in_be32(&ugeth->ug_regs->tmca));	ugeth_info("tbca       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->tbca,		   in_be32(&ugeth->ug_regs->tbca));	ugeth_info("rxfok      : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->rxfok,		   in_be32(&ugeth->ug_regs->rxfok));	ugeth_info("rxbok      : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->rxbok,		   in_be32(&ugeth->ug_regs->rxbok));	ugeth_info("rbyt       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->rbyt,		   in_be32(&ugeth->ug_regs->rbyt));	ugeth_info("rmca       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->rmca,		   in_be32(&ugeth->ug_regs->rmca));	ugeth_info("rbca       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->rbca,		   in_be32(&ugeth->ug_regs->rbca));	ugeth_info("scar       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->scar,		   in_be32(&ugeth->ug_regs->scar));	ugeth_info("scam       : addr - 0x%08x, val - 0x%08x",		   (u32) & ugeth->ug_regs->scam,		   in_be32(&ugeth->ug_regs->scam));	if (ugeth->p_thread_data_tx) {		int numThreadsTxNumerical;		switch (ugeth->ug_info->numThreadsTx) {		case UCC_GETH_NUM_OF_THREADS_1:			numThreadsTxNumerical = 1;			break;		case UCC_GETH_NUM_OF_THREADS_2:			numThreadsTxNumerical = 2;			break;		case UCC_GETH_NUM_OF_THREADS_4:			numThreadsTxNumerical = 4;			break;		case UCC_GETH_NUM_OF_THREADS_6:			numThreadsTxNumerical = 6;			break;		case UCC_GETH_NUM_OF_THREADS_8:			numThreadsTxNumerical = 8;			break;		default:			numThreadsTxNumerical = 0;			break;		}		ugeth_info("Thread data TXs:");		ugeth_info("Base address: 0x%08x",			   (u32) ugeth->p_thread_data_tx);		for (i = 0; i < numThreadsTxNumerical; i++) {			ugeth_info("Thread data TX[%d]:", i);			ugeth_info("Base address: 0x%08x",				   (u32) & ugeth->p_thread_data_tx[i]);			mem_disp((u8 *) & ugeth->p_thread_data_tx[i],				 sizeof(struct ucc_geth_thread_data_tx));		}	}	if (ugeth->p_thread_data_rx) {		int numThreadsRxNumerical;		switch (ugeth->ug_info->numThreadsRx) {		case UCC_GETH_NUM_OF_THREADS_1:			numThreadsRxNumerical = 1;			break;		case UCC_GETH_NUM_OF_THREADS_2:			numThreadsRxNumerical = 2;			break;		case UCC_GETH_NUM_OF_THREADS_4:			numThreadsRxNumerical = 4;			break;		case UCC_GETH_NUM_OF_THREADS_6:			numThreadsRxNumerical = 6;			break;		case UCC_GETH_NUM_OF_THREADS_8:			numThreadsRxNumerical = 8;			break;		default:			numThreadsRxNumerical = 0;			break;		}		ugeth_info("Thread data RX:");		ugeth_info("Base address: 0x%08x",			   (u32) ugeth->p_thread_data_rx);		for (i = 0; i < numThreadsRxNumerical; i++) {			ugeth_info("Thread data RX[%d]:", i);			ugeth_info("Base address: 0x%08x",				   (u32) & ugeth->p_thread_data_rx[i]);			mem_disp((u8 *) & ugeth->p_thread_data_rx[i],				 sizeof(struct ucc_geth_thread_data_rx));		}	}	if (ugeth->p_exf_glbl_param) {		ugeth_info("EXF global param:");		ugeth_info("Base address: 0x%08x",			   (u32) ugeth->p_exf_glbl_param);		mem_disp((u8 *) ugeth->p_exf_glbl_param,			 sizeof(*ugeth->p_exf_glbl_param));	}	if (ugeth->p_tx_glbl_pram) {		ugeth_info("TX global param:");		ugeth_info("Base address: 0x%08x", (u32) ugeth->p_tx_glbl_pram);		ugeth_info("temoder      : addr - 0x%08x, val - 0x%04x",

⌨️ 快捷键说明

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