Kernel - Changed MM_GetPhysAddr to take a pointer
[tpg/acess2.git] / KernelLand / Modules / Network / VIARhineII / rhine2.c
index 3d8a4fa..f9f4d25 100644 (file)
@@ -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];
@@ -84,6 +84,7 @@ int Rhine2_Install(char **Options)
        tCard   *card;
        
        giRhine2_CardCount = PCI_CountDevices(VENDOR_ID, DEVICE_ID);
+       Log_Debug("Rhine2", "giRhine2_CardCount = %i", giRhine2_CardCount);
        if( giRhine2_CardCount == 0 )   return MODULE_ERR_NOTNEEDED;
        
        gaRhine2_Cards = calloc( giRhine2_CardCount, sizeof(tCard) );
@@ -145,7 +146,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 +162,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 +194,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 +217,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 +230,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 +240,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 +330,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 +409,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 +421,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

UCC git Repository :: git.ucc.asn.au