//------------------------------------------------------------------- // satainfo.c // // NOTE: Written and tested using Linux kernel version 2.6.26. // // programmer: ALLAN CRUSE // written on: 10 AUG 2008 // revised on: 20 NOV 2008 //------------------------------------------------------------------- #include // for init_module() #include // for create_proc_read_entry() #include // for pci_get_device() #include // for put_user() #define CLASS_SATA_NEW 0x010601 // for SATA Mass Storage #define CLASS_SATA_OLD 0x01018F // for SATA Mass Storage #define VENDOR_ID 0x8086 // Intel Corporation #define DEVICE_ID 0x27C1 // ICH7 SATA Controller //#define DEVICE_ID 0x2922 // ICH7 SATA Controller char modname[] = "satainfo"; struct pci_dev *devp; int my_info( char *buf, char **start, off_t off, int count, int *eof, void *data ) { int i, len = 0; len += sprintf( buf+len, "\n PCI Configuration Space -- " ); len += sprintf( buf+len, "Intel Serial-ATA " ); len += sprintf( buf+len, "Mass Storage Controller \n" ); for (i = 0; i < 0x100; i += 4 ) { u32 datum; pci_read_config_dword( devp, i, &datum ); if ( (i % 32) == 0 ) len += sprintf( buf+len, "\n 0x%02X: ", i ); len += sprintf( buf+len, "%08X ", datum ); } len += sprintf( buf+len, "\n" ); len += sprintf( buf+len, "\n" ); return len; } static int __init my_init( void ) { printk( "<1>\nInstalling \'%s\' module \n", modname ); if ( !devp ) devp = pci_get_class( CLASS_SATA_NEW, NULL ); if ( !devp ) devp = pci_get_class( CLASS_SATA_OLD, NULL ); if ( !devp ) return -ENODEV; printk( " SATA Controller: vendor=%04X device=%04X \n", devp->vendor, devp->device ); if ( devp->vendor != VENDOR_ID ) return -ENODEV; create_proc_read_entry( modname, 0, NULL, my_info, NULL ); return 0; } static void __exit my_exit(void ) { remove_proc_entry( modname, NULL ); printk( "<1>Removing \'%s\' module\n", modname ); } module_init( my_init ); module_exit( my_exit ); MODULE_LICENSE("GPL");