This patch improves Freecom DT2 support: 1. fix PCI init 2. adds separate patch directory 3. sets up WAN MAC address 4. adds webupgrade support
Signed-off-by: [email protected] Index: files/arch/arm/mach-orion5x/dt2-setup.c =================================================================== --- files/arch/arm/mach-orion5x/dt2-setup.c (revision 17451) +++ files/arch/arm/mach-orion5x/dt2-setup.c (working copy) @@ -19,6 +19,8 @@ #include <linux/mv643xx_eth.h> #include <linux/ethtool.h> #include <linux/if_ether.h> +#include <linux/netdevice.h> +#include <linux/etherdevice.h> #include <net/dsa.h> #include <linux/ata_platform.h> #include <linux/i2c.h> @@ -76,9 +78,10 @@ static struct mtd_partition dt2_partitions[] = { { - .name = "u-boot", - .size = 0x00080000, - .offset = 0, + .name = "U-Boot Config", + .offset = 0x00000000, + /* only the first 4kB is used */ + .size = SZ_4K, }, }; @@ -122,12 +125,12 @@ set_irq_type(irq, IRQ_TYPE_LEVEL_LOW); printk (KERN_INFO "PCI IntA IRQ: %d\n", irq); } else { - printk(KERN_ERR "dt2_pci_preinit failed to " - "set_irq_type pin %d\n", pin); + printk(KERN_ERR "%s(%d): failed to " + "set_irq_type pin %d\n", __FUNCTION__, __LINE__, pin); gpio_free(pin); } } else { - printk(KERN_ERR "dt2_pci_preinit failed to request gpio % d\n", pin); + printk(KERN_ERR "%s(%d): failed to gpio_request %d\n", __FUNCTION__, __LINE__, pin); } pin = DT2_PCI_SLOT0_IRQ_B_PIN; @@ -137,12 +140,12 @@ set_irq_type(irq, IRQ_TYPE_LEVEL_LOW); printk (KERN_INFO "PCI IntB IRQ: %d\n", irq); } else { - printk(KERN_ERR "dt2_pci_preinit failed to " - "set_irq_type pin %d\n", pin); + printk(KERN_ERR "%s(%d): failed to " + "set_irq_type pin %d\n", __FUNCTION__, __LINE__, pin); gpio_free(pin); } } else { - printk(KERN_ERR "dt2_pci_preinit failed to gpio_request % d\n", pin); + printk(KERN_ERR "%s(%d): failed to gpio_request %d\n", __FUNCTION__, __LINE__, pin); } } @@ -155,29 +158,21 @@ */ irq = orion5x_pci_map_irq(dev, slot, pin); if (irq != -1){ - printk(KERN_INFO "orion5x_pci_map_irq: %d\n", irq); + printk(KERN_INFO "%s: %d\n",__FUNCTION__, irq); return irq; } /* - * PCI IRQs are connected via GPIOs + * PCI IRQs are connected via GPIOs. */ switch (slot - DT2_PCI_SLOT0_OFFS) { case 0: - if (pin == 1){ - irq = gpio_to_irq(DT2_PCI_SLOT0_IRQ_A_PIN); - printk(KERN_INFO "dt2_pci_map_irq DT2_PCI_SLOT0_IRQ_A_PIN: %d\n", irq); - } - else { - irq = gpio_to_irq(DT2_PCI_SLOT0_IRQ_B_PIN); - printk(KERN_INFO "dt2_pci_map_irq DT2_PCI_SLOT0_IRQ_B_PIN: %d\n", irq); - } + return gpio_to_irq(DT2_PCI_SLOT0_IRQ_A_PIN); + case 1: + return gpio_to_irq(DT2_PCI_SLOT0_IRQ_B_PIN); default: - irq = -1; - printk(KERN_INFO "dt2_pci_map_irq IRQ: %d\n", irq); + return -1; } - - return irq; } static struct hw_pci dt2_pci __initdata = { @@ -292,6 +287,40 @@ return IRQ_HANDLED; } +static int dt2_netdev_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + struct net_device *dev = ptr; + struct sockaddr mac; + + if (event == NETDEV_REGISTER && strcmp(dev->name, dt2_switch_chip_data.port_names[0]) == 0) { + memcpy(mac.sa_data, dt2_eeprom.gw.mac_addr[1], 6); + if (is_valid_ether_addr(mac.sa_data)) { + mac.sa_family = dev->type; + /* + * Setting individual MAC address for WAN port makes switch WAN port to + * not function properly. (It is pingable from lan side, but not outside.) + * This not only in this code but also from Opewrt /etc/config/network + * Therefore until it is resolved, setting WAN MAC address is disabled. + */ + dev_set_mac_address(dev, &mac); + printk(KERN_INFO + "dt2: MAC address now set to %.2x:%.2x:%.2x:%.2x:%.2x:%.2x for port 1\n", + mac.sa_data[0], mac.sa_data[1], mac.sa_data[2], + mac.sa_data[3], mac.sa_data[4], mac.sa_data[5]); + } + else { + printk(KERN_ERR "dt2: No valid MAC address for port 1\n"); + } + } + + return NOTIFY_DONE; +} + +static struct notifier_block dt2_netdev_notifier = { + .notifier_call = dt2_netdev_event, +}; + static void __init dt2_init(void) { DECLARE_MAC_BUF(mac_buf); @@ -305,7 +334,6 @@ /* * Configure peripherals. */ - orion5x_uart0_init(); orion5x_ehci0_init(); orion5x_ehci1_init(); @@ -313,18 +341,16 @@ orion5x_sata_init(&dt2_sata_data); orion5x_xor_init(); - printk(KERN_INFO "U-Boot parameters:\n"); - printk(KERN_INFO "Sys Clk = %d, Tclk = %d, BoardID = 0x%02x\n", mvSysclk, mvTclk, gBoardId); + printk(KERN_INFO "dt2: Serial: %s\n", dt2_eeprom.fc.dt2_serial_number); + printk(KERN_INFO "dt2: Revision: %016x\n", dt2_eeprom.fc.dt2_revision); - printk(KERN_INFO "Serial: %s\n", dt2_eeprom.fc.dt2_serial_number); - printk(KERN_INFO "Revision: %016x\n", dt2_eeprom.fc.dt2_revision); - printk(KERN_INFO "DT2: Using MAC address %s for port 0\n", - print_mac(mac_buf, dt2_eeprom.gw.mac_addr[0])); - printk(KERN_INFO "DT2: Using MAC address %s for port 1\n", - print_mac(mac_buf, dt2_eeprom.gw.mac_addr[1])); + register_netdevice_notifier(&dt2_netdev_notifier); orion5x_eth_init(&dt2_eth_data); memcpy(dt2_eth_data.mac_addr, dt2_eeprom.gw.mac_addr[0], 6); + printk(KERN_INFO "dt2: MAC address now set to %s for port 0\n", + print_mac(mac_buf, dt2_eeprom.gw.mac_addr[0])); + orion5x_eth_switch_init(&dt2_switch_plat_data, NO_IRQ); i2c_register_board_info(0, &dt2_i2c_rtc, 1); @@ -337,18 +363,18 @@ if (request_irq(gpio_to_irq(DT2_PIN_GPIO_RESET), &dt2_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, - "DT2: Reset button", NULL) < 0) { + "Reset button", NULL) < 0) { - printk("DT2: Reset Button IRQ %d not available\n", - gpio_to_irq(DT2_PIN_GPIO_RESET)); + printk(KERN_ERR "%s(%d): Reset Button IRQ %d not available\n", + __FUNCTION__, __LINE__, gpio_to_irq (DT2_PIN_GPIO_RESET)); } if (request_irq(gpio_to_irq(DT2_PIN_GPIO_POWER), &dt2_power_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, - "DT2: Power button", NULL) < 0) { + "Power button", NULL) < 0) { - printk(KERN_DEBUG "DT2: Power Button IRQ %d not available\n", - gpio_to_irq(DT2_PIN_GPIO_POWER)); + printk(KERN_ERR "%s(%d): Power Button IRQ %d not available\n", + __FUNCTION__, __LINE__, gpio_to_irq (DT2_PIN_GPIO_POWER)); } } @@ -394,8 +420,8 @@ /* Locate the Freecom cmdline */ if (t->hdr.tag == ATAG_CMDLINE) { p = t->u.cmdline.cmdline; - printk("%s(%d): Found cmdline '%s' at 0x%0lx\n", - __FUNCTION__, __LINE__, p, (unsigned long) p); + printk(KERN_INFO "Found Freecom cmdline '%s' at 0x%0lx\n", + p, (unsigned long)p); } /* * Many orion-based systems have buggy bootloader implementations. @@ -411,7 +437,7 @@ } } - printk("%s(%d): End of table at 0x%0lx\n", __FUNCTION__, __LINE__, (unsigned long)t); + printk(KERN_INFO "End of table at 0x%0lx\n", (unsigned long)t); /* Overwrite the end of the table with a new cmdline tag. */ t->hdr.tag = ATAG_CMDLINE; @@ -423,13 +449,12 @@ strlcpy(t->u.cmdline.cmdline + strlen(p), openwrt_init_tag, COMMAND_LINE_SIZE - strlen(p)); - printk("%s(%d): New cmdline '%s' at 0x%0lx\n", - __FUNCTION__, __LINE__, + printk(KERN_INFO "Set new OpenWrt cmdline '%s' at 0x%0lx\n", t->u.cmdline.cmdline, (unsigned long)t->u.cmdline.cmdline); t = tag_next(t); - printk("%s(%d): New end of table at 0x%0lx\n", __FUNCTION__, __LINE__, (unsigned long)t); + printk(KERN_INFO "New end of table at 0x%0lx\n", (unsigned long) t); t->hdr.tag = ATAG_NONE; t->hdr.size = 0; Index: harddisk/profiles/100-DT2.mk =================================================================== --- harddisk/profiles/100-DT2.mk (revision 0) +++ harddisk/profiles/100-DT2.mk (revision 0) @@ -0,0 +1,20 @@ +# +# Copyright (C) 2009 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +define Profile/DT2 + NAME:=Freecom DT2 + PACKAGES:= \ + kmod-madwifi wireless-tools \ + kmod-usb-core kmod-usb-uhci kmod-usb2 kmod-usb-storage \ + kmod-fs-ext2 kmod-fs-ext3 +endef + +define Profile/DT2/Description + Package set optimized for the Freecom DT2 +endef +$(eval $(call Profile,DT2)) + Index: harddisk/config-default =================================================================== --- harddisk/config-default (revision 17451) +++ harddisk/config-default (working copy) @@ -33,3 +33,6 @@ CONFIG_EXT2_FS=y CONFIG_EXT3_FS=y CONFIG_JBD=y +CONFIG_MTD_JEDECPROBE=y +# CONFIG_MTD_IMPA7 is not set + Index: harddisk/base-files/lib/upgrade/platform.sh =================================================================== --- harddisk/base-files/lib/upgrade/platform.sh (revision 0) +++ harddisk/base-files/lib/upgrade/platform.sh (revision 0) @@ -0,0 +1,58 @@ +RAMFS_COPY_BIN="/bin/gzip /bin/tar /bin/rm /usr/bin/bzip2 /usr/bin/cut /u sr/bin/expr /usr/bin/uboot-dt2 /usr/bin/decodefw-dt2" +platform_check_image() { + [ "$ARGC" -gt 1 ] && return 1 + + case "$(get_magic_word "$1")" in + 4454) return 0;; + *) + echo "Invalid image type" + return 1 + ;; + esac +} + +platform_do_upgrade() { + MTD_BIN=/tmp/mtd0.bin + UBOOT_CONFIG=/dev/mtd0 + + #mount new root partition + NEWROOTDEV=$(cat /proc/cmdline | cut -d" " -f2 | cut -d= -f2) + NEWROOTDEV=${NEWROOTDEV:7:1} + if [ $NEWROOTDEV == 1 ]; then + NEWROOTDEV=0 + else + NEWROOTDEV=1 + fi + mount /dev/md$NEWROOTDEV /mnt + + #extract firmware + rm -R /mnt/* + decodefw-dt2 -s "$1" -d /tmp/.update + cd /mnt + tar -xj -f /tmp/.update + rm -f /tmp/.update + + dd if=$UBOOT_CONFIG of=$MTD_BIN + uboot-dt2 -s -w -d $MTD_BIN -n bootargs_root - x "root=/dev/md$NEWROOTDEV rw" + NEWROOTDEV=`expr $NEWROOTDEV + 1` + uboot-dt2 -s -w -d $MTD_BIN -n bootpartition -x $NEWROOTDEV + mtd -e $UBOOT_CONFIG write $MTD_BIN $UBOOT_CONFIG + + #restore conffiles + [ "$SAVE_CONFIG" -eq 1 ] && { + cd /mnt + v "Restoring config files..." + [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V="" + tar x${TAR_V}z -f "$CONF_TAR" + } + + return 0 +} + +platform_refresh_partitions() { + return 0 +} + +platform_copy_config() { + return 0 +} Index: harddisk/base-files/etc/config/fstab =================================================================== --- harddisk/base-files/etc/config/fstab (revision 0) +++ harddisk/base-files/etc/config/fstab (revision 0) @@ -0,0 +1,10 @@ +config mount + option target /home + option device /dev/md3 + option fstype ext3 + option options rw,sync + option enabled 1 + +config swap + option device /dev/md2 + option enabled 1 Property changes on: harddisk/base-files/etc/config/fstab ___________________________________________________________________ Added: svn:executable + * Index: harddisk/base-files/etc/diag.sh =================================================================== --- harddisk/base-files/etc/diag.sh (revision 0) +++ harddisk/base-files/etc/diag.sh (revision 0) @@ -0,0 +1,15 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +set_state() { + case "$1" in + preinit) + ;; + done) + [ -d /sys/class/leds/dt2:blue:satahw ] && { + echo 1 > /sys/class/leds/dt2:blue:satahw/brightness + echo 1 > /sys/class/leds/dt2:blue:power/brightness + } + ;; + esac +} Index: harddisk/base-files/sbin/mount_root =================================================================== --- harddisk/base-files/sbin/mount_root (revision 0) +++ harddisk/base-files/sbin/mount_root (revision 0) @@ -0,0 +1,7 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org +. /etc/functions.sh + +ROOTDEV=$(cat /proc/cmdline | cut -d" " -f2 | cut -d= -f2) + +mount -o remount,rw,noatime,nodiratime $ROOTDEV / Property changes on: harddisk/base-files/sbin/mount_root ___________________________________________________________________ Added: svn:executable + * Index: Makefile =================================================================== --- Makefile (revision 17451) +++ Makefile (working copy) @@ -20,4 +20,15 @@ DEFAULT_PACKAGES += kmod-ath9k hostapd-mini +ifeq ($(CONFIG_TARGET_orion_harddisk_DT2),y) +PATCH_DIR:=./patches-dt2 +define Kernel/Patch + #enable some busybox utilities disabled by default but needed for sysupdate + $(SED) 's,.*CONFIG_BUSYBOX_CONFIG_BZIP2.*,CONFIG_BUSYBOX_CONFIG_BZ IP2=y,' \ + - e 's,.*CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_BZ2.*,CONFIG_BUSYBOX_CONFIG_ FEATURE_SEAMLESS_BZ2=y,' \ + $(TOPDIR)/.config + $(call Kernel/Patch/Default) +endef +endif + $(eval $(call BuildTarget)) Index: patches-dt2/200-dt2_board_support.patch =================================================================== --- patches-dt2/200-dt2_board_support.patch (revision 0) +++ patches-dt2/200-dt2_board_support.patch (revision 0) @@ -0,0 +1,23 @@ +--- a/arch/arm/mach-orion5x/Kconfig ++++ b/arch/arm/mach-orion5x/Kconfig +@@ -16,6 +16,13 @@ config MACH_RD88F5182 + Say 'Y' here if you want your kernel to support the + Marvell Orion-NAS (88F5182) RD2 + ++config MACH_DT2 ++ bool "Freecom DataTank Gateway" ++ select I2C_BOARDINFO ++ help ++ Say 'Y' here if you want your kernel to support the ++ Freecom DataTank Gateway ++ + config MACH_KUROBOX_PRO + bool "KuroBox Pro" + select I2C_BOARDINFO +--- a/arch/arm/mach-orion5x/Makefile ++++ b/arch/arm/mach-orion5x/Makefile +@@ -17,3 +17,4 @@ obj-$(CONFIG_MACH_WNR854T) += wnr854t-se + obj-$(CONFIG_MACH_RD88F5181L_GE) += rd88f5181l-ge-setup.o + obj-$(CONFIG_MACH_RD88F5181L_FXO) += rd88f5181l-fxo-setup.o + obj-$(CONFIG_MACH_RD88F6183AP_GE) += rd88f6183ap-ge-setup.o ++obj-$(CONFIG_MACH_DT2) += dt2-setup.o _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
