X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FNetwork%2FE1000%2Fe1000.c;h=21cc9ed76b066be6c0b4ad69fb341eea2e6bcdad;hb=e7a76b0d8a0cc6aa77966509780973a6f8216ef7;hp=fc657a1e0ce74f32cbd78ffdfbe46bbe4a9c1fd2;hpb=41d3727d7ede47845cde383826fa319f0e78f11e;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Network/E1000/e1000.c b/KernelLand/Modules/Network/E1000/e1000.c index fc657a1e..21cc9ed7 100644 --- a/KernelLand/Modules/Network/E1000/e1000.c +++ b/KernelLand/Modules/Network/E1000/e1000.c @@ -75,28 +75,16 @@ int E1000_Install(char **Arguments) for( int id = -1, i = 0; (id = PCI_GetDevice(cardtype->Vendor, cardtype->Device, i)) != -1; i ++ ) { tCard *card = &gaE1000_Cards[card_idx++]; - Uint32 mmiobase = PCI_GetBAR(id, 0); - if( mmiobase & (1|8) ) { + card->MMIOBasePhys = PCI_GetValidBAR(id, 0, PCI_BARTYPE_MEMNP); + if( !card->MMIOBasePhys ) { Log_Warning("E1000", "Dev %i: BAR0 should be non-prefetchable memory", id); continue; } - const int addrsize = (mmiobase>>1) & 3; - if( addrsize == 0 ) { - // Standard 32-bit - card->MMIOBasePhys = mmiobase & ~0xF; - } - else if( addrsize == 2 ) { - // 64-bit - card->MMIOBasePhys = (mmiobase & ~0xF) | ((Uint64)PCI_GetBAR(id, 1)<<32); - } - else { - Log_Warning("E1000", "Dev %i: Unknown memory address size %i", id, (mmiobase>>1)&3); - continue; - } card->IRQ = PCI_GetIRQ(id); IRQ_AddHandler(card->IRQ, E1000_IRQHandler, card); - + PCI_SetCommand(id, PCI_CMD_MEMENABLE|PCI_CMD_BUSMASTER, 0); + Log_Debug("E1000", "Card %i: %P IRQ %i", card_idx, card->MMIOBasePhys, card->IRQ); if( E1000_int_InitialiseCard(card) ) { @@ -245,11 +233,7 @@ int E1000_SendPacket(void *Ptr, tIPStackBuffer *Buffer) Card->TXDescs[last_txd].CMD |= TXD_CMD_EOP|TXD_CMD_IDE|TXD_CMD_IFCS; Card->TXSrcBuffers[last_txd] = Buffer; - // Trigger TX - IPStack_Buffer_LockBuffer(Buffer); - LOG("Triggering TX - Buffers[%i]=%p", last_txd, Buffer); - REG32(Card, REG_TDT) = Card->FirstFreeTXD; - Mutex_Release(&Card->lTXDescs); + __sync_synchronize(); { volatile tTXDesc *txdp = Card->TXDescs + last_txd; LOG("%p %P: %llx %x %x", txdp, MM_GetPhysAddr((void*)txdp), txdp->Buffer, txdp->Length, txdp->CMD); @@ -258,6 +242,11 @@ int E1000_SendPacket(void *Ptr, tIPStackBuffer *Buffer) LOG("%p %P: %llx %x %x", txdp, MM_GetPhysAddr((void*)txdp), txdp->Buffer, txdp->Length, txdp->CMD); MM_FreeTemp( (void*)txdp_base); } + // Trigger TX + IPStack_Buffer_LockBuffer(Buffer); + LOG("Triggering TX - Buffers[%i]=%p", last_txd, Buffer); + REG32(Card, REG_TDT) = Card->FirstFreeTXD; + Mutex_Release(&Card->lTXDescs); LOG("Waiting for TX to complete"); // Wait for completion (lock will block, then release straight away) @@ -386,7 +375,7 @@ int DrvUtil_AllocBuffers(void **Buffers, int NumBufs, int PhysBits, size_t BufSi size_t ofs = 0; const int bufs_per_page = PAGE_SIZE / BufSize; ASSERT(bufs_per_page * BufSize == PAGE_SIZE); - void *page; + void *page = NULL; for( int i = 0; i < NumBufs; i ++ ) { if( ofs == 0 ) {