[ixp4xx] move the latch-led driver into a separated patch
[openwrt.git] / target / linux / ixp4xx / patches-2.6.23 / 200-npe_driver.patch
index 88886c35db2026514f70829854bf5a96701da886..6e9aaa97a37039721ef6f60c45981a22e88677e2 100644 (file)
@@ -1,7 +1,8 @@
-diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/kernel/setup.c ixp4xx-nep.git/arch/arm/kernel/setup.c
---- linux-2.6.23/arch/arm/kernel/setup.c       2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/arch/arm/kernel/setup.c     2007-10-22 19:19:41.000000000 +0200
-@@ -61,6 +61,7 @@
+Index: linux-2.6.23.17/arch/arm/kernel/setup.c
+===================================================================
+--- linux-2.6.23.17.orig/arch/arm/kernel/setup.c
++++ linux-2.6.23.17/arch/arm/kernel/setup.c
+@@ -62,6 +62,7 @@ extern int root_mountflags;
  extern void _stext, _text, _etext, __data_start, _edata, _end;
  
  unsigned int processor_id;
@@ -9,10 +10,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/kernel/setup.c ixp4xx-nep.
  unsigned int __machine_arch_type;
  EXPORT_SYMBOL(__machine_arch_type);
  
-diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig ixp4xx-nep.git/arch/arm/mach-ixp4xx/Kconfig
---- linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig  2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/arch/arm/mach-ixp4xx/Kconfig        2007-10-22 19:19:41.000000000 +0200
-@@ -189,6 +189,20 @@
+Index: linux-2.6.23.17/arch/arm/mach-ixp4xx/Kconfig
+===================================================================
+--- linux-2.6.23.17.orig/arch/arm/mach-ixp4xx/Kconfig
++++ linux-2.6.23.17/arch/arm/mach-ixp4xx/Kconfig
+@@ -246,6 +246,20 @@ config IXP4XX_INDIRECT_PCI
          need to use the indirect method instead. If you don't know
          what you need, leave this option unselected.
  
@@ -33,19 +35,21 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig ixp4xx
  endmenu
  
  endif
-diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/Makefile ixp4xx-nep.git/arch/arm/mach-ixp4xx/Makefile
---- linux-2.6.23/arch/arm/mach-ixp4xx/Makefile 2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/arch/arm/mach-ixp4xx/Makefile       2007-10-22 19:19:41.000000000 +0200
-@@ -30,3 +30,5 @@
- obj-$(CONFIG_MACH_WG302V2)    += wg302v2-setup.o
+Index: linux-2.6.23.17/arch/arm/mach-ixp4xx/Makefile
+===================================================================
+--- linux-2.6.23.17.orig/arch/arm/mach-ixp4xx/Makefile
++++ linux-2.6.23.17/arch/arm/mach-ixp4xx/Makefile
+@@ -44,3 +44,5 @@ obj-$(CONFIG_MACH_SIDEWINDER)        += sidewin
+ obj-$(CONFIG_MACH_AP1000)     += ap1000-setup.o
  
  obj-$(CONFIG_PCI)             += $(obj-pci-$(CONFIG_PCI)) common-pci.o
 +obj-$(CONFIG_IXP4XX_QMGR)     += ixp4xx_qmgr.o
 +obj-$(CONFIG_IXP4XX_NPE)      += ixp4xx_npe.o
-diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixdp425-setup.c ixp4xx-nep.git/arch/arm/mach-ixp4xx/ixdp425-setup.c
---- linux-2.6.23/arch/arm/mach-ixp4xx/ixdp425-setup.c  2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/arch/arm/mach-ixp4xx/ixdp425-setup.c        2007-10-22 19:19:41.000000000 +0200
-@@ -177,6 +177,31 @@
+Index: linux-2.6.23.17/arch/arm/mach-ixp4xx/ixdp425-setup.c
+===================================================================
+--- linux-2.6.23.17.orig/arch/arm/mach-ixp4xx/ixdp425-setup.c
++++ linux-2.6.23.17/arch/arm/mach-ixp4xx/ixdp425-setup.c
+@@ -177,6 +177,31 @@ static struct platform_device ixdp425_ua
        .resource               = ixdp425_uart_resources
  };
  
@@ -75,9 +79,9 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixdp425-setup.
 +};
 +
  static struct platform_device *ixdp425_devices[] __initdata = {
-       &ixdp425_i2c_controller,
+       &ixdp425_i2c_gpio,
        &ixdp425_flash,
-@@ -184,7 +209,9 @@
+@@ -184,7 +209,9 @@ static struct platform_device *ixdp425_d
      defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
        &ixdp425_flash_nand,
  #endif
@@ -88,10 +92,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixdp425-setup.
  };
  
  static void __init ixdp425_init(void)
-diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c ixp4xx-nep.git/arch/arm/mach-ixp4xx/ixp4xx_npe.c
---- linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c     1970-01-01 01:00:00.000000000 +0100
-+++ ixp4xx-nep.git/arch/arm/mach-ixp4xx/ixp4xx_npe.c   2007-10-22 19:19:41.000000000 +0200
-@@ -0,0 +1,737 @@
+Index: linux-2.6.23.17/arch/arm/mach-ixp4xx/ixp4xx_npe.c
+===================================================================
+--- /dev/null
++++ linux-2.6.23.17/arch/arm/mach-ixp4xx/ixp4xx_npe.c
+@@ -0,0 +1,741 @@
 +/*
 + * Intel IXP4xx Network Processor Engine driver for Linux
 + *
@@ -108,13 +113,13 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c i
 + *   Thanks, Christian.
 + */
 +
++#include <linux/delay.h>
 +#include <linux/dma-mapping.h>
 +#include <linux/firmware.h>
++#include <linux/io.h>
 +#include <linux/kernel.h>
 +#include <linux/module.h>
 +#include <linux/slab.h>
-+#include <asm/delay.h>
-+#include <asm/io.h>
 +#include <asm/arch/npe.h>
 +
 +#define DEBUG_MSG                     0
