📄 ucc_geth.c
字号:
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 + -