[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cdi-devel] [PATCH 1/5] e1000: Fix EERD reading for e1000e



The EERD reading function missed that the offset for the EEPROM address
differs between e1000 and e1000e, too. Instead of adding yet another
parameter to do_read_eerd() that has to be passed by model-specific
wrappers, put the parameter directly in the model struct and take them
from there.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 e1000/device.c | 32 +++++++++++++++-----------------
 e1000/device.h |  6 ++++++
 2 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/e1000/device.c b/e1000/device.c
index 95ca731..26a9233 100644
--- a/e1000/device.c
+++ b/e1000/device.c
@@ -213,40 +213,29 @@ static uint32_t e1000_read_uwire(struct e1000_device *device, uint16_t offset)
     return data;
 }
 
-static uint32_t do_read_eerd(struct e1000_device *device, uint16_t offset,
-                             uint32_t start_flag, uint32_t done_flag)
+static uint32_t e1000_read_eerd(struct e1000_device* device, uint16_t offset)
 {
+    struct e1000_model* m = device->model;
     uint32_t eerd, i;
 
-    reg_outl(device, REG_EEPROM_READ, (offset << 8) | start_flag);
+    reg_outl(device, REG_EEPROM_READ,
+             (offset << m->eerd_addr_sh) | m->eerd_start);
     for(i = 0; i < 100; i++)
     {
         eerd = reg_inl(device, REG_EEPROM_READ);
-        if (eerd & done_flag) {
+        if (eerd & m->eerd_done) {
             break;
         }
         cdi_sleep_ms(1);
     }
 
-    if (eerd & done_flag) {
+    if (eerd & m->eerd_done) {
         return (eerd >> 16) & 0xFFFF;
     } else {
         return (uint32_t) -1;
     }
 }
 
-static uint32_t e1000_read_eerd(struct e1000_device *device, uint16_t offset)
-{
-    return do_read_eerd(device, offset, EERD_E1000_START, EERD_E1000_DONE);
-}
-
-#if 0
-static uint32_t e1000e_read_eerd(struct e1000_device *device, uint16_t offset)
-{
-    return do_read_eerd(device, offset, EERD_E1000E_START, EERD_E1000E_DONE);
-}
-#endif
-
 static uint32_t e1000e_read_flash(struct e1000_device *device, uint16_t offset)
 {
     uint16_t hsfsts;
@@ -436,16 +425,25 @@ static struct e1000_model models[] = {
         .device_id      = 0x1004,
         .tctl_flags     = TCTL_COLL_DIST_E1000,
         .eeprom_read    = e1000_read_eerd,
+        .eerd_start     = EERD_E1000_START,
+        .eerd_done      = EERD_E1000_DONE,
+        .eerd_addr_sh   = EERD_E1000_ADDR_SHIFT,
     }, {
         .vendor_id      = 0x8086,
         .device_id      = 0x100e,
         .tctl_flags     = TCTL_COLL_DIST_E1000,
         .eeprom_read    = e1000_read_eerd,
+        .eerd_start     = EERD_E1000_START,
+        .eerd_done      = EERD_E1000_DONE,
+        .eerd_addr_sh   = EERD_E1000_ADDR_SHIFT,
     }, {
         .vendor_id      = 0x8086,
         .device_id      = 0x100f,
         .tctl_flags     = TCTL_COLL_DIST_E1000,
         .eeprom_read    = e1000_read_eerd,
+        .eerd_start     = EERD_E1000_START,
+        .eerd_done      = EERD_E1000_DONE,
+        .eerd_addr_sh   = EERD_E1000_ADDR_SHIFT,
     }, {
         .vendor_id      = 0x8086,
         .device_id      = 0x10f5,
diff --git a/e1000/device.h b/e1000/device.h
index 85bca25..657192d 100644
--- a/e1000/device.h
+++ b/e1000/device.h
@@ -142,9 +142,11 @@ enum {
 
 #define EERD_E1000_START    (1 <<  0)
 #define EERD_E1000_DONE     (1 <<  4)
+#define EERD_E1000_ADDR_SHIFT 8
 
 #define EERD_E1000E_START   (1 <<  0)
 #define EERD_E1000E_DONE    (1 <<  1)
+#define EERD_E1000E_ADDR_SHIFT 2
 
 /* EEPROM/Flash Control */
 #define E1000_EECD_SK        0x00000001 /* EEPROM Clock */
@@ -207,6 +209,10 @@ struct e1000_model {
     uint16_t device_id;
 
     uint32_t tctl_flags;
+
+    uint32_t eerd_start;
+    uint32_t eerd_done;
+    uint32_t eerd_addr_sh;
     uint32_t (*eeprom_read)(struct e1000_device *device, uint16_t offset);
 };
 
-- 
2.1.4