X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FNetwork%2FNE2000%2Fne2000.c;h=cf3edee531bc4b0fe28c2e2172f374b1e0109d18;hb=635bc78017d8a4a16314a973e39c849b2afac795;hp=d5eadb778b7913478011268b5f23735aad5b56e4;hpb=4fc7efa62f7a33e0c8a499f5a175419c2d16c273;p=tpg%2Facess2.git diff --git a/Modules/Network/NE2000/ne2000.c b/Modules/Network/NE2000/ne2000.c index d5eadb77..cf3edee5 100644 --- a/Modules/Network/NE2000/ne2000.c +++ b/Modules/Network/NE2000/ne2000.c @@ -10,6 +10,7 @@ #include #include #include +#include // === CONSTANTS === #define MEM_START 0x40 @@ -70,7 +71,8 @@ typedef struct sNe2k_Card { Uint16 IOBase; //!< IO Port Address from PCI Uint8 IRQ; //!< IRQ Assigned from PCI - int NumWaitingPackets; + tSemaphore Semaphore; +// int NumWaitingPackets; int NextRXPage; int NextMemPage; //!< Next Card Memory page to use @@ -215,6 +217,10 @@ int Ne2k_Install(char **Options) gpNe2k_Cards[ k ].Node.Write = Ne2k_Write; gpNe2k_Cards[ k ].Node.Read = Ne2k_Read; gpNe2k_Cards[ k ].Node.IOCtl = Ne2k_IOCtl; + + // Initialise packet semaphore + // - Start at zero, no max + Semaphore_Init( &gpNe2k_Cards[k].Semaphore, 0, 0, "NE2000", gpNe2k_Cards[ k ].Name ); } } @@ -252,7 +258,6 @@ static const char *casIOCtls[] = { DRV_IOCTLNAMES, DRV_NETWORK_IOCTLNAMES, NULL */ int Ne2k_IOCtl(tVFS_Node *Node, int ID, void *Data) { - int tmp; ENTER("pNode iID pData", Node, ID, Data); switch( ID ) { @@ -366,8 +371,8 @@ Uint64 Ne2k_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer); - // TODO: Use MutexP/MutexV instead - while(Card->NumWaitingPackets == 0) Threads_Yield(); + // Wait for packets + Semaphore_Wait( &Card->Semaphore, 1 ); // Make sure that the card is in page 0 outb(Card->IOBase + CMD, 0|0x22); // Page 0, Start, NoDMA @@ -443,7 +448,6 @@ Uint64 Ne2k_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) outb( Card->IOBase + BNRY, page-1 ); // Set next RX Page and decrement the waiting list Card->NextRXPage = page; - Card->NumWaitingPackets --; LEAVE('i', Length); return Length; @@ -480,9 +484,9 @@ void Ne2k_IRQHandler(int IntNum) // 0: Packet recieved (no error) if( byte & 1 ) { - gpNe2k_Cards[i].NumWaitingPackets ++; - if( gpNe2k_Cards[i].NumWaitingPackets > MAX_PACKET_QUEUE ) - gpNe2k_Cards[i].NumWaitingPackets = MAX_PACKET_QUEUE; + //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