////////////////////////////////////////////////////////////////
// File - PCI_DUMP.C
//
// A utility for getting a dump of all the PCI configuration
// registers of the PCI cards installed.
// 
////////////////////////////////////////////////////////////////

#include "../../include/windrvr.h"
#include "../shared/pci_diag_lib.h"
#include <stdio.h>

int main (int argc, char *argv[]) 
{
    HANDLE hWD;
    char buf[256];
	WORD wVendorID;
	WORD wDeviceID;
    WD_PCI_CONFIG_DUMP pciCnf;
    int g;
	
    if (!PCI_Get_WD_handle(&hWD)) return 0;

    BZERO(pciCnf);
    pciCnf.fIsRead = TRUE;
    printf ("pci bus scan (using WD_PciConfigDump)\n");

    for (pciCnf.pciSlot.dwBus=0; pciCnf.pciSlot.dwBus<256; 
			pciCnf.pciSlot.dwBus++)
    {
        for (pciCnf.pciSlot.dwSlot=0; pciCnf.pciSlot.dwSlot<32; 
				pciCnf.pciSlot.dwSlot++)
        {
            for (pciCnf.pciSlot.dwFunction=0; pciCnf.pciSlot.dwFunction<8; 
					pciCnf.pciSlot.dwFunction++)
            {
                CHAR tmp[200];
				wVendorID = 0xffff;
    			pciCnf.pBuffer = &wVendorID;
    			pciCnf.dwBytes = sizeof(wVendorID);
    			pciCnf.dwOffset = 0;
                WD_PciConfigDump(hWD,&pciCnf);
                if (wVendorID==0xffff)
				{
					if (pciCnf.pciSlot.dwFunction==0)
						break;	  // skip slot
					else
	                	continue; // skip function
				}
     			pciCnf.pBuffer = &wDeviceID;
    			pciCnf.dwBytes = sizeof(wDeviceID);
    			pciCnf.dwOffset = 2;
                WD_PciConfigDump(hWD,&pciCnf);
      			pciCnf.pBuffer = buf;
    			pciCnf.dwBytes = sizeof(buf);
    			pciCnf.dwOffset = 0;
                WD_PciConfigDump(hWD,&pciCnf);
               	
                printf("Bus %d Slot %d Function %d, VendorID %04x DeviceID %04x\n",
                    pciCnf.pciSlot.dwBus, pciCnf.pciSlot.dwSlot, pciCnf.pciSlot.dwFunction, wVendorID, wDeviceID);
                for (g=0; g<256; g+=4)
                {
                    if ((g/4) %    8 == 0) printf("%2x ",g);
                    printf ("%08x ",*((DWORD *) (buf+g)));
                    if ((g/4) %    8 == 7) printf("\n");
                }

                PCI_Print_card_info(pciCnf.pciSlot);
                printf("Press Enter to continue to next slot\n");
				fgets(tmp, sizeof(tmp), stdin);
            }
        }
    }

    WD_Close(hWD);

    return 0;
}