ixgbe: Power down PHY during driver resets
[safe/jmp/linux-2.6] / drivers / net / smc911x.h
index 271a3e8..3269292 100644 (file)
@@ -29,6 +29,7 @@
 #ifndef _SMC911X_H_
 #define _SMC911X_H_
 
+#include <linux/smc911x.h>
 /*
  * Use the DMA feature on PXA chips
  */
   #define SMC_USE_32BIT                1
   #define SMC_IRQ_SENSE                IRQF_TRIGGER_FALLING
 #elif defined(CONFIG_SH_MAGIC_PANEL_R2)
-  #define SMC_USE_SH_DMA       0
   #define SMC_USE_16BIT                0
   #define SMC_USE_32BIT                1
   #define SMC_IRQ_SENSE                IRQF_TRIGGER_LOW
+#elif defined(CONFIG_ARCH_OMAP3)
+  #define SMC_USE_16BIT                0
+  #define SMC_USE_32BIT                1
+  #define SMC_IRQ_SENSE                IRQF_TRIGGER_LOW
+  #define SMC_MEM_RESERVED     1
+#elif defined(CONFIG_ARCH_OMAP2)
+  #define SMC_USE_16BIT                0
+  #define SMC_USE_32BIT                1
+  #define SMC_IRQ_SENSE                IRQF_TRIGGER_LOW
+  #define SMC_MEM_RESERVED     1
+#else
+/*
+ * Default configuration
+ */
+
+#define SMC_DYNAMIC_BUS_CONFIG
+#endif
+
+#ifdef SMC_USE_PXA_DMA
+#define SMC_USE_DMA
 #endif
 
 /* store this information for the driver.. */
@@ -73,7 +93,6 @@ struct smc911x_local {
 
        /* work queue */
        struct work_struct phy_configure;
-       int work_pending;
 
        int tx_throttle;
        spinlock_t lock;
@@ -92,12 +111,84 @@ struct smc911x_local {
        struct device *dev;
 #endif
        void __iomem *base;
+#ifdef SMC_DYNAMIC_BUS_CONFIG
+       struct smc911x_platdata cfg;
+#endif
 };
 
 /*
  * Define the bus width specific IO macros
  */
 
+#ifdef SMC_DYNAMIC_BUS_CONFIG
+static inline unsigned int SMC_inl(struct smc911x_local *lp, int reg)
+{
+       void __iomem *ioaddr = lp->base + reg;
+
+       if (lp->cfg.flags & SMC911X_USE_32BIT)
+               return readl(ioaddr);
+
+       if (lp->cfg.flags & SMC911X_USE_16BIT)
+               return readw(ioaddr) | (readw(ioaddr + 2) << 16);
+
+       BUG();
+}
+
+static inline void SMC_outl(unsigned int value, struct smc911x_local *lp,
+                           int reg)
+{
+       void __iomem *ioaddr = lp->base + reg;
+
+       if (lp->cfg.flags & SMC911X_USE_32BIT) {
+               writel(value, ioaddr);
+               return;
+       }
+
+       if (lp->cfg.flags & SMC911X_USE_16BIT) {
+               writew(value & 0xffff, ioaddr);
+               writew(value >> 16, ioaddr + 2);
+               return;
+       }
+
+       BUG();
+}
+
+static inline void SMC_insl(struct smc911x_local *lp, int reg,
+                             void *addr, unsigned int count)
+{
+       void __iomem *ioaddr = lp->base + reg;
+
+       if (lp->cfg.flags & SMC911X_USE_32BIT) {
+               readsl(ioaddr, addr, count);
+               return;
+       }
+
+       if (lp->cfg.flags & SMC911X_USE_16BIT) {
+               readsw(ioaddr, addr, count * 2);
+               return;
+       }
+
+       BUG();
+}
+
+static inline void SMC_outsl(struct smc911x_local *lp, int reg,
+                            void *addr, unsigned int count)
+{
+       void __iomem *ioaddr = lp->base + reg;
+
+       if (lp->cfg.flags & SMC911X_USE_32BIT) {
+               writesl(ioaddr, addr, count);
+               return;
+       }
+
+       if (lp->cfg.flags & SMC911X_USE_16BIT) {
+               writesw(ioaddr, addr, count * 2);
+               return;
+       }
+
+       BUG();
+}
+#else
 #if    SMC_USE_16BIT
 #define SMC_inl(lp, r)          ((readw((lp)->base + (r)) & 0xFFFF) + (readw((lp)->base + (r) + 2) << 16))
 #define SMC_outl(v, lp, r)                      \
@@ -115,9 +206,12 @@ struct smc911x_local {
 #define SMC_outsl(lp, r, p, l)  writesl((int*)((lp)->base + (r)), p, l)
 
 #endif /* SMC_USE_16BIT */
+#endif /* SMC_DYNAMIC_BUS_CONFIG */
+
 
 #ifdef SMC_USE_PXA_DMA
-#define SMC_USE_DMA
+
+#include <mach/dma.h>
 
 /*
  * Define the request and free functions
@@ -142,8 +236,6 @@ struct smc911x_local {
  * Use a DMA for RX and TX packets.
  */
 #include <linux/dma-mapping.h>
-#include <asm/dma.h>
-#include <asm/arch/pxa-regs.h>
 
 static dma_addr_t rx_dmabuf, tx_dmabuf;
 static int rx_dmalen, tx_dmalen;
@@ -587,10 +679,14 @@ smc_pxa_dma_outsl(struct smc911x_local *lp, u_long physaddr,
 #define LAN911X_INTERNAL_PHY_ID                (0x0007C000)
 
 /* Chip ID values */
-#define CHIP_9115      0x115
-#define CHIP_9116      0x116
-#define CHIP_9117      0x117
-#define CHIP_9118      0x118
+#define CHIP_9115      0x0115
+#define CHIP_9116      0x0116
+#define CHIP_9117      0x0117
+#define CHIP_9118      0x0118
+#define CHIP_9211      0x9211
+#define CHIP_9215      0x115A
+#define CHIP_9217      0x117A
+#define CHIP_9218      0x118A
 
 struct chip_id {
        u16 id;
@@ -602,6 +698,10 @@ static const struct chip_id chip_ids[] =  {
        { CHIP_9116, "LAN9116" },
        { CHIP_9117, "LAN9117" },
        { CHIP_9118, "LAN9118" },
+       { CHIP_9211, "LAN9211" },
+       { CHIP_9215, "LAN9215" },
+       { CHIP_9217, "LAN9217" },
+       { CHIP_9218, "LAN9218" },
        { 0, NULL },
 };