[PATCH/RFC (take 2)] linkstation / kurobox support under arch/powerpc
Kumar Gala
galak at kernel.crashing.org
Tue Nov 7 06:41:48 EST 2006
On Nov 5, 2006, at 9:22 AM, Guennadi Liakhovetski wrote:
> Here comes the 2nd version of the linkstation / kurobox patch. Changes
> since the last version:
>
> On Wed, 1 Nov 2006, Guennadi Liakhovetski wrote:
>
>> A couple things that I don't like that much in this patch:
>>
>> 1) hardcoded PCI IRQ map - I'll have to put it in dts too;
>
> Done. Taken from the fdt now.
>
> Some more cleanup, (seemingly) unneeded stuff removed.
>
> Even if it is not included so far due to variousother pending patches,
> please DO review.
>
> Thanks
> Guennadi
> ---
> Guennadi Liakhovetski
>
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski at gmx.de>
>
> diff --git a/arch/powerpc/boot/dts/kuroboxHG.dts b/arch/powerpc/
> boot/dts/kuroboxHG.dts
> new file mode 100644
> index 0000000..6c76ef6
> --- /dev/null
> +++ b/arch/powerpc/boot/dts/kuroboxHG.dts
> @@ -0,0 +1,183 @@
> +/*
> + * Device Tree Souce for Buffalo KuroboxHG
> + *
> + * Based on sandpoint.dts
> + *
> + * 2006 (c) G. Liakhovetski <g.liakhovetski at gmx.de>
> + *
> + * 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.
> +
> +XXXX add flash parts, rtc, ??
> +
> +build with: "dtc -f -I dts -O dtb -o kuroboxHG.dtb -V 16
> kuroboxHG.dts"
> +
> +
> + */
> +
> +/ {
> + linux,phandle = <1000>;
> + model = "KuroboxHG";
> + compatible = "linkstation";
> + #address-cells = <1>;
> + #size-cells = <1>;
> +
> + cpus {
> + linux,phandle = <2000>;
> + #cpus = <1>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + PowerPC,603e { /* Really 8241 */
> + linux,phandle = <2100>;
> + linux,boot-cpu;
> + device_type = "cpu";
> + reg = <0>;
> + clock-frequency = <fdad680>; /* Fixed by bootwrapper */
> + timebase-frequency = <1F04000>; /* Fixed by bootwrapper */
> + bus-frequency = <0>; /* From bootloader */
> + /* Following required by dtc but not used */
> + i-cache-line-size = <0>;
> + d-cache-line-size = <0>;
> + i-cache-size = <4000>;
> + d-cache-size = <4000>;
> + };
> + };
> +
> + memory {
> + linux,phandle = <3000>;
> + device_type = "memory";
> + reg = <00000000 08000000>;
> + };
> +
> + soc10x { /* AFAICT need to make soc for 8245's uarts to be
> defined */
> + linux,phandle = <4000>;
> + #address-cells = <1>;
> + #size-cells = <1>;
> + #interrupt-cells = <2>;
> + device_type = "soc";
> + compatible = "mpc10x";
> + store-gathering = <0>; /* 0 == off, !0 == on */
> + reg = <80000000 00100000>;
> + ranges = <80000000 80000000 70000000 /* pci mem space */
> + fc000000 fc000000 00100000 /* EUMB */
> + fe000000 fe000000 00c00000 /* pci i/o space */
> + fec00000 fec00000 00300000 /* pci cfg regs */
> + fef00000 fef00000 00100000>; /* pci iack */
> +
> + dma at 80001100 {
> + linux,phandle = <4100>;
> + #interrupt-cells = <1>;
> + #address-cells = <1>;
> + #size-cells = <1>;
> + device_type = "dma";
> + compatible = "fsl-dma";
> + clock-frequency = <0>;
> + reg = <80001100 24>;
> + interrupts = <6 0>;
> + interrupt-parent = <4400>;
> + };
> +
> + dma at 80001200 {
> + linux,phandle = <4200>;
> + #interrupt-cells = <1>;
> + #address-cells = <1>;
> + #size-cells = <1>;
> + device_type = "dma";
> + compatible = "fsl-dma";
> + clock-frequency = <0>;
> + reg = <80001200 24>;
> + interrupts = <7 0>;
> + interrupt-parent = <4400>;
> + };
> +
> + i2c at 80003000 {
> + linux,phandle = <4300>;
> + device_type = "i2c";
> + compatible = "fsl-i2c";
> + clock-frequency = <0>;
> + reg = <80003000 1000>;
> + interrupts = <5 2>;
> + interrupt-parent = <4400>;
> + };
> +
> + serial at 80004500 {
> + linux,phandle = <4511>;
> + device_type = "serial";
> + compatible = "ns16550";
> + reg = <80004500 8>;
> + clock-frequency = <7c044a8>;
> + current-speed = <2580>;
> + interrupts = <9 2>;
> + interrupt-parent = <4400>;
> + };
> +
> + serial at 80004600 {
> + linux,phandle = <4512>;
> + device_type = "serial";
> + compatible = "ns16550";
> + reg = <80004600 8>;
> + clock-frequency = <7c044a8>;
> + current-speed = <e100>;
> + interrupts = <a 0>;
> + interrupt-parent = <4400>;
> + };
> +
> + pic at 80040000 {
> + linux,phandle = <4400>;
> + #interrupt-cells = <2>;
> + #address-cells = <0>;
> + device_type = "open-pic";
> + compatible = "chrp,open-pic";
> + interrupt-controller;
> + reg = <80040000 40000>;
> + clock-frequency = <0>; /* ??? */
> + built-in;
> + };
> +
> + pci at fec00000 {
> + linux,phandle = <4500>;
> + #address-cells = <3>;
> + #size-cells = <2>;
> + #interrupt-cells = <1>;
> + device_type = "pci";
> + compatible = "mpc10x-pci";
> + reg = <fec00000 400000>;
> + ranges = <01000000 0 0 fe000000 0 00c00000
> + 02000000 0 80000000 80000000 0 70000000>;
> + bus-range = <0 ff>;
> + clock-frequency = <7f28155>;
> + interrupt-parent = <4400>;
> + interrupt-map-mask = <f800 0 0 7>;
> + interrupt-map = <
> + /* IDSEL 0x11 - IRQ0 ETH */
> + 5800 0 0 1 4400 0 1
> + 5800 0 0 2 4400 1 1
> + 5800 0 0 3 4400 2 1
> + 5800 0 0 4 4400 3 1
> + /* IDSEL 0x12 - IRQ1 IDE0 */
> + 6000 0 0 1 4400 1 1
> + 6000 0 0 2 4400 2 1
> + 6000 0 0 3 4400 3 1
> + 6000 0 0 4 4400 0 1
> + /* IDSEL 0x13 - IRQ4 IDE1 */
> + 6800 0 0 1 4400 3 1
> + 6800 0 0 2 4400 0 1
> + 6800 0 0 3 4400 1 1
> + 6800 0 0 4 4400 2 1
> + /* IDSEL 0x14 - IRQ3 USB2.0 */
> + 7000 0 0 1 4400 3 1
> + 7000 0 0 2 4400 3 1
> + 7000 0 0 3 4400 3 1
> + 7000 0 0 4 4400 3 1
> + /* IDSEL 0x15 - IRQ2 fan ctrl*/
> + 7800 0 0 1 4400 2 1
> + 7800 0 0 2 4400 3 1
> + 7800 0 0 3 4400 0 1
> + 7800 0 0 4 4400 1 1
> + >;
> + };
> + };
> +};
>
[snip]
> diff --git a/arch/powerpc/platforms/embedded6xx/Kconfig b/arch/
> powerpc/platforms/embedded6xx/Kconfig
> index 234a861..c1c6748 100644
> --- a/arch/powerpc/platforms/embedded6xx/Kconfig
> +++ b/arch/powerpc/platforms/embedded6xx/Kconfig
> @@ -76,6 +76,15 @@ config PRPMC800
> Select SANDPOINT if configuring for a Motorola Sandpoint X3
> (any flavor).
>
> +config LINKSTATION
> + bool "Linkstation / Kurobox(HG) from Buffalo"
> + select MPIC
> + select FSL_SOC
> + select PPC_UDBG_16550 if SERIAL_8250
> + help
> + Select LINKSTATION if configuring for a PPC-based Linkstation
> + (LS-1) or Kurobox(HG) from Buffalo Technologies.
> +
> config MPC7448HPC2
> bool "Freescale MPC7448HPC2(Taiga)"
> select TSI108_BRIDGE
> @@ -164,6 +173,19 @@ config EV64360
> platform.
> endchoice
>
> +choice
> + prompt "Linkstation Type"
> + depends on LINKSTATION
> + default KUROBOXHG
> +
> +config KUROBOX
> + bool "Kurobox"
> +
> +config KUROBOXHG
> + bool "Kurobox HG"
> +
These two config options don't appear to be used anywhere
> +endchoice
> +
> config PQ2ADS
> bool
> depends on ADS8272
> @@ -210,7 +232,7 @@ config PPC_GEN550
> depends on SANDPOINT || SPRUCE || PPLUS || \
> PRPMC750 || PRPMC800 || LOPEC || \
> (EV64260 && !SERIAL_MPSC) || CHESTNUT || RADSTONE_PPC7D || \
> - 83xx
> + 83xx || LINKSTATION
> default y
>
> config FORCE
> @@ -284,13 +306,13 @@ config HARRIER
>
> config MPC10X_BRIDGE
> bool
> - depends on POWERPMC250 || LOPEC || SANDPOINT
> + depends on POWERPMC250 || LOPEC || SANDPOINT || LINKSTATION
> select PPC_INDIRECT_PCI
> default y
>
> config MPC10X_OPENPIC
> bool
> - depends on POWERPMC250 || LOPEC || SANDPOINT
> + depends on POWERPMC250 || LOPEC || SANDPOINT || LINKSTATION
> default y
>
> config MPC10X_STORE_GATHERING
> diff --git a/arch/powerpc/platforms/embedded6xx/Makefile b/arch/
> powerpc/platforms/embedded6xx/Makefile
> index fa499fe..1f3edc7 100644
> --- a/arch/powerpc/platforms/embedded6xx/Makefile
> +++ b/arch/powerpc/platforms/embedded6xx/Makefile
> @@ -3,3 +3,4 @@ #
> #
> obj-$(CONFIG_MPC7448HPC2) += mpc7448_hpc2.o
> obj-$(CONFIG_SANDPOINT) += sandpoint.o
> +obj-$(CONFIG_LINKSTATION) += linkstation.o ls_uart.o
> diff --git a/arch/powerpc/platforms/embedded6xx/linkstation.c b/
> arch/powerpc/platforms/embedded6xx/linkstation.c
> new file mode 100644
> index 0000000..30bcb5b
> --- /dev/null
> +++ b/arch/powerpc/platforms/embedded6xx/linkstation.c
> @@ -0,0 +1,254 @@
> +/*
> + * arch/powerpc/platforms/embedded6xx/linkstation.c
> + *
> + * Board setup routines for the Buffalo Linkstation / Kurobox
> Platform.
> + *
> + * Author: Mark A. Greer
> + * mgreer at mvista.com
> + *
> + * 2000-2003 (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.
> + */
> +
> +#include <linux/stddef.h>
> +#include <linux/kernel.h>
> +#include <linux/init.h>
> +#include <linux/errno.h>
> +#include <linux/reboot.h>
> +#include <linux/pci.h>
> +#include <linux/kdev_t.h>
> +#include <linux/major.h>
> +#include <linux/initrd.h>
> +#include <linux/console.h>
> +#include <linux/delay.h>
> +#include <linux/ide.h>
> +#include <linux/seq_file.h>
> +#include <linux/root_dev.h>
> +#include <linux/serial.h>
> +#include <linux/tty.h> /* for linux/serial_core.h */
> +#include <linux/serial_core.h>
> +#include <linux/serial_reg.h>
> +#include <linux/serial_8250.h>
> +#include <linux/mtd/physmap.h>
> +
> +#include <asm/system.h>
> +#include <asm/pgtable.h>
> +#include <asm/page.h>
> +#include <asm/time.h>
> +#include <asm/dma.h>
> +#include <asm/io.h>
> +#include <asm/machdep.h>
> +#include <asm/prom.h>
> +#include <asm/smp.h>
> +#include <asm/vga.h>
> +#include <asm/i8259.h>
> +#include <asm/mpic.h>
> +#include <asm/todc.h>
> +#include <asm/bootinfo.h>
> +#include <asm/mpc10x.h>
> +#include <asm/pci-bridge.h>
> +#include <asm/ppc_sys.h>
> +
> +static struct mtd_partition linkstation_physmap_partitions[] = {
> + {
> + .name = "mtd_firmimg",
> + .offset = 0x000000,
> + .size = 0x300000,
> + },
> + {
> + .name = "mtd_bootcode",
> + .offset = 0x300000,
> + .size = 0x70000,
> + },
> + {
> + .name = "mtd_status",
> + .offset = 0x370000,
> + .size = 0x10000,
> + },
> + {
> + .name = "mtd_conf",
> + .offset = 0x380000,
> + .size = 0x80000,
> + },
> + {
> + .name = "mtd_allflash",
> + .offset = 0x000000,
> + .size = 0x400000,
> + },
> + {
> + .name = "mtd_data",
> + .offset = 0x310000,
> + .size = 0xf0000,
> + },
> +};
> +
> +/*
> + * Buffalo linkstation interrupt routing.
> + */
> +
> +void __init linkstation_pcibios_fixup(void)
> +{
> + struct pci_dev *dev = NULL;
> +
> + for_each_pci_dev(dev)
> + pci_read_irq_line(dev);
> +}
> +
You don't need this fixup going forward.
> +static int __init add_bridge(struct device_node *dev)
> +{
> + int len;
> + struct pci_controller *hose;
> + int *bus_range;
> +
> + printk("Adding PCI host bridge %s\n", dev->full_name);
> +
> + bus_range = (int *) get_property(dev, "bus-range", &len);
> + if (bus_range == NULL || len < 2 * sizeof(int))
> + printk(KERN_WARNING "Can't get bus-range for %s, assume"
> + " bus 0\n", dev->full_name);
> +
> + hose = pcibios_alloc_controller();
> + if (hose == NULL)
> + return -ENOMEM;
> + hose->first_busno = bus_range ? bus_range[0] : 0;
> + hose->last_busno = bus_range ? bus_range[1] : 0xff;
> + hose->arch_data = dev;
> + setup_indirect_pci(hose, 0xfec00000, 0xfee00000);
> +
> + /* Interpret the "ranges" property */
> + /* This also maps the I/O region and sets isa_io/mem_base */
> + pci_process_bridge_OF_ranges(hose, dev, 1);
> +
> + return 0;
> +}
> +
> +static void __init linkstation_setup_arch(void)
> +{
> + struct device_node *np;
> +#ifdef CONFIG_MTD_PHYSMAP
> + physmap_set_partitions(linkstation_physmap_partitions,
> + ARRAY_SIZE(linkstation_physmap_partitions));
> +#endif
> +
> +#ifdef CONFIG_BLK_DEV_INITRD
> + if (initrd_start)
> + ROOT_DEV = Root_RAM0;
> + else
> +#endif
> +#ifdef CONFIG_ROOT_NFS
> + ROOT_DEV = Root_NFS;
> +#else
> + ROOT_DEV = Root_HDA1;
> +#endif
> +
> + /* Lookup PCI host bridges */
> + for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
> + add_bridge(np);
> +
> + ppc_md.pci_swizzle = common_swizzle;
> +
> + printk(KERN_INFO "BUFFALO Network Attached Storage Series\n");
> + printk(KERN_INFO "(C) 2002-2005 BUFFALO INC.\n");
> +}
> +
> +/*
> + * Interrupt setup and service. Interrrupts on the linkstation come
> + * from the four PCI slots plus onboard 8241 devices: I2C, DUART.
> + */
> +static void __init linkstation_init_IRQ(void)
> +{
> + struct mpic *mpic;
> + struct device_node *dnp;
> + void *prop;
> + int size;
> + phys_addr_t paddr;
> +
> + dnp = of_find_node_by_type(NULL, "open-pic");
> + if (dnp == NULL)
> + return;
> +
> + prop = (struct device_node *)get_property(dnp, "reg", &size);
> + paddr = (phys_addr_t)of_translate_address(dnp, prop);
> +
> + mpic = mpic_alloc(dnp, paddr, MPIC_PRIMARY | MPIC_WANTS_RESET, 4,
> 32, " EPIC ");
> + BUG_ON(mpic == NULL);
> +
> + /* PCI IRQs */
> + mpic_assign_isu(mpic, 0, paddr + 0x10200);
> +
> + /* I2C */
> + mpic_assign_isu(mpic, 1, paddr + 0x11000);
> +
> + /* ttyS0, ttyS1 */
> + mpic_assign_isu(mpic, 2, paddr + 0x11100);
> +
> + mpic_init(mpic);
> +}
> +
> +extern void avr_uart_configure(void);
> +extern void avr_uart_send(const char);
> +
> +static void linkstation_restart(char *cmd)
> +{
> + local_irq_disable();
> +
> + /* Reset system via AVR */
> + avr_uart_configure();
> + /* Send reboot command */
> + avr_uart_send('C');
> +
> + for(;;) /* Spin until reset happens */
> + avr_uart_send('G'); /* "kick" */
> +}
> +
> +static void linkstation_power_off(void)
> +{
> + local_irq_disable();
> +
> + avr_uart_configure();
> + /* send shutdown command */
> + avr_uart_send('E');
> +
> + for(;;) /* Spin until power-off happens */
> + avr_uart_send('G'); /* "kick" */
> + /* NOTREACHED */
> +}
> +
> +static void linkstation_halt(void)
> +{
> + linkstation_power_off();
> + /* NOTREACHED */
> +}
> +
> +static void linkstation_show_cpuinfo(struct seq_file *m)
> +{
> + seq_printf(m, "vendor\t\t: Buffalo Technology\n");
> + seq_printf(m, "machine\t\t: Linkstation I/Kurobox(HG)\n");
> +}
> +
> +static int __init linkstation_probe(void)
> +{
> + unsigned long root;
> +
> + root = of_get_flat_dt_root();
> +
> + if (!of_flat_dt_is_compatible(root, "linkstation"))
> + return 0;
> + return 1;
> +}
> +
> +define_machine(linkstation){
> + .name = "Buffalo Linkstation",
> + .probe = linkstation_probe,
> + .setup_arch = linkstation_setup_arch,
> + .init_IRQ = linkstation_init_IRQ,
> + .show_cpuinfo = linkstation_show_cpuinfo,
> + .pcibios_fixup = linkstation_pcibios_fixup,
> + .get_irq = mpic_get_irq,
> + .restart = linkstation_restart,
> + .power_off = linkstation_power_off,
> + .halt = linkstation_halt,
> + .calibrate_decr = generic_calibrate_decr,
> +};
> diff --git a/arch/powerpc/platforms/embedded6xx/ls_uart.c b/arch/
> powerpc/platforms/embedded6xx/ls_uart.c
> new file mode 100644
> index 0000000..b640115
> --- /dev/null
> +++ b/arch/powerpc/platforms/embedded6xx/ls_uart.c
> @@ -0,0 +1,131 @@
> +#include <linux/workqueue.h>
> +#include <linux/string.h>
> +#include <linux/delay.h>
> +#include <linux/serial_reg.h>
> +#include <linux/serial_8250.h>
> +#include <asm/io.h>
> +#include <asm/mpc10x.h>
> +#include <asm/ppc_sys.h>
> +#include <asm/prom.h>
> +#include <asm/termbits.h>
> +
Can this code not be reworked to use the standard 8250 driver?
> +static void __iomem *avr_addr;
> +static unsigned long avr_clock;
> +
> +static struct work_struct wd_work;
> +
> +static void wd_stop(void *unused)
> +{
> + const char string[] = "AAAAFFFFJJJJ>>>>VVVV>>>>ZZZZVVVVKKKK";
> + int i = 0, rescue = 8;
> + int len = strlen(string);
> +
> + while (rescue--) {
> + int j;
> + char lsr = in_8(avr_addr + UART_LSR);
> +
> + if (lsr & (UART_LSR_THRE | UART_LSR_TEMT)) {
> + for (j = 0; j < 16 && i < len; j++, i++)
> + out_8(avr_addr + UART_TX, string[i]);
> + if (i == len) {
> + /* Read "OK" back: 4ms for the last "KKKK"
> + plus a couple bytes back */
> + msleep(7);
> + printk("linkstation: disarming the AVR watchdog: ");
> + while (in_8(avr_addr + UART_LSR) & UART_LSR_DR)
> + printk("%c", in_8(avr_addr + UART_RX));
> + break;
> + }
> + }
> + msleep(17);
> + }
> + printk("\n");
> +}
> +
> +#define AVR_QUOT(clock) ((clock) + 8 * 9600) / (16 * 9600)
> +
> +void avr_uart_configure(void)
> +{
> + unsigned char cval = UART_LCR_WLEN8;
> + unsigned int quot = AVR_QUOT(avr_clock);
> +
> + if (!avr_addr || !avr_clock)
> + return;
> +
> + out_8(avr_addr + UART_LCR, cval); /* initialise UART */
> + out_8(avr_addr + UART_MCR, 0);
> + out_8(avr_addr + UART_IER, 0);
> +
> + cval |= UART_LCR_STOP | UART_LCR_PARITY | UART_LCR_EPAR;
> +
> + out_8(avr_addr + UART_LCR, cval); /* Set character format */
> +
> + out_8(avr_addr + UART_LCR, cval | UART_LCR_DLAB); /* set DLAB */
> + out_8(avr_addr + UART_DLL, quot & 0xff); /* LS of divisor */
> + out_8(avr_addr + UART_DLM, quot >> 8); /* MS of divisor */
> + out_8(avr_addr + UART_LCR, cval); /* reset DLAB */
> + out_8(avr_addr + UART_FCR, UART_FCR_ENABLE_FIFO); /* enable FIFO */
> +}
> +
> +void avr_uart_send(const char c)
> +{
> + if (!avr_addr || !avr_clock)
> + return;
> +
> + out_8(avr_addr + UART_TX, c);
> + out_8(avr_addr + UART_TX, c);
> + out_8(avr_addr + UART_TX, c);
> + out_8(avr_addr + UART_TX, c);
> +}
> +
> +static void __init ls_uart_init(void)
> +{
> + local_irq_disable();
> +
> +#ifndef CONFIG_SERIAL_8250
> + out_8(avr_addr + UART_FCR, UART_FCR_ENABLE_FIFO); /* enable FIFO */
> + out_8(avr_addr + UART_FCR, UART_FCR_ENABLE_FIFO |
> + UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); /* clear FIFOs */
> + out_8(avr_addr + UART_FCR, 0);
> + out_8(avr_addr + UART_IER, 0);
> +
> + /* Clear up interrupts */
> + (void) in_8(avr_addr + UART_LSR);
> + (void) in_8(avr_addr + UART_RX);
> + (void) in_8(avr_addr + UART_IIR);
> + (void) in_8(avr_addr + UART_MSR);
> +#endif
> + avr_uart_configure();
> +
> + local_irq_enable();
> +}
> +
> +static int __init ls_uarts_init(void)
> +{
> + struct device_node *avr;
> + phys_addr_t phys_addr;
> + int len;
> +
> + avr = of_find_node_by_path("/soc10x/serial at 80004500");
> + if (!avr)
> + return -EINVAL;
> +
> + avr_clock = *(u32*)get_property(avr, "clock-frequency", &len);
> + phys_addr = ((u32*)get_property(avr, "reg", &len))[0];
> +
> + if (!avr_clock || !phys_addr)
> + return -EINVAL;
> +
> + avr_addr = ioremap(phys_addr, 32);
> + if (!avr_addr)
> + return -EFAULT;
> +
> + ls_uart_init();
> +
> + INIT_WORK(&wd_work, wd_stop, NULL);
> + schedule_work(&wd_work);
> +
> + return 0;
> +}
> +
> +late_initcall(ls_uarts_init);
> diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
> index f1c7575..25cd8de 100644
> --- a/drivers/net/r8169.c
> +++ b/drivers/net/r8169.c
> @@ -1396,41 +1396,6 @@ static void rtl8169_netpoll(struct net_d
> }
> #endif
Pull this into a separate patch since it effects a driver. Also, any
reason this code is being removed?
>
> -static void __rtl8169_set_mac_addr(struct net_device *dev, void
> __iomem *ioaddr)
> -{
> - unsigned int i, j;
> -
> - RTL_W8(Cfg9346, Cfg9346_Unlock);
> - for (i = 0; i < 2; i++) {
> - __le32 l = 0;
> -
> - for (j = 0; j < 4; j++) {
> - l <<= 8;
> - l |= dev->dev_addr[4*i + j];
> - }
> - RTL_W32(MAC0 + 4*i, cpu_to_be32(l));
> - }
> - RTL_W8(Cfg9346, Cfg9346_Lock);
> -}
> -
> -static int rtl8169_set_mac_addr(struct net_device *dev, void *p)
> -{
> - struct rtl8169_private *tp = netdev_priv(dev);
> - struct sockaddr *addr = p;
> -
> - if (!is_valid_ether_addr(addr->sa_data))
> - return -EINVAL;
> -
> - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
> -
> - if (netif_running(dev)) {
> - spin_lock_irq(&tp->lock);
> - __rtl8169_set_mac_addr(dev, tp->mmio_addr);
> - spin_unlock_irq(&tp->lock);
> - }
> - return 0;
> -}
> -
> static void rtl8169_release_board(struct pci_dev *pdev, struct
> net_device *dev,
> void __iomem *ioaddr)
> {
> @@ -1680,7 +1645,6 @@ rtl8169_init_one(struct pci_dev *pdev, c
> dev->stop = rtl8169_close;
> dev->tx_timeout = rtl8169_tx_timeout;
> dev->set_multicast_list = rtl8169_set_rx_mode;
> - dev->set_mac_address = rtl8169_set_mac_addr;
> dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
> dev->irq = pdev->irq;
> dev->base_addr = (unsigned long) ioaddr;
> @@ -1928,8 +1892,6 @@ rtl8169_hw_start(struct net_device *dev)
> /* Enable all known interrupts by setting the interrupt mask. */
> RTL_W16(IntrMask, rtl8169_intr_mask);
>
> - __rtl8169_set_mac_addr(dev, ioaddr);
> -
> netif_start_queue(dev);
> }
More information about the Linuxppc-dev
mailing list