X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FNetwork%2FVIARhineII%2Frhine2.c;h=9bdbafb66f29ba81083150e34197b240cc8e03e6;hb=f0b5018caef356cda6afa147ddb6917068c62dd7;hp=3d8a4fa6a9889e4b8758ee90a9ba6a5f53ce10ff;hpb=b0a26ff18cc1e7df2442a8a967017d8c81f1de38;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Network/VIARhineII/rhine2.c b/KernelLand/Modules/Network/VIARhineII/rhine2.c index 3d8a4fa6..9bdbafb6 100644 --- a/KernelLand/Modules/Network/VIARhineII/rhine2.c +++ b/KernelLand/Modules/Network/VIARhineII/rhine2.c @@ -14,7 +14,8 @@ #define DESC_SIZE 16 #define N_RX_DESCS 16 #define RX_BUF_SIZE 1024 -#define N_RX_PAGES ((N_RX_DESCS*RX_BUF_SIZE)/PAGE_SIZE) +#define N_RX_BUF_PER_PAGE (PAGE_SIZE/RX_BUF_SIZE) +#define N_RX_BUF_PAGES ((N_RX_DESCS*RX_BUF_SIZE)/PAGE_SIZE) #define N_TX_DESCS ((PAGE_SIZE/DESC_SIZE)-N_RX_DESCS) #define CR0_BASEVAL (CR0_STRT|CR0_TXON|CR0_RXON) @@ -35,7 +36,7 @@ typedef struct sCard struct { Uint32 Phys; void *Virt; - } RXBuffers[N_RX_PAGES]; + } RXBuffers[N_RX_BUF_PAGES]; Uint32 DescTablePhys; void *DescTable; @@ -44,8 +45,7 @@ typedef struct sCard int NextTX; int nFreeTX; - struct sRXDesc *FirstRX; // Most recent unread packet - struct sRXDesc *LastRX; // End of RX descriptor queue + struct sRXDesc *NextRX; // Most recent unread packet void *IPHandle; Uint8 MacAddr[6]; @@ -80,7 +80,6 @@ int Rhine2_Install(char **Options) { int id = -1; int i = 0; -// Uint16 base; tCard *card; giRhine2_CardCount = PCI_CountDevices(VENDOR_ID, DEVICE_ID); @@ -145,7 +144,7 @@ void Rhine2_int_InitialiseCard(tCard *Card) LOG("Allocaating RX buffers"); // Allocate memory for things - for( int i = 0; i < N_RX_PAGES; i ++ ) + for( int i = 0; i < N_RX_BUF_PAGES; i ++ ) { Card->RXBuffers[i].Virt = (void*)MM_AllocDMA(1, 32, &phys); Card->RXBuffers[i].Phys = phys; @@ -161,14 +160,16 @@ void Rhine2_int_InitialiseCard(tCard *Card) { rxdescs[i].RSR = 0; rxdescs[i].BufferSize = RX_BUF_SIZE; - rxdescs[i].RXBufferStart = Card->RXBuffers[i/(PAGE_SIZE/RX_BUF_SIZE)].Phys - + (i % (PAGE_SIZE/RX_BUF_SIZE)) * RX_BUF_SIZE; + rxdescs[i].RXBufferStart = Card->RXBuffers[i/N_RX_BUF_PER_PAGE].Phys + + (i % N_RX_BUF_PER_PAGE) * RX_BUF_SIZE; rxdescs[i].RDBranchAddress = Card->DescTablePhys + (i+1) * DESC_SIZE; rxdescs[i].Length = (1 << 15); // set OWN + LOG("RX Desc %p = {Buf:0x%8x, Next:0x%x}", rxdescs, + rxdescs[i].RXBufferStart, rxdescs[i].RDBranchAddress + ); } rxdescs[ N_RX_DESCS - 1 ].RDBranchAddress = Card->DescTablePhys; - Card->FirstRX = &rxdescs[0]; - Card->LastRX = &rxdescs[N_RX_DESCS - 1]; + Card->NextRX = &rxdescs[0]; Card->TXDescs = (void*)(rxdescs + N_RX_DESCS); memset(Card->TXDescs, 0, sizeof(struct sTXDesc)*N_TX_DESCS); @@ -191,7 +192,7 @@ void Rhine2_int_InitialiseCard(tCard *Card) LOG("RX started"); outb(Card->IOBase + REG_CR0, CR0_BASEVAL); - outb(Card->IOBase + REG_CR1, CR1_DPOLL); // Disabled TX polling only? + outb(Card->IOBase + REG_CR1, 0); // Disabled TX polling only? LOG("ISR state: %02x %02x", inb(Card->IOBase + REG_ISR0), inb(Card->IOBase + REG_ISR1)); } @@ -214,7 +215,7 @@ tIPStackBuffer *Rhine2_WaitPacket(void *Ptr) } nDesc = 0; - desc = card->FirstRX; + desc = card->NextRX; while( !(desc->Length & (1 << 15)) ) { // LOG("desc(%p) = {RSR:%04x,Length:%04x,BufferSize:%04x,RXBufferStart:%08x,RDBranchAddress:%08x}", @@ -227,7 +228,7 @@ tIPStackBuffer *Rhine2_WaitPacket(void *Ptr) LOG("%i descriptors in packet", nDesc); ret = IPStack_Buffer_CreateBuffer(nDesc); - desc = card->FirstRX; + desc = card->NextRX; while( !(desc->Length & (1 << 15)) ) { void *data = Rhine2_int_GetBufferFromPhys(card, desc->RXBufferStart); @@ -237,7 +238,7 @@ tIPStackBuffer *Rhine2_WaitPacket(void *Ptr) ); desc = Rhine2_int_GetDescFromPhys(card, desc->RDBranchAddress); } - card->FirstRX = desc; + card->NextRX = desc; LEAVE('p', ret); return ret; @@ -327,7 +328,7 @@ int Rhine2_SendPacket(void *Ptr, tIPStackBuffer *Buffer) card->NextTX = (card->NextTX + nDescs) % N_TX_DESCS; desc = card->TXDescs + first_desc_id; - desc->TXBufferStart = MM_GetPhysAddr( (tVAddr)data ); + desc->TXBufferStart = MM_GetPhysAddr( data ); desc->BufferSize = len | (1 << 15); desc->TSR = 0; desc->TCR = 0; @@ -406,7 +407,7 @@ struct sRXDesc *Rhine2_int_GetDescFromPhys(tCard *Card, Uint32 Addr) void *Rhine2_int_GetBufferFromPhys(tCard *Card, Uint32 Addr) { - for( int i = 0; i < N_RX_PAGES; i ++ ) + for( int i = 0; i < N_RX_BUF_PAGES; i ++ ) { if( Card->RXBuffers[i].Phys > Addr ) continue; if( Card->RXBuffers[i].Phys + PAGE_SIZE <= Addr ) continue; @@ -418,6 +419,8 @@ void *Rhine2_int_GetBufferFromPhys(tCard *Card, Uint32 Addr) void Rhine2_int_FreeRXDesc(void *Ptr, size_t u1, size_t u2, const void *u3) { struct sRXDesc *desc = Ptr; + + LOG("Descriptor %p returned to card", desc); desc->RSR = 0; desc->Length = (1 << 15); // Reset OWN