?? diag.c
字號:
if (ptr[i] != (UINT8)pattern)
{
printf("Mismatch\n (offset 0x%08X, read 0x%02X, expect 0x%02X)\n\n",
(UINT32)i,
ptr[i],
(UINT8)pattern
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
/* All 0x00 */
STATUS diagAll0x00(UINT8 *ptr, int length)
{
int i, pattern;
printf(" Pattern 0x00 ..............");
for (i=0, pattern=0x00; i<length; i++)
{
ptr[i] = (UINT8)pattern;
}
for (i=0, pattern=0x00; i<length; i++)
{
if (ptr[i] != (UINT8)pattern)
{
printf("Mismatch\n (offset 0x%08X, read 0x%02X, expect 0x%02X)\n\n",
(UINT32)i,
ptr[i],
(UINT8)pattern
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
/* All 0xFF */
STATUS diagAll0xFF(UINT8 *ptr, int length)
{
int i, pattern;
printf(" Pattern 0xFF ..............");
for (i=0, pattern=0xff; i<length; i++)
{
ptr[i] = (UINT8)pattern;
}
for (i=0, pattern=0xff; i<length; i++)
{
if (ptr[i] != (UINT8)pattern)
{
printf("Mismatch\n (offset 0x%08X, read 0x%02X, expect 0x%02X)\n\n",
(UINT32)i,
ptr[i],
(UINT8)pattern
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
STATUS diagMem(UINT8 *ptr, int length)
{
if (diagAddress((UINT32 *)ptr, length) != OK)
{
return ERROR;
}
#ifdef DIAG_ALIGN
diagAlign1((UINT32 *)ptr, length);
diagAlign2((UINT32 *)ptr, length);
diagAlign3((UINT32 *)ptr, length);
#endif /* DIAG_ALIGN */
if (diagIncFrom0x00(ptr, length) != OK)
{
return ERROR;
}
if (diagDecFrom0xFF(ptr, length) != OK)
{
return ERROR;
}
if (diagIncWalkingOne(ptr, length) != OK)
{
return ERROR;
}
if (diagDecWalkingOne(ptr, length) != OK)
{
return ERROR;
}
if (diagAll0x55(ptr, length) != OK)
{
return ERROR;
}
if (diagAll0xAA(ptr, length) != OK)
{
return ERROR;
}
if (diagAll0xFF(ptr, length) != OK)
{
return ERROR;
}
if (diagAll0x00(ptr, length) != OK)
{
return ERROR;
}
printf("\n");
return OK;
}
void diagEthMakeHeader(ETH_DRV_CTRL *pDrvCtrl, PETHTBD pTbd)
{
bcopy(pDrvCtrl->IFADDR.phyAddress, ((ETH_HDR *)(pTbd->pBuf + SIZE_ETH_WA))->ether_shost, SIZE_ETH_ADDR);
bcopy(pDrvCtrl->IFADDR.phyAddress, ((ETH_HDR *)(pTbd->pBuf + SIZE_ETH_WA))->ether_dhost, SIZE_ETH_ADDR);
((ETH_HDR *)(pTbd->pBuf + SIZE_ETH_WA))->ether_type = htons(ETHERTYPE_IP);
}
STATUS diagEthLoopTest(ETH_DRV_CTRL *pDrvCtrl1, ETH_DRV_CTRL *pDrvCtrl2, int repeat)
{
int i, j;
PETHRBD pRbd;
PETHTBD pTbd;
UINT32 tickStart;
ULONG length;
printf("\nETH%d: Verifying Data Transfer\n", pDrvCtrl1->unit);
do
{
printf("ETH%d: Wait for a few seconds...\n", pDrvCtrl1->unit);
for (i=0; i<2048; i++)
{
for (j=0; j<lengthFrame; j++)
{
buffer[j] = (UCHAR)(i + j + j / 256);
}
pTbd = ETH_DRV_TBD_GET(pDrvCtrl1);
if (pTbd)
{
diagEthMakeHeader(pDrvCtrl1, pTbd);
bcopy(buffer, (char *)(pTbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), lengthFrame);
ETH_DRV_TBD_START(pDrvCtrl1, pTbd, lengthFrame + SIZE_ETH_HDR);
if (ETH_DRV_TBD_CHECK(pDrvCtrl1, pTbd) != OK)
{
#ifndef DIAG_QUIET
printf("ETH%d: Tx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl1->unit, i + 1, (UINT)pTbd->length, pTbd->status);
printf("ETH%d: TBD:%08X, TB:%08X\n", pDrvCtrl1->unit, (UINT32)pTbd, (UINT32)pTbd->pBuf);
#endif /* DIAG_QUIET */
pDrvCtrl1->errTx++;
}
else
{
pDrvCtrl1->okTx++;
}
}
else
{
printf("ETH%d: Tx busy, sequence %d\n", pDrvCtrl1->unit, i + 1);
pDrvCtrl1->errTx++;
return ERROR;
}
tickStart = tickGet();
while ((pRbd = ETH_DRV_RBD_GET(pDrvCtrl2)) == NULL)
{
if (((tickGet() - tickStart) / sysClkRateGet()) > 5)
{
printf("ETH%d: no receive indication during 5 seconds, sequence %d\n", pDrvCtrl2->unit, i + 1);
pDrvCtrl2->errRx++;
return ERROR;
}
}
length = ETH_DRV_RBD_CHECK(pDrvCtrl2, pRbd);
if (length == (lengthFrame + SIZE_ETH_HDR))
{
for (j=0; j<lengthFrame; j++)
{
if (((char *)(pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR))[j] != (UCHAR)(i + j + j / 256))
{
break;
}
}
if (j < lengthFrame)
{
#ifndef DIAG_QUIET
printf("ETH%d: mismatch, sequence %d, addr %08X\n", pDrvCtrl2->unit, i + 1, pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR + j);
printf("ETH%d: RBD:%08X, RB:%08X\n", pDrvCtrl2->unit, (UINT32)pRbd, (UINT32)pRbd->pBuf);
#endif /* DIAG_QUIET */
pDrvCtrl2->errRx++;
printf("Make Buffer\n");
diagHexDump((UCHAR *)buffer, lengthFrame);
printf("Tx Buffer\n");
diagHexDump((UCHAR *)(pTbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), lengthFrame);
printf("Rx Buffer\n");
diagHexDump((UCHAR *)(pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), lengthFrame);
return ERROR;
}
else
{
pDrvCtrl2->okRx++;
}
}
else
{
#ifndef DIAG_QUIET
printf("ETH%d: Rx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl2->unit, i + 1, (UINT)pRbd->length, pRbd->status);
printf("ETH%d: RBD:%08X, RB:%08X\n", pDrvCtrl2->unit, (UINT32)pRbd, (UINT32)pRbd->pBuf);
#endif /* DIAG_QUIET */
pDrvCtrl2->errRx++;
}
ETH_DRV_RBD_FREE(pDrvCtrl2, pRbd);
}
printf("ETH%d: Number of Rx OKs : %d\n", pDrvCtrl2->unit, pDrvCtrl2->okRx);
printf("ETH%d: Number of Rx ERRs: %d\n", pDrvCtrl2->unit, pDrvCtrl2->errRx);
printf("ETH%d: Number of Tx OKs : %d\n", pDrvCtrl1->unit, pDrvCtrl1->okTx);
printf("ETH%d: Number of Tx ERRs: %d\n", pDrvCtrl1->unit, pDrvCtrl1->errTx);
} while ((repeat == 0) || (--repeat != 0));
#ifdef DIAG_TASK
taskDelay(0);
#endif /* DIAG_TASK */
return OK;
}
/* temp */
#if 0
STATUS diagEthRateTest(ETH_DRV_CTRL *pDrvCtrl1, ETH_DRV_CTRL *pDrvCtrl2, int repeat)
{
int i;
int seqRx;
int seqTx;
UINT32 seconds;
UINT32 busyTx;
UINT32 okRx;
UINT32 okTx;
int errRx;
int errTx;
PETHRBD pRbd;
PETHTBD pTbd;
UINT32 tickStart;
ULONG length;
printf("\nETH%d: Estimate Data Transfer Rate (two copy)\n", pDrvCtrl1->unit);
printf("ETH%d: Wait for 30 seconds...\n", pDrvCtrl1->unit);
seqRx = 0;
seqTx = 0;
seconds = 0;
busyTx = 0;
okRx = 0;
okTx = 0;
errRx = 0;
errTx = 0;
for (i=0; i<lengthFrame; i++)
{
buffer[i] = (UCHAR)(i % 256);
}
tickStart = tickGet();
while (seconds < 30)
{
pTbd = ETH_DRV_TBD_GET(pDrvCtrl1);
if (pTbd)
{
seqTx++;
if (pTbd->status != 0)
{
if (ETH_DRV_TBD_CHECK(pDrvCtrl1, pTbd) != OK)
{
#ifndef DIAG_QUIET
printf("ETH%d: Tx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl1->unit, seqTx, (UINT)pTbd->length, pTbd->status);
printf("ETH%d: TBD:%08X, TB:%08X\n", pDrvCtrl1->unit, (UINT32)pTbd, (UINT32)pTbd->pBuf);
#endif /* DIAG_QUIET */
pDrvCtrl1->err1Tx++;
errTx++;
}
else
{
pDrvCtrl1->ok1Tx++;
okTx++;
}
}
buffer[0] = (UCHAR)(i % 256);
diagEthMakeHeader(pDrvCtrl1, pTbd);
bcopy(buffer, (char *)(pTbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), lengthFrame);
ETH_DRV_TBD_START(pDrvCtrl1, pTbd, lengthFrame + SIZE_ETH_HDR);
}
else
{
busyTx++;
}
while ((pRbd = ETH_DRV_RBD_GET(pDrvCtrl2)) != NULL)
{
seqRx++;
length = ETH_DRV_RBD_CHECK(pDrvCtrl2, pRbd);
if (length == (lengthFrame + SIZE_ETH_HDR))
{
bcopy((char *)(pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), buffer, lengthFrame);
pDrvCtrl2->ok1Rx++;
okRx++;
else
{
#ifndef DIAG_QUIET
printf("ETH%d: Rx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl2->unit, seqRx, (UINT)pRbd->length, pRbd->status);
printf("ETH%d: RBD:%08X, RB:%08X\n", pDrvCtrl2->unit, (UINT32)pRbd, (UINT32)pRbd->pBuf);
#endif /* DIAG_QUIET */
pDrvCtrl2->err1Rx++;
errRx++;
}
/* Advance to next RBD. */
pDrvCtrl2->rbdIndex++;
if (pDrvCtrl2->rbdIndex == NUM_RBD_ETH)
{
pDrvCtrl2->rbdIndex = 0;
}
}
seconds = (tickGet() - tickStart) / sysClkRateGet();
if ((okRx == 0) && (errRx == 0) && (seconds > 5))
{
printf("ETH%d: no receive indication during 5 seconds\n", pDrvCtrl2->unit);
pDrvCtrl2->err1Rx++;
errRx++;
return ERROR;
}
if (seqTx >= 32)
{
break;
}
}
while ((okRx + errRx) != seqTx)
{
while ((pRbd = ETH_DRV_RBD_GET(pDrvCtrl2)) != NULL)
{
seqRx++;
length = ETH_DRV_RBD_CHECK(pDrvCtrl2, pRbd);
if (length == (lengthFrame + SIZE_ETH_HDR))
{
bcopy((char *)(pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), buffer, lengthFrame);
pDrvCtrl2->ok1Rx++;
okRx++;
}
else
{
#ifndef DIAG_QUIET
printf("ETH%d: Rx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl2->unit, seqRx, (UINT)pRbd->length, pRbd->status);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -