int ether_post_test(int flags) { uchar buf[64]; int i, value = 0; int length; uint addr; printf("\n--------"); bfin_EMAC_init(NULL, NULL); /* construct the package */ addr = bfin_read_EMAC_ADDRLO(); buf[0] = buf[6] = addr; buf[1] = buf[7] = addr >> 8; buf[2] = buf[8] = addr >> 16; buf[3] = buf[9] = addr >> 24; addr = bfin_read_EMAC_ADDRHI(); buf[4] = buf[10] = addr; buf[5] = buf[11] = addr >> 8; buf[12] = 0x08; /* Type: ARP */ buf[13] = 0x06; buf[14] = 0x00; /* Hardware type: Ethernet */ buf[15] = 0x01; buf[16] = 0x08; /* Protocal type: IP */ buf[17] = 0x00; buf[18] = 0x06; /* Hardware size */ buf[19] = 0x04; /* Protocol size */ buf[20] = 0x00; /* Opcode: request */ buf[21] = 0x01; for (i = 0; i < 42; i++) buf[i + 22] = i; printf("--------Send 64 bytes......\n"); bfin_EMAC_send(NULL, buf, 64); for (i = 0; i < 100; i++) { udelay(10000); if ((rxbuf[rxIdx]->StatusWord & RX_COMP) != 0) { value = 1; break; } } if (value == 0) { printf("--------EMAC can't receive any data\n"); eth_halt(); return -1; } length = rxbuf[rxIdx]->StatusWord & 0x000007FF - 4; for (i = 0; i < length; i++) { if (rxbuf[rxIdx]->FrmData->Dest[i] != buf[i]) { printf("--------EMAC receive error data!\n"); eth_halt(); return -1; } } printf("--------receive %d bytes, matched\n", length); bfin_EMAC_halt(NULL); return 0; }
/** Basic setup to connect NIC to socket. * @param[in] port = port context struct * @param[in] ifname = Name of NIC device, f.e. "eth0" * @param[in] secondary = if >0 then use secondary stack instead of primary * @return >0 if succeeded */ int ecx_setupnic(ecx_portt *port, const char *ifname, int secondary) { int i; int rVal; int *psock; port->getindex_mutex = mtx_create(); port->tx_mutex = mtx_create(); port->rx_mutex = mtx_create(); rVal = bfin_EMAC_init((uint8_t *)priMAC); if (rVal != 0) return 0; if (secondary) { /* secondary port struct available? */ if (port->redport) { /* when using secondary socket it is automatically a redundant setup */ psock = &(port->redport->sockhandle); *psock = -1; port->redstate = ECT_RED_DOUBLE; port->redport->stack.sock = &(port->redport->sockhandle); port->redport->stack.txbuf = &(port->txbuf); port->redport->stack.txbuflength = &(port->txbuflength); port->redport->stack.tempbuf = &(port->redport->tempinbuf); port->redport->stack.rxbuf = &(port->redport->rxbuf); port->redport->stack.rxbufstat = &(port->redport->rxbufstat); port->redport->stack.rxsa = &(port->redport->rxsa); ecx_clear_rxbufstat(&(port->redport->rxbufstat[0])); } else { /* fail */ return 0; } } else { port->getindex_mutex = mtx_create(); port->tx_mutex = mtx_create(); port->rx_mutex = mtx_create(); port->sockhandle = -1; port->lastidx = 0; port->redstate = ECT_RED_NONE; port->stack.sock = &(port->sockhandle); port->stack.txbuf = &(port->txbuf); port->stack.txbuflength = &(port->txbuflength); port->stack.tempbuf = &(port->tempinbuf); port->stack.rxbuf = &(port->rxbuf); port->stack.rxbufstat = &(port->rxbufstat); port->stack.rxsa = &(port->rxsa); ecx_clear_rxbufstat(&(port->rxbufstat[0])); psock = &(port->sockhandle); } /* setup ethernet headers in tx buffers so we don't have to repeat it */ for (i = 0; i < EC_MAXBUF; i++) { ec_setupheader(&(port->txbuf[i])); port->rxbufstat[i] = EC_BUF_EMPTY; } ec_setupheader(&(port->txbuf2)); return 1; }