2 * Acess2 VIA Rhine II Driver (VT6102)
3 * - By John Hodge (thePowersGang)
6 #define VERSION ((0<<8)|10)
10 #include <semaphore.h>
11 #include "rhine2_hw.h"
12 #include <IPStack/include/adapters_api.h>
15 #define VENDOR_ID 0x1106
16 #define DEVICE_ID 0x3065
24 tSemaphore ReadSemaphore;
32 struct sTXDesc *FirstTX;
33 struct sTXDesc *LastTX; // Most recent unsent packet
35 struct sRXDesc *FirstRX; // Most recent unread packet
36 struct sRXDesc *LastRX; // End of RX descriptor queue
43 int Rhine2_Install(char **Options);
44 tIPStackBuffer *Rhine2_WaitPacket(void *Ptr);
45 int Rhine2_SendPacket(void *Ptr, tIPStackBuffer *Buffer);
46 void Rhine2_IRQHandler(int Num);
48 struct sRXDesc *Rhine2_int_GetDescFromPhys(tCard *Card, Uint32 Addr);
49 void *Rhine2_int_GetBufferFromPhys(tCard *Card, Uint32 Addr);
50 void Rhine2_int_FreeRXDesc(void *Desc, size_t, size_t, const void*);
51 struct sTXDesc *Rhine2_int_AllocTXDesc(tCard *Card);
53 void _WriteDWord(tCard *Card, int Offset, Uint32 Value);
56 MODULE_DEFINE(0, VERSION, VIARhineII, Rhine2_Install, NULL, NULL);
57 tIPStack_AdapterType gRhine2_AdapterType = {
58 .Name = "VIA Rhine II",
59 .SendPacket = Rhine2_SendPacket,
60 .WaitForPacket = Rhine2_WaitPacket,
62 int giRhine2_CardCount;
63 tCard *gaRhine2_Cards;
67 * \brief Initialises the driver
69 int Rhine2_Install(char **Options)
76 giRhine2_CardCount = PCI_CountDevices(VENDOR_ID, DEVICE_ID);
77 Log_Debug("Rhine2", "%i cards", giRhine2_CardCount);
79 if( giRhine2_CardCount == 0 ) return MODULE_ERR_NOTNEEDED;
81 gaRhine2_Cards = calloc( giRhine2_CardCount, sizeof(tCard) );
83 while( (id = PCI_GetDevice(VENDOR_ID, DEVICE_ID, i)) != -1 )
85 card = &gaRhine2_Cards[i];
87 LOG("BAR0 = 0x%08x", PCI_GetBAR(id, 0));
88 LOG("BAR1 = 0x%08x", PCI_GetBAR(id, 1));
89 LOG("BAR2 = 0x%08x", PCI_GetBAR(id, 2));
90 LOG("BAR3 = 0x%08x", PCI_GetBAR(id, 3));
91 LOG("BAR4 = 0x%08x", PCI_GetBAR(id, 4));
92 LOG("BAR5 = 0x%08x", PCI_GetBAR(id, 5));
94 // card->IOBase = base;
95 card->IRQ = PCI_GetIRQ( id );
97 // Install IRQ Handler
98 // IRQ_AddHandler(card->IRQ, Rhine2_IRQHandler);
102 // Log_Log("PCnet3", "Card %i 0x%04x, IRQ %i %02x:%02x:%02x:%02x:%02x:%02x",
103 // i, card->IOBase, card->IRQ,
104 // card->MacAddr[0], card->MacAddr[1], card->MacAddr[2],
105 // card->MacAddr[3], card->MacAddr[4], card->MacAddr[5]
111 return MODULE_ERR_OK;
114 // --- File Functions ---
115 tIPStackBuffer *Rhine2_WaitPacket(void *Ptr)
119 struct sRXDesc *desc;
124 if( Semaphore_Wait( &card->ReadSemaphore, 1 ) != 1 )
131 desc = card->FirstRX;
132 while( desc->BufferSize & (1 << 15) )
134 desc = Rhine2_int_GetDescFromPhys(card, desc->RDBranchAddress);
138 LOG("%i descriptors in packet", nDesc);
140 ret = IPStack_Buffer_CreateBuffer(nDesc);
141 desc = card->FirstRX;
142 while( desc->BufferSize & (1 << 15) )
144 void *data = Rhine2_int_GetBufferFromPhys(card, desc->RXBufferStart);
145 IPStack_Buffer_AppendSubBuffer(ret,
146 desc->Length, 0, data,
147 Rhine2_int_FreeRXDesc, desc
149 desc = Rhine2_int_GetDescFromPhys(card, desc->RDBranchAddress);
151 card->FirstRX = desc;
157 int Rhine2_SendPacket(void *Ptr, tIPStackBuffer *Buffer)
162 struct sTXDesc *first_desc = NULL;
163 struct sTXDesc *last_desc = NULL;
165 ENTER("pPtr pBuffer", Ptr, Buffer);
168 for( int id = -1; -1 != (id = IPStack_Buffer_GetBuffer(Buffer, id, &len, &data)); )
170 tPAddr pdata = MM_GetPhysAddr( (tVAddr)data );
171 struct sTXDesc *desc;
178 desc = Rhine2_int_AllocTXDesc(card);
182 last_desc->TDBranchAddress = MM_GetPhysAddr( (tVAddr)desc );
184 desc->TXBufferStart = pdata;
185 desc->BufferSize = len;
188 desc->TDBranchAddress = 0;
198 first_desc->TCR |= TD_TCR_STP;
199 last_desc->TCR |= TD_TCR_EDP;
202 card->LastTX->TDBranchAddress = MM_GetPhysAddr( (tVAddr)first_desc );
204 card->FirstTX = first_desc;
205 card->LastTX = first_desc;
206 _WriteDWord(card, REG_CUR_TX_DESC, MM_GetPhysAddr( (tVAddr)first_desc ));
209 // TODO: Wait until the packet has sent, then clean up
214 void Rhine2_IRQHandler(int Num)
220 struct sRXDesc *Rhine2_int_GetDescFromPhys(tCard *Card, Uint32 Addr)
225 void *Rhine2_int_GetBufferFromPhys(tCard *Card, Uint32 Addr)
230 void Rhine2_int_FreeRXDesc(void *Desc, size_t u1, size_t u2, const void *u3)
235 struct sTXDesc *Rhine2_int_AllocTXDesc(tCard *Card)
241 void _WriteDWord(tCard *Card, int Offset, Uint32 Value)