]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
authorLinus Torvalds <torvalds@g5.osdl.org>
Thu, 3 Aug 2006 05:35:26 +0000 (22:35 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 3 Aug 2006 05:35:26 +0000 (22:35 -0700)
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (32 commits)
  [NET]: Fix more per-cpu typos
  [SECURITY]: Fix build with CONFIG_SECURITY disabled.
  [I/OAT]: Remove CPU hotplug lock from net_dma_rebalance
  [DECNET]: Fix for routing bug
  [AF_UNIX]: Kernel memory leak fix for af_unix datagram getpeersec patch
  [NET]: skb_queue_lock_key() is no longer used.
  [NET]: Remove lockdep_set_class() call from skb_queue_head_init().
  [IPV6]: SNMPv2 "ipv6IfStatsOutFragCreates" counter error
  [IPV6]: SNMPv2 "ipv6IfStatsInHdrErrors" counter error
  [NET]: Kill the WARN_ON() calls for checksum fixups.
  [NETFILTER]: xt_hashlimit/xt_string: missing string validation
  [NETFILTER]: SIP helper: expect RTP streams in both directions
  [E1000]: Convert to netdev_alloc_skb
  [TG3]: Convert to netdev_alloc_skb
  [NET]: Add netdev_alloc_skb().
  [TCP]: Process linger2 timeout consistently.
  [SECURITY] secmark: nul-terminate secdata
  [NET] infiniband: Cleanup ib_addr module to use the netevents
  [NET]: Core net changes to generate netevents
  [NET]: Network Event Notifier Mechanism.
  ...

70 files changed:
.gitignore
Documentation/usb/proc_usb_info.txt
Documentation/usb/usb-help.txt
Makefile
arch/arm/common/gic.c
arch/arm/common/locomo.c
arch/arm/common/sa1111.c
arch/arm/common/vic.c
arch/arm/kernel/ecard.c
arch/arm/kernel/irq.c
arch/arm/mach-at91rm9200/gpio.c
arch/arm/mach-at91rm9200/irq.c
arch/arm/mach-imx/irq.c
arch/arm/mach-integrator/integrator_ap.c
arch/arm/mach-integrator/integrator_cp.c
arch/arm/mach-iop3xx/iop321-irq.c
arch/arm/mach-iop3xx/iop331-irq.c
arch/arm/mach-lh7a40x/arch-kev7a400.c
arch/arm/mach-lh7a40x/arch-lpd7a40x.c
arch/arm/mach-lh7a40x/irq-kev7a400.c
arch/arm/mach-lh7a40x/irq-lh7a400.c
arch/arm/mach-lh7a40x/irq-lh7a404.c
arch/arm/mach-lh7a40x/irq-lpd7a40x.c
arch/arm/mach-omap1/fpga.c
arch/arm/mach-omap1/irq.c
arch/arm/mach-omap2/irq.c
arch/arm/mach-pxa/irq.c
arch/arm/mach-pxa/lpd270.c
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/mainstone.c
arch/arm/mach-sa1100/irq.c
arch/arm/mach-shark/irq.c
arch/arm/mach-versatile/core.c
arch/arm/plat-omap/gpio.c
arch/x86_64/kernel/entry.S
arch/x86_64/kernel/pci-nommu.c
drivers/scsi/aic7xxx/aicasm/Makefile
drivers/usb/Kconfig
drivers/usb/core/devio.c
drivers/usb/core/file.c
drivers/usb/gadget/Kconfig
drivers/usb/gadget/at91_udc.c
drivers/usb/gadget/at91_udc.h
drivers/usb/gadget/dummy_hcd.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ohci-at91.c
drivers/usb/host/ohci-hcd.c
drivers/usb/host/uhci-q.c
drivers/usb/input/ati_remote.c
drivers/usb/misc/cypress_cy7c63.c
drivers/usb/net/rtl8150.c
drivers/usb/serial/Kconfig
drivers/usb/serial/Makefile
drivers/usb/serial/anydata.c [deleted file]
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio.h
drivers/usb/serial/ipaq.c
drivers/usb/serial/option.c
drivers/usb/serial/pl2303.c
drivers/usb/serial/pl2303.h
drivers/usb/storage/unusual_devs.h
drivers/usb/storage/usb.c
include/asm-arm/arch-omap/clock.h
include/linux/usb.h
include/linux/usb_usual.h
kernel/signal.c
scripts/Kbuild.include
scripts/Makefile.modpost
scripts/kconfig/confdata.c
scripts/mod/file2alias.c

index 27fd37621255799602d74e94d670ff7a1658d40a..b1f5b9df2ae1f4eede001d7751b099d4ae34be95 100644 (file)
@@ -30,6 +30,11 @@ include/config
 include/linux/autoconf.h
 include/linux/compile.h
 include/linux/version.h
+include/linux/utsrelease.h
 
 # stgit generated dirs
 patches-*
+
+# quilt's files
+patches
+series
index f86550fe38ee21afc0381a991ac4e58b07426f57..22c5331260ca05bb17be0c647a7d98d595ce0cd7 100644 (file)
@@ -59,7 +59,7 @@ bind to an interface (or perhaps several) using an ioctl call.  You
 would issue more ioctls to the device to communicate to it using
 control, bulk, or other kinds of USB transfers.  The IOCTLs are
 listed in the <linux/usbdevice_fs.h> file, and at this writing the
-source code (linux/drivers/usb/devio.c) is the primary reference
+source code (linux/drivers/usb/core/devio.c) is the primary reference
 for how to access devices through those files.
 
 Note that since by default these BBB/DDD files are writable only by
index b7c324973695b5bb21a6a72cac55527f38418b1c..a7408593829feb51c205f35b5647b961a8334a24 100644 (file)
@@ -5,8 +5,7 @@ For USB help other than the readme files that are located in
 Documentation/usb/*, see the following:
 
 Linux-USB project:  http://www.linux-usb.org
-  mirrors at        http://www.suse.cz/development/linux-usb/
-         and        http://usb.in.tum.de/linux-usb/
+  mirrors at        http://usb.in.tum.de/linux-usb/
          and        http://it.linux-usb.org
 Linux USB Guide:    http://linux-usb.sourceforge.net
 Linux-USB device overview (working devices and drivers):
index c9b7dbb64c7199196e57f81485231720af071936..110db856e966a046abfe85268563b866298cb75b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -310,8 +310,8 @@ CPPFLAGS        := -D__KERNEL__ $(LINUXINCLUDE)
 CFLAGS          := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
                    -fno-strict-aliasing -fno-common
 # Force gcc to behave correct even for buggy distributions
-CFLAGS          += $(call cc-option, -fno-stack-protector-all \
-                                     -fno-stack-protector)
+CFLAGS          += $(call cc-option, -fno-stack-protector)
+
 AFLAGS          := -D__ASSEMBLY__
 
 # Read KERNELRELEASE from include/config/kernel.release (if it exists)
@@ -368,6 +368,7 @@ endif
 
 no-dot-config-targets := clean mrproper distclean \
                         cscope TAGS tags help %docs check% \
+                        include/linux/version.h headers_% \
                         kernelrelease kernelversion
 
 config-targets := 0
index f3c1ebfdd0aabaa8ec8cc87d089f9fe74ce1899f..f3e020f2227f316a754d0584a5ad0f386146d8df 100644 (file)
@@ -95,7 +95,8 @@ static void gic_set_cpu(unsigned int irq, cpumask_t mask_val)
 }
 #endif
 
-static struct irqchip gic_chip = {
+static struct irq_chip gic_chip = {
+       .name           = "GIC",
        .ack            = gic_ack_irq,
        .mask           = gic_mask_irq,
        .unmask         = gic_unmask_irq,
index 04de83f4f0088765358cfd98cfed07ade9602fd6..4e0dcaef6eb204a4a5c344d2011baadcfd64502a 100644 (file)
@@ -204,7 +204,8 @@ static void locomo_unmask_irq(unsigned int irq)
        locomo_writel(r, mapbase + LOCOMO_ICR);
 }
 
-static struct irqchip locomo_chip = {
+static struct irq_chip locomo_chip = {
+       .name   = "LOCOMO",
        .ack    = locomo_ack_irq,
        .mask   = locomo_mask_irq,
        .unmask = locomo_unmask_irq,
@@ -249,7 +250,8 @@ static void locomo_key_unmask_irq(unsigned int irq)
        locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC);
 }
 
-static struct irqchip locomo_key_chip = {
+static struct irq_chip locomo_key_chip = {
+       .name   = "LOCOMO-key",
        .ack    = locomo_key_ack_irq,
        .mask   = locomo_key_mask_irq,
        .unmask = locomo_key_unmask_irq,
@@ -312,7 +314,8 @@ static void locomo_gpio_unmask_irq(unsigned int irq)
        locomo_writel(r, mapbase + LOCOMO_GIE);
 }
 
-static struct irqchip locomo_gpio_chip = {
+static struct irq_chip locomo_gpio_chip = {
+       .name   = "LOCOMO-gpio",
        .ack    = locomo_gpio_ack_irq,
        .mask   = locomo_gpio_mask_irq,
        .unmask = locomo_gpio_unmask_irq,
@@ -357,7 +360,8 @@ static void locomo_lt_unmask_irq(unsigned int irq)
        locomo_writel(r, mapbase + LOCOMO_LTINT);
 }
 
-static struct irqchip locomo_lt_chip = {
+static struct irq_chip locomo_lt_chip = {
+       .name   = "LOCOMO-lt",
        .ack    = locomo_lt_ack_irq,
        .mask   = locomo_lt_mask_irq,
        .unmask = locomo_lt_unmask_irq,
@@ -418,7 +422,8 @@ static void locomo_spi_unmask_irq(unsigned int irq)
        locomo_writel(r, mapbase + LOCOMO_SPIIE);
 }
 
-static struct irqchip locomo_spi_chip = {
+static struct irq_chip locomo_spi_chip = {
+       .name   = "LOCOMO-spi",
        .ack    = locomo_spi_ack_irq,
        .mask   = locomo_spi_mask_irq,
        .unmask = locomo_spi_unmask_irq,
index 1cdb26a47e1f3170596b373fb401714d7d574772..a331c12cead991322b10626349eeb04f7c021bd8 100644 (file)
@@ -272,7 +272,8 @@ static int sa1111_wake_lowirq(unsigned int irq, unsigned int on)
        return 0;
 }
 
-static struct irqchip sa1111_low_chip = {
+static struct irq_chip sa1111_low_chip = {
+       .name           = "SA1111-l",
        .ack            = sa1111_ack_irq,
        .mask           = sa1111_mask_lowirq,
        .unmask         = sa1111_unmask_lowirq,
@@ -368,7 +369,8 @@ static int sa1111_wake_highirq(unsigned int irq, unsigned int on)
        return 0;
 }
 
-static struct irqchip sa1111_high_chip = {
+static struct irq_chip sa1111_high_chip = {
+       .name           = "SA1111-h",
        .ack            = sa1111_ack_irq,
        .mask           = sa1111_mask_highirq,
        .unmask         = sa1111_unmask_highirq,
index a19bc4a6196d42c9d633af005c94e206fda60b74..43d278134521a23f7d5ab9e9075d3de0e9ab6efb 100644 (file)
@@ -39,7 +39,8 @@ static void vic_unmask_irq(unsigned int irq)
        writel(1 << irq, base + VIC_INT_ENABLE);
 }
 
-static struct irqchip vic_chip = {
+static struct irq_chip vic_chip = {
+       .name   = "VIC",
        .ack    = vic_mask_irq,
        .mask   = vic_mask_irq,
        .unmask = vic_unmask_irq,
index b9a74a741d005db9e02243e396b8a4403d4939b1..eca248d9eba44823986f1e6c30a1ffa7b8d1f77f 100644 (file)
@@ -470,7 +470,8 @@ static void ecard_irq_mask(unsigned int irqnr)
        }
 }
 
-static struct irqchip ecard_chip = {
+static struct irq_chip ecard_chip = {
+       .name   = "ECARD",
        .ack    = ecard_irq_mask,
        .mask   = ecard_irq_mask,
        .unmask = ecard_irq_unmask,
index 626feeec0ade7325def132610ad99b3eb2d1dbc0..2e1bf830fe11bf0523b2e37cbefaa32d50db4d55 100644 (file)
@@ -77,6 +77,7 @@ int show_interrupts(struct seq_file *p, void *v)
                seq_printf(p, "%3d: ", i);
                for_each_present_cpu(cpu)
                        seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
+               seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-");
                seq_printf(p, "  %s", action->name);
                for (action = action->next; action; action = action->next)
                        seq_printf(p, ", %s", action->name);
index 5783c282ae7b3e3288160a1cab22bf4db71d8172..cec199fd67217bd171303762431843a6722354c8 100644 (file)
@@ -327,7 +327,8 @@ static int gpio_irq_type(unsigned pin, unsigned type)
        return (type == IRQT_BOTHEDGE) ? 0 : -EINVAL;
 }
 
-static struct irqchip gpio_irqchip = {
+static struct irq_chip gpio_irqchip = {
+       .name           = "GPIO",
        .mask           = gpio_irq_mask,
        .unmask         = gpio_irq_unmask,
        .set_type       = gpio_irq_type,
index 9b0911320417ae374acd055fd29dc085502c125f..c3a5e777f9f8c3753656b59a3e3c42dfc9ebc86a 100644 (file)
@@ -114,7 +114,8 @@ void at91_irq_resume(void)
 #define at91_aic_set_wake      NULL
 #endif
 
-static struct irqchip at91_aic_chip = {
+static struct irq_chip at91_aic_chip = {
+       .name           = "AIC",
        .ack            = at91_aic_mask_irq,
        .mask           = at91_aic_mask_irq,
        .unmask         = at91_aic_unmask_irq,
index a5de5f1da9f2e65dd0c83e99556eeed7f40807aa..2688bd82c2a242addcc62822b90b461d509ec0f3 100644 (file)
@@ -204,13 +204,15 @@ imx_gpiod_demux_handler(unsigned int irq_unused, struct irqdesc *desc,
        imx_gpio_handler(mask, irq, desc, regs);
 }
 
-static struct irqchip imx_internal_chip = {
+static struct irq_chip imx_internal_chip = {
+       .name = "MPU",
        .ack = imx_mask_irq,
        .mask = imx_mask_irq,
        .unmask = imx_unmask_irq,
 };
 
-static struct irqchip imx_gpio_chip = {
+static struct irq_chip imx_gpio_chip = {
+       .name = "GPIO",
        .ack = imx_gpio_ack_irq,
        .mask = imx_gpio_mask_irq,
        .unmask = imx_gpio_unmask_irq,
index 6d65c96ebfd2a05f988f8fde100b691e779ee4cc..191c57a3b997a8efc52b3df0934058296b033b81 100644 (file)
@@ -161,7 +161,8 @@ static void sc_unmask_irq(unsigned int irq)
        writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET);
 }
 
-static struct irqchip sc_chip = {
+static struct irq_chip sc_chip = {
+       .name   = "SC",
        .ack    = sc_mask_irq,
        .mask   = sc_mask_irq,
        .unmask = sc_unmask_irq,
index 9f55f5ae1044ffcd4e4a3080e581525646e8d639..678b6ba2b463ac020c9f9fc0edbd20dde4fcf7f3 100644 (file)
@@ -156,7 +156,8 @@ static void cic_unmask_irq(unsigned int irq)
        cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_SET);
 }
 
-static struct irqchip cic_chip = {
+static struct irq_chip cic_chip = {
+       .name   = "CIC",
        .ack    = cic_mask_irq,
        .mask   = cic_mask_irq,
        .unmask = cic_unmask_irq,
@@ -174,7 +175,8 @@ static void pic_unmask_irq(unsigned int irq)
        pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_SET);
 }
 
-static struct irqchip pic_chip = {
+static struct irq_chip pic_chip = {
+       .name   = "PIC",
        .ack    = pic_mask_irq,
        .mask   = pic_mask_irq,
        .unmask = pic_unmask_irq,
@@ -192,7 +194,8 @@ static void sic_unmask_irq(unsigned int irq)
        sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_SET);
 }
 
-static struct irqchip sic_chip = {
+static struct irq_chip sic_chip = {
+       .name   = "SIC",
        .ack    = sic_mask_irq,
        .mask   = sic_mask_irq,
        .unmask = sic_unmask_irq,
index d42aae6aef03c6b1aa13e26b548ab0d278c17b0d..88ac333472c872180bfae4ba3391f801dd4799e7 100644 (file)
@@ -52,7 +52,8 @@ iop321_irq_unmask (unsigned int irq)
        intctl_write(iop321_mask);
 }
 
-struct irqchip ext_chip = {
+struct irq_chip ext_chip = {
+       .name   = "IOP",
        .ack    = iop321_irq_mask,
        .mask   = iop321_irq_mask,
        .unmask = iop321_irq_unmask,
index f4d4321737a4b5a0a3614fc39912088fdcb2420c..cab11722ced21f10112ce57db2f8a83e82f5b6ed 100644 (file)
@@ -77,13 +77,15 @@ iop331_irq_unmask2(unsigned int irq)
         intctl_write1(iop331_mask1);
 }
 
-struct irqchip iop331_irqchip1 = {
+struct irq_chip iop331_irqchip1 = {
+       .name   = "IOP-1",
        .ack    = iop331_irq_mask1,
        .mask   = iop331_irq_mask1,
        .unmask = iop331_irq_unmask1,
 };
 
-struct irqchip iop331_irqchip2 = {
+struct irq_chip iop331_irqchip2 = {
+       .name   = "IOP-2",
        .ack    = iop331_irq_mask2,
        .mask   = iop331_irq_mask2,
        .unmask = iop331_irq_unmask2,
index 2cccc27c62e4029c3c35de1b027c1a2f69d8f934..4f2ab48800a50eb6ba15f8c1a2e6b4c72af5bcd2 100644 (file)
@@ -63,7 +63,8 @@ static void kev7a400_unmask_cpld_irq (u32 irq)
        CPLD_WR_PB_INT_MASK = CPLD_IRQ_mask;
 }
 
-static struct irqchip kev7a400_cpld_chip = {
+static struct irq_chip kev7a400_cpld_chip = {
+       .name   = "CPLD",
        .ack    = kev7a400_ack_cpld_irq,
        .mask   = kev7a400_mask_cpld_irq,
        .unmask = kev7a400_unmask_cpld_irq,
index 35c3606a20795f89be0567402ecf613187e5f878..a6910114b24c5d9cd4e46a299c97a0f8bfb1547a 100644 (file)
@@ -200,7 +200,8 @@ static void lh7a40x_unmask_cpld_irq (u32 irq)
        }
 }
 
-static struct irqchip lpd7a40x_cpld_chip = {
+static struct irq_chip lpd7a40x_cpld_chip = {
+       .name   = "CPLD",
        .ack    = lh7a40x_ack_cpld_irq,
        .mask   = lh7a40x_mask_cpld_irq,
        .unmask = lh7a40x_unmask_cpld_irq,
index 8535764d89ca58b63c03625749627e1731a7fafb..f9b3fe9174a5e1dadcd82f91e626f8d22270053f 100644 (file)
@@ -43,7 +43,8 @@ lh7a400_unmask_cpld_irq (u32 irq)
 }
 
 static struct
-irqchip lh7a400_cpld_chip = {
+irq_chip lh7a400_cpld_chip = {
+       .name   = "CPLD",
        .ack    = lh7a400_ack_cpld_irq,
        .mask   = lh7a400_mask_cpld_irq,
        .unmask = lh7a400_unmask_cpld_irq,
index f9fdefef6d6fbc120324ab4651980fe72ce5d723..091b2dc58d25176e673809bfdadad8e6bf6a86a2 100644 (file)
@@ -38,13 +38,15 @@ static void lh7a400_ack_gpio_irq (u32 irq)
        INTC_INTENC = (1 << irq);
 }
 
-static struct irqchip lh7a400_internal_chip = {
+static struct irq_chip lh7a400_internal_chip = {
+       .name   = "MPU",
        .ack    = lh7a400_mask_irq, /* Level triggering -> mask is ack */
        .mask   = lh7a400_mask_irq,
        .unmask = lh7a400_unmask_irq,
 };
 
