X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FNetwork%2FVIARhineII%2Frhine2.c;h=c933739521dfa48d77a2fd540bd988f2dcf211da;hb=0c2915f7f306013a29fc79ed69039eae3a26f337;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..c9337395 100644 --- a/KernelLand/Modules/Network/VIARhineII/rhine2.c +++ b/KernelLand/Modules/Network/VIARhineII/rhine2.c @@ -2,7 +2,7 @@ * Acess2 VIA Rhine II Driver (VT6102) * - By John Hodge (thePowersGang) */ -#define DEBUG 1 +#define DEBUG 0 #define VERSION ((0<<8)|10) #include #include @@ -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,8 +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); if( giRhine2_CardCount == 0 ) return MODULE_ERR_NOTNEEDED; @@ -90,7 +88,7 @@ int Rhine2_Install(char **Options) while( (id = PCI_GetDevice(VENDOR_ID, DEVICE_ID, i)) != -1 ) { - card = &gaRhine2_Cards[i]; + tCard *card = &gaRhine2_Cards[i]; LOG("BAR0 = 0x%08x", PCI_GetBAR(id, 0)); LOG("BAR1 = 0x%08x", PCI_GetBAR(id, 1)); @@ -145,7 +143,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 +159,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 +191,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)); } @@ -200,7 +200,6 @@ void Rhine2_int_InitialiseCard(tCard *Card) tIPStackBuffer *Rhine2_WaitPacket(void *Ptr) { tCard *card = Ptr; - tIPStackBuffer *ret; struct sRXDesc *desc; int nDesc; @@ -214,7 +213,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}", @@ -226,8 +225,8 @@ tIPStackBuffer *Rhine2_WaitPacket(void *Ptr) LOG("%i descriptors in packet", nDesc); - ret = IPStack_Buffer_CreateBuffer(nDesc); - desc = card->FirstRX; + tIPStackBuffer *ret = IPStack_Buffer_CreateBuffer(nDesc); + desc = card->NextRX; while( !(desc->Length & (1 << 15)) ) { void *data = Rhine2_int_GetBufferFromPhys(card, desc->RXBufferStart); @@ -237,7 +236,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 +326,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 +405,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 +417,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