@@ -225,7 +230,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c i
 +
 +static struct {
 +      u32 reg, val;
-+}ecs_reset[] = {
++} ecs_reset[] = {
 +      { ECS_BG_CTXT_REG_0,    0xA0000000 },
 +      { ECS_BG_CTXT_REG_1,    0x01000000 },
 +      { ECS_BG_CTXT_REG_2,    0x00008000 },
@@ -476,12 +481,13 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c i
 +      __raw_writel(0, &npe->regs->action_points[3]);
 +      __raw_writel(0, &npe->regs->watch_count);
 +
-+      val = ixp4xx_read_fuses();
++      val = ixp4xx_read_feature_bits();
 +      /* reset the NPE */
-+      ixp4xx_write_fuses(val & ~(IXP4XX_FUSE_RESET_NPEA << npe->id));
++      ixp4xx_write_feature_bits(val &
++                                ~(IXP4XX_FEATURE_RESET_NPEA << npe->id));
 +      for (i = 0; i < MAX_RETRIES; i++) {
-+              if (!(ixp4xx_read_fuses() &
-+                    (IXP4XX_FUSE_RESET_NPEA << npe->id)))
++              if (!(ixp4xx_read_feature_bits() &
++                    (IXP4XX_FEATURE_RESET_NPEA << npe->id)))
 +                      break;  /* reset completed */
 +              udelay(1);
 +      }
@@ -489,9 +495,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c i
 +              return -ETIMEDOUT;
 +
 +      /* deassert reset */
-+      ixp4xx_write_fuses(val | (IXP4XX_FUSE_RESET_NPEA << npe->id));
++      ixp4xx_write_feature_bits(val |
++                                (IXP4XX_FEATURE_RESET_NPEA << npe->id));
 +      for (i = 0; i < MAX_RETRIES; i++) {
-+              if (ixp4xx_read_fuses() & (IXP4XX_FUSE_RESET_NPEA << npe->id))
++              if (ixp4xx_read_feature_bits() &
++                  (IXP4XX_FEATURE_RESET_NPEA << npe->id))
 +                      break;  /* NPE is back alive */
 +              udelay(1);
 +      }
@@ -783,7 +791,8 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c i
 +
 +      for (i = 0; i < NPE_COUNT; i++) {
 +              struct npe *npe = &npe_tab[i];
-+              if (!(ixp4xx_read_fuses() & (IXP4XX_FUSE_RESET_NPEA << i)))
++              if (!(ixp4xx_read_feature_bits() &
++                    (IXP4XX_FEATURE_RESET_NPEA << i)))
 +                      continue; /* NPE already disabled or not present */
 +              if (!(npe->mem_res = request_mem_region(npe->regs_phys,
 +                                                      REGS_SIZE,
@@ -829,9 +838,10 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c i
 +EXPORT_SYMBOL(npe_send_message);
 +EXPORT_SYMBOL(npe_recv_message);
 +EXPORT_SYMBOL(npe_send_recv_message);
-diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c ixp4xx-nep.git/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c
---- linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c    1970-01-01 01:00:00.000000000 +0100
-+++ ixp4xx-nep.git/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c  2007-10-22 19:19:41.000000000 +0200
+Index: linux-2.6.23.17/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c
+===================================================================
+--- /dev/null
++++ linux-2.6.23.17/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c
 @@ -0,0 +1,274 @@
 +/*
 + * Intel IXP4xx Queue Manager driver for Linux
@@ -1083,7 +1093,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c
 +error_irq:
 +      iounmap(qmgr_regs);
 +error_map:
-+      release_resource(mem_res);
++      release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);
 +      return err;
 +}
 +
@@ -1092,7 +1102,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c
 +      free_irq(IRQ_IXP4XX_QM1, NULL);
 +      synchronize_irq(IRQ_IXP4XX_QM1);
 +      iounmap(qmgr_regs);
-+      release_resource(mem_res);
++      release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);
 +}
 +
 +module_init(qmgr_init);
@@ -1107,10 +1117,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c
 +EXPORT_SYMBOL(qmgr_disable_irq);
 +EXPORT_SYMBOL(qmgr_request_queue);
 +EXPORT_SYMBOL(qmgr_release_queue);
-diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/arm/Kconfig ixp4xx-nep.git/drivers/net/arm/Kconfig
---- linux-2.6.23/drivers/net/arm/Kconfig       2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/drivers/net/arm/Kconfig     2007-10-22 19:20:02.000000000 +0200
-@@ -47,3 +47,13 @@
+Index: linux-2.6.23.17/drivers/net/arm/Kconfig
+===================================================================
+--- linux-2.6.23.17.orig/drivers/net/arm/Kconfig
++++ linux-2.6.23.17/drivers/net/arm/Kconfig
+@@ -47,3 +47,13 @@ config EP93XX_ETH
        help
          This is a driver for the ethernet hardware included in EP93xx CPUs.
          Say Y if you are building a kernel for EP93xx based devices.
@@ -1124,18 +1135,20 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/arm/Kconfig ixp4xx-nep.
 +      help
 +        Say Y here if you want to use built-in Ethernet ports
 +        on IXP4xx processor.
-diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/arm/Makefile ixp4xx-nep.git/drivers/net/arm/Makefile
---- linux-2.6.23/drivers/net/arm/Makefile      2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/drivers/net/arm/Makefile    2007-10-22 19:20:02.000000000 +0200
-@@ -9,3 +9,4 @@
+Index: linux-2.6.23.17/drivers/net/arm/Makefile
+===================================================================
+--- linux-2.6.23.17.orig/drivers/net/arm/Makefile
++++ linux-2.6.23.17/drivers/net/arm/Makefile
+@@ -9,3 +9,4 @@ obj-$(CONFIG_ARM_ETHER3)       += ether3.o
  obj-$(CONFIG_ARM_ETHER1)      += ether1.o
  obj-$(CONFIG_ARM_AT91_ETHER)  += at91_ether.o
  obj-$(CONFIG_EP93XX_ETH)      += ep93xx_eth.o
 +obj-$(CONFIG_IXP4XX_ETH)      += ixp4xx_eth.o
-diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/arm/ixp4xx_eth.c ixp4xx-nep.git/drivers/net/arm/ixp4xx_eth.c
---- linux-2.6.23/drivers/net/arm/ixp4xx_eth.c  1970-01-01 01:00:00.000000000 +0100
-+++ ixp4xx-nep.git/drivers/net/arm/ixp4xx_eth.c        2007-10-22 19:20:02.000000000 +0200
-@@ -0,0 +1,1258 @@
+Index: linux-2.6.23.17/drivers/net/arm/ixp4xx_eth.c
+===================================================================
+--- /dev/null
++++ linux-2.6.23.17/drivers/net/arm/ixp4xx_eth.c
+@@ -0,0 +1,1259 @@
 +/*
 + * Intel IXP4xx Ethernet driver for Linux
 + *
@@ -1165,10 +1178,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/arm/ixp4xx_eth.c ixp4xx
 +#include <linux/delay.h>
 +#include <linux/dma-mapping.h>
 +#include <linux/dmapool.h>
++#include <linux/etherdevice.h>
++#include <linux/io.h>
 +#include <linux/kernel.h>
 +#include <linux/mii.h>
 +#include <linux/platform_device.h>
-+#include <asm/io.h>
 +#include <asm/arch/npe.h>
 +#include <asm/arch/qmgr.h>
 +
@@ -2373,7 +2387,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/arm/ixp4xx_eth.c ixp4xx
 +
 +static int __init eth_init_module(void)
 +{
-+      if (!(ixp4xx_read_fuses() & IXP4XX_FUSE_NPEB_ETH0))
++      if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEB_ETH0))
 +              return -ENOSYS;
 +
 +      /* All MII PHY accesses use NPE-B Ethernet registers */
@@ -2394,10 +2408,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/arm/ixp4xx_eth.c ixp4xx
 +MODULE_LICENSE("GPL v2");
 +module_init(eth_init_module);
 +module_exit(eth_cleanup_module);
-diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/Kconfig ixp4xx-nep.git/drivers/net/wan/Kconfig
---- linux-2.6.23/drivers/net/wan/Kconfig       2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/drivers/net/wan/Kconfig     2007-10-22 19:20:05.000000000 +0200
-@@ -334,6 +334,15 @@
+Index: linux-2.6.23.17/drivers/net/wan/Kconfig
+===================================================================
+--- linux-2.6.23.17.orig/drivers/net/wan/Kconfig
++++ linux-2.6.23.17/drivers/net/wan/Kconfig
+@@ -334,6 +334,15 @@ config DSCC4_PCI_RST
  
          Say Y if your card supports this feature.
  
@@ -2413,10 +2428,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/Kconfig ixp4xx-nep.
  config DLCI
        tristate "Frame Relay DLCI support"
        ---help---
-diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/Makefile ixp4xx-nep.git/drivers/net/wan/Makefile
---- linux-2.6.23/drivers/net/wan/Makefile      2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/drivers/net/wan/Makefile    2007-10-22 19:20:05.000000000 +0200
-@@ -42,6 +42,7 @@
+Index: linux-2.6.23.17/drivers/net/wan/Makefile
+===================================================================
+--- linux-2.6.23.17.orig/drivers/net/wan/Makefile
++++ linux-2.6.23.17/drivers/net/wan/Makefile
+@@ -42,6 +42,7 @@ obj-$(CONFIG_C101)           += c101.o
  obj-$(CONFIG_WANXL)           += wanxl.o
  obj-$(CONFIG_PCI200SYN)               += pci200syn.o
  obj-$(CONFIG_PC300TOO)                += pc300too.o
@@ -2424,10 +2440,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/Makefile ixp4xx-nep
  
  clean-files := wanxlfw.inc
  $(obj)/wanxl.o:       $(obj)/wanxlfw.inc
-diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx-nep.git/drivers/net/wan/ixp4xx_hss.c
---- linux-2.6.23/drivers/net/wan/ixp4xx_hss.c  1970-01-01 01:00:00.000000000 +0100
-+++ ixp4xx-nep.git/drivers/net/wan/ixp4xx_hss.c        2007-10-22 19:20:05.000000000 +0200
-@@ -0,0 +1,1248 @@
+Index: linux-2.6.23.17/drivers/net/wan/ixp4xx_hss.c
+===================================================================
+--- /dev/null
++++ linux-2.6.23.17/drivers/net/wan/ixp4xx_hss.c
+@@ -0,0 +1,1270 @@
 +/*
 + * Intel IXP4xx HSS (synchronous serial port) driver for Linux
 + *
@@ -2440,10 +2457,10 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +
 +#include <linux/dma-mapping.h>
 +#include <linux/dmapool.h>
++#include <linux/io.h>
 +#include <linux/kernel.h>
 +#include <linux/hdlc.h>
 +#include <linux/platform_device.h>
-+#include <asm/io.h>
 +#include <asm/arch/npe.h>
 +#include <asm/arch/qmgr.h>
 +
@@ -2590,10 +2607,24 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +#define CLK46X_SPEED_8192KHZ  ((    8 << 22) | (280 << 12) | 2047)
 +
 +
-+/* hss_config, LUTs: default = unassigned */
-+#define TDMMAP_HDLC           1       /* HDLC - packetised */
-+#define TDMMAP_VOICE56K               2       /* Voice56K - channelised */
-+#define TDMMAP_VOICE64K               3       /* Voice64K - channelised */
++/* hss_config, LUT entries */
++#define TDMMAP_UNASSIGNED     0
++#define TDMMAP_HDLC           1       /* HDLC - packetized */
++#define TDMMAP_VOICE56K               2       /* Voice56K - 7-bit channelized */
++#define TDMMAP_VOICE64K               3       /* Voice64K - 8-bit channelized */
++
++#define TIMESLOTS             128
++#define LUT_BITS              2
++
++/* offsets into HSS config */
++#define HSS_CONFIG_TX_PCR     0x00
++#define HSS_CONFIG_RX_PCR     0x04
++#define HSS_CONFIG_CORE_CR    0x08
++#define HSS_CONFIG_CLOCK_CR   0x0C
++#define HSS_CONFIG_TX_FCR     0x10
++#define HSS_CONFIG_RX_FCR     0x14
++#define HSS_CONFIG_TX_LUT     0x18
++#define HSS_CONFIG_RX_LUT     0x38
 +
 +
 +/* NPE command codes */
@@ -2634,10 +2665,6 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +#define PKT_PIPE_RX_SIZE_WRITE                        0x56
 +#define PKT_PIPE_MODE_WRITE                   0x57
 +
-+
-+#define HSS_TIMESLOTS         128
-+#define HSS_LUT_BITS          2
-+
 +/* HDLC packet status values - desc->status */
 +#define ERR_SHUTDOWN          1 /* stop or shutdown occurrance */
 +#define ERR_HDLC_ALIGN                2 /* HDLC alignment error */
@@ -2666,8 +2693,8 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      buffer_t *rx_buff_tab[RX_DESCS], *tx_buff_tab[TX_DESCS];
 +      struct desc *desc_tab;  /* coherent */
 +      u32 desc_tab_phys;
-+      sync_serial_settings settings;
 +      int id;
++      unsigned int clock_type, clock_rate, loopback;
 +      u8 hdlc_cfg;
 +};
 +
@@ -2721,19 +2748,14 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +                               ((n) + RX_DESCS) * sizeof(struct desc))
 +#define tx_desc_ptr(port, n)  (&(port)->desc_tab[(n) + RX_DESCS])
 +
-+#ifndef __ARMEB__
-+static inline void memcpy_swab32(u32 *dest, u32 *src, int cnt)
-+{
-+      int i;
-+      for (i = 0; i < cnt; i++)
-+              dest[i] = swab32(src[i]);
-+}
-+#endif
++/*****************************************************************************
++ * global variables
++ ****************************************************************************/
 +
 +static int ports_open;
 +static struct dma_pool *dma_pool;
 +
-+static struct {
++static const struct {
 +      int tx, txdone, rx, rxfree;
 +}queue_ids[2] = {{ HSS0_PKT_TX0_QUEUE, HSS0_PKT_TXDONE_QUEUE,
 +                 HSS0_PKT_RX_QUEUE, HSS0_PKT_RXFREE0_QUEUE },
@@ -2741,12 +2763,23 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +                 HSS1_PKT_RX_QUEUE, HSS1_PKT_RXFREE0_QUEUE },
 +};
 +
++/*****************************************************************************
++ * utility functions
++ ****************************************************************************/
 +
 +static inline struct port* dev_to_port(struct net_device *dev)
 +{
 +      return dev_to_hdlc(dev)->priv;
 +}
 +
++#ifndef __ARMEB__
++static inline void memcpy_swab32(u32 *dest, u32 *src, int cnt)
++{
++      int i;
++      for (i = 0; i < cnt; i++)
++              dest[i] = swab32(src[i]);
++}
++#endif
 +
 +static inline void debug_pkt(struct net_device *dev, const char *func,
 +                           u8 *data, int len)
@@ -2852,7 +2885,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +}
 +
 +
-+static void hss_set_carrier(void *pdev, int carrier)
++static void hss_hdlc_set_carrier(void *pdev, int carrier)
 +{
 +      struct net_device *dev = pdev;
 +      if (carrier)
@@ -2861,19 +2894,19 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +              netif_carrier_off(dev);
 +}
 +
-+static void hss_rx_irq(void *pdev)
++static void hss_hdlc_rx_irq(void *pdev)
 +{
 +      struct net_device *dev = pdev;
 +      struct port *port = dev_to_port(dev);
 +
 +#if DEBUG_RX
-+      printk(KERN_DEBUG "%s: hss_rx_irq\n", dev->name);
++      printk(KERN_DEBUG "%s: hss_hdlc_rx_irq\n", dev->name);
 +#endif
 +      qmgr_disable_irq(queue_ids[port->id].rx);
 +      netif_rx_schedule(dev);
 +}
 +
-+static int hss_poll(struct net_device *dev, int *budget)
++static int hss_hdlc_poll(struct net_device *dev, int *budget)
 +{
 +      struct port *port = dev_to_port(dev);
 +      unsigned int rxq = queue_ids[port->id].rx;
@@ -2882,7 +2915,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      int quota = dev->quota, received = 0;
 +
 +#if DEBUG_RX
-+      printk(KERN_DEBUG "%s: hss_poll\n", dev->name);
++      printk(KERN_DEBUG "%s: hss_hdlc_poll\n", dev->name);
 +#endif
 +
 +      while (quota) {
@@ -2899,15 +2932,15 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +                      *budget -= received;
 +                      received = 0;
 +#if DEBUG_RX
-+                      printk(KERN_DEBUG "%s: hss_poll netif_rx_complete\n",
-+                             dev->name);
++                      printk(KERN_DEBUG "%s: hss_hdlc_poll"
++                             " netif_rx_complete\n", dev->name);
 +#endif
 +                      netif_rx_complete(dev);
 +                      qmgr_enable_irq(rxq);
 +                      if (!qmgr_stat_empty(rxq) &&
 +                          netif_rx_reschedule(dev, 0)) {
 +#if DEBUG_RX
-+                              printk(KERN_DEBUG "%s: hss_poll"
++                              printk(KERN_DEBUG "%s: hss_hdlc_poll"
 +                                     " netif_rx_reschedule successed\n",
 +                                     dev->name);
 +#endif
@@ -2915,7 +2948,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +                              continue;
 +                      }
 +#if DEBUG_RX
-+                      printk(KERN_DEBUG "%s: hss_poll all done\n",
++                      printk(KERN_DEBUG "%s: hss_hdlc_poll all done\n",
 +                             dev->name);
 +#endif
 +                      return 0; /* all work done */
@@ -2924,8 +2957,8 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +              desc = rx_desc_ptr(port, n);
 +
 +              if (desc->error_count) /* FIXME - remove printk */
-+                      printk(KERN_DEBUG "%s: hss_poll status 0x%02X errors"
-+                             " %u\n", dev->name, desc->status,
++                      printk(KERN_DEBUG "%s: hss_hdlc_poll status 0x%02X"
++                             " errors %u\n", dev->name, desc->status,
 +                             desc->error_count);
 +
 +              skb = NULL;
@@ -2961,8 +2994,8 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +                      stats->rx_errors++;
 +                      break;
 +              default:        /* FIXME - remove printk */
-+                      printk(KERN_ERR "%s: hss_poll(): status 0x%02X errors"
-+                             " %u\n", dev->name, desc->status,
++                      printk(KERN_ERR "%s: hss_hdlc_poll: status 0x%02X"
++                             " errors %u\n", dev->name, desc->status,
 +                             desc->error_count);
 +                      stats->rx_errors++;
 +              }
@@ -2989,7 +3022,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +#endif
 +              skb_put(skb, desc->pkt_len);
 +
-+              debug_pkt(dev, "hss_poll", skb->data, skb->len);
++              debug_pkt(dev, "hss_hdlc_poll", skb->data, skb->len);
 +
 +              skb->protocol = hdlc_type_trans(skb, dev);
 +              dev->last_rx = jiffies;
@@ -3011,13 +3044,13 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      dev->quota -= received;
 +      *budget -= received;
 +#if DEBUG_RX
-+      printk(KERN_DEBUG "hss_poll(): end, not all work done\n");
++      printk(KERN_DEBUG "hss_hdlc_poll: end, not all work done\n");
 +#endif
 +      return 1;               /* not all work done */
 +}
 +
 +
-+static void hss_txdone_irq(void *pdev)
++static void hss_hdlc_txdone_irq(void *pdev)
 +{
 +      struct net_device *dev = pdev;
 +      struct port *port = dev_to_port(dev);
@@ -3025,7 +3058,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      int n_desc;
 +
 +#if DEBUG_TX
-+      printk(KERN_DEBUG DRV_NAME ": hss_txdone_irq\n");
++      printk(KERN_DEBUG DRV_NAME ": hss_hdlc_txdone_irq\n");
 +#endif
 +      while ((n_desc = queue_get_desc(queue_ids[port->id].txdone,
 +                                      port, 1)) >= 0) {
@@ -3039,7 +3072,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +
 +              dma_unmap_tx(port, desc);
 +#if DEBUG_TX
-+              printk(KERN_DEBUG "%s: hss_txdone_irq free %p\n",
++              printk(KERN_DEBUG "%s: hss_hdlc_txdone_irq free %p\n",
 +                     port->netdev->name, port->tx_buff_tab[n_desc]);
 +#endif
 +              free_buffer_irq(port->tx_buff_tab[n_desc]);
@@ -3050,15 +3083,15 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +                             tx_desc_phys(port, n_desc), desc);
 +              if (start) {
 +#if DEBUG_TX
-+                      printk(KERN_DEBUG "%s: hss_txdone_irq xmit ready\n",
-+                             port->netdev->name);
++                      printk(KERN_DEBUG "%s: hss_hdlc_txdone_irq xmit"
++                             " ready\n", port->netdev->name);
 +#endif
 +                      netif_wake_queue(port->netdev);
 +              }
 +      }
 +}
 +
-+static int hss_xmit(struct sk_buff *skb, struct net_device *dev)
++static int hss_hdlc_xmit(struct sk_buff *skb, struct net_device *dev)
 +{
 +      struct port *port = dev_to_port(dev);
 +      struct net_device_stats *stats = hdlc_stats(dev);
@@ -3069,7 +3102,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      struct desc *desc;
 +
 +#if DEBUG_TX
-+      printk(KERN_DEBUG "%s: hss_xmit\n", dev->name);
++      printk(KERN_DEBUG "%s: hss_hdlc_xmit\n", dev->name);
 +#endif
 +
 +      if (unlikely(skb->len > HDLC_MAX_MRU)) {
@@ -3078,7 +3111,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +              return NETDEV_TX_OK;
 +      }
 +
-+      debug_pkt(dev, "hss_xmit", skb->data, skb->len);
++      debug_pkt(dev, "hss_hdlc_xmit", skb->data, skb->len);
 +
 +      len = skb->len;
 +#ifdef __ARMEB__
@@ -3126,13 +3159,13 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +
 +      if (qmgr_stat_empty(txreadyq)) {
 +#if DEBUG_TX
-+              printk(KERN_DEBUG "%s: hss_xmit queue full\n", dev->name);
++              printk(KERN_DEBUG "%s: hss_hdlc_xmit queue full\n", dev->name);
 +#endif
 +              netif_stop_queue(dev);
 +              /* we could miss TX ready interrupt */
 +              if (!qmgr_stat_empty(txreadyq)) {
 +#if DEBUG_TX
-+                      printk(KERN_DEBUG "%s: hss_xmit ready again\n",
++                      printk(KERN_DEBUG "%s: hss_hdlc_xmit ready again\n",
 +                             dev->name);
 +#endif
 +                      netif_wake_queue(dev);
@@ -3140,13 +3173,13 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      }
 +
 +#if DEBUG_TX
-+      printk(KERN_DEBUG "%s: hss_xmit end\n", dev->name);
++      printk(KERN_DEBUG "%s: hss_hdlc_xmit end\n", dev->name);
 +#endif
 +      return NETDEV_TX_OK;
 +}
 +
 +
-+static int request_queues(struct port *port)
++static int request_hdlc_queues(struct port *port)
 +{
 +      int err;
 +
@@ -3184,7 +3217,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      return err;
 +}
 +
-+static void release_queues(struct port *port)
++static void release_hdlc_queues(struct port *port)
 +{
 +      qmgr_release_queue(queue_ids[port->id].rxfree);
 +      qmgr_release_queue(queue_ids[port->id].rx);
@@ -3193,7 +3226,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      qmgr_release_queue(port->plat->txreadyq);
 +}
 +
-+static int init_queues(struct port *port)
++static int init_hdlc_queues(struct port *port)
 +{
 +      int i;
 +
@@ -3236,7 +3269,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      return 0;
 +}
 +
-+static void destroy_queues(struct port *port)
++static void destroy_hdlc_queues(struct port *port)
 +{
 +      int i;
 +
@@ -3269,7 +3302,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      }
 +}
 +
-+static int hss_open(struct net_device *dev)
++static int hss_hdlc_open(struct net_device *dev)
 +{
 +      struct port *port = dev_to_port(dev);
 +      struct npe *npe = port->npe;
@@ -3287,7 +3320,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +
 +      if (port->plat->open)
 +              if ((err = port->plat->open(port->id, port->netdev,
-+                                          hss_set_carrier)) != 0)
++                                          hss_hdlc_set_carrier)) != 0)
 +                      goto err_hdlc_close;
 +
 +      /* HSS main configuration */
@@ -3301,7 +3334,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +              PCR_MSB_ENDIAN |
 +              PCR_TX_DATA_ENABLE;
 +
-+      if (port->settings.clock_type == CLOCK_INT)
++      if (port->clock_type == CLOCK_INT)
 +              msg.data32 |= PCR_SYNC_CLK_DIR_OUTPUT;
 +
 +      if ((err = npe_send_message(npe, &msg, "HSS_SET_TX_PCR") != 0))
@@ -3313,7 +3346,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +              goto err_plat_close; /* 4: RX PCR */
 +
 +      msg.index = 8;
-+      msg.data32 = (port->settings.loopback ? CCR_LOOPBACK : 0) |
++      msg.data32 = (port->loopback ? CCR_LOOPBACK : 0) |
 +              (port->id ? CCR_SECOND_HSS : 0);
 +      if ((err = npe_send_message(npe, &msg, "HSS_SET_CORE_CR") != 0))
 +              goto err_plat_close; /* 8: Core CR */
@@ -3333,11 +3366,10 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +              goto err_plat_close; /* 20: RX FCR */
 +
 +      msg.data32 = 0;         /* Fill LUT with HDLC timeslots */
-+      for (i = 0; i < 32 / HSS_LUT_BITS; i++)
-+              msg.data32 |= TDMMAP_HDLC << (HSS_LUT_BITS * i);
++      for (i = 0; i < 32 / LUT_BITS; i++)
++              msg.data32 |= TDMMAP_HDLC << (LUT_BITS * i);
 +
-+      for (i = 0; i < 2 /* TX and RX */ * HSS_TIMESLOTS * HSS_LUT_BITS / 8;
-+           i += 4) {
++      for (i = 0; i < 2 /* TX and RX */ * TIMESLOTS * LUT_BITS / 8; i += 4) {
 +              msg.index = 24 + i; /* 24 - 55: TX LUT, 56 - 87: RX LUT */
 +              if ((err = npe_send_message(npe, &msg, "HSS_SET_LUT") != 0))
 +                      goto err_plat_close;
@@ -3405,10 +3437,10 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      if ((err = npe_send_message(npe, &msg, "HSS_SET_PKT_RX_SIZE") != 0))
 +              goto err_plat_close;
 +
-+      if ((err = request_queues(port)) != 0)
++      if ((err = request_hdlc_queues(port)) != 0)
 +              goto err_plat_close;
 +
-+      if ((err = init_queues(port)) != 0)
++      if ((err = init_hdlc_queues(port)) != 0)
 +              goto err_destroy_queues;
 +
 +      memset(&msg, 0, sizeof(msg));
@@ -3429,10 +3461,10 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      netif_start_queue(dev);
 +
 +      qmgr_set_irq(queue_ids[port->id].rx, QUEUE_IRQ_SRC_NOT_EMPTY,
-+                   hss_rx_irq, dev);
++                   hss_hdlc_rx_irq, dev);
 +
 +      qmgr_set_irq(queue_ids[port->id].txdone, QUEUE_IRQ_SRC_NOT_EMPTY,
-+                   hss_txdone_irq, dev);
++                   hss_hdlc_txdone_irq, dev);
 +      qmgr_enable_irq(queue_ids[port->id].txdone);
 +
 +      ports_open++;
@@ -3440,8 +3472,8 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      return 0;
 +
 +err_destroy_queues:
-+      destroy_queues(port);
-+      release_queues(port);
++      destroy_hdlc_queues(port);
++      release_hdlc_queues(port);
 +err_plat_close:
 +      if (port->plat->close)
 +              port->plat->close(port->id, port->netdev);
@@ -3450,7 +3482,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      return err;
 +}
 +
-+static int hss_close(struct net_device *dev)
++static int hss_hdlc_close(struct net_device *dev)
 +{
 +      struct port *port = dev_to_port(dev);
 +      struct npe *npe = port->npe;
@@ -3500,8 +3532,8 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +              printk(KERN_DEBUG "Draining TX queues took %i cycles\n", i);
 +#endif
 +      qmgr_disable_irq(queue_ids[port->id].txdone);
-+      destroy_queues(port);
-+      release_queues(port);
++      destroy_hdlc_queues(port);
++      release_hdlc_queues(port);
 +
 +      if (port->plat->close)
 +              port->plat->close(port->id, port->netdev);
@@ -3510,8 +3542,8 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +}
 +
 +
-+static int hss_attach(struct net_device *dev, unsigned short encoding,
-+                    unsigned short parity)
++static int hss_hdlc_attach(struct net_device *dev, unsigned short encoding,
++                         unsigned short parity)
 +{
 +      struct port *port = dev_to_port(dev);
 +
@@ -3533,7 +3565,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +}
 +
 +
-+static int hss_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
++static int hss_hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 +{
 +      const size_t size = sizeof(sync_serial_settings);
 +      sync_serial_settings new_line;
@@ -3551,7 +3583,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +                      ifr->ifr_settings.size = size; /* data size wanted */
 +                      return -ENOBUFS;
 +              }
-+              if (copy_to_user(line, &port->settings, size))
++              memset(&new_line, 0, sizeof(new_line));
++              new_line.clock_type = port->clock_type;
++              new_line.clock_rate = port->clock_rate;
++              new_line.loopback = port->loopback;
++              if (copy_to_user(line, &new_line, size))
 +                      return -EFAULT;
 +              return 0;
 +
@@ -3575,7 +3611,9 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +              if (new_line.loopback != 0 && new_line.loopback != 1)
 +                      return -EINVAL;
 +
-+              memcpy(&port->settings, &new_line, size); /* Update settings */
++              port->clock_type = clk; /* Update settings */
++              port->clock_rate = new_line.clock_rate;
++              port->loopback = new_line.loopback;
 +              return 0;
 +
 +      default:
@@ -3610,16 +3648,16 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +      SET_MODULE_OWNER(net);
 +      SET_NETDEV_DEV(dev, &pdev->dev);
 +      hdlc = dev_to_hdlc(dev);
-+      hdlc->attach = hss_attach;
-+      hdlc->xmit = hss_xmit;
-+      dev->open = hss_open;
-+      dev->poll = hss_poll;
-+      dev->stop = hss_close;
-+      dev->do_ioctl = hss_ioctl;
++      hdlc->attach = hss_hdlc_attach;
++      hdlc->xmit = hss_hdlc_xmit;
++      dev->open = hss_hdlc_open;
++      dev->poll = hss_hdlc_poll;
++      dev->stop = hss_hdlc_close;
++      dev->do_ioctl = hss_hdlc_ioctl;
 +      dev->weight = 16;
 +      dev->tx_queue_len = 100;
-+      port->settings.clock_type = CLOCK_EXT;
-+      port->settings.clock_rate = 2048000;
++      port->clock_type = CLOCK_EXT;
++      port->clock_rate = 2048000;
 +
 +      if (register_hdlc_device(dev)) {
 +              printk(KERN_ERR "HSS-%i: unable to register HDLC device\n",
@@ -3660,8 +3698,9 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +
 +static int __init hss_init_module(void)
 +{
-+      if ((ixp4xx_read_fuses() & (IXP4XX_FUSE_HDLC | IXP4XX_FUSE_HSS)) !=
-+          (IXP4XX_FUSE_HDLC | IXP4XX_FUSE_HSS))
++      if ((ixp4xx_read_feature_bits() &
++           (IXP4XX_FEATURE_HDLC | IXP4XX_FEATURE_HSS)) !=
++          (IXP4XX_FEATURE_HDLC | IXP4XX_FEATURE_HSS))
 +              return -ENOSYS;
 +      return platform_driver_register(&drv);
 +}
@@ -3676,32 +3715,34 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/drivers/net/wan/ixp4xx_hss.c ixp4xx
 +MODULE_LICENSE("GPL v2");
 +module_init(hss_init_module);
 +module_exit(hss_cleanup_module);
-diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/cpu.h ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/cpu.h
---- linux-2.6.23/include/asm-arm/arch-ixp4xx/cpu.h     2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/cpu.h   2007-10-22 19:20:22.000000000 +0200
-@@ -28,4 +28,19 @@
+Index: linux-2.6.23.17/include/asm-arm/arch-ixp4xx/cpu.h
+===================================================================
+--- linux-2.6.23.17.orig/include/asm-arm/arch-ixp4xx/cpu.h
++++ linux-2.6.23.17/include/asm-arm/arch-ixp4xx/cpu.h
+@@ -28,4 +28,19 @@ extern unsigned int processor_id;
  #define cpu_is_ixp46x()       ((processor_id & IXP4XX_PROCESSOR_ID_MASK) == \
                          IXP465_PROCESSOR_ID_VALUE)
  
-+static inline u32 ixp4xx_read_fuses(void)
++static inline u32 ixp4xx_read_feature_bits(void)
 +{
-+      unsigned int fuses = ~*IXP4XX_EXP_CFG2;
-+      fuses &= ~IXP4XX_FUSE_RESERVED;
++      unsigned int val = ~*IXP4XX_EXP_CFG2;
++      val &= ~IXP4XX_FEATURE_RESERVED;
 +      if (!cpu_is_ixp46x())
-+              fuses &= ~IXP4XX_FUSE_IXP46X_ONLY;
++              val &= ~IXP4XX_FEATURE_IXP46X_ONLY;
 +
-+      return fuses;
++      return val;
 +}
 +
-+static inline void ixp4xx_write_fuses(u32 value)
++static inline void ixp4xx_write_feature_bits(u32 value)
 +{
 +      *IXP4XX_EXP_CFG2 = ~value;
 +}
 +
  #endif  /* _ASM_ARCH_CPU_H */
-diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/hardware.h ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/hardware.h
---- linux-2.6.23/include/asm-arm/arch-ixp4xx/hardware.h        2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/hardware.h      2007-10-22 19:20:22.000000000 +0200
+Index: linux-2.6.23.17/include/asm-arm/arch-ixp4xx/hardware.h
+===================================================================
+--- linux-2.6.23.17.orig/include/asm-arm/arch-ixp4xx/hardware.h
++++ linux-2.6.23.17/include/asm-arm/arch-ixp4xx/hardware.h
 @@ -27,13 +27,13 @@
  
  #define pcibios_assign_all_busses()   1
@@ -3719,56 +3760,67 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/hardwar
  /* Platform helper functions and definitions */
  #include "platform.h"
  
-diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
---- linux-2.6.23/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h     2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h   2007-10-22 19:20:22.000000000 +0200
-@@ -607,4 +607,36 @@
+Index: linux-2.6.23.17/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
+===================================================================
+--- linux-2.6.23.17.orig/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
++++ linux-2.6.23.17/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
+@@ -15,10 +15,6 @@
+  *
+  */
+-#ifndef __ASM_ARCH_HARDWARE_H__
+-#error "Do not include this directly, instead #include <asm/hardware.h>"
+-#endif
+-
+ #ifndef _ASM_ARM_IXP4XX_H_
+ #define _ASM_ARM_IXP4XX_H_
+@@ -607,4 +603,36 @@
  
  #define DCMD_LENGTH   0x01fff         /* length mask (max = 8K - 1) */
  
-+/* Fuse Bits of IXP_EXP_CFG2 */
-+#define IXP4XX_FUSE_RCOMP             (1 << 0)
-+#define IXP4XX_FUSE_USB_DEVICE                (1 << 1)
-+#define IXP4XX_FUSE_HASH              (1 << 2)
-+#define IXP4XX_FUSE_AES                       (1 << 3)
-+#define IXP4XX_FUSE_DES                       (1 << 4)
-+#define IXP4XX_FUSE_HDLC              (1 << 5)
-+#define IXP4XX_FUSE_AAL                       (1 << 6)
-+#define IXP4XX_FUSE_HSS                       (1 << 7)
-+#define IXP4XX_FUSE_UTOPIA            (1 << 8)
-+#define IXP4XX_FUSE_NPEB_ETH0         (1 << 9)
-+#define IXP4XX_FUSE_NPEC_ETH          (1 << 10)
-+#define IXP4XX_FUSE_RESET_NPEA                (1 << 11)
-+#define IXP4XX_FUSE_RESET_NPEB                (1 << 12)
-+#define IXP4XX_FUSE_RESET_NPEC                (1 << 13)
-+#define IXP4XX_FUSE_PCI                       (1 << 14)
-+#define IXP4XX_FUSE_ECC_TIMESYNC      (1 << 15)
-+#define IXP4XX_FUSE_UTOPIA_PHY_LIMIT  (3 << 16)
-+#define IXP4XX_FUSE_USB_HOST          (1 << 18)
-+#define IXP4XX_FUSE_NPEA_ETH          (1 << 19)
-+#define IXP4XX_FUSE_NPEB_ETH_1_TO_3   (1 << 20)
-+#define IXP4XX_FUSE_RSA                       (1 << 21)
-+#define IXP4XX_FUSE_XSCALE_MAX_FREQ   (3 << 22)
-+#define IXP4XX_FUSE_RESERVED          (0xFF << 24)
-+
-+#define IXP4XX_FUSE_IXP46X_ONLY (IXP4XX_FUSE_ECC_TIMESYNC |           \
-+                               IXP4XX_FUSE_USB_HOST |                 \
-+                               IXP4XX_FUSE_NPEA_ETH |                 \
-+                               IXP4XX_FUSE_NPEB_ETH_1_TO_3 |          \
-+                               IXP4XX_FUSE_RSA |                      \
-+                               IXP4XX_FUSE_XSCALE_MAX_FREQ)
++/* "fuse" bits of IXP_EXP_CFG2 */
++#define IXP4XX_FEATURE_RCOMP          (1 << 0)
++#define IXP4XX_FEATURE_USB_DEVICE     (1 << 1)
++#define IXP4XX_FEATURE_HASH           (1 << 2)
++#define IXP4XX_FEATURE_AES            (1 << 3)
++#define IXP4XX_FEATURE_DES            (1 << 4)
++#define IXP4XX_FEATURE_HDLC           (1 << 5)
++#define IXP4XX_FEATURE_AAL            (1 << 6)
++#define IXP4XX_FEATURE_HSS            (1 << 7)
++#define IXP4XX_FEATURE_UTOPIA         (1 << 8)
++#define IXP4XX_FEATURE_NPEB_ETH0      (1 << 9)
++#define IXP4XX_FEATURE_NPEC_ETH               (1 << 10)
++#define IXP4XX_FEATURE_RESET_NPEA     (1 << 11)
++#define IXP4XX_FEATURE_RESET_NPEB     (1 << 12)
++#define IXP4XX_FEATURE_RESET_NPEC     (1 << 13)
++#define IXP4XX_FEATURE_PCI            (1 << 14)
++#define IXP4XX_FEATURE_ECC_TIMESYNC   (1 << 15)
++#define IXP4XX_FEATURE_UTOPIA_PHY_LIMIT       (3 << 16)
++#define IXP4XX_FEATURE_USB_HOST               (1 << 18)
++#define IXP4XX_FEATURE_NPEA_ETH               (1 << 19)
++#define IXP4XX_FEATURE_NPEB_ETH_1_TO_3        (1 << 20)
++#define IXP4XX_FEATURE_RSA            (1 << 21)
++#define IXP4XX_FEATURE_XSCALE_MAX_FREQ        (3 << 22)
++#define IXP4XX_FEATURE_RESERVED               (0xFF << 24)
++
++#define IXP4XX_FEATURE_IXP46X_ONLY (IXP4XX_FEATURE_ECC_TIMESYNC |     \
++                                  IXP4XX_FEATURE_USB_HOST |           \
++                                  IXP4XX_FEATURE_NPEA_ETH |           \
++                                  IXP4XX_FEATURE_NPEB_ETH_1_TO_3 |    \
++                                  IXP4XX_FEATURE_RSA |                \
++                                  IXP4XX_FEATURE_XSCALE_MAX_FREQ)
 +
  #endif
-diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/npe.h ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/npe.h
---- linux-2.6.23/include/asm-arm/arch-ixp4xx/npe.h     1970-01-01 01:00:00.000000000 +0100
-+++ ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/npe.h   2007-10-22 19:20:22.000000000 +0200
-@@ -0,0 +1,41 @@
+Index: linux-2.6.23.17/include/asm-arm/arch-ixp4xx/npe.h
+===================================================================
+--- /dev/null
++++ linux-2.6.23.17/include/asm-arm/arch-ixp4xx/npe.h
+@@ -0,0 +1,39 @@
 +#ifndef __IXP4XX_NPE_H
 +#define __IXP4XX_NPE_H
 +
-+#include <linux/etherdevice.h>
 +#include <linux/kernel.h>
-+#include <asm/io.h>
 +
 +extern const char *npe_names[];
 +
@@ -3804,10 +3856,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/npe.h i
 +void npe_release(struct npe *npe);
 +
 +#endif /* __IXP4XX_NPE_H */
-diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/platform.h ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/platform.h
---- linux-2.6.23/include/asm-arm/arch-ixp4xx/platform.h        2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/platform.h      2007-10-22 19:20:22.000000000 +0200
-@@ -77,8 +77,7 @@
+Index: linux-2.6.23.17/include/asm-arm/arch-ixp4xx/platform.h
+===================================================================
+--- linux-2.6.23.17.orig/include/asm-arm/arch-ixp4xx/platform.h
++++ linux-2.6.23.17/include/asm-arm/arch-ixp4xx/platform.h
+@@ -77,8 +77,7 @@ extern unsigned long ixp4xx_exp_bus_size
  
  /*
   * The IXP4xx chips do not have an I2C unit, so GPIO lines are just
@@ -3817,7 +3870,7 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/platfor
   * I2C driver.
   */
  struct ixp4xx_i2c_pins {
-@@ -86,6 +85,27 @@
+@@ -86,6 +85,27 @@ struct ixp4xx_i2c_pins {
        unsigned long scl_pin;
  };
  
@@ -3845,10 +3898,11 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/platfor
  /*
   * This structure provide a means for the board setup code
   * to give information to th pata_ixp4xx driver. It is
-diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/qmgr.h ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/qmgr.h
---- linux-2.6.23/include/asm-arm/arch-ixp4xx/qmgr.h    1970-01-01 01:00:00.000000000 +0100
-+++ ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/qmgr.h  2007-10-22 19:20:22.000000000 +0200
-@@ -0,0 +1,124 @@
+Index: linux-2.6.23.17/include/asm-arm/arch-ixp4xx/qmgr.h
+===================================================================
+--- /dev/null
++++ linux-2.6.23.17/include/asm-arm/arch-ixp4xx/qmgr.h
+@@ -0,0 +1,126 @@
 +/*
 + * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl>
 + *
@@ -3860,8 +3914,8 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/qmgr.h
 +#ifndef IXP4XX_QMGR_H
 +#define IXP4XX_QMGR_H
 +
++#include <linux/io.h>
 +#include <linux/kernel.h>
-+#include <asm/io.h>
 +
 +#define HALF_QUEUES   32
 +#define QUEUES                64      /* only 32 lower queues currently supported */
@@ -3906,8 +3960,6 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/qmgr.h
 +      u32 sram[2048];         /* 0x2000 - 0x3FFF - config and buffer */
 +};
 +
-+extern struct qmgr_regs __iomem *qmgr_regs;
-+
 +void qmgr_set_irq(unsigned int queue, int src,
 +                void (*handler)(void *pdev), void *pdev);
 +void qmgr_enable_irq(unsigned int queue);
@@ -3922,22 +3974,26 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/qmgr.h
 +
 +static inline void qmgr_put_entry(unsigned int queue, u32 val)
 +{
++      extern struct qmgr_regs __iomem *qmgr_regs;
 +      __raw_writel(val, &qmgr_regs->acc[queue][0]);
 +}
 +
 +static inline u32 qmgr_get_entry(unsigned int queue)
 +{
++      extern struct qmgr_regs __iomem *qmgr_regs;
 +      return __raw_readl(&qmgr_regs->acc[queue][0]);
 +}
 +
 +static inline int qmgr_get_stat1(unsigned int queue)
 +{
++      extern struct qmgr_regs __iomem *qmgr_regs;
 +      return (__raw_readl(&qmgr_regs->stat1[queue >> 3])
 +              >> ((queue & 7) << 2)) & 0xF;
 +}
 +
 +static inline int qmgr_get_stat2(unsigned int queue)
 +{
++      extern struct qmgr_regs __iomem *qmgr_regs;
 +      return (__raw_readl(&qmgr_regs->stat2[queue >> 4])
 +              >> ((queue & 0xF) << 1)) & 0x3;
 +}
@@ -3973,15 +4029,15 @@ diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/qmgr.h
 +}
 +
 +#endif
-diff -Nur -x .git -x .gitignore linux-2.6.23/include/asm-arm/arch-ixp4xx/uncompress.h ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/uncompress.h
---- linux-2.6.23/include/asm-arm/arch-ixp4xx/uncompress.h      2007-10-09 22:31:38.000000000 +0200
-+++ ixp4xx-nep.git/include/asm-arm/arch-ixp4xx/uncompress.h    2007-10-22 19:20:22.000000000 +0200
-@@ -13,7 +13,8 @@
+Index: linux-2.6.23.17/include/asm-arm/arch-ixp4xx/uncompress.h
+===================================================================
+--- linux-2.6.23.17.orig/include/asm-arm/arch-ixp4xx/uncompress.h
++++ linux-2.6.23.17/include/asm-arm/arch-ixp4xx/uncompress.h
+@@ -13,7 +13,7 @@
  #ifndef _ARCH_UNCOMPRESS_H_
  #define _ARCH_UNCOMPRESS_H_
  
 -#include <asm/hardware.h>
-+#define __ASM_ARCH_HARDWARE_H__
 +#include "ixp4xx-regs.h"
  #include <asm/mach-types.h>
  #include <linux/serial_reg.h>