//------------------------------------------------------------------------------ // // Function: CS8900ASendFrame // UINT16 CS8900ASendFrame(UINT8 *pData, UINT32 length) { BOOL rc = FALSE; UINT32 count; OALMSGS(OAL_ETHER&&OAL_VERBOSE, ( L"+CS8900ASendFrame(0x%08x, %d)\r\n", pData, length )); // Send Command OUTPORT16(&g_pCS8900->TXCMD, TX_CMD_START_ALL); OUTPORT16(&g_pCS8900->TXLENGTH, length); count = RETRY_COUNT; while (count-- > 0) { if ((ReadPacketPage(BUS_ST) & BUS_ST_TX_RDY) != 0) break; } if (count == 0) goto cleanUp; length = (length + 1) >> 1; while (length-- > 0) { OUTPORT16(&g_pCS8900->DATA0, *(UINT16*)pData); pData += sizeof(UINT16); } rc = TRUE; cleanUp: OALMSGS(OAL_ETHER&&OAL_VERBOSE, (L"-CS8900ASendFrame(rc = %d)\r\n", !rc)); return !rc; }
//------------------------------------------------------------------------------ // // Function: CS8900ASendFrame // UINT16 CS8900ASendFrame(UINT8 *pData, UINT32 length) { UINT32 NumRetries; BOOL rc = TRUE; // Default to failure code OALMSGS(OAL_ETHER && OAL_VERBOSE, ( L"+CS8900ASendFrame(0x%08x, %d)\r\n", pData, length )); // Send Command OUTPORT16(&g_pCS8900->TXCMD, TX_CMD_START_ALL); OUTPORT16(&g_pCS8900->TXLENGTH, length); NumRetries = 0; while ((ReadPacketPage(BUS_ST) & BUS_ST_TX_RDY) == 0) { if (NumRetries++ >= RETRY_COUNT) { OALMSGS(OAL_ERROR, (L"ERROR: CS8900AInit: Not ready for TX\r\n")); goto Exit; } } length = (length + 1) >> 1; while (length-- > 0) { OUTPORT16(&g_pCS8900->DATA0, *(UINT16*)pData); pData += sizeof *(UINT16*)pData; } rc = FALSE; // Success Exit: OALMSGS(OAL_ETHER && OAL_VERBOSE, (L"-CS8900ASendFrame(rc = %d)\r\n", rc)); return (rc); }