📄 addr_filter.c
字号:
if (ctr == 1000) // After 1 second
{
eprintf("\nTimed out...No indication from scratch ring that all packets were transmitted\n");
mailbox_value = NOT_SENT;
flag = ERROR;
break;
}
// Poll on scratch ring to check if the packets have been transmitted
if ((scratch_read_value = GET32(scratch_ring_tx_count)) == 0)
{
hal_delay_us(2);
ctr++;
}
else
{
switch(ports)
{
case 0 :
case 1 :
case 2 :
case 3 :
eprintf("Transmitted on port %d: %d \r", ports,(scratch_read_value));
break;
case 4 : // all ports
if (!cflag)
{
eprintf("Transmitted on ports 0-3 : %d \r", (scratch_read_value)/4);
iteration = 4;
}
else
{
eprintf("Transmitted on ports 0 and 2 : %d\r", (scratch_read_value)/2);
iteration = 2;
}
break;
}
MSG("Transmitted Packets (total): %d\r", scratch_read_value,0,0);
tx_count++;
}
}
while (scratch_read_value == 0);
PUT32(scratch_ring_tx_count, 0);
tx_count = scratch_read_value;
if (flag == ERROR)
{
break;
}
}
if (flag == ERROR)
{
break;
}
}
if (flag == ERROR)
{
break;
}
for (combination = 0; combination < pnum; combination++)
{
for (port_ctr = 0; port_ctr < iteration; port_ctr++)
{
if (!cflag)
{
if (ports != 4)
port_num = ports;
else
port_num = port_ctr;
}
else
{
if (ports != 4)
port_num = rxport[ports];
else
port_num = port_ctr*2 + 1;
}
ctr = 0;
do // Do while waiting for a signal that a packet has been received
{
if (ctr == 300) // After 1 second
{
//eprintf("\nTimed out...No indication from scratch ring that all packets were received\n");
//mailbox_value = NOT_RECEIVED;
flag = ERROR;
break;
}
// Poll on scratch ring to check if packets have been received
if ((scratch_read_value = GET32(scratch_ring_rx)) == 0)
{
hal_delay_us(100);
ctr++;
}
//MSG("port %d scratch_read_value = 0x%x\n",port_num,scratch_read_value,0);
}
while (scratch_read_value == 0);
if (flag == ERROR)
{
break;
}
//MSG("DEBUG: scratch_read_value = 0x%08X\n", scratch_read_value,0,0);
rx_count++;
pkt_size = scratch_read_value & MASK_8BIT;
rx_port_num = (scratch_read_value >> 8) & MASK_8BIT;
dram_addr = DRAM_BASE_DEST + ((scratch_read_value >> 16) << 8);
// set the port on which packet was received.
pass_port[rx_port_num]++;
rxflag[rx_port_num] = OK;
//MSG("port : %d pkt size = 0x%x\n",rx_port_num, pkt_size,0);
//MSG("DEBUG: pkt_size=0x%08X\tdram_addr=0x%08X\n\n", pkt_size, dram_addr,0);
//MSG("DEBUG: pkt_size=%d\ttx_data_pl=%d\n", pkt_size, (tx_data_pl[((combination * 4) + port_num)] & 0xFFFF),0);
#if 0
/* Vallejo WORKAROUND : Vallejo is not stripping of the CRC
for 96 byte packets in gig/half duplex mode */
if ((pkt_size == 0x60) || (pkt_size == 0x40) || (pkt_size == 0x8A))
{
eprintf("\npacket size = 0x%x\n",pkt_size);
pkt_size = pkt_size - 4;
}
/****** end of Workaround *******/
#endif
if (ports == 4)
{
exp_pkt_sz = tx_data_pl[((combination * 4) + port_num)] & 0xFFFF;
}
else
{
exp_pkt_sz = pktptr[combination] & 0xFFFF;
}
switch(test_param)
{
case 'u':
/* 64 byte packets are unicast packets.
These are dropped if unicast filtering is on,
as the destination address is different from
the station address for this test.
Next expected packet is a 138 byte frmae.*/
if (exp_pkt_sz == 0x3C)
exp_pkt_sz = 0x84;
break;
case 'm':
break;
case 'b':
/* 96 byte packets are broadcast packets.
These are dropped if broadcast filtering is on,
Next expected packet is a 64 byte frmae. */
if (exp_pkt_sz == 0x5C)
exp_pkt_sz = 0x3C;
else
exp_pkt_sz = 0x84;
break;
}
if (pkt_size != exp_pkt_sz)
{
eprintf("\nActual packet size = 0x%x\n",pkt_size);
eprintf("Expected packet size: 0x%x\n",exp_pkt_sz);
mailbox_value = INCORRECT_SIZE;
flag = INCORRECT_SIZE; // Set flag as error
rxflag[rx_port_num] = ERROR;
break;
}
if (cflag)
{
switch(rx_port_num)
{
case 0: // rx on port 0 , check for pkt transmitted from port 1
if (pkt_size == (RING_DATA_96_1 & MASK_16BIT) )
{
orig_data_size = PKT_96_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_1;
}
else if (pkt_size == (RING_DATA_64_1 & MASK_16BIT))
{
orig_data_size = PKT_64_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_1;
}
else if (pkt_size == (RING_DATA_138_1 & MASK_16BIT))
{
orig_data_size = PKT_138_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_1;
}
else
bad_pkt_size = 1;
break;
case 1: // rx on port 1 , check for pkt transmitted from port 0
if (pkt_size == (RING_DATA_96_0 & MASK_16BIT))
{
//eprintf("received 96 byte on port 1\n");
orig_data_size = PKT_96_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_0;
}
else if (pkt_size == (RING_DATA_64_0 & MASK_16BIT))
{
orig_data_size = PKT_64_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_0;
}
else if (pkt_size == (RING_DATA_138_0 & MASK_16BIT))
{
orig_data_size = PKT_138_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_0;
}
else
bad_pkt_size = 1;
break;
case 2: // rx on port 2 , check for pkt transmitted from port 3
if (pkt_size == (RING_DATA_96_3 & MASK_16BIT))
{
orig_data_size = PKT_96_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_3;
}
else if (pkt_size == (RING_DATA_64_3 & MASK_16BIT))
{
orig_data_size = PKT_64_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_3;
}
else if (pkt_size == (RING_DATA_138_3 & MASK_16BIT))
{
orig_data_size = PKT_138_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_3;
}
else
bad_pkt_size = 1;
break;
case 3: // rx on port 2 , check for pkt transmitted from port 2
if (pkt_size == (RING_DATA_96_2 & MASK_16BIT))
{
orig_data_size = PKT_96_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_2;
}
else if (pkt_size == (RING_DATA_64_2 & MASK_16BIT))
{
orig_data_size = PKT_64_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_2;
}
else if (pkt_size == (RING_DATA_138_2 & MASK_16BIT))
{
orig_data_size = PKT_138_SZ ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_2;
}
else
bad_pkt_size = 1;
break;
}
if (bad_pkt_size ==1)
{
eprintf("pkt size mismatch !! port = %d\n",rx_port_num);
mailbox_value = NOT_COMPLETE;
flag = ERROR; // Set flag as error
rxflag[rx_port_num] = ERROR;
break;
}
}
else // cflag = 0 -> fiber mode
{
if ((pkt_size == (RING_DATA_96_0 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_96_0 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_96_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_0;
}
else if ((pkt_size == (RING_DATA_64_0 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_64_0 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_64_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_0;
}
else if ((pkt_size == (RING_DATA_138_0 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_138_0 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_138_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_0;
}
else if ((pkt_size == (RING_DATA_96_1 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_96_1 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_96_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_1;
}
else if ((pkt_size == (RING_DATA_64_1 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_64_1 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_64_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_1;
}
else if ((pkt_size == (RING_DATA_138_1 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_138_1 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_138_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_1;
}
else if ((pkt_size == (RING_DATA_96_2 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_96_2 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_96_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_2;
}
else if ((pkt_size == (RING_DATA_64_2 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_64_2 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_64_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_2;
}
else if ((pkt_size == (RING_DATA_138_2 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_138_2 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_138_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_2;
}
else if ((pkt_size == (RING_DATA_96_3 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_96_3 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_96_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_3;
}
else if ((pkt_size == (RING_DATA_64_3 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_64_3 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_64_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_3;
}
else if ((pkt_size == (RING_DATA_138_3 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_138_3 >> 20) & MASK_8BIT)))
{
orig_data_size = PKT_138_SZ;
pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_3;
}
else
{
eprintf("pkt size mismatch !! port = %d\n",rx_port_num);
mailbox_value = NOT_COMPLETE;
flag = ERROR; // Set flag as error
rxflag[rx_port_num] = ERROR;
break;
}
}
for (ctr = 0; ctr < orig_data_size; ctr+=4)
{
// Read the DRAM for the longword that was received
temp = GET32(dram_addr + ctr);
// Compare with original value
if (temp != pl_sys_lb_data[(ctr / 4)])
{
mailbox_value = ERROR_PATTERN;
eprintf("Packet:%d Longword:%d Expected:0x%X Received:0x%X\n", (rx_count + 1), (ctr / 4), pl_sys_lb_data[(ctr / 4)], temp);
flag = ERROR; // Set flag as error
rxflag[rx_port_num] = ERROR;
break;
}
if (ctr == 0)
{
//eprintf("1st LW : 0x%x\n",temp);
if (((temp >>24) & 0xFF)== UC_CHECK)
ucCount[rx_port_num]++; /* unicast frame received */
if (((temp >>24) & 0xFF)== MC_CHECK)
mcCount[rx_port_num]++; /* multicast frame received */
if (((temp >>24) & 0xFF) == BC_CHECK)
bcCount[rx_port_num]++; /* broadcast frame received */
}
}
if (flag == ERROR)
{
break;
}
hal_delay_us(10);
}
if (flag == INCORRECT_SIZE)
break;
if (flag == ERROR)
{
if ((test_param == 'u') || (test_param == 'b') || (test_param == 'm'))
;
else
{
break;
}
}
}
if (flag == INCORRECT_SIZE)
break;
if (flag == ERROR)
{
if ((test_param == 'u') || (test_param == 'b')|| (test_param == 'm') )
;
else
{
break;
}
}
loop_count++;
if (forever && KEYPRESS)
{
break;
}
//eprintf("Loop count = %d\r",loop_count);
}
while ((loop_count != loop) || forever);
if (loop == 0)
{
counter = loop_count;
}
else
{
counter = loop;
}
switch(test_param)
{
case 'u': expected_num_pkts = counter*6;
break;
case 'm': expected_num_pkts = counter*6;
break;
case 'b': expected_num_pkts = counter*6;
break;
case '1': expected_num_pkts = counter*9;
break;
}
MSG("\nexpected_num_pkts = %d\n",expected_num_pkts,0,0);
switch(ports)
{
case 0:
case 1:
case 2:
case 3: if (!cflag)
{
if ((pass_port[ports] != expected_num_pkts) || (pass_port[ports] == 0))
{
eprintf("\nDid not Receive expected number of packets on port %d\n", ports);
eprintf("Packets Received = %d\n",pass_port[ports]);
flag = ERROR;
rxflag[ports] = ERROR;
}
else
{
eprintf("\nReceived on Port %d : %d\n",ports,pass_port[ports]);
flag = OK;
}
}
else
{
if ((pass_port[rxport[ports]] != expected_num_pkts) || (pass_port[rxport[ports]] == 0))
{
eprintf("\nDid not Receive expected number of packets on port %d\n", rxport[ports]);
eprintf("Packets Received on port %d = %d\n",rxport[ports],pass_port[rxport[ports]]);
flag = ERROR;
rxflag[ports] = ERROR;
}
else
{
eprintf("\nReceived on Port %d : %d\n",rxport[ports],pass_port[rxport[ports]]);
flag = OK;
}
}
break;
case 4: eprintf("\n");
if (!cflag)
{
for (ctr=0; ctr<4; ctr++)
{
if ((pass_port[ctr] != expected_num_pkts) || (pass_port[ports] == 0))
{
eprintf("\nDid not Receive expected number of packets on port %d\n", ctr);
eprintf("Packets Received = %d\n",pass_port[ctr]);
rxflag[ctr] = ERROR;
flag = ERROR;
}
if (pass_port[ctr] == expected_num_pkts)
{
eprintf("Received %d packets on Port %d\n",pass_port[ctr],ctr);
}
}
}
else
{
for (ctr=0; ctr<2; ctr++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -