Kristian Høgsberg 647f70c
diff --git a/src/linux_sysfs.c b/src/linux_sysfs.c
Kristian Høgsberg 62cd196
index 8c3cf67..2ea78c1 100644
Kristian Høgsberg 647f70c
--- a/src/linux_sysfs.c
Kristian Høgsberg 647f70c
+++ b/src/linux_sysfs.c
Kristian Høgsberg 62cd196
@@ -227,6 +227,7 @@ pci_device_linux_sysfs_probe( struct pci_device * dev )
Kristian Høgsberg 62cd196
     pciaddr_t bytes;
Kristian Høgsberg 62cd196
     unsigned i;
Kristian Høgsberg 62cd196
     int err;
Kristian Høgsberg 62cd196
+    struct stat  st;
Kristian Høgsberg 647f70c
 
Kristian Høgsberg 62cd196
 
Kristian Høgsberg 62cd196
     err = pci_device_linux_sysfs_read( dev, config, 0, 256, & bytes );
Kristian Høgsberg 62cd196
@@ -293,11 +294,28 @@ pci_device_linux_sysfs_probe( struct pci_device * dev )
Kristian Høgsberg 62cd196
 	    flags = strtoull( next, & next, 16 );
Kristian Høgsberg 62cd196
 	    if ( low_addr != 0 ) {
Kristian Høgsberg 62cd196
 		priv->rom_base = low_addr;
Kristian Høgsberg 62cd196
-		dev->rom_size = (high_addr - low_addr) + 1;
Kristian Høgsberg 62cd196
 	    }
Kristian Høgsberg 62cd196
 	}
Kristian Høgsberg 62cd196
     }
Kristian Høgsberg 62cd196
 
Kristian Høgsberg 62cd196
+    snprintf( name, 255, "%s/%04x:%02x:%02x.%1u/rom",
Kristian Høgsberg 62cd196
+	      SYS_BUS_PCI,
Kristian Høgsberg 62cd196
+	      dev->domain,
Kristian Høgsberg 62cd196
+	      dev->bus,
Kristian Høgsberg 62cd196
+	      dev->dev,
Kristian Høgsberg 62cd196
+	      dev->func );
Kristian Høgsberg 62cd196
+    
Kristian Høgsberg 62cd196
+    fd = open( name, O_RDWR );
Kristian Høgsberg 62cd196
+    if ( fd == -1 ) {
Kristian Høgsberg 62cd196
+	dev->rom_size = 0x10000;
Kristian Høgsberg 62cd196
+    } else if ( fstat( fd, & st ) == -1 ) {
Kristian Høgsberg 62cd196
+	close( fd );
Kristian Høgsberg 62cd196
+	dev->rom_size = 0x10000;
Kristian Høgsberg 62cd196
+    } else {
Kristian Høgsberg 62cd196
+	close( fd );
Kristian Høgsberg 62cd196
+	dev->rom_size = st.st_size == 0 ? 0x10000 : st.st_size;
Kristian Høgsberg 62cd196
+    }
Kristian Høgsberg 647f70c
+
Kristian Høgsberg 62cd196
     return err;
Kristian Høgsberg 62cd196
 }
Kristian Høgsberg 62cd196
 
Kristian Høgsberg 62cd196
@@ -309,7 +327,6 @@ pci_device_linux_sysfs_read_rom( struct pci_device * dev, void * buffer )
Kristian Høgsberg 62cd196
     int fd;
Kristian Høgsberg 62cd196
     struct stat  st;
Kristian Høgsberg 62cd196
     int err = 0;
Kristian Høgsberg 62cd196
-    size_t rom_size;
Kristian Høgsberg 62cd196
     size_t total_bytes;
Kristian Høgsberg 62cd196
 
Kristian Høgsberg 62cd196
 
Kristian Høgsberg 62cd196
@@ -334,10 +351,6 @@ pci_device_linux_sysfs_read_rom( struct pci_device * dev, void * buffer )
Kristian Høgsberg 62cd196
 	return errno;
Kristian Høgsberg 62cd196
     }
Kristian Høgsberg 62cd196
 
Kristian Høgsberg 62cd196
-    rom_size = st.st_size;
Kristian Høgsberg 62cd196
-    if ( rom_size == 0 )
Kristian Høgsberg 62cd196
-	rom_size = 0x10000;
Kristian Høgsberg 62cd196
-
Kristian Høgsberg 647f70c
     /* This is a quirky thing on Linux.  Even though the ROM and the file
Kristian Høgsberg 647f70c
      * for the ROM in sysfs are read-only, the string "1" must be written to
Kristian Høgsberg 647f70c
      * the file to enable the ROM.  After the data has been read, "0" must be
Kristian Høgsberg 62cd196
@@ -346,9 +359,9 @@ pci_device_linux_sysfs_read_rom( struct pci_device * dev, void * buffer )
Kristian Høgsberg 62cd196
     write( fd, "1", 1 );
Kristian Høgsberg 62cd196
     lseek( fd, 0, SEEK_SET );
Kristian Høgsberg 62cd196
 
Kristian Høgsberg 62cd196
-    for ( total_bytes = 0 ; total_bytes < rom_size ; /* empty */ ) {
Kristian Høgsberg 62cd196
+    for ( total_bytes = 0 ; total_bytes < dev->rom_size ; /* empty */ ) {
Kristian Høgsberg 62cd196
 	const int bytes = read( fd, (char *) buffer + total_bytes,
Kristian Høgsberg 62cd196
-				rom_size - total_bytes );
Kristian Høgsberg 62cd196
+				dev->rom_size - total_bytes );
Kristian Høgsberg 62cd196
 	if ( bytes == -1 ) {
Kristian Høgsberg 62cd196
 	    err = errno;
Kristian Høgsberg 62cd196
 	    break;