Kernel - Fixed VPCI bugs
authorJohn Hodge <[email protected]>
Thu, 20 Dec 2012 01:59:57 +0000 (09:59 +0800)
committerJohn Hodge <[email protected]>
Thu, 20 Dec 2012 01:59:57 +0000 (09:59 +0800)
KernelLand/Kernel/drv/pci.c
KernelLand/Kernel/drv/vpci.c

index 2e1ce15..1df421e 100644 (file)
@@ -150,9 +150,15 @@ int PCI_Install(char **Arguments)
                devinfo->revision = gaVPCI_Devices[i].Class & 0xFF;\r
                devinfo->class = gaVPCI_Devices[i].Class >> 8;\r
                snprintf(devinfo->Name, sizeof(devinfo->Name), "%02x.%02x:%x", 0xFF, i, 0);\r
+               \r
+               #if LIST_DEVICES\r
+               Log_Log("PCI", "Device %i,%i:%i %06x => 0x%04x:0x%04x Rev %i",\r
+                       0xFF, i, 0, devinfo->class,\r
+                       devinfo->vendor, devinfo->device, devinfo->revision);\r
+               #endif\r
 \r
                for(int j = 0; j < 256/4; j ++ )\r
-                       devinfo->ConfigCache[i] = VPCI_Read(&gaVPCI_Devices[i], j*4, 4);\r
+                       devinfo->ConfigCache[j] = VPCI_Read(&gaVPCI_Devices[i], j*4, 4);\r
 \r
                memset(&devinfo->Node, 0, sizeof(devinfo->Node));\r
                devinfo->Node.Inode = giPCI_DeviceCount;\r
index 4fccdb8..e4288b6 100644 (file)
@@ -22,12 +22,14 @@ Uint32 VPCI_Read(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size)
        case 0: // Vendor[0:15], Device[16:31]
                tmp_dword = (Dev->Vendor) | (Dev->Device << 16);
                break;
+       // 1: Command[0:15], Status[16:31]
        case 2: // Class Code
                tmp_dword = Dev->Class;
                break;
-       // 1: Command[0:15], Status[16:31]
        // 3: Cache Line Size, Latency Timer, Header Type, BIST
-       // 4-9: BARs
+       case 4 ... 9:   // 4-9: BARs
+               tmp_dword = Dev->BARs[ (Offset>>2) - 4 ];
+               break;
        // 10: Unused (Cardbus CIS Pointer)
        // 11: Subsystem Vendor ID, Subsystem ID
        // 12: Expansion ROM Address
@@ -35,7 +37,8 @@ Uint32 VPCI_Read(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size)
        // 14: Reserved
        // 15: Interrupt Line, Interrupt Pin, Min Grant, Max Latency
        default:
-               tmp_dword = Dev->Read(Dev->Ptr, Offset >> 2);
+               if( Dev->Read )
+                       tmp_dword = Dev->Read(Dev->Ptr, Offset >> 2);
                break;
        }
 
@@ -66,7 +69,10 @@ void VPCI_Write(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size, Uint32 Data)
                return ;
        }
 
-       tmp_dword = Dev->Read(Dev->Ptr, Offset>>2);
+       if( Size != 4 && Dev->Read )
+               tmp_dword = Dev->Read(Dev->Ptr, Offset>>2);
+       else
+               tmp_dword = 0;
        switch(Size)
        {
        case 4: tmp_dword = 0;  break;
@@ -80,5 +86,6 @@ void VPCI_Write(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size, Uint32 Data)
                break;
        }
        tmp_dword |= Data << ((Offset&3)*8);
-       Dev->Write(Dev->Ptr, Offset>>2, tmp_dword);
+       if( Dev->Write )
+               Dev->Write(Dev->Ptr, Offset>>2, tmp_dword);
 }

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