* upgrade ixp4xx to 2.6.23.12 * upgrade to the new ethernet driver (temporary breaks Marvell switch support on Compex units) * handle NPE microcodes in a user friendly way - YAY for Intel for changing the license * add support for the Lanready AP1000 (used in for example the Ligowave LGO2AGN)
SVN-Revision: 10016
This commit is contained in:
		
							
								
								
									
										57
									
								
								package/ixp4xx-microcode/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								package/ixp4xx-microcode/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | #  | ||||||
|  | # Copyright (C) 2007 OpenWrt.org | ||||||
|  | # | ||||||
|  | # This is free software, licensed under the GNU General Public License v2. | ||||||
|  | # See /LICENSE for more information. | ||||||
|  | # | ||||||
|  |  | ||||||
|  | include $(TOPDIR)/rules.mk | ||||||
|  |  | ||||||
|  | PKG_NAME:=ixp4xx-microcode | ||||||
|  | PKG_VERSION:=2.4 | ||||||
|  | PKG_RELEASE:=1 | ||||||
|  |  | ||||||
|  | PKG_SOURCE:=IPL_ixp400NpeLibrary-2_4.zip | ||||||
|  | PKG_SOURCE_URL:=http://downloadmirror.intel.com/12954/eng/ | ||||||
|  | PKG_MD5SUM:=9a6dc3846041b899edf9eff8a906fb11 | ||||||
|  |  | ||||||
|  | PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) | ||||||
|  |  | ||||||
|  | include $(INCLUDE_DIR)/package.mk | ||||||
|  |  | ||||||
|  | define Package/ixp4xx-microcode | ||||||
|  |   SECTION:=net | ||||||
|  |   CATEGORY:=Network | ||||||
|  |   TITLE:=Microcode for the IXP4xx network engines | ||||||
|  |   DEPENDS:=@TARGET_ixp4xx | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Package/ixp4xx-microcode/description | ||||||
|  |  This package contains the microcode needed to use the network engines in IXP4xx CPUs | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Build/Prepare | ||||||
|  | 	rm -rf $(PKG_BUILD_DIR) | ||||||
|  | 	mkdir -p $(PKG_BUILD_DIR) | ||||||
|  | 	unzip -d $(PKG_BUILD_DIR)/ $(DL_DIR)/$(PKG_SOURCE) | ||||||
|  | 	mv $(PKG_BUILD_DIR)/ixp400_xscale_sw/src/npeDl/IxNpeMicrocode.c $(PKG_BUILD_DIR)/ | ||||||
|  | 	rm -rf $(PKG_BUILD_DIR)/ixp400_xscale_sw | ||||||
|  | 	$(CP) ./src/* $(PKG_BUILD_DIR)/ | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Build/Compile | ||||||
|  | 	(cd $(PKG_BUILD_DIR); \ | ||||||
|  | 		$(HOSTCC) -Wall IxNpeMicrocode.c -o IxNpeMicrocode; \ | ||||||
|  | 		./IxNpeMicrocode -be \ | ||||||
|  | 	) | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Package/ixp4xx-microcode/install | ||||||
|  | 	$(INSTALL_DIR) $(1)/lib/firmware | ||||||
|  | 	$(INSTALL_DIR) $(1)/usr/share/doc | ||||||
|  | 	$(INSTALL_BIN) $(PKG_BUILD_DIR)/NPE-B $(1)/lib/firmware/ | ||||||
|  | 	$(INSTALL_BIN) $(PKG_BUILD_DIR)/NPE-C $(1)/lib/firmware/ | ||||||
|  | 	$(INSTALL_DATA) $(PKG_BUILD_DIR)/LICENSE.IPL $(1)/usr/share/doc/ | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | $(eval $(call BuildPackage,ixp4xx-microcode)) | ||||||
							
								
								
									
										27
									
								
								package/ixp4xx-microcode/src/LICENSE.IPL
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								package/ixp4xx-microcode/src/LICENSE.IPL
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | INTEL(R) SOFTWARE LICENSE AGREEMENT | ||||||
|  |   | ||||||
|  | Copyright (c) 2007, Intel Corporation. | ||||||
|  | All rights reserved. | ||||||
|  |  | ||||||
|  | Redistribution. Redistribution and use in binary form, without modification, are permitted | ||||||
|  | provided that the following conditions are met: | ||||||
|  | o Redistributions must reproduce the above copyright notice and the following disclaimer in the | ||||||
|  | documentation and/or other materials provided with the distribution.  | ||||||
|  | o Neither the name of Intel Corporation nor the names of its suppliers may be used to endorse | ||||||
|  | or promote products derived from this software without specific prior written permission.  | ||||||
|  | o No reverse engineering, decompilation, or disassembly of this software is permitted. | ||||||
|  |  | ||||||
|  | Limited patent license. Intel Corporation grants a world-wide, royalty-free, non-exclusive | ||||||
|  | license under patents it now or hereafter owns or controls to make, have made, use, import, | ||||||
|  | offer to sell and sell (.Utilize.) this software, but solely to the extent that any such patent is | ||||||
|  | necessary to Utilize the software alone. The patent license shall not apply to any combinations | ||||||
|  | which include this software. No hardware per se is licensed hereunder. | ||||||
|  | DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||||
|  | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||||
|  | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||||||
|  | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE | ||||||
|  | GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||||
|  | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||||||
|  | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY | ||||||
|  | OF SUCH DAMAGE. | ||||||
| @@ -22,7 +22,7 @@ | |||||||
| # NOTE: for now it's for only IXP4xx in big endian mode | # NOTE: for now it's for only IXP4xx in big endian mode | ||||||
|  |  | ||||||
| # list of supported boards, in "boardname machtypeid" format | # list of supported boards, in "boardname machtypeid" format | ||||||
| for board in "avila 526" "gateway7001 731" "nslu2 597" "nas100d 865" "wg302v2 890" "pronghornmetro 1040" "compex 1273" "wrt300nv2 1077" "loft 849" "dsmg600 964" "fsg3 1091" | for board in "avila 526" "gateway7001 731" "nslu2 597" "nas100d 865" "wg302v2 890" "pronghornmetro 1040" "compex 1273" "wrt300nv2 1077" "loft 849" "dsmg600 964" "fsg3 1091" "ap1000 1543" | ||||||
| do | do | ||||||
|   set -- $board |   set -- $board | ||||||
|   hexid=$(printf %x\\n $2) |   hexid=$(printf %x\\n $2) | ||||||
|   | |||||||
| @@ -12,8 +12,10 @@ BOARDNAME:=Intel XScale IXP4xx | |||||||
| FEATURES:=squashfs | FEATURES:=squashfs | ||||||
| SUBTARGETS=generic harddisk | SUBTARGETS=generic harddisk | ||||||
|  |  | ||||||
| LINUX_VERSION:=2.6.21.7 | LINUX_VERSION:=2.6.23.12 | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/target.mk | include $(INCLUDE_DIR)/target.mk | ||||||
|  |  | ||||||
|  | DEFAULT_PACKAGES += ixp4xx-microcode | ||||||
|  |  | ||||||
| $(eval $(call BuildTarget)) | $(eval $(call BuildTarget)) | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ CONFIG_ARCH_IXP4XX=y | |||||||
| # CONFIG_ARCH_KS8695 is not set | # CONFIG_ARCH_KS8695 is not set | ||||||
| # CONFIG_ARCH_L7200 is not set | # CONFIG_ARCH_L7200 is not set | ||||||
| # CONFIG_ARCH_LH7A40X is not set | # CONFIG_ARCH_LH7A40X is not set | ||||||
|  | # CONFIG_ARCH_MXC is not set | ||||||
| # CONFIG_ARCH_NETX is not set | # CONFIG_ARCH_NETX is not set | ||||||
| # CONFIG_ARCH_NS9XXX is not set | # CONFIG_ARCH_NS9XXX is not set | ||||||
| # CONFIG_ARCH_OMAP is not set | # CONFIG_ARCH_OMAP is not set | ||||||
| @@ -182,11 +183,13 @@ CONFIG_IP_NF_TARGET_REDIRECT=m | |||||||
| # CONFIG_IP_NF_TFTP is not set | # CONFIG_IP_NF_TFTP is not set | ||||||
| CONFIG_IP_PIMSM_V1=y | CONFIG_IP_PIMSM_V1=y | ||||||
| CONFIG_IP_PIMSM_V2=y | CONFIG_IP_PIMSM_V2=y | ||||||
|  | CONFIG_IXP4XX_ETH=y | ||||||
|  | # CONFIG_IXP4XX_HSS is not set | ||||||
| # CONFIG_IXP4XX_INDIRECT_PCI is not set | # CONFIG_IXP4XX_INDIRECT_PCI is not set | ||||||
| CONFIG_IXP4XX_MAC=y | CONFIG_IXP4XX_MAC=y | ||||||
| CONFIG_IXP4XX_NPE=y | CONFIG_IXP4XX_NPE=y | ||||||
| CONFIG_IXP4XX_NPE_FW_LOAD=y | CONFIG_IXP4XX_NPE_FW_LOAD=y | ||||||
| CONFIG_IXP4XX_NPE_FW_MTD=y | CONFIG_IXP4XX_FW_LOAD=y | ||||||
| CONFIG_IXP4XX_QMGR=y | CONFIG_IXP4XX_QMGR=y | ||||||
| CONFIG_IXP4XX_CRYPTO=y | CONFIG_IXP4XX_CRYPTO=y | ||||||
| CONFIG_IXP4XX_WATCHDOG=y | CONFIG_IXP4XX_WATCHDOG=y | ||||||
| @@ -199,6 +202,7 @@ CONFIG_LEGACY_PTYS=y | |||||||
| CONFIG_LEGACY_PTY_COUNT=256 | CONFIG_LEGACY_PTY_COUNT=256 | ||||||
| # CONFIG_LIBCRC32C is not set | # CONFIG_LIBCRC32C is not set | ||||||
| # CONFIG_LLC2 is not set | # CONFIG_LLC2 is not set | ||||||
|  | CONFIG_MACH_AP1000=y | ||||||
| CONFIG_MACH_AVILA=y | CONFIG_MACH_AVILA=y | ||||||
| CONFIG_MACH_COMPEX=y | CONFIG_MACH_COMPEX=y | ||||||
| CONFIG_MACH_DSMG600=y | CONFIG_MACH_DSMG600=y | ||||||
| @@ -212,6 +216,7 @@ CONFIG_MACH_LOFT=y | |||||||
| CONFIG_MACH_NAS100D=y | CONFIG_MACH_NAS100D=y | ||||||
| CONFIG_MACH_NSLU2=y | CONFIG_MACH_NSLU2=y | ||||||
| CONFIG_MACH_PRONGHORNMETRO=y | CONFIG_MACH_PRONGHORNMETRO=y | ||||||
|  | CONFIG_MACH_SIDEWINDER=y | ||||||
| CONFIG_MACH_WG302V2=y | CONFIG_MACH_WG302V2=y | ||||||
| CONFIG_MACH_WRT300NV2=y | CONFIG_MACH_WRT300NV2=y | ||||||
| # CONFIG_MAC_PARTITION is not set | # CONFIG_MAC_PARTITION is not set | ||||||
| @@ -345,13 +350,16 @@ CONFIG_RTC_CLASS=y | |||||||
| # CONFIG_RTC_DEBUG is not set | # CONFIG_RTC_DEBUG is not set | ||||||
| # CONFIG_RTC_DRV_DS1307 is not set | # CONFIG_RTC_DRV_DS1307 is not set | ||||||
| # CONFIG_RTC_DRV_DS1553 is not set | # CONFIG_RTC_DRV_DS1553 is not set | ||||||
| # CONFIG_RTC_DRV_DS1672 is not set | CONFIG_RTC_DRV_DS1672=y | ||||||
| # CONFIG_RTC_DRV_DS1742 is not set | # CONFIG_RTC_DRV_DS1742 is not set | ||||||
| CONFIG_RTC_DRV_ISL1208=y | CONFIG_RTC_DRV_ISL1208=y | ||||||
|  | # CONFIG_RTC_DRV_M41T80 is not set | ||||||
|  | # CONFIG_RTC_DRV_M48T59 is not set | ||||||
| # CONFIG_RTC_DRV_M48T86 is not set | # CONFIG_RTC_DRV_M48T86 is not set | ||||||
| CONFIG_RTC_DRV_PCF8563=y | CONFIG_RTC_DRV_PCF8563=y | ||||||
| # CONFIG_RTC_DRV_PCF8583 is not set | # CONFIG_RTC_DRV_PCF8583 is not set | ||||||
| # CONFIG_RTC_DRV_RS5C372 is not set | # CONFIG_RTC_DRV_RS5C372 is not set | ||||||
|  | # CONFIG_RTC_DRV_STK17TA8 is not set | ||||||
| # CONFIG_RTC_DRV_TEST is not set | # CONFIG_RTC_DRV_TEST is not set | ||||||
| # CONFIG_RTC_DRV_V3020 is not set | # CONFIG_RTC_DRV_V3020 is not set | ||||||
| CONFIG_RTC_DRV_X1205=y | CONFIG_RTC_DRV_X1205=y | ||||||
| @@ -456,6 +464,7 @@ CONFIG_USB_EHCI_TT_NEWSCHED=y | |||||||
| # CONFIG_USB_GTCO is not set | # CONFIG_USB_GTCO is not set | ||||||
| CONFIG_USB_OHCI_HCD=m | CONFIG_USB_OHCI_HCD=m | ||||||
| CONFIG_USB_UHCI_HCD=m | CONFIG_USB_UHCI_HCD=m | ||||||
|  | # CONFIG_USER_NS is not set | ||||||
| CONFIG_VECTORS_BASE=0xffff0000 | CONFIG_VECTORS_BASE=0xffff0000 | ||||||
| # CONFIG_VIA_RHINE is not set | # CONFIG_VIA_RHINE is not set | ||||||
| CONFIG_VIA_VELOCITY=m | CONFIG_VIA_VELOCITY=m | ||||||
|   | |||||||
| @@ -1,9 +0,0 @@ | |||||||
| config IXP4XX_INCLUDE_UCODE |  | ||||||
| 	bool "Build images with Intel IXP4xx Microcode" |  | ||||||
| 	depends TARGET_ixp4xx |  | ||||||
| 	default y |  | ||||||
| 	help |  | ||||||
| 	  You must manually download IPL_ixp400NpeLibrary-2_4.zip from |  | ||||||
| 	  http://www.intel.com/design/network/products/npfamily/ixp400_archives.htm |  | ||||||
| 	  and put it in the dl/ directory of the build system. |  | ||||||
| 	  You will need to agree to the Intel Public License to do so - please do read it! |  | ||||||
| @@ -7,43 +7,28 @@ | |||||||
| include $(TOPDIR)/rules.mk | include $(TOPDIR)/rules.mk | ||||||
| include $(INCLUDE_DIR)/image.mk | include $(INCLUDE_DIR)/image.mk | ||||||
|  |  | ||||||
| UCODEFILE:=IPL_ixp400NpeLibrary-2_4.zip | define Image/Build/slug | ||||||
|  |  | ||||||
| ifneq ($(CONFIG_IXP4XX_INCLUDE_UCODE),) |  | ||||||
|   define Require/npe-ucode |  | ||||||
| 	[ -f $(DL_DIR)/$(UCODEFILE) ] |  | ||||||
|   endef |  | ||||||
|   define Build/Compile/npe |  | ||||||
| 	$(MAKE) -C npe-ucode \ |  | ||||||
| 		BUILD_DIR="$(KDIR)" \ |  | ||||||
| 		TARGET="$(KDIR)" \ |  | ||||||
| 		compile |  | ||||||
|   endef |  | ||||||
|   define Image/Build/slug |  | ||||||
| 	BIN_DIR=$(BIN_DIR) $(TOPDIR)/scripts/slugimage.pl \ | 	BIN_DIR=$(BIN_DIR) $(TOPDIR)/scripts/slugimage.pl \ | ||||||
| 		-L $(KDIR)/apex-nslu2-armeb.bin -m $(KDIR)/NPE-B \ | 		-L $(KDIR)/apex-nslu2-armeb.bin \ | ||||||
| 		-k $(BIN_DIR)/openwrt-nslu2-zImage \ | 		-k $(BIN_DIR)/openwrt-nslu2-zImage \ | ||||||
| 		-r rootfs:$(BIN_DIR)/openwrt-$(BOARD)-$(1).img \ | 		-r rootfs:$(BIN_DIR)/openwrt-$(BOARD)-$(1).img \ | ||||||
| 		-p -o $(BIN_DIR)/openwrt-nslu2-$(1).bin | 		-p -o $(BIN_DIR)/openwrt-nslu2-$(1).bin | ||||||
| 	BIN_DIR=$(BIN_DIR) $(TOPDIR)/scripts/slugimage.pl \ | 	BIN_DIR=$(BIN_DIR) $(TOPDIR)/scripts/slugimage.pl \ | ||||||
| 		-F -L $(KDIR)/apex-nslu2-armeb.bin -m $(KDIR)/NPE-B \ | 		-F -L $(KDIR)/apex-nslu2-armeb.bin \ | ||||||
| 		-k $(BIN_DIR)/openwrt-nslu2-zImage \ | 		-k $(BIN_DIR)/openwrt-nslu2-zImage \ | ||||||
| 		-r rootfs:$(BIN_DIR)/openwrt-$(BOARD)-$(1).img \ | 		-r rootfs:$(BIN_DIR)/openwrt-$(BOARD)-$(1).img \ | ||||||
| 		-p -o $(BIN_DIR)/openwrt-nslu2-$(1)-16mb.bin | 		-p -o $(BIN_DIR)/openwrt-nslu2-$(1)-16mb.bin | ||||||
|   endef | endef | ||||||
| endif |  | ||||||
|  |  | ||||||
| define Build/Compile | define Build/Compile | ||||||
| 	$(MAKE) -C apex \ | 	$(MAKE) -C apex \ | ||||||
| 		BUILD_DIR="$(KDIR)" \ | 		BUILD_DIR="$(KDIR)" \ | ||||||
| 		TARGET="$(KDIR)" \ | 		TARGET="$(KDIR)" \ | ||||||
| 		compile	 | 		compile	 | ||||||
| 	$(call Build/Compile/npe) |  | ||||||
| endef | endef | ||||||
|  |  | ||||||
| define Build/Clean | define Build/Clean | ||||||
| 	$(MAKE) -C apex clean | 	$(MAKE) -C apex clean | ||||||
| 	$(MAKE) -C npe-ucode clean |  | ||||||
| endef | endef | ||||||
|  |  | ||||||
| define Image/Prepare | define Image/Prepare | ||||||
| @@ -52,7 +37,6 @@ endef | |||||||
|  |  | ||||||
| define Image/BuildKernel | define Image/BuildKernel | ||||||
| 	cp $(KDIR)/zImage $(BIN_DIR)/openwrt-$(BOARD)-zImage | 	cp $(KDIR)/zImage $(BIN_DIR)/openwrt-$(BOARD)-zImage | ||||||
| #	$(shell BIN_DIR=$(BIN_DIR) $(TOPDIR)/scripts/arm-magic.sh) |  | ||||||
| 	BIN_DIR=$(BIN_DIR) $(TOPDIR)/scripts/arm-magic.sh | 	BIN_DIR=$(BIN_DIR) $(TOPDIR)/scripts/arm-magic.sh | ||||||
| endef | endef | ||||||
|  |  | ||||||
| @@ -76,10 +60,3 @@ define Image/Build/squashfs | |||||||
| endef | endef | ||||||
|  |  | ||||||
| $(eval $(call BuildImage)) | $(eval $(call BuildImage)) | ||||||
|  |  | ||||||
| $(eval $(call Require,npe-ucode, \ |  | ||||||
| 	You must manually download $(UCODEFILE) from \\\ |  | ||||||
| 	http://www.intel.com/design/network/products/npfamily/ixp400_archives.htm \\\ |  | ||||||
| 	and put it in $(DL_DIR). \\\ |  | ||||||
| 	You will need to agree to the Intel Public License to do so - please do read it! \ |  | ||||||
| )) |  | ||||||
|   | |||||||
| @@ -1,41 +0,0 @@ | |||||||
| #  |  | ||||||
| # Copyright (C) 2006 OpenWrt.org |  | ||||||
| # |  | ||||||
| # This is free software, licensed under the GNU General Public License v2. |  | ||||||
| # See /LICENSE for more information. |  | ||||||
| # |  | ||||||
| # $Id$ |  | ||||||
|  |  | ||||||
| include $(TOPDIR)/rules.mk |  | ||||||
|  |  | ||||||
| PKG_NAME:=npe-ucode |  | ||||||
| PKG_VERSION:=2.4 |  | ||||||
| PKG_RELEASE:=2 |  | ||||||
|  |  | ||||||
| PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) |  | ||||||
| PKG_SOURCE:=IPL_ixp400NpeLibrary-2_4.zip |  | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/package.mk |  | ||||||
|  |  | ||||||
| define Build/Prepare |  | ||||||
| 	rm -rf $(PKG_BUILD_DIR) |  | ||||||
| 	mkdir -p $(PKG_BUILD_DIR) |  | ||||||
| 	unzip -d $(PKG_BUILD_DIR)/ $(DL_DIR)/$(PKG_SOURCE) |  | ||||||
| 	mv $(PKG_BUILD_DIR)/ixp400_xscale_sw/src/npeDl/IxNpeMicrocode.c $(PKG_BUILD_DIR)/ |  | ||||||
| 	rm -rf $(PKG_BUILD_DIR)/ixp400_xscale_sw |  | ||||||
| 	$(CP) ./src/* $(PKG_BUILD_DIR)/ |  | ||||||
| endef |  | ||||||
|  |  | ||||||
| define Build/Compile |  | ||||||
| 	(cd $(PKG_BUILD_DIR); \ |  | ||||||
| 		$(HOSTCC) -Wall IxNpeMicrocode.c -o IxNpeMicrocode; \ |  | ||||||
| 		./IxNpeMicrocode -be \ |  | ||||||
| 	) |  | ||||||
| endef |  | ||||||
|  |  | ||||||
| define Build/InstallDev |  | ||||||
| 	$(INSTALL_BIN) $(PKG_BUILD_DIR)/NPE-B $(TARGET)/ |  | ||||||
| 	$(INSTALL_BIN) $(PKG_BUILD_DIR)/NPE-C $(TARGET)/ |  | ||||||
| endef |  | ||||||
|  |  | ||||||
| $(eval $(call Build/DefaultTargets)) |  | ||||||
							
								
								
									
										119
									
								
								target/linux/ixp4xx/patches-2.6.23/001-kexec_atags.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								target/linux/ixp4xx/patches-2.6.23/001-kexec_atags.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/kernel/relocate_kernel.S linux-2.6.23/arch/arm/kernel/relocate_kernel.S | ||||||
|  | --- linux-2.6.23.orig/arch/arm/kernel/relocate_kernel.S	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/arch/arm/kernel/relocate_kernel.S	2007-10-09 22:19:32.000000000 -0500 | ||||||
|  | @@ -7,6 +7,23 @@ | ||||||
|  |  	.globl relocate_new_kernel | ||||||
|  |  relocate_new_kernel: | ||||||
|  |   | ||||||
|  | +	/* Move boot params back to where the kernel expects them */ | ||||||
|  | + | ||||||
|  | +	ldr	r0,kexec_boot_params_address | ||||||
|  | +	teq	r0,#0 | ||||||
|  | +	beq	8f | ||||||
|  | + | ||||||
|  | +	ldr	r1,kexec_boot_params_copy | ||||||
|  | +	mov	r6,#KEXEC_BOOT_PARAMS_SIZE/4 | ||||||
|  | +7: | ||||||
|  | +	ldr	r5,[r1],#4 | ||||||
|  | +	str	r5,[r0],#4 | ||||||
|  | +	subs	r6,r6,#1 | ||||||
|  | +	bne	7b | ||||||
|  | + | ||||||
|  | +8: | ||||||
|  | +	/* Boot params moved, now go on with the kernel */ | ||||||
|  | + | ||||||
|  |  	ldr	r0,kexec_indirection_page | ||||||
|  |  	ldr	r1,kexec_start_address | ||||||
|  |   | ||||||
|  | @@ -50,7 +67,7 @@ relocate_new_kernel: | ||||||
|  |  	mov lr,r1 | ||||||
|  |  	mov r0,#0 | ||||||
|  |  	ldr r1,kexec_mach_type | ||||||
|  | -	mov r2,#0 | ||||||
|  | +	ldr r2,kexec_boot_params_address | ||||||
|  |  	mov pc,lr | ||||||
|  |   | ||||||
|  |  	.globl kexec_start_address | ||||||
|  | @@ -65,6 +82,16 @@ kexec_indirection_page: | ||||||
|  |  kexec_mach_type: | ||||||
|  |  	.long	0x0 | ||||||
|  |   | ||||||
|  | +	/* phy addr where new kernel will expect to find boot params */ | ||||||
|  | +	.globl kexec_boot_params_address | ||||||
|  | +kexec_boot_params_address: | ||||||
|  | +	.long	0x0 | ||||||
|  | + | ||||||
|  | +	/* phy addr where old kernel put a copy of orig boot params */ | ||||||
|  | +	.globl kexec_boot_params_copy | ||||||
|  | +kexec_boot_params_copy: | ||||||
|  | +	.long	0x0 | ||||||
|  | + | ||||||
|  |  relocate_new_kernel_end: | ||||||
|  |   | ||||||
|  |  	.globl relocate_new_kernel_size | ||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/kernel/setup.c linux-2.6.23/arch/arm/kernel/setup.c | ||||||
|  | --- linux-2.6.23.orig/arch/arm/kernel/setup.c	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/arch/arm/kernel/setup.c	2007-10-09 20:06:10.000000000 -0500 | ||||||
|  | @@ -24,6 +24,7 @@ | ||||||
|  |  #include <linux/interrupt.h> | ||||||
|  |  #include <linux/smp.h> | ||||||
|  |  #include <linux/fs.h> | ||||||
|  | +#include <linux/kexec.h> | ||||||
|  |   | ||||||
|  |  #include <asm/cpu.h> | ||||||
|  |  #include <asm/elf.h> | ||||||
|  | @@ -770,6 +771,23 @@ static int __init customize_machine(void | ||||||
|  |  } | ||||||
|  |  arch_initcall(customize_machine); | ||||||
|  |   | ||||||
|  | +#ifdef CONFIG_KEXEC | ||||||
|  | + | ||||||
|  | +/* Physical addr of where the boot params should be for this machine */ | ||||||
|  | +extern unsigned long kexec_boot_params_address; | ||||||
|  | + | ||||||
|  | +/* Physical addr of the buffer into which the boot params are copied */ | ||||||
|  | +extern unsigned long kexec_boot_params_copy; | ||||||
|  | + | ||||||
|  | +/* Pointer to the boot params buffer, for manipulation and display */ | ||||||
|  | +unsigned long kexec_boot_params; | ||||||
|  | +EXPORT_SYMBOL(kexec_boot_params); | ||||||
|  | + | ||||||
|  | +/* The buffer itself - make sure it is sized correctly */ | ||||||
|  | +static unsigned long kexec_boot_params_buf[(KEXEC_BOOT_PARAMS_SIZE + 3) / 4]; | ||||||
|  | + | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  |  void __init setup_arch(char **cmdline_p) | ||||||
|  |  { | ||||||
|  |  	struct tag *tags = (struct tag *)&init_tags; | ||||||
|  | @@ -788,6 +806,18 @@ void __init setup_arch(char **cmdline_p) | ||||||
|  |  	else if (mdesc->boot_params) | ||||||
|  |  		tags = phys_to_virt(mdesc->boot_params); | ||||||
|  |   | ||||||
|  | +#ifdef CONFIG_KEXEC | ||||||
|  | +	kexec_boot_params_copy = virt_to_phys(kexec_boot_params_buf); | ||||||
|  | +	kexec_boot_params = (unsigned long)kexec_boot_params_buf; | ||||||
|  | +	if (__atags_pointer) { | ||||||
|  | +		kexec_boot_params_address = __atags_pointer; | ||||||
|  | +		memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE); | ||||||
|  | +	} else if (mdesc->boot_params) { | ||||||
|  | +		kexec_boot_params_address = mdesc->boot_params; | ||||||
|  | +		memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE); | ||||||
|  | +	} | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  |  	/* | ||||||
|  |  	 * If we have the old style parameters, convert them to | ||||||
|  |  	 * a tag list. | ||||||
|  | diff -uprN linux-2.6.23.orig/include/asm-arm/kexec.h linux-2.6.23/include/asm-arm/kexec.h | ||||||
|  | --- linux-2.6.23.orig/include/asm-arm/kexec.h	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/include/asm-arm/kexec.h	2007-10-09 22:19:32.000000000 -0500 | ||||||
|  | @@ -14,6 +14,8 @@ | ||||||
|  |   | ||||||
|  |  #define KEXEC_ARCH KEXEC_ARCH_ARM | ||||||
|  |   | ||||||
|  | +#define KEXEC_BOOT_PARAMS_SIZE 1536 | ||||||
|  | + | ||||||
|  |  #ifndef __ASSEMBLY__ | ||||||
|  |   | ||||||
|  |  struct kimage; | ||||||
							
								
								
									
										926
									
								
								target/linux/ixp4xx/patches-2.6.23/012-velocity_BE.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										926
									
								
								target/linux/ixp4xx/patches-2.6.23/012-velocity_BE.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,926 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/drivers/net/via-velocity.c linux-2.6.23/drivers/net/via-velocity.c | ||||||
|  | --- linux-2.6.23.orig/drivers/net/via-velocity.c	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/drivers/net/via-velocity.c	2007-10-11 00:53:45.000000000 -0500 | ||||||
|  | @@ -96,11 +96,31 @@ MODULE_AUTHOR("VIA Networking Technologi | ||||||
|  |  MODULE_LICENSE("GPL"); | ||||||
|  |  MODULE_DESCRIPTION("VIA Networking Velocity Family Gigabit Ethernet Adapter Driver"); | ||||||
|  |   | ||||||
|  | +/* Valid values for vdebug (additive, this is a bitmask): | ||||||
|  | + *  0x00 => off | ||||||
|  | + *  0x01 => always on | ||||||
|  | + *  0x02 => additional detail on tx (rx, too, if anyone implements same) | ||||||
|  | + *  0x04 => detail the initialization process | ||||||
|  | + *  0x08 => spot debug detail; to be used as developers see fit | ||||||
|  | + */ | ||||||
|  | +static int vdebug = 0; | ||||||
|  | + | ||||||
|  | +/* HAIL - these macros are for the normal 0x01-type tracing... */ | ||||||
|  | +#define HAIL(S) \ | ||||||
|  | +	if (vdebug&1) printk(KERN_NOTICE "%s\n", (S)); | ||||||
|  | +#define HAILS(S,T) \ | ||||||
|  | +	if (vdebug&1) printk(KERN_NOTICE "%s -> status=0x%x\n", (S), (T)); | ||||||
|  | + | ||||||
|  |  #define VELOCITY_PARAM(N,D) \ | ||||||
|  |          static int N[MAX_UNITS]=OPTION_DEFAULT;\ | ||||||
|  |  	module_param_array(N, int, NULL, 0); \ | ||||||
|  |          MODULE_PARM_DESC(N, D); | ||||||
|  |   | ||||||
|  | +#define VELO_DEBUG_MIN   0 | ||||||
|  | +#define VELO_DEBUG_MAX   255 | ||||||
|  | +#define VELO_DEBUG_DEF   0 | ||||||
|  | +VELOCITY_PARAM(velo_debug, "Debug level"); | ||||||
|  | + | ||||||
|  |  #define RX_DESC_MIN     64 | ||||||
|  |  #define RX_DESC_MAX     255 | ||||||
|  |  #define RX_DESC_DEF     64 | ||||||
|  | @@ -385,12 +405,12 @@ static void __devinit velocity_set_int_o | ||||||
|  |  	if (val == -1) | ||||||
|  |  		*opt = def; | ||||||
|  |  	else if (val < min || val > max) { | ||||||
|  | -		VELOCITY_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: the value of parameter %s is invalid, the valid range is (%d-%d)\n", | ||||||
|  | -					devname, name, min, max); | ||||||
|  | +		VELOCITY_PRT(MSG_LEVEL_INFO, KERN_NOTICE "via-velocity: the value of parameter %s is invalid, the valid range is (%d-%d)\n", | ||||||
|  | +					name, min, max); | ||||||
|  |  		*opt = def; | ||||||
|  |  	} else { | ||||||
|  | -		VELOCITY_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: set value of parameter %s to %d\n", | ||||||
|  | -					devname, name, val); | ||||||
|  | +		VELOCITY_PRT(MSG_LEVEL_INFO, KERN_INFO "via-velocity: set value of parameter %s to %d\n", | ||||||
|  | +					name, val); | ||||||
|  |  		*opt = val; | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  | @@ -415,12 +435,12 @@ static void __devinit velocity_set_bool_ | ||||||
|  |  	if (val == -1) | ||||||
|  |  		*opt |= (def ? flag : 0); | ||||||
|  |  	else if (val < 0 || val > 1) { | ||||||
|  | -		printk(KERN_NOTICE "%s: the value of parameter %s is invalid, the valid range is (0-1)\n", | ||||||
|  | -			devname, name); | ||||||
|  | +		printk(KERN_NOTICE "via-velocity: the value of parameter %s is invalid, the valid range is (0-1)\n", | ||||||
|  | +			name); | ||||||
|  |  		*opt |= (def ? flag : 0); | ||||||
|  |  	} else { | ||||||
|  | -		printk(KERN_INFO "%s: set parameter %s to %s\n", | ||||||
|  | -			devname, name, val ? "TRUE" : "FALSE"); | ||||||
|  | +		printk(KERN_INFO "via-velocity: set parameter %s to %s\n", | ||||||
|  | +			name, val ? "TRUE" : "FALSE"); | ||||||
|  |  		*opt |= (val ? flag : 0); | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  | @@ -438,6 +458,7 @@ static void __devinit velocity_set_bool_ | ||||||
|  |  static void __devinit velocity_get_options(struct velocity_opt *opts, int index, char *devname) | ||||||
|  |  { | ||||||
|  |   | ||||||
|  | +	velocity_set_int_opt(&opts->velo_debug, velo_debug[index], VELO_DEBUG_MIN, VELO_DEBUG_MAX, VELO_DEBUG_DEF, "velo_debug", devname); | ||||||
|  |  	velocity_set_int_opt(&opts->rx_thresh, rx_thresh[index], RX_THRESH_MIN, RX_THRESH_MAX, RX_THRESH_DEF, "rx_thresh", devname); | ||||||
|  |  	velocity_set_int_opt(&opts->DMA_length, DMA_length[index], DMA_LENGTH_MIN, DMA_LENGTH_MAX, DMA_LENGTH_DEF, "DMA_length", devname); | ||||||
|  |  	velocity_set_int_opt(&opts->numrx, RxDescriptors[index], RX_DESC_MIN, RX_DESC_MAX, RX_DESC_DEF, "RxDescriptors", devname); | ||||||
|  | @@ -452,6 +473,7 @@ static void __devinit velocity_get_optio | ||||||
|  |  	velocity_set_int_opt((int *) &opts->wol_opts, wol_opts[index], WOL_OPT_MIN, WOL_OPT_MAX, WOL_OPT_DEF, "Wake On Lan options", devname); | ||||||
|  |  	velocity_set_int_opt((int *) &opts->int_works, int_works[index], INT_WORKS_MIN, INT_WORKS_MAX, INT_WORKS_DEF, "Interrupt service works", devname); | ||||||
|  |  	opts->numrx = (opts->numrx & ~3); | ||||||
|  | +	vdebug = opts->velo_debug; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /** | ||||||
|  | @@ -466,6 +488,8 @@ static void velocity_init_cam_filter(str | ||||||
|  |  { | ||||||
|  |  	struct mac_regs __iomem * regs = vptr->mac_regs; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_init_cam_filter"); | ||||||
|  | + | ||||||
|  |  	/* Turn on MCFG_PQEN, turn off MCFG_RTGOPT */ | ||||||
|  |  	WORD_REG_BITS_SET(MCFG_PQEN, MCFG_RTGOPT, ®s->MCFG); | ||||||
|  |  	WORD_REG_BITS_ON(MCFG_VIDFR, ®s->MCFG); | ||||||
|  | @@ -484,14 +508,12 @@ static void velocity_init_cam_filter(str | ||||||
|  |  			WORD_REG_BITS_ON(MCFG_RTGOPT, ®s->MCFG); | ||||||
|  |   | ||||||
|  |  		mac_set_cam(regs, 0, (u8 *) & (vptr->options.vid), VELOCITY_VLAN_ID_CAM); | ||||||
|  | -		vptr->vCAMmask[0] |= 1; | ||||||
|  | -		mac_set_cam_mask(regs, vptr->vCAMmask, VELOCITY_VLAN_ID_CAM); | ||||||
|  |  	} else { | ||||||
|  |  		u16 temp = 0; | ||||||
|  |  		mac_set_cam(regs, 0, (u8 *) &temp, VELOCITY_VLAN_ID_CAM); | ||||||
|  | -		temp = 1; | ||||||
|  | -		mac_set_cam_mask(regs, (u8 *) &temp, VELOCITY_VLAN_ID_CAM); | ||||||
|  |  	} | ||||||
|  | +	vptr->vCAMmask[0] |= 1; | ||||||
|  | +	mac_set_cam_mask(regs, vptr->vCAMmask, VELOCITY_VLAN_ID_CAM); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /** | ||||||
|  | @@ -508,13 +530,15 @@ static void velocity_rx_reset(struct vel | ||||||
|  |  	struct mac_regs __iomem * regs = vptr->mac_regs; | ||||||
|  |  	int i; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_rx_reset"); | ||||||
|  |  	vptr->rd_dirty = vptr->rd_filled = vptr->rd_curr = 0; | ||||||
|  |   | ||||||
|  |  	/* | ||||||
|  |  	 *	Init state, all RD entries belong to the NIC | ||||||
|  |  	 */ | ||||||
|  |  	for (i = 0; i < vptr->options.numrx; ++i) | ||||||
|  | -		vptr->rd_ring[i].rdesc0.owner = OWNED_BY_NIC; | ||||||
|  | +		/* vptr->rd_ring[i].rdesc0.owner = OWNED_BY_NIC; BE */ | ||||||
|  | +		vptr->rd_ring[i].rdesc0 |= cpu_to_le32(BE_OWNED_BY_NIC); /* BE */ | ||||||
|  |   | ||||||
|  |  	writew(vptr->options.numrx, ®s->RBRDU); | ||||||
|  |  	writel(vptr->rd_pool_dma, ®s->RDBaseLo); | ||||||
|  | @@ -537,12 +561,15 @@ static void velocity_init_registers(stru | ||||||
|  |  	struct mac_regs __iomem * regs = vptr->mac_regs; | ||||||
|  |  	int i, mii_status; | ||||||
|  |   | ||||||
|  | +	if (vdebug&5) printk(KERN_NOTICE "velocity_init_registers: entering\n"); | ||||||
|  | + | ||||||
|  |  	mac_wol_reset(regs); | ||||||
|  |   | ||||||
|  |  	switch (type) { | ||||||
|  |  	case VELOCITY_INIT_RESET: | ||||||
|  |  	case VELOCITY_INIT_WOL: | ||||||
|  |   | ||||||
|  | +		if (vdebug&4) printk(KERN_NOTICE "velocity_init_registers: RESET or WOL\n"); | ||||||
|  |  		netif_stop_queue(vptr->dev); | ||||||
|  |   | ||||||
|  |  		/* | ||||||
|  | @@ -570,12 +597,13 @@ static void velocity_init_registers(stru | ||||||
|  |   | ||||||
|  |  	case VELOCITY_INIT_COLD: | ||||||
|  |  	default: | ||||||
|  | +		if (vdebug&4) printk(KERN_NOTICE "velocity_init_registers: COLD or default\n"); | ||||||
|  |  		/* | ||||||
|  |  		 *	Do reset | ||||||
|  |  		 */ | ||||||
|  |  		velocity_soft_reset(vptr); | ||||||
|  | +		if (vdebug&4) printk(KERN_NOTICE "velocity_init_registers: soft reset complete.\n"); | ||||||
|  |  		mdelay(5); | ||||||
|  | - | ||||||
|  |  		mac_eeprom_reload(regs); | ||||||
|  |  		for (i = 0; i < 6; i++) { | ||||||
|  |  			writeb(vptr->dev->dev_addr[i], &(regs->PAR[i])); | ||||||
|  | @@ -593,11 +621,16 @@ static void velocity_init_registers(stru | ||||||
|  |  		 */ | ||||||
|  |  		BYTE_REG_BITS_SET(CFGB_OFSET, (CFGB_CRANDOM | CFGB_CAP | CFGB_MBA | CFGB_BAKOPT), ®s->CFGB); | ||||||
|  |   | ||||||
|  | +		if (vdebug&4) printk(KERN_NOTICE "velocity_init_registers: Initializing CAM filter\n"); | ||||||
|  |  		/* | ||||||
|  |  		 *	Init CAM filter | ||||||
|  |  		 */ | ||||||
|  | +		if (vdebug&8) printk(KERN_NOTICE "velocity: spot debug: about to init CAM filters\n"); | ||||||
|  | +		mdelay(5);  /* MJW - ARM processors, kernel 2.6.19 - this fixes oopses and hangs */ | ||||||
|  |  		velocity_init_cam_filter(vptr); | ||||||
|  | +		if (vdebug&8) printk(KERN_NOTICE "velocity: spot debug: init CAM filters complete\n"); | ||||||
|  |   | ||||||
|  | +		if (vdebug&4) printk(KERN_NOTICE "velocity_init_registers: Setting packet filter\n"); | ||||||
|  |  		/* | ||||||
|  |  		 *	Set packet filter: Receive directed and broadcast address | ||||||
|  |  		 */ | ||||||
|  | @@ -607,10 +640,12 @@ static void velocity_init_registers(stru | ||||||
|  |  		 *	Enable MII auto-polling | ||||||
|  |  		 */ | ||||||
|  |  		enable_mii_autopoll(regs); | ||||||
|  | +		if (vdebug&4) printk(KERN_NOTICE "velocity_init_registers: enable_mii_autopoll complete.\n"); | ||||||
|  |   | ||||||
|  |  		vptr->int_mask = INT_MASK_DEF; | ||||||
|  |   | ||||||
|  | -		writel(cpu_to_le32(vptr->rd_pool_dma), ®s->RDBaseLo); | ||||||
|  | +		/* writel(cpu_to_le32(vptr->rd_pool_dma), ®s->RDBaseLo); BE */ | ||||||
|  | +		writel((vptr->rd_pool_dma), ®s->RDBaseLo); /* BE */ | ||||||
|  |  		writew(vptr->options.numrx - 1, ®s->RDCSize); | ||||||
|  |  		mac_rx_queue_run(regs); | ||||||
|  |  		mac_rx_queue_wake(regs); | ||||||
|  | @@ -618,10 +653,13 @@ static void velocity_init_registers(stru | ||||||
|  |  		writew(vptr->options.numtx - 1, ®s->TDCSize); | ||||||
|  |   | ||||||
|  |  		for (i = 0; i < vptr->num_txq; i++) { | ||||||
|  | -			writel(cpu_to_le32(vptr->td_pool_dma[i]), &(regs->TDBaseLo[i])); | ||||||
|  | +			/* writel(cpu_to_le32(vptr->td_pool_dma[i]), &(regs->TDBaseLo[i])); BE */ | ||||||
|  | +			writel((vptr->td_pool_dma[i]), &(regs->TDBaseLo[i])); /* BE */ | ||||||
|  |  			mac_tx_queue_run(regs, i); | ||||||
|  |  		} | ||||||
|  |   | ||||||
|  | +		if (vdebug&4) printk(KERN_NOTICE "velocity_init_registers: DMA settings complete.\n"); | ||||||
|  | + | ||||||
|  |  		init_flow_control_register(vptr); | ||||||
|  |   | ||||||
|  |  		writel(CR0_STOP, ®s->CR0Clr); | ||||||
|  | @@ -640,8 +678,10 @@ static void velocity_init_registers(stru | ||||||
|  |   | ||||||
|  |  		enable_flow_control_ability(vptr); | ||||||
|  |  		mac_hw_mibs_init(regs); | ||||||
|  | +		if (vdebug&4) printk(KERN_NOTICE "velocity_init_registers: Set interrupt mask\n"); | ||||||
|  |  		mac_write_int_mask(vptr->int_mask, regs); | ||||||
|  |  		mac_clear_isr(regs); | ||||||
|  | +		if (vdebug&4) printk(KERN_NOTICE "velocity_init_registers: complete.\n"); | ||||||
|  |   | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  | @@ -659,6 +699,7 @@ static int velocity_soft_reset(struct ve | ||||||
|  |  	struct mac_regs __iomem * regs = vptr->mac_regs; | ||||||
|  |  	int i = 0; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_soft_reset"); | ||||||
|  |  	writel(CR0_SFRST, ®s->CR0Set); | ||||||
|  |   | ||||||
|  |  	for (i = 0; i < W_MAX_TIMEOUT; i++) { | ||||||
|  | @@ -722,6 +763,7 @@ static int __devinit velocity_found1(str | ||||||
|  |  			VELOCITY_FULL_DRV_NAM, VELOCITY_VERSION); | ||||||
|  |  		printk(KERN_INFO "Copyright (c) 2002, 2003 VIA Networking Technologies, Inc.\n"); | ||||||
|  |  		printk(KERN_INFO "Copyright (c) 2004 Red Hat Inc.\n"); | ||||||
|  | +		printk(KERN_INFO "BE support, misc. fixes MJW 01Jan2007 - may be unstable\n"); | ||||||
|  |  		first = 0; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | @@ -934,6 +976,7 @@ static int velocity_init_rings(struct ve | ||||||
|  |  	dma_addr_t pool_dma; | ||||||
|  |  	u8 *pool; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_init_rings"); | ||||||
|  |  	/* | ||||||
|  |  	 *	Allocate all RD/TD rings a single pool | ||||||
|  |  	 */ | ||||||
|  | @@ -996,6 +1039,7 @@ static int velocity_init_rings(struct ve | ||||||
|  |  static void velocity_free_rings(struct velocity_info *vptr) | ||||||
|  |  { | ||||||
|  |  	int size; | ||||||
|  | +	HAIL("velocity_free_rings"); | ||||||
|  |   | ||||||
|  |  	size = vptr->options.numrx * sizeof(struct rx_desc) + | ||||||
|  |  	       vptr->options.numtx * sizeof(struct tx_desc) * vptr->num_txq; | ||||||
|  | @@ -1012,6 +1056,7 @@ static inline void velocity_give_many_rx | ||||||
|  |  	struct mac_regs __iomem *regs = vptr->mac_regs; | ||||||
|  |  	int avail, dirty, unusable; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_give_many_rx_descs"); | ||||||
|  |  	/* | ||||||
|  |  	 * RD number must be equal to 4X per hardware spec | ||||||
|  |  	 * (programming guide rev 1.20, p.13) | ||||||
|  | @@ -1025,7 +1070,8 @@ static inline void velocity_give_many_rx | ||||||
|  |  	dirty = vptr->rd_dirty - unusable; | ||||||
|  |  	for (avail = vptr->rd_filled & 0xfffc; avail; avail--) { | ||||||
|  |  		dirty = (dirty > 0) ? dirty - 1 : vptr->options.numrx - 1; | ||||||
|  | -		vptr->rd_ring[dirty].rdesc0.owner = OWNED_BY_NIC; | ||||||
|  | +		/* vptr->rd_ring[dirty].rdesc0.owner = OWNED_BY_NIC; BE */ | ||||||
|  | +		vptr->rd_ring[dirty].rdesc0 |= cpu_to_le32(BE_OWNED_BY_NIC); /* BE */ | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	writew(vptr->rd_filled & 0xfffc, ®s->RBRDU); | ||||||
|  | @@ -1035,12 +1081,14 @@ static inline void velocity_give_many_rx | ||||||
|  |  static int velocity_rx_refill(struct velocity_info *vptr) | ||||||
|  |  { | ||||||
|  |  	int dirty = vptr->rd_dirty, done = 0, ret = 0; | ||||||
|  | +	HAIL("velocity_rx_refill"); | ||||||
|  |   | ||||||
|  |  	do { | ||||||
|  |  		struct rx_desc *rd = vptr->rd_ring + dirty; | ||||||
|  |   | ||||||
|  |  		/* Fine for an all zero Rx desc at init time as well */ | ||||||
|  | -		if (rd->rdesc0.owner == OWNED_BY_NIC) | ||||||
|  | +		/* if (rd->rdesc0.owner == OWNED_BY_NIC) BE */ | ||||||
|  | +		if (rd->rdesc0 & cpu_to_le32(BE_OWNED_BY_NIC)) /* BE */ | ||||||
|  |  			break; | ||||||
|  |   | ||||||
|  |  		if (!vptr->rd_info[dirty].skb) { | ||||||
|  | @@ -1075,6 +1123,7 @@ static int velocity_init_rd_ring(struct  | ||||||
|  |  	unsigned int rsize = sizeof(struct velocity_rd_info) * | ||||||
|  |  					vptr->options.numrx; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_init_rd_ring"); | ||||||
|  |  	vptr->rd_info = kmalloc(rsize, GFP_KERNEL); | ||||||
|  |  	if(vptr->rd_info == NULL) | ||||||
|  |  		goto out; | ||||||
|  | @@ -1104,6 +1153,7 @@ static void velocity_free_rd_ring(struct | ||||||
|  |  { | ||||||
|  |  	int i; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_free_rd_ring"); | ||||||
|  |  	if (vptr->rd_info == NULL) | ||||||
|  |  		return; | ||||||
|  |   | ||||||
|  | @@ -1145,6 +1195,7 @@ static int velocity_init_td_ring(struct  | ||||||
|  |  	unsigned int tsize = sizeof(struct velocity_td_info) * | ||||||
|  |  					vptr->options.numtx; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_init_td_ring"); | ||||||
|  |  	/* Init the TD ring entries */ | ||||||
|  |  	for (j = 0; j < vptr->num_txq; j++) { | ||||||
|  |  		curr = vptr->td_pool_dma[j]; | ||||||
|  | @@ -1181,6 +1232,7 @@ static void velocity_free_td_ring_entry( | ||||||
|  |  	struct velocity_td_info * td_info = &(vptr->td_infos[q][n]); | ||||||
|  |  	int i; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_free_td_ring_entry"); | ||||||
|  |  	if (td_info == NULL) | ||||||
|  |  		return; | ||||||
|  |   | ||||||
|  | @@ -1210,6 +1262,7 @@ static void velocity_free_td_ring(struct | ||||||
|  |  { | ||||||
|  |  	int i, j; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_free_td_ring"); | ||||||
|  |  	for (j = 0; j < vptr->num_txq; j++) { | ||||||
|  |  		if (vptr->td_infos[j] == NULL) | ||||||
|  |  			continue; | ||||||
|  | @@ -1237,34 +1290,42 @@ static int velocity_rx_srv(struct veloci | ||||||
|  |  	struct net_device_stats *stats = &vptr->stats; | ||||||
|  |  	int rd_curr = vptr->rd_curr; | ||||||
|  |  	int works = 0; | ||||||
|  | +	u16 wRSR; /* BE */ | ||||||
|  |   | ||||||
|  | +	HAILS("velocity_rx_srv", status); | ||||||
|  |  	do { | ||||||
|  |  		struct rx_desc *rd = vptr->rd_ring + rd_curr; | ||||||
|  |   | ||||||
|  |  		if (!vptr->rd_info[rd_curr].skb) | ||||||
|  |  			break; | ||||||
|  |   | ||||||
|  | -		if (rd->rdesc0.owner == OWNED_BY_NIC) | ||||||
|  | +		/* if (rd->rdesc0.owner == OWNED_BY_NIC) BE */ | ||||||
|  | +		if (rd->rdesc0 & cpu_to_le32(BE_OWNED_BY_NIC)) /* BE */ | ||||||
|  |  			break; | ||||||
|  |   | ||||||
|  |  		rmb(); | ||||||
|  |   | ||||||
|  | +		wRSR = (u16)(cpu_to_le32(rd->rdesc0)); /* BE */ | ||||||
|  |  		/* | ||||||
|  |  		 *	Don't drop CE or RL error frame although RXOK is off | ||||||
|  |  		 */ | ||||||
|  | -		if ((rd->rdesc0.RSR & RSR_RXOK) || (!(rd->rdesc0.RSR & RSR_RXOK) && (rd->rdesc0.RSR & (RSR_CE | RSR_RL)))) { | ||||||
|  | +		/* if ((rd->rdesc0.RSR & RSR_RXOK) || (!(rd->rdesc0.RSR & RSR_RXOK) && (rd->rdesc0.RSR & (RSR_CE | RSR_RL)))) { BE */ | ||||||
|  | +		if ((wRSR & RSR_RXOK) || (!(wRSR & RSR_RXOK) && (wRSR & (RSR_CE | RSR_RL)))) { /* BE */ | ||||||
|  |  			if (velocity_receive_frame(vptr, rd_curr) < 0) | ||||||
|  |  				stats->rx_dropped++; | ||||||
|  |  		} else { | ||||||
|  | -			if (rd->rdesc0.RSR & RSR_CRC) | ||||||
|  | +			/* if (rd->rdesc0.RSR & RSR_CRC) BE */ | ||||||
|  | +			if (wRSR & RSR_CRC) /* BE */ | ||||||
|  |  				stats->rx_crc_errors++; | ||||||
|  | -			if (rd->rdesc0.RSR & RSR_FAE) | ||||||
|  | +			/* if (rd->rdesc0.RSR & RSR_FAE) BE */ | ||||||
|  | +			if (wRSR & RSR_FAE) /* BE */ | ||||||
|  |  				stats->rx_frame_errors++; | ||||||
|  |   | ||||||
|  |  			stats->rx_dropped++; | ||||||
|  |  		} | ||||||
|  |   | ||||||
|  | -		rd->inten = 1; | ||||||
|  | +		/* rd->inten = 1; BE */ | ||||||
|  | +		rd->ltwo |= cpu_to_le32(BE_INT_ENABLE); /* BE */ | ||||||
|  |   | ||||||
|  |  		vptr->dev->last_rx = jiffies; | ||||||
|  |   | ||||||
|  | @@ -1295,13 +1356,21 @@ static int velocity_rx_srv(struct veloci | ||||||
|  |   | ||||||
|  |  static inline void velocity_rx_csum(struct rx_desc *rd, struct sk_buff *skb) | ||||||
|  |  { | ||||||
|  | +	u8 bCSM; | ||||||
|  | +	HAIL("velocity_rx_csum"); | ||||||
|  |  	skb->ip_summed = CHECKSUM_NONE; | ||||||
|  |   | ||||||
|  | -	if (rd->rdesc1.CSM & CSM_IPKT) { | ||||||
|  | -		if (rd->rdesc1.CSM & CSM_IPOK) { | ||||||
|  | -			if ((rd->rdesc1.CSM & CSM_TCPKT) || | ||||||
|  | -					(rd->rdesc1.CSM & CSM_UDPKT)) { | ||||||
|  | -				if (!(rd->rdesc1.CSM & CSM_TUPOK)) { | ||||||
|  | +//	if (rd->rdesc1.CSM & CSM_IPKT) { | ||||||
|  | +//		if (rd->rdesc1.CSM & CSM_IPOK) { | ||||||
|  | +//			if ((rd->rdesc1.CSM & CSM_TCPKT) || | ||||||
|  | +//					(rd->rdesc1.CSM & CSM_UDPKT)) { | ||||||
|  | +//				if (!(rd->rdesc1.CSM & CSM_TUPOK)) { | ||||||
|  | +	bCSM = (u8)(cpu_to_le32(rd->rdesc1) >> 16); /* BE */ | ||||||
|  | +	if (bCSM & CSM_IPKT) { | ||||||
|  | +		if (bCSM & CSM_IPOK) { | ||||||
|  | +			if ((bCSM & CSM_TCPKT) || | ||||||
|  | +			    (bCSM & CSM_UDPKT)) { | ||||||
|  | +				if (!(bCSM & CSM_TUPOK)) {      /* BE */ | ||||||
|  |  					return; | ||||||
|  |  				} | ||||||
|  |  			} | ||||||
|  | @@ -1327,9 +1396,11 @@ static inline int velocity_rx_copy(struc | ||||||
|  |  { | ||||||
|  |  	int ret = -1; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_rx_copy"); | ||||||
|  |  	if (pkt_size < rx_copybreak) { | ||||||
|  |  		struct sk_buff *new_skb; | ||||||
|  |   | ||||||
|  | +		HAIL("velocity_rx_copy (working...)"); | ||||||
|  |  		new_skb = dev_alloc_skb(pkt_size + 2); | ||||||
|  |  		if (new_skb) { | ||||||
|  |  			new_skb->dev = vptr->dev; | ||||||
|  | @@ -1360,10 +1431,12 @@ static inline int velocity_rx_copy(struc | ||||||
|  |  static inline void velocity_iph_realign(struct velocity_info *vptr, | ||||||
|  |  					struct sk_buff *skb, int pkt_size) | ||||||
|  |  { | ||||||
|  | +	HAIL("velocity_iph_realign"); | ||||||
|  |  	/* FIXME - memmove ? */ | ||||||
|  |  	if (vptr->flags & VELOCITY_FLAGS_IP_ALIGN) { | ||||||
|  |  		int i; | ||||||
|  |   | ||||||
|  | +		HAIL("velocity_iph_realign (working...)"); | ||||||
|  |  		for (i = pkt_size; i >= 0; i--) | ||||||
|  |  			*(skb->data + i + 2) = *(skb->data + i); | ||||||
|  |  		skb_reserve(skb, 2); | ||||||
|  | @@ -1382,19 +1455,27 @@ static inline void velocity_iph_realign( | ||||||
|  |  static int velocity_receive_frame(struct velocity_info *vptr, int idx) | ||||||
|  |  { | ||||||
|  |  	void (*pci_action)(struct pci_dev *, dma_addr_t, size_t, int); | ||||||
|  | +	u16 pkt_len; /* BE */ | ||||||
|  | +	u16 wRSR;    /* BE */ | ||||||
|  | +	struct sk_buff *skb; | ||||||
|  |  	struct net_device_stats *stats = &vptr->stats; | ||||||
|  |  	struct velocity_rd_info *rd_info = &(vptr->rd_info[idx]); | ||||||
|  |  	struct rx_desc *rd = &(vptr->rd_ring[idx]); | ||||||
|  | -	int pkt_len = rd->rdesc0.len; | ||||||
|  | -	struct sk_buff *skb; | ||||||
|  | +	/* int pkt_len = rd->rdesc0.len BE */; | ||||||
|  | + | ||||||
|  | +	pkt_len = ((cpu_to_le32(rd->rdesc0) >> 16) & 0x00003FFFUL); /* BE */ | ||||||
|  | +	wRSR = (u16)(cpu_to_le32(rd->rdesc0)); /* BE */ | ||||||
|  |   | ||||||
|  | -	if (rd->rdesc0.RSR & (RSR_STP | RSR_EDP)) { | ||||||
|  | +	HAIL("velocity_receive_frame"); | ||||||
|  | +	/* if (rd->rdesc0.RSR & (RSR_STP | RSR_EDP)) { BE */ | ||||||
|  | +	if (wRSR & (RSR_STP | RSR_EDP)) { /* BE */ | ||||||
|  |  		VELOCITY_PRT(MSG_LEVEL_VERBOSE, KERN_ERR " %s : the received frame span multple RDs.\n", vptr->dev->name); | ||||||
|  |  		stats->rx_length_errors++; | ||||||
|  |  		return -EINVAL; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	if (rd->rdesc0.RSR & RSR_MAR) | ||||||
|  | +	/* if (rd->rdesc0.RSR & RSR_MAR) BE */ | ||||||
|  | +	if (wRSR & RSR_MAR) /* BE */ | ||||||
|  |  		vptr->stats.multicast++; | ||||||
|  |   | ||||||
|  |  	skb = rd_info->skb; | ||||||
|  | @@ -1407,7 +1488,8 @@ static int velocity_receive_frame(struct | ||||||
|  |  	 */ | ||||||
|  |   | ||||||
|  |  	if (vptr->flags & VELOCITY_FLAGS_VAL_PKT_LEN) { | ||||||
|  | -		if (rd->rdesc0.RSR & RSR_RL) { | ||||||
|  | +		/* if (rd->rdesc0.RSR & RSR_RL) { BE */ | ||||||
|  | +		if (wRSR & RSR_RL) { /* BE */ | ||||||
|  |  			stats->rx_length_errors++; | ||||||
|  |  			return -EINVAL; | ||||||
|  |  		} | ||||||
|  | @@ -1451,6 +1533,7 @@ static int velocity_alloc_rx_buf(struct  | ||||||
|  |  	struct rx_desc *rd = &(vptr->rd_ring[idx]); | ||||||
|  |  	struct velocity_rd_info *rd_info = &(vptr->rd_info[idx]); | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_alloc_rx_buf"); | ||||||
|  |  	rd_info->skb = dev_alloc_skb(vptr->rx_buf_sz + 64); | ||||||
|  |  	if (rd_info->skb == NULL) | ||||||
|  |  		return -ENOMEM; | ||||||
|  | @@ -1468,10 +1551,14 @@ static int velocity_alloc_rx_buf(struct  | ||||||
|  |   	 */ | ||||||
|  |   | ||||||
|  |  	*((u32 *) & (rd->rdesc0)) = 0; | ||||||
|  | -	rd->len = cpu_to_le32(vptr->rx_buf_sz); | ||||||
|  | -	rd->inten = 1; | ||||||
|  | +	/* rd->len = cpu_to_le32(vptr->rx_buf_sz);		BE */ | ||||||
|  | +	/* rd->inten = 1;					BE */ | ||||||
|  |  	rd->pa_low = cpu_to_le32(rd_info->skb_dma); | ||||||
|  | -	rd->pa_high = 0; | ||||||
|  | +	/* rd->pa_high = 0;					BE */ | ||||||
|  | +	rd->ltwo &= cpu_to_le32(0xC000FFFFUL);			/* BE */ | ||||||
|  | +	rd->ltwo |= cpu_to_le32((vptr->rx_buf_sz << 16));	/* BE */ | ||||||
|  | +	rd->ltwo |= cpu_to_le32(BE_INT_ENABLE);			/* BE */ | ||||||
|  | +	rd->ltwo &= cpu_to_le32(0xFFFF0000UL);			/* BE */ | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -1492,9 +1579,11 @@ static int velocity_tx_srv(struct veloci | ||||||
|  |  	int full = 0; | ||||||
|  |  	int idx; | ||||||
|  |  	int works = 0; | ||||||
|  | +	u16 wTSR; /* BE */ | ||||||
|  |  	struct velocity_td_info *tdinfo; | ||||||
|  |  	struct net_device_stats *stats = &vptr->stats; | ||||||
|  |   | ||||||
|  | +	HAILS("velocity_tx_srv", status); | ||||||
|  |  	for (qnum = 0; qnum < vptr->num_txq; qnum++) { | ||||||
|  |  		for (idx = vptr->td_tail[qnum]; vptr->td_used[qnum] > 0; | ||||||
|  |  			idx = (idx + 1) % vptr->options.numtx) { | ||||||
|  | @@ -1505,22 +1594,29 @@ static int velocity_tx_srv(struct veloci | ||||||
|  |  			td = &(vptr->td_rings[qnum][idx]); | ||||||
|  |  			tdinfo = &(vptr->td_infos[qnum][idx]); | ||||||
|  |   | ||||||
|  | -			if (td->tdesc0.owner == OWNED_BY_NIC) | ||||||
|  | +			/* if (td->tdesc0.owner == OWNED_BY_NIC) BE */ | ||||||
|  | +			if (td->tdesc0 & cpu_to_le32(BE_OWNED_BY_NIC)) /* BE */ | ||||||
|  |  				break; | ||||||
|  |   | ||||||
|  |  			if ((works++ > 15)) | ||||||
|  |  				break; | ||||||
|  |   | ||||||
|  | -			if (td->tdesc0.TSR & TSR0_TERR) { | ||||||
|  | +			wTSR = (u16)cpu_to_le32(td->tdesc0); | ||||||
|  | +			/* if (td->tdesc0.TSR & TSR0_TERR) { BE */ | ||||||
|  | +			if (wTSR & TSR0_TERR) { /* BE */ | ||||||
|  |  				stats->tx_errors++; | ||||||
|  |  				stats->tx_dropped++; | ||||||
|  | -				if (td->tdesc0.TSR & TSR0_CDH) | ||||||
|  | +				/* if (td->tdesc0.TSR & TSR0_CDH) BE */ | ||||||
|  | +				if (wTSR & TSR0_CDH) /* BE */ | ||||||
|  |  					stats->tx_heartbeat_errors++; | ||||||
|  | -				if (td->tdesc0.TSR & TSR0_CRS) | ||||||
|  | +				/* if (td->tdesc0.TSR & TSR0_CRS) BE */ | ||||||
|  | +				if (wTSR & TSR0_CRS) /* BE */ | ||||||
|  |  					stats->tx_carrier_errors++; | ||||||
|  | -				if (td->tdesc0.TSR & TSR0_ABT) | ||||||
|  | +				/* if (td->tdesc0.TSR & TSR0_ABT) BE */ | ||||||
|  | +				if (wTSR & TSR0_ABT) /* BE */ | ||||||
|  |  					stats->tx_aborted_errors++; | ||||||
|  | -				if (td->tdesc0.TSR & TSR0_OWC) | ||||||
|  | +				/* if (td->tdesc0.TSR & TSR0_OWC) BE */ | ||||||
|  | +				if (wTSR & TSR0_OWC) /* BE */ | ||||||
|  |  					stats->tx_window_errors++; | ||||||
|  |  			} else { | ||||||
|  |  				stats->tx_packets++; | ||||||
|  | @@ -1609,6 +1705,7 @@ static void velocity_print_link_status(s | ||||||
|  |   | ||||||
|  |  static void velocity_error(struct velocity_info *vptr, int status) | ||||||
|  |  { | ||||||
|  | +	HAILS("velocity_error", status); | ||||||
|  |   | ||||||
|  |  	if (status & ISR_TXSTLI) { | ||||||
|  |  		struct mac_regs __iomem * regs = vptr->mac_regs; | ||||||
|  | @@ -1698,6 +1795,7 @@ static void velocity_free_tx_buf(struct  | ||||||
|  |  	struct sk_buff *skb = tdinfo->skb; | ||||||
|  |  	int i; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_free_tx_buf"); | ||||||
|  |  	/* | ||||||
|  |  	 *	Don't unmap the pre-allocated tx_bufs | ||||||
|  |  	 */ | ||||||
|  | @@ -1901,6 +1999,7 @@ static int velocity_xmit(struct sk_buff  | ||||||
|  |  	struct velocity_td_info *tdinfo; | ||||||
|  |  	unsigned long flags; | ||||||
|  |  	int index; | ||||||
|  | +	u32 lbufsz; /* BE */ | ||||||
|  |   | ||||||
|  |  	int pktlen = skb->len; | ||||||
|  |   | ||||||
|  | @@ -1917,9 +2016,18 @@ static int velocity_xmit(struct sk_buff  | ||||||
|  |  	td_ptr = &(vptr->td_rings[qnum][index]); | ||||||
|  |  	tdinfo = &(vptr->td_infos[qnum][index]); | ||||||
|  |   | ||||||
|  | -	td_ptr->tdesc1.TCPLS = TCPLS_NORMAL; | ||||||
|  | -	td_ptr->tdesc1.TCR = TCR0_TIC; | ||||||
|  | -	td_ptr->td_buf[0].queue = 0; | ||||||
|  | +	td_ptr->tdesc0 = 0x00000000UL;				  /* BE */ | ||||||
|  | +	td_ptr->tdesc1 = 0x00000000UL;				  /* BE */ | ||||||
|  | + | ||||||
|  | +	/* td_ptr->tdesc1.TCPLS = TCPLS_NORMAL;		BE */ | ||||||
|  | +	td_ptr->tdesc1 &= cpu_to_le32(0xfcffffffUL);		  /* BE */ | ||||||
|  | +	td_ptr->tdesc1 |= cpu_to_le32(((u32)TCPLS_NORMAL) << 24); /* BE */ | ||||||
|  | + | ||||||
|  | +	/* td_ptr->tdesc1.TCR = TCR0_TIC;		BE */ | ||||||
|  | +	td_ptr->tdesc1 |= cpu_to_le32(BE_TCR_TIC);		  /* BE */ | ||||||
|  | + | ||||||
|  | +	/*	td_ptr->td_buf[0].queue = 0;		BE */ | ||||||
|  | +	td_ptr->td_buf[0].ltwo &= cpu_to_le32(~BE_QUEUE_ENABLE);  /* BE */ | ||||||
|  |   | ||||||
|  |  	/* | ||||||
|  |  	 *	Pad short frames. | ||||||
|  | @@ -1931,20 +2039,36 @@ static int velocity_xmit(struct sk_buff  | ||||||
|  |  		memset(tdinfo->buf + skb->len, 0, ETH_ZLEN - skb->len); | ||||||
|  |  		tdinfo->skb = skb; | ||||||
|  |  		tdinfo->skb_dma[0] = tdinfo->buf_dma; | ||||||
|  | -		td_ptr->tdesc0.pktsize = pktlen; | ||||||
|  | +		/* td_ptr->tdesc0.pktsize = pktlen; */ | ||||||
|  | +		td_ptr->tdesc0 &= cpu_to_le32(0xc000ffffUL); /* BE */ | ||||||
|  | +		lbufsz = pktlen; /* Assign, and make sure it's unsigned 32 bits - BE */ | ||||||
|  | +		lbufsz = lbufsz << 16; /* BE - shift over     */ | ||||||
|  | +		td_ptr->tdesc0 |= cpu_to_le32(lbufsz); /* BE */ | ||||||
|  | + | ||||||
|  |  		td_ptr->td_buf[0].pa_low = cpu_to_le32(tdinfo->skb_dma[0]); | ||||||
|  | -		td_ptr->td_buf[0].pa_high = 0; | ||||||
|  | -		td_ptr->td_buf[0].bufsize = td_ptr->tdesc0.pktsize; | ||||||
|  | +		/* td_ptr->td_buf[0].pa_high = 0; */ | ||||||
|  | +		/* td_ptr->td_buf[0].bufsize = td_ptr->tdesc0.pktsize; */ | ||||||
|  | +		td_ptr->td_buf[0].ltwo = cpu_to_le32(lbufsz);   /* BE */ | ||||||
|  |  		tdinfo->nskb_dma = 1; | ||||||
|  | -		td_ptr->tdesc1.CMDZ = 2; | ||||||
|  | +		/* td_ptr->tdesc1.CMDZ = 2; */ | ||||||
|  | +		td_ptr->tdesc1 &= cpu_to_le32(0x0fffffffUL); /* BE */ | ||||||
|  | +		td_ptr->tdesc1 |= cpu_to_le32(((u32)0x2) << 28); /* BE */ | ||||||
|  |  	} else | ||||||
|  |  #ifdef VELOCITY_ZERO_COPY_SUPPORT | ||||||
|  | +	/* | ||||||
|  | +	 * BE - NOTE on the VELOCITY_ZERO_COPY_SUPPORT: | ||||||
|  | +	 * This block of code has NOT been patched up for BE support, as | ||||||
|  | +	 * it is certainly broken -- if it compiles at all.  Since the BE | ||||||
|  | +	 * fixes depend on the broken code, attempts to convert to BE support | ||||||
|  | +	 * would almost certainly confuse more than help. | ||||||
|  | +	 */ | ||||||
|  |  	if (skb_shinfo(skb)->nr_frags > 0) { | ||||||
|  |  		int nfrags = skb_shinfo(skb)->nr_frags; | ||||||
|  |  		tdinfo->skb = skb; | ||||||
|  |  		if (nfrags > 6) { | ||||||
|  |  			skb_copy_from_linear_data(skb, tdinfo->buf, skb->len); | ||||||
|  |  			tdinfo->skb_dma[0] = tdinfo->buf_dma; | ||||||
|  | +			/* BE: Er, exactly what value are we assigning in this next line? */ | ||||||
|  |  			td_ptr->tdesc0.pktsize = | ||||||
|  |  			td_ptr->td_buf[0].pa_low = cpu_to_le32(tdinfo->skb_dma[0]); | ||||||
|  |  			td_ptr->td_buf[0].pa_high = 0; | ||||||
|  | @@ -1961,6 +2085,7 @@ static int velocity_xmit(struct sk_buff  | ||||||
|  |  			/* FIXME: support 48bit DMA later */ | ||||||
|  |  			td_ptr->td_buf[i].pa_low = cpu_to_le32(tdinfo->skb_dma); | ||||||
|  |  			td_ptr->td_buf[i].pa_high = 0; | ||||||
|  | +			/* BE: This next line can't be right: */ | ||||||
|  |  			td_ptr->td_buf[i].bufsize = skb->len->skb->data_len; | ||||||
|  |   | ||||||
|  |  			for (i = 0; i < nfrags; i++) { | ||||||
|  | @@ -1978,7 +2103,7 @@ static int velocity_xmit(struct sk_buff  | ||||||
|  |  		} | ||||||
|  |   | ||||||
|  |  	} else | ||||||
|  | -#endif | ||||||
|  | +#endif /* (broken) VELOCITY_ZERO_COPY_SUPPORT */ | ||||||
|  |  	{ | ||||||
|  |  		/* | ||||||
|  |  		 *	Map the linear network buffer into PCI space and | ||||||
|  | @@ -1986,19 +2111,30 @@ static int velocity_xmit(struct sk_buff  | ||||||
|  |  		 */ | ||||||
|  |  		tdinfo->skb = skb; | ||||||
|  |  		tdinfo->skb_dma[0] = pci_map_single(vptr->pdev, skb->data, pktlen, PCI_DMA_TODEVICE); | ||||||
|  | -		td_ptr->tdesc0.pktsize = pktlen; | ||||||
|  | +		/* td_ptr->tdesc0.pktsize = pktlen;			BE */ | ||||||
|  | +		td_ptr->tdesc0 &= cpu_to_le32(0xc000ffffUL);	/* BE */ | ||||||
|  | +		lbufsz = pktlen; /* Assign, and make sure it's unsigned 32 bits - BE */ | ||||||
|  | +		lbufsz = lbufsz << 16;				/* BE */ | ||||||
|  | +		td_ptr->tdesc0 |= cpu_to_le32(lbufsz);		/* BE */ | ||||||
|  |  		td_ptr->td_buf[0].pa_low = cpu_to_le32(tdinfo->skb_dma[0]); | ||||||
|  | -		td_ptr->td_buf[0].pa_high = 0; | ||||||
|  | -		td_ptr->td_buf[0].bufsize = td_ptr->tdesc0.pktsize; | ||||||
|  | +		/* td_ptr->td_buf[0].pa_high = 0;			BE */ | ||||||
|  | +		/* td_ptr->td_buf[0].bufsize = td_ptr->tdesc0.pktsize;	BE */ | ||||||
|  | +		td_ptr->td_buf[0].ltwo = cpu_to_le32(lbufsz);	/* BE */ | ||||||
|  | + | ||||||
|  |  		tdinfo->nskb_dma = 1; | ||||||
|  | -		td_ptr->tdesc1.CMDZ = 2; | ||||||
|  | +		/* td_ptr->tdesc1.CMDZ = 2;				BE */ | ||||||
|  | +		td_ptr->tdesc1 &= cpu_to_le32(0x0fffffffUL);	/* BE */ | ||||||
|  | +		td_ptr->tdesc1 |= cpu_to_le32(((u32)0x2) << 28);/* BE */ | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	if (vptr->flags & VELOCITY_FLAGS_TAGGING) { | ||||||
|  | -		td_ptr->tdesc1.pqinf.VID = (vptr->options.vid & 0xfff); | ||||||
|  | -		td_ptr->tdesc1.pqinf.priority = 0; | ||||||
|  | -		td_ptr->tdesc1.pqinf.CFI = 0; | ||||||
|  | -		td_ptr->tdesc1.TCR |= TCR0_VETAG; | ||||||
|  | +		/* td_ptr->tdesc1.pqinf.priority = 0;			BE */ | ||||||
|  | +		/* td_ptr->tdesc1.pqinf.CFI = 0;			BE */ | ||||||
|  | +		td_ptr->tdesc1 &= cpu_to_le32(0xFFFF0000UL);	/* BE */ | ||||||
|  | +		/* td_ptr->tdesc1.pqinf.VID = (vptr->options.vid & 0xfff); BE */ | ||||||
|  | +		td_ptr->tdesc1 |= cpu_to_le32((vptr->options.vid & 0xfff)); /* BE */ | ||||||
|  | +		/* td_ptr->tdesc1.TCR |= TCR0_VETAG;			BE */ | ||||||
|  | +		td_ptr->tdesc1 |= cpu_to_le32(BE_TCR_VETAG);	/* BE */ | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	/* | ||||||
|  | @@ -2008,26 +2144,34 @@ static int velocity_xmit(struct sk_buff  | ||||||
|  |  				 && (skb->ip_summed == CHECKSUM_PARTIAL)) { | ||||||
|  |  		const struct iphdr *ip = ip_hdr(skb); | ||||||
|  |  		if (ip->protocol == IPPROTO_TCP) | ||||||
|  | -			td_ptr->tdesc1.TCR |= TCR0_TCPCK; | ||||||
|  | +			/* td_ptr->tdesc1.TCR |= TCR0_TCPCK;	BE */ | ||||||
|  | +			td_ptr->tdesc1 |= cpu_to_le32(BE_TCR_TCPCK);	/* BE */ | ||||||
|  |  		else if (ip->protocol == IPPROTO_UDP) | ||||||
|  | -			td_ptr->tdesc1.TCR |= (TCR0_UDPCK); | ||||||
|  | -		td_ptr->tdesc1.TCR |= TCR0_IPCK; | ||||||
|  | -	} | ||||||
|  | +			/* td_ptr->tdesc1.TCR |= (TCR0_UDPCK);	BE */ | ||||||
|  | +			td_ptr->tdesc1 |= cpu_to_le32(BE_TCR_UDPCK);	/* BE */ | ||||||
|  | +		/* td_ptr->tdesc1.TCR |= TCR0_IPCK;		BE */ | ||||||
|  | +		td_ptr->tdesc1 |= cpu_to_le32(BE_TCR_IPCK);		/* BE */ | ||||||
|  | + 	} | ||||||
|  |  	{ | ||||||
|  |   | ||||||
|  |  		int prev = index - 1; | ||||||
|  |   | ||||||
|  |  		if (prev < 0) | ||||||
|  |  			prev = vptr->options.numtx - 1; | ||||||
|  | -		td_ptr->tdesc0.owner = OWNED_BY_NIC; | ||||||
|  | +		/* td_ptr->tdesc0.owner = OWNED_BY_NIC; BE */ | ||||||
|  | +		td_ptr->tdesc0 |= cpu_to_le32(BE_OWNED_BY_NIC); /* BE */ | ||||||
|  |  		vptr->td_used[qnum]++; | ||||||
|  |  		vptr->td_curr[qnum] = (index + 1) % vptr->options.numtx; | ||||||
|  |   | ||||||
|  |  		if (AVAIL_TD(vptr, qnum) < 1) | ||||||
|  |  			netif_stop_queue(dev); | ||||||
|  |   | ||||||
|  | -		td_ptr = &(vptr->td_rings[qnum][prev]); | ||||||
|  | -		td_ptr->td_buf[0].queue = 1; | ||||||
|  | + 		td_ptr = &(vptr->td_rings[qnum][prev]); | ||||||
|  | + 		/* td_ptr->td_buf[0].queue = 1; BE */ | ||||||
|  | + 		td_ptr->td_buf[0].ltwo |= cpu_to_le32(BE_QUEUE_ENABLE); /* BE */ | ||||||
|  | +		if (vdebug&2) printk(KERN_NOTICE "velocity_xmit: (%s) len=%d idx=%d tdesc0=0x%x tdesc1=0x%x ltwo=0x%x\n", | ||||||
|  | +			(pktlen<ETH_ZLEN) ? "short" : "normal", pktlen, index, | ||||||
|  | +			td_ptr->tdesc0, td_ptr->tdesc1, td_ptr->td_buf[0].ltwo); | ||||||
|  |  		mac_tx_queue_wake(vptr->mac_regs, qnum); | ||||||
|  |  	} | ||||||
|  |  	dev->trans_start = jiffies; | ||||||
|  | @@ -2053,7 +2197,7 @@ static int velocity_intr(int irq, void * | ||||||
|  |  	u32 isr_status; | ||||||
|  |  	int max_count = 0; | ||||||
|  |   | ||||||
|  | - | ||||||
|  | +	HAIL("velocity_intr"); | ||||||
|  |  	spin_lock(&vptr->lock); | ||||||
|  |  	isr_status = mac_read_isr(vptr->mac_regs); | ||||||
|  |   | ||||||
|  | @@ -2072,7 +2216,10 @@ static int velocity_intr(int irq, void * | ||||||
|  |   | ||||||
|  |  	while (isr_status != 0) { | ||||||
|  |  		mac_write_isr(vptr->mac_regs, isr_status); | ||||||
|  | -		if (isr_status & (~(ISR_PRXI | ISR_PPRXI | ISR_PTXI | ISR_PPTXI))) | ||||||
|  | +		HAILS("velocity_intr",isr_status); | ||||||
|  | +		/* MJW - velocity_error is ALWAYS called; need to mask off some other flags */ | ||||||
|  | +		/* if (isr_status & (~(ISR_PRXI | ISR_PPRXI | ISR_PTXI | ISR_PPTXI))) */ | ||||||
|  | +		if (isr_status & (~(ISR_PRXI | ISR_PPRXI | ISR_PTXI | ISR_PPTXI | ISR_PTX0I | ISR_ISR0))) | ||||||
|  |  			velocity_error(vptr, isr_status); | ||||||
|  |  		if (isr_status & (ISR_PRXI | ISR_PPRXI)) | ||||||
|  |  			max_count += velocity_rx_srv(vptr, isr_status); | ||||||
|  | @@ -2110,6 +2257,7 @@ static void velocity_set_multi(struct ne | ||||||
|  |  	int i; | ||||||
|  |  	struct dev_mc_list *mclist; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_set_multi"); | ||||||
|  |  	if (dev->flags & IFF_PROMISC) {	/* Set promiscuous. */ | ||||||
|  |  		writel(0xffffffff, ®s->MARCAM[0]); | ||||||
|  |  		writel(0xffffffff, ®s->MARCAM[4]); | ||||||
|  | @@ -2153,6 +2301,7 @@ static struct net_device_stats *velocity | ||||||
|  |  { | ||||||
|  |  	struct velocity_info *vptr = netdev_priv(dev); | ||||||
|  |   | ||||||
|  | +	HAIL("net_device_stats"); | ||||||
|  |  	/* If the hardware is down, don't touch MII */ | ||||||
|  |  	if(!netif_running(dev)) | ||||||
|  |  		return &vptr->stats; | ||||||
|  | @@ -2197,6 +2346,7 @@ static int velocity_ioctl(struct net_dev | ||||||
|  |  	struct velocity_info *vptr = netdev_priv(dev); | ||||||
|  |  	int ret; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_ioctl"); | ||||||
|  |  	/* If we are asked for information and the device is power | ||||||
|  |  	   saving then we need to bring the device back up to talk to it */ | ||||||
|  |   | ||||||
|  | @@ -2415,6 +2565,7 @@ static int velocity_mii_read(struct mac_ | ||||||
|  |  { | ||||||
|  |  	u16 ww; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_mii_read"); | ||||||
|  |  	/* | ||||||
|  |  	 *	Disable MIICR_MAUTO, so that mii addr can be set normally | ||||||
|  |  	 */ | ||||||
|  | @@ -2451,6 +2602,7 @@ static int velocity_mii_write(struct mac | ||||||
|  |  { | ||||||
|  |  	u16 ww; | ||||||
|  |   | ||||||
|  | +	HAIL("velocity_mii_write"); | ||||||
|  |  	/* | ||||||
|  |  	 *	Disable MIICR_MAUTO, so that mii addr can be set normally | ||||||
|  |  	 */ | ||||||
|  | diff -uprN linux-2.6.23.orig/drivers/net/via-velocity.h linux-2.6.23/drivers/net/via-velocity.h | ||||||
|  | --- linux-2.6.23.orig/drivers/net/via-velocity.h	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/drivers/net/via-velocity.h	2007-10-11 00:53:45.000000000 -0500 | ||||||
|  | @@ -196,64 +196,70 @@ | ||||||
|  |   *	Receive descriptor | ||||||
|  |   */ | ||||||
|  |   | ||||||
|  | -struct rdesc0 { | ||||||
|  | -	u16 RSR;		/* Receive status */ | ||||||
|  | -	u16 len:14;		/* Received packet length */ | ||||||
|  | -	u16 reserved:1; | ||||||
|  | -	u16 owner:1;		/* Who owns this buffer ? */ | ||||||
|  | -}; | ||||||
|  | - | ||||||
|  | -struct rdesc1 { | ||||||
|  | -	u16 PQTAG; | ||||||
|  | -	u8 CSM; | ||||||
|  | -	u8 IPKT; | ||||||
|  | -}; | ||||||
|  | +//struct rdesc0 { | ||||||
|  | +//	u16 RSR;		/* Receive status */ | ||||||
|  | +//	u16 len:14;		/* Received packet length */ | ||||||
|  | +//	u16 reserved:1; | ||||||
|  | +//	u16 owner:1;		/* Who owns this buffer ? */ | ||||||
|  | +//}; | ||||||
|  | + | ||||||
|  | +//struct rdesc1 { | ||||||
|  | +//	u16 PQTAG; | ||||||
|  | +//	u8 CSM; | ||||||
|  | +//	u8 IPKT; | ||||||
|  | +//}; | ||||||
|  |   | ||||||
|  |  struct rx_desc { | ||||||
|  | -	struct rdesc0 rdesc0; | ||||||
|  | -	struct rdesc1 rdesc1; | ||||||
|  | +//	struct rdesc0 rdesc0; | ||||||
|  | +//	struct rdesc1 rdesc1; | ||||||
|  | +	u32 rdesc0; | ||||||
|  | +	u32 rdesc1; | ||||||
|  |  	u32 pa_low;		/* Low 32 bit PCI address */ | ||||||
|  | -	u16 pa_high;		/* Next 16 bit PCI address (48 total) */ | ||||||
|  | -	u16 len:15;		/* Frame size */ | ||||||
|  | -	u16 inten:1;		/* Enable interrupt */ | ||||||
|  | +//	u16 pa_high;		/* Next 16 bit PCI address (48 total) */ | ||||||
|  | +//	u16 len:15;		/* Frame size */ | ||||||
|  | +//	u16 inten:1;		/* Enable interrupt */ | ||||||
|  | +	u32 ltwo; | ||||||
|  |  } __attribute__ ((__packed__)); | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  |   *	Transmit descriptor | ||||||
|  |   */ | ||||||
|  |   | ||||||
|  | -struct tdesc0 { | ||||||
|  | -	u16 TSR;		/* Transmit status register */ | ||||||
|  | -	u16 pktsize:14;		/* Size of frame */ | ||||||
|  | -	u16 reserved:1; | ||||||
|  | -	u16 owner:1;		/* Who owns the buffer */ | ||||||
|  | -}; | ||||||
|  | - | ||||||
|  | -struct pqinf {			/* Priority queue info */ | ||||||
|  | -	u16 VID:12; | ||||||
|  | -	u16 CFI:1; | ||||||
|  | -	u16 priority:3; | ||||||
|  | -} __attribute__ ((__packed__)); | ||||||
|  | - | ||||||
|  | -struct tdesc1 { | ||||||
|  | -	struct pqinf pqinf; | ||||||
|  | -	u8 TCR; | ||||||
|  | -	u8 TCPLS:2; | ||||||
|  | -	u8 reserved:2; | ||||||
|  | -	u8 CMDZ:4; | ||||||
|  | -} __attribute__ ((__packed__)); | ||||||
|  | +//struct tdesc0 { | ||||||
|  | +//	u16 TSR;		/* Transmit status register */ | ||||||
|  | +//	u16 pktsize:14;		/* Size of frame */ | ||||||
|  | +//	u16 reserved:1; | ||||||
|  | +//	u16 owner:1;		/* Who owns the buffer */ | ||||||
|  | +//}; | ||||||
|  | + | ||||||
|  | +//struct pqinf {			/* Priority queue info */ | ||||||
|  | +//	u16 VID:12; | ||||||
|  | +//	u16 CFI:1; | ||||||
|  | +//	u16 priority:3; | ||||||
|  | +//} __attribute__ ((__packed__)); | ||||||
|  | + | ||||||
|  | +//struct tdesc1 { | ||||||
|  | +//	struct pqinf pqinf; | ||||||
|  | +//	u8 TCR; | ||||||
|  | +//	u8 TCPLS:2; | ||||||
|  | +//	u8 reserved:2; | ||||||
|  | +//	u8 CMDZ:4; | ||||||
|  | +//} __attribute__ ((__packed__)); | ||||||
|  |   | ||||||
|  |  struct td_buf { | ||||||
|  |  	u32 pa_low; | ||||||
|  | -	u16 pa_high; | ||||||
|  | -	u16 bufsize:14; | ||||||
|  | -	u16 reserved:1; | ||||||
|  | -	u16 queue:1; | ||||||
|  | +//	u16 pa_high; | ||||||
|  | +//	u16 bufsize:14; | ||||||
|  | +//	u16 reserved:1; | ||||||
|  | +//	u16 queue:1; | ||||||
|  | +	u32 ltwo; | ||||||
|  |  } __attribute__ ((__packed__)); | ||||||
|  |   | ||||||
|  |  struct tx_desc { | ||||||
|  | -	struct tdesc0 tdesc0; | ||||||
|  | -	struct tdesc1 tdesc1; | ||||||
|  | +//	struct tdesc0 tdesc0; | ||||||
|  | +//	struct tdesc1 tdesc1; | ||||||
|  | +	u32 tdesc0; | ||||||
|  | +	u32 tdesc1; | ||||||
|  |  	struct td_buf td_buf[7]; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | @@ -279,6 +285,16 @@ enum  velocity_owner { | ||||||
|  |  	OWNED_BY_NIC = 1 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Constants added for the BE fixes */ | ||||||
|  | +#define BE_OWNED_BY_NIC    0x80000000UL | ||||||
|  | +#define BE_INT_ENABLE      0x80000000UL | ||||||
|  | +#define BE_QUEUE_ENABLE    0x80000000UL | ||||||
|  | +#define BE_TCR_TIC         0x00800000UL | ||||||
|  | +#define BE_TCR_VETAG       0x00200000UL | ||||||
|  | +#define BE_TCR_TCPCK       0x00040000UL | ||||||
|  | +#define BE_TCR_UDPCK       0x00080000UL | ||||||
|  | +#define BE_TCR_IPCK        0x00100000UL | ||||||
|  | + | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  |   *	MAC registers and macros. | ||||||
|  | @@ -1698,6 +1714,7 @@ enum velocity_flow_cntl_type { | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  struct velocity_opt { | ||||||
|  | +	int velo_debug;                 /* debug flag */ | ||||||
|  |  	int numrx;			/* Number of RX descriptors */ | ||||||
|  |  	int numtx;			/* Number of TX descriptors */ | ||||||
|  |  	enum speed_opt spd_dpx;		/* Media link mode */ | ||||||
							
								
								
									
										411
									
								
								target/linux/ixp4xx/patches-2.6.23/013-fsg3_support.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										411
									
								
								target/linux/ixp4xx/patches-2.6.23/013-fsg3_support.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,411 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/mach-ixp4xx/fsg-pci.c linux-2.6.23/arch/arm/mach-ixp4xx/fsg-pci.c | ||||||
|  | --- linux-2.6.23.orig/arch/arm/mach-ixp4xx/fsg-pci.c	1969-12-31 18:00:00.000000000 -0600 | ||||||
|  | +++ linux-2.6.23/arch/arm/mach-ixp4xx/fsg-pci.c	2007-10-11 00:55:34.000000000 -0500 | ||||||
|  | @@ -0,0 +1,71 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arch/mach-ixp4xx/fsg-pci.c | ||||||
|  | + * | ||||||
|  | + * FSG board-level PCI initialization | ||||||
|  | + * | ||||||
|  | + * Author: Rod Whitby <rod@whitby.id.au> | ||||||
|  | + * Maintainer: http://www.nslu2-linux.org/ | ||||||
|  | + * | ||||||
|  | + * based on ixdp425-pci.c: | ||||||
|  | + *	Copyright (C) 2002 Intel Corporation. | ||||||
|  | + *	Copyright (C) 2003-2004 MontaVista Software, Inc. | ||||||
|  | + * | ||||||
|  | + * This program is free software; you can redistribute it and/or modify | ||||||
|  | + * it under the terms of the GNU General Public License version 2 as | ||||||
|  | + * published by the Free Software Foundation. | ||||||
|  | + * | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/pci.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/irq.h> | ||||||
|  | + | ||||||
|  | +#include <asm/mach/pci.h> | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | + | ||||||
|  | +void __init fsg_pci_preinit(void) | ||||||
|  | +{ | ||||||
|  | +	set_irq_type(IRQ_FSG_PCI_INTA, IRQT_LOW); | ||||||
|  | +	set_irq_type(IRQ_FSG_PCI_INTB, IRQT_LOW); | ||||||
|  | +	set_irq_type(IRQ_FSG_PCI_INTC, IRQT_LOW); | ||||||
|  | + | ||||||
|  | +	ixp4xx_pci_preinit(); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int __init fsg_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||||||
|  | +{ | ||||||
|  | +	static int pci_irq_table[FSG_PCI_IRQ_LINES] = { | ||||||
|  | +		IRQ_FSG_PCI_INTC, | ||||||
|  | +		IRQ_FSG_PCI_INTB, | ||||||
|  | +		IRQ_FSG_PCI_INTA, | ||||||
|  | +	}; | ||||||
|  | + | ||||||
|  | +	int irq = -1; | ||||||
|  | +	slot = slot - 11; | ||||||
|  | + | ||||||
|  | +	if (slot >= 1 && slot <= FSG_PCI_MAX_DEV && | ||||||
|  | +		pin >= 1 && pin <= FSG_PCI_IRQ_LINES) { | ||||||
|  | +			irq = pci_irq_table[(slot - 1)]; | ||||||
|  | +	} | ||||||
|  | +        printk("%s: Mapped slot %d pin %d to IRQ %d\n", __FUNCTION__,slot, pin, irq); | ||||||
|  | + | ||||||
|  | +        return irq; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +struct hw_pci fsg_pci __initdata = { | ||||||
|  | +	.nr_controllers = 1, | ||||||
|  | +	.preinit =        fsg_pci_preinit, | ||||||
|  | +	.swizzle =        pci_std_swizzle, | ||||||
|  | +	.setup =          ixp4xx_setup, | ||||||
|  | +	.scan =           ixp4xx_scan_bus, | ||||||
|  | +	.map_irq =        fsg_map_irq, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +int __init fsg_pci_init(void) | ||||||
|  | +{ | ||||||
|  | +	if (machine_is_fsg()) | ||||||
|  | +		pci_common_init(&fsg_pci); | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +subsys_initcall(fsg_pci_init); | ||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/mach-ixp4xx/fsg-setup.c linux-2.6.23/arch/arm/mach-ixp4xx/fsg-setup.c | ||||||
|  | --- linux-2.6.23.orig/arch/arm/mach-ixp4xx/fsg-setup.c	1969-12-31 18:00:00.000000000 -0600 | ||||||
|  | +++ linux-2.6.23/arch/arm/mach-ixp4xx/fsg-setup.c	2007-10-11 00:55:34.000000000 -0500 | ||||||
|  | @@ -0,0 +1,186 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arm/mach-ixp4xx/fsg-setup.c | ||||||
|  | + * | ||||||
|  | + * FSG board-setup | ||||||
|  | + * | ||||||
|  | + * based ixdp425-setup.c: | ||||||
|  | + *      Copyright (C) 2003-2004 MontaVista Software, Inc. | ||||||
|  | + * | ||||||
|  | + * Author: Rod Whitby <rod@whitby.id.au> | ||||||
|  | + * Maintainers: http://www.nslu2-linux.org/ | ||||||
|  | + * | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/serial.h> | ||||||
|  | +#include <linux/serial_8250.h> | ||||||
|  | +#include <linux/leds.h> | ||||||
|  | +#include <linux/i2c-gpio.h> | ||||||
|  | + | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | +#include <asm/mach/arch.h> | ||||||
|  | +#include <asm/mach/flash.h> | ||||||
|  | + | ||||||
|  | +static struct flash_platform_data fsg_flash_data = { | ||||||
|  | +	.map_name		= "cfi_probe", | ||||||
|  | +	.width			= 2, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource fsg_flash_resource = { | ||||||
|  | +	.flags			= IORESOURCE_MEM, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device fsg_flash = { | ||||||
|  | +	.name			= "IXP4XX-Flash", | ||||||
|  | +	.id			= 0, | ||||||
|  | +	.dev.platform_data	= &fsg_flash_data, | ||||||
|  | +	.num_resources		= 1, | ||||||
|  | +	.resource		= &fsg_flash_resource, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct i2c_gpio_platform_data fsg_i2c_gpio_data = { | ||||||
|  | +	.sda_pin		= FSG_SDA_PIN, | ||||||
|  | +	.scl_pin		= FSG_SCL_PIN, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device fsg_i2c_gpio = { | ||||||
|  | +	.name			= "i2c-gpio", | ||||||
|  | +	.id			= 0, | ||||||
|  | +	.dev	 = { | ||||||
|  | +		.platform_data	= &fsg_i2c_gpio_data, | ||||||
|  | +	}, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +#ifdef CONFIG_LEDS_CLASS | ||||||
|  | +static struct resource fsg_led_resources[] = { | ||||||
|  | +	{ | ||||||
|  | +		.name           = "ring", | ||||||
|  | +		.start          = FSG_LED_RING_GPIO, | ||||||
|  | +		.end            = FSG_LED_RING_GPIO, | ||||||
|  | +		.flags          = IXP4XX_GPIO_HIGH, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.name           = "sync", | ||||||
|  | +		.start          = FSG_LED_SYNC_GPIO, | ||||||
|  | +		.end            = FSG_LED_SYNC_GPIO, | ||||||
|  | +		.flags          = IXP4XX_GPIO_HIGH, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.name           = "usb", | ||||||
|  | +		.start          = FSG_LED_USB_GPIO, | ||||||
|  | +		.end            = FSG_LED_USB_GPIO, | ||||||
|  | +		.flags          = IXP4XX_GPIO_HIGH, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.name           = "sata", | ||||||
|  | +		.start          = FSG_LED_SATA_GPIO, | ||||||
|  | +		.end            = FSG_LED_SATA_GPIO, | ||||||
|  | +		.flags          = IXP4XX_GPIO_HIGH, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.name           = "wan", | ||||||
|  | +		.start          = FSG_LED_WAN_GPIO, | ||||||
|  | +		.end            = FSG_LED_WAN_GPIO, | ||||||
|  | +		.flags          = IXP4XX_GPIO_HIGH, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.name           = "wlan", | ||||||
|  | +		.start          = FSG_LED_WLAN_GPIO, | ||||||
|  | +		.end            = FSG_LED_WLAN_GPIO, | ||||||
|  | +		.flags          = IXP4XX_GPIO_HIGH, | ||||||
|  | +	}, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device fsg_leds = { | ||||||
|  | +        .name                   = "IXP4XX-GPIO-LED", | ||||||
|  | +        .id                     = -1, | ||||||
|  | +        .num_resources          = ARRAY_SIZE(fsg_led_resources), | ||||||
|  | +        .resource               = fsg_led_resources, | ||||||
|  | +}; | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  | +static struct resource fsg_uart_resources[] = { | ||||||
|  | +	{ | ||||||
|  | +		.start		= IXP4XX_UART1_BASE_PHYS, | ||||||
|  | +		.end		= IXP4XX_UART1_BASE_PHYS + 0x0fff, | ||||||
|  | +		.flags		= IORESOURCE_MEM, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.start		= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +		.end		= IXP4XX_UART2_BASE_PHYS + 0x0fff, | ||||||
|  | +		.flags		= IORESOURCE_MEM, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct plat_serial8250_port fsg_uart_data[] = { | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART1_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART1, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART2, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ } | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device fsg_uart = { | ||||||
|  | +	.name			= "serial8250", | ||||||
|  | +	.id			= PLAT8250_DEV_PLATFORM, | ||||||
|  | +	.dev.platform_data	= fsg_uart_data, | ||||||
|  | +	.num_resources		= ARRAY_SIZE(fsg_uart_resources), | ||||||
|  | +	.resource		= fsg_uart_resources, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device *fsg_devices[] __initdata = { | ||||||
|  | +	&fsg_i2c_gpio, | ||||||
|  | +	&fsg_flash, | ||||||
|  | +#ifdef CONFIG_LEDS_IXP4XX | ||||||
|  | +	&fsg_leds, | ||||||
|  | +#endif | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static void __init fsg_init(void) | ||||||
|  | +{ | ||||||
|  | +	ixp4xx_sys_init(); | ||||||
|  | + | ||||||
|  | +	fsg_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | ||||||
|  | +	fsg_flash_resource.end = | ||||||
|  | +		IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; | ||||||
|  | + | ||||||
|  | +        *IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; | ||||||
|  | +        *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; | ||||||
|  | + | ||||||
|  | +	/* Configure CS2 for operation, 8bit and writable */ | ||||||
|  | +	*IXP4XX_EXP_CS2 = 0xbfff0002; | ||||||
|  | + | ||||||
|  | +	/* This is only useful on a modified machine, but it is valuable | ||||||
|  | +	 * to have it first in order to see debug messages, and so that | ||||||
|  | +	 * it does *not* get removed if platform_add_devices fails! | ||||||
|  | +	 */ | ||||||
|  | +	(void)platform_device_register(&fsg_uart); | ||||||
|  | + | ||||||
|  | +	platform_add_devices(fsg_devices, ARRAY_SIZE(fsg_devices)); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +MACHINE_START(FSG, "Freecom FSG-3") | ||||||
|  | +	/* Maintainer: www.nslu2-linux.org */ | ||||||
|  | +	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  | +	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, | ||||||
|  | +	.map_io		= ixp4xx_map_io, | ||||||
|  | +	.init_irq	= ixp4xx_init_irq, | ||||||
|  | +	.timer		= &ixp4xx_timer, | ||||||
|  | +	.boot_params	= 0x0100, | ||||||
|  | +	.init_machine	= fsg_init, | ||||||
|  | +MACHINE_END | ||||||
|  | + | ||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/mach-ixp4xx/Kconfig linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig | ||||||
|  | --- linux-2.6.23.orig/arch/arm/mach-ixp4xx/Kconfig	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig	2007-10-11 00:55:34.000000000 -0500 | ||||||
|  | @@ -125,6 +125,15 @@ config	ARCH_IXDP4XX | ||||||
|  |  	depends on ARCH_IXDP425 || MACH_IXDP465 || MACH_KIXRP435 | ||||||
|  |  	default y | ||||||
|  |   | ||||||
|  | +config MACH_FSG | ||||||
|  | +	bool | ||||||
|  | +	prompt "Freecom FSG-3" | ||||||
|  | +	select PCI | ||||||
|  | +	help | ||||||
|  | +	  Say 'Y' here if you want your kernel to support Freecom's | ||||||
|  | +	  FSG-3 device. For more information on this platform | ||||||
|  | +	  see http://www.nslu2-linux.org/wiki/FSG3/HomePage | ||||||
|  | + | ||||||
|  |  # | ||||||
|  |  # Certain registers and IRQs are only enabled if supporting IXP465 CPUs | ||||||
|  |  # | ||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/mach-ixp4xx/Makefile linux-2.6.23/arch/arm/mach-ixp4xx/Makefile | ||||||
|  | --- linux-2.6.23.orig/arch/arm/mach-ixp4xx/Makefile	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/arch/arm/mach-ixp4xx/Makefile	2007-10-11 00:55:34.000000000 -0500 | ||||||
|  | @@ -15,6 +15,7 @@ obj-pci-$(CONFIG_MACH_NAS100D)		+= nas10 | ||||||
|  |  obj-pci-$(CONFIG_MACH_DSMG600)		+= dsmg600-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_GATEWAY7001)	+= gateway7001-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_WG302V2)		+= wg302v2-pci.o | ||||||
|  | +obj-pci-$(CONFIG_MACH_FSG)		+= fsg-pci.o | ||||||
|  |   | ||||||
|  |  obj-y	+= common.o | ||||||
|  |   | ||||||
|  | @@ -28,5 +29,6 @@ obj-$(CONFIG_MACH_NAS100D)	+= nas100d-se | ||||||
|  |  obj-$(CONFIG_MACH_DSMG600)      += dsmg600-setup.o dsmg600-power.o | ||||||
|  |  obj-$(CONFIG_MACH_GATEWAY7001)	+= gateway7001-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_WG302V2)	+= wg302v2-setup.o | ||||||
|  | +obj-$(CONFIG_MACH_FSG)		+= fsg-setup.o | ||||||
|  |   | ||||||
|  |  obj-$(CONFIG_PCI)		+= $(obj-pci-$(CONFIG_PCI)) common-pci.o | ||||||
|  | diff -uprN linux-2.6.23.orig/include/asm-arm/arch-ixp4xx/fsg.h linux-2.6.23/include/asm-arm/arch-ixp4xx/fsg.h | ||||||
|  | --- linux-2.6.23.orig/include/asm-arm/arch-ixp4xx/fsg.h	1969-12-31 18:00:00.000000000 -0600 | ||||||
|  | +++ linux-2.6.23/include/asm-arm/arch-ixp4xx/fsg.h	2007-10-11 00:55:34.000000000 -0500 | ||||||
|  | @@ -0,0 +1,74 @@ | ||||||
|  | +/* | ||||||
|  | + * include/asm-arm/arch-ixp4xx/fsg.h | ||||||
|  | + * | ||||||
|  | + * Freecom FSG-3 platform specific definitions | ||||||
|  | + * | ||||||
|  | + * Author: Rod Whitby <rod@whitby.id.au> | ||||||
|  | + * Author: Tomasz Chmielewski <mangoo@wpkg.org> | ||||||
|  | + * Maintainers: http://www.nslu2-linux.org | ||||||
|  | + * | ||||||
|  | + * Based on coyote.h by | ||||||
|  | + * Copyright 2004 (c) MontaVista, Software, Inc. | ||||||
|  | + * | ||||||
|  | + * This file is licensed under  the terms of the GNU General Public | ||||||
|  | + * License version 2. This program is licensed "as is" without any | ||||||
|  | + * warranty of any kind, whether express or implied. | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#ifndef __ASM_ARCH_HARDWARE_H__ | ||||||
|  | +#error "Do not include this directly, instead #include <asm/hardware.h>" | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  | +#define FSG_SDA_PIN		12 | ||||||
|  | +#define FSG_SCL_PIN		13 | ||||||
|  | + | ||||||
|  | +/* | ||||||
|  | + * FSG PCI IRQs | ||||||
|  | + */ | ||||||
|  | +#define FSG_PCI_MAX_DEV		3 | ||||||
|  | +#define FSG_PCI_IRQ_LINES	3 | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +/* PCI controller GPIO to IRQ pin mappings */ | ||||||
|  | +#define FSG_PCI_INTA_PIN	6 | ||||||
|  | +#define FSG_PCI_INTB_PIN	7 | ||||||
|  | +#define FSG_PCI_INTC_PIN	5 | ||||||
|  | + | ||||||
|  | +/* Buttons */ | ||||||
|  | + | ||||||
|  | +#define FSG_SB_GPIO		4 | ||||||
|  | +#define FSG_RB_GPIO		9 | ||||||
|  | +#define FSG_UB_GPIO		10 | ||||||
|  | + | ||||||
|  | +#define FSG_SB_IRQ		IRQ_IXP4XX_GPIO4 | ||||||
|  | +#define FSG_RB_IRQ		IRQ_IXP4XX_GPIO9 | ||||||
|  | +#define FSG_UB_IRQ		IRQ_IXP4XX_GPIO10 | ||||||
|  | + | ||||||
|  | +#define FSG_SB_BM		(1L << FSG_SB_GPIO) | ||||||
|  | +#define FSG_RB_BM		(1L << FSG_RB_GPIO) | ||||||
|  | +#define FSG_UB_BM		(1L << FSG_UB_GPIO) | ||||||
|  | + | ||||||
|  | +/* LEDs */ | ||||||
|  | + | ||||||
|  | +#define FSG_LED_RING_GPIO	0 | ||||||
|  | +#define FSG_LED_SYNC_GPIO	1 | ||||||
|  | +#define FSG_LED_USB_GPIO	2 | ||||||
|  | +#define FSG_LED_SATA_GPIO	3 | ||||||
|  | +#define FSG_LED_WAN_GPIO	4 | ||||||
|  | +#define FSG_LED_WLAN_GPIO	5 | ||||||
|  | + | ||||||
|  | +/* %%% REMOVE %%% | ||||||
|  | +#define FSG_PCI_SLOT0_PIN	6 | ||||||
|  | +#define FSG_PCI_SLOT1_PIN	7 | ||||||
|  | + | ||||||
|  | +#define	FSG_PCI_SLOT0_DEVID	14 | ||||||
|  | +#define	FSG_PCI_SLOT1_DEVID	15 | ||||||
|  | + | ||||||
|  | +#define	FSG_IDE_BASE_PHYS	IXP4XX_EXP_BUS_BASE(3) | ||||||
|  | +#define	FSG_IDE_BASE_VIRT	0xFFFE1000 | ||||||
|  | +#define	FSG_IDE_REGION_SIZE	0x1000 | ||||||
|  | + | ||||||
|  | +#define	FSG_IDE_DATA_PORT	0xFFFE10E0 | ||||||
|  | +#define	FSG_IDE_CTRL_PORT	0xFFFE10FC | ||||||
|  | +#define	FSG_IDE_ERROR_PORT	0xFFFE10E2 | ||||||
|  | +*/ | ||||||
|  | diff -uprN linux-2.6.23.orig/include/asm-arm/arch-ixp4xx/hardware.h linux-2.6.23/include/asm-arm/arch-ixp4xx/hardware.h | ||||||
|  | --- linux-2.6.23.orig/include/asm-arm/arch-ixp4xx/hardware.h	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/include/asm-arm/arch-ixp4xx/hardware.h	2007-10-11 00:55:34.000000000 -0500 | ||||||
|  | @@ -45,5 +45,6 @@ | ||||||
|  |  #include "nslu2.h" | ||||||
|  |  #include "nas100d.h" | ||||||
|  |  #include "dsmg600.h" | ||||||
|  | +#include "fsg.h" | ||||||
|  |   | ||||||
|  |  #endif  /* _ASM_ARCH_HARDWARE_H */ | ||||||
|  | diff -uprN linux-2.6.23.orig/include/asm-arm/arch-ixp4xx/irqs.h linux-2.6.23/include/asm-arm/arch-ixp4xx/irqs.h | ||||||
|  | --- linux-2.6.23.orig/include/asm-arm/arch-ixp4xx/irqs.h	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/include/asm-arm/arch-ixp4xx/irqs.h	2007-10-11 00:55:34.000000000 -0500 | ||||||
|  | @@ -128,4 +128,17 @@ | ||||||
|  |  #define        IRQ_DSMG600_PCI_INTE    IRQ_IXP4XX_GPIO7 | ||||||
|  |  #define        IRQ_DSMG600_PCI_INTF    IRQ_IXP4XX_GPIO6 | ||||||
|  |   | ||||||
|  | +/* | ||||||
|  | + * Freecom FSG-3 Board IRQs | ||||||
|  | + */ | ||||||
|  | +#define        IRQ_FSG_PCI_INTA        IRQ_IXP4XX_GPIO6 | ||||||
|  | +#define        IRQ_FSG_PCI_INTB        IRQ_IXP4XX_GPIO7 | ||||||
|  | +#define        IRQ_FSG_PCI_INTC        IRQ_IXP4XX_GPIO5 | ||||||
|  | + | ||||||
|  | +/* %%% REMOVE %%% | ||||||
|  | +#define	IRQ_FSG_PCI_SLOT0	IRQ_IXP4XX_GPIO6 | ||||||
|  | +#define	IRQ_FSG_PCI_SLOT1	IRQ_IXP4XX_GPIO7 | ||||||
|  | +#define	IRQ_FSG_IDE		IRQ_IXP4XX_GPIO5 | ||||||
|  | +*/ | ||||||
|  | + | ||||||
|  |  #endif | ||||||
							
								
								
									
										187
									
								
								target/linux/ixp4xx/patches-2.6.23/014-eeprom_new_notifier.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								target/linux/ixp4xx/patches-2.6.23/014-eeprom_new_notifier.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,187 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/drivers/i2c/chips/eeprom.c linux-2.6.23/drivers/i2c/chips/eeprom.c | ||||||
|  | --- linux-2.6.23.orig/drivers/i2c/chips/eeprom.c	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/drivers/i2c/chips/eeprom.c	2007-10-11 00:57:25.000000000 -0500 | ||||||
|  | @@ -33,6 +33,8 @@ | ||||||
|  |  #include <linux/jiffies.h> | ||||||
|  |  #include <linux/i2c.h> | ||||||
|  |  #include <linux/mutex.h> | ||||||
|  | +#include <linux/notifier.h> | ||||||
|  | +#include <linux/eeprom.h> | ||||||
|  |   | ||||||
|  |  /* Addresses to scan */ | ||||||
|  |  static unsigned short normal_i2c[] = { 0x50, 0x51, 0x52, 0x53, 0x54, | ||||||
|  | @@ -41,26 +43,7 @@ static unsigned short normal_i2c[] = { 0 | ||||||
|  |  /* Insmod parameters */ | ||||||
|  |  I2C_CLIENT_INSMOD_1(eeprom); | ||||||
|  |   | ||||||
|  | - | ||||||
|  | -/* Size of EEPROM in bytes */ | ||||||
|  | -#define EEPROM_SIZE		256 | ||||||
|  | - | ||||||
|  | -/* possible types of eeprom devices */ | ||||||
|  | -enum eeprom_nature { | ||||||
|  | -	UNKNOWN, | ||||||
|  | -	VAIO, | ||||||
|  | -}; | ||||||
|  | - | ||||||
|  | -/* Each client has this additional data */ | ||||||
|  | -struct eeprom_data { | ||||||
|  | -	struct i2c_client client; | ||||||
|  | -	struct mutex update_lock; | ||||||
|  | -	u8 valid;			/* bitfield, bit!=0 if slice is valid */ | ||||||
|  | -	unsigned long last_updated[8];	/* In jiffies, 8 slices */ | ||||||
|  | -	u8 data[EEPROM_SIZE];		/* Register values */ | ||||||
|  | -	enum eeprom_nature nature; | ||||||
|  | -}; | ||||||
|  | - | ||||||
|  | +ATOMIC_NOTIFIER_HEAD(eeprom_chain); | ||||||
|  |   | ||||||
|  |  static int eeprom_attach_adapter(struct i2c_adapter *adapter); | ||||||
|  |  static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind); | ||||||
|  | @@ -191,6 +174,7 @@ static int eeprom_detect(struct i2c_adap | ||||||
|  |  	data->valid = 0; | ||||||
|  |  	mutex_init(&data->update_lock); | ||||||
|  |  	data->nature = UNKNOWN; | ||||||
|  | +	data->attr = &eeprom_attr; | ||||||
|  |   | ||||||
|  |  	/* Tell the I2C layer a new client has arrived */ | ||||||
|  |  	if ((err = i2c_attach_client(new_client))) | ||||||
|  | @@ -214,6 +198,9 @@ static int eeprom_detect(struct i2c_adap | ||||||
|  |  	if (err) | ||||||
|  |  		goto exit_detach; | ||||||
|  |   | ||||||
|  | +	/* call the notifier chain */ | ||||||
|  | +	atomic_notifier_call_chain(&eeprom_chain, EEPROM_REGISTER, data); | ||||||
|  | + | ||||||
|  |  	return 0; | ||||||
|  |   | ||||||
|  |  exit_detach: | ||||||
|  | @@ -239,6 +226,41 @@ static int eeprom_detach_client(struct i | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +/** | ||||||
|  | + * register_eeprom_notifier - register a 'user' of EEPROM devices. | ||||||
|  | + * @nb: pointer to notifier info structure | ||||||
|  | + * | ||||||
|  | + * Registers a callback function to be called upon detection | ||||||
|  | + * of an EEPROM device.  Detection invokes the 'add' callback | ||||||
|  | + * with the kobj of the mutex and a bin_attribute which allows | ||||||
|  | + * read from the EEPROM.  The intention is that the notifier | ||||||
|  | + * will be able to read system configuration from the notifier. | ||||||
|  | + * | ||||||
|  | + * Only EEPROMs detected *after* the addition of the notifier | ||||||
|  | + * are notified.  I.e. EEPROMs already known to the system | ||||||
|  | + * will not be notified - add the notifier from board level | ||||||
|  | + * code! | ||||||
|  | + */ | ||||||
|  | +int register_eeprom_notifier(struct notifier_block *nb) | ||||||
|  | +{ | ||||||
|  | +	return atomic_notifier_chain_register(&eeprom_chain, nb); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +/** | ||||||
|  | + *	unregister_eeprom_notifier - unregister a 'user' of EEPROM devices. | ||||||
|  | + *	@old: pointer to notifier info structure | ||||||
|  | + * | ||||||
|  | + *	Removes a callback function from the list of 'users' to be | ||||||
|  | + *	notified upon detection of EEPROM devices. | ||||||
|  | + */ | ||||||
|  | +int unregister_eeprom_notifier(struct notifier_block *nb) | ||||||
|  | +{ | ||||||
|  | +	return atomic_notifier_chain_unregister(&eeprom_chain, nb); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +EXPORT_SYMBOL_GPL(register_eeprom_notifier); | ||||||
|  | +EXPORT_SYMBOL_GPL(unregister_eeprom_notifier); | ||||||
|  | + | ||||||
|  |  static int __init eeprom_init(void) | ||||||
|  |  { | ||||||
|  |  	return i2c_add_driver(&eeprom_driver); | ||||||
|  | diff -uprN linux-2.6.23.orig/include/linux/eeprom.h linux-2.6.23/include/linux/eeprom.h | ||||||
|  | --- linux-2.6.23.orig/include/linux/eeprom.h	1969-12-31 18:00:00.000000000 -0600 | ||||||
|  | +++ linux-2.6.23/include/linux/eeprom.h	2007-10-11 00:57:25.000000000 -0500 | ||||||
|  | @@ -0,0 +1,71 @@ | ||||||
|  | +#ifndef _LINUX_EEPROM_H | ||||||
|  | +#define _LINUX_EEPROM_H | ||||||
|  | +/* | ||||||
|  | + *  EEPROM notifier header | ||||||
|  | + * | ||||||
|  | + *  Copyright (C) 2006 John Bowler | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +/* | ||||||
|  | + * This program is free software; you can redistribute it and/or modify | ||||||
|  | + * it under the terms of the GNU General Public License as published by | ||||||
|  | + * the Free Software Foundation; either version 2 of the License, or | ||||||
|  | + * (at your option) any later version. | ||||||
|  | + * | ||||||
|  | + * This program is distributed in the hope that it will be useful, | ||||||
|  | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | + * GNU General Public License for more details. | ||||||
|  | + * | ||||||
|  | + * You should have received a copy of the GNU General Public License | ||||||
|  | + * along with this program; if not, write to the Free Software | ||||||
|  | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#ifndef __KERNEL__ | ||||||
|  | +#error This is a kernel header | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  | +#include <linux/list.h> | ||||||
|  | +#include <linux/kobject.h> | ||||||
|  | +#include <linux/sysfs.h> | ||||||
|  | + | ||||||
|  | +/* Size of EEPROM in bytes */ | ||||||
|  | +#define EEPROM_SIZE             256 | ||||||
|  | + | ||||||
|  | +/* possible types of eeprom devices */ | ||||||
|  | +enum eeprom_nature { | ||||||
|  | +	UNKNOWN, | ||||||
|  | +	VAIO, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +/* Each client has this additional data */ | ||||||
|  | +struct eeprom_data { | ||||||
|  | +	struct i2c_client client; | ||||||
|  | +	struct mutex update_lock; | ||||||
|  | +	u8 valid;			/* bitfield, bit!=0 if slice is valid */ | ||||||
|  | +	unsigned long last_updated[8];	/* In jiffies, 8 slices */ | ||||||
|  | +	u8 data[EEPROM_SIZE];		/* Register values */ | ||||||
|  | +	enum eeprom_nature nature; | ||||||
|  | +	struct bin_attribute *attr; | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +/* | ||||||
|  | + * This is very basic. | ||||||
|  | + * | ||||||
|  | + * If an EEPROM is detected on the I2C bus (this only works for | ||||||
|  | + * I2C EEPROMs) the notifier chain  is called with | ||||||
|  | + * both the I2C information and the kobject for the sysfs | ||||||
|  | + * device which has been registers.  It is then possible to | ||||||
|  | + * read from the device via the bin_attribute::read method | ||||||
|  | + * to extract configuration information. | ||||||
|  | + * | ||||||
|  | + * Register the notifier in the board level code, there is no | ||||||
|  | + * need to unregister it but you can if you want (it will save | ||||||
|  | + * a little bit or kernel memory to do so). | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +extern int register_eeprom_notifier(struct notifier_block *nb); | ||||||
|  | +extern int unregister_eeprom_notifier(struct notifier_block *nb); | ||||||
|  | + | ||||||
|  | +#endif /* _LINUX_EEPROM_H */ | ||||||
|  | diff -uprN linux-2.6.23.orig/include/linux/notifier.h linux-2.6.23/include/linux/notifier.h | ||||||
|  | --- linux-2.6.23.orig/include/linux/notifier.h	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/include/linux/notifier.h	2007-10-11 00:57:25.000000000 -0500 | ||||||
|  | @@ -231,5 +231,8 @@ static inline int notifier_to_errno(int  | ||||||
|  |  #define PM_SUSPEND_PREPARE	0x0003 /* Going to suspend the system */ | ||||||
|  |  #define PM_POST_SUSPEND		0x0004 /* Suspend finished */ | ||||||
|  |   | ||||||
|  | +/* eeprom notifier chain */ | ||||||
|  | +#define EEPROM_REGISTER		0x0001 | ||||||
|  | + | ||||||
|  |  #endif /* __KERNEL__ */ | ||||||
|  |  #endif /* _LINUX_NOTIFIER_H */ | ||||||
| @@ -0,0 +1,23 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/drivers/ata/pata_artop.c linux-2.6.23/drivers/ata/pata_artop.c | ||||||
|  | --- linux-2.6.23.orig/drivers/ata/pata_artop.c	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/drivers/ata/pata_artop.c	2007-10-11 00:59:14.000000000 -0500 | ||||||
|  | @@ -27,6 +27,7 @@ | ||||||
|  |  #include <scsi/scsi_host.h> | ||||||
|  |  #include <linux/libata.h> | ||||||
|  |  #include <linux/ata.h> | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  |   | ||||||
|  |  #define DRV_NAME	"pata_artop" | ||||||
|  |  #define DRV_VERSION	"0.4.4" | ||||||
|  | @@ -489,6 +490,11 @@ static int artop_init_one (struct pci_de | ||||||
|  |  		pci_read_config_byte(pdev, 0x4a, ®); | ||||||
|  |  		pci_write_config_byte(pdev, 0x4a, (reg & ~0x01) | 0x80); | ||||||
|  |   | ||||||
|  | +		/* NAS100D workaround - probing second port kills uhci_hcd */ | ||||||
|  | +#ifdef CONFIG_MACH_NAS100D | ||||||
|  | +		if (machine_is_nas100d()) | ||||||
|  | +			ppi[1] = &ata_dummy_port_info; | ||||||
|  | +#endif | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	BUG_ON(ppi[0] == NULL); | ||||||
| @@ -0,0 +1,36 @@ | |||||||
|  | --- | ||||||
|  |  arch/arm/mach-ixp4xx/dsmg600-power.c |   13 +++++++++---- | ||||||
|  |  1 file changed, 9 insertions(+), 4 deletions(-) | ||||||
|  |  | ||||||
|  | Index: linux-2.6.22-rc5-armeb/arch/arm/mach-ixp4xx/dsmg600-power.c | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.22-rc5-armeb.orig/arch/arm/mach-ixp4xx/dsmg600-power.c | ||||||
|  | +++ linux-2.6.22-rc5-armeb/arch/arm/mach-ixp4xx/dsmg600-power.c | ||||||
|  | @@ -50,6 +50,13 @@ | ||||||
|  |  	if (*IXP4XX_GPIO_GPINR & DSMG600_PB_BM) { | ||||||
|  |   | ||||||
|  |  		/* IO Pin is 1 (button pushed) */ | ||||||
|  | +		if (power_button_countdown > 0) { | ||||||
|  | +			power_button_countdown--; | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +	} else { | ||||||
|  | + | ||||||
|  | +		/* Done on button release, to allow for auto-power-on mods. */ | ||||||
|  |  		if (power_button_countdown == 0) { | ||||||
|  |  			/* Signal init to do the ctrlaltdel action, this will bypass | ||||||
|  |  			 * init if it hasn't started and do a kernel_restart. | ||||||
|  | @@ -58,11 +65,9 @@ | ||||||
|  |   | ||||||
|  |  			/* Change the state of the power LED to "blink" */ | ||||||
|  |  			gpio_line_set(DSMG600_LED_PWR_GPIO, IXP4XX_GPIO_LOW); | ||||||
|  | +		} else { | ||||||
|  | +			power_button_countdown = PBUTTON_HOLDDOWN_COUNT; | ||||||
|  |  		} | ||||||
|  | -		power_button_countdown--; | ||||||
|  | - | ||||||
|  | -	} else { | ||||||
|  | -		power_button_countdown = PBUTTON_HOLDDOWN_COUNT; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	mod_timer(&dsmg600_power_timer, jiffies + msecs_to_jiffies(500)); | ||||||
| @@ -0,0 +1,133 @@ | |||||||
|  | --- | ||||||
|  |  arch/arm/mach-ixp4xx/nas100d-power.c  |   68 ++++++++++++++++++++++++++++++++-- | ||||||
|  |  include/asm-arm/arch-ixp4xx/nas100d.h |   18 +++++---- | ||||||
|  |  2 files changed, 75 insertions(+), 11 deletions(-) | ||||||
|  |  | ||||||
|  | Index: linux-2.6.22-rc5-armeb/arch/arm/mach-ixp4xx/nas100d-power.c | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.22-rc5-armeb.orig/arch/arm/mach-ixp4xx/nas100d-power.c | ||||||
|  | +++ linux-2.6.22-rc5-armeb/arch/arm/mach-ixp4xx/nas100d-power.c | ||||||
|  | @@ -21,15 +21,60 @@ | ||||||
|  |  #include <linux/irq.h> | ||||||
|  |  #include <linux/module.h> | ||||||
|  |  #include <linux/reboot.h> | ||||||
|  | +#include <linux/jiffies.h> | ||||||
|  | +#include <linux/timer.h> | ||||||
|  |   | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |   | ||||||
|  | -static irqreturn_t nas100d_reset_handler(int irq, void *dev_id) | ||||||
|  | +extern void ctrl_alt_del(void); | ||||||
|  | + | ||||||
|  | +/* This is used to make sure the power-button pusher is serious.  The button | ||||||
|  | + * must be held until the value of this counter reaches zero. | ||||||
|  | + */ | ||||||
|  | +static volatile int power_button_countdown; | ||||||
|  | + | ||||||
|  | +/* Must hold the button down for at least this many counts to be processed */ | ||||||
|  | +#define PBUTTON_HOLDDOWN_COUNT 4 /* 2 secs */ | ||||||
|  | + | ||||||
|  | +static void nas100d_power_handler(unsigned long data); | ||||||
|  | +static DEFINE_TIMER(nas100d_power_timer, nas100d_power_handler, 0, 0); | ||||||
|  | + | ||||||
|  | +static void nas100d_power_handler(unsigned long data) | ||||||
|  |  { | ||||||
|  | -	/* Signal init to do the ctrlaltdel action, this will bypass init if | ||||||
|  | -	 * it hasn't started and do a kernel_restart. | ||||||
|  | +	/* This routine is called twice per second to check the | ||||||
|  | +	 * state of the power button. | ||||||
|  |  	 */ | ||||||
|  | -	ctrl_alt_del(); | ||||||
|  | + | ||||||
|  | +	if (*IXP4XX_GPIO_GPINR & NAS100D_PB_BM) { | ||||||
|  | + | ||||||
|  | +		/* IO Pin is 1 (button pushed) */ | ||||||
|  | +		if (power_button_countdown > 0) { | ||||||
|  | +			power_button_countdown--; | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +	} else { | ||||||
|  | + | ||||||
|  | +		/* Done on button release, to allow for auto-power-on mods. */ | ||||||
|  | +		if (power_button_countdown == 0) { | ||||||
|  | +			/* Signal init to do the ctrlaltdel action, this will bypass | ||||||
|  | +			 * init if it hasn't started and do a kernel_restart. | ||||||
|  | +			 */ | ||||||
|  | +			ctrl_alt_del(); | ||||||
|  | + | ||||||
|  | +			/* Change the state of the power LED to "blink" */ | ||||||
|  | +			gpio_line_set(NAS100D_LED_PWR_GPIO, IXP4XX_GPIO_LOW); | ||||||
|  | +		} else { | ||||||
|  | +			power_button_countdown = PBUTTON_HOLDDOWN_COUNT; | ||||||
|  | +		} | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	mod_timer(&nas100d_power_timer, jiffies + msecs_to_jiffies(500)); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static irqreturn_t nas100d_reset_handler(int irq, void *dev_id) | ||||||
|  | +{ | ||||||
|  | +	/* This is the paper-clip reset, it shuts the machine down directly. */ | ||||||
|  | +	machine_power_off(); | ||||||
|  |   | ||||||
|  |  	return IRQ_HANDLED; | ||||||
|  |  } | ||||||
|  | @@ -50,6 +95,19 @@ | ||||||
|  |  		return -EIO; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | +	/* The power button on the Iomega NAS100d is on GPIO 14, but | ||||||
|  | +	 * it cannot handle interrupts on that GPIO line.  So we'll | ||||||
|  | +	 * have to poll it with a kernel timer. | ||||||
|  | +	 */ | ||||||
|  | + | ||||||
|  | +	/* Make sure that the power button GPIO is set up as an input */ | ||||||
|  | +	gpio_line_config(NAS100D_PB_GPIO, IXP4XX_GPIO_IN); | ||||||
|  | + | ||||||
|  | +	/* Set the initial value for the power button IRQ handler */ | ||||||
|  | +	power_button_countdown = PBUTTON_HOLDDOWN_COUNT; | ||||||
|  | + | ||||||
|  | +	mod_timer(&nas100d_power_timer, jiffies + msecs_to_jiffies(500)); | ||||||
|  | + | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -58,6 +116,8 @@ | ||||||
|  |  	if (!(machine_is_nas100d())) | ||||||
|  |  		return; | ||||||
|  |   | ||||||
|  | +	del_timer_sync(&nas100d_power_timer); | ||||||
|  | + | ||||||
|  |  	free_irq(NAS100D_RB_IRQ, NULL); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | Index: linux-2.6.22-rc5-armeb/include/asm-arm/arch-ixp4xx/nas100d.h | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.22-rc5-armeb.orig/include/asm-arm/arch-ixp4xx/nas100d.h | ||||||
|  | +++ linux-2.6.22-rc5-armeb/include/asm-arm/arch-ixp4xx/nas100d.h | ||||||
|  | @@ -39,14 +39,18 @@ | ||||||
|  |  /* Buttons */ | ||||||
|  |   | ||||||
|  |  #define NAS100D_PB_GPIO         14 | ||||||
|  | +#define NAS100D_PB_BM           (1L << NAS100D_PB_GPIO) | ||||||
|  | + | ||||||
|  |  #define NAS100D_RB_GPIO         4 | ||||||
|  | -#define NAS100D_PO_GPIO         12   /* power off */ | ||||||
|  |   | ||||||
|  | -#define NAS100D_PB_IRQ          IRQ_IXP4XX_GPIO14 | ||||||
|  |  #define NAS100D_RB_IRQ          IRQ_IXP4XX_GPIO4 | ||||||
|  |   | ||||||
|  | -/* | ||||||
|  | -#define NAS100D_PB_BM           (1L << NAS100D_PB_GPIO) | ||||||
|  | -#define NAS100D_PO_BM           (1L << NAS100D_PO_GPIO) | ||||||
|  | -#define NAS100D_RB_BM           (1L << NAS100D_RB_GPIO) | ||||||
|  | -*/ | ||||||
|  | +#define NAS100D_PO_GPIO         12   /* power off */ | ||||||
|  | + | ||||||
|  | +/* LEDs */ | ||||||
|  | + | ||||||
|  | +#define NAS100D_LED_PWR_GPIO	15 | ||||||
|  | +#define NAS100D_LED_PWR_BM	(1L << NAS100D_LED_PWR_GPIO) | ||||||
|  | + | ||||||
|  | +#define NAS100D_LED_WLAN_GPIO	0 | ||||||
|  | +#define NAS100D_LED_WLAN_BM	(1L << NAS100D_LED_WLAN_GPIO) | ||||||
| @@ -0,0 +1,47 @@ | |||||||
|  | diff --git a/arch/arm/mach-ixp4xx/nslu2-setup.c b/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | index 9bf8ccb..77277d2 100644 | ||||||
|  | --- a/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | +++ b/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | @@ -18,6 +18,7 @@ | ||||||
|  |  #include <linux/serial.h> | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/leds.h> | ||||||
|  | +#include <linux/i2c-gpio.h> | ||||||
|  |   | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |  #include <asm/mach/arch.h> | ||||||
|  | @@ -41,7 +42,7 @@ static struct platform_device nslu2_flash = { | ||||||
|  |  	.resource		= &nslu2_flash_resource, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -static struct ixp4xx_i2c_pins nslu2_i2c_gpio_pins = { | ||||||
|  | +static struct i2c_gpio_platform_data nslu2_i2c_gpio_data = { | ||||||
|  |  	.sda_pin		= NSLU2_SDA_PIN, | ||||||
|  |  	.scl_pin		= NSLU2_SCL_PIN, | ||||||
|  |  }; | ||||||
|  | @@ -82,11 +83,12 @@ static struct platform_device nslu2_leds = { | ||||||
|  |  }; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | -static struct platform_device nslu2_i2c_controller = { | ||||||
|  | -	.name			= "IXP4XX-I2C", | ||||||
|  | +static struct platform_device nslu2_i2c_gpio = { | ||||||
|  | +	.name			= "i2c-gpio", | ||||||
|  |  	.id			= 0, | ||||||
|  | -	.dev.platform_data	= &nslu2_i2c_gpio_pins, | ||||||
|  | -	.num_resources		= 0, | ||||||
|  | +	.dev	 = { | ||||||
|  | +		.platform_data	= &nslu2_i2c_gpio_data, | ||||||
|  | +	}, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static struct platform_device nslu2_beeper = { | ||||||
|  | @@ -139,7 +141,7 @@ static struct platform_device nslu2_uart = { | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static struct platform_device *nslu2_devices[] __initdata = { | ||||||
|  | -	&nslu2_i2c_controller, | ||||||
|  | +	&nslu2_i2c_gpio, | ||||||
|  |  	&nslu2_flash, | ||||||
|  |  	&nslu2_beeper, | ||||||
|  |  #ifdef CONFIG_LEDS_IXP4XX | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | index 78a1741..54d884f 100644 | ||||||
|  | --- a/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | +++ b/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | @@ -16,6 +16,7 @@ | ||||||
|  |  #include <linux/serial.h> | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/leds.h> | ||||||
|  | +#include <linux/i2c-gpio.h> | ||||||
|  |   | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |  #include <asm/mach/arch.h> | ||||||
|  | @@ -68,16 +69,17 @@ static struct platform_device nas100d_leds = { | ||||||
|  |  }; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | -static struct ixp4xx_i2c_pins nas100d_i2c_gpio_pins = { | ||||||
|  | +static struct i2c_gpio_platform_data nas100d_i2c_gpio_data = { | ||||||
|  |  	.sda_pin		= NAS100D_SDA_PIN, | ||||||
|  |  	.scl_pin		= NAS100D_SCL_PIN, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -static struct platform_device nas100d_i2c_controller = { | ||||||
|  | -	.name			= "IXP4XX-I2C", | ||||||
|  | +static struct platform_device nas100d_i2c_gpio = { | ||||||
|  | +	.name			= "i2c-gpio", | ||||||
|  |  	.id			= 0, | ||||||
|  | -	.dev.platform_data	= &nas100d_i2c_gpio_pins, | ||||||
|  | -	.num_resources		= 0, | ||||||
|  | +	.dev	 = { | ||||||
|  | +		.platform_data	= &nas100d_i2c_gpio_data, | ||||||
|  | +	}, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static struct resource nas100d_uart_resources[] = { | ||||||
|  | @@ -124,7 +126,7 @@ static struct platform_device nas100d_uart = { | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static struct platform_device *nas100d_devices[] __initdata = { | ||||||
|  | -	&nas100d_i2c_controller, | ||||||
|  | +	&nas100d_i2c_gpio, | ||||||
|  |  	&nas100d_flash, | ||||||
|  |  #ifdef CONFIG_LEDS_IXP4XX | ||||||
|  |  	&nas100d_leds, | ||||||
| @@ -0,0 +1,45 @@ | |||||||
|  | Index: linux-2.6.22-rc3-git2-armeb/arch/arm/mach-ixp4xx/avila-setup.c | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.22-rc3-git2-armeb.orig/arch/arm/mach-ixp4xx/avila-setup.c	2007-05-31 04:05:33.000000000 -0700 | ||||||
|  | +++ linux-2.6.22-rc3-git2-armeb/arch/arm/mach-ixp4xx/avila-setup.c	2007-05-31 04:12:50.000000000 -0700 | ||||||
|  | @@ -18,6 +18,7 @@ | ||||||
|  |  #include <linux/tty.h> | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/slab.h> | ||||||
|  | +#include <linux/i2c-gpio.h> | ||||||
|  |   | ||||||
|  |  #include <asm/types.h> | ||||||
|  |  #include <asm/setup.h> | ||||||
|  | @@ -47,18 +48,17 @@ | ||||||
|  |  	.resource	= &avila_flash_resource, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -static struct ixp4xx_i2c_pins avila_i2c_gpio_pins = { | ||||||
|  | +static struct i2c_gpio_platform_data avila_i2c_gpio_data = { | ||||||
|  |  	.sda_pin	= AVILA_SDA_PIN, | ||||||
|  |  	.scl_pin	= AVILA_SCL_PIN, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -static struct platform_device avila_i2c_controller = { | ||||||
|  | -	.name		= "IXP4XX-I2C", | ||||||
|  | +static struct platform_device avila_i2c_gpio = { | ||||||
|  | +	.name		= "i2c-gpio", | ||||||
|  |  	.id		= 0, | ||||||
|  | -	.dev		= { | ||||||
|  | -		.platform_data = &avila_i2c_gpio_pins, | ||||||
|  | +	.dev	 = { | ||||||
|  | +		.platform_data	= &avila_i2c_gpio_data, | ||||||
|  |  	}, | ||||||
|  | -	.num_resources	= 0 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static struct resource avila_uart_resources[] = { | ||||||
|  | @@ -133,7 +133,7 @@ | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static struct platform_device *avila_devices[] __initdata = { | ||||||
|  | -	&avila_i2c_controller, | ||||||
|  | +	&avila_i2c_gpio, | ||||||
|  |  	&avila_flash, | ||||||
|  |  	&avila_uart | ||||||
|  |  }; | ||||||
| @@ -0,0 +1,43 @@ | |||||||
|  | Index: linux-2.6.22-rc3-git2-armeb/arch/arm/mach-ixp4xx/dsmg600-setup.c | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.22-rc3-git2-armeb.orig/arch/arm/mach-ixp4xx/dsmg600-setup.c	2007-05-31 04:05:30.000000000 -0700 | ||||||
|  | +++ linux-2.6.22-rc3-git2-armeb/arch/arm/mach-ixp4xx/dsmg600-setup.c	2007-05-31 04:13:02.000000000 -0700 | ||||||
|  | @@ -14,6 +14,7 @@ | ||||||
|  |  #include <linux/kernel.h> | ||||||
|  |  #include <linux/serial.h> | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  | +#include <linux/i2c-gpio.h> | ||||||
|  |   | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |  #include <asm/mach/arch.h> | ||||||
|  | @@ -37,15 +38,17 @@ | ||||||
|  |  	.resource		= &dsmg600_flash_resource, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -static struct ixp4xx_i2c_pins dsmg600_i2c_gpio_pins = { | ||||||
|  | +static struct i2c_gpio_platform_data dsmg600_i2c_gpio_data = { | ||||||
|  |  	.sda_pin		= DSMG600_SDA_PIN, | ||||||
|  |  	.scl_pin		= DSMG600_SCL_PIN, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -static struct platform_device dsmg600_i2c_controller = { | ||||||
|  | -	.name			= "IXP4XX-I2C", | ||||||
|  | +static struct platform_device dsmg600_i2c_gpio = { | ||||||
|  | +	.name			= "i2c-gpio", | ||||||
|  |  	.id			= 0, | ||||||
|  | -	.dev.platform_data	= &dsmg600_i2c_gpio_pins, | ||||||
|  | +	.dev	 = { | ||||||
|  | +		.platform_data	= &dsmg600_i2c_gpio_data, | ||||||
|  | +	}, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  #ifdef CONFIG_LEDS_CLASS | ||||||
|  | @@ -116,7 +119,7 @@ | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static struct platform_device *dsmg600_devices[] __initdata = { | ||||||
|  | -	&dsmg600_i2c_controller, | ||||||
|  | +	&dsmg600_i2c_gpio, | ||||||
|  |  	&dsmg600_flash, | ||||||
|  |  }; | ||||||
|  |   | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/mach-ixp4xx/ixdp425-setup.c linux-2.6.23/arch/arm/mach-ixp4xx/ixdp425-setup.c | ||||||
|  | --- linux-2.6.23.orig/arch/arm/mach-ixp4xx/ixdp425-setup.c	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/arch/arm/mach-ixp4xx/ixdp425-setup.c	2007-10-11 01:01:02.000000000 -0500 | ||||||
|  | @@ -15,6 +15,7 @@ | ||||||
|  |  #include <linux/tty.h> | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/slab.h> | ||||||
|  | +#include <linux/i2c-gpio.h> | ||||||
|  |  #include <linux/io.h> | ||||||
|  |  #include <linux/mtd/mtd.h> | ||||||
|  |  #include <linux/mtd/nand.h> | ||||||
|  | @@ -120,18 +121,17 @@ static struct platform_device ixdp425_fl | ||||||
|  |  }; | ||||||
|  |  #endif	/* CONFIG_MTD_NAND_PLATFORM */ | ||||||
|  |   | ||||||
|  | -static struct ixp4xx_i2c_pins ixdp425_i2c_gpio_pins = { | ||||||
|  | +static struct i2c_gpio_platform_data ixdp425_i2c_gpio_data = { | ||||||
|  |  	.sda_pin	= IXDP425_SDA_PIN, | ||||||
|  |  	.scl_pin	= IXDP425_SCL_PIN, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -static struct platform_device ixdp425_i2c_controller = { | ||||||
|  | -	.name		= "IXP4XX-I2C", | ||||||
|  | +static struct platform_device ixdp425_i2c_gpio = { | ||||||
|  | +	.name		= "i2c-gpio", | ||||||
|  |  	.id		= 0, | ||||||
|  | -	.dev		= { | ||||||
|  | -		.platform_data = &ixdp425_i2c_gpio_pins, | ||||||
|  | +	.dev	 = { | ||||||
|  | +		.platform_data	= &ixdp425_i2c_gpio_data, | ||||||
|  |  	}, | ||||||
|  | -	.num_resources	= 0 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static struct resource ixdp425_uart_resources[] = { | ||||||
|  | @@ -178,7 +178,7 @@ static struct platform_device ixdp425_ua | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static struct platform_device *ixdp425_devices[] __initdata = { | ||||||
|  | -	&ixdp425_i2c_controller, | ||||||
|  | +	&ixdp425_i2c_gpio, | ||||||
|  |  	&ixdp425_flash, | ||||||
|  |  #if defined(CONFIG_MTD_NAND_PLATFORM) || \ | ||||||
|  |      defined(CONFIG_MTD_NAND_PLATFORM_MODULE) | ||||||
| @@ -0,0 +1,36 @@ | |||||||
|  | diff --git a/arch/arm/mach-ixp4xx/nslu2-setup.c b/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | index 77277d2..e0d0dde 100644 | ||||||
|  | --- a/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | +++ b/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | @@ -140,6 +140,23 @@ static struct platform_device nslu2_uart = { | ||||||
|  |  	.resource		= nslu2_uart_resources, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info nslu2_plat_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.phy		= 1, | ||||||
|  | +		.rxq		= 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device nslu2_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.name			= "ixp4xx_eth", | ||||||
|  | +		.id			= IXP4XX_ETH_NPEB, | ||||||
|  | +		.dev.platform_data	= nslu2_plat_eth, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *nslu2_devices[] __initdata = { | ||||||
|  |  	&nslu2_i2c_gpio, | ||||||
|  |  	&nslu2_flash, | ||||||
|  | @@ -147,6 +164,7 @@ static struct platform_device *nslu2_devices[] __initdata = { | ||||||
|  |  #ifdef CONFIG_LEDS_IXP4XX | ||||||
|  |  	&nslu2_leds, | ||||||
|  |  #endif | ||||||
|  | +	&nslu2_eth[0], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static void nslu2_power_off(void) | ||||||
| @@ -0,0 +1,35 @@ | |||||||
|  | diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | index 54d884f..d4d8540 100644 | ||||||
|  | --- a/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | +++ b/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | @@ -125,12 +125,30 @@ static struct platform_device nas100d_uart = { | ||||||
|  |  	.resource		= nas100d_uart_resources, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info nas100d_plat_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .phy            = 0, | ||||||
|  | +                .rxq            = 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +        } | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device nas100d_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .name                   = "ixp4xx_eth", | ||||||
|  | +                .id                     = IXP4XX_ETH_NPEB, | ||||||
|  | +                .dev.platform_data      = nas100d_plat_eth, | ||||||
|  | +        } | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *nas100d_devices[] __initdata = { | ||||||
|  |  	&nas100d_i2c_gpio, | ||||||
|  |  	&nas100d_flash, | ||||||
|  |  #ifdef CONFIG_LEDS_IXP4XX | ||||||
|  |  	&nas100d_leds, | ||||||
|  |  #endif | ||||||
|  | +	&nas100d_eth[0], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static void nas100d_power_off(void) | ||||||
| @@ -0,0 +1,43 @@ | |||||||
|  | diff --git a/arch/arm/mach-ixp4xx/avila-setup.c b/arch/arm/mach-ixp4xx/avila-setup.c | ||||||
|  | index e38f45f..10ed5d6 100644 | ||||||
|  | --- a/arch/arm/mach-ixp4xx/avila-setup.c | ||||||
|  | +++ b/arch/arm/mach-ixp4xx/avila-setup.c | ||||||
|  | @@ -132,10 +132,37 @@ static struct platform_device avila_pata = { | ||||||
|  |  	.resource		= avila_pata_resources, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info avila_plat_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .phy            = 0, | ||||||
|  | +                .rxq            = 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +        }, { | ||||||
|  | +                .phy            = 1, | ||||||
|  | +                .rxq            = 4, | ||||||
|  | +		.txreadyq	= 21, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device avila_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .name                   = "ixp4xx_eth", | ||||||
|  | +                .id                     = IXP4XX_ETH_NPEB, | ||||||
|  | +                .dev.platform_data      = avila_plat_eth, | ||||||
|  | +        }, { | ||||||
|  | +                .name                   = "ixp4xx_eth", | ||||||
|  | +                .id                     = IXP4XX_ETH_NPEC, | ||||||
|  | +                .dev.platform_data      = avila_plat_eth + 1, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *avila_devices[] __initdata = { | ||||||
|  |  	&avila_i2c_gpio, | ||||||
|  |  	&avila_flash, | ||||||
|  | -	&avila_uart | ||||||
|  | +	&avila_uart, | ||||||
|  | +	&avila_eth[0], | ||||||
|  | +	&avila_eth[1], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static void __init avila_init(void) | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | diff --git a/arch/arm/mach-ixp4xx/fsg-setup.c b/arch/arm/mach-ixp4xx/fsg-setup.c | ||||||
|  | index 11336e6..ec3d517 100644 | ||||||
|  | --- a/arch/arm/mach-ixp4xx/fsg-setup.c | ||||||
|  | +++ b/arch/arm/mach-ixp4xx/fsg-setup.c | ||||||
|  | @@ -142,12 +142,39 @@ static struct platform_device fsg_uart = { | ||||||
|  |  	.resource		= fsg_uart_resources, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info fsg_plat_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .phy            = 5, | ||||||
|  | +                .rxq            = 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +        }, { | ||||||
|  | +                .phy            = 4, | ||||||
|  | +                .rxq            = 4, | ||||||
|  | +		.txreadyq	= 21, | ||||||
|  | +        } | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device fsg_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .name                   = "ixp4xx_eth", | ||||||
|  | +                .id                     = IXP4XX_ETH_NPEB, | ||||||
|  | +                .dev.platform_data      = fsg_plat_eth, | ||||||
|  | +        }, { | ||||||
|  | +                .name                   = "ixp4xx_eth", | ||||||
|  | +                .id                     = IXP4XX_ETH_NPEC, | ||||||
|  | +                .dev.platform_data      = fsg_plat_eth + 1, | ||||||
|  | +        } | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *fsg_devices[] __initdata = { | ||||||
|  |  	&fsg_i2c_gpio, | ||||||
|  |  	&fsg_flash, | ||||||
|  |  #ifdef CONFIG_LEDS_IXP4XX | ||||||
|  |  	&fsg_leds, | ||||||
|  |  #endif | ||||||
|  | +	&fsg_eth[0], | ||||||
|  | +	&fsg_eth[1], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static void __init fsg_init(void) | ||||||
							
								
								
									
										52
									
								
								target/linux/ixp4xx/patches-2.6.23/061-nslu2_setup_mac.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								target/linux/ixp4xx/patches-2.6.23/061-nslu2_setup_mac.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | diff --git a/arch/arm/mach-ixp4xx/nslu2-setup.c b/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | index e0d0dde..6e24916 100644 | ||||||
|  | --- a/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | +++ b/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | @@ -19,6 +19,7 @@ | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/leds.h> | ||||||
|  |  #include <linux/i2c-gpio.h> | ||||||
|  | +#include <linux/mtd/mtd.h> | ||||||
|  |   | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |  #include <asm/mach/arch.h> | ||||||
|  | @@ -167,6 +168,30 @@ static struct platform_device *nslu2_devices[] __initdata = { | ||||||
|  |  	&nslu2_eth[0], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +static void nslu2_flash_add(struct mtd_info *mtd) | ||||||
|  | +{ | ||||||
|  | +	if (strcmp(mtd->name, "RedBoot") == 0) { | ||||||
|  | +		size_t retlen; | ||||||
|  | +		u_char mac[6]; | ||||||
|  | + | ||||||
|  | +		if (mtd->read(mtd, 0x3FFB0, 6, &retlen, mac) == 0 && retlen == 6) { | ||||||
|  | +			printk(KERN_INFO "nslu2 mac: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", | ||||||
|  | +			mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); | ||||||
|  | +			memcpy(nslu2_plat_eth[0].hwaddr, mac, 6); | ||||||
|  | +		} else { | ||||||
|  | +			printk(KERN_ERR "nslu2 mac: read failed\n"); | ||||||
|  | +		} | ||||||
|  | +	} | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static void nslu2_flash_remove(struct mtd_info *mtd) { | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static struct mtd_notifier nslu2_flash_notifier = { | ||||||
|  | +	.add = nslu2_flash_add, | ||||||
|  | +	.remove = nslu2_flash_remove, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static void nslu2_power_off(void) | ||||||
|  |  { | ||||||
|  |  	/* This causes the box to drop the power and go dead. */ | ||||||
|  | @@ -209,6 +234,8 @@ static void __init nslu2_init(void) | ||||||
|  |  	(void)platform_device_register(&nslu2_uart); | ||||||
|  |   | ||||||
|  |  	platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); | ||||||
|  | + | ||||||
|  | +	register_mtd_user(&nslu2_flash_notifier); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  MACHINE_START(NSLU2, "Linksys NSLU2") | ||||||
| @@ -0,0 +1,52 @@ | |||||||
|  | diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | index d4d8540..b8c99fa 100644 | ||||||
|  | --- a/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | +++ b/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | @@ -17,6 +17,7 @@ | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/leds.h> | ||||||
|  |  #include <linux/i2c-gpio.h> | ||||||
|  | +#include <linux/mtd/mtd.h> | ||||||
|  |   | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |  #include <asm/mach/arch.h> | ||||||
|  | @@ -151,6 +152,30 @@ static struct platform_device *nas100d_devices[] __initdata = { | ||||||
|  |  	&nas100d_eth[0], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +static void nas100d_flash_add(struct mtd_info *mtd) | ||||||
|  | +{ | ||||||
|  | +	if (strcmp(mtd->name, "RedBoot config") == 0) { | ||||||
|  | +		size_t retlen; | ||||||
|  | +		u_char mac[6]; | ||||||
|  | + | ||||||
|  | +		if (mtd->read(mtd, 0x0FD8, 6, &retlen, mac) == 0 && retlen == 6) { | ||||||
|  | +			printk(KERN_INFO "nas100d mac: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", | ||||||
|  | +				mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); | ||||||
|  | +			memcpy(nas100d_plat_eth[0].hwaddr, mac, 6); | ||||||
|  | +		} else { | ||||||
|  | +			printk(KERN_ERR "nas100d mac: read failed\n"); | ||||||
|  | +		} | ||||||
|  | +	} | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static void nas100d_flash_remove(struct mtd_info *mtd) { | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static struct mtd_notifier nas100d_flash_notifier = { | ||||||
|  | +	.add = nas100d_flash_add, | ||||||
|  | +	.remove = nas100d_flash_remove, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static void nas100d_power_off(void) | ||||||
|  |  { | ||||||
|  |  	/* This causes the box to drop the power and go dead. */ | ||||||
|  | @@ -183,6 +208,8 @@ static void __init nas100d_init(void) | ||||||
|  |  	(void)platform_device_register(&nas100d_uart); | ||||||
|  |   | ||||||
|  |  	platform_add_devices(nas100d_devices, ARRAY_SIZE(nas100d_devices)); | ||||||
|  | + | ||||||
|  | +	register_mtd_user(&nas100d_flash_notifier); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  MACHINE_START(NAS100D, "Iomega NAS 100d") | ||||||
							
								
								
									
										56
									
								
								target/linux/ixp4xx/patches-2.6.23/064-fsg3_setup_mac.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								target/linux/ixp4xx/patches-2.6.23/064-fsg3_setup_mac.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | diff --git a/arch/arm/mach-ixp4xx/fsg-setup.c b/arch/arm/mach-ixp4xx/fsg-setup.c | ||||||
|  | index ec3d517..7cc7201 100644 | ||||||
|  | --- a/arch/arm/mach-ixp4xx/fsg-setup.c | ||||||
|  | +++ b/arch/arm/mach-ixp4xx/fsg-setup.c | ||||||
|  | @@ -16,6 +16,7 @@ | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/leds.h> | ||||||
|  |  #include <linux/i2c-gpio.h> | ||||||
|  | +#include <linux/mtd/mtd.h> | ||||||
|  |   | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |  #include <asm/mach/arch.h> | ||||||
|  | @@ -177,6 +178,34 @@ static struct platform_device *fsg_devices[] __initdata = { | ||||||
|  |  	&fsg_eth[1], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +static void fsg_flash_add(struct mtd_info *mtd) | ||||||
|  | +{ | ||||||
|  | +	if (strcmp(mtd->name, "RedBoot config") == 0) { | ||||||
|  | +		size_t retlen; | ||||||
|  | +		u_char mac[6]; | ||||||
|  | + | ||||||
|  | +		if (mtd->read(mtd, 0x0422, 6, &retlen, mac) == 0 && retlen == 6) { | ||||||
|  | +			printk(KERN_INFO "eth0 mac: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", | ||||||
|  | +				mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); | ||||||
|  | +			memcpy(fsg_plat_eth[0].hwaddr, mac, 6); | ||||||
|  | +			mac[5]++; | ||||||
|  | +			printk(KERN_INFO "eth1 mac: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", | ||||||
|  | +				mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); | ||||||
|  | +			memcpy(fsg_plat_eth[1].hwaddr, mac, 6); | ||||||
|  | +		} else { | ||||||
|  | +			printk(KERN_ERR "fsg mac: read failed\n"); | ||||||
|  | +		} | ||||||
|  | +	} | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static void fsg_flash_remove(struct mtd_info *mtd) { | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static struct mtd_notifier fsg_flash_notifier = { | ||||||
|  | +	.add = fsg_flash_add, | ||||||
|  | +	.remove = fsg_flash_remove, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static void __init fsg_init(void) | ||||||
|  |  { | ||||||
|  |  	ixp4xx_sys_init(); | ||||||
|  | @@ -198,6 +227,8 @@ static void __init fsg_init(void) | ||||||
|  |  	(void)platform_device_register(&fsg_uart); | ||||||
|  |   | ||||||
|  |  	platform_add_devices(fsg_devices, ARRAY_SIZE(fsg_devices)); | ||||||
|  | + | ||||||
|  | +	register_mtd_user(&fsg_flash_notifier); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  MACHINE_START(FSG, "Freecom FSG-3") | ||||||
| @@ -0,0 +1,17 @@ | |||||||
|  | Index: linux-2.6.19/drivers/char/random.c | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.19.orig/drivers/char/random.c | ||||||
|  | +++ linux-2.6.19/drivers/char/random.c | ||||||
|  | @@ -248,9 +248,9 @@ | ||||||
|  |  /* | ||||||
|  |   * Configuration information | ||||||
|  |   */ | ||||||
|  | -#define INPUT_POOL_WORDS 128 | ||||||
|  | -#define OUTPUT_POOL_WORDS 32 | ||||||
|  | -#define SEC_XFER_SIZE 512 | ||||||
|  | +#define INPUT_POOL_WORDS 256 | ||||||
|  | +#define OUTPUT_POOL_WORDS 64 | ||||||
|  | +#define SEC_XFER_SIZE 1024 | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  |   * The minimum number of bits of entropy before we wake up a read on | ||||||
							
								
								
									
										55
									
								
								target/linux/ixp4xx/patches-2.6.23/091-nslu2_rtc_fixup.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								target/linux/ixp4xx/patches-2.6.23/091-nslu2_rtc_fixup.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/mach-ixp4xx/nslu2-setup.c linux-2.6.23/arch/arm/mach-ixp4xx/nslu2-setup.c | ||||||
|  | --- linux-2.6.23.orig/arch/arm/mach-ixp4xx/nslu2-setup.c	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/arch/arm/mach-ixp4xx/nslu2-setup.c	2007-10-11 01:04:46.000000000 -0500 | ||||||
|  | @@ -19,6 +19,7 @@ | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/leds.h> | ||||||
|  |   | ||||||
|  | +#include <asm/setup.h> | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |  #include <asm/mach/arch.h> | ||||||
|  |  #include <asm/mach/flash.h> | ||||||
|  | @@ -171,6 +172,35 @@ static struct sys_timer nslu2_timer = { | ||||||
|  |      .init   = nslu2_timer_init, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +static char nslu2_rtc_probe[] __initdata = "rtc-isl1208.ignore=0,0x6f rtc-x1205.probe=0,0x6f "; | ||||||
|  | + | ||||||
|  | +static void __init nslu2_fixup(struct machine_desc *desc, | ||||||
|  | +                struct tag *tags, char **cmdline, struct meminfo *mi) | ||||||
|  | +{ | ||||||
|  | +    struct tag *t = tags; | ||||||
|  | +    char *p = *cmdline; | ||||||
|  | + | ||||||
|  | +    /* Find the end of the tags table, taking note of any cmdline tag. */ | ||||||
|  | +    for (; t->hdr.size; t = tag_next(t)) { | ||||||
|  | +        if (t->hdr.tag == ATAG_CMDLINE) { | ||||||
|  | +            p = t->u.cmdline.cmdline; | ||||||
|  | +        } | ||||||
|  | +    } | ||||||
|  | + | ||||||
|  | +    /* Overwrite the end of the table with a new cmdline tag. */ | ||||||
|  | +    t->hdr.tag = ATAG_CMDLINE; | ||||||
|  | +    t->hdr.size = (sizeof (struct tag_header) + | ||||||
|  | +        strlen(nslu2_rtc_probe) + strlen(p) + 1 + 4) >> 2; | ||||||
|  | +    strlcpy(t->u.cmdline.cmdline, nslu2_rtc_probe, COMMAND_LINE_SIZE); | ||||||
|  | +    strlcpy(t->u.cmdline.cmdline + strlen(nslu2_rtc_probe), p, | ||||||
|  | +        COMMAND_LINE_SIZE - strlen(nslu2_rtc_probe)); | ||||||
|  | + | ||||||
|  | +    /* Terminate the table. */ | ||||||
|  | +    t = tag_next(t); | ||||||
|  | +    t->hdr.tag = ATAG_NONE; | ||||||
|  | +    t->hdr.size = 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static void __init nslu2_init(void) | ||||||
|  |  { | ||||||
|  |  	ixp4xx_sys_init(); | ||||||
|  | @@ -196,6 +226,7 @@ MACHINE_START(NSLU2, "Linksys NSLU2") | ||||||
|  |  	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  |  	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC, | ||||||
|  |  	.boot_params	= 0x00000100, | ||||||
|  | +	.fixup          = nslu2_fixup, | ||||||
|  |  	.map_io		= ixp4xx_map_io, | ||||||
|  |  	.init_irq	= ixp4xx_init_irq, | ||||||
|  |  	.timer          = &nslu2_timer, | ||||||
| @@ -0,0 +1,55 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/mach-ixp4xx/nas100d-setup.c linux-2.6.23/arch/arm/mach-ixp4xx/nas100d-setup.c | ||||||
|  | --- linux-2.6.23.orig/arch/arm/mach-ixp4xx/nas100d-setup.c	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/arch/arm/mach-ixp4xx/nas100d-setup.c	2007-10-11 01:06:33.000000000 -0500 | ||||||
|  | @@ -17,6 +17,7 @@ | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/leds.h> | ||||||
|  |   | ||||||
|  | +#include <asm/setup.h> | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |  #include <asm/mach/arch.h> | ||||||
|  |  #include <asm/mach/flash.h> | ||||||
|  | @@ -142,6 +143,35 @@ static void nas100d_power_off(void) | ||||||
|  |  	gpio_line_set(NAS100D_PO_GPIO, IXP4XX_GPIO_HIGH); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static char nas100d_rtc_probe[] __initdata = "rtc-pcf8563.probe=0,0x51 "; | ||||||
|  | + | ||||||
|  | +static void __init nas100d_fixup(struct machine_desc *desc, | ||||||
|  | +                struct tag *tags, char **cmdline, struct meminfo *mi) | ||||||
|  | +{ | ||||||
|  | +    struct tag *t = tags; | ||||||
|  | +    char *p = *cmdline; | ||||||
|  | + | ||||||
|  | +    /* Find the end of the tags table, taking note of any cmdline tag. */ | ||||||
|  | +    for (; t->hdr.size; t = tag_next(t)) { | ||||||
|  | +        if (t->hdr.tag == ATAG_CMDLINE) { | ||||||
|  | +            p = t->u.cmdline.cmdline; | ||||||
|  | +        } | ||||||
|  | +    } | ||||||
|  | + | ||||||
|  | +    /* Overwrite the end of the table with a new cmdline tag. */ | ||||||
|  | +    t->hdr.tag = ATAG_CMDLINE; | ||||||
|  | +    t->hdr.size = (sizeof (struct tag_header) + | ||||||
|  | +        strlen(nas100d_rtc_probe) + strlen(p) + 1 + 4) >> 2; | ||||||
|  | +    strlcpy(t->u.cmdline.cmdline, nas100d_rtc_probe, COMMAND_LINE_SIZE); | ||||||
|  | +    strlcpy(t->u.cmdline.cmdline + strlen(nas100d_rtc_probe), p, | ||||||
|  | +        COMMAND_LINE_SIZE - strlen(nas100d_rtc_probe)); | ||||||
|  | + | ||||||
|  | +    /* Terminate the table. */ | ||||||
|  | +    t = tag_next(t); | ||||||
|  | +    t->hdr.tag = ATAG_NONE; | ||||||
|  | +    t->hdr.size = 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static void __init nas100d_init(void) | ||||||
|  |  { | ||||||
|  |  	ixp4xx_sys_init(); | ||||||
|  | @@ -170,6 +200,7 @@ MACHINE_START(NAS100D, "Iomega NAS 100d" | ||||||
|  |  	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  |  	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC, | ||||||
|  |  	.boot_params	= 0x00000100, | ||||||
|  | +	.fixup          = nas100d_fixup, | ||||||
|  |  	.map_io		= ixp4xx_map_io, | ||||||
|  |  	.init_irq	= ixp4xx_init_irq, | ||||||
|  |  	.timer          = &ixp4xx_timer, | ||||||
							
								
								
									
										55
									
								
								target/linux/ixp4xx/patches-2.6.23/093-avila_rtc_fixup.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								target/linux/ixp4xx/patches-2.6.23/093-avila_rtc_fixup.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/arch/arm/mach-ixp4xx/avila-setup.c linux-2.6.23/arch/arm/mach-ixp4xx/avila-setup.c | ||||||
|  | --- linux-2.6.23.orig/arch/arm/mach-ixp4xx/avila-setup.c	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/arch/arm/mach-ixp4xx/avila-setup.c	2007-10-11 01:08:21.000000000 -0500 | ||||||
|  | @@ -138,6 +138,35 @@ static struct platform_device *avila_dev | ||||||
|  |  	&avila_uart | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +static char avila_rtc_probe[] __initdata = "rtc-ds1672.probe=0,0x68 "; | ||||||
|  | + | ||||||
|  | +static void __init avila_fixup(struct machine_desc *desc, | ||||||
|  | +                struct tag *tags, char **cmdline, struct meminfo *mi) | ||||||
|  | +{ | ||||||
|  | +    struct tag *t = tags; | ||||||
|  | +    char *p = *cmdline; | ||||||
|  | + | ||||||
|  | +    /* Find the end of the tags table, taking note of any cmdline tag. */ | ||||||
|  | +    for (; t->hdr.size; t = tag_next(t)) { | ||||||
|  | +        if (t->hdr.tag == ATAG_CMDLINE) { | ||||||
|  | +            p = t->u.cmdline.cmdline; | ||||||
|  | +        } | ||||||
|  | +    } | ||||||
|  | + | ||||||
|  | +    /* Overwrite the end of the table with a new cmdline tag. */ | ||||||
|  | +    t->hdr.tag = ATAG_CMDLINE; | ||||||
|  | +    t->hdr.size = (sizeof (struct tag_header) + | ||||||
|  | +        strlen(avila_rtc_probe) + strlen(p) + 1 + 4) >> 2; | ||||||
|  | +    strlcpy(t->u.cmdline.cmdline, avila_rtc_probe, COMMAND_LINE_SIZE); | ||||||
|  | +    strlcpy(t->u.cmdline.cmdline + strlen(avila_rtc_probe), p, | ||||||
|  | +        COMMAND_LINE_SIZE - strlen(avila_rtc_probe)); | ||||||
|  | + | ||||||
|  | +    /* Terminate the table. */ | ||||||
|  | +    t = tag_next(t); | ||||||
|  | +    t->hdr.tag = ATAG_NONE; | ||||||
|  | +    t->hdr.size = 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static void __init avila_init(void) | ||||||
|  |  { | ||||||
|  |  	ixp4xx_sys_init(); | ||||||
|  | @@ -165,6 +194,7 @@ MACHINE_START(AVILA, "Gateworks Avila Ne | ||||||
|  |  	/* Maintainer: Deepak Saxena <dsaxena@plexity.net> */ | ||||||
|  |  	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  |  	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, | ||||||
|  | +	.fixup          = avila_fixup, | ||||||
|  |  	.map_io		= ixp4xx_map_io, | ||||||
|  |  	.init_irq	= ixp4xx_init_irq, | ||||||
|  |  	.timer		= &ixp4xx_timer, | ||||||
|  | @@ -182,6 +212,7 @@ MACHINE_START(LOFT, "Giant Shoulder Inc  | ||||||
|  |  	/* Maintainer: Tom Billman <kernel@giantshoulderinc.com> */ | ||||||
|  |  	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  |  	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, | ||||||
|  | +	.fixup          = avila_fixup, | ||||||
|  |  	.map_io		= ixp4xx_map_io, | ||||||
|  |  	.init_irq	= ixp4xx_init_irq, | ||||||
|  |  	.timer		= &ixp4xx_timer, | ||||||
| @@ -0,0 +1,56 @@ | |||||||
|  | Index: linux-2.6.22-rc4-armeb/arch/arm/mach-ixp4xx/dsmg600-setup.c | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.22-rc4-armeb.orig/arch/arm/mach-ixp4xx/dsmg600-setup.c | ||||||
|  | +++ linux-2.6.22-rc4-armeb/arch/arm/mach-ixp4xx/dsmg600-setup.c | ||||||
|  | @@ -16,6 +16,7 @@ | ||||||
|  |  #include <linux/serial_8250.h> | ||||||
|  |  #include <linux/i2c-gpio.h> | ||||||
|  |   | ||||||
|  | +#include <asm/setup.h> | ||||||
|  |  #include <asm/mach-types.h> | ||||||
|  |  #include <asm/mach/arch.h> | ||||||
|  |  #include <asm/mach/flash.h> | ||||||
|  | @@ -145,6 +146,35 @@ static struct sys_timer dsmg600_timer =  | ||||||
|  |      .init   = dsmg600_timer_init, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +static char dsmg600_rtc_probe[] __initdata = "rtc-pcf8563.probe=0,0x51 "; | ||||||
|  | + | ||||||
|  | +static void __init dsmg600_fixup(struct machine_desc *desc, | ||||||
|  | +                struct tag *tags, char **cmdline, struct meminfo *mi) | ||||||
|  | +{ | ||||||
|  | +    struct tag *t = tags; | ||||||
|  | +    char *p = *cmdline; | ||||||
|  | + | ||||||
|  | +    /* Find the end of the tags table, taking note of any cmdline tag. */ | ||||||
|  | +    for (; t->hdr.size; t = tag_next(t)) { | ||||||
|  | +        if (t->hdr.tag == ATAG_CMDLINE) { | ||||||
|  | +            p = t->u.cmdline.cmdline; | ||||||
|  | +        } | ||||||
|  | +    } | ||||||
|  | + | ||||||
|  | +    /* Overwrite the end of the table with a new cmdline tag. */ | ||||||
|  | +    t->hdr.tag = ATAG_CMDLINE; | ||||||
|  | +    t->hdr.size = (sizeof (struct tag_header) + | ||||||
|  | +        strlen(dsmg600_rtc_probe) + strlen(p) + 1 + 4) >> 2; | ||||||
|  | +    strlcpy(t->u.cmdline.cmdline, dsmg600_rtc_probe, COMMAND_LINE_SIZE); | ||||||
|  | +    strlcpy(t->u.cmdline.cmdline + strlen(dsmg600_rtc_probe), p, | ||||||
|  | +        COMMAND_LINE_SIZE - strlen(dsmg600_rtc_probe)); | ||||||
|  | + | ||||||
|  | +    /* Terminate the table. */ | ||||||
|  | +    t = tag_next(t); | ||||||
|  | +    t->hdr.tag = ATAG_NONE; | ||||||
|  | +    t->hdr.size = 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static void __init dsmg600_init(void) | ||||||
|  |  { | ||||||
|  |  	ixp4xx_sys_init(); | ||||||
|  | @@ -177,6 +207,7 @@ MACHINE_START(DSMG600, "D-Link DSM-G600  | ||||||
|  |  	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  |  	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC, | ||||||
|  |  	.boot_params	= 0x00000100, | ||||||
|  | +	.fixup          = dsmg600_fixup, | ||||||
|  |  	.map_io		= ixp4xx_map_io, | ||||||
|  |  	.init_irq	= ixp4xx_init_irq, | ||||||
|  |  	.timer          = &dsmg600_timer, | ||||||
							
								
								
									
										178
									
								
								target/linux/ixp4xx/patches-2.6.23/096-kexec_cmdline.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								target/linux/ixp4xx/patches-2.6.23/096-kexec_cmdline.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | |||||||
|  | diff -uprN linux-2.6.23.orig/kernel/ksysfs.c linux-2.6.23/kernel/ksysfs.c | ||||||
|  | --- linux-2.6.23.orig/kernel/ksysfs.c	2007-10-09 15:31:38.000000000 -0500 | ||||||
|  | +++ linux-2.6.23/kernel/ksysfs.c	2007-10-11 01:10:26.000000000 -0500 | ||||||
|  | @@ -49,6 +49,165 @@ KERNEL_ATTR_RW(uevent_helper); | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  |  #ifdef CONFIG_KEXEC | ||||||
|  | + | ||||||
|  | +#include <asm/setup.h> | ||||||
|  | + | ||||||
|  | +extern unsigned long kexec_boot_params; | ||||||
|  | + | ||||||
|  | +char kexec_cmdline[COMMAND_LINE_SIZE] = ""; | ||||||
|  | + | ||||||
|  | +static void | ||||||
|  | +replace_cmdline_tag(void) | ||||||
|  | +{ | ||||||
|  | +	char *t; | ||||||
|  | +	struct tag *real; | ||||||
|  | +	struct tag *copy; | ||||||
|  | +	struct tag *rend; | ||||||
|  | +	int i; | ||||||
|  | + | ||||||
|  | +/* TODO: check the return params */ | ||||||
|  | +	t = kmalloc(KEXEC_BOOT_PARAMS_SIZE + COMMAND_LINE_SIZE, GFP_KERNEL); | ||||||
|  | +	memset((void *)t, 0, KEXEC_BOOT_PARAMS_SIZE + COMMAND_LINE_SIZE); | ||||||
|  | + | ||||||
|  | +/* TODO: validate that the boot params are ATAGS, in fact */ | ||||||
|  | + | ||||||
|  | +	copy = (struct tag *)t; | ||||||
|  | +	real = (struct tag *)kexec_boot_params; | ||||||
|  | +	rend = (struct tag *)(kexec_boot_params + KEXEC_BOOT_PARAMS_SIZE); | ||||||
|  | +	while ((real->hdr.size) && (real < rend)) { | ||||||
|  | +		if (real->hdr.tag != ATAG_CMDLINE) { | ||||||
|  | +			memcpy((void *)copy, (void *)real, real->hdr.size * 4); | ||||||
|  | +			copy = tag_next(copy); | ||||||
|  | +		} | ||||||
|  | +		real = tag_next(real); | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +/* TODO: validate that we have enough space in the buffer */ | ||||||
|  | +	 | ||||||
|  | +	i = strlen(kexec_cmdline); | ||||||
|  | +	if (i) { | ||||||
|  | +		copy->hdr.tag = ATAG_CMDLINE; | ||||||
|  | +		copy->hdr.size = (sizeof(struct tag_header) + i + 1 + 4) >> 2; | ||||||
|  | +		strcpy(copy->u.cmdline.cmdline, kexec_cmdline); | ||||||
|  | +		copy = tag_next(copy); | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	copy->hdr.tag = ATAG_NONE;            /* Empty tag ends list */ | ||||||
|  | +	copy->hdr.size = 0;                   /* zero length */ | ||||||
|  | + | ||||||
|  | +/* TODO: validate that the temporary buffer isn't too full */ | ||||||
|  | + | ||||||
|  | +	memcpy((void *)kexec_boot_params, (void *)t, KEXEC_BOOT_PARAMS_SIZE); | ||||||
|  | + | ||||||
|  | +	kfree(t);  /* Don't forget to free the big buffer we used */ | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static ssize_t kexec_cmdline_show(struct kset *kset, char *page) | ||||||
|  | +{ | ||||||
|  | +	return sprintf(page, "%s\n", kexec_cmdline); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static ssize_t kexec_cmdline_store(struct kset *kset, const char *page, | ||||||
|  | +				   size_t count) | ||||||
|  | +{ | ||||||
|  | +	if ((count + 1) > COMMAND_LINE_SIZE) | ||||||
|  | +		count = COMMAND_LINE_SIZE; | ||||||
|  | +	memcpy(kexec_cmdline, page, count); | ||||||
|  | +	kexec_cmdline[count] = '\0'; | ||||||
|  | +	if (count && (kexec_cmdline[count - 1] == '\n')) | ||||||
|  | +		kexec_cmdline[count - 1] = '\0'; | ||||||
|  | +	replace_cmdline_tag(); | ||||||
|  | +	return count; | ||||||
|  | +} | ||||||
|  | +KERNEL_ATTR_RW(kexec_cmdline); | ||||||
|  | + | ||||||
|  | +static ssize_t kexec_boot_params_show(struct kset *kset, char *page) | ||||||
|  | +{ | ||||||
|  | +	unsigned long *p; | ||||||
|  | +	char buf[PAGE_SIZE]; | ||||||
|  | +	int keep_doing; | ||||||
|  | + | ||||||
|  | +	p = (unsigned long *)kexec_boot_params; | ||||||
|  | + | ||||||
|  | +	/* if this doesn't look like atags, just print first few words */ | ||||||
|  | +	if (p[1] != ATAG_CORE) | ||||||
|  | +		return sprintf(page, "0x%lx 0x%lx 0x%lx 0x%lx\n", | ||||||
|  | +			       p[0], p[1], p[2], p[3]); | ||||||
|  | + | ||||||
|  | +	/* carefully walk the atag list, and print out the structure */ | ||||||
|  | +	keep_doing = 1; | ||||||
|  | +	do { | ||||||
|  | +		switch (p[1]) { | ||||||
|  | +		case ATAG_CORE: | ||||||
|  | +			/* watch out, core tag is permitted to be empty */ | ||||||
|  | +			if (p[0] == 5) | ||||||
|  | +				sprintf(buf, | ||||||
|  | +					"CORE flg=%ld pgsz=%ld rdev=0x%lx\n", | ||||||
|  | +					p[2], p[3], p[4]); | ||||||
|  | +			else | ||||||
|  | +				sprintf(buf,"CORE\n"); | ||||||
|  | +			break; | ||||||
|  | +		case ATAG_MEM: | ||||||
|  | +			sprintf(buf,"MEM  %ldM@0x%lx\n", p[2] / (1024 * 1024), | ||||||
|  | +				p[3]); | ||||||
|  | +			break; | ||||||
|  | +		case ATAG_VIDEOTEXT: | ||||||
|  | +			sprintf(buf,"VIDEOTEXT sz=%ld\n", p[0]); | ||||||
|  | +			break; | ||||||
|  | +		case ATAG_RAMDISK: | ||||||
|  | +			sprintf(buf,"RAMDISK prmpt=%ld %ldK@0x%lx\n", | ||||||
|  | +				p[2], p[3], p[4]); | ||||||
|  | +			break; | ||||||
|  | +		case ATAG_INITRD2: | ||||||
|  | +			sprintf(buf,"INITRD2 %ldK@0x%lx\n", p[3] / 1024, p[2]); | ||||||
|  | +			break; | ||||||
|  | +		case ATAG_SERIAL: | ||||||
|  | +			sprintf(buf,"SERIAL high=0x%08lx low=0x%08lx\n", | ||||||
|  | +				p[3], p[2]); | ||||||
|  | +			break; | ||||||
|  | +		case ATAG_REVISION: | ||||||
|  | +			sprintf(buf,"REVISION rev=%ld\n", p[2]); | ||||||
|  | +			break; | ||||||
|  | +		case ATAG_VIDEOLFB: | ||||||
|  | +			sprintf(buf,"VIDEOLFB sz=%ld\n", p[0]); | ||||||
|  | +			break; | ||||||
|  | +		case ATAG_CMDLINE: | ||||||
|  | +			sprintf(buf,"CMD  \"%s\"\n", (char *)&p[2]); | ||||||
|  | +			break; | ||||||
|  | +		case ATAG_NONE: | ||||||
|  | +			sprintf(buf,"NONE\n"); | ||||||
|  | +			keep_doing = 0; | ||||||
|  | +			break; | ||||||
|  | +		default: | ||||||
|  | +			sprintf(buf,"-unknown- sz=%ld\n", p[0]); | ||||||
|  | +			break; | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +		/* carefully add to page */ | ||||||
|  | +		if ((strlen(buf) + strlen(page)) < PAGE_SIZE) { | ||||||
|  | +			strcat(page, buf); | ||||||
|  | +		} else { | ||||||
|  | +			keep_doing = 0; | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +		/* stop when we encounter a header length of 0 */ | ||||||
|  | +		if (p[0] == 0) | ||||||
|  | +			keep_doing = 0; | ||||||
|  | + | ||||||
|  | +		/* go to the next tag */ | ||||||
|  | +		p += p[0]; | ||||||
|  | + | ||||||
|  | +		/* stop if we walked off the end of the buffer */ | ||||||
|  | +		if (p > (unsigned long *)(kexec_boot_params + | ||||||
|  | +					  KEXEC_BOOT_PARAMS_SIZE)) | ||||||
|  | +			keep_doing = 0; | ||||||
|  | + | ||||||
|  | +	} while (keep_doing); | ||||||
|  | + | ||||||
|  | +	return (strlen(page)); | ||||||
|  | +} | ||||||
|  | +KERNEL_ATTR_RO(kexec_boot_params); | ||||||
|  | + | ||||||
|  |  static ssize_t kexec_loaded_show(struct kset *kset, char *page) | ||||||
|  |  { | ||||||
|  |  	return sprintf(page, "%d\n", !!kexec_image); | ||||||
|  | @@ -95,6 +254,8 @@ static struct attribute * kernel_attrs[] | ||||||
|  |  #ifdef CONFIG_KEXEC | ||||||
|  |  	&kexec_loaded_attr.attr, | ||||||
|  |  	&kexec_crash_loaded_attr.attr, | ||||||
|  | +	&kexec_cmdline_attr.attr, | ||||||
|  | +	&kexec_boot_params_attr.attr, | ||||||
|  |  #endif | ||||||
|  |  	NULL | ||||||
|  |  }; | ||||||
| @@ -0,0 +1,41 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/gateway7001-setup.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/gateway7001-setup.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/gateway7001-setup.c	2007-10-09 22:31:38.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/gateway7001-setup.c	2007-10-22 15:09:33.000000000 +0200 | ||||||
|  | @@ -76,9 +76,36 @@ | ||||||
|  |  	.resource	= &gateway7001_uart_resource, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info gateway7001_plat_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .phy            = 1, | ||||||
|  | +                .rxq            = 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +        }, { | ||||||
|  | +                .phy            = 2, | ||||||
|  | +                .rxq            = 4, | ||||||
|  | +		.txreadyq	= 21, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device gateway7001_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .name                   = "ixp4xx_eth", | ||||||
|  | +                .id                     = IXP4XX_ETH_NPEB, | ||||||
|  | +                .dev.platform_data      = gateway7001_plat_eth, | ||||||
|  | +        }, { | ||||||
|  | +                .name                   = "ixp4xx_eth", | ||||||
|  | +                .id                     = IXP4XX_ETH_NPEC, | ||||||
|  | +                .dev.platform_data      = gateway7001_plat_eth + 1, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *gateway7001_devices[] __initdata = { | ||||||
|  |  	&gateway7001_flash, | ||||||
|  | -	&gateway7001_uart | ||||||
|  | +	&gateway7001_uart, | ||||||
|  | +	&gateway7001_eth[0], | ||||||
|  | +	&gateway7001_eth[1], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static void __init gateway7001_init(void) | ||||||
| @@ -0,0 +1,31 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/wg302v2-setup.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/wg302v2-setup.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/wg302v2-setup.c	2007-10-09 22:31:38.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/wg302v2-setup.c	2007-10-22 15:02:20.000000000 +0200 | ||||||
|  | @@ -77,9 +77,27 @@ | ||||||
|  |  	.resource	= &wg302v2_uart_resource, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info wg302_plat_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.phy		= 8, | ||||||
|  | +		.rxq		= 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device wg302_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.name			= "ixp4xx_eth", | ||||||
|  | +		.id			= IXP4XX_ETH_NPEB, | ||||||
|  | +		.dev.platform_data	= wg302_plat_eth, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *wg302v2_devices[] __initdata = { | ||||||
|  |  	&wg302v2_flash, | ||||||
|  |  	&wg302v2_uart, | ||||||
|  | +	&wg302_eth[0], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static void __init wg302v2_init(void) | ||||||
| @@ -0,0 +1,292 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Kconfig | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig	2007-10-22 14:47:50.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Kconfig	2007-10-22 15:16:43.000000000 +0200 | ||||||
|  | @@ -57,6 +57,14 @@ | ||||||
|  |  	  WG302 v2 or WAG302 v2 Access Points. For more information | ||||||
|  |  	  on this platform, see http://openwrt.org | ||||||
|  |   | ||||||
|  | +config MACH_PRONGHORNMETRO | ||||||
|  | +	bool "Pronghorn Metro" | ||||||
|  | +	select PCI | ||||||
|  | +	help | ||||||
|  | +	  Say 'Y' here if you want your kernel to support the ADI  | ||||||
|  | +	  Engineering Pronghorn Metro Platform. For more | ||||||
|  | +	  information on this platform, see <file:Documentation/arm/IXP4xx>. | ||||||
|  | + | ||||||
|  |  config ARCH_IXDP425 | ||||||
|  |  	bool "IXDP425" | ||||||
|  |  	help | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/Makefile linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Makefile | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/Makefile	2007-10-22 14:47:50.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Makefile	2007-10-22 15:26:15.000000000 +0200 | ||||||
|  | @@ -16,6 +16,7 @@ | ||||||
|  |  obj-pci-$(CONFIG_MACH_GATEWAY7001)	+= gateway7001-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_WG302V2)		+= wg302v2-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_FSG)		+= fsg-pci.o | ||||||
|  | +obj-pci-$(CONFIG_MACH_PRONGHORNMETRO)	+= pronghornmetro-pci.o | ||||||
|  |   | ||||||
|  |  obj-y	+= common.o | ||||||
|  |   | ||||||
|  | @@ -30,6 +31,7 @@ | ||||||
|  |  obj-$(CONFIG_MACH_GATEWAY7001)	+= gateway7001-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_WG302V2)	+= wg302v2-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_FSG)		+= fsg-setup.o | ||||||
|  | +obj-$(CONFIG_MACH_PRONGHORNMETRO)	+= pronghornmetro-setup.o | ||||||
|  |   | ||||||
|  |  obj-$(CONFIG_PCI)		+= $(obj-pci-$(CONFIG_PCI)) common-pci.o | ||||||
|  |  obj-$(CONFIG_IXP4XX_QMGR)	+= ixp4xx_qmgr.o | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/pronghornmetro-pci.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/pronghornmetro-pci.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/pronghornmetro-pci.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/pronghornmetro-pci.c	2007-10-22 15:16:43.000000000 +0200 | ||||||
|  | @@ -0,0 +1,74 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arch/mach-ixp4xx/pronghornmetro-pci.c | ||||||
|  | + * | ||||||
|  | + * PCI setup routines for ADI Engineering Pronghorn Metro | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2007 Imre Kaloz <kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * based on coyote-pci.c: | ||||||
|  | + *	Copyright (C) 2002 Jungo Software Technologies. | ||||||
|  | + *	Copyright (C) 2003 MontaVista Softwrae, Inc. | ||||||
|  | + * | ||||||
|  | + * Maintainer: Imre Kaloz <kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * This program is free software; you can redistribute it and/or modify | ||||||
|  | + * it under the terms of the GNU General Public License version 2 as | ||||||
|  | + * published by the Free Software Foundation. | ||||||
|  | + * | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/pci.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/irq.h> | ||||||
|  | + | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | +#include <asm/hardware.h> | ||||||
|  | +#include <asm/irq.h> | ||||||
|  | + | ||||||
|  | +#include <asm/mach/pci.h> | ||||||
|  | + | ||||||
|  | +extern void ixp4xx_pci_preinit(void); | ||||||
|  | +extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); | ||||||
|  | +extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys); | ||||||
|  | + | ||||||
|  | +void __init pronghornmetro_pci_preinit(void) | ||||||
|  | +{ | ||||||
|  | +	set_irq_type(IRQ_IXP4XX_GPIO4, IRQT_LOW); | ||||||
|  | +	set_irq_type(IRQ_IXP4XX_GPIO6, IRQT_LOW); | ||||||
|  | +	set_irq_type(IRQ_IXP4XX_GPIO11, IRQT_LOW); | ||||||
|  | +	set_irq_type(IRQ_IXP4XX_GPIO1, IRQT_LOW); | ||||||
|  | + | ||||||
|  | +	ixp4xx_pci_preinit(); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int __init pronghornmetro_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||||||
|  | +{ | ||||||
|  | +	if (slot == 13) | ||||||
|  | +		return IRQ_IXP4XX_GPIO4; | ||||||
|  | +	else if (slot == 14) | ||||||
|  | +		return IRQ_IXP4XX_GPIO6; | ||||||
|  | +	else if (slot == 15) | ||||||
|  | +		return IRQ_IXP4XX_GPIO11; | ||||||
|  | +	else if (slot == 16) | ||||||
|  | +		return IRQ_IXP4XX_GPIO1; | ||||||
|  | +	else return -1; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +struct hw_pci pronghornmetro_pci __initdata = { | ||||||
|  | +	.nr_controllers = 1, | ||||||
|  | +	.preinit =        pronghornmetro_pci_preinit, | ||||||
|  | +	.swizzle =        pci_std_swizzle, | ||||||
|  | +	.setup =          ixp4xx_setup, | ||||||
|  | +	.scan =           ixp4xx_scan_bus, | ||||||
|  | +	.map_irq =        pronghornmetro_map_irq, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +int __init pronghornmetro_pci_init(void) | ||||||
|  | +{ | ||||||
|  | +	if (machine_is_pronghorn_metro()) | ||||||
|  | +		pci_common_init(&pronghornmetro_pci); | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +subsys_initcall(pronghornmetro_pci_init); | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/pronghornmetro-setup.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/pronghornmetro-setup.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/pronghornmetro-setup.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/pronghornmetro-setup.c	2007-10-22 15:36:35.000000000 +0200 | ||||||
|  | @@ -0,0 +1,147 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arm/mach-ixp4xx/pronghornmetro-setup.c | ||||||
|  | + * | ||||||
|  | + * Board setup for the ADI Engineering Pronghorn Metro | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2007 Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * based on coyote-setup.c: | ||||||
|  | + *      Copyright (C) 2003-2005 MontaVista Software, Inc. | ||||||
|  | + * | ||||||
|  | + * Author: Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/device.h> | ||||||
|  | +#include <linux/serial.h> | ||||||
|  | +#include <linux/tty.h> | ||||||
|  | +#include <linux/serial_8250.h> | ||||||
|  | +#include <linux/slab.h> | ||||||
|  | + | ||||||
|  | +#include <asm/types.h> | ||||||
|  | +#include <asm/setup.h> | ||||||
|  | +#include <asm/memory.h> | ||||||
|  | +#include <asm/hardware.h> | ||||||
|  | +#include <asm/irq.h> | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | +#include <asm/mach/arch.h> | ||||||
|  | +#include <asm/mach/flash.h> | ||||||
|  | + | ||||||
|  | +static struct flash_platform_data pronghornmetro_flash_data = { | ||||||
|  | +	.map_name	= "cfi_probe", | ||||||
|  | +	.width		= 2, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource pronghornmetro_flash_resource = { | ||||||
|  | +	.flags		= IORESOURCE_MEM, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device pronghornmetro_flash = { | ||||||
|  | +	.name		= "IXP4XX-Flash", | ||||||
|  | +	.id		= 0, | ||||||
|  | +	.dev		= { | ||||||
|  | +		.platform_data = &pronghornmetro_flash_data, | ||||||
|  | +	}, | ||||||
|  | +	.num_resources	= 1, | ||||||
|  | +	.resource	= &pronghornmetro_flash_resource, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource pronghornmetro_uart_resource = { | ||||||
|  | +	.start	= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +	.end	= IXP4XX_UART2_BASE_PHYS + 0x0fff, | ||||||
|  | +	.flags	= IORESOURCE_MEM, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct plat_serial8250_port pronghornmetro_uart_data[] = { | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART2, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ }, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device pronghornmetro_uart = { | ||||||
|  | +	.name		= "serial8250", | ||||||
|  | +	.id		= PLAT8250_DEV_PLATFORM, | ||||||
|  | +	.dev			= { | ||||||
|  | +		.platform_data	= pronghornmetro_uart_data, | ||||||
|  | +	}, | ||||||
|  | +	.num_resources	= 1, | ||||||
|  | +	.resource	= &pronghornmetro_uart_resource, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource pronghornmetro_pata_resources[] = { | ||||||
|  | +	{ | ||||||
|  | +		.flags	= IORESOURCE_MEM | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.flags	= IORESOURCE_MEM, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.name	= "intrq", | ||||||
|  | +		.start	= IRQ_IXP4XX_GPIO0, | ||||||
|  | +		.end	= IRQ_IXP4XX_GPIO0, | ||||||
|  | +		.flags	= IORESOURCE_IRQ, | ||||||
|  | +	}, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct ixp4xx_pata_data pronghornmetro_pata_data = { | ||||||
|  | +	.cs0_bits	= 0xbfff0043, | ||||||
|  | +	.cs1_bits	= 0xbfff0043, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device pronghornmetro_pata = { | ||||||
|  | +	.name			= "pata_ixp4xx_cf", | ||||||
|  | +	.id			= 0, | ||||||
|  | +	.dev.platform_data      = &pronghornmetro_pata_data, | ||||||
|  | +	.num_resources		= ARRAY_SIZE(pronghornmetro_pata_resources), | ||||||
|  | +	.resource		= pronghornmetro_pata_resources, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device *pronghornmetro_devices[] __initdata = { | ||||||
|  | +	&pronghornmetro_flash, | ||||||
|  | +	&pronghornmetro_uart, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static void __init pronghornmetro_init(void) | ||||||
|  | +{ | ||||||
|  | +	ixp4xx_sys_init(); | ||||||
|  | + | ||||||
|  | +	pronghornmetro_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | ||||||
|  | +	pronghornmetro_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_16M - 1; | ||||||
|  | + | ||||||
|  | +	*IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; | ||||||
|  | +	*IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; | ||||||
|  | + | ||||||
|  | +	platform_add_devices(pronghornmetro_devices, ARRAY_SIZE(pronghornmetro_devices)); | ||||||
|  | + | ||||||
|  | +	pronghornmetro_pata_resources[0].start = IXP4XX_EXP_BUS_BASE(1); | ||||||
|  | +	pronghornmetro_pata_resources[0].end = IXP4XX_EXP_BUS_END(1); | ||||||
|  | + | ||||||
|  | +	pronghornmetro_pata_resources[1].start = IXP4XX_EXP_BUS_BASE(2); | ||||||
|  | +	pronghornmetro_pata_resources[1].end = IXP4XX_EXP_BUS_END(2); | ||||||
|  | + | ||||||
|  | +	pronghornmetro_pata_data.cs0_cfg = IXP4XX_EXP_CS1; | ||||||
|  | +	pronghornmetro_pata_data.cs1_cfg = IXP4XX_EXP_CS2; | ||||||
|  | + | ||||||
|  | +	platform_device_register(&pronghornmetro_pata); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +#ifdef CONFIG_MACH_PRONGHORNMETRO | ||||||
|  | +MACHINE_START(PRONGHORNMETRO, "ADI Engineering Pronghorn Metro") | ||||||
|  | +	/* Maintainer: Imre Kaloz <kaloz@openwrt.org> */ | ||||||
|  | +	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  | +	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, | ||||||
|  | +	.map_io		= ixp4xx_map_io, | ||||||
|  | +	.init_irq	= ixp4xx_init_irq, | ||||||
|  | +	.timer		= &ixp4xx_timer, | ||||||
|  | +	.boot_params	= 0x0100, | ||||||
|  | +	.init_machine	= pronghornmetro_init, | ||||||
|  | +MACHINE_END | ||||||
|  | +#endif | ||||||
|  | diff -Nur linux-2.6.23/Documentation/arm/IXP4xx linux-2.6.23-owrt/Documentation/arm/IXP4xx | ||||||
|  | --- linux-2.6.23/Documentation/arm/IXP4xx	2007-10-09 22:31:38.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/Documentation/arm/IXP4xx	2007-10-22 15:16:43.000000000 +0200 | ||||||
|  | @@ -111,6 +111,9 @@ | ||||||
|  |     the platform has two mini-PCI slots used for 802.11[bga] cards. | ||||||
|  |     Finally, there is an IDE port hanging off the expansion bus. | ||||||
|  |   | ||||||
|  | +ADI Engineering Pronghorn Metro Platform | ||||||
|  | +http://www.adiengineering.com/php-bin/ecomm4/productDisplay.php?category_id=30&product_id=85 | ||||||
|  | + | ||||||
|  |  Gateworks Avila Network Platform | ||||||
|  |  http://www.gateworks.com/avila_sbc.htm | ||||||
|  |   | ||||||
|  | diff -Nur linux-2.6.23/include/asm-arm/arch-ixp4xx/uncompress.h linux-2.6.23-owrt/include/asm-arm/arch-ixp4xx/uncompress.h | ||||||
|  | --- linux-2.6.23/include/asm-arm/arch-ixp4xx/uncompress.h	2007-10-22 14:47:50.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/include/asm-arm/arch-ixp4xx/uncompress.h	2007-10-22 15:18:47.000000000 +0200 | ||||||
|  | @@ -41,7 +41,8 @@ | ||||||
|  |  	 * Some boards are using UART2 as console | ||||||
|  |  	 */ | ||||||
|  |  	if (machine_is_adi_coyote() || machine_is_gtwx5715() || | ||||||
|  | -			 machine_is_gateway7001() || machine_is_wg302v2()) | ||||||
|  | +			 machine_is_gateway7001() || machine_is_wg302v2() || | ||||||
|  | +			 machine_is_pronghorn_metro()) | ||||||
|  |  		uart_base = (volatile u32*) IXP4XX_UART2_BASE_PHYS; | ||||||
|  |  	else | ||||||
|  |  		uart_base = (volatile u32*) IXP4XX_UART1_BASE_PHYS; | ||||||
| @@ -0,0 +1,40 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/pronghornmetro-setup.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/pronghornmetro-setup.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/pronghornmetro-setup.c	2007-10-22 15:41:27.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/pronghornmetro-setup.c	2007-10-22 15:43:30.000000000 +0200 | ||||||
|  | @@ -104,9 +104,36 @@ | ||||||
|  |  	.resource		= pronghornmetro_pata_resources, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info pronghornmetro_plat_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .phy            = 0, | ||||||
|  | +                .rxq            = 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +        }, { | ||||||
|  | +                .phy            = 1, | ||||||
|  | +                .rxq            = 4, | ||||||
|  | +		.txreadyq	= 21, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device pronghornmetro_eth[] = { | ||||||
|  | +        { | ||||||
|  | +                .name                   = "ixp4xx_eth", | ||||||
|  | +                .id                     = IXP4XX_ETH_NPEB, | ||||||
|  | +                .dev.platform_data      = pronghornmetro_plat_eth, | ||||||
|  | +        }, { | ||||||
|  | +                .name                   = "ixp4xx_eth", | ||||||
|  | +                .id                     = IXP4XX_ETH_NPEC, | ||||||
|  | +                .dev.platform_data      = pronghornmetro_plat_eth + 1, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *pronghornmetro_devices[] __initdata = { | ||||||
|  |  	&pronghornmetro_flash, | ||||||
|  |  	&pronghornmetro_uart, | ||||||
|  | +	&pronghornmetro_eth[0], | ||||||
|  | +	&pronghornmetro_eth[1], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static void __init pronghornmetro_init(void) | ||||||
							
								
								
									
										185
									
								
								target/linux/ixp4xx/patches-2.6.23/120-compex_support.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								target/linux/ixp4xx/patches-2.6.23/120-compex_support.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,185 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Kconfig | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig	2007-10-23 18:03:34.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Kconfig	2007-10-23 18:22:41.000000000 +0200 | ||||||
|  | @@ -65,6 +65,14 @@ | ||||||
|  |  	  Engineering Pronghorn Metro Platform. For more | ||||||
|  |  	  information on this platform, see <file:Documentation/arm/IXP4xx>. | ||||||
|  |   | ||||||
|  | +config MACH_COMPEX | ||||||
|  | +	bool "Compex WP18 / NP18A" | ||||||
|  | +	select PCI | ||||||
|  | +	help | ||||||
|  | +	  Say 'Y' here if you want your kernel to support Compex'  | ||||||
|  | +	  WP18 or NP18A boards. For more information on this | ||||||
|  | +	  platform, see http://openwrt.org | ||||||
|  | + | ||||||
|  |  config ARCH_IXDP425 | ||||||
|  |  	bool "IXDP425" | ||||||
|  |  	help | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/Makefile linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Makefile | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/Makefile	2007-10-23 18:03:34.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Makefile	2007-10-23 18:22:41.000000000 +0200 | ||||||
|  | @@ -17,6 +17,7 @@ | ||||||
|  |  obj-pci-$(CONFIG_MACH_WG302V2)		+= wg302v2-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_FSG)		+= fsg-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_PRONGHORNMETRO)	+= pronghornmetro-pci.o | ||||||
|  | +obj-pci-$(CONFIG_MACH_COMPEX)		+= ixdp425-pci.o | ||||||
|  |   | ||||||
|  |  obj-y	+= common.o | ||||||
|  |   | ||||||
|  | @@ -32,6 +33,7 @@ | ||||||
|  |  obj-$(CONFIG_MACH_WG302V2)	+= wg302v2-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_FSG)		+= fsg-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_PRONGHORNMETRO)	+= pronghornmetro-setup.o | ||||||
|  | +obj-$(CONFIG_MACH_COMPEX)	+= compex-setup.o | ||||||
|  |   | ||||||
|  |  obj-$(CONFIG_PCI)		+= $(obj-pci-$(CONFIG_PCI)) common-pci.o | ||||||
|  |  obj-$(CONFIG_IXP4XX_QMGR)	+= ixp4xx_qmgr.o | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/compex-setup.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/compex-setup.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/compex-setup.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/compex-setup.c	2007-10-23 18:22:41.000000000 +0200 | ||||||
|  | @@ -0,0 +1,120 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arm/mach-ixp4xx/compex-setup.c | ||||||
|  | + * | ||||||
|  | + * Ccompex WP18 / NP18A board-setup | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2007 Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * based on ixdp425-setup.c: | ||||||
|  | + *	Copyright (C) 2003-2005 MontaVista Software, Inc. | ||||||
|  | + * | ||||||
|  | + * Author: Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/device.h> | ||||||
|  | +#include <linux/serial.h> | ||||||
|  | +#include <linux/tty.h> | ||||||
|  | +#include <linux/serial_8250.h> | ||||||
|  | +#include <linux/slab.h> | ||||||
|  | + | ||||||
|  | +#include <asm/types.h> | ||||||
|  | +#include <asm/setup.h> | ||||||
|  | +#include <asm/memory.h> | ||||||
|  | +#include <asm/hardware.h> | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | +#include <asm/irq.h> | ||||||
|  | +#include <asm/mach/arch.h> | ||||||
|  | +#include <asm/mach/flash.h> | ||||||
|  | + | ||||||
|  | +static struct flash_platform_data compex_flash_data = { | ||||||
|  | +	.map_name	= "cfi_probe", | ||||||
|  | +	.width		= 2, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource compex_flash_resource = { | ||||||
|  | +	.flags		= IORESOURCE_MEM, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device compex_flash = { | ||||||
|  | +	.name		= "IXP4XX-Flash", | ||||||
|  | +	.id		= 0, | ||||||
|  | +	.dev		= { | ||||||
|  | +		.platform_data = &compex_flash_data, | ||||||
|  | +	}, | ||||||
|  | +	.num_resources	= 1, | ||||||
|  | +	.resource	= &compex_flash_resource, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource compex_uart_resources[] = { | ||||||
|  | +	{ | ||||||
|  | +		.start		= IXP4XX_UART1_BASE_PHYS, | ||||||
|  | +		.end		= IXP4XX_UART1_BASE_PHYS + 0x0fff, | ||||||
|  | +		.flags		= IORESOURCE_MEM | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.start		= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +		.end		= IXP4XX_UART2_BASE_PHYS + 0x0fff, | ||||||
|  | +		.flags		= IORESOURCE_MEM | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct plat_serial8250_port compex_uart_data[] = { | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART1_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART1, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART2, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ }, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device compex_uart = { | ||||||
|  | +	.name			= "serial8250", | ||||||
|  | +	.id			= PLAT8250_DEV_PLATFORM, | ||||||
|  | +	.dev.platform_data	= compex_uart_data, | ||||||
|  | +	.num_resources		= 2, | ||||||
|  | +	.resource		= compex_uart_resources, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device *compex_devices[] __initdata = { | ||||||
|  | +	&compex_flash, | ||||||
|  | +	&compex_uart | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static void __init compex_init(void) | ||||||
|  | +{ | ||||||
|  | +	ixp4xx_sys_init(); | ||||||
|  | + | ||||||
|  | +	compex_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | ||||||
|  | +	compex_flash_resource.end = | ||||||
|  | +		IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1; | ||||||
|  | + | ||||||
|  | +	platform_add_devices(compex_devices, ARRAY_SIZE(compex_devices)); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +#ifdef CONFIG_MACH_COMPEX | ||||||
|  | +MACHINE_START(COMPEX, "Compex WP18 / NP18A") | ||||||
|  | +	/* Maintainer: Imre Kaloz <Kaloz@openwrt.org> */ | ||||||
|  | +	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  | +	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, | ||||||
|  | +	.map_io		= ixp4xx_map_io, | ||||||
|  | +	.init_irq	= ixp4xx_init_irq, | ||||||
|  | +	.timer		= &ixp4xx_timer, | ||||||
|  | +	.boot_params	= 0x0100, | ||||||
|  | +	.init_machine	= compex_init, | ||||||
|  | +MACHINE_END | ||||||
|  | +#endif | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/ixdp425-pci.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/ixdp425-pci.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/ixdp425-pci.c	2007-10-09 22:31:38.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/ixdp425-pci.c	2007-10-23 18:22:41.000000000 +0200 | ||||||
|  | @@ -66,7 +66,7 @@ | ||||||
|  |  int __init ixdp425_pci_init(void) | ||||||
|  |  { | ||||||
|  |  	if (machine_is_ixdp425() || machine_is_ixcdp1100() || | ||||||
|  | -			machine_is_ixdp465() || machine_is_kixrp435()) | ||||||
|  | +			machine_is_ixdp465() || machine_is_kixrp435() || machine_is_compex()) | ||||||
|  |  		pci_common_init(&ixdp425_pci); | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/tools/mach-types linux-2.6.23-owrt/arch/arm/tools/mach-types | ||||||
|  | --- linux-2.6.23/arch/arm/tools/mach-types	2007-10-09 22:31:38.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/tools/mach-types	2007-10-23 18:22:41.000000000 +0200 | ||||||
|  | @@ -1278,7 +1278,7 @@ | ||||||
|  |  smdk6400		MACH_SMDK6400		SMDK6400		1270 | ||||||
|  |  nokia_n800		MACH_NOKIA_N800		NOKIA_N800		1271 | ||||||
|  |  greenphone		MACH_GREENPHONE		GREENPHONE		1272 | ||||||
|  | -compex42x		MACH_COMPEXWP18		COMPEXWP18		1273 | ||||||
|  | +compex			MACH_COMPEX		COMPEX			1273 | ||||||
|  |  xmate			MACH_XMATE		XMATE			1274 | ||||||
|  |  energizer		MACH_ENERGIZER		ENERGIZER		1275 | ||||||
|  |  ime1			MACH_IME1		IME1			1276 | ||||||
| @@ -0,0 +1,41 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/compex-setup.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/compex-setup.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/compex-setup.c	2007-10-23 18:39:29.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/compex-setup.c	2007-10-23 18:45:34.000000000 +0200 | ||||||
|  | @@ -90,9 +90,36 @@ | ||||||
|  |  	.resource		= compex_uart_resources, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info compex_plat_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.phy		= -1, | ||||||
|  | +		.rxq		= 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +	}, { | ||||||
|  | +		.phy		= 3, | ||||||
|  | +		.rxq		= 4, | ||||||
|  | +		.txreadyq	= 21, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device compex_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.name			= "ixp4xx_eth", | ||||||
|  | +		.id			= IXP4XX_ETH_NPEB, | ||||||
|  | +		.dev.platform_data	= compex_plat_eth, | ||||||
|  | +	}, { | ||||||
|  | +		.name			= "ixp4xx_eth", | ||||||
|  | +		.id			= IXP4XX_ETH_NPEC, | ||||||
|  | +		.dev.platform_data	= compex_plat_eth + 1, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *compex_devices[] __initdata = { | ||||||
|  |  	&compex_flash, | ||||||
|  | -	&compex_uart | ||||||
|  | +	&compex_uart, | ||||||
|  | +	&compex_eth[0], | ||||||
|  | +	&compex_eth[1], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static void __init compex_init(void) | ||||||
							
								
								
									
										230
									
								
								target/linux/ixp4xx/patches-2.6.23/130-wrt300nv2_support.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								target/linux/ixp4xx/patches-2.6.23/130-wrt300nv2_support.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,230 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Kconfig | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig	2007-10-23 18:39:29.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Kconfig	2007-10-23 19:11:31.000000000 +0200 | ||||||
|  | @@ -73,6 +73,14 @@ | ||||||
|  |  	  WP18 or NP18A boards. For more information on this | ||||||
|  |  	  platform, see http://openwrt.org | ||||||
|  |   | ||||||
|  | +config MACH_WRT300NV2 | ||||||
|  | +	bool "Linksys WRT300N v2" | ||||||
|  | +	select PCI | ||||||
|  | +	help | ||||||
|  | +	  Say 'Y' here if you want your kernel to support Linksys'  | ||||||
|  | +	  WRT300N v2 router. For more information on this | ||||||
|  | +	  platform, see http://openwrt.org | ||||||
|  | + | ||||||
|  |  config ARCH_IXDP425 | ||||||
|  |  	bool "IXDP425" | ||||||
|  |  	help | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/Makefile linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Makefile | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/Makefile	2007-10-23 18:39:29.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Makefile	2007-10-23 19:11:31.000000000 +0200 | ||||||
|  | @@ -18,6 +18,7 @@ | ||||||
|  |  obj-pci-$(CONFIG_MACH_FSG)		+= fsg-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_PRONGHORNMETRO)	+= pronghornmetro-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_COMPEX)		+= ixdp425-pci.o | ||||||
|  | +obj-pci-$(CONFIG_MACH_WRT300NV2)		+= wrt300nv2-pci.o | ||||||
|  |   | ||||||
|  |  obj-y	+= common.o | ||||||
|  |   | ||||||
|  | @@ -34,6 +35,7 @@ | ||||||
|  |  obj-$(CONFIG_MACH_FSG)		+= fsg-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_PRONGHORNMETRO)	+= pronghornmetro-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_COMPEX)	+= compex-setup.o | ||||||
|  | +obj-$(CONFIG_MACH_WRT300NV2)	+= wrt300nv2-setup.o | ||||||
|  |   | ||||||
|  |  obj-$(CONFIG_PCI)		+= $(obj-pci-$(CONFIG_PCI)) common-pci.o | ||||||
|  |  obj-$(CONFIG_IXP4XX_QMGR)	+= ixp4xx_qmgr.o | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/wrt300nv2-pci.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/wrt300nv2-pci.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/wrt300nv2-pci.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/wrt300nv2-pci.c	2007-10-23 19:11:31.000000000 +0200 | ||||||
|  | @@ -0,0 +1,65 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arch/mach-ixp4xx/wrt300nv2-pci.c | ||||||
|  | + * | ||||||
|  | + * PCI setup routines for Linksys WRT300N v2 | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2007 Imre Kaloz <kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * based on coyote-pci.c: | ||||||
|  | + *	Copyright (C) 2002 Jungo Software Technologies. | ||||||
|  | + *	Copyright (C) 2003 MontaVista Softwrae, Inc. | ||||||
|  | + * | ||||||
|  | + * Maintainer: Imre Kaloz <kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * This program is free software; you can redistribute it and/or modify | ||||||
|  | + * it under the terms of the GNU General Public License version 2 as | ||||||
|  | + * published by the Free Software Foundation. | ||||||
|  | + * | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/pci.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/irq.h> | ||||||
|  | + | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | +#include <asm/hardware.h> | ||||||
|  | +#include <asm/irq.h> | ||||||
|  | + | ||||||
|  | +#include <asm/mach/pci.h> | ||||||
|  | + | ||||||
|  | +extern void ixp4xx_pci_preinit(void); | ||||||
|  | +extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); | ||||||
|  | +extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys); | ||||||
|  | + | ||||||
|  | +void __init wrt300nv2_pci_preinit(void) | ||||||
|  | +{ | ||||||
|  | +	set_irq_type(IRQ_IXP4XX_GPIO8, IRQT_LOW); | ||||||
|  | + | ||||||
|  | +	ixp4xx_pci_preinit(); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int __init wrt300nv2_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||||||
|  | +{ | ||||||
|  | +	if (slot == 1) | ||||||
|  | +		return IRQ_IXP4XX_GPIO8; | ||||||
|  | +	else return -1; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +struct hw_pci wrt300nv2_pci __initdata = { | ||||||
|  | +	.nr_controllers = 1, | ||||||
|  | +	.preinit =        wrt300nv2_pci_preinit, | ||||||
|  | +	.swizzle =        pci_std_swizzle, | ||||||
|  | +	.setup =          ixp4xx_setup, | ||||||
|  | +	.scan =           ixp4xx_scan_bus, | ||||||
|  | +	.map_irq =        wrt300nv2_map_irq, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +int __init wrt300nv2_pci_init(void) | ||||||
|  | +{ | ||||||
|  | +	if (machine_is_wrt300nv2()) | ||||||
|  | +		pci_common_init(&wrt300nv2_pci); | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +subsys_initcall(wrt300nv2_pci_init); | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/wrt300nv2-setup.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/wrt300nv2-setup.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/wrt300nv2-setup.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/wrt300nv2-setup.c	2007-10-23 19:11:31.000000000 +0200 | ||||||
|  | @@ -0,0 +1,108 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arm/mach-ixp4xx/wrt300nv2-setup.c | ||||||
|  | + * | ||||||
|  | + * Board setup for the Linksys WRT300N v2 | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2007 Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * based on coyote-setup.c: | ||||||
|  | + *      Copyright (C) 2003-2005 MontaVista Software, Inc. | ||||||
|  | + * | ||||||
|  | + * Author: Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/device.h> | ||||||
|  | +#include <linux/serial.h> | ||||||
|  | +#include <linux/tty.h> | ||||||
|  | +#include <linux/serial_8250.h> | ||||||
|  | +#include <linux/slab.h> | ||||||
|  | + | ||||||
|  | +#include <asm/types.h> | ||||||
|  | +#include <asm/setup.h> | ||||||
|  | +#include <asm/memory.h> | ||||||
|  | +#include <asm/hardware.h> | ||||||
|  | +#include <asm/irq.h> | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | +#include <asm/mach/arch.h> | ||||||
|  | +#include <asm/mach/flash.h> | ||||||
|  | + | ||||||
|  | +static struct flash_platform_data wrt300nv2_flash_data = { | ||||||
|  | +	.map_name	= "cfi_probe", | ||||||
|  | +	.width		= 2, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource wrt300nv2_flash_resource = { | ||||||
|  | +	.flags		= IORESOURCE_MEM, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device wrt300nv2_flash = { | ||||||
|  | +	.name		= "IXP4XX-Flash", | ||||||
|  | +	.id		= 0, | ||||||
|  | +	.dev		= { | ||||||
|  | +		.platform_data = &wrt300nv2_flash_data, | ||||||
|  | +	}, | ||||||
|  | +	.num_resources	= 1, | ||||||
|  | +	.resource	= &wrt300nv2_flash_resource, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource wrt300nv2_uart_resource = { | ||||||
|  | +	.start	= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +	.end	= IXP4XX_UART2_BASE_PHYS + 0x0fff, | ||||||
|  | +	.flags	= IORESOURCE_MEM, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct plat_serial8250_port wrt300nv2_uart_data[] = { | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART2, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ }, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device wrt300nv2_uart = { | ||||||
|  | +	.name		= "serial8250", | ||||||
|  | +	.id		= PLAT8250_DEV_PLATFORM, | ||||||
|  | +	.dev			= { | ||||||
|  | +		.platform_data	= wrt300nv2_uart_data, | ||||||
|  | +	}, | ||||||
|  | +	.num_resources	= 1, | ||||||
|  | +	.resource	= &wrt300nv2_uart_resource, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device *wrt300nv2_devices[] __initdata = { | ||||||
|  | +	&wrt300nv2_flash, | ||||||
|  | +	&wrt300nv2_uart | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static void __init wrt300nv2_init(void) | ||||||
|  | +{ | ||||||
|  | +	ixp4xx_sys_init(); | ||||||
|  | + | ||||||
|  | +	wrt300nv2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | ||||||
|  | +	wrt300nv2_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1; | ||||||
|  | + | ||||||
|  | +	*IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; | ||||||
|  | +	*IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; | ||||||
|  | + | ||||||
|  | +	platform_add_devices(wrt300nv2_devices, ARRAY_SIZE(wrt300nv2_devices)); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +#ifdef CONFIG_MACH_WRT300NV2 | ||||||
|  | +MACHINE_START(WRT300NV2, "Linksys WRT300N v2") | ||||||
|  | +	/* Maintainer: Imre Kaloz <kaloz@openwrt.org> */ | ||||||
|  | +	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  | +	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, | ||||||
|  | +	.map_io		= ixp4xx_map_io, | ||||||
|  | +	.init_irq	= ixp4xx_init_irq, | ||||||
|  | +	.timer		= &ixp4xx_timer, | ||||||
|  | +	.boot_params	= 0x0100, | ||||||
|  | +	.init_machine	= wrt300nv2_init, | ||||||
|  | +MACHINE_END | ||||||
|  | +#endif | ||||||
|  | diff -Nur linux-2.6.23/include/asm-arm/arch-ixp4xx/uncompress.h linux-2.6.23-owrt/include/asm-arm/arch-ixp4xx/uncompress.h | ||||||
|  | --- linux-2.6.23/include/asm-arm/arch-ixp4xx/uncompress.h	2007-10-23 18:03:35.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/include/asm-arm/arch-ixp4xx/uncompress.h	2007-10-23 19:12:30.000000000 +0200 | ||||||
|  | @@ -42,7 +42,7 @@ | ||||||
|  |  	 */ | ||||||
|  |  	if (machine_is_adi_coyote() || machine_is_gtwx5715() || | ||||||
|  |  			 machine_is_gateway7001() || machine_is_wg302v2() || | ||||||
|  | -			 machine_is_pronghorn_metro()) | ||||||
|  | +			 machine_is_pronghorn_metro() || machine_is_wrt300nv2()) | ||||||
|  |  		uart_base = (volatile u32*) IXP4XX_UART2_BASE_PHYS; | ||||||
|  |  	else | ||||||
|  |  		uart_base = (volatile u32*) IXP4XX_UART1_BASE_PHYS; | ||||||
| @@ -0,0 +1,41 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/wrt300nv2-setup.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/wrt300nv2-setup.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/wrt300nv2-setup.c	2007-10-23 19:20:08.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/wrt300nv2-setup.c	2007-10-23 19:22:19.000000000 +0200 | ||||||
|  | @@ -76,9 +76,36 @@ | ||||||
|  |  	.resource	= &wrt300nv2_uart_resource, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info wrt300nv2_plat_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.phy		= -1, | ||||||
|  | +		.rxq		= 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +	}, { | ||||||
|  | +		.phy		= 1, | ||||||
|  | +		.rxq		= 4, | ||||||
|  | +		.txreadyq	= 21, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device wrt300nv2_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.name			= "ixp4xx_eth", | ||||||
|  | +		.id			= IXP4XX_ETH_NPEB, | ||||||
|  | +		.dev.platform_data	= wrt300nv2_plat_eth, | ||||||
|  | +	}, { | ||||||
|  | +		.name			= "ixp4xx_eth", | ||||||
|  | +		.id			= IXP4XX_ETH_NPEC, | ||||||
|  | +		.dev.platform_data	= wrt300nv2_plat_eth + 1, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *wrt300nv2_devices[] __initdata = { | ||||||
|  |  	&wrt300nv2_flash, | ||||||
|  | -	&wrt300nv2_uart | ||||||
|  | +	&wrt300nv2_uart, | ||||||
|  | +	&wrt300nv2_eth[0], | ||||||
|  | +	&wrt300nv2_eth[1], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static void __init wrt300nv2_init(void) | ||||||
							
								
								
									
										240
									
								
								target/linux/ixp4xx/patches-2.6.23/140-sidewinder_support.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								target/linux/ixp4xx/patches-2.6.23/140-sidewinder_support.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,240 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Kconfig | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/Kconfig	2007-10-23 19:20:08.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Kconfig	2007-10-23 19:26:46.000000000 +0200 | ||||||
|  | @@ -65,6 +65,14 @@ | ||||||
|  |  	  Engineering Pronghorn Metro Platform. For more | ||||||
|  |  	  information on this platform, see <file:Documentation/arm/IXP4xx>. | ||||||
|  |   | ||||||
|  | +config MACH_SIDEWINDER | ||||||
|  | +	bool "Sidewinder" | ||||||
|  | +	select PCI | ||||||
|  | +	help | ||||||
|  | +	  Say 'Y' here if you want your kernel to support the ADI  | ||||||
|  | +	  Engineering Sidewinder Platform. For more | ||||||
|  | +	  information on this platform, see <file:Documentation/arm/IXP4xx>. | ||||||
|  | + | ||||||
|  |  config MACH_COMPEX | ||||||
|  |  	bool "Compex WP18 / NP18A" | ||||||
|  |  	select PCI | ||||||
|  | @@ -163,7 +171,7 @@ | ||||||
|  |  # | ||||||
|  |  config CPU_IXP46X | ||||||
|  |  	bool | ||||||
|  | -	depends on MACH_IXDP465 | ||||||
|  | +	depends on MACH_IXDP465 || MACH_SIDEWINDER | ||||||
|  |  	default y | ||||||
|  |   | ||||||
|  |  config CPU_IXP43X | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/Makefile linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Makefile | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/Makefile	2007-10-23 19:20:08.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/Makefile	2007-10-23 19:23:52.000000000 +0200 | ||||||
|  | @@ -19,6 +19,7 @@ | ||||||
|  |  obj-pci-$(CONFIG_MACH_PRONGHORNMETRO)	+= pronghornmetro-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_COMPEX)		+= ixdp425-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_WRT300NV2)		+= wrt300nv2-pci.o | ||||||
|  | +obj-pci-$(CONFIG_MACH_SIDEWINDER)		+= sidewinder-pci.o | ||||||
|  |   | ||||||
|  |  obj-y	+= common.o | ||||||
|  |   | ||||||
|  | @@ -36,6 +37,7 @@ | ||||||
|  |  obj-$(CONFIG_MACH_PRONGHORNMETRO)	+= pronghornmetro-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_COMPEX)	+= compex-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_WRT300NV2)	+= wrt300nv2-setup.o | ||||||
|  | +obj-$(CONFIG_MACH_SIDEWINDER)	+= sidewinder-setup.o | ||||||
|  |   | ||||||
|  |  obj-$(CONFIG_PCI)		+= $(obj-pci-$(CONFIG_PCI)) common-pci.o | ||||||
|  |  obj-$(CONFIG_IXP4XX_QMGR)	+= ixp4xx_qmgr.o | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/sidewinder-pci.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/sidewinder-pci.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/sidewinder-pci.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/sidewinder-pci.c	2007-10-23 19:23:52.000000000 +0200 | ||||||
|  | @@ -0,0 +1,71 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arch/mach-ixp4xx/pronghornmetro-pci.c | ||||||
|  | + * | ||||||
|  | + * PCI setup routines for ADI Engineering Sidewinder | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2007 Imre Kaloz <kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * based on coyote-pci.c: | ||||||
|  | + *	Copyright (C) 2002 Jungo Software Technologies. | ||||||
|  | + *	Copyright (C) 2003 MontaVista Softwrae, Inc. | ||||||
|  | + * | ||||||
|  | + * Maintainer: Imre Kaloz <kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * This program is free software; you can redistribute it and/or modify | ||||||
|  | + * it under the terms of the GNU General Public License version 2 as | ||||||
|  | + * published by the Free Software Foundation. | ||||||
|  | + * | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/pci.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/irq.h> | ||||||
|  | + | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | +#include <asm/hardware.h> | ||||||
|  | +#include <asm/irq.h> | ||||||
|  | + | ||||||
|  | +#include <asm/mach/pci.h> | ||||||
|  | + | ||||||
|  | +extern void ixp4xx_pci_preinit(void); | ||||||
|  | +extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); | ||||||
|  | +extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys); | ||||||
|  | + | ||||||
|  | +void __init sidewinder_pci_preinit(void) | ||||||
|  | +{ | ||||||
|  | +	set_irq_type(IRQ_IXP4XX_GPIO11, IRQT_LOW); | ||||||
|  | +	set_irq_type(IRQ_IXP4XX_GPIO10, IRQT_LOW); | ||||||
|  | +	set_irq_type(IRQ_IXP4XX_GPIO9, IRQT_LOW); | ||||||
|  | + | ||||||
|  | +	ixp4xx_pci_preinit(); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int __init sidewinder_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||||||
|  | +{ | ||||||
|  | +	if (slot == 1) | ||||||
|  | +		return IRQ_IXP4XX_GPIO11; | ||||||
|  | +	else if (slot == 2) | ||||||
|  | +		return IRQ_IXP4XX_GPIO10; | ||||||
|  | +	else if (slot == 3) | ||||||
|  | +		return IRQ_IXP4XX_GPIO9; | ||||||
|  | +	else return -1; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +struct hw_pci sidewinder_pci __initdata = { | ||||||
|  | +	.nr_controllers = 1, | ||||||
|  | +	.preinit =        sidewinder_pci_preinit, | ||||||
|  | +	.swizzle =        pci_std_swizzle, | ||||||
|  | +	.setup =          ixp4xx_setup, | ||||||
|  | +	.scan =           ixp4xx_scan_bus, | ||||||
|  | +	.map_irq =        sidewinder_map_irq, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +int __init sidewinder_pci_init(void) | ||||||
|  | +{ | ||||||
|  | +	if (machine_is_sidewinder()) | ||||||
|  | +		pci_common_init(&sidewinder_pci); | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +subsys_initcall(sidewinder_pci_init); | ||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/sidewinder-setup.c linux-2.6.23-owrt/arch/arm/mach-ixp4xx/sidewinder-setup.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/sidewinder-setup.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.23-owrt/arch/arm/mach-ixp4xx/sidewinder-setup.c	2007-10-23 19:23:52.000000000 +0200 | ||||||
|  | @@ -0,0 +1,115 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arm/mach-ixp4xx/sidewinder-setup.c | ||||||
|  | + * | ||||||
|  | + * Board setup for the ADI Engineering Sidewinder | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2007 Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * based on coyote-setup.c: | ||||||
|  | + *      Copyright (C) 2003-2005 MontaVista Software, Inc. | ||||||
|  | + * | ||||||
|  | + * Author: Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/serial.h> | ||||||
|  | +#include <linux/serial_8250.h> | ||||||
|  | + | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | +#include <asm/mach/arch.h> | ||||||
|  | +#include <asm/mach/flash.h> | ||||||
|  | + | ||||||
|  | +static struct flash_platform_data sidewinder_flash_data = { | ||||||
|  | +	.map_name	= "cfi_probe", | ||||||
|  | +	.width		= 2, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource sidewinder_flash_resource = { | ||||||
|  | +	.flags		= IORESOURCE_MEM, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device sidewinder_flash = { | ||||||
|  | +	.name		= "IXP4XX-Flash", | ||||||
|  | +	.id		= 0, | ||||||
|  | +	.dev		= { | ||||||
|  | +		.platform_data = &sidewinder_flash_data, | ||||||
|  | +	}, | ||||||
|  | +	.num_resources	= 1, | ||||||
|  | +	.resource	= &sidewinder_flash_resource, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource sidewinder_uart_resources[] = { | ||||||
|  | +	{ | ||||||
|  | +	.start	= IXP4XX_UART1_BASE_PHYS, | ||||||
|  | +	.end	= IXP4XX_UART1_BASE_PHYS + 0x0fff, | ||||||
|  | +	.flags	= IORESOURCE_MEM, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +	.start	= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +	.end	= IXP4XX_UART2_BASE_PHYS + 0x0fff, | ||||||
|  | +	.flags	= IORESOURCE_MEM, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct plat_serial8250_port sidewinder_uart_data[] = { | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART1_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART1, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART2, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ }, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device sidewinder_uart = { | ||||||
|  | +	.name		= "serial8250", | ||||||
|  | +	.id		= PLAT8250_DEV_PLATFORM, | ||||||
|  | +	.dev			= { | ||||||
|  | +		.platform_data	= sidewinder_uart_data, | ||||||
|  | +	}, | ||||||
|  | +	.num_resources	= 2, | ||||||
|  | +	.resource	= &sidewinder_uart_resources, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device *sidewinder_devices[] __initdata = { | ||||||
|  | +	&sidewinder_flash, | ||||||
|  | +	&sidewinder_uart, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static void __init sidewinder_init(void) | ||||||
|  | +{ | ||||||
|  | +	ixp4xx_sys_init(); | ||||||
|  | + | ||||||
|  | +	sidewinder_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | ||||||
|  | +	sidewinder_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_64M - 1; | ||||||
|  | + | ||||||
|  | +	*IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; | ||||||
|  | +	*IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; | ||||||
|  | + | ||||||
|  | +	platform_add_devices(sidewinder_devices, ARRAY_SIZE(sidewinder_devices)); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +#ifdef CONFIG_MACH_SIDEWINDER | ||||||
|  | +MACHINE_START(SIDEWINDER, "ADI Engineering Sidewinder") | ||||||
|  | +	/* Maintainer: Imre Kaloz <kaloz@openwrt.org> */ | ||||||
|  | +	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  | +	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, | ||||||
|  | +	.map_io		= ixp4xx_map_io, | ||||||
|  | +	.init_irq	= ixp4xx_init_irq, | ||||||
|  | +	.timer		= &ixp4xx_timer, | ||||||
|  | +	.boot_params	= 0x0100, | ||||||
|  | +	.init_machine	= sidewinder_init, | ||||||
|  | +MACHINE_END | ||||||
|  | +#endif | ||||||
| @@ -0,0 +1,212 @@ | |||||||
|  | diff -Nur linux-2.6.23.1/arch/arm/mach-ixp4xx/ap1000-setup.c linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/ap1000-setup.c | ||||||
|  | --- linux-2.6.23.1/arch/arm/mach-ixp4xx/ap1000-setup.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/ap1000-setup.c	2007-11-14 13:58:58.000000000 +0100 | ||||||
|  | @@ -0,0 +1,151 @@ | ||||||
|  | +/* | ||||||
|  | + * arch/arm/mach-ixp4xx/ap1000-setup.c | ||||||
|  | + * | ||||||
|  | + * Lanready AP-1000 | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2007 Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + * | ||||||
|  | + * based on ixdp425-setup.c: | ||||||
|  | + *	Copyright (C) 2003-2005 MontaVista Software, Inc. | ||||||
|  | + * | ||||||
|  | + * Author: Imre Kaloz <Kaloz@openwrt.org> | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/device.h> | ||||||
|  | +#include <linux/serial.h> | ||||||
|  | +#include <linux/tty.h> | ||||||
|  | +#include <linux/serial_8250.h> | ||||||
|  | +#include <linux/slab.h> | ||||||
|  | + | ||||||
|  | +#include <asm/types.h> | ||||||
|  | +#include <asm/setup.h> | ||||||
|  | +#include <asm/memory.h> | ||||||
|  | +#include <asm/hardware.h> | ||||||
|  | +#include <asm/mach-types.h> | ||||||
|  | +#include <asm/irq.h> | ||||||
|  | +#include <asm/mach/arch.h> | ||||||
|  | +#include <asm/mach/flash.h> | ||||||
|  | + | ||||||
|  | +static struct flash_platform_data ap1000_flash_data = { | ||||||
|  | +	.map_name	= "cfi_probe", | ||||||
|  | +	.width		= 2, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource ap1000_flash_resource = { | ||||||
|  | +	.flags		= IORESOURCE_MEM, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device ap1000_flash = { | ||||||
|  | +	.name		= "IXP4XX-Flash", | ||||||
|  | +	.id		= 0, | ||||||
|  | +	.dev		= { | ||||||
|  | +		.platform_data = &ap1000_flash_data, | ||||||
|  | +	}, | ||||||
|  | +	.num_resources	= 1, | ||||||
|  | +	.resource	= &ap1000_flash_resource, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct resource ap1000_uart_resources[] = { | ||||||
|  | +	{ | ||||||
|  | +		.start		= IXP4XX_UART1_BASE_PHYS, | ||||||
|  | +		.end		= IXP4XX_UART1_BASE_PHYS + 0x0fff, | ||||||
|  | +		.flags		= IORESOURCE_MEM | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.start		= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +		.end		= IXP4XX_UART2_BASE_PHYS + 0x0fff, | ||||||
|  | +		.flags		= IORESOURCE_MEM | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct plat_serial8250_port ap1000_uart_data[] = { | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART1_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART1, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ | ||||||
|  | +		.mapbase	= IXP4XX_UART2_BASE_PHYS, | ||||||
|  | +		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, | ||||||
|  | +		.irq		= IRQ_IXP4XX_UART2, | ||||||
|  | +		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, | ||||||
|  | +		.iotype		= UPIO_MEM, | ||||||
|  | +		.regshift	= 2, | ||||||
|  | +		.uartclk	= IXP4XX_UART_XTAL, | ||||||
|  | +	}, | ||||||
|  | +	{ }, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device ap1000_uart = { | ||||||
|  | +	.name			= "serial8250", | ||||||
|  | +	.id			= PLAT8250_DEV_PLATFORM, | ||||||
|  | +	.dev.platform_data	= ap1000_uart_data, | ||||||
|  | +	.num_resources		= 2, | ||||||
|  | +	.resource		= ap1000_uart_resources | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device *ap1000_devices[] __initdata = { | ||||||
|  | +	&ap1000_flash, | ||||||
|  | +	&ap1000_uart | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static char ap1000_mem_fixup[] __initdata = "mem=64M "; | ||||||
|  | + | ||||||
|  | +static void __init ap1000_fixup(struct machine_desc *desc, | ||||||
|  | +		struct tag *tags, char **cmdline, struct meminfo *mi) | ||||||
|  | + | ||||||
|  | +{ | ||||||
|  | +	struct tag *t = tags; | ||||||
|  | +	char *p = *cmdline; | ||||||
|  | + | ||||||
|  | +	/* Find the end of the tags table, taking note of any cmdline tag. */ | ||||||
|  | +	for (; t->hdr.size; t = tag_next(t)) { | ||||||
|  | +		if (t->hdr.tag == ATAG_CMDLINE) { | ||||||
|  | +			p = t->u.cmdline.cmdline; | ||||||
|  | +		} | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	/* Overwrite the end of the table with a new cmdline tag. */ | ||||||
|  | +	t->hdr.tag = ATAG_CMDLINE; | ||||||
|  | +	t->hdr.size = (sizeof (struct tag_header) + | ||||||
|  | +		strlen(ap1000_mem_fixup) + strlen(p) + 1 + 4) >> 2; | ||||||
|  | +	strlcpy(t->u.cmdline.cmdline, ap1000_mem_fixup, COMMAND_LINE_SIZE); | ||||||
|  | +	strlcpy(t->u.cmdline.cmdline + strlen(ap1000_mem_fixup), p, | ||||||
|  | +		COMMAND_LINE_SIZE - strlen(ap1000_mem_fixup)); | ||||||
|  | + | ||||||
|  | +	/* Terminate the table. */ | ||||||
|  | +	t = tag_next(t); | ||||||
|  | +	t->hdr.tag = ATAG_NONE; | ||||||
|  | +	t->hdr.size = 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static void __init ap1000_init(void) | ||||||
|  | +{ | ||||||
|  | +	ixp4xx_sys_init(); | ||||||
|  | + | ||||||
|  | +	ap1000_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | ||||||
|  | +	ap1000_flash_resource.end = | ||||||
|  | +		IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; | ||||||
|  | + | ||||||
|  | +	platform_add_devices(ap1000_devices, ARRAY_SIZE(ap1000_devices)); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +#ifdef CONFIG_MACH_AP1000 | ||||||
|  | +MACHINE_START(AP1000, "Lanready AP-1000") | ||||||
|  | +	/* Maintainer: Imre Kaloz <Kaloz@openwrt.org> */ | ||||||
|  | +	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS, | ||||||
|  | +	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc, | ||||||
|  | +	.fixup		= ap1000_fixup, | ||||||
|  | +	.map_io		= ixp4xx_map_io, | ||||||
|  | +	.init_irq	= ixp4xx_init_irq, | ||||||
|  | +	.timer		= &ixp4xx_timer, | ||||||
|  | +	.boot_params	= 0x0100, | ||||||
|  | +	.init_machine	= ap1000_init, | ||||||
|  | +MACHINE_END | ||||||
|  | +#endif | ||||||
|  | diff -Nur linux-2.6.23.1/arch/arm/mach-ixp4xx/ixdp425-pci.c linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/ixdp425-pci.c | ||||||
|  | --- linux-2.6.23.1/arch/arm/mach-ixp4xx/ixdp425-pci.c	2007-11-14 13:15:50.000000000 +0100 | ||||||
|  | +++ linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/ixdp425-pci.c	2007-11-14 13:27:16.000000000 +0100 | ||||||
|  | @@ -66,7 +66,8 @@ | ||||||
|  |  int __init ixdp425_pci_init(void) | ||||||
|  |  { | ||||||
|  |  	if (machine_is_ixdp425() || machine_is_ixcdp1100() || | ||||||
|  | -			machine_is_ixdp465() || machine_is_kixrp435() || machine_is_compex()) | ||||||
|  | +			machine_is_ixdp465() || machine_is_kixrp435() || | ||||||
|  | +			machine_is_compex() || machine_is_ap1000()) | ||||||
|  |  		pci_common_init(&ixdp425_pci); | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  | diff -Nur linux-2.6.23.1/arch/arm/mach-ixp4xx/Kconfig linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/Kconfig | ||||||
|  | --- linux-2.6.23.1/arch/arm/mach-ixp4xx/Kconfig	2007-11-14 13:15:50.000000000 +0100 | ||||||
|  | +++ linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/Kconfig	2007-11-14 13:25:07.000000000 +0100 | ||||||
|  | @@ -89,6 +89,14 @@ | ||||||
|  |  	  WRT300N v2 router. For more information on this | ||||||
|  |  	  platform, see http://openwrt.org | ||||||
|  |   | ||||||
|  | +config MACH_AP1000 | ||||||
|  | +	bool "Lanready AP-1000" | ||||||
|  | +	select PCI | ||||||
|  | +	help | ||||||
|  | +	  Say 'Y' here if you want your kernel to support Lanready's | ||||||
|  | +	  AP1000 board. For more information on this | ||||||
|  | +	  platform, see http://openwrt.org | ||||||
|  | + | ||||||
|  |  config ARCH_IXDP425 | ||||||
|  |  	bool "IXDP425" | ||||||
|  |  	help | ||||||
|  | diff -Nur linux-2.6.23.1/arch/arm/mach-ixp4xx/Makefile linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/Makefile | ||||||
|  | --- linux-2.6.23.1/arch/arm/mach-ixp4xx/Makefile	2007-11-14 13:15:50.000000000 +0100 | ||||||
|  | +++ linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/Makefile	2007-11-14 13:31:29.000000000 +0100 | ||||||
|  | @@ -20,6 +20,7 @@ | ||||||
|  |  obj-pci-$(CONFIG_MACH_COMPEX)		+= ixdp425-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_WRT300NV2)		+= wrt300nv2-pci.o | ||||||
|  |  obj-pci-$(CONFIG_MACH_SIDEWINDER)		+= sidewinder-pci.o | ||||||
|  | +obj-pci-$(CONFIG_MACH_AP1000)		+= ixdp425-pci.o | ||||||
|  |   | ||||||
|  |  obj-y	+= common.o | ||||||
|  |   | ||||||
|  | @@ -38,5 +39,6 @@ | ||||||
|  |  obj-$(CONFIG_MACH_COMPEX)	+= compex-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_WRT300NV2)	+= wrt300nv2-setup.o | ||||||
|  |  obj-$(CONFIG_MACH_SIDEWINDER)	+= sidewinder-setup.o | ||||||
|  | +obj-$(CONFIG_MACH_AP1000)	+= ap1000-setup.o | ||||||
|  |   | ||||||
|  |  obj-$(CONFIG_PCI)		+= $(obj-pci-$(CONFIG_PCI)) common-pci.o | ||||||
|  | diff -Nur linux-2.6.23.1/arch/arm/tools/mach-types linux-2.6.23.1-owrt/arch/arm/tools/mach-types | ||||||
|  | --- linux-2.6.23.1/arch/arm/tools/mach-types	2007-11-14 13:15:50.000000000 +0100 | ||||||
|  | +++ linux-2.6.23.1-owrt/arch/arm/tools/mach-types	2007-11-14 13:26:06.000000000 +0100 | ||||||
|  | @@ -1367,3 +1367,4 @@ | ||||||
|  |  csb726			MACH_CSB726		CSB726			1359 | ||||||
|  |  tik27			MACH_TIK27		TIK27			1360 | ||||||
|  |  mx_uc7420		MACH_MX_UC7420		MX_UC7420		1361 | ||||||
|  | +ap1000			MACH_AP1000		AP1000			1543 | ||||||
| @@ -0,0 +1,41 @@ | |||||||
|  | diff -Nur linux-2.6.23.1/arch/arm/mach-ixp4xx/ap1000-setup.c linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/ap1000-setup.c | ||||||
|  | --- linux-2.6.23.1/arch/arm/mach-ixp4xx/ap1000-setup.c	2007-11-14 14:11:10.000000000 +0100 | ||||||
|  | +++ linux-2.6.23.1-owrt/arch/arm/mach-ixp4xx/ap1000-setup.c	2007-11-14 14:09:30.000000000 +0100 | ||||||
|  | @@ -90,9 +90,36 @@ | ||||||
|  |  	.resource		= ap1000_uart_resources | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/* Built-in 10/100 Ethernet MAC interfaces */ | ||||||
|  | +static struct eth_plat_info ap1000_plat_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.phy		= 4, | ||||||
|  | +		.rxq		= 3, | ||||||
|  | +		.txreadyq	= 20, | ||||||
|  | +	}, { | ||||||
|  | +		.phy		= 5, | ||||||
|  | +		.rxq		= 4, | ||||||
|  | +		.txreadyq	= 21, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static struct platform_device ap1000_eth[] = { | ||||||
|  | +	{ | ||||||
|  | +		.name			= "ixp4xx_eth", | ||||||
|  | +		.id			= IXP4XX_ETH_NPEB, | ||||||
|  | +		.dev.platform_data	= ap1000_plat_eth, | ||||||
|  | +	}, { | ||||||
|  | +		.name			= "ixp4xx_eth", | ||||||
|  | +		.id			= IXP4XX_ETH_NPEC, | ||||||
|  | +		.dev.platform_data	= ap1000_plat_eth + 1, | ||||||
|  | +	} | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static struct platform_device *ap1000_devices[] __initdata = { | ||||||
|  |  	&ap1000_flash, | ||||||
|  | -	&ap1000_uart | ||||||
|  | +	&ap1000_uart, | ||||||
|  | +	&ap1000_eth[0], | ||||||
|  | +	&ap1000_eth[1], | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  static char ap1000_mem_fixup[] __initdata = "mem=64M "; | ||||||
							
								
								
									
										3988
									
								
								target/linux/ixp4xx/patches-2.6.23/200-npe_driver.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3988
									
								
								target/linux/ixp4xx/patches-2.6.23/200-npe_driver.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | diff -Nur linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c linux-2.6.23-openwrt/arch/arm/mach-ixp4xx/ixp4xx_npe.c | ||||||
|  | --- linux-2.6.23/arch/arm/mach-ixp4xx/ixp4xx_npe.c	2007-10-22 22:18:15.000000000 +0200 | ||||||
|  | +++ linux-2.6.23-openwrt/arch/arm/mach-ixp4xx/ixp4xx_npe.c	2007-10-22 22:32:48.000000000 +0200 | ||||||
|  | @@ -585,6 +585,8 @@ | ||||||
|  |  	npe_reset(npe); | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +	print_npe(KERN_INFO, npe, "firmware's license can be found in /usr/share/doc/LICENSE.IPL\n"); | ||||||
|  | + | ||||||
|  |  	print_npe(KERN_INFO, npe, "firmware functionality 0x%X, " | ||||||
|  |  		  "revision 0x%X:%X\n", (image->id >> 16) & 0xFF, | ||||||
|  |  		  (image->id >> 8) & 0xFF, image->id & 0xFF); | ||||||
		Reference in New Issue
	
	Block a user
	 Imre Kaloz
					Imre Kaloz