📄 wmark_diag.c
字号:
eprintf("\nThis test cannot be run directly on the Slave console\n");
return DONE; // To indicate that the slave does not do this.
}
return DONE;
}
// ******************************************************************************
// Function: void PL_Media_Loopback_Slave(void)
//
// This function will be called by the PCI Doorbell Interrupt handler after the
// Master NPU initiates a PCI Doorbell Interrupt on the Slave NPU
// ******************************************************************************
void PL_Media_Loopback_Slave2(void)
{
UINT32 ctr, port_ctr, flag, status, loop_count, forever, packet_num = 0, error, rx_port_num=0;
UINT32 dram_addr, lw1;
UINT32 packet_len, mailbox_value=0;
UINT32 get_ring_addr;
UINT dcache_status;
UINT32 pass_port[4],ports=0;
UINT32 mailbox2_val = 0,data=0;
UINT32 rxflag[4], temp =0,exp_pkt_sz=0;
UINT32 iteration = 0,port_num=0, per_port_pkts = 0,freebuffer = 0;
/***************************************************************************
** The rxport is to be indexed by the txport and the value is the corresponding rxport.
** Tx port Rxport
** 0 1
** 1 0
** 2 3
** 3 2
*********************************************************************************/
UINT32 rxport[4] = {1, 0, 3, 2};
UINT32 msg,pnum=0, *pktptr=0;
short cflag = 0,combination=0;
flag = OK;
get_ring_addr = SCR_RING_INSTR_ADDR + (0 << 2);
Msf_OutOfReset();
status = Msf_PLL();
if (status == ERROR)
{
return;
}
dcache_status = get_CP15() & DCACHE_BIT;
if(dcache_status != 0) // if dcache ON
{
dcache_off();
}
/* initialize port array to 0 */
for (ctr = 0;ctr<4;ctr++)
{
pass_port[ctr] = 0;
rxflag[ctr] = ERROR;
}
msg = GET32(PCI_LOCAL_CSR_BASE + MAILBOX_2_OFF);
ports = msg & 0xFF;
cflag = msg >> 31;
loop_count = (msg >> 16) & 0x7FFF;
if (loop_count == 0)
{
forever = 1;
}
else
{
forever = 0;
}
flag = DownLoadUcode(PTLONE_MEDIA_LOOPBACK_RX_ME, Sz_pl_media_lpbk_jumboFrame_rx, (UINT32 *)(pl_media_lpbk_jumboFrame_rx));
if (flag != OK)
eprintf("Error downloading microcode on slave on ME 0!\n");
hal_delay_us(1000);
makePkt(256);
makePkt(512);
makePkt(1024);
makePkt(1520);
makePkt(5*1024);
makePkt(10*1024);
iteration=get_pkt_seq(&pktptr, &pnum,cflag,ports);
while ((9*loop_count != per_port_pkts) || forever)
{
for (combination = 0; combination < pnum; combination++)
{
//for (port_num = 0; port_num < 4; port_num++)
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;
mailbox_value = 0;
do // Poll for completion of receive by ME
{
if (ctr == 50000) // After 3 seconds
{
eprintf("\nTimed out...packet not received on port %d\n",port_num);
mailbox_value = NOT_RECEIVED;
flag = ERROR;
rxflag[port_num] = ERROR;
break;
}
mailbox_value = GET32(get_ring_addr);
hal_delay_us(100);
ctr++;
}
while (mailbox_value == 0);
if (flag == ERROR)
{
break;
}
/* mailbox value = sram descriptor */
freebuffer = mailbox_value << 2;
data = GET32(freebuffer+CHANNEL1_BASE_ADDRESS);
rx_port_num = data >> 24;
packet_len = data & 0xFFFF;
//eprintf("Rx port = %d, packet length = 0x%x\n",rx_port_num,packet_len);
pass_port[rx_port_num] = 1;
rxflag[rx_port_num] = OK;
packet_num++;
//error = (mailbox_value >> 16) & 0xFF;
//packet_len = mailbox_value & MASK_16BIT;
error=0;
if (error > 0)
{
if (error & 1)
{
eprintf("\nBit 10 (ABORT ERROR) of Receive Status Word set\n");
}
else if ((error >> 1) & 1)
{
eprintf("\nBit 11 (LENGTH ERROR) of Receive Status Word set\n");
}
else if ((error >> 2) & 1)
{
eprintf("\nBit 12 (PARITY ERROR) of Receive Status Word set\n");
}
mailbox_value = RECEIVE_ERROR;
flag = ERROR;
rxflag[rx_port_num] = ERROR;
break;
}
if (ports == 4)
{
exp_pkt_sz = fs_tx_data_pl[((combination * 4) + port_num)] & 0xFFFF;
}
else
{
exp_pkt_sz = pktptr[combination] & 0xFFFF;
}
dram_addr = ((freebuffer - SRAM_DESC_BASE) << 12) + DRAM_BASE_OFFSET;
/*
if (packet_len != exp_pkt_sz)
{
eprintf("Received packet length = 0x%x\n",packet_len);
eprintf("Expected packet length = 0x%x\n",exp_pkt_sz);
mailbox_value = INCORRECT_SIZE;
flag = ERROR;
rxflag[rx_port_num] = ERROR;
break;
}*/
/* In this test, the same packet is used on all the 4 ports.
Hence a chack on cflag is not required. */
#if 0
if ((packet_len == (RING_DATA_96_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
{
orig_data_size = PKT_96_SZ;
media_lb_data = (UINT32 *)data96_0;
}
else if ((packet_len == (RING_DATA_64_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
{
orig_data_size = PKT_64_SZ;
media_lb_data = (UINT32 *)data64_0;
}
else if ((packet_len == (RING_DATA_138_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
{
orig_data_size = PKT_138_SZ;
media_lb_data = (UINT32 *)data138_0;
}
else if ((packet_len == (RING_DATA_256_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
{
orig_data_size = PKT_256_SZ;
media_lb_data = (UINT32 *)data256_0;
}
else if ((packet_len == (RING_DATA_512_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
{
orig_data_size = PKT_512_SZ;
media_lb_data = (UINT32 *)data512_0;
}
else if ((packet_len == (RING_DATA_1024_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
{
orig_data_size = PKT_1024_SZ;
media_lb_data = (UINT32 *)data1024_0;
}
else if ((packet_len == (RING_DATA_1520_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
{
orig_data_size = PKT_1520_SZ;
media_lb_data = (UINT32 *)data1520_0;
}
else if ((packet_len == (RING_DATA_5K_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
{
orig_data_size = PKT_5K_SZ;
media_lb_data = (UINT32 *)data5K_0;
}
else if ((packet_len == (RING_DATA_10K_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
{
orig_data_size = PKT_10K_SZ;
media_lb_data = (UINT32 *)data10K_0;
}
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;
}
#endif
hal_delay_us(100000);
lw1 = GET32(dram_addr + 3);
//eprintf("2. dram_addr = 0x%08X val = 0x%08X\n",dram_addr, *((unsigned int *)(dram_addr)));
if (((lw1 >> 16) & 0xFFFF) == 0x8808)
{
mailbox_value = PAUSE_RECVD;
break;
}
} // end of per port processing
if (flag == ERROR)
break;
} // combinations
switch(ports)
{
case 0:
case 1:
case 2:
case 3:
if (!cflag)
{
if (pass_port[ports] == 0)
{
eprintf("Did not Receive packet on port %d\n", ports);
flag = ERROR;
rxflag[ports] = ERROR;
}
}
else
{
if (pass_port[rx_port_num] == 0)
{
eprintf("Did not Receive packet on port %d\n", rx_port_num);
flag = ERROR;
rxflag[rxport[ports]] = ERROR;
}
}
break;
case 4:
if (!cflag)
{
for (ctr=0; ctr<4; ctr++)
{
if (pass_port[ctr] == 0)
{
eprintf("Did not Receive packet on port %d\n", ctr);
rxflag[ctr] = ERROR;
}
}
}
else
{
for (ctr=0; ctr<2; ctr++)
{
if (pass_port[ctr*2+1] == 0)
{
eprintf("Did not Receive packet on port %d\n", ctr*2+1);
rxflag[ctr*2+1] = ERROR;
}
}
}
break;
default: eprintf("This is bad value for port number \n");
break;
}
if (flag == ERROR)
break;
for (ctr =0;ctr <4; ctr ++)
{
if (rxflag[ctr] == OK)
temp ++;
}
if ((ports >=0) && (ports <=3))
{
if (!cflag)
{
if (rxflag[ports] == OK)
{
flag = OK;
}
else
{
flag = ERROR;
}
}
else
{
if (rxflag[rxport[ports]] == OK)
{
flag = OK;
}
else
{
flag = ERROR;
}
}
}
if ((ports == 4) && (temp == 2))
{
flag = OK;
}
if((ports == 4) && (cflag))
per_port_pkts = packet_num/2;
else if((ports == 4) && (!cflag))
per_port_pkts = packet_num/4;
else
per_port_pkts = packet_num;
eprintf("Received : %d\r",packet_num);
PUT32((PCI_LOCAL_CSR_BASE + MAILBOX_1_OFF), PACKET_RECEIVED);
// mailbox 2 has : loop_count (31:16) and port (15:0)
mailbox2_val = GET32(PCI_LOCAL_CSR_BASE + MAILBOX_2_OFF);
mailbox2_val = (mailbox2_val >> 16) & 0x7FFF;
if ((forever && mailbox2_val) || (flag == ERROR))
{
break;
}
} // end of while loop
eprintf("\n");
switch(ports)
{
case 0:
case 1:
case 2:
case 3:
if (!cflag)
{
if (pass_port[ports] == 1)
{
eprintf("Received %d packets on Port %d\n",packet_num,ports);
}
}
else
{
if (pass_port[rxport[ports]] == 1)
{
eprintf("Received %d packets on Port %d\n",packet_num,rxport[ports]);
}
}
break;
case 4:
if (!cflag)
{
for (ctr=0; ctr<4; ctr++)
{
if (pass_port[ctr] == 1)
{
eprintf("Received: %d on port %d\n", packet_num/4, ctr);
}
}
}
else
{
for (ctr=0; ctr<2; ctr++)
{
if (pass_port[ctr*2+1] == 1)
{
eprintf("Received: %d on port %d\n", packet_num/2, ctr*2+1);
}
}
}
break;
}
if (flag == OK)
{
eprintf("Slave writing Test Complete \n");
PUT32((PCI_LOCAL_CSR_BASE + MAILBOX_0_OFF), TEST_COMPLETE);
}
else
{
eprintf("Slave writing : 0x%x\n",mailbox_value);
PUT32((PCI_LOCAL_CSR_BASE + MAILBOX_0_OFF), mailbox_value);
}
if(dcache_status != 0) // if dcache was originally ON
{
dcache_on();
}
Clear_All_ME();
}
short verify_flowControl(short cflag)
{
UINT32 RxPauseFrames[4], TxPauseFrames[4];
short test_passed = 0,iteration,port,port_ctr, rxok=0,txok=0;
if (ports == 4)
{
if (!cflag)
iteration = 4;
else
iteration = 2;
}
else
iteration = 1;
spConfig();
for(port=0; port<4;port++)
{
RxPauseFrames[port] = reg_read(((port*PORTSZ)+RX_PAUSE_MAC_CTL));
TxPauseFrames[port] = reg_read(((port*PORTSZ)+TX_PAUSE_FRAME));
}
for(port_ctr=0; port_ctr<iteration;port_ctr++)
{
if ((!cflag) && (ports == 4))
port = port_ctr;
if ((cflag) && (ports == 4))
{
port = port_ctr*2;
//port = rxport[port];
}
if ((!cflag) && (ports != 4))
port = ports;
if ((cflag) && (ports != 4))
//port = rxport[ports];
eprintf("Rx Pause Frames = %x on port %d\n",RxPauseFrames[port],port);
if (RxPauseFrames[port] > 0)
{
eprintf("Pause frames Received on Port %d\n",port);
rxok =1;
}
if (cflag)
port=rxport[port];
eprintf("Tx Pause Frames = %x on port %d\n",TxPauseFrames[port],port);
if (TxPauseFrames[port] > 0)
{
eprintf("Pause frames transmitted on Port %d\n",port);
txok =1;
}
}
if (txok && rxok)
test_passed = 1;
return test_passed;
}
short verify_underRun(short cflag)
{
UINT32 underflow,underRun[4];
short test_passed = 0,iteration,port,port_ctr;
short val= (1 << ports);
if (ports == 4)
{
if (!cflag)
iteration = 4;
else
iteration = 2;
val = 0xF;
}
else
iteration = 1;
spConfig();
underflow = reg_read(TXFIFO_OVFLW);
for(port=0; port<4;port++)
{
underRun[port] = reg_read(((port*PORTSZ)+TX_UNDERRUN));
}
spRestore();
for(port_ctr=0; port_ctr<iteration;port_ctr++)
{
if ((!cflag) && (ports == 4))
port = port_ctr;
if ((cflag) && (ports == 4))
{
port = port_ctr*2;
port = rxport[port];
}
if ((!cflag) && (ports != 4))
port = ports;
if ((cflag) && (ports != 4))
port = rxport[ports];
if (cflag)
port=rxport[port];
eprintf("TX UnderRun = \t%d on port %x\n",underRun[port],port);
eprintf("TX Underflow event register = \t%x on port %d\n",underflow,port);
if ((underflow>>4) & val)
{
eprintf("Underflow has occurred, OK , Port %d\n",port);
test_passed = 1;
}
else
{
eprintf("Underflow did not occur, FAILED , Port %d\n",port);
}
}
return test_passed;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -