]> Zhao Yanbai Git Server - minix.git/commitdiff
E1000 - fixed reading/writing device registers
authorTomas Hruby <tom@minix3.org>
Mon, 4 Jul 2011 08:46:51 +0000 (10:46 +0200)
committerTomas Hruby <tom@minix3.org>
Fri, 8 Jul 2011 18:31:21 +0000 (20:31 +0200)
- the pointers must be flagged as volatile because otherwise they
  might be "optimized" by a compiler. It is a common good
  practice to access the registers this way, the keyword is in C
  for a reason.

- for instance, in eeprom_eerd() when polling a register the
  compiler, under certain conditions, may decide upon the first
  read and if it does not break the loop it assumes that the
  value is not going to change and thus stays in an infinite
  loop.

drivers/e1000/e1000.c

index b4c297738ad0bb40abcd8e6049814a2ec27be5ec..a11129d51432caea3594d10159b53580885be706 100644 (file)
@@ -878,7 +878,7 @@ uint32_t reg;
     assert(reg < 0x1ffff);
 
     /* Read from memory mapped register. */
-    value = *(u32_t *)(e->regs + reg);
+    value = *(volatile u32_t *)(e->regs + reg);
 
     /* Return the result. */    
     return value;
@@ -896,7 +896,7 @@ uint32_t value;
     assert(reg < 0x1ffff);
     
     /* Write to memory mapped register. */
-    *(u32_t *)(e->regs + reg) = value;
+    *(volatile u32_t *)(e->regs + reg) = value;
 }
 
 /*===========================================================================*