Kernel - Reworked PCI API to be cleaner
[tpg/acess2.git] / Modules / Network / NE2000 / ne2000.c
index 387e539..cb760d6 100644 (file)
@@ -3,7 +3,7 @@
  * 
  * See: ~/Sources/bochs/bochs.../iodev/ne2k.cc
  */
-#define        DEBUG   0
+#define        DEBUG   1
 #define VERSION        ((0<<8)|50)
 #include <acess.h>
 #include <modules.h>
@@ -75,9 +75,7 @@ typedef struct sNe2k_Card {
         int    NextRXPage;     //!< Next expected RX page
        
         int    NextMemPage;    //!< Next Card Memory page to use
-       
-       //Uint8 Buffer[RX_BUF_SIZE*256];
-       
+               
        char    Name[2];        // "0"
        tVFS_Node       Node;   //!< VFS Node
        Uint8   MacAddr[6];     //!< Cached MAC address
@@ -120,14 +118,15 @@ 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 ) {
@@ -141,12 +140,12 @@ 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;
@@ -169,13 +168,13 @@ int Ne2k_Install(char **Options)
                        outb( base + ISR, 0xFF );
                        outb( base + RCR, 0x20 );       // Reciever to Monitor
                        outb( base + TCR, 0x02 );       // Transmitter OFF (TCR.LB = 1, Internal Loopback)
+                       
+                       // Read MAC Address
                        outb( base + RBCR0, 6*4 );      // Remote Byte Count
                        outb( base + RBCR1, 0 );
                        outb( base + RSAR0, 0 );        // Clear Source Address
                        outb( base + RSAR1, 0 );
                        outb( base + CMD, 0x0A );       // Remote Read, Start
-                       
-                       // Read MAC Address
                        gpNe2k_Cards[ k ].MacAddr[0] = inb(base+0x10);//        inb(base+0x10);
                        gpNe2k_Cards[ k ].MacAddr[1] = inb(base+0x10);//        inb(base+0x10);
                        gpNe2k_Cards[ k ].MacAddr[2] = inb(base+0x10);//        inb(base+0x10);
@@ -192,15 +191,6 @@ int Ne2k_Install(char **Options)
                        outb( base+RCR, 0x0F ); // Set WRAP and allow all packet matches
                        outb( base+TCR, 0x00 ); // Set Normal Transmitter mode
                        outb( base+TPSR, 0x40); // Set Transmit Start
-                       // Set MAC Address
-                       /*
-                       Ne2k_WriteReg(base, MAC0, gpNe2k_Cards[ k ].MacAddr[0]);
-                       Ne2k_WriteReg(base, MAC1, gpNe2k_Cards[ k ].MacAddr[1]);
-                       Ne2k_WriteReg(base, MAC2, gpNe2k_Cards[ k ].MacAddr[2]);
-                       Ne2k_WriteReg(base, MAC3, gpNe2k_Cards[ k ].MacAddr[3]);
-                       Ne2k_WriteReg(base, MAC4, gpNe2k_Cards[ k ].MacAddr[4]);
-                       Ne2k_WriteReg(base, MAC5, gpNe2k_Cards[ k ].MacAddr[5]);
-                       */
                        
                        Log_Log("Ne2k", "Card %i 0x%04x IRQ%i %02x:%02x:%02x:%02x:%02x:%02x",
                                k, base, gpNe2k_Cards[ k ].IRQ,
@@ -300,6 +290,8 @@ Uint64 Ne2k_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        
        ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
        
+       // TODO: Lock
+       
        // Sanity Check Length
        if(Length > TX_BUF_SIZE*256) {
                Log_Warning(
@@ -371,7 +363,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));
@@ -403,10 +399,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);
@@ -534,7 +527,9 @@ void Ne2k_IRQHandler(int IntNum)
                        {
                                //if( gpNe2k_Cards[i].NumWaitingPackets > MAX_PACKET_QUEUE )
                                //      gpNe2k_Cards[i].NumWaitingPackets = MAX_PACKET_QUEUE;
-                               Semaphore_Signal( &gpNe2k_Cards[i].Semaphore, 1 );
+                               if( Semaphore_Signal( &gpNe2k_Cards[i].Semaphore, 1 ) != 1 ) {
+                                       // Oops?
+                               }
                        }
                        // 1: Packet sent (no error)
                        // 2: Recieved with error

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