X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FNetwork%2FNE2000%2Fne2000.c;h=d05b2a339e01943fc8acdf898d4aca58961e5a62;hb=5f2024e5977e0cca0993a20dad5ab794c94d5711;hp=53602e7b5ac069fb137a88707260b3d96389e77a;hpb=9cae7d64750db729b6bee582a8e7203ec3de36b4;p=tpg%2Facess2.git diff --git a/Modules/Network/NE2000/ne2000.c b/Modules/Network/NE2000/ne2000.c index 53602e7b..d05b2a33 100644 --- a/Modules/Network/NE2000/ne2000.c +++ b/Modules/Network/NE2000/ne2000.c @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include // === CONSTANTS === @@ -86,24 +86,32 @@ typedef struct sNe2k_Card { char *Ne2k_ReadDir(tVFS_Node *Node, int Pos); tVFS_Node *Ne2k_FindDir(tVFS_Node *Node, const char *Name); int Ne2k_IOCtl(tVFS_Node *Node, int ID, void *Data); -Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); +Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer); Uint64 Ne2k_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); int Ne2k_int_ReadDMA(tCard *Card, int FirstPage, int NumPages, void *Buffer); Uint8 Ne2k_int_GetWritePage(tCard *Card, Uint16 Length); -void Ne2k_IRQHandler(int IntNum); +void Ne2k_IRQHandler(int IntNum, void *Ptr); // === GLOBALS === MODULE_DEFINE(0, VERSION, Ne2k, Ne2k_Install, NULL, NULL); +tVFS_NodeType gNe2K_RootNodeType = { + .ReadDir = Ne2k_ReadDir, + .FindDir = Ne2k_FindDir, + .IOCtl = Ne2k_IOCtl + }; +tVFS_NodeType gNe2K_DevNodeType = { + .Write = Ne2k_Write, + .Read = Ne2k_Read, + .IOCtl = Ne2k_IOCtl + }; tDevFS_Driver gNe2k_DriverInfo = { NULL, "ne2k", { .NumACLs = 1, .ACLs = &gVFS_ACL_EveryoneRX, .Flags = VFS_FFLAG_DIRECTORY, - .ReadDir = Ne2k_ReadDir, - .FindDir = Ne2k_FindDir, - .IOCtl = Ne2k_IOCtl + .Type = &gNe2K_RootNodeType } }; Uint16 gNe2k_BaseAddress; @@ -118,20 +126,18 @@ tCard *gpNe2k_Cards = NULL; int Ne2k_Install(char **Options) { int i, j, k; - int count, id, base; + int count, base; + tPCIDev id; // --- Scan PCI Bus --- // Count Cards giNe2k_CardCount = 0; for( i = 0; i < NUM_COMPAT_DEVICES; i ++ ) { - giNe2k_CardCount += PCI_CountDevices( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device, 0 ); + giNe2k_CardCount += PCI_CountDevices( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device ); } - if( giNe2k_CardCount == 0 ) { - Log_Warning("Ne2k", "No cards detected"); - return MODULE_ERR_NOTNEEDED; - } + if( giNe2k_CardCount == 0 ) return MODULE_ERR_NOTNEEDED; // Enumerate Cards k = 0; @@ -139,19 +145,19 @@ int Ne2k_Install(char **Options) for( i = 0; i < NUM_COMPAT_DEVICES; i ++ ) { - count = PCI_CountDevices( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device, 0 ); + count = PCI_CountDevices( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device ); for( j = 0; j < count; j ++,k ++ ) { - id = PCI_GetDevice( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device, 0, j ); + id = PCI_GetDevice( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device, j ); // Create Structure - base = PCI_AssignPort( id, 0, 0x20 ); + base = PCI_GetBAR( id, 0 ); gpNe2k_Cards[ k ].IOBase = base; gpNe2k_Cards[ k ].IRQ = PCI_GetIRQ( id ); gpNe2k_Cards[ k ].NextMemPage = 64; gpNe2k_Cards[ k ].NextRXPage = RX_FIRST; // Install IRQ Handler - IRQ_AddHandler(gpNe2k_Cards[ k ].IRQ, Ne2k_IRQHandler); + IRQ_AddHandler(gpNe2k_Cards[ k ].IRQ, Ne2k_IRQHandler, &gpNe2k_Cards[k]); // Reset Card outb( base + 0x1F, inb(base + 0x1F) ); @@ -204,9 +210,7 @@ int Ne2k_Install(char **Options) gpNe2k_Cards[ k ].Node.ImplPtr = &gpNe2k_Cards[ k ]; gpNe2k_Cards[ k ].Node.NumACLs = 0; // Root Only gpNe2k_Cards[ k ].Node.CTime = now(); - gpNe2k_Cards[ k ].Node.Write = Ne2k_Write; - gpNe2k_Cards[ k ].Node.Read = Ne2k_Read; - gpNe2k_Cards[ k ].Node.IOCtl = Ne2k_IOCtl; + gpNe2k_Cards[ k ].Node.Type = &gNe2K_DevNodeType; // Initialise packet semaphore // - Start at zero, no max @@ -277,18 +281,20 @@ int Ne2k_IOCtl(tVFS_Node *Node, int ID, void *Data) } /** - * \fn Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) + * \fn Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer) * \brief Send a packet from the network card */ -Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) +Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer) { tCard *Card = (tCard*)Node->ImplPtr; - Uint16 *buf = Buffer; + const Uint16 *buf = Buffer; int rem = Length; int page; ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer); + // TODO: Lock + // Sanity Check Length if(Length > TX_BUF_SIZE*256) { Log_Warning( @@ -360,7 +366,11 @@ Uint64 Ne2k_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer); // Wait for packets - Semaphore_Wait( &Card->Semaphore, 1 ); + if( Semaphore_Wait( &Card->Semaphore, 1 ) != 1 ) + { + // Error or interrupted + LEAVE_RET('i', 0); + } outb(Card->IOBase, 0x22 | (1 << 6)); // Page 6 LOG("CURR : 0x%02x", inb(Card->IOBase + CURR)); @@ -392,10 +402,7 @@ Uint64 Ne2k_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) LOG("pktHdr->Length (%i) > 256 - 4, allocated buffer %p", pktHdr->Length, buf); - if(!buf) { - LEAVE('i', -1); - return -1; - } + if(!buf) LEAVE_RET('i', -1); // Copy the already read data memcpy(buf, data, 256); @@ -502,39 +509,35 @@ Uint8 Ne2k_int_GetWritePage(tCard *Card, Uint16 Length) /** * \fn void Ne2k_IRQHandler(int IntNum) */ -void Ne2k_IRQHandler(int IntNum) +void Ne2k_IRQHandler(int IntNum, void *Ptr) { - int i; Uint8 byte; - for( i = 0; i < giNe2k_CardCount; i++ ) - { - if(gpNe2k_Cards[i].IRQ == IntNum) - { - byte = inb( gpNe2k_Cards[i].IOBase + ISR ); - - LOG("byte = 0x%02x", byte); - + tCard *card = Ptr; + + if(card->IRQ != IntNum) return; + + byte = inb( card->IOBase + ISR ); + + LOG("byte = 0x%02x", byte); - // Reset All (save for RDMA), that's polled - outb( gpNe2k_Cards[i].IOBase + ISR, 0xFF&(~0x40) ); - // 0: Packet recieved (no error) - if( byte & 1 ) - { - //if( gpNe2k_Cards[i].NumWaitingPackets > MAX_PACKET_QUEUE ) - // gpNe2k_Cards[i].NumWaitingPackets = MAX_PACKET_QUEUE; - Semaphore_Signal( &gpNe2k_Cards[i].Semaphore, 1 ); - } - // 1: Packet sent (no error) - // 2: Recieved with error - // 3: Transmission Halted (Excessive Collisions) - // 4: Recieve Buffer Exhausted - // 5: - // 6: Remote DMA Complete - // 7: Reset + // Reset All (save for RDMA), that's polled + outb( card->IOBase + ISR, 0xFF&(~0x40) ); - return ; + // 0: Packet recieved (no error) + if( byte & 1 ) + { + //if( card->NumWaitingPackets > MAX_PACKET_QUEUE ) + // card->NumWaitingPackets = MAX_PACKET_QUEUE; + if( Semaphore_Signal( &card->Semaphore, 1 ) != 1 ) { + // Oops? } } - Log_Warning("Ne2k", "Recieved Unknown IRQ %i", IntNum); + // 1: Packet sent (no error) + // 2: Recieved with error + // 3: Transmission Halted (Excessive Collisions) + // 4: Recieve Buffer Exhausted + // 5: + // 6: Remote DMA Complete + // 7: Reset }