* e1000.c
* - Intel 8254x Network Card Driver (core)
*/
-#define DEBUG 1
+#define DEBUG 0
#define VERSION VER2(0,1)
#include <acess.h>
#include "e1000.h"
// Allocate card array
gaE1000_Cards = calloc(sizeof(tCard), card_count);
if( !gaE1000_Cards ) {
+ Log_Warning("E1000", "Allocation of %i card structures failed", card_count);
return MODULE_ERR_MALLOC;
}
Log_Debug("E1000", "Card %i: %P IRQ %i", card_idx, card->MMIOBasePhys, card->IRQ);
if( E1000_int_InitialiseCard(card) ) {
+ Log_Warning("E1000", "Initialisation of card #%i failed", card_idx);
return MODULE_ERR_MALLOC;
}
int txd = first_txd;
while( (idx = IPStack_Buffer_GetBuffer(Buffer, idx, &len, &ptr)) != -1 )
{
+ //Debug_HexDump("E100 SendPacket", ptr, len);
if( MM_GetPhysAddr(ptr) + len-1 != MM_GetPhysAddr((char*)ptr + len-1) )
{
size_t remlen = PAGE_SIZE - ((tVAddr)ptr & (PAGE_SIZE-1));
Card->TXSrcBuffers[last_txd] = Buffer;
__sync_synchronize();
+ #if DEBUG
{
volatile tTXDesc *txdp = Card->TXDescs + last_txd;
LOG("%p %P: %llx %x %x", txdp, MM_GetPhysAddr((void*)txdp), txdp->Buffer, txdp->Length, txdp->CMD);
LOG("%p %P: %llx %x %x", txdp, MM_GetPhysAddr((void*)txdp), txdp->Buffer, txdp->Length, txdp->CMD);
MM_FreeTemp( (void*)txdp_base);
}
+ #endif
// Trigger TX
IPStack_Buffer_LockBuffer(Buffer);
LOG("Triggering TX - Buffers[%i]=%p", last_txd, Buffer);
{
LOG("No completed TXDs");
}
- }
-
+ }
+
if( icr & ICR_LSC )
{
// Link status change
LOG("nPackets = %i", nPackets);
}
- icr &= ~(ICR_RXT0|ICR_LSC|ICR_TXQE|ICR_TXDW);
+ // Transmit Descriptor Low Threshold hit
+ if( icr & ICR_TXD_LOW )
+ {
+
+ }
+
+ // Receive Descriptor Minimum Threshold Reached
+ // - We're reading too slow
+ if( icr & ICR_RXDMT0 )
+ {
+ LOG("RX descs running out");
+ }
+
+ icr &= ~(ICR_RXT0|ICR_LSC|ICR_TXQE|ICR_TXDW|ICR_TXD_LOW|ICR_RXDMT0);
if( icr )
Log_Warning("E1000", "Unhandled ICR bits 0x%x", icr);
}