This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Problem with EMAC Fragmented frames

Hi

I request someone's help to solve my problem.

I am trying to send a data (> 1518 bytes); so to fragment the data i used linked list descriptor queues  . But the  TXINTSTATRAW bit is not going high to acknowledge my transfer after TxHDP is written. i am using two buffer descriptor and and single data buffer for testing. Kindly help me to solve after analysing the code.

Thank U.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

static volatile EmacDescripter *gEmacDescripter_RxDesc = (EmacDescripter *)(EMAC_RAM_BASE + RX_DESC_OFFSET);
static volatile EmacDescripter *gEmacDescripter_TxDesc = (EmacDescripter *)(EMAC_RAM_BASE + TX_DESC_OFFSET);
static volatile EmacDescripter *gEmacDescripter_TxDesc1 = (EmacDescripter *)(EMAC_RAM_BASE + TX_DESC_OFFSET1);
static volatile EmacDescripter *gEmacDescripter_TxDescripter = (EmacDescripter *)(EMAC_RAM_BASE + TX_DESC_OFFSET2);

static uchar guchar_toggle = 0;

int TransmitData(MACAddr *DstAddr,unsigned char *DataBuff, unsigned short BufferSize, unsigned short PacketSize, unsigned char PacketStatus)
{
uint32 luint32_Count=0;

while(!uchar_IsLinkActive(NOS_SM_PORT))
{
if(luint32_Count>10000)
{
#ifdef DEBUG
printf("Link is INACTIVE \r\n");
#endif
return (ERR_ENET_LINK_INACTIVE);
}
luint32_Count++;
}
#ifdef DEBUG
printf("Link is ACTIVE \r\n");
#endif

if(PacketStatus == SINGLE_FRAGMENT_PKT)
{
gEmacDescripter_TxDesc->uint32_Next = 0; // populate the tx descriptor.
gEmacDescripter_TxDesc->puchar_buffer = DataBuff;
gEmacDescripter_TxDesc->uint16_BuffLength = (BufferSize);
gEmacDescripter_TxDesc->uint16_BuffOffset = 0;
gEmacDescripter_TxDesc->uint16_PktLength = (BufferSize) ;
gEmacDescripter_TxDesc->uint16_Flags = (EMAC_DSC_FLAG_SOP |
EMAC_DSC_FLAG_EOP |
EMAC_DSC_FLAG_OWNER);
gEmacDescripter_TxDescripter = gEmacDescripter_TxDesc;
}
else if(PacketStatus == START_FRAGMENT_PKT)
{
gEmacDescripter_TxDesc->uint32_Next =(uint32)gEmacDescripter_TxDesc1; // populate the tx descriptor.
gEmacDescripter_TxDesc->puchar_buffer = DataBuff;
gEmacDescripter_TxDesc->uint16_BuffLength = (BufferSize);
gEmacDescripter_TxDesc->uint16_BuffOffset = 0;
gEmacDescripter_TxDesc->uint16_PktLength = (PacketSize) ;
gEmacDescripter_TxDesc->uint16_Flags = (EMAC_DSC_FLAG_SOP |
EMAC_DSC_FLAG_OWNER);
gEmacDescripter_TxDescripter = gEmacDescripter_TxDesc;
}
else if(PacketStatus == FRAGMENT_PKT)
{
if (guchar_toggle == 1)
{
gEmacDescripter_TxDesc->uint32_Next = (uint32)gEmacDescripter_TxDesc1;
gEmacDescripter_TxDesc->puchar_buffer = DataBuff;
gEmacDescripter_TxDesc->uint16_BuffLength = (BufferSize);
gEmacDescripter_TxDesc->uint16_BuffOffset = 0;
gEmacDescripter_TxDesc->uint16_PktLength = (PacketSize) ;
gEmacDescripter_TxDesc->uint16_Flags = EMAC_DSC_FLAG_OWNER;
gEmacDescripter_TxDescripter = gEmacDescripter_TxDesc;
guchar_toggle = 0;
} // populate the tx descriptor.
else
{
gEmacDescripter_TxDesc1->uint32_Next = (uint32)gEmacDescripter_TxDesc;
gEmacDescripter_TxDesc1->puchar_buffer = DataBuff;
gEmacDescripter_TxDesc1->uint16_BuffLength = (BufferSize);
gEmacDescripter_TxDesc1->uint16_BuffOffset = 0;
gEmacDescripter_TxDesc1->uint16_PktLength = (PacketSize) ;
gEmacDescripter_TxDesc1->uint16_Flags = EMAC_DSC_FLAG_OWNER;
gEmacDescripter_TxDescripter = gEmacDescripter_TxDesc1;
guchar_toggle = 1;
}
}
else if(PacketStatus == ENDOF_FRAGMENT_PKT)
{
gEmacDescripter_TxDesc->uint32_Next = 0; // populate the tx descriptor.
gEmacDescripter_TxDesc->puchar_buffer = DataBuff;
gEmacDescripter_TxDesc->uint16_BuffLength = (BufferSize);
gEmacDescripter_TxDesc->uint16_BuffOffset = 0;
gEmacDescripter_TxDesc->uint16_PktLength = (PacketSize) ;
gEmacDescripter_TxDesc->uint16_Flags = (EMAC_DSC_FLAG_EOP |
EMAC_DSC_FLAG_OWNER);
gEmacDescripter_TxDescripter = gEmacDescripter_TxDesc;
}

EMAC->uint32_TXHDP[0] = (uint32)(gEmacDescripter_TxDescripter); //Start Transmission
while (!CHKBIT(EMAC->uint32_TXINTSTATRAW, TX0PEND))//Check the status of successful transmission
{
if (!uchar_IsLinkActive(NOS_SM_PORT)) // make sure the link is not broken.
{
#ifdef DEBUG
printf("Packet transmission Failed due to Link broken \r\n");
#endif
return (ERR_ENET_LINK_INACTIVE);
}
}

return SUCCESS;
}