Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=89e536a190f90d038bae7905a0c582cb7089b739
Commit:     89e536a190f90d038bae7905a0c582cb7089b739
Parent:     6daf65310374d24d888201b7a6eba90b44008b7b
Author:     Magnus Damm <[EMAIL PROTECTED]>
AuthorDate: Fri Sep 28 22:42:16 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Oct 10 16:53:56 2007 -0700

    ax88796: add 93cx6 eeprom support
    
    Hook up the 93cx6 eeprom code to the ax88796 driver and modify the ax88796
    driver to read out the mac address from the eeprom.  We need this for the
    ax88796 on certain SuperH boards.  The pin configuration used to connect
    the eeprom to the ax88796 on these boards is the same as pointed out by the
    ax88796 datasheet, so we can probably reuse this code for multiple
    platforms in the future.
    
    Signed-off-by: Magnus Damm <[EMAIL PROTECTED]>
    Cc: Ben Dooks <[EMAIL PROTECTED]>
    Cc: Paul Mundt <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
---
 drivers/net/Kconfig          |    7 ++++++
 drivers/net/ax88796.c        |   49 ++++++++++++++++++++++++++++++++++++++++++
 include/linux/eeprom_93cx6.h |    3 +-
 include/net/ax88796.h        |    1 +
 4 files changed, 59 insertions(+), 1 deletions(-)

diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 9ff1cf4..45f6cf5 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -240,6 +240,13 @@ config AX88796
          AX88796 driver, using platform bus to provide
          chip detection and resources
 
+config AX88796_93CX6
+       bool "ASIX AX88796 external 93CX6 eeprom support"
+       depends on AX88796
+       select EEPROM_93CX6
+       help
+         Select this if your platform comes with an external 93CX6 eeprom.
+
 config MACE
        tristate "MACE (Power Mac ethernet) support"
        depends on PPC_PMAC && PPC32
diff --git a/drivers/net/ax88796.c b/drivers/net/ax88796.c
index 90e0734..9fe0517 100644
--- a/drivers/net/ax88796.c
+++ b/drivers/net/ax88796.c
@@ -24,6 +24,7 @@
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 #include <linux/mii.h>
+#include <linux/eeprom_93cx6.h>
 
 #include <net/ax88796.h>
 
@@ -582,6 +583,37 @@ static const struct ethtool_ops ax_ethtool_ops = {
        .get_link               = ax_get_link,
 };
 
+#ifdef CONFIG_AX88796_93CX6
+static void ax_eeprom_register_read(struct eeprom_93cx6 *eeprom)
+{
+       struct ei_device *ei_local = eeprom->data;
+       u8 reg = ei_inb(ei_local->mem + AX_MEMR);
+
+       eeprom->reg_data_in = reg & AX_MEMR_EEI;
+       eeprom->reg_data_out = reg & AX_MEMR_EEO; /* Input pin */
+       eeprom->reg_data_clock = reg & AX_MEMR_EECLK;
+       eeprom->reg_chip_select = reg & AX_MEMR_EECS;
+}
+
+static void ax_eeprom_register_write(struct eeprom_93cx6 *eeprom)
+{
+       struct ei_device *ei_local = eeprom->data;
+       u8 reg = ei_inb(ei_local->mem + AX_MEMR);
+
+       reg &= ~(AX_MEMR_EEI | AX_MEMR_EECLK | AX_MEMR_EECS);
+
+       if (eeprom->reg_data_in)
+               reg |= AX_MEMR_EEI;
+       if (eeprom->reg_data_clock)
+               reg |= AX_MEMR_EECLK;
+       if (eeprom->reg_chip_select)
+               reg |= AX_MEMR_EECS;
+
+       ei_outb(reg, ei_local->mem + AX_MEMR);
+       udelay(10);
+}
+#endif
+
 /* setup code */
 
 static void ax_initial_setup(struct net_device *dev, struct ei_device 
*ei_local)
@@ -640,6 +672,23 @@ static int ax_init_dev(struct net_device *dev, int 
first_init)
                memcpy(dev->dev_addr,  SA_prom, 6);
        }
 
+#ifdef CONFIG_AX88796_93CX6
+       if (first_init && ax->plat->flags & AXFLG_HAS_93CX6) {
+               unsigned char mac_addr[6];
+               struct eeprom_93cx6 eeprom;
+
+               eeprom.data = ei_local;
+               eeprom.register_read = ax_eeprom_register_read;
+               eeprom.register_write = ax_eeprom_register_write;
+               eeprom.width = PCI_EEPROM_WIDTH_93C56;
+
+               eeprom_93cx6_multiread(&eeprom, 0,
+                                      (__le16 __force *)mac_addr,
+                                      sizeof(mac_addr) >> 1);
+
+               memcpy(dev->dev_addr,  mac_addr, 6);
+       }
+#endif
        if (ax->plat->wordlength == 2) {
                /* We must set the 8390 for word mode. */
                ei_outb(ax->plat->dcr_val, ei_local->mem + EN0_DCFG);
diff --git a/include/linux/eeprom_93cx6.h b/include/linux/eeprom_93cx6.h
index d774b77..a55c873 100644
--- a/include/linux/eeprom_93cx6.h
+++ b/include/linux/eeprom_93cx6.h
@@ -21,13 +21,14 @@
 /*
        Module: eeprom_93cx6
        Abstract: EEPROM reader datastructures for 93cx6 chipsets.
-       Supported chipsets: 93c46 & 93c66.
+       Supported chipsets: 93c46, 93c56 and 93c66.
  */
 
 /*
  * EEPROM operation defines.
  */
 #define PCI_EEPROM_WIDTH_93C46 6
+#define PCI_EEPROM_WIDTH_93C56 8
 #define PCI_EEPROM_WIDTH_93C66 8
 #define PCI_EEPROM_WIDTH_OPCODE        3
 #define PCI_EEPROM_WRITE_OPCODE        0x05
diff --git a/include/net/ax88796.h b/include/net/ax88796.h
index ee786a0..51329da 100644
--- a/include/net/ax88796.h
+++ b/include/net/ax88796.h
@@ -14,6 +14,7 @@
 
 #define AXFLG_HAS_EEPROM               (1<<0)
 #define AXFLG_MAC_FROMDEV              (1<<1)  /* device already has MAC */
+#define AXFLG_HAS_93CX6                        (1<<2)  /* use eeprom_93cx6 
driver */
 
 struct ax_plat_data {
        unsigned int     flags;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to