- if (TransmitBufferListPtr != NULL) {\r
- *TransmitBufferListPtr =\r
- (\r
- ((Snp->Cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN) != 0) ||\r
- ((Snp->Cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_TXBUF_QUEUE_EMPTY) != 0)\r
- ) ? 0 : (VOID *) (UINTN) Db->TxBuffer[0];\r
-\r
+ if (GetTransmittedBuf) {\r
+ if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN) == 0) {\r
+ //\r
+ // UNDI has written some transmitted buffer addresses into the DB. Store them into Snp->RecycledTxBuf.\r
+ //\r
+ for (Index = 0; Index < MAX_XMIT_BUFFERS; Index++) {\r
+ if (Db->TxBuffer[Index] != 0) {\r
+ if (Snp->RecycledTxBufCount == Snp->MaxRecycledTxBuf) {\r
+ //\r
+ // Snp->RecycledTxBuf is full, reallocate a new one.\r
+ //\r
+ if ((Snp->MaxRecycledTxBuf + SNP_TX_BUFFER_INCREASEMENT) >= SNP_MAX_TX_BUFFER_NUM) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+ Tmp = AllocatePool (sizeof (UINT64) * (Snp->MaxRecycledTxBuf + SNP_TX_BUFFER_INCREASEMENT));\r
+ if (Tmp == NULL) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+ CopyMem (Tmp, Snp->RecycledTxBuf, sizeof (UINT64) * Snp->RecycledTxBufCount);\r
+ FreePool (Snp->RecycledTxBuf);\r
+ Snp->RecycledTxBuf = Tmp;\r
+ Snp->MaxRecycledTxBuf += SNP_TX_BUFFER_INCREASEMENT;\r
+ }\r
+ Snp->RecycledTxBuf[Snp->RecycledTxBufCount] = Db->TxBuffer[Index];\r
+ Snp->RecycledTxBufCount++;\r
+ }\r
+ }\r
+ }\r