예제 #1
0
void e40::internal_loopback(uint32_t instance)
{
    gen_ctrl_ = 0;
    mon_ctrl_ = 0;
    auto mac0 = read_mac_address(0);

    auto mac_ctrl = instance == 0 ? mac_reg::mac0_ctrl : mac_reg::mac1_ctrl;
    if (packet_count_ > 0)
    {
        eth_->write(eth_ctrl_reg::gen_pkt_number, instance,  packet_count_);
        eth_->write(eth_ctrl_reg::mon_pkt_number, instance,  packet_count_);
    }
    else
    {
        mon_ctrl_ |= static_cast<uint32_t>(gen_ctrl::continuous);
        gen_ctrl_ |= static_cast<uint32_t>(gen_ctrl::continuous);
    }

    mac_write(mac_ctrl, mac_reg::mac_srl_lpbk_ctrl, 0x3FF);
    mac_write(mac_ctrl, mac_reg::mac_cntr_tx_ctrl, 1);
    mac_write(mac_ctrl, mac_reg::mac_cntr_rx_ctrl, 1);
    eth_->write(eth_ctrl_reg::gen_src_addr_l, instance, mac0.lo);
    eth_->write(eth_ctrl_reg::gen_src_addr_h, instance, mac0.hi);
    eth_->write(eth_ctrl_reg::mon_src_addr_l, instance, mac0.lo);
    eth_->write(eth_ctrl_reg::mon_src_addr_h, instance, mac0.hi);
    eth_->write(eth_ctrl_reg::gen_dst_addr_l, instance, mac0.lo);
    eth_->write(eth_ctrl_reg::gen_dst_addr_h, instance, mac0.hi);
    eth_->write(eth_ctrl_reg::mon_dst_addr_l, instance, mac0.lo);
    eth_->write(eth_ctrl_reg::mon_dst_addr_h, instance, mac0.hi);


    eth_->write(eth_ctrl_reg::mon_pkt_ctrl,   instance, mon_ctrl_ | static_cast<uint32_t>(mon_ctrl::start));
    eth_->write(eth_ctrl_reg::gen_pkt_ctrl,   instance, gen_ctrl_ | static_cast<uint32_t>(gen_ctrl::start));
}
예제 #2
0
void e40::clear_status()
{
    mac_write(mac_reg::mac0_ctrl, mac_reg::mac_cntr_tx_ctrl, 1);
    mac_write(mac_reg::mac0_ctrl, mac_reg::mac_cntr_rx_ctrl, 1);
    mac_write(mac_reg::mac1_ctrl, mac_reg::mac_cntr_tx_ctrl, 1);
    mac_write(mac_reg::mac1_ctrl, mac_reg::mac_cntr_rx_ctrl, 1);
}
int
net_s3c4510b_write_word (struct device_desc *dev, u32 addr, u32 data)
{
	struct net_device *net_dev = (struct net_device *) dev->dev;
	struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;

	int offset = (u16) (addr - dev->base + 0x9000);
	int ret = ADDR_HIT;

	//printf("%s\n", __FUNCTION__);
	switch (offset) {
	case MACTXCON:
		if (data & TxEn == TxEn) {
			/*
			   u32 addr;
			   fault_t fault;
			   fault = mac_write(dev);
			   if( fault ) {
			   mmu_data_abort(state, fault, addr);
			   return;
			   }
			 */
			mac_write (dev);
		}
		io->mactxcon = data;
		break;
	case BDMATXPTR:
		io->bdmatxptr = data;
		break;
	case BDMARXPTR:
		io->bdmarxptr = data;
		break;
	case BDMASTAT:
		io->bdmastat &= (~data);
		break;
	case MACON:
		io->macon = data;
		break;
	case MACRXCON:
		io->macrxcon = data;
		break;
	case BDMARXCON:
		io->bdmarxcon = data;
		break;
	case BDMATXCON:
		io->bdmatxcon = data;
		break;
	case BDMARXLSZ:
		io->bdmarxlsz = data;
		break;
	case CAMEN:
		io->camen = data;
		break;
	default:
		break;
	}

	return ret;
}
예제 #4
0
int do_set_mac(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	int i;
	unsigned char mac[6];
	char *s, *e;

	if (argc != 2)
		return cmd_usage(cmdtp);

	s = argv[1];

	for (i = 0; i < 6; i++) {
		mac[i] = s ? simple_strtoul(s, &e, 16) : 0;
		if (s)
			s = (*e) ? e + 1 : e;
	}
	mac_write((unsigned short *)mac);

	return 0;
}
예제 #5
0
void e40::external_loopback(uint32_t source_port, uint32_t destination_port)
{
    auto mac0 = read_mac_address(source_port);
    auto mac1 = read_mac_address(destination_port);
    gen_ctrl_ = 0;
    mon_ctrl_ = 0;


    if (random_length_)
    {
        gen_ctrl_ |= static_cast<uint32_t>(gen_ctrl::random_packet_length);
    }


    if (continuous_)
    {
        gen_ctrl_ |= static_cast<uint32_t>(gen_ctrl::continuous);
        mon_ctrl_ |= static_cast<uint32_t>(mon_ctrl::continuous);
    }
    else
    {
        if (packet_count_ > 0)
        {
            eth_->write(eth_ctrl_reg::gen_pkt_number, source_port,  packet_count_);
            eth_->write(eth_ctrl_reg::mon_pkt_number, destination_port,  packet_count_);
        }

    }

    if (packet_length_ > 0) eth_->write(eth_ctrl_reg::gen_pkt_length, source_port, packet_length_);
    if (packet_delay_  > 0) eth_->write(eth_ctrl_reg::gen_pkt_delay, source_port, packet_delay_);

    // turn off serial loopback
    mac_write(mac_reg::mac0_ctrl, mac_reg::mac_srl_lpbk_ctrl, 0x0);
    mac_write(mac_reg::mac1_ctrl, mac_reg::mac_srl_lpbk_ctrl, 0x0);
    // PORT 0 GEN SRC -> MAC0
    eth_->write(eth_ctrl_reg::gen_src_addr_l, source_port, mac0.lo);
    eth_->write(eth_ctrl_reg::gen_src_addr_h, source_port, mac0.hi);
    // PORT 0 GEN DST -> MAC1
    eth_->write(eth_ctrl_reg::gen_dst_addr_l, source_port, mac1.lo);
    eth_->write(eth_ctrl_reg::gen_dst_addr_h, source_port, mac1.hi);
    // PORT 0 MON SRC -> MAC1
    eth_->write(eth_ctrl_reg::mon_src_addr_l, source_port, mac1.lo);
    eth_->write(eth_ctrl_reg::mon_src_addr_h, source_port, mac1.hi);
    // PORT 0 MON DST -> MAC0
    eth_->write(eth_ctrl_reg::mon_dst_addr_l, source_port, mac0.lo);
    eth_->write(eth_ctrl_reg::mon_dst_addr_h, source_port, mac0.hi);

    // PORT 1 GEN SRC -> MAC1
    eth_->write(eth_ctrl_reg::gen_src_addr_l, destination_port, mac1.lo);
    eth_->write(eth_ctrl_reg::gen_src_addr_h, destination_port, mac1.hi);
    // PORT 1 GEN SRC -> MAC0
    eth_->write(eth_ctrl_reg::gen_dst_addr_l, destination_port, mac0.lo);
    eth_->write(eth_ctrl_reg::gen_dst_addr_h, destination_port, mac0.hi);
    // PORT 1 MON SRC -> MAC0
    eth_->write(eth_ctrl_reg::mon_src_addr_l, destination_port, mac0.lo);
    eth_->write(eth_ctrl_reg::mon_src_addr_h, destination_port, mac0.hi);
    // PORT 1 MON DST -> MAC1
    eth_->write(eth_ctrl_reg::mon_dst_addr_l, destination_port, mac1.lo);
    eth_->write(eth_ctrl_reg::mon_dst_addr_h, destination_port, mac1.hi);

    eth_->write(eth_ctrl_reg::mon_pkt_ctrl, destination_port, mon_ctrl_ | static_cast<uint32_t>(mon_ctrl::start));
    eth_->write(eth_ctrl_reg::gen_pkt_ctrl, source_port, gen_ctrl_ | static_cast<uint32_t>(gen_ctrl::start));
}