-static struct irqchip lh7a400_gpio_chip = {
+static struct irq_chip lh7a400_gpio_chip = {
+       .name   = "GPIO",
        .ack    = lh7a400_ack_gpio_irq,
        .mask   = lh7a400_mask_irq,
        .unmask = lh7a400_unmask_irq,
index 2685a81454d260e79ebbcd60b4a6cd8c34721c1c..7059b983724f384dbdc2b80936ca5d6aaaa0e8da 100644 (file)
@@ -76,25 +76,29 @@ static void lh7a404_vic2_ack_gpio_irq (u32 irq)
        VIC2_INTENCLR = (1 << irq);
 }
 
-static struct irqchip lh7a404_vic1_chip = {
+static struct irq_chip lh7a404_vic1_chip = {
+       .name   = "VIC1",
        .ack    = lh7a404_vic1_mask_irq, /* Because level-triggered */
        .mask   = lh7a404_vic1_mask_irq,
        .unmask = lh7a404_vic1_unmask_irq,
 };
 
-static struct irqchip lh7a404_vic2_chip = {
+static struct irq_chip lh7a404_vic2_chip = {
+       .name   = "VIC2",
        .ack    = lh7a404_vic2_mask_irq, /* Because level-triggered */
        .mask   = lh7a404_vic2_mask_irq,
        .unmask = lh7a404_vic2_unmask_irq,
 };
 
-static struct irqchip lh7a404_gpio_vic1_chip = {
+static struct irq_chip lh7a404_gpio_vic1_chip = {
+       .name   = "GPIO-VIC1",
        .ack    = lh7a404_vic1_ack_gpio_irq,
        .mask   = lh7a404_vic1_mask_irq,
        .unmask = lh7a404_vic1_unmask_irq,
 };
 
-static struct irqchip lh7a404_gpio_vic2_chip = {
+static struct irq_chip lh7a404_gpio_vic2_chip = {
+       .name   = "GPIO-VIC2",
        .ack    = lh7a404_vic2_ack_gpio_irq,
        .mask   = lh7a404_vic2_mask_irq,
        .unmask = lh7a404_vic2_unmask_irq,
index dcb4e17b941990eabe8992680c9aa9b67afb6fd4..d6055dde646877a1d304827863ec2b06482d421a 100644 (file)
@@ -50,7 +50,8 @@ static void lh7a40x_unmask_cpld_irq (u32 irq)
        }
 }
 
-static struct irqchip lh7a40x_cpld_chip = {
+static struct irq_chip lh7a40x_cpld_chip = {
+       .name   = "CPLD",
        .ack    = lh7a40x_ack_cpld_irq,
        .mask   = lh7a40x_mask_cpld_irq,
        .unmask = lh7a40x_unmask_cpld_irq,
index 34eb79ee6e6182f480e5da181f41972b134ad3c6..efe9bfc6e55f694c7c40921e0037e09be0e663be 100644 (file)
@@ -106,14 +106,16 @@ void innovator_fpga_IRQ_demux(unsigned int irq, struct irqdesc *desc,
        }
 }
 
-static struct irqchip omap_fpga_irq_ack = {
+static struct irq_chip omap_fpga_irq_ack = {
+       .name           = "FPGA-ack",
        .ack            = fpga_mask_ack_irq,
        .mask           = fpga_mask_irq,
        .unmask         = fpga_unmask_irq,
 };
 
 
-static struct irqchip omap_fpga_irq = {
+static struct irq_chip omap_fpga_irq = {
+       .name           = "FPGA",
        .ack            = fpga_ack_irq,
        .mask           = fpga_mask_irq,
        .unmask         = fpga_unmask_irq,
index 9e039845b50e53abc25712f113b5351ee7070197..3ea140bb9ebaae5ba454ed0007ced1e9d4d6a306 100644 (file)
@@ -168,7 +168,8 @@ static struct omap_irq_bank omap1610_irq_banks[] = {
 };
 #endif
 
-static struct irqchip omap_irq_chip = {
+static struct irq_chip omap_irq_chip = {
+       .name           = "MPU",
        .ack            = omap_mask_ack_irq,
        .mask           = omap_mask_irq,
        .unmask         = omap_unmask_irq,
index 3eed6a737bf8144e69edb096c1710bae2ad8ca23..dfc3b35cc1ffaeb00f57ba31d55ab1f66797e251 100644 (file)
@@ -94,7 +94,8 @@ static void omap_mask_ack_irq(unsigned int irq)
        omap_ack_irq(irq);
 }
 
-static struct irqchip omap_irq_chip = {
+static struct irq_chip omap_irq_chip = {
+       .name   = "INTC",
        .ack    = omap_mask_ack_irq,
        .mask   = omap_mask_irq,
        .unmask = omap_unmask_irq,
index d9635ff4b10cb97bd979e7f8022dd346e929ae5e..12141e2a50cc35e1368f05b8fc10b93cb854f5bc 100644 (file)
@@ -39,7 +39,8 @@ static void pxa_unmask_low_irq(unsigned int irq)
        ICMR |= (1 << (irq + PXA_IRQ_SKIP));
 }
 
-static struct irqchip pxa_internal_chip_low = {
+static struct irq_chip pxa_internal_chip_low = {
+       .name           = "SC",
        .ack            = pxa_mask_low_irq,
        .mask           = pxa_mask_low_irq,
        .unmask         = pxa_unmask_low_irq,
@@ -61,7 +62,8 @@ static void pxa_unmask_high_irq(unsigned int irq)
        ICMR2 |= (1 << (irq - 32 + PXA_IRQ_SKIP));
 }
 
-static struct irqchip pxa_internal_chip_high = {
+static struct irq_chip pxa_internal_chip_high = {
+       .name           = "SC-hi",
        .ack            = pxa_mask_high_irq,
        .mask           = pxa_mask_high_irq,
        .unmask         = pxa_unmask_high_irq,
@@ -129,7 +131,8 @@ static void pxa_ack_low_gpio(unsigned int irq)
        GEDR0 = (1 << (irq - IRQ_GPIO0));
 }
 
-static struct irqchip pxa_low_gpio_chip = {
+static struct irq_chip pxa_low_gpio_chip = {
+       .name           = "GPIO-l",
        .ack            = pxa_ack_low_gpio,
        .mask           = pxa_mask_low_irq,
        .unmask         = pxa_unmask_low_irq,
@@ -237,7 +240,8 @@ static void pxa_unmask_muxed_gpio(unsigned int irq)
        GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx];
 }
 
-static struct irqchip pxa_muxed_gpio_chip = {
+static struct irq_chip pxa_muxed_gpio_chip = {
+       .name           = "GPIO",
        .ack            = pxa_ack_muxed_gpio,
        .mask           = pxa_mask_muxed_gpio,
        .unmask         = pxa_unmask_muxed_gpio,
index 1a5f5c21481e671015702edd072c595d1be3a016..12479ae26db2addc8c4bcd5f1a11a40d563f24e4 100644 (file)
@@ -68,7 +68,8 @@ static void lpd270_unmask_irq(unsigned int irq)
        __raw_writew(lpd270_irq_enabled, LPD270_INT_MASK);
 }
 
-static struct irqchip lpd270_irq_chip = {
+static struct irq_chip lpd270_irq_chip = {
+       .name           = "CPLD",
        .ack            = lpd270_mask_irq,
        .mask           = lpd270_mask_irq,
        .unmask         = lpd270_unmask_irq,
index 6a9a669d60de5e90b233eadb50cccd3808f82d08..83ff5cee64d935d27396564f78721ff90b2d582b 100644 (file)
@@ -78,7 +78,8 @@ static void lubbock_unmask_irq(unsigned int irq)
        LUB_IRQ_MASK_EN = (lubbock_irq_enabled |= (1 << lubbock_irq));
 }
 
-static struct irqchip lubbock_irq_chip = {
+static struct irq_chip lubbock_irq_chip = {
+       .name           = "FPGA",
        .ack            = lubbock_mask_irq,
        .mask           = lubbock_mask_irq,
        .unmask         = lubbock_unmask_irq,
index 21ddf3de2f6e18e2b830bbb240b2b5ab43912097..a7e9b96f258a4b34e9a209dca6b2f7ddb69e8228 100644 (file)
@@ -64,7 +64,8 @@ static void mainstone_unmask_irq(unsigned int irq)
        MST_INTMSKENA = (mainstone_irq_enabled |= (1 << mainstone_irq));
 }
 
-static struct irqchip mainstone_irq_chip = {
+static struct irq_chip mainstone_irq_chip = {
+       .name           = "FPGA",
        .ack            = mainstone_mask_irq,
        .mask           = mainstone_mask_irq,
        .unmask         = mainstone_unmask_irq,
index 2891b8ca86dd40d58b570c3c6a91272859ece838..b55b90a2e8fe975faba29388a517b36cfcb400cd 100644 (file)
@@ -95,7 +95,8 @@ static int sa1100_low_gpio_wake(unsigned int irq, unsigned int on)
        return 0;
 }
 
-static struct irqchip sa1100_low_gpio_chip = {
+static struct irq_chip sa1100_low_gpio_chip = {
+       .name           = "GPIO-l",
        .ack            = sa1100_low_gpio_ack,
        .mask           = sa1100_low_gpio_mask,
        .unmask         = sa1100_low_gpio_unmask,
@@ -178,7 +179,8 @@ static int sa1100_high_gpio_wake(unsigned int irq, unsigned int on)
        return 0;
 }
 
-static struct irqchip sa1100_high_gpio_chip = {
+static struct irq_chip sa1100_high_gpio_chip = {
+       .name           = "GPIO-h",
        .ack            = sa1100_high_gpio_ack,
        .mask           = sa1100_high_gpio_mask,
        .unmask         = sa1100_high_gpio_unmask,
@@ -215,7 +217,8 @@ static int sa1100_set_wake(unsigned int irq, unsigned int on)
        return -EINVAL;
 }
 
-static struct irqchip sa1100_normal_chip = {
+static struct irq_chip sa1100_normal_chip = {
+       .name           = "SC",
        .ack            = sa1100_mask_irq,
        .mask           = sa1100_mask_irq,
        .unmask         = sa1100_unmask_irq,
index 6cb67bd3dfd3ebb159fe7f8525de67c6195303d0..b227052296cff2be019ed69e8b5b4d2c0d2931e9 100644 (file)
@@ -69,7 +69,8 @@ static irqreturn_t bogus_int(int irq, void *dev_id, struct pt_regs *regs)
 
 static struct irqaction cascade;
 
-static struct irqchip fb_chip = {
+static struct irq_chip fb_chip = {
+       .name   = "XT-PIC",
        .ack    = shark_ack_8259A_irq,
        .mask   = shark_disable_8259A_irq,
        .unmask = shark_enable_8259A_irq,
index 86437717601512832c8f8308e0ab1df3dd686cec..c4e3f8c684795800403ba2eac98dc32dd928a7f8 100644 (file)
@@ -69,7 +69,8 @@ static void sic_unmask_irq(unsigned int irq)
        writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET);
 }
 
-static struct irqchip sic_chip = {
+static struct irq_chip sic_chip = {
+       .name   = "SIC",
        .ack    = sic_mask_irq,
        .mask   = sic_mask_irq,
        .unmask = sic_unmask_irq,
index fec7970e564d443be786d21635ce464213f1d51e..cd7f973fb286618e23c1370dd56b532e9b5cbc15 100644 (file)
@@ -944,7 +944,8 @@ static void mpuio_unmask_irq(unsigned int irq)
        _set_gpio_irqenable(bank, gpio, 1);
 }
 
-static struct irqchip gpio_irq_chip = {
+static struct irq_chip gpio_irq_chip = {
+       .name           = "GPIO",
        .ack            = gpio_ack_irq,
        .mask           = gpio_mask_irq,
        .unmask         = gpio_unmask_irq,
@@ -952,10 +953,11 @@ static struct irqchip gpio_irq_chip = {
        .set_wake       = gpio_wake_enable,
 };
 
-static struct irqchip mpuio_irq_chip = {
+static struct irq_chip mpuio_irq_chip = {
+       .name   = "MPUIO",
        .ack    = mpuio_ack_irq,
        .mask   = mpuio_mask_irq,
-       .unmask = mpuio_unmask_irq
+       .unmask = mpuio_unmask_irq
 };
 
 static int initialized;
index d464dded68c0eb363e1ca848cb5563d34a74b724..6f810424df44ba4aeb5fcd6abb1aea960b07d50b 100644 (file)
@@ -513,6 +513,7 @@ END(stub_rt_sigreturn)
        swapgs  
 1:     incl    %gs:pda_irqcount        # RED-PEN should check preempt count
        cmoveq %gs:pda_irqstackptr,%rsp
+       push    %rbp                    # backlink for old unwinder
        /*
         * We entered an interrupt context - irqs are off:
         */
@@ -1139,18 +1140,21 @@ ENTRY(machine_check)
 END(machine_check)
 #endif
 
+/* Call softirq on interrupt stack. Interrupts are off. */
 ENTRY(call_softirq)
        CFI_STARTPROC
-       movq %gs:pda_irqstackptr,%rax
-       movq %rsp,%rdx
-       CFI_DEF_CFA_REGISTER    rdx
+       push %rbp
+       CFI_ADJUST_CFA_OFFSET   8
+       CFI_REL_OFFSET rbp,0
+       mov  %rsp,%rbp
+       CFI_DEF_CFA_REGISTER rbp
        incl %gs:pda_irqcount
-       cmove %rax,%rsp
-       pushq %rdx
-       /*todo CFI_DEF_CFA_EXPRESSION ...*/
+       cmove %gs:pda_irqstackptr,%rsp
+       push  %rbp                      # backlink for old unwinder
        call __do_softirq
-       popq %rsp
+       leaveq
        CFI_DEF_CFA_REGISTER    rsp
+       CFI_ADJUST_CFA_OFFSET   -8
        decl %gs:pda_irqcount
        ret
        CFI_ENDPROC
index c4c3cc36ac5b033997d5904fa5adff8fa4de54b8..aad7609d8e9249e6d9121128e723838a4e508da6 100644 (file)
@@ -92,5 +92,7 @@ void __init no_iommu_init(void)
 {
        if (dma_ops)
                return;
+
+       force_iommu = 0; /* no HW IOMMU */
        dma_ops = &nommu_dma_ops;
 }
index 8c91fda6482c3ec53df78989a28d46198ae65f5d..b98c5c1056c380a10dddaa0c6b4a3e6c5d50796c 100644 (file)
@@ -14,6 +14,8 @@ LIBS= -ldb
 clean-files:= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output) $(PROG)
 # Override default kernel CFLAGS.  This is a userland app.
 AICASM_CFLAGS:= -I/usr/include -I.
+LEX= flex
+YACC= bison
 YFLAGS= -d
 
 NOMAN= noman
index 2ee742d40c43e3708ea7c8fbce9e4096f6181a77..005043197527142749965cce1d75fde169773c4c 100644 (file)
@@ -24,7 +24,7 @@ config USB_ARCH_HAS_OHCI
        default y if ARCH_S3C2410
        default y if PXA27x
        default y if ARCH_EP93XX
-       default y if ARCH_AT91RM9200
+       default y if (ARCH_AT91RM9200 || ARCH_AT91SAM9261)
        # PPC:
        default y if STB03xxx
        default y if PPC_MPC52xx
index f7bdd94b3aa89b26cb704bf9c202a1f84432bf1b..218621b9958e4af20972900bc19038d940fbe78a 100644 (file)
@@ -517,19 +517,19 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, unsig
 
 static struct usb_device *usbdev_lookup_minor(int minor)
 {
-       struct device *device;
-       struct usb_device *udev = NULL;
+       struct class_device *class_dev;
+       struct usb_device *dev = NULL;
 
        down(&usb_device_class->sem);
-       list_for_each_entry(device, &usb_device_class->devices, node) {
-               if (device->devt == MKDEV(USB_DEVICE_MAJOR, minor)) {
-                       udev = device->platform_data;
+       list_for_each_entry(class_dev, &usb_device_class->children, node) {
+               if (class_dev->devt == MKDEV(USB_DEVICE_MAJOR, minor)) {
+                       dev = class_dev->class_data;
                        break;
                }
        }
        up(&usb_device_class->sem);
 
-       return udev;
+       return dev;
 };
 
 /*
@@ -1580,16 +1580,16 @@ static void usbdev_add(struct usb_device *dev)
 {
        int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1);
 
-       dev->usbfs_dev = device_create(usb_device_class, &dev->dev,
-                               MKDEV(USB_DEVICE_MAJOR, minor),
+       dev->class_dev = class_device_create(usb_device_class, NULL,
+                               MKDEV(USB_DEVICE_MAJOR, minor), &dev->dev,
                                "usbdev%d.%d", dev->bus->busnum, dev->devnum);
 
-       dev->usbfs_dev->platform_data = dev;
+       dev->class_dev->class_data = dev;
 }
 
 static void usbdev_remove(struct usb_device *dev)
 {
-       device_unregister(dev->usbfs_dev);
+       class_device_unregister(dev->class_dev);
 }
 
 static int usbdev_notify(struct notifier_block *self, unsigned long action,
index abee0f5b6a66492c1a9e417a8f908a0cb9d8606d..8de4f8c99d61f3a7cb01696bde29202ed814b160 100644 (file)
@@ -194,13 +194,14 @@ int usb_register_dev(struct usb_interface *intf,
                ++temp;
        else
                temp = name;
-       intf->usb_dev = device_create(usb_class->class, &intf->dev,
-                                     MKDEV(USB_MAJOR, minor), "%s", temp);
-       if (IS_ERR(intf->usb_dev)) {
+       intf->class_dev = class_device_create(usb_class->class, NULL,
+                                             MKDEV(USB_MAJOR, minor),
+                                             &intf->dev, "%s", temp);
+       if (IS_ERR(intf->class_dev)) {
                spin_lock (&minor_lock);
                usb_minors[intf->minor] = NULL;
                spin_unlock (&minor_lock);
-               retval = PTR_ERR(intf->usb_dev);
+               retval = PTR_ERR(intf->class_dev);
        }
 exit:
        return retval;
@@ -241,8 +242,8 @@ void usb_deregister_dev(struct usb_interface *intf,
        spin_unlock (&minor_lock);
 
        snprintf(name, BUS_ID_SIZE, class_driver->name, intf->minor - minor_base);
-       device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor));
-       intf->usb_dev = NULL;
+       class_device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor));
+       intf->class_dev = NULL;
        intf->minor = -1;
        destroy_usb_class();
 }
index 363b2ad74ae60db025df978abe30aea313033cf3..1a32d96774b42d61ce0e33abe3b38b8c350fde10 100644 (file)
@@ -207,7 +207,7 @@ config USB_AT91
 
 config USB_GADGET_DUMMY_HCD
        boolean "Dummy HCD (DEVELOPMENT)"
-       depends on USB && EXPERIMENTAL
+       depends on (USB=y || (USB=m && USB_GADGET=m)) && EXPERIMENTAL
        select USB_GADGET_DUALSPEED
        help
          This host controller driver emulates USB, looping all data transfer
index 1c459ff037cef275d5e487da9de0f8362fee4b26..cfebca05ead57ca87188b40d93f08ec0c04160b1 100644 (file)
 
 /*
  * This controller is simple and PIO-only.  It's used in many AT91-series
- * ARMv4T controllers, including the at91rm9200 (arm920T, with MMU),
- * at91sam9261 (arm926ejs, with MMU), and several no-mmu versions.
+ * full speed USB controllers, including the at91rm9200 (arm920T, with MMU),
+ * at91sam926x (arm926ejs, with MMU), and several no-mmu versions.
  *
  * This driver expects the board has been wired with two GPIOs suppporting
  * a VBUS sensing IRQ, and a D+ pullup.  (They may be omitted, but the
- * testing hasn't covered such cases.)  The pullup is most important; it
+ * testing hasn't covered such cases.)
+ *
+ * The pullup is most important (so it's integrated on sam926x parts).  It
  * provides software control over whether the host enumerates the device.
+ *
  * The VBUS sensing helps during enumeration, and allows both USB clocks
  * (and the transceiver) to stay gated off until they're necessary, saving
- * power.  During USB suspend, the 48 MHz clock is gated off.
+ * power.  During USB suspend, the 48 MHz clock is gated off in hardware;
+ * it may also be gated off by software during some Linux sleep states.
  */
 
-#define        DRIVER_VERSION  "8 March 2005"
+#define        DRIVER_VERSION  "3 May 2006"
 
 static const char driver_name [] = "at91_udc";
 static const char ep0name[] = "ep0";
@@ -316,9 +320,15 @@ static void done(struct at91_ep *ep, struct at91_request *req, int status)
  *
  * There are also state bits like FORCESTALL, EPEDS, DIR, and EPTYPE
  * that shouldn't normally be changed.
+ *
+ * NOTE at91sam9260 docs mention synch between UDPCK and MCK clock domains,
+ * implying a need to wait for one write to complete (test relevant bits)
+ * before starting the next write.  This shouldn't be an issue given how
+ * infrequently we write, except maybe for write-then-read idioms.
  */
 #define        SET_FX  (AT91_UDP_TXPKTRDY)
-#define        CLR_FX  (RX_DATA_READY | AT91_UDP_RXSETUP | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP)
+#define        CLR_FX  (RX_DATA_READY | AT91_UDP_RXSETUP \
+               | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP)
 
 /* pull OUT packet data from the endpoint's fifo */
 static int read_fifo (struct at91_ep *ep, struct at91_request *req)
@@ -472,7 +482,8 @@ static void nuke(struct at91_ep *ep, int status)
 
 /*-------------------------------------------------------------------------*/
 
-static int at91_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
+static int at91_ep_enable(struct usb_ep *_ep,
+                               const struct usb_endpoint_descriptor *desc)
 {
        struct at91_ep  *ep = container_of(_ep, struct at91_ep, ep);
        struct at91_udc *dev = ep->udc;
@@ -582,11 +593,12 @@ static int at91_ep_disable (struct usb_ep * _ep)
  * interesting for request or buffer allocation.
  */
 
-static struct usb_request *at91_ep_alloc_request (struct usb_ep *_ep, unsigned int gfp_flags)
+static struct usb_request *
+at91_ep_alloc_request(struct usb_ep *_ep, unsigned int gfp_flags)
 {
        struct at91_request *req;
 
-       req = kcalloc(1, sizeof (struct at91_request), SLAB_KERNEL);
+       req = kcalloc(1, sizeof (struct at91_request), gfp_flags);
        if (!req)
                return NULL;
 
@@ -862,6 +874,7 @@ static void stop_activity(struct at91_udc *udc)
        if (udc->gadget.speed == USB_SPEED_UNKNOWN)
                driver = NULL;
        udc->gadget.speed = USB_SPEED_UNKNOWN;
+       udc->suspended = 0;
 
        for (i = 0; i < NUM_ENDPOINTS; i++) {
                struct at91_ep *ep = &udc->ep[i];
@@ -889,8 +902,8 @@ static void clk_off(struct at91_udc *udc)
                return;
        udc->clocked = 0;
        udc->gadget.speed = USB_SPEED_UNKNOWN;
-       clk_disable(udc->iclk);
        clk_disable(udc->fclk);
+       clk_disable(udc->iclk);
 }
 
 /*
@@ -911,9 +924,6 @@ static void pullup(struct at91_udc *udc, int is_on)
                at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS);
                at91_set_gpio_value(udc->board.pullup_pin, 0);
                clk_off(udc);
-
-               // REVISIT:  with transceiver disabled, will D- float
-               // so that a host would falsely detect a device?
        }
 }
 
@@ -1290,7 +1300,8 @@ static void handle_ep0(struct at91_udc *udc)
                        if (udc->wait_for_addr_ack) {
                                u32     tmp;
 
-                               at91_udp_write(AT91_UDP_FADDR, AT91_UDP_FEN | udc->addr);
+                               at91_udp_write(AT91_UDP_FADDR,
+                                               AT91_UDP_FEN | udc->addr);
                                tmp = at91_udp_read(AT91_UDP_GLB_STAT);
                                tmp &= ~AT91_UDP_FADDEN;
                                if (udc->addr)
@@ -1361,9 +1372,10 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r)
        u32                     rescans = 5;
 
        while (rescans--) {
-               u32     status = at91_udp_read(AT91_UDP_ISR);
+               u32 status;
 
-               status &= at91_udp_read(AT91_UDP_IMR);
+               status = at91_udp_read(AT91_UDP_ISR)
+                       & at91_udp_read(AT91_UDP_IMR);
                if (!status)
                        break;
 
@@ -1379,18 +1391,17 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r)
                        stop_activity(udc);
 
                        /* enable ep0 */
-                       at91_udp_write(AT91_UDP_CSR(0), AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL);
+                       at91_udp_write(AT91_UDP_CSR(0),
+                                       AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL);
                        udc->gadget.speed = USB_SPEED_FULL;
                        udc->suspended = 0;
                        at91_udp_write(AT91_UDP_IER, AT91_UDP_EP(0));
 
                        /*
                         * NOTE:  this driver keeps clocks off unless the
-                        * USB host is present.  That saves power, and also
-                        * eliminates IRQs (reset, resume, suspend) that can
-                        * otherwise flood from the controller.  If your
-                        * board doesn't support VBUS detection, suspend and
-                        * resume irq logic may need more attention...
+                        * USB host is present.  That saves power, but for
+                        * boards that don't support VBUS detection, both
+                        * clocks need to be active most of the time.
                         */
 
                /* host initiated suspend (3+ms bus idle) */
@@ -1452,13 +1463,19 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r)
 
 /*-------------------------------------------------------------------------*/
 
+static void nop_release(struct device *dev)
+{
+       /* nothing to free */
+}
+
 static struct at91_udc controller = {
        .gadget = {
-               .ops = &at91_udc_ops,
-               .ep0 = &controller.ep[0].ep,
-               .name = driver_name,
-               .dev = {
-                       .bus_id = "gadget"
+               .ops    = &at91_udc_ops,
+               .ep0    = &controller.ep[0].ep,
+               .name   = driver_name,
+               .dev    = {
+                       .bus_id = "gadget",
+                       .release = nop_release,
                }
        },
        .ep[0] = {
@@ -1468,7 +1485,8 @@ static struct at91_udc controller = {
                },
                .udc            = &controller,
                .maxpacket      = 8,
-               .creg           = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(0)),
+               .creg           = (void __iomem *)(AT91_VA_BASE_UDP
+                                       + AT91_UDP_CSR(0)),
                .int_mask       = 1 << 0,
        },
        .ep[1] = {
@@ -1479,7 +1497,8 @@ static struct at91_udc controller = {
                .udc            = &controller,
                .is_pingpong    = 1,
                .maxpacket      = 64,
-               .creg           = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(1)),
+               .creg           = (void __iomem *)(AT91_VA_BASE_UDP
+                                       + AT91_UDP_CSR(1)),
                .int_mask       = 1 << 1,
        },
        .ep[2] = {
@@ -1490,7 +1509,8 @@ static struct at91_udc controller = {
                .udc            = &controller,
                .is_pingpong    = 1,
                .maxpacket      = 64,
-               .creg           = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(2)),
+               .creg           = (void __iomem *)(AT91_VA_BASE_UDP
+                                       + AT91_UDP_CSR(2)),
                .int_mask       = 1 << 2,
        },
        .ep[3] = {
@@ -1501,7 +1521,8 @@ static struct at91_udc controller = {
                },
                .udc            = &controller,
                .maxpacket      = 8,
-               .creg           = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(3)),
+               .creg           = (void __iomem *)(AT91_VA_BASE_UDP
+                                       + AT91_UDP_CSR(3)),
                .int_mask       = 1 << 3,
        },
        .ep[4] = {
@@ -1512,7 +1533,8 @@ static struct at91_udc controller = {
                .udc            = &controller,
                .is_pingpong    = 1,
                .maxpacket      = 256,
-               .creg           = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(4)),
+               .creg           = (void __iomem *)(AT91_VA_BASE_UDP
+                                       + AT91_UDP_CSR(4)),
                .int_mask       = 1 << 4,
        },
        .ep[5] = {
@@ -1523,10 +1545,11 @@ static struct at91_udc controller = {
                .udc            = &controller,
                .is_pingpong    = 1,
                .maxpacket      = 256,
-               .creg           = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(5)),
+               .creg           = (void __iomem *)(AT91_VA_BASE_UDP
+                                       + AT91_UDP_CSR(5)),
                .int_mask       = 1 << 5,
        },
-       /* ep6 and ep7 are also reserved */
+       /* ep6 and ep7 are also reserved (custom silicon might use them) */
 };
 
 static irqreturn_t at91_vbus_irq(int irq, void *_udc, struct pt_regs *r)
@@ -1593,6 +1616,7 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
 
        local_irq_disable();
        udc->enabled = 0;
+       at91_udp_write(AT91_UDP_IDR, ~0);
        pullup(udc, 0);
        local_irq_enable();
 
@@ -1624,6 +1648,16 @@ static int __devinit at91udc_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
+       if (pdev->num_resources != 2) {
+               DBG("invalid num_resources");
+               return -ENODEV;
+       }
+       if ((pdev->resource[0].flags != IORESOURCE_MEM)
+                       || (pdev->resource[1].flags != IORESOURCE_IRQ)) {
+               DBG("invalid resource type");
+               return -ENODEV;
+       }
+
        if (!request_mem_region(AT91_BASE_UDP, SZ_16K, driver_name)) {
                DBG("someone's using UDC memory\n");
                return -EBUSY;
@@ -1649,19 +1683,26 @@ static int __devinit at91udc_probe(struct platform_device *pdev)
        if (retval < 0)
                goto fail0;
 
-       /* disable everything until there's a gadget driver and vbus */
-       pullup(udc, 0);
+       /* don't do anything until we have both gadget driver and VBUS */
+       clk_enable(udc->iclk);
+       at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS);
+       at91_udp_write(AT91_UDP_IDR, 0xffffffff);
+       clk_disable(udc->iclk);
 
        /* request UDC and maybe VBUS irqs */
-       if (request_irq(AT91_ID_UDP, at91_udc_irq, IRQF_DISABLED, driver_name, udc)) {
-               DBG("request irq %d failed\n", AT91_ID_UDP);
+       udc->udp_irq = platform_get_irq(pdev, 0);
+       if (request_irq(udc->udp_irq, at91_udc_irq,
+                       IRQF_DISABLED, driver_name, udc)) {
+               DBG("request irq %d failed\n", udc->udp_irq);
                retval = -EBUSY;
                goto fail1;
        }
        if (udc->board.vbus_pin > 0) {
-               if (request_irq(udc->board.vbus_pin, at91_vbus_irq, IRQF_DISABLED, driver_name, udc)) {
-                       DBG("request vbus irq %d failed\n", udc->board.vbus_pin);
-                       free_irq(AT91_ID_UDP, udc);
+               if (request_irq(udc->board.vbus_pin, at91_vbus_irq,
+                               IRQF_DISABLED, driver_name, udc)) {
+                       DBG("request vbus irq %d failed\n",
+                                       udc->board.vbus_pin);
+                       free_irq(udc->udp_irq, udc);
                        retval = -EBUSY;
                        goto fail1;
                }
@@ -1670,6 +1711,7 @@ static int __devinit at91udc_probe(struct platform_device *pdev)
                udc->vbus = 1;
        }
        dev_set_drvdata(dev, udc);
+       device_init_wakeup(dev, 1);
        create_debug_file(udc);
 
        INFO("%s version %s\n", driver_name, DRIVER_VERSION);
@@ -1678,14 +1720,14 @@ static int __devinit at91udc_probe(struct platform_device *pdev)
 fail1:
        device_unregister(&udc->gadget.dev);
 fail0:
-       release_mem_region(AT91_VA_BASE_UDP, SZ_16K);
+       release_mem_region(AT91_BASE_UDP, SZ_16K);
        DBG("%s probe failed, %d\n", driver_name, retval);
        return retval;
 }
 
-static int __devexit at91udc_remove(struct platform_device *dev)
+static int __devexit at91udc_remove(struct platform_device *pdev)
 {
-       struct at91_udc *udc = platform_get_drvdata(dev);
+       struct at91_udc *udc = platform_get_drvdata(pdev);
 
        DBG("remove\n");
 
@@ -1694,10 +1736,11 @@ static int __devexit at91udc_remove(struct platform_device *dev)
        if (udc->driver != 0)
                usb_gadget_unregister_driver(udc->driver);
 
+       device_init_wakeup(&pdev->dev, 0);
        remove_debug_file(udc);
        if (udc->board.vbus_pin > 0)
                free_irq(udc->board.vbus_pin, udc);
-       free_irq(AT91_ID_UDP, udc);
+       free_irq(udc->udp_irq, udc);
        device_unregister(&udc->gadget.dev);
        release_mem_region(AT91_BASE_UDP, SZ_16K);
 
@@ -1708,31 +1751,36 @@ static int __devexit at91udc_remove(struct platform_device *dev)
 }
 
 #ifdef CONFIG_PM
-static int at91udc_suspend(struct platform_device *dev, pm_message_t mesg)
+static int at91udc_suspend(struct platform_device *pdev, pm_message_t mesg)
 {
-       struct at91_udc *udc = platform_get_drvdata(dev);
+       struct at91_udc *udc = platform_get_drvdata(pdev);
+       int             wake = udc->driver && device_may_wakeup(&pdev->dev);
 
-       /*
-        * The "safe" suspend transitions are opportunistic ... e.g. when
-        * the USB link is suspended (48MHz clock autogated off), or when
-        * it's disconnected (programmatically gated off, elsewhere).
-        * Then we can suspend, and the chip can enter slow clock mode.
-        *
-        * The problem case is some component (user mode?) suspending this
-        * device while it's active, with the 48 MHz clock in use.  There
-        * are two basic approaches:  (a) veto suspend levels involving slow
-        * clock mode, (b) disconnect, so 48 MHz will no longer be in use
-        * and we can enter slow clock mode.  This uses (b) for now, since
-        * it's simplest until AT91 PM exists and supports the other option.
+       /* Unless we can act normally to the host (letting it wake us up
+        * whenever it has work for us) force disconnect.  Wakeup requires
+        * PLLB for USB events (signaling for reset, wakeup, or incoming
+        * tokens) and VBUS irqs (on systems which support them).
         */
-       if (udc->vbus && !udc->suspended)
+       if ((!udc->suspended && udc->addr)
+                       || !wake
+                       || at91_suspend_entering_slow_clock()) {
                pullup(udc, 0);
+               disable_irq_wake(udc->udp_irq);
+       } else
+               enable_irq_wake(udc->udp_irq);
+
+       if (udc->board.vbus_pin > 0) {
+               if (wake)
+                       enable_irq_wake(udc->board.vbus_pin);
+               else
+                       disable_irq_wake(udc->board.vbus_pin);
+       }
        return 0;
 }
 
-static int at91udc_resume(struct platform_device *dev)
+static int at91udc_resume(struct platform_device *pdev)
 {
-       struct at91_udc *udc = platform_get_drvdata(dev);
+       struct at91_udc *udc = platform_get_drvdata(pdev);
 
        /* maybe reconnect to host; if so, clocks on */
        pullup(udc, 1);
@@ -1748,7 +1796,7 @@ static struct platform_driver at91_udc = {
        .remove         = __devexit_p(at91udc_remove),
        .shutdown       = at91udc_shutdown,
        .suspend        = at91udc_suspend,
-       .resume         = at91udc_resume,
+       .resume         = at91udc_resume,
        .driver         = {
                .name   = (char *) driver_name,
                .owner  = THIS_MODULE,
@@ -1767,6 +1815,6 @@ static void __devexit udc_exit_module(void)
 }
 module_exit(udc_exit_module);
 
-MODULE_DESCRIPTION("AT91RM9200 udc driver");
+MODULE_DESCRIPTION("AT91 udc driver");
 MODULE_AUTHOR("Thomas Rathbone, David Brownell");
 MODULE_LICENSE("GPL");
index 5a4799cedd1974a1c8c5cb0abe08dd29f68a374e..882af42e86cc413f2d74d28e4a8b986ff4868f4c 100644 (file)
@@ -141,6 +141,7 @@ struct at91_udc {
        struct clk                      *iclk, *fclk;
        struct platform_device          *pdev;
        struct proc_dir_entry           *pde;
+       int                             udp_irq;
 };
 
 static inline struct at91_udc *to_udc(struct usb_gadget *g)
index 4be47195bd38d633b3b6dca431682cc69543bcfa..7d1c22c34957bfa94ebc5dfe067a6b98ffa86e28 100644 (file)
@@ -609,7 +609,8 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
        if (!dum->driver)
                return -ESHUTDOWN;
 
-       spin_lock_irqsave (&dum->lock, flags);
+       local_irq_save (flags);
+       spin_lock (&dum->lock);
        list_for_each_entry (req, &ep->queue, queue) {
                if (&req->req == _req) {
                        list_del_init (&req->queue);
@@ -618,7 +619,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
                        break;
                }
        }
-       spin_unlock_irqrestore (&dum->lock, flags);
+       spin_unlock (&dum->lock);
 
        if (retval == 0) {
                dev_dbg (udc_dev(dum),
@@ -626,6 +627,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
                                req, _ep->name, _req->length, _req->buf);
                _req->complete (_ep, _req);
        }
+       local_irq_restore (flags);
        return retval;
 }
 
index 85b0b4ad4c16ec58de1ebf8016ad25f6b3829e1a..d63177a8eaea330b41e6465f740efa4d7b3ba3c7 100644 (file)
@@ -892,7 +892,7 @@ MODULE_LICENSE ("GPL");
 #define        PCI_DRIVER              ehci_pci_driver
 #endif
 
-#ifdef CONFIG_PPC_83xx
+#ifdef CONFIG_MPC834x
 #include "ehci-fsl.c"
 #define        PLATFORM_DRIVER         ehci_fsl_driver
 #endif
index cdbafb710000a1f30d06083f5dfc721ce57653f4..85cc059705a645e947eae76f13be929048f8eef4 100644 (file)
@@ -4,7 +4,7 @@
  *  Copyright (C) 2004 SAN People (Pty) Ltd.
  *  Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org>
  *
- * AT91RM9200 Bus Glue
+ * AT91 Bus Glue
  *
  * Based on fragments of 2.4 driver by Rick Bronson.
  * Based on ohci-omap.c
 #include <asm/hardware.h>
 #include <asm/arch/board.h>
 
-#ifndef CONFIG_ARCH_AT91RM9200
-#error "CONFIG_ARCH_AT91RM9200 must be defined."
+#ifndef CONFIG_ARCH_AT91
+#error "CONFIG_ARCH_AT91 must be defined."
 #endif
 
 /* interface and function clocks */
 static struct clk *iclk, *fclk;
+static int clocked;
 
 extern int usb_disabled(void);
 
@@ -35,13 +36,14 @@ static void at91_start_hc(struct platform_device *pdev)
        struct usb_hcd *hcd = platform_get_drvdata(pdev);
        struct ohci_regs __iomem *regs = hcd->regs;
 
-       dev_dbg(&pdev->dev, "starting AT91RM9200 OHCI USB Controller\n");
+       dev_dbg(&pdev->dev, "start\n");
 
        /*
         * Start the USB clocks.
         */
        clk_enable(iclk);
        clk_enable(fclk);
+       clocked = 1;
 
        /*
         * The USB host controller must remain in reset.
@@ -54,7 +56,7 @@ static void at91_stop_hc(struct platform_device *pdev)
        struct usb_hcd *hcd = platform_get_drvdata(pdev);
        struct ohci_regs __iomem *regs = hcd->regs;
 
-       dev_dbg(&pdev->dev, "stopping AT91RM9200 OHCI USB Controller\n");
+       dev_dbg(&pdev->dev, "stop\n");
 
        /*
         * Put the USB host controller into reset.
@@ -66,6 +68,7 @@ static void at91_stop_hc(struct platform_device *pdev)
         */
        clk_disable(fclk);
        clk_disable(iclk);
+       clocked = 0;
 }
 
 
@@ -78,14 +81,15 @@ static int usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *);
 
 
 /**
- * usb_hcd_at91_probe - initialize AT91RM9200-based HCDs
+ * usb_hcd_at91_probe - initialize AT91-based HCDs
  * Context: !in_interrupt()
  *
  * Allocates basic resources for this USB host controller, and
  * then invokes the start() method for the HCD associated with it
  * through the hotplug entry's driver_data.
  */
-int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device *pdev)
+static int usb_hcd_at91_probe(const struct hc_driver *driver,
+                       struct platform_device *pdev)
 {
        int retval;
        struct usb_hcd *hcd = NULL;
@@ -95,12 +99,13 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device *
                return -ENODEV;
        }
 
-       if ((pdev->resource[0].flags != IORESOURCE_MEM) || (pdev->resource[1].flags != IORESOURCE_IRQ)) {
+       if ((pdev->resource[0].flags != IORESOURCE_MEM)
+                       || (pdev->resource[1].flags != IORESOURCE_IRQ)) {
                pr_debug("hcd probe: invalid resource type\n");
                return -ENODEV;
        }
 
-       hcd = usb_create_hcd(driver, &pdev->dev, "at91rm9200");
+       hcd = usb_create_hcd(driver, &pdev->dev, "at91");
        if (!hcd)
                return -ENOMEM;
        hcd->rsrc_start = pdev->resource[0].start;
@@ -149,21 +154,23 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device *
 /* may be called with controller, bus, and devices active */
 
 /**
- * usb_hcd_at91_remove - shutdown processing for AT91RM9200-based HCDs
+ * usb_hcd_at91_remove - shutdown processing for AT91-based HCDs
  * @dev: USB Host Controller being removed
  * Context: !in_interrupt()
  *
  * Reverses the effect of usb_hcd_at91_probe(), first invoking
  * the HCD's stop() method.  It is always called from a thread
- * context, normally "rmmod", "apmd", or something similar.
+ * context, "rmmod" or something similar.
  *
  */
-static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pdev)
+static int usb_hcd_at91_remove(struct usb_hcd *hcd,
+                               struct platform_device *pdev)
 {
        usb_remove_hcd(hcd);
        at91_stop_hc(pdev);
        iounmap(hcd->regs);
        release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+       disable_irq_wake(hcd->irq);
 
        clk_put(fclk);
        clk_put(iclk);
@@ -178,19 +185,21 @@ static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pde
 static int __devinit
 ohci_at91_start (struct usb_hcd *hcd)
 {
-//     struct at91_ohci_data   *board = hcd->self.controller->platform_data;
+       struct at91_usbh_data   *board = hcd->self.controller->platform_data;
        struct ohci_hcd         *ohci = hcd_to_ohci (hcd);
+       struct usb_device       *root = hcd->self.root_hub;
        int                     ret;
 
        if ((ret = ohci_init(ohci)) < 0)
                return ret;
 
+       root->maxchild = board->ports;
+
        if ((ret = ohci_run(ohci)) < 0) {
                err("can't start %s", hcd->self.bus_name);
                ohci_stop(hcd);
                return ret;
        }
-//     hcd->self.root_hub->maxchild = board->ports;
        return 0;
 }
 
@@ -198,7 +207,7 @@ ohci_at91_start (struct usb_hcd *hcd)
 
 static const struct hc_driver ohci_at91_hc_driver = {
        .description =          hcd_name,
-       .product_desc =         "AT91RM9200 OHCI",
+       .product_desc =         "AT91 OHCI",
        .hcd_priv_size =        sizeof(struct ohci_hcd),
 
        /*
@@ -240,33 +249,54 @@ static const struct hc_driver ohci_at91_hc_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-static int ohci_hcd_at91_drv_probe(struct platform_device *dev)
+static int ohci_hcd_at91_drv_probe(struct platform_device *pdev)
 {
-       return usb_hcd_at91_probe(&ohci_at91_hc_driver, dev);
+       device_init_wakeup(&pdev->dev, 1);
+       return usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev);
 }
 
-static int ohci_hcd_at91_drv_remove(struct platform_device *dev)
+static int ohci_hcd_at91_drv_remove(struct platform_device *pdev)
 {
-       return usb_hcd_at91_remove(platform_get_drvdata(dev), dev);
+       device_init_wakeup(&pdev->dev, 0);
+       return usb_hcd_at91_remove(platform_get_drvdata(pdev), pdev);
 }
 
 #ifdef CONFIG_PM
 
-/* REVISIT suspend/resume look "too" simple here */
-
 static int
-ohci_hcd_at91_drv_suspend(struct platform_device *dev, pm_message_t mesg)
+ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg)
 {
-       clk_disable(fclk);
-       clk_disable(iclk);
+       struct usb_hcd  *hcd = platform_get_drvdata(pdev);
+       struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+
+       if (device_may_wakeup(&pdev->dev))
+               enable_irq_wake(hcd->irq);
+       else
+               disable_irq_wake(hcd->irq);
+
+       /*
+        * The integrated transceivers seem unable to notice disconnect,
+        * reconnect, or wakeup without the 48 MHz clock active.  so for
+        * correctness, always discard connection state (using reset).
+        *
+        * REVISIT: some boards will be able to turn VBUS off...
+        */
+       if (at91_suspend_entering_slow_clock()) {
+               ohci_usb_reset (ohci);
+               clk_disable(fclk);
+               clk_disable(iclk);
+               clocked = 0;
+       }
 
        return 0;
 }
 
-static int ohci_hcd_at91_drv_resume(struct platform_device *dev)
+static int ohci_hcd_at91_drv_resume(struct platform_device *pdev)
 {
-       clk_enable(iclk);
-       clk_enable(fclk);
+       if (!clocked) {
+               clk_enable(iclk);
+               clk_enable(fclk);
+       }
 
        return 0;
 }
@@ -275,7 +305,7 @@ static int ohci_hcd_at91_drv_resume(struct platform_device *dev)
 #define ohci_hcd_at91_drv_resume  NULL
 #endif
 
-MODULE_ALIAS("at91rm9200-ohci");
+MODULE_ALIAS("at91_ohci");
 
 static struct platform_driver ohci_hcd_at91_driver = {
        .probe          = ohci_hcd_at91_drv_probe,
@@ -283,7 +313,7 @@ static struct platform_driver ohci_hcd_at91_driver = {
        .suspend        = ohci_hcd_at91_drv_suspend,
        .resume         = ohci_hcd_at91_drv_resume,
        .driver         = {
-               .name   = "at91rm9200-ohci",
+               .name   = "at91_ohci",
                .owner  = THIS_MODULE,
        },
 };
index afef5ac35b4af79d3137532898930a8bbea40c86..94d8cf4b36c19cf1472ae3c64d5874d143fd60fa 100644 (file)
@@ -913,7 +913,7 @@ MODULE_LICENSE ("GPL");
 #include "ohci-ppc-soc.c"
 #endif
 
-#ifdef CONFIG_ARCH_AT91RM9200
+#if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261)
 #include "ohci-at91.c"
 #endif
 
@@ -927,6 +927,7 @@ MODULE_LICENSE ("GPL");
       || defined (CONFIG_SOC_AU1X00) \
       || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \
       || defined (CONFIG_ARCH_AT91RM9200) \
+      || defined (CONFIG_ARCH_AT91SAM9261) \
        )
 #error "missing bus glue for ohci-hcd"
 #endif
index c9d72ac0a1d775872ed78ed733980e40244749a0..66c3f61bc9d1332da61027fd5b2a005c7af941f1 100644 (file)
@@ -943,7 +943,9 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb)
                        /* We received a short packet */
                        if (urb->transfer_flags & URB_SHORT_NOT_OK)
                                ret = -EREMOTEIO;
-                       else if (ctrlstat & TD_CTRL_SPD)
+
+                       /* Fixup needed only if this isn't the URB's last TD */
+                       else if (&td->list != urbp->td_list.prev)
                                ret = 1;
                }
 
index 05d2d6012eb247d4700abdb086bc257eaea1c792..df198cf76f5239233c94c8f783c649a6aba9c36a 100644 (file)
@@ -152,9 +152,8 @@ static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 };
  * events. The hardware generates 5 events for the first keypress
  * and we have to take this into account for an accurate repeat
  * behaviour.
- * (HZ / 20) == 50 ms and works well for me.
  */
-#define FILTER_TIME (HZ / 20)
+#define FILTER_TIME 60 /* msec */
 
 struct ati_remote {
        struct input_dev *idev;
@@ -467,7 +466,7 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs)
                /* Filter duplicate events which happen "too close" together. */
                if ((ati_remote->old_data[0] == data[1]) &&
                        (ati_remote->old_data[1] == data[2]) &&
-                       time_before(jiffies, ati_remote->old_jiffies + FILTER_TIME)) {
+                       time_before(jiffies, ati_remote->old_jiffies + msecs_to_jiffies(FILTER_TIME))) {
                        ati_remote->repeat_count++;
                } else {
                        ati_remote->repeat_count = 0;
index e091d327bd9e7839eccee2a9b11d036959feb30e..a4062a6adbb830f20c9539b063e69ae493d8c966 100644 (file)
 *      the single I/O ports of the device.
 *
 *      Supported vendors:      AK Modul-Bus Computer GmbH
-*      Supported devices:      CY7C63001A-PC (to be continued...)
-*      Supported functions:    Read/Write Ports (to be continued...)
+*                              (Firmware "Port-Chip")
+*
+*      Supported devices:      CY7C63001A-PC
+*                              CY7C63001C-PXC
+*                              CY7C63001C-SXC
+*
+*      Supported functions:    Read/Write Ports
 *
 *
 *      This program is free software; you can redistribute it and/or
index e5e6e4f3ef874e5128bfd52f8202e78d7d4edc54..bd09232ce13c5fc5052d708a18315bf6498a08a4 100644 (file)
@@ -175,6 +175,8 @@ static inline struct sk_buff *pull_skb(rtl8150_t *);
 static void rtl8150_disconnect(struct usb_interface *intf);
 static int rtl8150_probe(struct usb_interface *intf,
                           const struct usb_device_id *id);
+static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message);
+static int rtl8150_resume(struct usb_interface *intf);
 
 static const char driver_name [] = "rtl8150";
 
@@ -183,6 +185,8 @@ static struct usb_driver rtl8150_driver = {
        .probe =        rtl8150_probe,
        .disconnect =   rtl8150_disconnect,
        .id_table =     rtl8150_table,
+       .suspend =      rtl8150_suspend,
+       .resume =       rtl8150_resume
 };
 
 /*
@@ -238,9 +242,11 @@ static int async_set_registers(rtl8150_t * dev, u16 indx, u16 size)
        usb_fill_control_urb(dev->ctrl_urb, dev->udev,
                         usb_sndctrlpipe(dev->udev, 0), (char *) &dev->dr,
                         &dev->rx_creg, size, ctrl_callback, dev);
-       if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC)))
+       if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) {
+               if (ret == -ENODEV)
+                       netif_device_detach(dev->netdev);
                err("control request submission failed: %d", ret);
-       else
+       else
                set_bit(RX_REG_SET, &dev->flags);
 
        return ret;
@@ -416,6 +422,7 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs)
        struct sk_buff *skb;
        struct net_device *netdev;
        u16 rx_stat;
+       int status;
 
        dev = urb->context;
        if (!dev)
@@ -465,7 +472,10 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs)
 goon:
        usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1),
                      dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev);
-       if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) {
+       status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC);
+       if (status == -ENODEV)
+               netif_device_detach(dev->netdev);
+       else if (status) {
                set_bit(RX_URB_FAIL, &dev->flags);
                goto resched;
        } else {
@@ -481,6 +491,7 @@ static void rx_fixup(unsigned long data)
 {
        rtl8150_t *dev;
        struct sk_buff *skb;
+       int status;
 
        dev = (rtl8150_t *)data;
 
@@ -499,10 +510,13 @@ static void rx_fixup(unsigned long data)
        usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1),
                      dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev);
 try_again:
-       if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) {
+       status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC);
+       if (status == -ENODEV) {
+               netif_device_detach(dev->netdev);
+       } else if (status) {
                set_bit(RX_URB_FAIL, &dev->flags);
                goto tlsched;
-        } else {
+       } else {
                clear_bit(RX_URB_FAIL, &dev->flags);
        }
 
@@ -574,12 +588,43 @@ static void intr_callback(struct urb *urb, struct pt_regs *regs)
 
 resubmit:
        status = usb_submit_urb (urb, SLAB_ATOMIC);
-       if (status)
+       if (status == -ENODEV)
+               netif_device_detach(dev->netdev);
+       else if (status)
                err ("can't resubmit intr, %s-%s/input0, status %d",
                                dev->udev->bus->bus_name,
                                dev->udev->devpath, status);
 }
 
+static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message)
+{
+       rtl8150_t *dev = usb_get_intfdata(intf);
+
+       netif_device_detach(dev->netdev);
+
+       if (netif_running(dev->netdev)) {
+               usb_kill_urb(dev->rx_urb);
+               usb_kill_urb(dev->intr_urb);
+       }
+       return 0;
+}
+
+static int rtl8150_resume(struct usb_interface *intf)
+{
+       rtl8150_t *dev = usb_get_intfdata(intf);
+
+       netif_device_attach(dev->netdev);
+       if (netif_running(dev->netdev)) {
+               dev->rx_urb->status = 0;
+               dev->rx_urb->actual_length = 0;
+               read_bulk_callback(dev->rx_urb, NULL);
+
+               dev->intr_urb->status = 0;
+               dev->intr_urb->actual_length = 0;
+               intr_callback(dev->intr_urb, NULL);
+       }
+       return 0;
+}
 
 /*
 **
@@ -690,9 +735,14 @@ static int rtl8150_start_xmit(struct sk_buff *skb, struct net_device *netdev)
        usb_fill_bulk_urb(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev, 2),
                      skb->data, count, write_bulk_callback, dev);
        if ((res = usb_submit_urb(dev->tx_urb, GFP_ATOMIC))) {
-               warn("failed tx_urb %d\n", res);
-               dev->stats.tx_errors++;
-               netif_start_queue(netdev);
+               /* Can we get/handle EPIPE here? */
+               if (res == -ENODEV)
+                       netif_device_detach(dev->netdev);
+               else {
+                       warn("failed tx_urb %d\n", res);
+                       dev->stats.tx_errors++;
+                       netif_start_queue(netdev);
+               }
        } else {
                dev->stats.tx_packets++;
                dev->stats.tx_bytes += skb->len;
@@ -729,16 +779,25 @@ static int rtl8150_open(struct net_device *netdev)
        
        usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1),
                      dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev);
-       if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL)))
+       if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) {
+               if (res == -ENODEV)
+                       netif_device_detach(dev->netdev);
                warn("%s: rx_urb submit failed: %d", __FUNCTION__, res);
+               return res;
+       }
        usb_fill_int_urb(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev, 3),
                     dev->intr_buff, INTBUFSIZE, intr_callback,
                     dev, dev->intr_interval);
-       if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL)))
+       if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) {
+               if (res == -ENODEV)
+                       netif_device_detach(dev->netdev);
                warn("%s: intr_urb submit failed: %d", __FUNCTION__, res);
-       netif_start_queue(netdev);
+               usb_kill_urb(dev->rx_urb);
+               return res;
+       }
        enable_net_traffic(dev);
        set_carrier(netdev);
+       netif_start_queue(netdev);
 
        return res;
 }
index ac33bd47cfce8746ac009e8fa64927538ec68612..f5b9438c94f0f29bd35392906b59759420ebad44 100644 (file)
@@ -62,15 +62,6 @@ config USB_SERIAL_AIRPRIME
          To compile this driver as a module, choose M here: the
          module will be called airprime.
 
-config USB_SERIAL_ANYDATA
-       tristate "USB AnyData CDMA Wireless Driver"
-       depends on USB_SERIAL
-       help
-         Say Y here if you want to use a AnyData CDMA device.
-
-         To compile this driver as a module, choose M here: the
-         module will be called anydata.
-
 config USB_SERIAL_ARK3116
        tristate "USB ARK Micro 3116 USB Serial Driver (EXPERIMENTAL)"
        depends on USB_SERIAL && EXPERIMENTAL
@@ -502,15 +493,18 @@ config USB_SERIAL_XIRCOM
          module will be called keyspan_pda.
 
 config USB_SERIAL_OPTION
-       tristate "USB driver for GSM modems"
+       tristate "USB driver for GSM and CDMA modems"
        depends on USB_SERIAL
        help
-         Say Y here if you have an "Option" GSM PCMCIA card
-         (or an OEM version: branded Huawei, Audiovox, or Novatel).
+         Say Y here if you have a GSM or CDMA modem that's connected to USB.
+
+         This driver also supports several PCMCIA cards which have a
+         built-in OHCI-USB adapter and an internally-connected GSM modem.
+         The USB bus on these cards is not accessible externally.
 
-         These cards feature a built-in OHCI-USB adapter and an
-         internally-connected GSM modem. The USB bus is not
-         accessible externally.
+         Supported devices include (some of?) those made by:
+         Option, Huawei, Audiovox, Sierra Wireless, Novatel Wireless, or
+         Anydata.
 
          To compile this driver as a module, choose M here: the
          module will be called option.
index 35d4acc7f1d3276d9eea7ef119ef372aaae60c0c..8efed2ce1ba38260f97968b4c9c9e84f86fbf491 100644 (file)
@@ -12,7 +12,6 @@ usbserial-obj-$(CONFIG_USB_EZUSB)             += ezusb.o
 usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y)
 
 obj-$(CONFIG_USB_SERIAL_AIRPRIME)              += airprime.o
-obj-$(CONFIG_USB_SERIAL_ANYDATA)               += anydata.o
 obj-$(CONFIG_USB_SERIAL_ARK3116)               += ark3116.o
 obj-$(CONFIG_USB_SERIAL_BELKIN)                        += belkin_sa.o
 obj-$(CONFIG_USB_SERIAL_CP2101)                        += cp2101.o
diff --git a/drivers/usb/serial/anydata.c b/drivers/usb/serial/anydata.c
deleted file mode 100644 (file)
index 01843ef..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * AnyData CDMA Serial USB driver
- *
- * Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de>
- *
- *     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/init.h>
-#include <linux/tty.h>
-#include <linux/module.h>
-#include <linux/usb.h>
-#include <linux/usb/serial.h>
-
-static struct usb_device_id id_table [] = {
-       { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */
-       { },
-};
-MODULE_DEVICE_TABLE(usb, id_table);
-
-/* if overridden by the user, then use their value for the size of the
- * read and write urbs */
-static int buffer_size;
-static int debug;
-
-static struct usb_driver anydata_driver = {
-       .name =         "anydata",
-       .probe =        usb_serial_probe,
-       .disconnect =   usb_serial_disconnect,
-       .id_table =     id_table,
-       .no_dynamic_id =        1,
-};
-
-static int anydata_open(struct usb_serial_port *port, struct file *filp)
-{
-       char *buffer;
-       int result = 0;
-
-       dbg("%s - port %d", __FUNCTION__, port->number);
-
-       if (buffer_size) {
-               /* override the default buffer sizes */
-               buffer = kmalloc(buffer_size, GFP_KERNEL);
-               if (!buffer) {
-                       dev_err(&port->dev, "%s - out of memory.\n",
-                               __FUNCTION__);
-                       return -ENOMEM;
-               }
-               kfree (port->read_urb->transfer_buffer);
-               port->read_urb->transfer_buffer = buffer;
-               port->read_urb->transfer_buffer_length = buffer_size;
-
-               buffer = kmalloc(buffer_size, GFP_KERNEL);
-               if (!buffer) {
-                       dev_err(&port->dev, "%s - out of memory.\n",
-                               __FUNCTION__);
-                       return -ENOMEM;
-               }
-               kfree (port->write_urb->transfer_buffer);
-               port->write_urb->transfer_buffer = buffer;
-               port->write_urb->transfer_buffer_length = buffer_size;
-               port->bulk_out_size = buffer_size;
-       }
-
-       /* Start reading from the device */
-       usb_fill_bulk_urb(port->read_urb, port->serial->dev,
-                         usb_rcvbulkpipe(port->serial->dev,
-                                         port->bulk_in_endpointAddress),
-                         port->read_urb->transfer_buffer,
-                         port->read_urb->transfer_buffer_length,
-                         usb_serial_generic_read_bulk_callback, port);
-       result = usb_submit_urb(port->read_urb, GFP_KERNEL);
-       if (result)
-               dev_err(&port->dev,
-                       "%s - failed submitting read urb, error %d\n",
-                       __FUNCTION__, result);
-
-       return result;
-}
-
-static struct usb_serial_driver anydata_device = {
-       .driver = {
-               .owner =        THIS_MODULE,
-               .name =         "anydata",
-       },
-       .id_table =             id_table,
-       .num_interrupt_in =     NUM_DONT_CARE,
-       .num_bulk_in =          NUM_DONT_CARE,
-       .num_bulk_out =         NUM_DONT_CARE,
-       .num_ports =            1,
-       .open =                 anydata_open,
-};
-
-static int __init anydata_init(void)
-{
-       int retval;
-
-       retval = usb_serial_register(&anydata_device);
-       if (retval)
-               return retval;
-       retval = usb_register(&anydata_driver);
-       if (retval)
-               usb_serial_deregister(&anydata_device);
-       return retval;
-}
-
-static void __exit anydata_exit(void)
-{
-       usb_deregister(&anydata_driver);
-       usb_serial_deregister(&anydata_device);
-}
-
-module_init(anydata_init);
-module_exit(anydata_exit);
-MODULE_LICENSE("GPL");
-
-module_param(debug, bool, S_IRUGO | S_IWUSR);
-MODULE_PARM_DESC(debug, "Debug enabled or not");
-module_param(buffer_size, int, 0);
-MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers");
index b458aedc5fb6ae541166fc8f66da7cc91f5cb22f..a20da8528a5f8b1826134b55be9ffdf00102d1b3 100644 (file)
@@ -337,6 +337,7 @@ static struct usb_device_id id_table_combined [] = {
        { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
        { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
        { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
        { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
index 04ef90fcb8766d3adffa2f345a178e55a5f7c12b..9f7343a45424494648f3d4341ed9f59249e09f9d 100644 (file)
 /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */
 #define FTDI_USB_UIRT_PID      0xF850  /* Product Id */
 
+/* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */
+
+#define FTDI_TNC_X_PID         0xEBE0
+
 /*
  * ELV USB devices submitted by Christian Abt of ELV (www.elv.de).
  * All of these devices use FTDI's vendor ID (0x0403).
index 59c5d999009abfbbe31b2c58d3715355c9066d71..7e1bd5d6dfa0ca1502b22cdad8aa88d9925aa563 100644 (file)
@@ -250,6 +250,7 @@ static struct usb_device_id ipaq_id_table [] = {
        { USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */
        { USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */
        { USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */
+       { USB_DEVICE(0x04DD, 0x9102) }, /* SHARP WS003SH USB Modem */
        { USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */
        { USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */
        { USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */
index f0530c1d7b7a274ca7a2c69bc8a33df199a9f6c1..c856e6f40e22c5ff7716e5d01f18c50a9c2b1bc0 100644 (file)
@@ -9,40 +9,14 @@
 
   Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org>
 
-  History:
-
-  2005-05-19  v0.1   Initial version, based on incomplete docs
-                     and analysis of misbehavior with the standard driver
-  2005-05-20  v0.2   Extended the input buffer to avoid losing
-                     random 64-byte chunks of data
-  2005-05-21  v0.3   implemented chars_in_buffer()
-                     turned on low_latency
-                     simplified the code somewhat
-  2005-05-24  v0.4   option_write() sometimes deadlocked under heavy load
-                     removed some dead code
-                     added sponsor notice
-                     coding style clean-up
-  2005-06-20  v0.4.1 add missing braces :-/
-                     killed end-of-line whitespace
-  2005-07-15  v0.4.2 rename WLAN product to FUSION, add FUSION2
-  2005-09-10  v0.4.3 added HUAWEI E600 card and Audiovox AirCard
-  2005-09-20  v0.4.4 increased recv buffer size: the card sometimes
-                     wants to send >2000 bytes.
-  2006-04-10  v0.5   fixed two array overrun errors :-/
-  2006-04-21  v0.5.1 added support for Sierra Wireless MC8755
-  2006-05-15  v0.6   re-enable multi-port support
-  2006-06-01  v0.6.1 add COBRA
-  2006-06-01  v0.6.2 add backwards-compatibility stuff
-  2006-06-01  v0.6.3 add Novatel Wireless
-  2006-06-01  v0.7   Option => GSM
-  2006-06-01  v0.7.1 add COBRA2
+  History: see the git log.
 
   Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
 
   This driver exists because the "normal" serial driver doesn't work too well
   with GSM modems. Issues:
   - data loss -- one single Receive URB is not nearly enough
-  - nonstandard flow (Option devices) and multiplex (Sierra) control
+  - nonstandard flow (Option devices) control
   - controlling the baud rate doesn't make sense
 
   This driver is named "option" because the most common device it's
@@ -96,8 +70,8 @@ static int  option_send_setup(struct usb_serial_port *port);
 #define OPTION_VENDOR_ID                0x0AF0
 #define HUAWEI_VENDOR_ID                0x12D1
 #define AUDIOVOX_VENDOR_ID              0x0F3D
-#define SIERRAWIRELESS_VENDOR_ID        0x1199
 #define NOVATELWIRELESS_VENDOR_ID       0x1410
+#define ANYDATA_VENDOR_ID               0x16d5
 
 #define OPTION_PRODUCT_OLD              0x5000
 #define OPTION_PRODUCT_FUSION           0x6000
@@ -106,8 +80,8 @@ static int  option_send_setup(struct usb_serial_port *port);
 #define OPTION_PRODUCT_COBRA2           0x6600
 #define HUAWEI_PRODUCT_E600             0x1001
 #define AUDIOVOX_PRODUCT_AIRCARD        0x0112
-#define SIERRAWIRELESS_PRODUCT_MC8755   0x6802
 #define NOVATELWIRELESS_PRODUCT_U740    0x1400
+#define ANYDATA_PRODUCT_ID              0x6501
 
 static struct usb_device_id option_ids[] = {
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) },
@@ -117,8 +91,8 @@ static struct usb_device_id option_ids[] = {
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
        { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
        { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
-       { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) },
        { } /* Terminating entry */
 };
 
@@ -131,10 +105,7 @@ static struct usb_device_id option_ids1[] = {
        { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
        { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
-       { } /* Terminating entry */
-};
-static struct usb_device_id option_ids3[] = {
-       { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) },
        { } /* Terminating entry */
 };
 
@@ -151,37 +122,11 @@ static struct usb_driver option_driver = {
 /* The card has three separate interfaces, which the serial driver
  * recognizes separately, thus num_port=1.
  */
-static struct usb_serial_driver option_3port_device = {
-       .driver = {
-               .owner =        THIS_MODULE,
-               .name =         "option",
-       },
-       .description       = "GSM modem (3-port)",
-       .id_table          = option_ids3,
-       .num_interrupt_in  = NUM_DONT_CARE,
-       .num_bulk_in       = NUM_DONT_CARE,
-       .num_bulk_out      = NUM_DONT_CARE,
-       .num_ports         = 3,
-       .open              = option_open,
-       .close             = option_close,
-       .write             = option_write,
-       .write_room        = option_write_room,
-       .chars_in_buffer   = option_chars_in_buffer,
-       .throttle          = option_rx_throttle,
-       .unthrottle        = option_rx_unthrottle,
-       .set_termios       = option_set_termios,
-       .break_ctl         = option_break_ctl,
-       .tiocmget          = option_tiocmget,
-       .tiocmset          = option_tiocmset,
-       .attach            = option_startup,
-       .shutdown          = option_shutdown,
-       .read_int_callback = option_instat_callback,
-};
 
 static struct usb_serial_driver option_1port_device = {
        .driver = {
                .owner =        THIS_MODULE,
-               .name =         "option",
+               .name =         "option1",
        },
        .description       = "GSM modem (1-port)",
        .id_table          = option_ids1,
@@ -245,9 +190,6 @@ static int __init option_init(void)
        retval = usb_serial_register(&option_1port_device);
        if (retval)
                goto failed_1port_device_register;
-       retval = usb_serial_register(&option_3port_device);
-       if (retval)
-               goto failed_3port_device_register;
        retval = usb_register(&option_driver);
        if (retval)
                goto failed_driver_register;
@@ -257,8 +199,6 @@ static int __init option_init(void)
        return 0;
 
 failed_driver_register:
-       usb_serial_deregister (&option_3port_device);
-failed_3port_device_register:
        usb_serial_deregister (&option_1port_device);
 failed_1port_device_register:
        return retval;
@@ -267,7 +207,6 @@ failed_1port_device_register:
 static void __exit option_exit(void)
 {
        usb_deregister (&option_driver);
-       usb_serial_deregister (&option_3port_device);
        usb_serial_deregister (&option_1port_device);
 }
 
@@ -656,7 +595,6 @@ static void option_setup_urbs(struct usb_serial *serial)
 
        dbg("%s", __FUNCTION__);
 
-
        for (i = 0; i < serial->num_ports; i++) {
                port = serial->port[i];
                portdata = usb_get_serial_port_data(port);
index 259db31b65c194b6a2e4a19d76fdb47845b3e517..efbbc0adb89ac26908e387d1f5bd071c72c5e9e6 100644 (file)
@@ -81,6 +81,7 @@ static struct usb_device_id id_table [] = {
        { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
        { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) },
        { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
+       { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
        { }                                     /* Terminating entry */
 };
 
index d9c1e6e0b4b3427c926983e4ad8bf8c47257ac0d..a692ac66ca6c0a0e89652e0d3c22d320dd738b5f 100644 (file)
@@ -89,3 +89,7 @@
 /* DATAPILOT Universal-2 Phone Cable */
 #define DATAPILOT_U2_VENDOR_ID 0x0731
 #define DATAPILOT_U2_PRODUCT_ID        0x2003
+
+/* Belkin "F5U257" Serial Adapter */
+#define BELKIN_VENDOR_ID       0x050d
+#define BELKIN_PRODUCT_ID      0x0257
index a5ca449f6e645e811022371cdbca9125f4cf18d7..2793f9a912b4a7b6c2e05e136cc90c8eccc14905 100644 (file)
@@ -145,6 +145,13 @@ UNUSUAL_DEV(  0x0420, 0x0001, 0x0100, 0x0100,
                US_SC_DEVICE, US_PR_DEVICE, NULL,
                US_FL_IGNORE_RESIDUE ),
 
+/* Reported by Mario Rettig <mariorettig@web.de> */
+UNUSUAL_DEV(  0x0421, 0x042e, 0x0100, 0x0100,
+               "Nokia",
+               "Nokia 3250",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ),
+
 /* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and
  * Einar Th. Einarsson <einarthered@gmail.com> */
 UNUSUAL_DEV(  0x0421, 0x0444, 0x0100, 0x0100,
@@ -627,18 +634,6 @@ UNUSUAL_DEV(  0x0595, 0x4343, 0x0000, 0x2210,
                "Digital Camera EX-20 DSC",
                US_SC_8070, US_PR_DEVICE, NULL, 0 ),
 
-/* The entry was here before I took over, and had US_SC_RBC. It turns
- * out that isn't needed. Additionally, Torsten Eriksson
- * <Torsten.Eriksson@bergianska.se> is able to use his device fine
- * without this entry at all - but I don't suspect that will be true
- * for all users (the protocol is likely needed), so is staying at
- * this time. - Phil Dibowitz <phil@ipom.com>
- */
-UNUSUAL_DEV(  0x059f, 0xa601, 0x0200, 0x0200, 
-               "LaCie",
-               "USB Hard Disk",
-               US_SC_DEVICE, US_PR_CB, NULL, 0 ),
-
 /* Submitted by Joel Bourquard <numlock@freesurf.ch>
  * Some versions of this device need the SubClass and Protocol overrides
  * while others don't.
@@ -1106,7 +1101,15 @@ UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff,
                 "Optio S/S4",
                 US_SC_DEVICE, US_PR_DEVICE, NULL,
                 US_FL_FIX_INQUIRY ),
-               
+
+/* This is a virtual windows driver CD, which the zd1211rw driver automatically
+ * converts into a WLAN device. */
+UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101,
+                "ZyXEL",
+                "G-220F USB-WLAN Install",
+                US_SC_DEVICE, US_PR_DEVICE, NULL,
+                US_FL_IGNORE_DEVICE ),
+
 #ifdef CONFIG_USB_STORAGE_ISD200
 UNUSUAL_DEV(  0x0bf6, 0xa001, 0x0100, 0x0110,
                "ATI",
index 5ee19be52f6510bd2efea0ca6ac81d0f70082b38..8d7bdcb5924d402f891cbf1a07c2584400a28cb3 100644 (file)
@@ -483,7 +483,7 @@ static struct us_unusual_dev *find_unusual(const struct usb_device_id *id)
 }
 
 /* Get the unusual_devs entries and the string descriptors */
-static void get_device_info(struct us_data *us, const struct usb_device_id *id)
+static int get_device_info(struct us_data *us, const struct usb_device_id *id)
 {
        struct usb_device *dev = us->pusb_dev;
        struct usb_interface_descriptor *idesc =
@@ -500,6 +500,11 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id)
                        unusual_dev->useTransport;
        us->flags = USB_US_ORIG_FLAGS(id->driver_info);
 
+       if (us->flags & US_FL_IGNORE_DEVICE) {
+               printk(KERN_INFO USB_STORAGE "device ignored\n");
+               return -ENODEV;
+       }
+
        /*
         * This flag is only needed when we're in high-speed, so let's
         * disable it if we're in full-speed
@@ -541,6 +546,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id)
                                msgs[msg],
                                UTS_RELEASE);
        }
+
+       return 0;
 }
 
 /* Get the transport settings */
@@ -969,7 +976,9 @@ static int storage_probe(struct usb_interface *intf,
         * of the match from the usb_device_id table, so we can find the
         * corresponding entry in the private table.
         */
-       get_device_info(us, id);
+       result = get_device_info(us, id);
+       if (result)
+               goto BadDevice;
 
        /* Get the transport, protocol, and pipe settings */
        result = get_transport(us);
index 3c4eb9fbe48ac58aae335666168b0a6dc0454ad6..f83003f5287b04dbd63b3998ea8e98beae0b7286 100644 (file)
@@ -48,8 +48,6 @@ struct clk_functions {
 };
 
 extern unsigned int mpurate;
-extern struct list_head clocks;
-extern spinlock_t clockfw_lock;
 
 extern int clk_init(struct clk_functions * custom_clocks);
 extern int clk_register(struct clk *clk);
index c944e8f06a4a2a3ce7519f82565c1780fc359d57..d2bd0c8e015408c0152fe7b9927ec2d5deda5100 100644 (file)
@@ -103,8 +103,7 @@ enum usb_interface_condition {
  * @condition: binding state of the interface: not bound, binding
  *     (in probe()), bound to a driver, or unbinding (in disconnect())
  * @dev: driver model's view of this device
- * @usb_dev: if an interface is bound to the USB major, this will point
- *     to the sysfs representation for that device.
+ * @class_dev: driver model's class view of this device.
  *
  * USB device drivers attach to interfaces on a physical device.  Each
  * interface encapsulates a single high level function, such as feeding
@@ -144,7 +143,7 @@ struct usb_interface {
                                         * bound to */
        enum usb_interface_condition condition;         /* state of binding */
        struct device dev;              /* interface specific device info */
-       struct device *usb_dev;         /* pointer to the usb class's device, if any */
+       struct class_device *class_dev;
 };
 #define        to_usb_interface(d) container_of(d, struct usb_interface, dev)
 #define        interface_to_usbdev(intf) \
@@ -361,7 +360,7 @@ struct usb_device {
        char *serial;                   /* iSerialNumber string, if present */
 
        struct list_head filelist;
-       struct device *usbfs_dev;
+       struct class_device *class_dev;
        struct dentry *usbfs_dentry;    /* usbfs dentry entry for the device */
 
        /*
index f38f43f20faea4eefb94a1c84c71eb0e302e931a..e7fc5fed5b98b8044d940fa4a7ded769a09a0452 100644 (file)
@@ -44,7 +44,9 @@
        US_FLAG(NO_WP_DETECT,   0x00000200)                     \
                /* Don't check for write-protect */             \
        US_FLAG(MAX_SECTORS_64, 0x00000400)                     \
-               /* Sets max_sectors to 64    */
+               /* Sets max_sectors to 64    */                 \
+       US_FLAG(IGNORE_DEVICE,  0x00000800)                     \
+               /* Don't claim device */
 
 #define US_FLAG(name, value)   US_FL_##name = value ,
 enum { US_DO_ALL_FLAGS };
index 7fe874d12faeb4dba5cb6cfa30b376c045831f4b..bfdb5686fa3e4e3d23075afd2bf21bf680ba0aae 100644 (file)
@@ -791,22 +791,31 @@ out:
 /*
  * Force a signal that the process can't ignore: if necessary
  * we unblock the signal and change any SIG_IGN to SIG_DFL.
+ *
+ * Note: If we unblock the signal, we always reset it to SIG_DFL,
+ * since we do not want to have a signal handler that was blocked
+ * be invoked when user space had explicitly blocked it.
+ *
+ * We don't want to have recursive SIGSEGV's etc, for example.
  */
-
 int
 force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
 {
        unsigned long int flags;
-       int ret;
+       int ret, blocked, ignored;
+       struct k_sigaction *action;
 
        spin_lock_irqsave(&t->sighand->siglock, flags);
-       if (t->sighand->action[sig-1].sa.sa_handler == SIG_IGN) {
-               t->sighand->action[sig-1].sa.sa_handler = SIG_DFL;
-       }
-       if (sigismember(&t->blocked, sig)) {
-               sigdelset(&t->blocked, sig);
+       action = &t->sighand->action[sig-1];
+       ignored = action->sa.sa_handler == SIG_IGN;
+       blocked = sigismember(&t->blocked, sig);
+       if (blocked || ignored) {
+               action->sa.sa_handler = SIG_DFL;
+               if (blocked) {
+                       sigdelset(&t->blocked, sig);
+                       recalc_sigpending_tsk(t);
+               }
        }
-       recalc_sigpending_tsk(t);
        ret = specific_send_sig_info(sig, info, t);
        spin_unlock_irqrestore(&t->sighand->siglock, flags);
 
index f01132263535fcfa0a47ecb5ac8cc789ece1c497..bb19c1561f1e0bb1701c72b44a863284e42061fa 100644 (file)
@@ -77,8 +77,7 @@ cc-option-align = $(subst -functions=0,,\
 
 # cc-version
 # Usage gcc-ver := $(call cc-version, $(CC))
-cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh \
-              $(if $(1), $(1), $(CC)))
+cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
 
 # cc-ifversion
 # Usage:  EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
index a49550205dcc5eab6147dab893334a96d34f9123..0a64688c2b5db9352c91878103d8dd2cc1161510 100644 (file)
@@ -40,7 +40,7 @@ include scripts/Kbuild.include
 include scripts/Makefile.lib
 
 kernelsymfile := $(objtree)/Module.symvers
-modulesymfile := $(KBUILD_EXTMOD)/Modules.symvers
+modulesymfile := $(KBUILD_EXTMOD)/Module.symvers
 
 # Step 1), find all modules listed in $(MODVERDIR)/
 __modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod)))
index 2ee48c377b66b5e3f01ba752ad1944f303e22ad9..a69d8acbf274fc958c8e0eff2c5038e72fa03b00 100644 (file)
@@ -357,7 +357,7 @@ int conf_read(const char *name)
                for (e = prop->expr; e; e = e->left.expr)
                        if (e->right.sym->visible != no)
                                flags &= e->right.sym->flags;
-               sym->flags |= flags & SYMBOL_DEF_USER;
+               sym->flags &= flags | ~SYMBOL_DEF_USER;
        }
 
        sym_change_count += conf_warnings || conf_unsaved;
index 37f67c23e11b277bc9b999cf0e1df6bb6e9859c6..44312926b84934f3b68e12e0bda278f3824cc4ed 100644 (file)
@@ -52,6 +52,23 @@ do {                                                            \
                 sprintf(str + strlen(str), "*");                \
 } while(0)
 
+/**
+ * Check that sizeof(device_id type) are consistent with size of section
+ * in .o file. If in-consistent then userspace and kernel does not agree
+ * on actual size which is a bug.
+ **/
+static void device_id_size_check(const char *modname, const char *device_id,
+                                unsigned long size, unsigned long id_size)
+{
+       if (size % id_size || size < id_size) {
+               fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo "
+                     "of the size of section __mod_%s_device_table=%lu.\n"
+                     "Fix definition of struct %s_device_id "
+                     "in mod_devicetable.h\n",
+                     modname, device_id, id_size, device_id, size, device_id);
+       }
+}
+
 /* USB is special because the bcdDevice can be matched against a numeric range */
 /* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */
 static void do_usb_entry(struct usb_device_id *id,
@@ -152,10 +169,8 @@ static void do_usb_table(void *symval, unsigned long size,
        unsigned int i;
        const unsigned long id_size = sizeof(struct usb_device_id);
 
-       if (size % id_size || size < id_size) {
-               warn("%s ids %lu bad size "
-                    "(each on %lu)\n", mod->name, size, id_size);
-       }
+       device_id_size_check(mod->name, "usb", size, id_size);
+
        /* Leave last one: it's the terminator. */
        size -= id_size;
 
@@ -434,6 +449,7 @@ static inline int sym_is(const char *symbol, const char *name)
 
 static void do_table(void *symval, unsigned long size,
                     unsigned long id_size,
+                    const char *device_id,
                     void *function,
                     struct module *mod)
 {
@@ -441,10 +457,7 @@ static void do_table(void *symval, unsigned long size,
        char alias[500];
        int (*do_entry)(const char *, void *entry, char *alias) = function;
 
-       if (size % id_size || size < id_size) {
-               warn("%s ids %lu bad size "
-                    "(each on %lu)\n", mod->name, size, id_size);
-       }
+       device_id_size_check(mod->name, device_id, size, id_size);
        /* Leave last one: it's the terminator. */
        size -= id_size;
 
@@ -476,40 +489,51 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
                + sym->st_value;
 
        if (sym_is(symname, "__mod_pci_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct pci_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct pci_device_id), "pci",
                         do_pci_entry, mod);
        else if (sym_is(symname, "__mod_usb_device_table"))
                /* special case to handle bcdDevice ranges */
                do_usb_table(symval, sym->st_size, mod);
        else if (sym_is(symname, "__mod_ieee1394_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct ieee1394_device_id), "ieee1394",
                         do_ieee1394_entry, mod);
        else if (sym_is(symname, "__mod_ccw_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct ccw_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct ccw_device_id), "ccw",
                         do_ccw_entry, mod);
        else if (sym_is(symname, "__mod_serio_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct serio_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct serio_device_id), "serio",
                         do_serio_entry, mod);
        else if (sym_is(symname, "__mod_pnp_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct pnp_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct pnp_device_id), "pnp",
                         do_pnp_entry, mod);
        else if (sym_is(symname, "__mod_pnp_card_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct pnp_card_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct pnp_card_device_id), "pnp_card",
                         do_pnp_card_entry, mod);
        else if (sym_is(symname, "__mod_pcmcia_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct pcmcia_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct pcmcia_device_id), "pcmcia",
                         do_pcmcia_entry, mod);
         else if (sym_is(symname, "__mod_of_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct of_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct of_device_id), "of",
                         do_of_entry, mod);
         else if (sym_is(symname, "__mod_vio_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct vio_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct vio_device_id), "vio",
                         do_vio_entry, mod);
        else if (sym_is(symname, "__mod_i2c_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct i2c_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct i2c_device_id), "i2c",
                         do_i2c_entry, mod);
        else if (sym_is(symname, "__mod_input_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct input_device_id),
+               do_table(symval, sym->st_size,
+                        sizeof(struct input_device_id), "input",
                         do_input_entry, mod);
 }