Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Thu, 5 Jul 2007 22:55:00 +0000 (15:55 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Thu, 5 Jul 2007 22:55:00 +0000 (15:55 -0700)
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc:
  [POWERPC] Update defconfigs
  [POWERPC] Uninline and export virq_to_hw() for the pasemi_mac driver
  [POWERPC] Fix PMI breakage in cbe_cbufreq driver
  [POWERPC] Disable old EMAC driver in arch/powerpc

83 files changed:
MAINTAINERS
arch/blackfin/Kconfig
arch/blackfin/Makefile
arch/blackfin/configs/BF533-EZKIT_defconfig
arch/blackfin/configs/BF533-STAMP_defconfig
arch/blackfin/configs/BF537-STAMP_defconfig
arch/blackfin/configs/BF561-EZKIT_defconfig
arch/blackfin/configs/PNAV-10_defconfig
arch/blackfin/kernel/setup.c
arch/blackfin/kernel/traps.c
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/cpu/perfctr-watchdog.c
arch/mips/kernel/smp-mt.c
drivers/acpi/osl.c
drivers/ata/Kconfig
drivers/ata/ata_generic.c
drivers/ata/libata-core.c
drivers/ata/libata-sff.c
drivers/ata/pata_ali.c
drivers/ata/pata_cs5520.c
drivers/ata/pata_pcmcia.c
drivers/ata/pata_pdc2027x.c
drivers/ata/pata_pdc202xx_old.c
drivers/ata/pata_sis.c
drivers/ata/sata_inic162x.c
drivers/ata/sata_mv.c
drivers/ata/sata_nv.c
drivers/ata/sata_sis.c
drivers/ata/sis.h
drivers/firewire/Kconfig
drivers/firewire/fw-ohci.c
drivers/ide/ide-probe.c
drivers/ide/ide-taskfile.c
drivers/ide/pci/amd74xx.c
drivers/ide/pci/hpt366.c
drivers/ide/pci/it821x.c
drivers/ide/pci/pdc202xx_new.c
drivers/ide/setup-pci.c
drivers/infiniband/ulp/ipoib/ipoib_cm.c
drivers/media/dvb/cinergyT2/cinergyT2.c
drivers/media/dvb/ttpci/budget-core.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/cx88/cx88-blackbird.c
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/blink.c [deleted file]
drivers/net/gianfar.c
drivers/net/mlx4/main.c
drivers/net/myri10ge/myri10ge.c
drivers/net/netxen/netxen_nic.h
drivers/net/netxen/netxen_nic_hdr.h
drivers/net/netxen/netxen_nic_hw.c
drivers/net/netxen/netxen_nic_init.c
drivers/net/netxen/netxen_nic_main.c
drivers/net/netxen/netxen_nic_phan_reg.h
drivers/net/ns83820.c
drivers/net/pcmcia/3c589_cs.c
drivers/net/starfire.c
drivers/net/usb/cdc_ether.c
drivers/net/usb/dm9601.c
drivers/net/usb/usbnet.c
drivers/net/wireless/libertas/Makefile
drivers/net/wireless/libertas/README
drivers/net/wireless/libertas/assoc.c
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/cmdresp.c
drivers/net/wireless/libertas/hostcmd.h
drivers/net/wireless/libertas/ioctl.c [deleted file]
drivers/net/wireless/libertas/main.c
drivers/net/wireless/libertas/scan.c
drivers/net/wireless/libertas/wext.c
drivers/net/wireless/libertas/wext.h
drivers/scsi/Kconfig
fs/direct-io.c
fs/jffs2/readinode.c
include/asm-blackfin/macros.h [deleted file]
include/asm-blackfin/processor.h
include/asm-mips/mach-ip32/dma-coherence.h
include/asm-mips/ptrace.h
include/asm-mips/unistd.h
kernel/time/ntp.c
mm/slab.c
mm/slub.c

index 4ce895a4b5ba7f584ca0af01daa39602a546b77c..23a04f4312839346e5460a77156b97991dbdb2af 100644 (file)
@@ -3618,7 +3618,7 @@ W:        http://www.kroah.com/linux-usb/
 USB DAVICOM DM9601 DRIVER
 P:     Peter Korsgaard
 M:     jacmet@sunsite.dk
-L:     linux-usb-devel@lists.sourceforge.net
+L:     netdev@vger.kernel.org
 W:     http://www.linux-usb.org/usbnet
 S:     Maintained
 
@@ -3702,8 +3702,8 @@ S:        Maintained
 USB PEGASUS DRIVER
 P:     Petko Manolov
 M:     petkan@users.sourceforge.net
-L:     linux-usb-users@lists.sourceforge.net
 L:     linux-usb-devel@lists.sourceforge.net
+L:     netdev@vger.kernel.org
 W:     http://pegasus2.sourceforge.net/
 S:     Maintained
 
@@ -3717,8 +3717,8 @@ S:        Maintained
 USB RTL8150 DRIVER
 P:     Petko Manolov
 M:     petkan@users.sourceforge.net
-L:     linux-usb-users@lists.sourceforge.net
 L:     linux-usb-devel@lists.sourceforge.net
+L:     netdev@vger.kernel.org
 W:     http://pegasus2.sourceforge.net/
 S:     Maintained
 
@@ -3829,7 +3829,7 @@ S:        Maintained
 USB "USBNET" DRIVER FRAMEWORK
 P:     David Brownell
 M:     dbrownell@users.sourceforge.net
-L:     linux-usb-devel@lists.sourceforge.net
+L:     netdev@vger.kernel.org
 W:     http://www.linux-usb.org/usbnet
 S:     Maintained
 
index 1fad8560c7afd5175b51516bcf30b927f54dd334..d98bafcaca59a3a88b47ad3dbde222f67ae18982 100644 (file)
@@ -142,6 +142,12 @@ config BF_REV_0_5
        bool "0.5"
        depends on (BF561 || BF533 || BF532 || BF531)
 
+config BF_REV_ANY
+       bool "any"
+
+config BF_REV_NONE
+       bool "none"
+
 endchoice
 
 config BFIN_DUAL_CORE
index 75e89c324756bbb634514aed30e69bb77077add5..6971a4418dfe5886083427c07031fc1e554d5f28 100644 (file)
@@ -28,6 +28,27 @@ machine-$(CONFIG_BF561) := bf561
 MACHINE := $(machine-y)
 export MACHINE
 
+cpu-$(CONFIG_BF531) := bf531
+cpu-$(CONFIG_BF532) := bf532
+cpu-$(CONFIG_BF533) := bf533
+cpu-$(CONFIG_BF534) := bf534
+cpu-$(CONFIG_BF536) := bf536
+cpu-$(CONFIG_BF537) := bf537
+cpu-$(CONFIG_BF548) := bf548
+cpu-$(CONFIG_BF549) := bf549
+cpu-$(CONFIG_BF561) := bf561
+
+rev-$(CONFIG_BF_REV_0_0)  := 0.0
+rev-$(CONFIG_BF_REV_0_1)  := 0.1
+rev-$(CONFIG_BF_REV_0_2)  := 0.2
+rev-$(CONFIG_BF_REV_0_3)  := 0.3
+rev-$(CONFIG_BF_REV_0_4)  := 0.4
+rev-$(CONFIG_BF_REV_0_5)  := 0.5
+rev-$(CONFIG_BF_REV_NONE) := none
+rev-$(CONFIG_BF_REV_ANY)  := any
+
+CFLAGS += -mcpu=$(cpu-y)-$(rev-y)
+AFLAGS += -mcpu=$(cpu-y)-$(rev-y)
 
 head-y   := arch/$(ARCH)/mach-$(MACHINE)/head.o arch/$(ARCH)/kernel/init_task.o
 
index 90d58aabe693a4371d58cf915276f303c51f02db..1cf1ab28dc66b98a288b1616211ca03a41daec7b 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21.3
+# Linux kernel version: 2.6.21.5
 #
 # CONFIG_MMU is not set
 # CONFIG_FPU is not set
@@ -115,17 +115,26 @@ CONFIG_BF533=y
 # CONFIG_BF534 is not set
 # CONFIG_BF536 is not set
 # CONFIG_BF537 is not set
+# CONFIG_BF542 is not set
+# CONFIG_BF544 is not set
+# CONFIG_BF548 is not set
+# CONFIG_BF549 is not set
 # CONFIG_BF561 is not set
+# CONFIG_BF_REV_0_0 is not set
 # CONFIG_BF_REV_0_2 is not set
 CONFIG_BF_REV_0_3=y
 # CONFIG_BF_REV_0_4 is not set
 # CONFIG_BF_REV_0_5 is not set
+# CONFIG_BF_REV_ANY is not set
+# CONFIG_BF_REV_NONE is not set
+CONFIG_BF53x=y
 CONFIG_BFIN_SINGLE_CORE=y
 CONFIG_BFIN533_EZKIT=y
 # CONFIG_BFIN533_STAMP is not set
 # CONFIG_BFIN537_STAMP is not set
 # CONFIG_BFIN533_BLUETECHNIX_CM is not set
 # CONFIG_BFIN537_BLUETECHNIX_CM is not set
+# CONFIG_BFIN548_EZKIT is not set
 # CONFIG_BFIN561_BLUETECHNIX_CM is not set
 # CONFIG_BFIN561_EZKIT is not set
 # CONFIG_BFIN561_TEPLA is not set
@@ -634,6 +643,7 @@ CONFIG_NETDEVICES=y
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 CONFIG_SMC91X=y
+# CONFIG_SMSC911X is not set
 
 #
 # Ethernet (1000 Mbit)
index fee918957392620125c04b273a2898d7226d991a..64b7f1b3b2afe46beb295868f8ae45cedf1606ee 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21.3
+# Linux kernel version: 2.6.21.5
 #
 # CONFIG_MMU is not set
 # CONFIG_FPU is not set
@@ -115,17 +115,26 @@ CONFIG_BF533=y
 # CONFIG_BF534 is not set
 # CONFIG_BF536 is not set
 # CONFIG_BF537 is not set
+# CONFIG_BF542 is not set
+# CONFIG_BF544 is not set
+# CONFIG_BF548 is not set
+# CONFIG_BF549 is not set
 # CONFIG_BF561 is not set
+# CONFIG_BF_REV_0_0 is not set
 # CONFIG_BF_REV_0_2 is not set
 CONFIG_BF_REV_0_3=y
 # CONFIG_BF_REV_0_4 is not set
 # CONFIG_BF_REV_0_5 is not set
+# CONFIG_BF_REV_ANY is not set
+# CONFIG_BF_REV_NONE is not set
+CONFIG_BF53x=y
 CONFIG_BFIN_SINGLE_CORE=y
 # CONFIG_BFIN533_EZKIT is not set
 CONFIG_BFIN533_STAMP=y
 # CONFIG_BFIN537_STAMP is not set
 # CONFIG_BFIN533_BLUETECHNIX_CM is not set
 # CONFIG_BFIN537_BLUETECHNIX_CM is not set
+# CONFIG_BFIN548_EZKIT is not set
 # CONFIG_BFIN561_BLUETECHNIX_CM is not set
 # CONFIG_BFIN561_EZKIT is not set
 # CONFIG_BFIN561_TEPLA is not set
@@ -646,6 +655,7 @@ CONFIG_NETDEVICES=y
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 CONFIG_SMC91X=y
+# CONFIG_SMSC911X is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -986,9 +996,17 @@ CONFIG_SND_VERBOSE_PROCFS=y
 #
 # ALSA Blackfin devices
 #
-# CONFIG_SND_BLACKFIN_AD1836 is not set
-# CONFIG_SND_BLACKFIN_AD1981B is not set
-# CONFIG_SND_BFIN_AD73311 is not set
+CONFIG_SND_BLACKFIN_AD1836=m
+CONFIG_SND_BLACKFIN_AD1836_TDM=y
+# CONFIG_SND_BLACKFIN_AD1836_I2S is not set
+CONFIG_SND_BLACKFIN_AD1836_MULSUB=y
+# CONFIG_SND_BLACKFIN_AD1836_5P1 is not set
+CONFIG_SND_BLACKFIN_AD1981B=m
+CONFIG_SND_BLACKFIN_SPORT=0
+CONFIG_SND_BLACKFIN_SPI_PFBIT=4
+CONFIG_SND_BFIN_AD73311=m
+CONFIG_SND_BFIN_SPORT=0
+CONFIG_SND_BFIN_AD73311_SE=4
 
 #
 # SoC audio support
index 37688bb55b9a37faf478802c1bf0a7e7ff4efac6..ccf09dc09a18303b9cff0c0f1f00527974dc3c98 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21.3
+# Linux kernel version: 2.6.21.5
 #
 # CONFIG_MMU is not set
 # CONFIG_FPU is not set
@@ -115,17 +115,26 @@ CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_BF534 is not set
 # CONFIG_BF536 is not set
 CONFIG_BF537=y
+# CONFIG_BF542 is not set
+# CONFIG_BF544 is not set
+# CONFIG_BF548 is not set
+# CONFIG_BF549 is not set
 # CONFIG_BF561 is not set
+# CONFIG_BF_REV_0_0 is not set
 CONFIG_BF_REV_0_2=y
 # CONFIG_BF_REV_0_3 is not set
 # CONFIG_BF_REV_0_4 is not set
 # CONFIG_BF_REV_0_5 is not set
+# CONFIG_BF_REV_ANY is not set
+# CONFIG_BF_REV_NONE is not set
+CONFIG_BF53x=y
 CONFIG_BFIN_SINGLE_CORE=y
 # CONFIG_BFIN533_EZKIT is not set
 # CONFIG_BFIN533_STAMP is not set
 CONFIG_BFIN537_STAMP=y
 # CONFIG_BFIN533_BLUETECHNIX_CM is not set
 # CONFIG_BFIN537_BLUETECHNIX_CM is not set
+# CONFIG_BFIN548_EZKIT is not set
 # CONFIG_BFIN561_BLUETECHNIX_CM is not set
 # CONFIG_BFIN561_EZKIT is not set
 # CONFIG_BFIN561_TEPLA is not set
@@ -664,6 +673,7 @@ CONFIG_BFIN_MAC_USE_L1=y
 CONFIG_BFIN_TX_DESC_NUM=10
 CONFIG_BFIN_RX_DESC_NUM=20
 # CONFIG_BFIN_MAC_RMII is not set
+# CONFIG_SMSC911X is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -1020,9 +1030,17 @@ CONFIG_SND_VERBOSE_PROCFS=y
 #
 # ALSA Blackfin devices
 #
-# CONFIG_SND_BLACKFIN_AD1836 is not set
-# CONFIG_SND_BLACKFIN_AD1981B is not set
-# CONFIG_SND_BFIN_AD73311 is not set
+CONFIG_SND_BLACKFIN_AD1836=m
+CONFIG_SND_BLACKFIN_AD1836_TDM=y
+# CONFIG_SND_BLACKFIN_AD1836_I2S is not set
+CONFIG_SND_BLACKFIN_AD1836_MULSUB=y
+# CONFIG_SND_BLACKFIN_AD1836_5P1 is not set
+CONFIG_SND_BLACKFIN_AD1981B=m
+CONFIG_SND_BLACKFIN_SPORT=0
+CONFIG_SND_BLACKFIN_SPI_PFBIT=4
+CONFIG_SND_BFIN_AD73311=m
+CONFIG_SND_BFIN_SPORT=0
+CONFIG_SND_BFIN_AD73311_SE=4
 
 #
 # SoC audio support
index fe4e67debaca461ef3fb8b1771492e56e35e62d9..51c0b6f97798940450c96c3b64f3deae2262680b 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21.3
+# Linux kernel version: 2.6.21.5
 #
 # CONFIG_MMU is not set
 # CONFIG_FPU is not set
@@ -115,17 +115,25 @@ CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_BF534 is not set
 # CONFIG_BF536 is not set
 # CONFIG_BF537 is not set
+# CONFIG_BF542 is not set
+# CONFIG_BF544 is not set
+# CONFIG_BF548 is not set
+# CONFIG_BF549 is not set
 CONFIG_BF561=y
+# CONFIG_BF_REV_0_0 is not set
 # CONFIG_BF_REV_0_2 is not set
 CONFIG_BF_REV_0_3=y
 # CONFIG_BF_REV_0_4 is not set
 # CONFIG_BF_REV_0_5 is not set
+# CONFIG_BF_REV_ANY is not set
+# CONFIG_BF_REV_NONE is not set
 CONFIG_BFIN_DUAL_CORE=y
 # CONFIG_BFIN533_EZKIT is not set
 # CONFIG_BFIN533_STAMP is not set
 # CONFIG_BFIN537_STAMP is not set
 # CONFIG_BFIN533_BLUETECHNIX_CM is not set
 # CONFIG_BFIN537_BLUETECHNIX_CM is not set
+# CONFIG_BFIN548_EZKIT is not set
 # CONFIG_BFIN561_BLUETECHNIX_CM is not set
 CONFIG_BFIN561_EZKIT=y
 # CONFIG_BFIN561_TEPLA is not set
@@ -673,6 +681,7 @@ CONFIG_NETDEVICES=y
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 CONFIG_SMC91X=y
+# CONFIG_SMSC911X is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -801,7 +810,6 @@ CONFIG_WATCHDOG=y
 CONFIG_BFIN_WDT=y
 CONFIG_HW_RANDOM=y
 # CONFIG_GEN_RTC is not set
-# CONFIG_BLACKFIN_DPMC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_RAW_DRIVER is not set
index a783ff69ace1999f4d893e225c1be3f45dbe23d9..983ed181c896fa7aec05d481370546f2d2b70228 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21.3
+# Linux kernel version: 2.6.21.5
 #
 # CONFIG_MMU is not set
 # CONFIG_FPU is not set
@@ -114,17 +114,26 @@ CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_BF534 is not set
 # CONFIG_BF536 is not set
 CONFIG_BF537=y
+# CONFIG_BF542 is not set
+# CONFIG_BF544 is not set
+# CONFIG_BF548 is not set
+# CONFIG_BF549 is not set
 # CONFIG_BF561 is not set
+# CONFIG_BF_REV_0_0 is not set
 CONFIG_BF_REV_0_2=y
 # CONFIG_BF_REV_0_3 is not set
 # CONFIG_BF_REV_0_4 is not set
 # CONFIG_BF_REV_0_5 is not set
+# CONFIG_BF_REV_ANY is not set
+# CONFIG_BF_REV_NONE is not set
+CONFIG_BF53x=y
 CONFIG_BFIN_SINGLE_CORE=y
 # CONFIG_BFIN533_EZKIT is not set
 # CONFIG_BFIN533_STAMP is not set
 # CONFIG_BFIN537_STAMP is not set
 # CONFIG_BFIN533_BLUETECHNIX_CM is not set
 # CONFIG_BFIN537_BLUETECHNIX_CM is not set
+# CONFIG_BFIN548_EZKIT is not set
 # CONFIG_BFIN561_BLUETECHNIX_CM is not set
 # CONFIG_BFIN561_EZKIT is not set
 # CONFIG_BFIN561_TEPLA is not set
@@ -598,6 +607,7 @@ CONFIG_BFIN_MAC=y
 CONFIG_BFIN_TX_DESC_NUM=100
 CONFIG_BFIN_RX_DESC_NUM=100
 CONFIG_BFIN_MAC_RMII=y
+# CONFIG_SMSC911X is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -746,7 +756,6 @@ CONFIG_CAN_BLACKFIN=m
 # CONFIG_WATCHDOG is not set
 CONFIG_HW_RANDOM=y
 # CONFIG_GEN_RTC is not set
-CONFIG_BLACKFIN_DPMC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_RAW_DRIVER is not set
index 5b9b434c1ed9d6897cb73f6131e253a9782d64ca..83060f98d15d265cfcfbc50f657743f7e99255c4 100644 (file)
@@ -307,10 +307,20 @@ void __init setup_arch(char **cmdline_p)
        init_leds();
 
        printk(KERN_INFO "Blackfin support (C) 2004-2007 Analog Devices, Inc.\n");
-       printk(KERN_INFO "Compiled for ADSP-%s Rev 0.%d\n", CPU, bfin_compiled_revid());
-       if (bfin_revid() != bfin_compiled_revid())
-               printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n",
-                      bfin_compiled_revid(), bfin_revid());
+       if (bfin_compiled_revid() == 0xffff)
+               printk(KERN_INFO "Compiled for ADSP-%s Rev any\n", CPU);
+       else if (bfin_compiled_revid() == -1)
+               printk(KERN_INFO "Compiled for ADSP-%s Rev none\n", CPU);
+       else
+               printk(KERN_INFO "Compiled for ADSP-%s Rev 0.%d\n", CPU, bfin_compiled_revid());
+       if (bfin_revid() != bfin_compiled_revid()) {
+               if (bfin_compiled_revid() == -1)
+                       printk(KERN_ERR "Warning: Compiled for Rev none, but running on Rev %d\n",
+                              bfin_revid());
+               else if (bfin_compiled_revid() != 0xffff)
+                       printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n",
+                              bfin_compiled_revid(), bfin_revid());
+       }
        if (bfin_revid() < SUPPORTED_REVID)
                printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n",
                       CPU, bfin_revid());
index aa660f32d8c823c5c749161c9cb7df8ec0756351..56058b0b6d4a604954938c5f1964e4e58d2f66cc 100644 (file)
@@ -545,7 +545,8 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr)
 
        if (current->mm) {
                printk(KERN_EMERG "TEXT = 0x%p-0x%p  DATA = 0x%p-0x%p\n"
-                      "BSS = 0x%p-0x%p   USER-STACK = 0x%p\n\n",
+                      KERN_EMERG "BSS = 0x%p-0x%p   USER-STACK = 0x%p\n"
+                      KERN_EMERG "\n",
                       (void*)current->mm->start_code,
                       (void*)current->mm->end_code,
                       (void*)current->mm->start_data,
index 280898b045b2a76f921b3867b9e415652378d4f7..a574cd2c8b61c5ac1ec273b1a7741f1868611abc 100644 (file)
@@ -621,8 +621,6 @@ static int __init acpi_parse_sbf(struct acpi_table_header *table)
 static int __init acpi_parse_hpet(struct acpi_table_header *table)
 {
        struct acpi_table_hpet *hpet_tbl;
-       struct resource *hpet_res;
-       resource_size_t res_start;
 
        hpet_tbl = (struct acpi_table_hpet *)table;
        if (!hpet_tbl) {
@@ -636,29 +634,10 @@ static int __init acpi_parse_hpet(struct acpi_table_header *table)
                return -1;
        }
 
-#define HPET_RESOURCE_NAME_SIZE 9
-       hpet_res = alloc_bootmem(sizeof(*hpet_res) + HPET_RESOURCE_NAME_SIZE);
-       if (hpet_res) {
-               memset(hpet_res, 0, sizeof(*hpet_res));
-               hpet_res->name = (void *)&hpet_res[1];
-               hpet_res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-               snprintf((char *)hpet_res->name, HPET_RESOURCE_NAME_SIZE,
-                        "HPET %u", hpet_tbl->sequence);
-               hpet_res->end = (1 * 1024) - 1;
-       }
-
        hpet_address = hpet_tbl->address.address;
        printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
               hpet_tbl->id, hpet_address);
 
-       res_start = hpet_address;
-
-       if (hpet_res) {
-               hpet_res->start = res_start;
-               hpet_res->end += res_start;
-               insert_resource(&iomem_resource, hpet_res);
-       }
-
        return 0;
 }
 #else
index f0b67630b90da11f16dc3864cc1f3f1d9108d6e9..4d26d514c56f97aa37d8977b280565682fd4a2aa 100644 (file)
@@ -55,14 +55,45 @@ static DEFINE_PER_CPU(struct nmi_watchdog_ctlblk, nmi_watchdog_ctlblk);
 /* converts an msr to an appropriate reservation bit */
 static inline unsigned int nmi_perfctr_msr_to_bit(unsigned int msr)
 {
-       return wd_ops ? msr - wd_ops->perfctr : 0;
+       /* returns the bit offset of the performance counter register */
+       switch (boot_cpu_data.x86_vendor) {
+       case X86_VENDOR_AMD:
+               return (msr - MSR_K7_PERFCTR0);
+       case X86_VENDOR_INTEL:
+               if (cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON))
+                       return (msr - MSR_ARCH_PERFMON_PERFCTR0);
+
+               switch (boot_cpu_data.x86) {
+               case 6:
+                       return (msr - MSR_P6_PERFCTR0);
+               case 15:
+                       return (msr - MSR_P4_BPU_PERFCTR0);
+               }
+       }
+       return 0;
 }
 
 /* converts an msr to an appropriate reservation bit */
 /* returns the bit offset of the event selection register */
 static inline unsigned int nmi_evntsel_msr_to_bit(unsigned int msr)
 {
-       return wd_ops ? msr - wd_ops->evntsel : 0;
+       /* returns the bit offset of the event selection register */
+       switch (boot_cpu_data.x86_vendor) {
+       case X86_VENDOR_AMD:
+               return (msr - MSR_K7_EVNTSEL0);
+       case X86_VENDOR_INTEL:
+               if (cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON))
+                       return (msr - MSR_ARCH_PERFMON_EVENTSEL0);
+
+               switch (boot_cpu_data.x86) {
+               case 6:
+                       return (msr - MSR_P6_EVNTSEL0);
+               case 15:
+                       return (msr - MSR_P4_BSU_ESCR0);
+               }
+       }
+       return 0;
+
 }
 
 /* checks for a bit availability (hack for oprofile) */
index b8fa7ddd78f6d76b0aae3aefc7b99966fc08db65..19b30d6f172785dd817b00742b05ec911a858053 100644 (file)
@@ -236,8 +236,6 @@ void __init plat_smp_setup(void)
        dvpe();
        dmt();
 
-       mips_mt_set_cpuoptions();
-
        /* Put MVPE's into 'configuration state' */
        set_c0_mvpcontrol(MVPCONTROL_VPC);
 
@@ -263,6 +261,8 @@ void __init plat_smp_setup(void)
 
 void __init plat_prepare_cpus(unsigned int max_cpus)
 {
+       mips_mt_set_cpuoptions();
+
        /* set up ipi interrupts */
        if (cpu_has_vint) {
                set_vi_handler(MIPS_CPU_IPI_RESCHED_IRQ, ipi_resched_dispatch);
index 58ceb18ec997f7c16b62c1bba6035411a61450ab..2e7ba615d76043845f23c3dbd1f9192b5e4df072 100644 (file)
@@ -999,11 +999,11 @@ static int __init acpi_osi_setup(char *str)
        if (str == NULL || *str == '\0') {
                printk(KERN_INFO PREFIX "_OSI method disabled\n");
                acpi_gbl_create_osi_method = FALSE;
+       } else if (!strcmp("!Linux", str)) {
+               enable_osi_linux(0);
        } else if (*str == '!') {
                if (acpi_osi_invalidate(++str) == AE_OK)
                        printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str);
-       } else if (!strcmp("!Linux", str)) {
-               enable_osi_linux(0);
        } else if (!strcmp("Linux", str)) {
                enable_osi_linux(1);
        } else if (*osi_additional_string == '\0') {
index b4a8d6030e480859b8c594ad68cd2e40686ae4c7..4ad8675f5a160175e61229220340d4dc0a353037 100644 (file)
@@ -16,6 +16,11 @@ menuconfig ATA
          that "speaks" the ATA protocol, also called ATA controller),
          because you will be asked for it.
 
+         NOTE: ATA enables basic SCSI support; *however*,
+         'SCSI disk support', 'SCSI tape support', or
+         'SCSI CDROM support' may also be needed,
+         depending on your hardware configuration.
+
 if ATA
 
 config ATA_NONSTANDARD
index 7565f022bd69dbf69e8585e17470822a8a84e207..4c6e95c95e4a7a5715d1e2053e18eb07bda6d998 100644 (file)
@@ -50,7 +50,7 @@ static int generic_set_mode(struct ata_port *ap, struct ata_device **unused)
 
        /* Bits 5 and 6 indicate if DMA is active on master/slave */
        if (ap->ioaddr.bmdma_addr)
-               dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+               dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
 
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                struct ata_device *dev = &ap->device[i];
index bfc59a10472826ec1d07555943cb6f7531af0aa1..981b397cb46b1af4f7840b3d434d296f18d1e18c 100644 (file)
@@ -3798,6 +3798,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        /* Drives which do spurious command completion */
        { "HTS541680J9SA00",    "SB2IC7EP",     ATA_HORKAGE_NONCQ, },
        { "HTS541612J9SA00",    "SBDIC7JP",     ATA_HORKAGE_NONCQ, },
+       { "Hitachi HTS541616J9SA00", "SB4OC70P", ATA_HORKAGE_NONCQ, },
        { "WDC WD740ADFD-00NLR1", NULL,         ATA_HORKAGE_NONCQ, },
 
        /* Devices with NCQ limits */
@@ -4781,8 +4782,6 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
                } else
                        ata_qc_complete(qc);
        }
-
-       ata_altstatus(ap); /* flush */
 }
 
 /**
@@ -6424,14 +6423,14 @@ int ata_host_activate(struct ata_host *host, int irq,
        if (rc)
                return rc;
 
+       /* Used to print device info at probe */
+       host->irq = irq;
+
        rc = ata_host_register(host, sht);
        /* if failed, just free the IRQ and leave ports alone */
        if (rc)
                devm_free_irq(host->dev, irq, host);
 
-       /* Used to print device info at probe */
-       host->irq = irq;
-
        return rc;
 }
 
index ce84805ba5f14e80093efa1056ddd3a18de36f20..fa1c22c7b38fef986e0029c139a471e53667459b 100644 (file)
@@ -1065,10 +1065,11 @@ int ata_pci_init_one(struct pci_dev *pdev,
        if (rc)
                goto err_out;
 
-       if (!legacy_mode)
+       if (!legacy_mode) {
                rc = devm_request_irq(dev, pdev->irq, pi->port_ops->irq_handler,
                                      IRQF_SHARED, DRV_NAME, host);
-       else {
+               host->irq = pdev->irq;
+       } else {
                irq_handler_t handler[2] = { host->ops->irq_handler,
                                             host->ops->irq_handler };
                unsigned int irq_flags[2] = { IRQF_SHARED, IRQF_SHARED };
index 3c55a5ff74c761ac8cf9e00d5056146458cae1ee..75e95bdbe02fec28c84183cdcedcd6be942d8eb0 100644 (file)
@@ -550,22 +550,22 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
                .udma_mask = 0x1f,
                .port_ops = &ali_c2_port_ops
        };
-       /* Revision 0xC3 is UDMA100 */
+       /* Revision 0xC3 is UDMA66 for now */
        static const struct ata_port_info info_c3 = {
                .sht = &ali_sht,
                .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | ATA_FLAG_PIO_LBA48,
                .pio_mask = 0x1f,
                .mwdma_mask = 0x07,
-               .udma_mask = 0x3f,
+               .udma_mask = 0x1f,
                .port_ops = &ali_c2_port_ops
        };
-       /* Revision 0xC4 is UDMA133 */
+       /* Revision 0xC4 is UDMA100 */
        static const struct ata_port_info info_c4 = {
                .sht = &ali_sht,
                .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | ATA_FLAG_PIO_LBA48,
                .pio_mask = 0x1f,
                .mwdma_mask = 0x07,
-               .udma_mask = 0x7f,
+               .udma_mask = 0x3f,
                .port_ops = &ali_c2_port_ops
        };
        /* Revision 0xC5 is UDMA133 with LBA48 DMA */
index 1aabe15ad9d3df329dad998863737e8b1e2785e3..00cf0134079cbed13f1dca350968cc7630633bbb 100644 (file)
@@ -284,6 +284,11 @@ static int __devinit cs5520_init_one(struct pci_dev *pdev, const struct pci_devi
                                      ata_interrupt, 0, DRV_NAME, host);
                if (rc)
                        return rc;
+
+               if (i == 0)
+                       host->irq = irq[0];
+               else
+                       host->irq2 = irq[1];
        }
 
        return ata_host_register(host, &cs5520_sht);
index 4d44c7555db14c033eda97485f4fa15c923af0ba..a56257c98fe55a036cb449a420b28fa5a69d4764 100644 (file)
@@ -129,7 +129,7 @@ static struct ata_port_operations pcmcia_port_ops = {
        .irq_on         = ata_irq_on,
        .irq_ack        = ata_irq_ack,
 
-       .port_start     = ata_port_start,
+       .port_start     = ata_sff_port_start,
 };
 
 #define CS_CHECK(fn, ret) \
index 0d2cc49fde4b6a884e7c73e047b4f05c12cdf642..69a5aa4949f5b358bf6382eaceea694fb92a91c1 100644 (file)
@@ -689,10 +689,12 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
        void __iomem *mmio_base = host->iomap[PDC_MMIO_BAR];
        u32 scr;
        long start_count, end_count;
-       long pll_clock;
+       struct timeval start_time, end_time;
+       long pll_clock, usec_elapsed;
 
        /* Read current counter value */
        start_count = pdc_read_counter(host);
+       do_gettimeofday(&start_time);
 
        /* Start the test mode */
        scr = readl(mmio_base + PDC_SYS_CTL);
@@ -705,6 +707,7 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
 
        /* Read the counter values again */
        end_count = pdc_read_counter(host);
+       do_gettimeofday(&end_time);
 
        /* Stop the test mode */
        scr = readl(mmio_base + PDC_SYS_CTL);
@@ -713,7 +716,11 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
        readl(mmio_base + PDC_SYS_CTL); /* flush */
 
        /* calculate the input clock in Hz */
-       pll_clock = (start_count - end_count) * 10;
+       usec_elapsed = (end_time.tv_sec - start_time.tv_sec) * 1000000 +
+               (end_time.tv_usec - start_time.tv_usec);
+
+       pll_clock = (start_count - end_count) / 100 *
+               (100000000 / usec_elapsed);
 
        PDPRINTK("start[%ld] end[%ld] \n", start_count, end_count);
        PDPRINTK("PLL input clock[%ld]Hz\n", pll_clock);
index edbaf9d653b8a3a57e9b8b2de92301e735656d55..d277246b7337ace170887c2607dc7ed14d73cd75 100644 (file)
@@ -31,8 +31,8 @@ static int pdc2026x_cable_detect(struct ata_port *ap)
 
        pci_read_config_word(pdev, 0x50, &cis);
        if (cis & (1 << (10 + ap->port_no)))
-               return ATA_CBL_PATA80;
-       return ATA_CBL_PATA40;
+               return ATA_CBL_PATA40;
+       return ATA_CBL_PATA80;
 }
 
 /**
index ec3ae9375015a194f408f02e0a7690d4fed74b2d..cfe4ec6eb3d5d9955a1ac850dd22696a2711401d 100644 (file)
@@ -560,6 +560,40 @@ static const struct ata_port_operations sis_133_ops = {
        .port_start             = ata_port_start,
 };
 
+static const struct ata_port_operations sis_133_for_sata_ops = {
+       .port_disable           = ata_port_disable,
+       .set_piomode            = sis_133_set_piomode,
+       .set_dmamode            = sis_133_set_dmamode,
+       .mode_filter            = ata_pci_default_filter,
+
+       .tf_load                = ata_tf_load,
+       .tf_read                = ata_tf_read,
+       .check_status           = ata_check_status,
+       .exec_command           = ata_exec_command,
+       .dev_select             = ata_std_dev_select,
+
+       .freeze                 = ata_bmdma_freeze,
+       .thaw                   = ata_bmdma_thaw,
+       .error_handler          = ata_bmdma_error_handler,
+       .post_internal_cmd      = ata_bmdma_post_internal_cmd,
+       .cable_detect           = sis_133_cable_detect,
+
+       .bmdma_setup            = ata_bmdma_setup,
+       .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
+       .qc_prep                = ata_qc_prep,
+       .qc_issue               = ata_qc_issue_prot,
+       .data_xfer              = ata_data_xfer,
+
+       .irq_handler            = ata_interrupt,
+       .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
+
+       .port_start             = ata_port_start,
+};
+
 static const struct ata_port_operations sis_133_early_ops = {
        .port_disable           = ata_port_disable,
        .set_piomode            = sis_100_set_piomode,
@@ -733,13 +767,20 @@ static const struct ata_port_info sis_info100_early = {
        .pio_mask       = 0x1f, /* pio0-4 */
        .port_ops       = &sis_66_ops,
 };
-const struct ata_port_info sis_info133 = {
+static const struct ata_port_info sis_info133 = {
        .sht            = &sis_sht,
        .flags          = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
        .pio_mask       = 0x1f, /* pio0-4 */
        .udma_mask      = ATA_UDMA6,
        .port_ops       = &sis_133_ops,
 };
+const struct ata_port_info sis_info133_for_sata = {
+       .sht            = &sis_sht,
+       .flags          = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
+       .pio_mask       = 0x1f, /* pio0-4 */
+       .udma_mask      = ATA_UDMA6,
+       .port_ops       = &sis_133_for_sata_ops,
+};
 static const struct ata_port_info sis_info133_early = {
        .sht            = &sis_sht,
        .flags          = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
@@ -749,7 +790,7 @@ static const struct ata_port_info sis_info133_early = {
 };
 
 /* Privately shared with the SiS180 SATA driver, not for use elsewhere */
-EXPORT_SYMBOL_GPL(sis_info133);
+EXPORT_SYMBOL_GPL(sis_info133_for_sata);
 
 static void sis_fixup(struct pci_dev *pdev, struct sis_chipset *sis)
 {
@@ -975,6 +1016,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 static const struct pci_device_id sis_pci_tbl[] = {
        { PCI_VDEVICE(SI, 0x5513), },   /* SiS 5513 */
        { PCI_VDEVICE(SI, 0x5518), },   /* SiS 5518 */
+       { PCI_VDEVICE(SI, 0x1180), },   /* SiS 1180 */
 
        { }
 };
index 2d80c9d95e9572fe6c4d3ba9ade3a9e735e05212..dc3bbce046766b871b2b7ad581d6efc2530d34d9 100644 (file)
@@ -496,6 +496,13 @@ static void inic_dev_config(struct ata_device *dev)
        /* inic can only handle upto LBA28 max sectors */
        if (dev->max_sectors > ATA_MAX_SECTORS)
                dev->max_sectors = ATA_MAX_SECTORS;
+
+       if (dev->n_sectors >= 1 << 28) {
+               ata_dev_printk(dev, KERN_ERR,
+       "ERROR: This driver doesn't support LBA48 yet and may cause\n"
+       "                data corruption on such devices.  Disabling.\n");
+               ata_dev_disable(dev);
+       }
 }
 
 static void init_port(struct ata_port *ap)
index c957e6e54ba1b61e493386dd92cb5a1a4ebebddd..590f2f92b4e0e51f47bb1ab14b952266de0bde6d 100644 (file)
@@ -582,6 +582,9 @@ static const struct pci_device_id mv_pci_tbl[] = {
 
        { PCI_VDEVICE(ADAPTEC2, 0x0241), chip_604x },
 
+       /* Adaptec 1430SA */
+       { PCI_VDEVICE(ADAPTEC2, 0x0243), chip_7042 },
+
        { PCI_VDEVICE(TTI, 0x2310), chip_7042 },
 
        /* add Marvell 7042 support */
index adfa693db53dea48cd7e6987c532f1bd4c1ccebe..b2656867c64711075e77478bf6186f9cd0b81b57 100644 (file)
@@ -325,6 +325,7 @@ static struct scsi_host_template nv_adma_sht = {
        .name                   = DRV_NAME,
        .ioctl                  = ata_scsi_ioctl,
        .queuecommand           = ata_scsi_queuecmd,
+       .change_queue_depth     = ata_scsi_change_queue_depth,
        .can_queue              = NV_ADMA_MAX_CPBS,
        .this_id                = ATA_SHT_THIS_ID,
        .sg_tablesize           = NV_ADMA_SGTBL_TOTAL_LEN,
index 221099d1d08fd493a268d496261d3147142d3fc9..f111c984a359f50da823b50284c31ddb9d557fb6 100644 (file)
@@ -72,8 +72,8 @@ static const struct pci_device_id sis_pci_tbl[] = {
        { PCI_VDEVICE(SI, 0x0181), sis_180 },           /* SiS 964/180 */
        { PCI_VDEVICE(SI, 0x0182), sis_180 },           /* SiS 965/965L */
        { PCI_VDEVICE(SI, 0x0183), sis_180 },           /* SiS 965/965L */
-       { PCI_VDEVICE(SI, 0x1182), sis_180 },           /* SiS 966/966L */
-       { PCI_VDEVICE(SI, 0x1183), sis_180 },           /* SiS 966/966L */
+       { PCI_VDEVICE(SI, 0x1182), sis_180 },           /* SiS 966/680 */
+       { PCI_VDEVICE(SI, 0x1183), sis_180 },           /* SiS 966/966L/968/680 */
 
        { }     /* terminate list */
 };
@@ -161,7 +161,6 @@ static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg)
                        case 0x0182:
                        case 0x0183:
                        case 0x1182:
-                       case 0x1183:
                                addr += SIS182_SATA1_OFS;
                                break;
                }
@@ -183,8 +182,8 @@ static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
 
        pci_read_config_dword(pdev, cfg_addr, &val);
 
-       if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || (pdev->device == 0x1182) ||
-           (pdev->device == 0x1183) || (pmr & SIS_PMR_COMBINED))
+       if ((pdev->device == 0x0182) || (pdev->device == 0x0183) ||
+           (pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED))
                pci_read_config_dword(pdev, cfg_addr+0x10, &val2);
 
        return (val|val2) &  0xfffffffb; /* avoid problems with powerdowned ports */
@@ -203,8 +202,8 @@ static void sis_scr_cfg_write (struct ata_port *ap, unsigned int sc_reg, u32 val
 
        pci_write_config_dword(pdev, cfg_addr, val);
 
-       if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || (pdev->device == 0x1182) ||
-           (pdev->device == 0x1183) || (pmr & SIS_PMR_COMBINED))
+       if ((pdev->device == 0x0182) || (pdev->device == 0x0183) ||
+           (pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED))
                pci_write_config_dword(pdev, cfg_addr+0x10, val);
 }
 
@@ -224,8 +223,8 @@ static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg)
 
        val = ioread32(ap->ioaddr.scr_addr + (sc_reg * 4));
 
-       if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || (pdev->device == 0x1182) ||
-           (pdev->device == 0x1183) || (pmr & SIS_PMR_COMBINED))
+       if ((pdev->device == 0x0182) || (pdev->device == 0x0183) ||
+           (pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED))
                val2 = ioread32(ap->ioaddr.scr_addr + (sc_reg * 4) + 0x10);
 
        return (val | val2) &  0xfffffffb;
@@ -245,8 +244,8 @@ static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
                sis_scr_cfg_write(ap, sc_reg, val);
        else {
                iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4));
-               if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || (pdev->device == 0x1182) ||
-                   (pdev->device == 0x1183) || (pmr & SIS_PMR_COMBINED))
+               if ((pdev->device == 0x0182) || (pdev->device == 0x0183) ||
+                   (pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED))
                        iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4)+0x10);
        }
 }
@@ -293,11 +292,11 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                /* The PATA-handling is provided by pata_sis */
                switch (pmr & 0x30) {
                case 0x10:
-                       ppi[1] = &sis_info133;
+                       ppi[1] = &sis_info133_for_sata;
                        break;
 
                case 0x30:
-                       ppi[0] = &sis_info133;
+                       ppi[0] = &sis_info133_for_sata;
                        break;
                }
                if ((pmr & SIS_PMR_COMBINED) == 0) {
@@ -324,14 +323,14 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                break;
 
        case 0x1182:
+               dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 1182/966/680 SATA controller\n");
+               pi.flags |= ATA_FLAG_SLAVE_POSS;
+               break;
+
        case 0x1183:
-               pci_read_config_dword(pdev, 0x64, &val);
-               if (val & 0x10000000) {
-                       dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 1182/1183/966L SATA controller\n");
-               } else {
-                       dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 1182/1183/966 SATA controller\n");
-                       pi.flags |= ATA_FLAG_SLAVE_POSS;
-               }
+               dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 1183/966/966L/968/680 controller in PATA mode\n");
+               ppi[0] = &sis_info133_for_sata;
+               ppi[1] = &sis_info133_for_sata;
                break;
        }
 
index 0f2208d8d5efdd087e361db8730c9bbeabb70fcc..f7f3eebe666c463ef3909609704a64ff1c59be18 100644 (file)
@@ -2,4 +2,4 @@
 struct ata_port_info;
 
 /* pata_sis.c */
-extern const struct ata_port_info sis_info133;
+extern const struct ata_port_info sis_info133_for_sata;
index 396dade731f9177b6354f1bfd6edcc2bff5e0642..d011a76f8e7a4d032820ffbaafd7d0c544e1a259 100644 (file)
@@ -4,27 +4,44 @@ comment "An alternative FireWire stack is available with EXPERIMENTAL=y"
        depends on EXPERIMENTAL=n
 
 config FIREWIRE
-       tristate "IEEE 1394 (FireWire) support (JUJU alternative stack, experimental)"
+       tristate "IEEE 1394 (FireWire) support - alternative stack, EXPERIMENTAL"
        depends on EXPERIMENTAL
        select CRC_ITU_T
        help
-         IEEE 1394 describes a high performance serial bus, which is also
-         known as FireWire(tm) or i.Link(tm) and is used for connecting all
-         sorts of devices (most notably digital video cameras) to your
-         computer.
-
-         If you have FireWire hardware and want to use it, say Y here.  This
-         is the core support only, you will also need to select a driver for
-         your IEEE 1394 adapter.
-
-         To compile this driver as a module, say M here: the module will be
-         called firewire-core.
-
-         This is the "JUJU" FireWire stack, an alternative implementation
+         This is the "Juju" FireWire stack, a new alternative implementation
          designed for robustness and simplicity.  You can build either this
          stack, or the classic stack (the ieee1394 driver, ohci1394 etc.)
          or both.
 
+         To compile this driver as a module, say M here: the module will be
+         called firewire-core.  It functionally replaces ieee1394, raw1394,
+         and video1394.
+
+          NOTE:
+
+         You should only build ONE of the stacks, unless you REALLY know what
+         you are doing.  If you install both, you should configure them only as
+         modules rather than link them statically, and you should blacklist one
+         of the concurrent low-level drivers in /etc/modprobe.conf.  Add either
+
+             blacklist firewire-ohci
+         or
+             blacklist ohci1394
+
+         there depending on which driver you DON'T want to have auto-loaded.
+         You can optionally do the same with the other IEEE 1394/ FireWire
+         drivers.
+
+         If you have an old modprobe which doesn't implement the blacklist
+         directive, use either
+
+              install firewire-ohci /bin/true
+         or
+              install ohci1394 /bin/true
+
+         and so on, depending on which modules you DON't want to have
+         auto-loaded.
+
 config FIREWIRE_OHCI
        tristate "Support for OHCI FireWire host controllers"
        depends on PCI && FIREWIRE
@@ -34,11 +51,13 @@ config FIREWIRE_OHCI
          is the only chipset in use, so say Y here.
 
          To compile this driver as a module, say M here:  The module will be
-         called firewire-ohci.
+         called firewire-ohci.  It replaces ohci1394 of the classic IEEE 1394
+         stack.
+
+          NOTE:
 
-         If you also build ohci1394 of the classic IEEE 1394 driver stack,
-         blacklist either ohci1394 or firewire-ohci to let hotplug load the
-         desired driver.
+         If you also build ohci1394 of the classic stack, blacklist either
+         ohci1394 or firewire-ohci to let hotplug load only the desired driver.
 
 config FIREWIRE_SBP2
        tristate "Support for storage devices (SBP-2 protocol driver)"
@@ -50,12 +69,14 @@ config FIREWIRE_SBP2
          like scanners.
 
          To compile this driver as a module, say M here:  The module will be
-         called firewire-sbp2.
+         called firewire-sbp2.  It replaces sbp2 of the classic IEEE 1394
+         stack.
 
          You should also enable support for disks, CD-ROMs, etc. in the SCSI
          configuration section.
 
-         If you also build sbp2 of the classic IEEE 1394 driver stack,
-         blacklist either sbp2 or firewire-sbp2 to let hotplug load the
-         desired driver.
+          NOTE:
+
+         If you also build sbp2 of the classic stack, blacklist either sbp2
+         or firewire-sbp2 to let hotplug load only the desired driver.
 
index b72a5c1f9e6999575c17b4801073df0799f37dd1..96c8ac5b86ccceaeed1ce0355b1f8c0c3cd1dda0 100644 (file)
@@ -373,8 +373,8 @@ static void ar_context_tasklet(unsigned long data)
 
                offset = offsetof(struct ar_buffer, data);
                dma_unmap_single(ohci->card.device,
-                                ab->descriptor.data_address - offset,
-                                PAGE_SIZE, DMA_BIDIRECTIONAL);
+                       le32_to_cpu(ab->descriptor.data_address) - offset,
+                       PAGE_SIZE, DMA_BIDIRECTIONAL);
 
                buffer = ab;
                ab = ab->next;
@@ -427,7 +427,7 @@ static void ar_context_run(struct ar_context *ctx)
        size_t offset;
 
        offset = offsetof(struct ar_buffer, data);
-       ab_bus = ab->descriptor.data_address - offset;
+       ab_bus = le32_to_cpu(ab->descriptor.data_address) - offset;
 
        reg_write(ctx->ohci, COMMAND_PTR(ctx->regs), ab_bus | 1);
        reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN);
index 41bfa4d21ab65352afdf489782b0441a1fc40bfb..f5ce22c38f827eceec594021ad68d1c5811aeacf 100644 (file)
@@ -574,11 +574,11 @@ static inline u8 probe_for_drive (ide_drive_t *drive)
                        /* look for ATAPI device */
                        (void) do_probe(drive, WIN_PIDENTIFY);
                }
-               if (strstr(drive->id->model, "E X A B Y T E N E S T"))
-                       enable_nest(drive);
                if (!drive->present)
                        /* drive not found */
                        return 0;
+               if (strstr(drive->id->model, "E X A B Y T E N E S T"))
+                       enable_nest(drive);
        
                /* identification failed? */
                if (!drive->id_read) {
index 30175c7688e877016e0bd666bcfa4b8ca5e92ad4..aa06dafb74acb09dd4383e5a3c7421dcc13db2b7 100644 (file)
@@ -238,7 +238,7 @@ EXPORT_SYMBOL(task_no_data_intr);
 static u8 wait_drive_not_busy(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = HWIF(drive);
-       int retries = 100;
+       int retries;
        u8 stat;
 
        /*
@@ -246,10 +246,14 @@ static u8 wait_drive_not_busy(ide_drive_t *drive)
         * This can take up to 10 usec, but we will wait max 1 ms
         * (drive_cmd_intr() waits that long).
         */
-       while (((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) && retries--)
-               udelay(10);
+       for (retries = 0; retries < 100; retries++) {
+               if ((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT)
+                       udelay(10);
+               else
+                       break;
+       }
 
-       if (!retries)
+       if (stat & BUSY_STAT)
                printk(KERN_ERR "%s: drive still BUSY!\n", drive->name);
 
        return stat;
index 9db1be826e8018b70467ec59159bae927254e246..a2be65fcf89c6f45aed44cfbccd83471a543b814 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Version 2.15
+ * Version 2.16
  *
  * AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s/CK804/MCP04
  * IDE driver for Linux.
@@ -244,10 +244,8 @@ static int amd_set_drive(ide_drive_t *drive, u8 speed)
        struct ide_timing t, p;
        int T, UT;
 
-       if (speed != XFER_PIO_SLOW && speed != drive->current_speed)
-               if (ide_config_drive_speed(drive, speed))
-                       printk(KERN_WARNING "ide%d: Drive %d didn't accept speed setting. Oh, well.\n",
-                               drive->dn >> 1, drive->dn & 1);
+       if (speed != XFER_PIO_SLOW)
+               ide_config_drive_speed(drive, speed);
 
        T = 1000000000 / amd_clock;
        UT = T / min_t(int, max_t(int, amd_config->flags & AMD_UDMA, 1), 2);
index ce8a5449a5749d3ae99b6c6e04a263b808e0511e..c33d0b0f11c91896eb498bb1a5f030ad7ce6b51b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/hpt366.c              Version 1.04    Jun 4, 2007
+ * linux/drivers/ide/pci/hpt366.c              Version 1.06    Jun 27, 2007
  *
  * Copyright (C) 1999-2003             Andre Hedrick <andre@linux-ide.org>
  * Portions Copyright (C) 2001         Sun Microsystems, Inc.
@@ -182,6 +182,7 @@ static const char *bad_ata66_4[] = {
        "IC35L040AVER07-0",
        "IC35L060AVER07-0",
        "WDC AC310200R",
+       "MAXTOR STM3320620A",
        NULL
 };
 
@@ -1513,18 +1514,28 @@ static int __devinit init_setup_hpt366(struct pci_dev *dev, ide_pci_device_t *d)
                goto init_single;
 
        /*
-        * HPT36x chips are single channel and
-        * do not seem to have the channel enable bit...
+        * HPT36x chips have one channel per function and have
+        * both channel enable bits located differently and visible
+        * to both functions -- really stupid design decision... :-(
+        * Bit 4 is for the primary channel, bit 5 for the secondary.
         */
        d->channels = 1;
-       d->enablebits[0].reg = 0;
+       d->enablebits[0].mask = d->enablebits[0].val = 0x10;
 
        if ((dev2 = pci_get_slot(dev->bus, dev->devfn + 1)) != NULL) {
-               u8  pin1 = 0, pin2 = 0;
+               u8  mcr1 = 0, pin1 = 0, pin2 = 0;
                int ret;
 
                pci_set_drvdata(dev2, info[rev]);
 
+               /*
+                * Now we'll have to force both channels enabled if
+                * at least one of them has been enabled by BIOS...
+                */
+               pci_read_config_byte(dev, 0x50, &mcr1);
+               if (mcr1 & 0x30)
+                       pci_write_config_byte(dev, 0x50, mcr1 | 0x30);
+
                pci_read_config_byte(dev,  PCI_INTERRUPT_PIN, &pin1);
                pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin2);
                if (pin1 != pin2 && dev->irq == dev2->irq) {
index 4bd4bf02e917a8ca64a6a7b7f3c99d1c5797a9bf..3aeb7f1b79168f9790f3faafda531c653b7195c4 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * linux/drivers/ide/pci/it821x.c              Version 0.15    Jun 2 2007
+ * linux/drivers/ide/pci/it821x.c              Version 0.16    Jul 3 2007
  *
  * Copyright (C) 2004          Red Hat <alan@redhat.com>
  * Copyright (C) 2007          Bartlomiej Zolnierkiewicz
@@ -660,7 +660,6 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
 
        hwif->ultra_mask = 0x7f;
        hwif->mwdma_mask = 0x07;
-       hwif->swdma_mask = 0x07;
 
        hwif->ide_dma_check = &it821x_config_drive_for_dma;
        if (!(hwif->udma_four))
index cc0bfdcf1f196d1b05a7a4c01fc00579a356a320..0765dce6948eb1f91cc39ce878bac44750776a11 100644 (file)
@@ -306,11 +306,13 @@ static long __devinit read_counter(u32 dma_base)
  */
 static long __devinit detect_pll_input_clock(unsigned long dma_base)
 {
+       struct timeval start_time, end_time;
        long start_count, end_count;
-       long pll_input;
+       long pll_input, usec_elapsed;
        u8 scr1;
 
        start_count = read_counter(dma_base);
+       do_gettimeofday(&start_time);
 
        /* Start the test mode */
        outb(0x01, dma_base + 0x01);
@@ -322,6 +324,7 @@ static long __devinit detect_pll_input_clock(unsigned long dma_base)
        mdelay(10);
 
        end_count = read_counter(dma_base);
+       do_gettimeofday(&end_time);
 
        /* Stop the test mode */
        outb(0x01, dma_base + 0x01);
@@ -333,7 +336,10 @@ static long __devinit detect_pll_input_clock(unsigned long dma_base)
         * Calculate the input clock in Hz
         * (the clock counter is 30 bit wide and counts down)
         */
-       pll_input = ((start_count - end_count) & 0x3ffffff) * 100;
+       usec_elapsed = (end_time.tv_sec - start_time.tv_sec) * 1000000 +
+               (end_time.tv_usec - start_time.tv_usec);
+       pll_input = ((start_count - end_count) & 0x3ffffff) / 10 *
+               (10000000 / usec_elapsed);
 
        DBG("start[%ld] end[%ld]\n", start_count, end_count);
 
index 67035ba4bf5e2c3000bc2d1026352fad02cc8137..c88d33225cf91542cc490c00d9e37d026bdf5895 100644 (file)
@@ -872,11 +872,15 @@ void __init ide_scan_pcibus (int scan_direction)
         *      are post init.
         */
 
-       list_for_each_safe(l, n, &ide_pci_drivers)
-       {
+       list_for_each_safe(l, n, &ide_pci_drivers) {
                list_del(l);
                d = list_entry(l, struct pci_driver, node);
-               __pci_register_driver(d, d->driver.owner, d->driver.mod_name);
+               if (__pci_register_driver(d, d->driver.owner,
+                                       d->driver.mod_name)) {
+                       printk(KERN_ERR "%s: failed to register driver "
+                                       "for %s\n", __FUNCTION__,
+                                        d->driver.mod_name);
+               }
        }
 }
 #endif
index 5ffc464c99aa70318035252a7be60e5ba5cf876e..ea74d1eaf0046c15c78e6a819067b8743a572a71 100644 (file)
@@ -148,8 +148,8 @@ partial_error:
 
        ib_dma_unmap_single(priv->ca, mapping[0], IPOIB_CM_HEAD_SIZE, DMA_FROM_DEVICE);
 
-       for (; i >= 0; --i)
-               ib_dma_unmap_single(priv->ca, mapping[i + 1], PAGE_SIZE, DMA_FROM_DEVICE);
+       for (; i > 0; --i)
+               ib_dma_unmap_single(priv->ca, mapping[i], PAGE_SIZE, DMA_FROM_DEVICE);
 
        dev_kfree_skb_any(skb);
        return NULL;
index 6aba5b39ed144c2e1476ad993fec4b0f1fb51157..b40af48a2edbdcb71f750c2038a202efe2e08f05 100644 (file)
@@ -118,6 +118,7 @@ struct cinergyt2 {
        struct dvb_demux demux;
        struct usb_device *udev;
        struct mutex sem;
+       struct mutex wq_sem;
        struct dvb_adapter adapter;
        struct dvb_device *fedev;
        struct dmxdev dmxdev;
@@ -482,14 +483,14 @@ static int cinergyt2_open (struct inode *inode, struct file *file)
        struct cinergyt2 *cinergyt2 = dvbdev->priv;
        int err = -ERESTARTSYS;
 
-       if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
-               return -ERESTARTSYS;
+       if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->wq_sem))
+               goto out;
 
-       if ((err = dvb_generic_open(inode, file))) {
-               mutex_unlock(&cinergyt2->sem);
-               return err;
-       }
+       if (mutex_lock_interruptible(&cinergyt2->sem))
+               goto out_unlock1;
 
+       if ((err = dvb_generic_open(inode, file)))
+               goto out_unlock2;
 
        if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
                cinergyt2_sleep(cinergyt2, 0);
@@ -498,8 +499,12 @@ static int cinergyt2_open (struct inode *inode, struct file *file)
 
        atomic_inc(&cinergyt2->inuse);
 
+out_unlock2:
        mutex_unlock(&cinergyt2->sem);
-       return 0;
+out_unlock1:
+       mutex_unlock(&cinergyt2->wq_sem);
+out:
+       return err;
 }
 
 static void cinergyt2_unregister(struct cinergyt2 *cinergyt2)
@@ -519,15 +524,17 @@ static int cinergyt2_release (struct inode *inode, struct file *file)
        struct dvb_device *dvbdev = file->private_data;
        struct cinergyt2 *cinergyt2 = dvbdev->priv;
 
-       mutex_lock(&cinergyt2->sem);
+       mutex_lock(&cinergyt2->wq_sem);
 
        if (!cinergyt2->disconnect_pending && (file->f_flags & O_ACCMODE) != O_RDONLY) {
-               cancel_delayed_work(&cinergyt2->query_work);
-               flush_scheduled_work();
+               cancel_rearming_delayed_work(&cinergyt2->query_work);
+
+               mutex_lock(&cinergyt2->sem);
                cinergyt2_sleep(cinergyt2, 1);
+               mutex_unlock(&cinergyt2->sem);
        }
 
-       mutex_unlock(&cinergyt2->sem);
+       mutex_unlock(&cinergyt2->wq_sem);
 
        if (atomic_dec_and_test(&cinergyt2->inuse) && cinergyt2->disconnect_pending) {
                warn("delayed unregister in release");
@@ -838,13 +845,13 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
 
 static void cinergyt2_unregister_rc(struct cinergyt2 *cinergyt2)
 {
-       cancel_delayed_work(&cinergyt2->rc_query_work);
+       cancel_rearming_delayed_work(&cinergyt2->rc_query_work);
        input_unregister_device(cinergyt2->rc_input_dev);
 }
 
 static inline void cinergyt2_suspend_rc(struct cinergyt2 *cinergyt2)
 {
-       cancel_delayed_work(&cinergyt2->rc_query_work);
+       cancel_rearming_delayed_work(&cinergyt2->rc_query_work);
 }
 
 static inline void cinergyt2_resume_rc(struct cinergyt2 *cinergyt2)
@@ -907,6 +914,7 @@ static int cinergyt2_probe (struct usb_interface *intf,
        usb_set_intfdata (intf, (void *) cinergyt2);
 
        mutex_init(&cinergyt2->sem);
+       mutex_init(&cinergyt2->wq_sem);
        init_waitqueue_head (&cinergyt2->poll_wq);
        INIT_DELAYED_WORK(&cinergyt2->query_work, cinergyt2_query);
 
@@ -974,11 +982,8 @@ static void cinergyt2_disconnect (struct usb_interface *intf)
 {
        struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf);
 
-       flush_scheduled_work();
-
        cinergyt2_unregister_rc(cinergyt2);
-
-       cancel_delayed_work(&cinergyt2->query_work);
+       cancel_rearming_delayed_work(&cinergyt2->query_work);
        wake_up_interruptible(&cinergyt2->poll_wq);
 
        cinergyt2->demux.dmx.close(&cinergyt2->demux.dmx);
@@ -992,21 +997,21 @@ static int cinergyt2_suspend (struct usb_interface *intf, pm_message_t state)
 {
        struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf);
 
-       if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
+       if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->wq_sem))
                return -ERESTARTSYS;
 
        if (1) {
-               struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf);
-
                cinergyt2_suspend_rc(cinergyt2);
-               cancel_delayed_work(&cinergyt2->query_work);
+               cancel_rearming_delayed_work(&cinergyt2->query_work);
+
+               mutex_lock(&cinergyt2->sem);
                if (cinergyt2->streaming)
                        cinergyt2_stop_stream_xfer(cinergyt2);
-               flush_scheduled_work();
                cinergyt2_sleep(cinergyt2, 1);
+               mutex_unlock(&cinergyt2->sem);
        }
 
-       mutex_unlock(&cinergyt2->sem);
+       mutex_unlock(&cinergyt2->wq_sem);
        return 0;
 }
 
@@ -1014,9 +1019,15 @@ static int cinergyt2_resume (struct usb_interface *intf)
 {
        struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf);
        struct dvbt_set_parameters_msg *param = &cinergyt2->param;
+       int err = -ERESTARTSYS;
 
-       if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
-               return -ERESTARTSYS;
+       if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->wq_sem))
+               goto out;
+
+       if (mutex_lock_interruptible(&cinergyt2->sem))
+               goto out_unlock1;
+
+       err = 0;
 
        if (!cinergyt2->sleeping) {
                cinergyt2_sleep(cinergyt2, 0);
@@ -1029,7 +1040,10 @@ static int cinergyt2_resume (struct usb_interface *intf)
        cinergyt2_resume_rc(cinergyt2);
 
        mutex_unlock(&cinergyt2->sem);
-       return 0;
+out_unlock1:
+       mutex_unlock(&cinergyt2->wq_sem);
+out:
+       return err;
 }
 
 static const struct usb_device_id cinergyt2_table [] __devinitdata = {
index 2557ac9620d02f20794955c6a0f26c87d8df7d19..b611f2b1f8bc48602be277a84e61edb8cb31fd6c 100644 (file)
@@ -529,7 +529,7 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
        if (bi->type != BUDGET_FS_ACTIVY)
                saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI);
 
-       if (budget_register(budget) == 0)
+       if ((ret = budget_register(budget)) == 0)
                return 0; /* Everything OK */
 
        /* An error occurred, cleanup resources */
index 1c38723d31690577bfed6398a05bb4a112d79255..b1fedb0f64310507d5260450e16816c55254411f 100644 (file)
@@ -1331,7 +1331,7 @@ set_tvnorm(struct bttv *btv, unsigned int norm)
 
 /* Call with btv->lock down. */
 static void
-set_input(struct bttv *btv, unsigned int input)
+set_input(struct bttv *btv, unsigned int input, unsigned int norm)
 {
        unsigned long flags;
 
@@ -1350,7 +1350,7 @@ set_input(struct bttv *btv, unsigned int input)
        }
        audio_input(btv,(input == bttv_tvcards[btv->c.type].tuner ?
                       TVAUDIO_INPUT_TUNER : TVAUDIO_INPUT_EXTERN));
-       set_tvnorm(btv,btv->tvnorm);
+       set_tvnorm(btv, norm);
        i2c_vidiocschan(btv);
 }
 
@@ -1441,7 +1441,7 @@ static void bttv_reinit_bt848(struct bttv *btv)
 
        init_bt848(btv);
        btv->pll.pll_current = -1;
-       set_input(btv,btv->input);
+       set_input(btv, btv->input, btv->tvnorm);
 }
 
 static int get_control(struct bttv *btv, struct v4l2_control *c)
@@ -2011,8 +2011,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
                        return 0;
                }
 
-               btv->tvnorm = v->norm;
-               set_input(btv,v->channel);
+               set_input(btv, v->channel, v->norm);
                mutex_unlock(&btv->lock);
                return 0;
        }
@@ -2148,7 +2147,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
                if (*i > bttv_tvcards[btv->c.type].video_inputs)
                        return -EINVAL;
                mutex_lock(&btv->lock);
-               set_input(btv,*i);
+               set_input(btv, *i, btv->tvnorm);
                mutex_unlock(&btv->lock);
                return 0;
        }
@@ -4780,7 +4779,7 @@ static int __devinit bttv_probe(struct pci_dev *dev,
                bt848_hue(btv,32768);
                bt848_sat(btv,32768);
                audio_mute(btv, 1);
-               set_input(btv,0);
+               set_input(btv, 0, btv->tvnorm);
                bttv_crop_reset(&btv->crop[0], btv->tvnorm);
                btv->crop[1] = btv->crop[0]; /* current = default */
                disclaim_vbi_lines(btv);
index b0466b88f52cd209680ee1a52c3aa9eacf3319f6..a80b1cb1abe88999c0074e2f949f83b4ce510d32 100644 (file)
@@ -1034,6 +1034,8 @@ static int vidioc_g_tuner (struct file *file, void *priv,
 
        if (unlikely(UNSET == core->tuner_type))
                return -EINVAL;
+       if (0 != t->index)
+               return -EINVAL;
 
        strcpy(t->name, "Television");
        t->type       = V4L2_TUNER_ANALOG_TV;
index 2f2fbffafbe052799e2315737b0e9e08225fd8ff..616eee9c04f10c01d6799855d19d81b315cc5be5 100644 (file)
@@ -187,13 +187,5 @@ config THINKPAD_ACPI_BAY
 
          If you are not sure, say Y here.
 
-config BLINK
-       tristate "Keyboard blink driver"
-       help
-         Driver that when loaded will blink the keyboard LEDs continuously.
-         This is useful for debugging and for kernels that cannot necessarily
-         output something to the screen like kexec kernels to give the user
-         a visual indication that the kernel is doing something.
-
 
 endmenu
index 5b6d46de005ca47b2f260eebbec881686a4fca8d..8abbf2f07a65d4d0d3633ba87fd6e4c69807b540 100644 (file)
@@ -7,7 +7,6 @@ obj-$(CONFIG_IBM_ASM)           += ibmasm/
 obj-$(CONFIG_HDPU_FEATURES)    += hdpuftrs/
 obj-$(CONFIG_MSI_LAPTOP)     += msi-laptop.o
 obj-$(CONFIG_ASUS_LAPTOP)     += asus-laptop.o
-obj-$(CONFIG_BLINK)            += blink.o
 obj-$(CONFIG_LKDTM)            += lkdtm.o
 obj-$(CONFIG_TIFM_CORE)        += tifm_core.o
 obj-$(CONFIG_TIFM_7XX1)        += tifm_7xx1.o
diff --git a/drivers/misc/blink.c b/drivers/misc/blink.c
deleted file mode 100644 (file)
index 97f7253..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/timer.h>
-#include <linux/jiffies.h>
-
-static void do_blink(unsigned long data);
-
-static DEFINE_TIMER(blink_timer, do_blink, 0 ,0);
-
-static void do_blink(unsigned long data)
-{
-       static long count;
-       if (panic_blink)
-               panic_blink(count++);
-       blink_timer.expires = jiffies + msecs_to_jiffies(1);
-       add_timer(&blink_timer);
-}
-
-static int blink_panic_event(struct notifier_block *blk,
-                            unsigned long event, void *arg)
-{
-       do_blink(0);
-       return 0;
-}
-
-static struct notifier_block blink_notify = {
-       .notifier_call = blink_panic_event,
-};
-
-static __init int blink_init(void)
-{
-       printk(KERN_INFO "Enabling keyboard blinking\n");
-       atomic_notifier_chain_register(&panic_notifier_list, &blink_notify);
-       return 0;
-}
-
-static __exit void blink_remove(void)
-{
-       del_timer_sync(&blink_timer);
-       atomic_notifier_chain_unregister(&panic_notifier_list, &blink_notify);
-}
-
-module_init(blink_init);
-module_exit(blink_remove);
-
index 6822bf14267b265ca8c3b0adc0801074b1f37728..1b854bf07b09fec79f6abfa5b58f70b6ef91d1be 100644 (file)
@@ -944,7 +944,7 @@ static inline void gfar_tx_checksum(struct sk_buff *skb, struct txfcb *fcb)
                flags |= TXFCB_UDP;
                fcb->phcs = udp_hdr(skb)->check;
        } else
-               fcb->phcs = udp_hdr(skb)->check;
+               fcb->phcs = tcp_hdr(skb)->check;
 
        /* l3os is the distance between the start of the
         * frame (skb->data) and the start of the IP hdr.
index 41eafebf58233da49d71be34b10d0b69f21558bf..c3da2a2f543127c7b89a34af0b1279923b4a3496 100644 (file)
@@ -911,6 +911,8 @@ static struct pci_device_id mlx4_pci_table[] = {
        { PCI_VDEVICE(MELLANOX, 0x6340) }, /* MT25408 "Hermon" SDR */
        { PCI_VDEVICE(MELLANOX, 0x634a) }, /* MT25408 "Hermon" DDR */
        { PCI_VDEVICE(MELLANOX, 0x6354) }, /* MT25408 "Hermon" QDR */
+       { PCI_VDEVICE(MELLANOX, 0x6732) }, /* MT25408 "Hermon" DDR PCIe gen2 */
+       { PCI_VDEVICE(MELLANOX, 0x673c) }, /* MT25408 "Hermon" QDR PCIe gen2 */
        { 0, }
 };
 
index 0f9904fe3a5a2b4273ffe5901846f627233fa818..d0cc122fa3f0f0710eb610f7d23cbdbd7527469a 100644 (file)
@@ -2854,6 +2854,8 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                return -ENOMEM;
        }
 
+       SET_NETDEV_DEV(netdev, &pdev->dev);
+
        mgp = netdev_priv(netdev);
        memset(mgp, 0, sizeof(*mgp));
        mgp->dev = netdev;
index 91f25e0a638ea64c21fd42910e4c0a2880abf649..619503742b7dd3c2f013757c28b92ef8d6880fa1 100644 (file)
@@ -937,6 +937,7 @@ struct netxen_adapter {
        struct netxen_ring_ctx *ctx_desc;
        struct pci_dev *ctx_desc_pdev;
        dma_addr_t ctx_desc_phys_addr;
+       int intr_scheme;
        int (*enable_phy_interrupts) (struct netxen_adapter *);
        int (*disable_phy_interrupts) (struct netxen_adapter *);
        void (*handle_phy_intr) (struct netxen_adapter *);
@@ -951,6 +952,24 @@ struct netxen_adapter {
        int (*stop_port) (struct netxen_adapter *);
 };                             /* netxen_adapter structure */
 
+/*
+ * NetXen dma watchdog control structure
+ *
+ *     Bit 0           : enabled => R/O: 1 watchdog active, 0 inactive
+ *     Bit 1           : disable_request => 1 req disable dma watchdog
+ *     Bit 2           : enable_request =>  1 req enable dma watchdog
+ *     Bit 3-31        : unused
+ */
+
+#define netxen_set_dma_watchdog_disable_req(config_word) \
+       _netxen_set_bits(config_word, 1, 1, 1)
+#define netxen_set_dma_watchdog_enable_req(config_word) \
+       _netxen_set_bits(config_word, 2, 1, 1)
+#define netxen_get_dma_watchdog_enabled(config_word) \
+       ((config_word) & 0x1)
+#define netxen_get_dma_watchdog_disabled(config_word) \
+       (((config_word) >> 1) & 0x1)
+
 /* Max number of xmit producer threads that can run simultaneously */
 #define        MAX_XMIT_PRODUCERS              16
 
@@ -1030,8 +1049,8 @@ int netxen_nic_erase_pxe(struct netxen_adapter *adapter);
 /* Functions from netxen_nic_init.c */
 void netxen_free_adapter_offload(struct netxen_adapter *adapter);
 int netxen_initialize_adapter_offload(struct netxen_adapter *adapter);
-void netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val);
-void netxen_load_firmware(struct netxen_adapter *adapter);
+int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val);
+int netxen_load_firmware(struct netxen_adapter *adapter);
 int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose);
 int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp);
 int netxen_rom_fast_read_words(struct netxen_adapter *adapter, int addr, 
@@ -1080,37 +1099,106 @@ struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev);
 
 static inline void netxen_nic_disable_int(struct netxen_adapter *adapter)
 {
-       /*
-        * ISR_INT_MASK: Can be read from window 0 or 1.
-        */
-       writel(0x7ff, PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK));
+       uint32_t        mask = 0x7ff;
+       int retries = 32;
+
+       DPRINTK(1, INFO, "Entered ISR Disable \n");
+
+       switch (adapter->portnum) {
+       case 0:
+               writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_0));
+               break;
+       case 1:
+               writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_1));
+               break;
+       case 2:
+               writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_2));
+               break;
+       case 3:
+               writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_3));
+               break;
+       }
 
+       if (adapter->intr_scheme != -1 &&
+               adapter->intr_scheme != INTR_SCHEME_PERPORT) {
+               writel(mask,
+                       (void *)(PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK)));
+       }
+
+       /* Window = 0 or 1 */
+       if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
+               do {
+                       writel(0xffffffff, (void *)
+                               (PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_TARGET_STATUS)));
+                       mask = readl((void *)
+                                       (pci_base_offset(adapter, ISR_INT_VECTOR)));
+                       if (!(mask & 0x80))
+                               break;
+                       udelay(10);
+               } while (--retries);
+
+               if (!retries) {
+                       printk(KERN_NOTICE "%s: Failed to disable interrupt completely\n",
+                                       netxen_nic_driver_name);
+               }
+       }
+
+       DPRINTK(1, INFO, "Done with Disable Int\n");
+
+       return;
 }
 
 static inline void netxen_nic_enable_int(struct netxen_adapter *adapter)
 {
        u32 mask;
 
-       switch (adapter->ahw.board_type) {
-       case NETXEN_NIC_GBE:
-               mask = 0x77b;
+       DPRINTK(1, INFO, "Entered ISR Enable \n");
+
+       if (adapter->intr_scheme != -1 &&
+               adapter->intr_scheme != INTR_SCHEME_PERPORT) {
+               switch (adapter->ahw.board_type) {
+               case NETXEN_NIC_GBE:
+                       mask  =  0x77b;
+                       break;
+               case NETXEN_NIC_XGBE:
+                       mask  =  0x77f;
+                       break;
+               default:
+                       mask  =  0x7ff;
+                       break;
+               }
+
+               writel(mask,
+                       (void *)(PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK)));
+       }
+       switch (adapter->portnum) {
+       case 0:
+               writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_0));
+               break;
+       case 1:
+               writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_1));
                break;
-       case NETXEN_NIC_XGBE:
-               mask = 0x77f;
+       case 2:
+               writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_2));
                break;
-       default:
-               mask = 0x7ff;
+       case 3:
+               writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_3));
                break;
        }
 
-       writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK));
-
        if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
                mask = 0xbff;
-               writel(0X0, NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
-               writel(mask, PCI_OFFSET_SECOND_RANGE(adapter,
-                                                    ISR_INT_TARGET_MASK));
+               if (adapter->intr_scheme != -1 &&
+                       adapter->intr_scheme != INTR_SCHEME_PERPORT) {
+                       writel(0X0, NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
+               }
+               writel(mask,
+                       (void *)(PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_TARGET_MASK)));
        }
+
+       DPRINTK(1, INFO, "Done with enable Int\n");
+
+       return;
 }
 
 /*
@@ -1164,6 +1252,62 @@ static inline void get_brd_name_by_type(u32 type, char *name)
                name = "Unknown";
 }
 
+static inline int
+dma_watchdog_shutdown_request(struct netxen_adapter *adapter)
+{
+       u32 ctrl;
+
+       /* check if already inactive */
+       if (netxen_nic_hw_read_wx(adapter,
+           NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), &ctrl, 4))
+               printk(KERN_ERR "failed to read dma watchdog status\n");
+
+       if (netxen_get_dma_watchdog_enabled(ctrl) == 0)
+               return 1;
+
+       /* Send the disable request */
+       netxen_set_dma_watchdog_disable_req(ctrl);
+       netxen_crb_writelit_adapter(adapter,
+               NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), ctrl);
+
+       return 0;
+}
+
+static inline int
+dma_watchdog_shutdown_poll_result(struct netxen_adapter *adapter)
+{
+       u32 ctrl;
+
+       if (netxen_nic_hw_read_wx(adapter,
+           NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), &ctrl, 4))
+               printk(KERN_ERR "failed to read dma watchdog status\n");
+
+       return ((netxen_get_dma_watchdog_enabled(ctrl) == 0) &&
+               (netxen_get_dma_watchdog_disabled(ctrl) == 0));
+}
+
+static inline int
+dma_watchdog_wakeup(struct netxen_adapter *adapter)
+{
+       u32 ctrl;
+
+       if (netxen_nic_hw_read_wx(adapter,
+               NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), &ctrl, 4))
+               printk(KERN_ERR "failed to read dma watchdog status\n");
+
+       if (netxen_get_dma_watchdog_enabled(ctrl))
+               return 1;
+
+       /* send the wakeup request */
+       netxen_set_dma_watchdog_enable_req(ctrl);
+
+       netxen_crb_writelit_adapter(adapter,
+               NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), ctrl);
+
+       return 0;
+}
+
+
 int netxen_is_flash_supported(struct netxen_adapter *adapter);
 int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, u64 mac[]);
 extern void netxen_change_ringparam(struct netxen_adapter *adapter);
index 608e37b349b4d8d1431d4f093cb40e7b66e5e098..3276866b17e2c17cc27446f42d42072b708c1687 100644 (file)
@@ -687,4 +687,6 @@ enum {
 
 #define PCIE_MAX_MASTER_SPLIT  (0x14048)
 
+#define NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL               (0x14)
+
 #endif                         /* __NETXEN_NIC_HDR_H_ */
index c012764d114578a2414132370a7752ae9d7e8656..aac15421bd1ed49dc7fbb68b84809ebd5d43ddd3 100644 (file)
@@ -377,7 +377,7 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter)
                                                   recv_crb_registers[ctx].
                                                   crb_rcvpeg_state));
                while (state != PHAN_PEG_RCV_INITIALIZED && loops < 20) {
-                       udelay(100);
+                       msleep(1);
                        /* Window 1 call */
                        state = readl(NETXEN_CRB_NORMALIZE(adapter,
                                                           recv_crb_registers
@@ -392,7 +392,11 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter)
                        return err;
                }
        }
-       DPRINTK(INFO, "Recieve Peg ready too. starting stuff\n");
+       adapter->intr_scheme = readl(
+               NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_FW));
+       printk(KERN_NOTICE "%s: FW capabilities:0x%x\n", netxen_nic_driver_name,
+                       adapter->intr_scheme);
+       DPRINTK(INFO, "Receive Peg ready too. starting stuff\n");
 
        addr = netxen_alloc(adapter->ahw.pdev,
                            sizeof(struct netxen_ring_ctx) +
@@ -697,7 +701,7 @@ void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw)
                adapter->curr_window = 0;
 }
 
-void netxen_load_firmware(struct netxen_adapter *adapter)
+int netxen_load_firmware(struct netxen_adapter *adapter)
 {
        int i;
        u32 data, size = 0;
@@ -709,15 +713,24 @@ void netxen_load_firmware(struct netxen_adapter *adapter)
        writel(1, NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CAS_RST));
 
        for (i = 0; i < size; i++) {
-               if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0) {
-                       DPRINTK(ERR,
-                               "Error in netxen_rom_fast_read(). Will skip"
-                               "loading flash image\n");
-                       return;
-               }
+               int retries = 10;
+               if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0)
+                       return -EIO;
+
                off = netxen_nic_pci_set_window(adapter, memaddr);
                addr = pci_base_offset(adapter, off);
                writel(data, addr);
+               do {
+                       if (readl(addr) == data)
+                               break;
+                       msleep(100);
+                       writel(data, addr);
+               } while (--retries);
+               if (!retries) {
+                       printk(KERN_ERR "%s: firmware load aborted, write failed at 0x%x\n",
+                                       netxen_nic_driver_name, memaddr);
+                       return -EIO;
+               }
                flashaddr += 4;
                memaddr += 4;
        }
@@ -727,7 +740,7 @@ void netxen_load_firmware(struct netxen_adapter *adapter)
               NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CHIP_CLK_CTRL));
        writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CAS_RST));
 
-       udelay(100);
+       return 0;
 }
 
 int
index bb23f4c360db39368db8681d8bb74289a5d760a7..1811bcb8c380ad53019033c7e43df01e0ff0912b 100644 (file)
@@ -139,6 +139,8 @@ int netxen_init_firmware(struct netxen_adapter *adapter)
                return err;
        }
        /* Window 1 call */
+       writel(INTR_SCHEME_PERPORT,
+              NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_HOST));
        writel(MPORT_MULTI_FUNCTION_MODE,
               NETXEN_CRB_NORMALIZE(adapter, CRB_MPORT_MODE));
        writel(PHAN_INITIALIZE_ACK,
@@ -405,10 +407,7 @@ static inline int do_rom_fast_write(struct netxen_adapter *adapter, int addr,
 static inline int
 do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp)
 {
-       if (jiffies > (last_schedule_time + (8 * HZ))) {
-               last_schedule_time = jiffies;
-               schedule();
-       }
+       cond_resched();
 
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr);
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
@@ -854,10 +853,10 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
                                netxen_nic_pci_change_crbwindow(adapter, 1);
                        }
                        if (init_delay == 1) {
-                               ssleep(1);
+                               msleep(2000);
                                init_delay = 0;
                        }
-                       msleep(1);
+                       msleep(20);
                }
                kfree(buf);
 
@@ -933,10 +932,6 @@ int netxen_initialize_adapter_offload(struct netxen_adapter *adapter)
 void netxen_free_adapter_offload(struct netxen_adapter *adapter)
 {
        if (adapter->dummy_dma.addr) {
-               writel(0, NETXEN_CRB_NORMALIZE(adapter,
-                       CRB_HOST_DUMMY_BUF_ADDR_HI));
-               writel(0, NETXEN_CRB_NORMALIZE(adapter,
-                       CRB_HOST_DUMMY_BUF_ADDR_LO));
                pci_free_consistent(adapter->ahw.pdev,
                                    NETXEN_HOST_DUMMY_DMA_SIZE,
                                    adapter->dummy_dma.addr,
@@ -945,25 +940,32 @@ void netxen_free_adapter_offload(struct netxen_adapter *adapter)
        }
 }
 
-void netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
+int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
 {
        u32 val = 0;
-       int loops = 0;
+       int retries = 30;
 
        if (!pegtune_val) {
-               val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
-               while (val != PHAN_INITIALIZE_COMPLETE && 
-                       val != PHAN_INITIALIZE_ACK && loops < 200000) {
-                       udelay(100);
-                       schedule();
-                       val =
-                           readl(NETXEN_CRB_NORMALIZE
+               do {
+                       val = readl(NETXEN_CRB_NORMALIZE
                                  (adapter, CRB_CMDPEG_STATE));
-                       loops++;
+                       pegtune_val = readl(NETXEN_CRB_NORMALIZE
+                                 (adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE));
+
+                       if (val == PHAN_INITIALIZE_COMPLETE ||
+                               val == PHAN_INITIALIZE_ACK)
+                               return 0;
+
+                       msleep(1000);
+               } while (--retries);
+               if (!retries) {
+                       printk(KERN_WARNING "netxen_phantom_init: init failed, "
+                                       "pegtune_val=%x\n", pegtune_val);
+                       return -1;
                }
-               if (val != PHAN_INITIALIZE_COMPLETE)
-                       printk("WARNING: Initial boot wait loop failed...\n");
        }
+
+       return 0;
 }
 
 int netxen_nic_rx_has_work(struct netxen_adapter *adapter)
@@ -1120,6 +1122,7 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
                adapter->stats.csummed++;
                skb->ip_summed = CHECKSUM_UNNECESSARY;
        }
+       skb->dev = netdev;
        if (desc_ctx == RCV_DESC_LRO_CTXID) {
                /* True length was only available on the last pkt */
                skb_put(skb, buffer->lro_length);
@@ -1224,6 +1227,7 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max)
                       NETXEN_CRB_NORMALIZE(adapter,
                                            recv_crb_registers[adapter->portnum].
                                            crb_rcv_status_consumer));
+               wmb();
        }
 
        return count;
@@ -1276,11 +1280,13 @@ int netxen_process_cmd_ring(unsigned long data)
                if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) {
                        pci_unmap_single(pdev, frag->dma, frag->length,
                                         PCI_DMA_TODEVICE);
+                       frag->dma = 0ULL;
                        for (i = 1; i < buffer->frag_count; i++) {
                                DPRINTK(INFO, "getting fragment no %d\n", i);
                                frag++; /* Get the next frag */
                                pci_unmap_page(pdev, frag->dma, frag->length,
                                               PCI_DMA_TODEVICE);
+                               frag->dma = 0ULL;
                        }
 
                        adapter->stats.skbfreed++;
@@ -1446,6 +1452,7 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
                        writel(msg,
                               DB_NORMALIZE(adapter,
                                            NETXEN_RCV_PRODUCER_OFFSET));
+                       wmb();
                }
        }
 }
index 6167b58d2731fea3d5941a424108e2033f98b51c..a66ff58366cfcdae2be977efd7041eaf859e2be9 100644 (file)
@@ -308,7 +308,13 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        adapter->netdev  = netdev;
        adapter->pdev    = pdev;
+
+       /* this will be read from FW later */
+       adapter->intr_scheme = -1;
+
+       /* This will be reset for mezz cards  */
        adapter->portnum = pci_func_id;
+       adapter->status   &= ~NETXEN_NETDEV_STATUS;
 
        netdev->open               = netxen_nic_open;
        netdev->stop               = netxen_nic_close;
@@ -336,11 +342,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (pci_using_dac)
                netdev->features |= NETIF_F_HIGHDMA;
 
-       if (pci_enable_msi(pdev)) {
+       if (pci_enable_msi(pdev))
                adapter->flags &= ~NETXEN_NIC_MSI_ENABLED;
-               printk(KERN_WARNING "%s: unable to allocate MSI interrupt"
-                      " error\n", netxen_nic_driver_name);
-       } else
+       else
                adapter->flags |= NETXEN_NIC_MSI_ENABLED;
 
        netdev->irq = pdev->irq;
@@ -355,13 +359,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* initialize the adapter */
        netxen_initialize_adapter_hw(adapter);
 
-#ifdef CONFIG_PPC
-       if ((adapter->ahw.boardcfg.board_type ==
-               NETXEN_BRDTYPE_P2_SB31_10G_IMEZ) &&
-                       (pci_func_id == 2))
-                   goto err_out_free_adapter;
-#endif /* CONFIG_PPC */
-
        /*
         *  Adapter in our case is quad port so initialize it before
         *  initializing the ports
@@ -509,22 +506,30 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                                        NETXEN_CAM_RAM(0x1fc)));
                if (val == 0x55555555) {
                    /* This is the first boot after power up */
+                   netxen_nic_read_w0(adapter, NETXEN_PCIE_REG(0x4), &val);
+                       if (!(val & 0x4)) {
+                               val |= 0x4;
+                               netxen_nic_write_w0(adapter, NETXEN_PCIE_REG(0x4), val);
+                               netxen_nic_read_w0(adapter, NETXEN_PCIE_REG(0x4), &val);
+                               if (!(val & 0x4))
+                                       printk(KERN_ERR "%s: failed to set MSI bit in PCI-e reg\n",
+                                                       netxen_nic_driver_name);
+                       }
                    val = readl(NETXEN_CRB_NORMALIZE(adapter,
                                        NETXEN_ROMUSB_GLB_SW_RESET));
                    printk(KERN_INFO"NetXen: read 0x%08x for reset reg.\n",val);
                    if (val != 0x80000f) {
                        /* clear the register for future unloads/loads */
-                       writel(0, NETXEN_CRB_NORMALIZE(adapter,
-                                               NETXEN_CAM_RAM(0x1fc)));
-                       printk(KERN_ERR "ERROR in NetXen HW init sequence.\n");
-                       err = -ENODEV;
-                       goto err_out_free_dev;
+                               writel(0, NETXEN_CRB_NORMALIZE(adapter,
+                                                       NETXEN_CAM_RAM(0x1fc)));
+                               printk(KERN_ERR "ERROR in NetXen HW init sequence.\n");
+                               err = -ENODEV;
+                               goto err_out_free_dev;
                    }
-
-                   /* clear the register for future unloads/loads */
-                   writel(0, NETXEN_CRB_NORMALIZE(adapter, 
-                                           NETXEN_CAM_RAM(0x1fc)));
                }
+
+               /* clear the register for future unloads/loads */
+               writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc)));
                printk(KERN_INFO "State: 0x%0x\n",
                        readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)));
 
@@ -542,13 +547,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                                NETXEN_ROMUSB_GLB_PEGTUNE_DONE));
                /* Handshake with the card before we register the devices. */
                netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
-
-              /* leave the hw in the same state as reboot */
-              writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
-              netxen_pinit_from_rom(adapter, 0);
-              udelay(500);
-              netxen_load_firmware(adapter);
-              netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
        }
 
        /*
@@ -639,8 +637,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
        struct netxen_rx_buffer *buffer;
        struct netxen_recv_context *recv_ctx;
        struct netxen_rcv_desc_ctx *rcv_desc;
-       int i;
-       int ctxid, ring;
+       int i, ctxid, ring;
+       static int init_firmware_done = 0;
 
        adapter = pci_get_drvdata(pdev);
        if (adapter == NULL)
@@ -648,30 +646,20 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
 
        netdev = adapter->netdev;
 
-       netxen_nic_disable_int(adapter);
-       if (adapter->irq)
-               free_irq(adapter->irq, adapter);
-       
+       unregister_netdev(netdev);
+
        if (adapter->stop_port)
                adapter->stop_port(adapter);
 
-       if ((adapter->flags & NETXEN_NIC_MSI_ENABLED))
-               pci_disable_msi(pdev);
-
-       if (adapter->portnum == 0)
-               netxen_free_adapter_offload(adapter);
+       netxen_nic_disable_int(adapter);
 
-       if(adapter->portnum == 0) {
-               /* leave the hw in the same state as reboot */
-               writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
-               netxen_pinit_from_rom(adapter, 0);
-               udelay(500);
-               netxen_load_firmware(adapter);
-               netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
-       }
+       if (adapter->irq)
+               free_irq(adapter->irq, adapter);
 
-       if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC)
+       if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
+               init_firmware_done++;
                netxen_free_hw_resources(adapter);
+       }
 
        for (ctxid = 0; ctxid < MAX_RCV_CTX; ++ctxid) {
                recv_ctx = &adapter->recv_ctx[ctxid];
@@ -691,17 +679,73 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
                }
        }
 
-       unregister_netdev(netdev);
+       if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
+               pci_disable_msi(pdev);
 
        vfree(adapter->cmd_buf_arr);
 
+       pci_disable_device(pdev);
+
+       if (adapter->portnum == 0) {
+               if (init_firmware_done) {
+                       dma_watchdog_shutdown_request(adapter);
+                       msleep(100);
+                       i = 100;
+                       while ((dma_watchdog_shutdown_poll_result(adapter) != 1) && i) {
+                               printk(KERN_INFO "dma_watchdog_shutdown_poll still in progress\n");
+                               msleep(100);
+                               i--;
+                       }
+
+                       if (i == 0) {
+                               printk(KERN_ERR "dma_watchdog_shutdown_request failed\n");
+                               return;
+                       }
+
+                       /* clear the register for future unloads/loads */
+                       writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc)));
+                       printk(KERN_INFO "State: 0x%0x\n",
+                               readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)));
+
+                       /* leave the hw in the same state as reboot */
+                       writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
+                       if (netxen_pinit_from_rom(adapter, 0))
+                               return;
+                       msleep(1);
+                       if (netxen_load_firmware(adapter))
+                               return;
+                       netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
+               }
+
+               /* clear the register for future unloads/loads */
+               writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc)));
+               printk(KERN_INFO "State: 0x%0x\n",
+                       readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)));
+
+               dma_watchdog_shutdown_request(adapter);
+               msleep(100);
+               i = 100;
+               while ((dma_watchdog_shutdown_poll_result(adapter) != 1) && i) {
+                       printk(KERN_INFO "dma_watchdog_shutdown_poll still in progress\n");
+                       msleep(100);
+                       i--;
+               }
+
+               if (i) {
+                       netxen_free_adapter_offload(adapter);
+               } else {
+                       printk(KERN_ERR "failed to dma shutdown\n");
+                       return;
+               }
+
+       }
+
        iounmap(adapter->ahw.db_base);
        iounmap(adapter->ahw.pci_base0);
        iounmap(adapter->ahw.pci_base1);
        iounmap(adapter->ahw.pci_base2);
 
        pci_release_regions(pdev);
-       pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
 
        free_netdev(netdev);
@@ -798,7 +842,7 @@ static int netxen_nic_close(struct net_device *netdev)
                if (buffrag->dma) {
                        pci_unmap_single(adapter->pdev, buffrag->dma,
                                         buffrag->length, PCI_DMA_TODEVICE);
-                       buffrag->dma = (u64) NULL;
+                       buffrag->dma = 0ULL;
                }
                for (j = 0; j < cmd_buff->frag_count; j++) {
                        buffrag++;
@@ -806,7 +850,7 @@ static int netxen_nic_close(struct net_device *netdev)
                                pci_unmap_page(adapter->pdev, buffrag->dma,
                                               buffrag->length, 
                                               PCI_DMA_TODEVICE);
-                               buffrag->dma = (u64) NULL;
+                               buffrag->dma = 0ULL;
                        }
                }
                /* Free the skb we received in netxen_nic_xmit_frame */
@@ -816,8 +860,10 @@ static int netxen_nic_close(struct net_device *netdev)
                }
                cmd_buff++;
        }
-       FLUSH_SCHEDULED_WORK();
-       del_timer_sync(&adapter->watchdog_timer);
+       if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
+               FLUSH_SCHEDULED_WORK();
+               del_timer_sync(&adapter->watchdog_timer);
+       }
 
        return 0;
 }
@@ -1103,28 +1149,26 @@ static int
 netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev)
 {
        u32 ret = 0;
+       u32 our_int = 0;
 
        DPRINTK(INFO, "Entered handle ISR\n");
        adapter->stats.ints++;
 
        if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
-               int count = 0;
-               u32 mask;
-               u32 our_int = 0;
                our_int = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
                /* not our interrupt */
                if ((our_int & (0x80 << adapter->portnum)) == 0)
                        return ret;
-               netxen_nic_disable_int(adapter);
-               /* Window = 0 or 1 */
-               do {
-                       writel(0xffffffff, PCI_OFFSET_SECOND_RANGE(adapter,
-                                               ISR_INT_TARGET_STATUS));
-                       mask = readl(pci_base_offset(adapter, ISR_INT_VECTOR));
-               } while (((mask & 0x80) != 0) && (++count < 32));
-               if ((mask & 0x80) != 0)
-                       printk("Could not disable interrupt completely\n");
+       }
 
+       netxen_nic_disable_int(adapter);
+
+       if (adapter->intr_scheme == INTR_SCHEME_PERPORT) {
+               /* claim interrupt */
+               if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
+                       writel(our_int & ~((u32)(0x80 << adapter->portnum)),
+                       NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
+               }
        }
 
        if (netxen_nic_rx_has_work(adapter) || netxen_nic_tx_has_work(adapter)) {
@@ -1136,7 +1180,7 @@ netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev)
                } else {
                        static unsigned int intcount = 0;
                        if ((++intcount & 0xfff) == 0xfff)
-                               printk(KERN_ERR
+                               DPRINTK(KERN_ERR
                                       "%s: %s interrupt %d while in poll\n",
                                       netxen_nic_driver_name, netdev->name,
                                       intcount);
@@ -1258,6 +1302,7 @@ static void __exit netxen_exit_module(void)
        /*
         * Wait for some time to allow the dma to drain, if any.
         */
+       msleep(100);
        pci_unregister_driver(&netxen_driver);
        destroy_workqueue(netxen_workq);
 }
index 9457fc7249c86ed77fc9bdf367be152ea2fa0ac2..10fe6fafa6f6cee24c92fdf69e1fca3806fc7540 100644 (file)
 #define CRB_V2P_3                  NETXEN_NIC_REG(0x29c)
 #define CRB_V2P(port)              (CRB_V2P_0+((port)*4))
 #define CRB_DRIVER_VERSION         NETXEN_NIC_REG(0x2a0)
+/* sw int status/mask registers */
+#define CRB_SW_INT_MASK_0         NETXEN_NIC_REG(0x1d8)
+#define CRB_SW_INT_MASK_1         NETXEN_NIC_REG(0x1e0)
+#define CRB_SW_INT_MASK_2         NETXEN_NIC_REG(0x1e4)
+#define CRB_SW_INT_MASK_3         NETXEN_NIC_REG(0x1e8)
+
+/*
+ * capabilities register, can be used to selectively enable/disable features
+ * for backward compability
+ */
+#define CRB_NIC_CAPABILITIES_HOST      NETXEN_NIC_REG(0x1a8)
+#define CRB_NIC_CAPABILITIES_FW                NETXEN_NIC_REG(0x1dc)
+
+#define INTR_SCHEME_PERPORT            0x1
 
 /* used for ethtool tests */
 #define CRB_SCRATCHPAD_TEST        NETXEN_NIC_REG(0x280)
index 717d8e9b98332ab4a59256079005c3560cedb141..104aab3c957f684edd3f751f86db89a89b5052a3 100644 (file)
@@ -1831,11 +1831,13 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_
 
        ndev = alloc_etherdev(sizeof(struct ns83820));
        dev = PRIV(ndev);
-       dev->ndev = ndev;
+
        err = -ENOMEM;
        if (!dev)
                goto out;
 
+       dev->ndev = ndev;
+
        spin_lock_init(&dev->rx_info.lock);
        spin_lock_init(&dev->tx_lock);
        spin_lock_init(&dev->misc_lock);
index 143ae2ff309e3ef539a0c9cc2ba6071a00158de9..503f2685fb73c434ae4a2d6d98be4f03a3d4b7d9 100644 (file)
@@ -629,9 +629,9 @@ static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
        outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
     }
 
-    dev_kfree_skb(skb);
     pop_tx_status(dev);
     spin_unlock_irqrestore(&priv->lock, flags);    
+    dev_kfree_skb(skb);
     
     return 0;
 }
index 9d6e454a8f9869f2b65b5a97ca54de0252afd6c9..786d4b9c07ecac39aab21fa877e8a63144981a1c 100644 (file)
@@ -152,7 +152,7 @@ static int full_duplex[MAX_UNITS] = {0, };
  * This SUCKS.
  * We need a much better method to determine if dma_addr_t is 64-bit.
  */
-#if (defined(__i386__) && defined(CONFIG_HIGHMEM64G)) || defined(__x86_64__) || defined (__ia64__) || defined(__mips64__) || (defined(__mips__) && defined(CONFIG_HIGHMEM) && defined(CONFIG_64BIT_PHYS_ADDR))
+#if (defined(__i386__) && defined(CONFIG_HIGHMEM64G)) || defined(__x86_64__) || defined (__ia64__) || defined(__alpha__) || defined(__mips64__) || (defined(__mips__) && defined(CONFIG_HIGHMEM) && defined(CONFIG_64BIT_PHYS_ADDR))
 /* 64-bit dma_addr_t */
 #define ADDR_64BITS    /* This chip uses 64 bit addresses. */
 #define netdrv_addr_t u64
index 675ac99a79c6174bfd3f87f8b2b27f23e29417bf..a42acc3cc60983233b2a57d92512abcc9918fa60 100644 (file)
@@ -144,14 +144,14 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
                         * modem interface from an RNDIS non-modem.
                         */
                        if (rndis) {
-                               struct usb_cdc_acm_descriptor *d;
+                               struct usb_cdc_acm_descriptor *acm;
 
-                               d = (void *) buf;
-                               if (d->bmCapabilities) {
+                               acm = (void *) buf;
+                               if (acm->bmCapabilities) {
                                        dev_dbg(&intf->dev,
                                                "ACM capabilities %02x, "
                                                "not really RNDIS?\n",
-                                               d->bmCapabilities);
+                                               acm->bmCapabilities);
                                        goto bad_desc;
                                }
                        }
index a67638601477f8801dbf8e5c18ea35e5f476a86a..16c7a0e878505a7b229817012de9e3f2b3eab50c 100644 (file)
@@ -414,18 +414,16 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
        dev->mii.reg_num_mask = 0x1f;
 
        /* reset */
-       ret = dm_write_reg(dev, DM_NET_CTRL, 1);
+       dm_write_reg(dev, DM_NET_CTRL, 1);
        udelay(20);
 
        /* read MAC */
-       ret = dm_read(dev, DM_PHY_ADDR, ETH_ALEN, dev->net->dev_addr);
-       if (ret < 0) {
+       if (dm_read(dev, DM_PHY_ADDR, ETH_ALEN, dev->net->dev_addr) < 0) {
                printk(KERN_ERR "Error reading MAC address\n");
                ret = -ENODEV;
                goto out;
        }
 
-
        /* power up phy */
        dm_write_reg(dev, DM_GPR_CTRL, 1);
        dm_write_reg(dev, DM_GPR_DATA, 0);
@@ -489,6 +487,8 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
           b3..n: packet data
        */
 
+       len = skb->len;
+
        if (skb_headroom(skb) < DM_TX_OVERHEAD) {
                struct sk_buff *skb2;
 
@@ -501,10 +501,9 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
 
        __skb_push(skb, DM_TX_OVERHEAD);
 
-       len = skb->len;
        /* usbnet adds padding if length is a multiple of packet size
           if so, adjust length value in header */
-       if ((len % dev->maxpacket) == 0)
+       if ((skb->len % dev->maxpacket) == 0)
                len++;
 
        skb->data[0] = len;
index 5b16d9a1269a2851e3f8982b23f835c256044ba7..a12f576391cf3150d2716b040e6bc06d1eb93844 100644 (file)
@@ -953,11 +953,14 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
        /* don't assume the hardware handles USB_ZERO_PACKET
         * NOTE:  strictly conforming cdc-ether devices should expect
         * the ZLP here, but ignore the one-byte packet.
-        *
-        * FIXME zero that byte, if it doesn't require a new skb.
         */
-       if ((length % dev->maxpacket) == 0)
+       if ((length % dev->maxpacket) == 0) {
                urb->transfer_buffer_length++;
+               if (skb_tailroom(skb)) {
+                       skb->data[skb->len] = 0;
+                       __skb_put(skb, 1);
+               }
+       }
 
        spin_lock_irqsave (&dev->txq.lock, flags);
 
index a1097f59fd4667241e3a2331de83b9ec06dbb41a..32ed4136b0d482256ae855cb005f6da28cbb1f49 100644 (file)
@@ -2,7 +2,7 @@ libertas-objs := main.o fw.o wext.o \
                rx.o tx.o cmd.o           \
                cmdresp.o scan.o          \
                join.o 11d.o              \
-               ioctl.o debugfs.o         \
+               debugfs.o         \
                ethtool.o assoc.o
 
 usb8xxx-objs += if_bootcmd.o
index 1f92f50b643c7a9eac13d1eda1d7a601dace886f..0b133ce6380541069b1c69ffd79641c8ec9eb301 100644 (file)
@@ -28,281 +28,6 @@ DRIVER LOADING
 
                insmod usb8388.ko [fw_name=usb8388.bin]
 
-=====================
-IWPRIV COMMAND
-=====================
-
-NAME
-       This manual describes the usage of private commands used in Marvell WLAN
-       Linux Driver. All the commands available in Wlanconfig will not be available
-       in the iwpriv.
-
-SYNOPSIS
-       iwpriv <ethX> <command> [sub-command] ...
-
-       iwpriv ethX setregioncode <n>
-       iwpriv ethX getregioncode
-
-Version 5 Command:
-       iwpriv ethX ledgpio <n>
-
-BT Commands:
-       The blinding table (BT) contains a list of mac addresses that will be,
-       by default, ignored by the firmware. It is also possible to invert this
-       behavior so that we will ignore all traffic except for the portion
-       coming from mac addresess in the list. It is primarily used for
-       debugging and testing networks.  It can be edited and inspected with
-       the following commands:
-
-       iwpriv ethX bt_reset
-       iwpriv ethX bt_add <mac_address>
-       iwpriv ethX bt_del <mac_address>
-       iwpriv ethX bt_list <id>
-       iwpriv ethX bt_get_invert <n>
-       iwpriv ethX bt_set_invert <n>
-
-FWT Commands:
-       The forwarding table (FWT) is a feature used to manage mesh network
-       routing in the firmware.  The FWT is essentially a routing table that
-       associates a destination mac address (da) with a next hop receiver
-       address (ra).  The FWT can be inspected and edited with the following
-       iwpriv commands, which are described in greater detail below.
-       Eventually, the table will be automatically maintained by a custom
-       routing protocol.
-
-       NOTE: FWT commands replace the previous DFT commands.  What were the DFT
-       commands?, you might ask.  They were an earlier API to the firmware that
-       implemented a simple MAC-layer forwarding mechanism.  In the unlikely
-       event that you were using these commands, you must migrate to the new
-       FWT commands which can be used to achieve the same functionality.
-
-       iwpriv ethX fwt_add [parameters]
-       iwpriv ethX fwt_del [parameters]
-       iwpriv ethX fwt_lookup [parameters]
-       iwpriv ethX fwt_list [parameters]
-       iwpriv ethX fwt_list_route [parameters]
-       iwpriv ethX fwt_list_neigh [parameters]
-       iwpriv ethX fwt_reset [parameters]
-       iwpriv ethX fwt_cleanup
-       iwpriv ethX fwt_time
-
-MESH Commands:
-
-       The MESH commands are used to configure various features of the mesh
-       routing protocol.  The following commands are supported:
-
-       iwpriv ethX mesh_get_ttl
-       iwpriv ethX mesh_set_ttl ttl
-
-DESCRIPTION
-       Those commands are used to send additional commands to the Marvell WLAN
-       card via the Linux device driver.
-
-       The ethX parameter specifies the network device that is to be used to
-               perform this command on. it could be eth0, eth1 etc.
-
-setregioncode
-       This command is used to set the region code in the station.
-       where value is 'region code' for various regions like
-       USA FCC, Canada IC, Spain, France, Europe ETSI, Japan ...
-
-       Usage:
-               iwpriv ethX setregioncode 0x10: set region code to USA (0x10).
-
-getregioncode
-       This command is used to get the region code information set in the
-       station.
-
-ledgpio
-       This command is used to set/get LEDs.
-
-       iwpriv ethX ledgpio <LEDs>
-               will set the corresponding LED for the GPIO Line.
-
-       iwpriv ethX ledgpio
-               will give u which LEDs are Enabled.
-
-       Usage:
-               iwpriv eth1 ledgpio 1 0 2 1 3 4
-                       will enable
-                       LED 1 -> GPIO 0
-                       LED 2 -> GPIO 1
-                       LED 3 -> GPIO 4
-
-               iwpriv eth1 ledgpio
-                       shows LED information in the format as mentioned above.
-
-       Note: LED0 is invalid
-       Note: Maximum Number of LEDs are 16.
-
-fwt_add
-       This command is used to insert an entry into the FWT table. The list of
-       parameters must follow the following structure:
-
-       iwpriv ethX fwt_add da ra [metric dir rate ssn dsn hopcount ttl expiration sleepmode snr]
-
-       The parameters between brackets are optional, but they must appear in
-       the order specified.  For example, if you want to specify the metric,
-       you must also specify the dir, ssn, and dsn but you need not specify the
-       hopcount, expiration, sleepmode, or snr.  Any unspecified parameters
-       will be assigned the defaults specified below.
-
-       The different parameters are:-
-               da              -- DA MAC address in the form 00:11:22:33:44:55
-               ra              -- RA MAC address in the form 00:11:22:33:44:55
-               metric          -- route metric (cost: smaller-metric routes are
-                                  preferred, default is 0)
-               dir             -- direction (1 for direct, 0 for reverse,
-                                  default is 1)
-               rate            -- data rate used for transmission to the RA,
-                                  as specified for the rateadapt command,
-                                  default is 3 (11Mbps)
-               ssn             -- Source Sequence Number (time at the RA for
-                                  reverse routes.  Default is 0)
-               dsn             -- Destination Sequence Number (time at the DA
-                                  for direct routes.  Default is 0)
-               hopcount        -- hop count (currently unused, default is 0)
-               ttl             -- TTL (Only used in reverse entries)
-               expiration      -- entry expiration (in ticks, where a tick is
-                                  1024us, or ~ 1ms. Use 0 for an indefinite
-                                  entry, default is 0)
-               sleepmode       -- RA's sleep mode (currently unused, default is
-                                  0)
-               snr             -- SNR in the link to RA (currently unused,
-                                  default is 0)
-
-       The command does not return anything.
-
-fwt_del
-       This command is used to remove an entry to the FWT table. The list of
-       parameters must follow the following structure:
-
-               iwpriv ethX fwt_del da ra [dir]
-
-       where the different parameters are:-
-               da              -- DA MAC address (in the form "00:11:22:33:44:55")
-               ra              -- RA MAC address (in the form "00:11:22:33:44:55")
-               dir             -- direction (1 for direct, 0 for reverse,
-                                  default is 1)
-
-       The command does not return anything.
-
-fwt_lookup
-       This command is used to get the best route in the FWT table to a given
-       host. The only parameter is the MAC address of the host that is being
-       looked for.
-
-               iwpriv ethX fwt_lookup da
-
-       where:-
-               da              -- DA MAC address (in the form "00:11:22:33:44:55")
-
-       The command returns an output string identical to the one returned by
-       fwt_list described below.
-
-
-fwt_list
-       This command is used to list a route from the FWT table. The only
-       parameter is the index into the table. If you want to list all the
-       routes in a table, start with index=0, and keep listing until you get a
-       "(null)" string.  Note that the indicies may change as the fwt is
-       updated.  It is expected that most users will not use fwt_list directly,
-       but that a utility similar to the traditional route command will be used
-       to invoke fwt_list over and over.
-
-               iwpriv ethX fwt_list index
-
-       The output is a string of the following form:
-
-               da ra valid metric dir rate ssn dsn hopcount ttl expiration
-               sleepmode snr precursor
-
-       where the different fields are:-
-               da              -- DA MAC address (in the form "00:11:22:33:44:55")
-               ra              -- RA MAC address (in the form "00:11:22:33:44:55")
-               valid           -- whether the route is valid (0 if not valid)
-               metric          -- route metric (cost: smaller-metric routes are preferred)
-               dir             -- direction (1 for direct, 0 for reverse)
-               rate            -- data rate used for transmission to the RA,
-                                  as specified for the rateadapt command
-               ssn             -- Source Sequence Number (time at the RA for reverse routes)
-               dsn             -- Destination Sequence Number (time at the DA for direct routes)
-               hopcount        -- hop count (currently unused)
-               ttl             -- TTL (only used in reverse entries)
-               expiration      -- entry expiration (in ticks, where a tick is 1024us, or ~ 1ms. Use 0 for an indefinite entry)
-               sleepmode       -- RA's sleep mode (currently unused)
-               snr             -- SNR in the link to RA (currently unused)
-               precursor       -- predecessor in direct routes
-
-fwt_list_route
-       This command is equivalent to fwt_list.
-
-fwt_list_neigh
-       This command is used to list a neighbor from the FWT table. The only
-       parameter is the neighbor ID. If you want to list all the neighbors in a
-       table, start with nid=0, and keep incrementing nid until you get a
-       "(null)" string.  Note that the nid from a fwt_list_route command can be
-       used as an input to this command.  Also note that this command is meant
-       mostly for debugging.  It is expected that users will use fwt_lookup.
-       One important reason for this is that the neighbor id may change as the
-       neighbor table is altered.
-
-               iwpriv ethX fwt_list_neigh nid
-
-       The output is a string of the following form:
-
-               ra sleepmode snr references
-
-       where the different fields are:-
-               ra              -- RA MAC address (in the form "00:11:22:33:44:55")
-               sleepmode       -- RA's sleep mode (currently unused)
-               snr             -- SNR in the link to RA (currently unused)
-               references      -- RA's reference counter
-
-fwt_reset
-       This command is used to reset the FWT table, getting rid of all the
-       entries. There are no input parameters.
-
-               iwpriv ethX fwt_reset
-
-       The command does not return anything.
-
-fwt_cleanup
-       This command is used to perform user-based garbage recollection. The
-       FWT table is checked, and all the entries that are expired or invalid
-       are cleaned. Note that this is exported to the driver for debugging
-       purposes, as garbage collection is also fired by the firmware when in
-       space problems. There are no input parameters.
-
-               iwpriv ethX fwt_cleanup
-
-       The command does returns the number of invalid/expired routes deleted.
-
-fwt_time
-       This command returns a card's internal time representation.  It is this
-       time that is used to represent the expiration times of FWT entries.  The
-       number is not consistent from card to card; it is simply a timer count.
-       The fwt_time command is used to inspect the timer so that expiration
-       times reported by fwt_list can be properly interpreted.
-
-               iwpriv ethX fwt_time
-
-mesh_get_ttl
-
-       The mesh ttl is the number of hops a mesh packet can traverse before it
-       is dropped.  This parameter is used to prevent infinite loops in the
-       mesh network.  The value returned by this function is the ttl assigned
-       to all mesh packets.  Currently there is no way to control the ttl on a
-       per packet or per socket basis.
-
-       iwpriv ethX mesh_get_ttl
-
-mesh_set_ttl ttl
-
-       Set the ttl.  The argument must be between 0 and 255.
-
-       iwpriv ethX mesh_set_ttl <ttl>
-
 =========================
 ETHTOOL
 =========================
index f67efa0815fe0f5b7fe5905f708eae0e8c2014da..afd5617dd92b9e1cce0bf51612ac4a5843344333 100644 (file)
@@ -323,6 +323,8 @@ static int assoc_helper_secinfo(wlan_private *priv,
 {
        wlan_adapter *adapter = priv->adapter;
        int ret = 0;
+       u32 do_wpa;
+       u32 rsn = 0;
 
        lbs_deb_enter(LBS_DEB_ASSOC);
 
@@ -333,12 +335,34 @@ static int assoc_helper_secinfo(wlan_private *priv,
        if (ret)
                goto out;
 
-       /* enable/disable RSN */
+       /* If RSN is already enabled, don't try to enable it again, since
+        * ENABLE_RSN resets internal state machines and will clobber the
+        * 4-way WPA handshake.
+        */
+
+       /* Get RSN enabled/disabled */
        ret = libertas_prepare_and_send_command(priv,
                                    cmd_802_11_enable_rsn,
                                    cmd_act_set,
                                    cmd_option_waitforrsp,
-                                   0, assoc_req);
+                                   0, &rsn);
+       if (ret) {
+               lbs_deb_assoc("Failed to get RSN status: %d", ret);
+               goto out;
+       }
+
+       /* Don't re-enable RSN if it's already enabled */
+       do_wpa = (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled);
+       if (do_wpa == rsn)
+               goto out;
+
+       /* Set RSN enabled/disabled */
+       rsn = do_wpa;
+       ret = libertas_prepare_and_send_command(priv,
+                                   cmd_802_11_enable_rsn,
+                                   cmd_act_set,
+                                   cmd_option_waitforrsp,
+                                   0, &rsn);
 
 out:
        lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
index 124e029f1bf412105d0f02e643be55c9cb1ffc71..13f6528abb00d22370eff0626b1927bcedca79aa 100644 (file)
@@ -228,17 +228,19 @@ static int wlan_cmd_802_11_enable_rsn(wlan_private * priv,
                                      void * pdata_buf)
 {
        struct cmd_ds_802_11_enable_rsn *penableRSN = &cmd->params.enbrsn;
-       struct assoc_request * assoc_req = pdata_buf;
+       u32 * enable = pdata_buf;
 
        lbs_deb_enter(LBS_DEB_CMD);
 
        cmd->command = cpu_to_le16(cmd_802_11_enable_rsn);
        cmd->size = cpu_to_le16(sizeof(*penableRSN) + S_DS_GEN);
        penableRSN->action = cpu_to_le16(cmd_action);
-       if (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled) {
-               penableRSN->enable = cpu_to_le16(cmd_enable_rsn);
-       } else {
-               penableRSN->enable = cpu_to_le16(cmd_disable_rsn);
+
+       if (cmd_action == cmd_act_set) {
+               if (*enable)
+                       penableRSN->enable = cpu_to_le16(cmd_enable_rsn);
+               else
+                       penableRSN->enable = cpu_to_le16(cmd_enable_rsn);
        }
 
        lbs_deb_leave(LBS_DEB_CMD);
index 0c3b9a583d83cab84b4d44eb5e0d625a59b3f9d5..6ac0d4752fa493a293f992308a301e478a08c88e 100644 (file)
@@ -537,6 +537,24 @@ static int wlan_ret_get_log(wlan_private * priv,
        return 0;
 }
 
+static int libertas_ret_802_11_enable_rsn(wlan_private * priv,
+                                          struct cmd_ds_command *resp)
+{
+       struct cmd_ds_802_11_enable_rsn *enable_rsn = &resp->params.enbrsn;
+       wlan_adapter *adapter = priv->adapter;
+       u32 * pdata_buf = adapter->cur_cmd->pdata_buf;
+
+       lbs_deb_enter(LBS_DEB_CMD);
+
+       if (enable_rsn->action == cpu_to_le16(cmd_act_get)) {
+               if (pdata_buf)
+                       *pdata_buf = (u32) le16_to_cpu(enable_rsn->enable);
+       }
+
+       lbs_deb_enter(LBS_DEB_CMD);
+       return 0;
+}
+
 static inline int handle_cmd_response(u16 respcmd,
                                      struct cmd_ds_command *resp,
                                      wlan_private *priv)
@@ -610,7 +628,10 @@ static inline int handle_cmd_response(u16 respcmd,
        case cmd_ret_802_11_authenticate:
        case cmd_ret_802_11_radio_control:
        case cmd_ret_802_11_beacon_stop:
+               break;
+
        case cmd_ret_802_11_enable_rsn:
+               ret = libertas_ret_802_11_enable_rsn(priv, resp);
                break;
 
        case cmd_ret_802_11_data_rate:
index 3acf93988125696de779207893aa17f8a3d747fd..09b898f6719c2193d8d9dfe14d9b124b94154911 100644 (file)
@@ -503,7 +503,7 @@ struct cmd_ds_802_11_ad_hoc_join {
 struct cmd_ds_802_11_enable_rsn {
        __le16 action;
        __le16 enable;
-};
+} __attribute__ ((packed));
 
 struct MrvlIEtype_keyParamSet {
        /* type ID */
diff --git a/drivers/net/wireless/libertas/ioctl.c b/drivers/net/wireless/libertas/ioctl.c
deleted file mode 100644 (file)
index f410815..0000000
+++ /dev/null
@@ -1,1081 +0,0 @@
-/**
-  * This file contains ioctl functions
-  */
-
-#include <linux/ctype.h>
-#include <linux/delay.h>
-#include <linux/if.h>
-#include <linux/if_arp.h>
-#include <linux/wireless.h>
-
-#include <net/iw_handler.h>
-#include <net/ieee80211.h>
-
-#include "host.h"
-#include "radiotap.h"
-#include "decl.h"
-#include "defs.h"
-#include "dev.h"
-#include "join.h"
-#include "wext.h"
-
-#define MAX_SCAN_CELL_SIZE      (IW_EV_ADDR_LEN + \
-                               IW_ESSID_MAX_SIZE + \
-                               IW_EV_UINT_LEN + IW_EV_FREQ_LEN + \
-                               IW_EV_QUAL_LEN + IW_ESSID_MAX_SIZE + \
-                               IW_EV_PARAM_LEN + 40)   /* 40 for WPAIE */
-
-#define WAIT_FOR_SCAN_RRESULT_MAX_TIME (10 * HZ)
-
-static int wlan_set_region(wlan_private * priv, u16 region_code)
-{
-       int i;
-       int ret = 0;
-
-       for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
-               // use the region code to search for the index
-               if (region_code == libertas_region_code_to_index[i]) {
-                       priv->adapter->regiontableindex = (u16) i;
-                       priv->adapter->regioncode = region_code;
-                       break;
-               }
-       }
-
-       // if it's unidentified region code
-       if (i >= MRVDRV_MAX_REGION_CODE) {
-               lbs_deb_ioctl("region Code not identified\n");
-               ret = -1;
-               goto done;
-       }
-
-       if (libertas_set_regiontable(priv, priv->adapter->regioncode, 0)) {
-               ret = -EINVAL;
-       }
-
-done:
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-static inline int hex2int(char c)
-{
-       if (c >= '0' && c <= '9')
-               return (c - '0');
-       if (c >= 'a' && c <= 'f')
-               return (c - 'a' + 10);
-       if (c >= 'A' && c <= 'F')
-               return (c - 'A' + 10);
-       return -1;
-}
-
-/* Convert a string representation of a MAC address ("xx:xx:xx:xx:xx:xx")
-   into binary format (6 bytes).
-
-   This function expects that each byte is represented with 2 characters
-   (e.g., 11:2:11:11:11:11 is invalid)
-
- */
-static char *eth_str2addr(char *ethstr, u8 * addr)
-{
-       int i, val, val2;
-       char *pos = ethstr;
-
-       /* get rid of initial blanks */
-       while (*pos == ' ' || *pos == '\t')
-               ++pos;
-
-       for (i = 0; i < 6; i++) {
-               val = hex2int(*pos++);
-               if (val < 0)
-                       return NULL;
-               val2 = hex2int(*pos++);
-               if (val2 < 0)
-                       return NULL;
-               addr[i] = (val * 16 + val2) & 0xff;
-
-               if (i < 5 && *pos++ != ':')
-                       return NULL;
-       }
-       return pos;
-}
-
-/* this writes xx:xx:xx:xx:xx:xx into ethstr
-   (ethstr must have space for 18 chars) */
-static int eth_addr2str(u8 * addr, char *ethstr)
-{
-       int i;
-       char *pos = ethstr;
-
-       for (i = 0; i < 6; i++) {
-               sprintf(pos, "%02x", addr[i] & 0xff);
-               pos += 2;
-               if (i < 5)
-                       *pos++ = ':';
-       }
-       return 17;
-}
-
-/**
- *  @brief          Add an entry to the BT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_add_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char ethaddrs_str[18];
-       char *pos;
-       u8 ethaddr[ETH_ALEN];
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(ethaddrs_str, wrq->u.data.pointer,
-                          sizeof(ethaddrs_str)))
-               return -EFAULT;
-
-       if ((pos = eth_str2addr(ethaddrs_str, ethaddr)) == NULL) {
-               lbs_pr_info("BT_ADD: Invalid MAC address\n");
-               return -EINVAL;
-       }
-
-       lbs_deb_ioctl("BT: adding %s\n", ethaddrs_str);
-       ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
-                                     cmd_act_bt_access_add,
-                                     cmd_option_waitforrsp, 0, ethaddr);
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-/**
- *  @brief          Delete an entry from the BT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_del_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char ethaddrs_str[18];
-       u8 ethaddr[ETH_ALEN];
-       char *pos;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(ethaddrs_str, wrq->u.data.pointer,
-                          sizeof(ethaddrs_str)))
-               return -EFAULT;
-
-       if ((pos = eth_str2addr(ethaddrs_str, ethaddr)) == NULL) {
-               lbs_pr_info("Invalid MAC address\n");
-               return -EINVAL;
-       }
-
-       lbs_deb_ioctl("BT: deleting %s\n", ethaddrs_str);
-
-       return (libertas_prepare_and_send_command(priv,
-                                     cmd_bt_access,
-                                     cmd_act_bt_access_del,
-                                     cmd_option_waitforrsp, 0, ethaddr));
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Reset all entries from the BT table
- *  @param priv     A pointer to wlan_private structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_reset_ioctl(wlan_private * priv)
-{
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       lbs_pr_alert( "BT: resetting\n");
-
-       return (libertas_prepare_and_send_command(priv,
-                                     cmd_bt_access,
-                                     cmd_act_bt_access_reset,
-                                     cmd_option_waitforrsp, 0, NULL));
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          List an entry from the BT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_list_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       int pos;
-       char *addr1;
-       struct iwreq *wrq = (struct iwreq *)req;
-       /* used to pass id and store the bt entry returned by the FW */
-       union {
-               u32 id;
-               char addr1addr2[2 * ETH_ALEN];
-       } param;
-       static char outstr[64];
-       char *pbuf = outstr;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(outstr, wrq->u.data.pointer, sizeof(outstr))) {
-               lbs_deb_ioctl("Copy from user failed\n");
-               return -1;
-       }
-       param.id = simple_strtoul(outstr, NULL, 10);
-       pos = sprintf(pbuf, "%d: ", param.id);
-       pbuf += pos;
-
-       ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
-                                   cmd_act_bt_access_list,
-                                   cmd_option_waitforrsp, 0,
-                                   (char *)&param);
-
-       if (ret == 0) {
-               addr1 = param.addr1addr2;
-
-               pos = sprintf(pbuf, "BT includes node ");
-               pbuf += pos;
-               pos = eth_addr2str(addr1, pbuf);
-               pbuf += pos;
-       } else {
-               sprintf(pbuf, "(null)");
-               pbuf += pos;
-       }
-
-       wrq->u.data.length = strlen(outstr);
-       if (copy_to_user(wrq->u.data.pointer, (char *)outstr,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("BT_LIST: Copy to user failed!\n");
-               return -EFAULT;
-       }
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0 ;
-}
-
-/**
- *  @brief          Sets inverted state of blacklist (non-zero if inverted)
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_set_invert_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       int ret;
-       struct iwreq *wrq = (struct iwreq *)req;
-       union {
-               u32 id;
-               char addr1addr2[2 * ETH_ALEN];
-       } param;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       param.id = SUBCMD_DATA(wrq) ;
-       ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
-                                   cmd_act_bt_access_set_invert,
-                                   cmd_option_waitforrsp, 0,
-                                   (char *)&param);
-       if (ret != 0)
-               return -EFAULT;
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Gets inverted state of blacklist (non-zero if inverted)
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_get_invert_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       int ret;
-       union {
-               u32 id;
-               char addr1addr2[2 * ETH_ALEN];
-       } param;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
-                                   cmd_act_bt_access_get_invert,
-                                   cmd_option_waitforrsp, 0,
-                                   (char *)&param);
-
-       if (ret == 0)
-               wrq->u.param.value = le32_to_cpu(param.id);
-       else
-               return -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Find the next parameter in an input string
- *  @param ptr      A pointer to the input parameter string
- *  @return         A pointer to the next parameter, or 0 if no parameters left.
- */
-static char * next_param(char * ptr)
-{
-       if (!ptr) return NULL;
-       while (*ptr == ' ' || *ptr == '\t') ++ptr;
-       return (*ptr == '\0') ? NULL : ptr;
-}
-
-/**
- *  @brief          Add an entry to the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_add_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[128];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       if ((ptr = eth_str2addr(in_str, fwt_access.da)) == NULL) {
-               lbs_pr_alert( "FWT_ADD: Invalid MAC address 1\n");
-               return -EINVAL;
-       }
-
-       if ((ptr = eth_str2addr(ptr, fwt_access.ra)) == NULL) {
-               lbs_pr_alert( "FWT_ADD: Invalid MAC address 2\n");
-               return -EINVAL;
-       }
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.metric =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.metric = cpu_to_le32(FWT_DEFAULT_METRIC);
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.dir = (u8)simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.dir = FWT_DEFAULT_DIR;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.rate = (u8) simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.rate = FWT_DEFAULT_RATE;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.ssn =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.ssn = cpu_to_le32(FWT_DEFAULT_SSN);
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.dsn =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.dsn = cpu_to_le32(FWT_DEFAULT_DSN);
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.hopcount = simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.hopcount = FWT_DEFAULT_HOPCOUNT;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.ttl = simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.ttl = FWT_DEFAULT_TTL;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.expiration =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.expiration = cpu_to_le32(FWT_DEFAULT_EXPIRATION);
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.sleepmode = (u8)simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.sleepmode = FWT_DEFAULT_SLEEPMODE;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.snr =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.snr = cpu_to_le32(FWT_DEFAULT_SNR);
-
-#ifdef DEBUG
-       {
-               char ethaddr1_str[18], ethaddr2_str[18];
-               eth_addr2str(fwt_access.da, ethaddr1_str);
-               eth_addr2str(fwt_access.ra, ethaddr2_str);
-               lbs_deb_ioctl("FWT_ADD: adding (da:%s,%i,ra:%s)\n", ethaddr1_str,
-                      fwt_access.dir, ethaddr2_str);
-               lbs_deb_ioctl("FWT_ADD: ssn:%u dsn:%u met:%u hop:%u ttl:%u exp:%u slp:%u snr:%u\n",
-                      fwt_access.ssn, fwt_access.dsn, fwt_access.metric,
-                      fwt_access.hopcount, fwt_access.ttl, fwt_access.expiration,
-                      fwt_access.sleepmode, fwt_access.snr);
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                               cmd_act_fwt_access_add,
-                                               cmd_option_waitforrsp, 0,
-                                               (void *)&fwt_access);
-
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-/**
- *  @brief          Delete an entry from the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_del_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[64];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       if ((ptr = eth_str2addr(in_str, fwt_access.da)) == NULL) {
-               lbs_pr_alert( "FWT_DEL: Invalid MAC address 1\n");
-               return -EINVAL;
-       }
-
-       if ((ptr = eth_str2addr(ptr, fwt_access.ra)) == NULL) {
-               lbs_pr_alert( "FWT_DEL: Invalid MAC address 2\n");
-               return -EINVAL;
-       }
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.dir = (u8)simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.dir = FWT_DEFAULT_DIR;
-
-#ifdef DEBUG
-       {
-               char ethaddr1_str[18], ethaddr2_str[18];
-               lbs_deb_ioctl("FWT_DEL: line is %s\n", in_str);
-               eth_addr2str(fwt_access.da, ethaddr1_str);
-               eth_addr2str(fwt_access.ra, ethaddr2_str);
-               lbs_deb_ioctl("FWT_DEL: removing (da:%s,ra:%s,dir:%d)\n", ethaddr1_str,
-                      ethaddr2_str, fwt_access.dir);
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv,
-                                               cmd_fwt_access,
-                                               cmd_act_fwt_access_del,
-                                               cmd_option_waitforrsp, 0,
-                                               (void *)&fwt_access);
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-
-/**
- *  @brief             Print route parameters
- *  @param fwt_access  struct cmd_ds_fwt_access with route info
- *  @param buf         destination buffer for route info
- */
-static void print_route(struct cmd_ds_fwt_access fwt_access, char *buf)
-{
-       buf += sprintf(buf, " ");
-       buf += eth_addr2str(fwt_access.da, buf);
-       buf += sprintf(buf, " ");
-       buf += eth_addr2str(fwt_access.ra, buf);
-       buf += sprintf(buf, " %u", fwt_access.valid);
-       buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.metric));
-       buf += sprintf(buf, " %u", fwt_access.dir);
-       buf += sprintf(buf, " %u", fwt_access.rate);
-       buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.ssn));
-       buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.dsn));
-       buf += sprintf(buf, " %u", fwt_access.hopcount);
-       buf += sprintf(buf, " %u", fwt_access.ttl);
-       buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.expiration));
-       buf += sprintf(buf, " %u", fwt_access.sleepmode);
-       buf += sprintf(buf, " %u ", le32_to_cpu(fwt_access.snr));
-       buf += eth_addr2str(fwt_access.prec, buf);
-}
-
-/**
- *  @brief          Lookup an entry in the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_lookup_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[64];
-       char *ptr;
-       static struct cmd_ds_fwt_access fwt_access;
-       static char out_str[128];
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       if ((ptr = eth_str2addr(in_str, fwt_access.da)) == NULL) {
-               lbs_pr_alert( "FWT_LOOKUP: Invalid MAC address\n");
-               return -EINVAL;
-       }
-
-#ifdef DEBUG
-       {
-               char ethaddr1_str[18];
-               lbs_deb_ioctl("FWT_LOOKUP: line is %s\n", in_str);
-               eth_addr2str(fwt_access.da, ethaddr1_str);
-               lbs_deb_ioctl("FWT_LOOKUP: looking for (da:%s)\n", ethaddr1_str);
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv,
-                                               cmd_fwt_access,
-                                               cmd_act_fwt_access_lookup,
-                                               cmd_option_waitforrsp, 0,
-                                               (void *)&fwt_access);
-
-       if (ret == 0)
-               print_route(fwt_access, out_str);
-       else
-               sprintf(out_str, "(null)");
-
-       wrq->u.data.length = strlen(out_str);
-       if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("FWT_LOOKUP: Copy to user failed!\n");
-               return -EFAULT;
-       }
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Reset all entries from the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_reset_ioctl(wlan_private * priv)
-{
-       lbs_deb_ioctl("FWT: resetting\n");
-
-       return (libertas_prepare_and_send_command(priv,
-                                     cmd_fwt_access,
-                                     cmd_act_fwt_access_reset,
-                                     cmd_option_waitforrsp, 0, NULL));
-}
-
-/**
- *  @brief          List an entry from the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_list_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[8];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr = in_str;
-       static char out_str[128];
-       char *pbuf = out_str;
-       int ret = 0;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str))) {
-               ret = -EFAULT;
-               goto out;
-       }
-
-       fwt_access.id = cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-
-#ifdef DEBUG
-       {
-               lbs_deb_ioctl("FWT_LIST: line is %s\n", in_str);
-               lbs_deb_ioctl("FWT_LIST: listing id:%i\n", le32_to_cpu(fwt_access.id));
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_list,
-                                   cmd_option_waitforrsp, 0, (void *)&fwt_access);
-
-       if (ret == 0)
-               print_route(fwt_access, pbuf);
-       else
-               pbuf += sprintf(pbuf, " (null)");
-
-       wrq->u.data.length = strlen(out_str);
-       if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("FWT_LIST: Copy to user failed!\n");
-               ret = -EFAULT;
-               goto out;
-       }
-
-       ret = 0;
-
-out:
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return ret;
-}
-
-/**
- *  @brief          List an entry from the FRT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_list_route_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[64];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr = in_str;
-       static char out_str[128];
-       char *pbuf = out_str;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       fwt_access.id = cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-
-#ifdef DEBUG
-       {
-               lbs_deb_ioctl("FWT_LIST_ROUTE: line is %s\n", in_str);
-               lbs_deb_ioctl("FWT_LIST_ROUTE: listing id:%i\n", le32_to_cpu(fwt_access.id));
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_list_route,
-                                   cmd_option_waitforrsp, 0, (void *)&fwt_access);
-
-       if (ret == 0) {
-               print_route(fwt_access, pbuf);
-       } else
-               pbuf += sprintf(pbuf, " (null)");
-
-       wrq->u.data.length = strlen(out_str);
-       if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("FWT_LIST_ROUTE: Copy to user failed!\n");
-               return -EFAULT;
-       }
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          List an entry from the FNT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_list_neighbor_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[8];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr = in_str;
-       static char out_str[128];
-       char *pbuf = out_str;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       memset(&fwt_access, 0, sizeof(fwt_access));
-       fwt_access.id = cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-
-#ifdef DEBUG
-       {
-               lbs_deb_ioctl("FWT_LIST_NEIGHBOR: line is %s\n", in_str);
-               lbs_deb_ioctl("FWT_LIST_NEIGHBOR: listing id:%i\n", le32_to_cpu(fwt_access.id));
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_list_neighbor,
-                                   cmd_option_waitforrsp, 0,
-                                   (void *)&fwt_access);
-
-       if (ret == 0) {
-               pbuf += sprintf(pbuf, " ra ");
-               pbuf += eth_addr2str(fwt_access.ra, pbuf);
-               pbuf += sprintf(pbuf, "  slp %u", fwt_access.sleepmode);
-               pbuf += sprintf(pbuf, "  snr %u", le32_to_cpu(fwt_access.snr));
-               pbuf += sprintf(pbuf, "  ref %u", le32_to_cpu(fwt_access.references));
-       } else
-               pbuf += sprintf(pbuf, " (null)");
-
-       wrq->u.data.length = strlen(out_str);
-       if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("FWT_LIST_NEIGHBOR: Copy to user failed!\n");
-               return -EFAULT;
-       }
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Cleans up the route (FRT) and neighbor (FNT) tables
- *                  (Garbage Collection)
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_cleanup_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       static struct cmd_ds_fwt_access fwt_access;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       lbs_deb_ioctl("FWT: cleaning up\n");
-
-       memset(&fwt_access, 0, sizeof(fwt_access));
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_cleanup,
-                                   cmd_option_waitforrsp, 0,
-                                   (void *)&fwt_access);
-
-       if (ret == 0)
-               wrq->u.param.value = le32_to_cpu(fwt_access.references);
-       else
-               return -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Gets firmware internal time (debug purposes)
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_time_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       static struct cmd_ds_fwt_access fwt_access;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       lbs_deb_ioctl("FWT: getting time\n");
-
-       memset(&fwt_access, 0, sizeof(fwt_access));
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_time,
-                                   cmd_option_waitforrsp, 0,
-                                   (void *)&fwt_access);
-
-       if (ret == 0)
-               wrq->u.param.value = le32_to_cpu(fwt_access.references);
-       else
-               return -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Gets mesh ttl from firmware
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_mesh_get_ttl_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       struct cmd_ds_mesh_access mesh_access;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       memset(&mesh_access, 0, sizeof(mesh_access));
-
-       ret = libertas_prepare_and_send_command(priv, cmd_mesh_access,
-                                   cmd_act_mesh_get_ttl,
-                                   cmd_option_waitforrsp, 0,
-                                   (void *)&mesh_access);
-
-       if (ret == 0)
-               wrq->u.param.value = le32_to_cpu(mesh_access.data[0]);
-       else
-               return -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Gets mesh ttl from firmware
- *  @param priv     A pointer to wlan_private structure
- *  @param ttl      New ttl value
- *  @return         0 --success, otherwise fail
- */
-static int wlan_mesh_set_ttl_ioctl(wlan_private * priv, int ttl)
-{
-       struct cmd_ds_mesh_access mesh_access;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if( (ttl > 0xff) || (ttl < 0) )
-               return -EINVAL;
-
-       memset(&mesh_access, 0, sizeof(mesh_access));
-       mesh_access.data[0] = cpu_to_le32(ttl);
-
-       ret = libertas_prepare_and_send_command(priv, cmd_mesh_access,
-                                               cmd_act_mesh_set_ttl,
-                                               cmd_option_waitforrsp, 0,
-                                               (void *)&mesh_access);
-
-       if (ret != 0)
-               ret = -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return ret;
-}
-
-/**
- *  @brief ioctl function - entry point
- *
- *  @param dev         A pointer to net_device structure
- *  @param req         A pointer to ifreq structure
- *  @param cmd                 command
- *  @return            0--success, otherwise fail
- */
-int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
-{
-       int subcmd = 0;
-       int idata = 0;
-       int *pdata;
-       int ret = 0;
-       wlan_private *priv = dev->priv;
-       wlan_adapter *adapter = priv->adapter;
-       struct iwreq *wrq = (struct iwreq *)req;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       lbs_deb_ioctl("libertas_do_ioctl: ioctl cmd = 0x%x\n", cmd);
-       switch (cmd) {
-       case WLAN_SETNONE_GETNONE:      /* set WPA mode on/off ioctl #20 */
-               switch (wrq->u.data.flags) {
-               case WLAN_SUBCMD_BT_RESET:      /* bt_reset */
-                       wlan_bt_reset_ioctl(priv);
-                       break;
-               case WLAN_SUBCMD_FWT_RESET:     /* fwt_reset */
-                       wlan_fwt_reset_ioctl(priv);
-                       break;
-               }               /* End of switch */
-               break;
-
-       case WLAN_SETONEINT_GETNONE:
-               /* The first 4 bytes of req->ifr_data is sub-ioctl number
-                * after 4 bytes sits the payload.
-                */
-               subcmd = wrq->u.data.flags;
-               if (!subcmd)
-                       subcmd = (int)wrq->u.param.value;
-
-               switch (subcmd) {
-               case WLANSETREGION:
-                       idata = SUBCMD_DATA(wrq);
-                       ret = wlan_set_region(priv, (u16) idata);
-                       break;
-               case WLAN_SUBCMD_MESH_SET_TTL:
-                       idata = SUBCMD_DATA(wrq);
-                       ret = wlan_mesh_set_ttl_ioctl(priv, idata);
-                       break;
-
-               case WLAN_SUBCMD_BT_SET_INVERT:
-                       ret = wlan_bt_set_invert_ioctl(priv, req);
-                       break ;
-
-               default:
-                       ret = -EOPNOTSUPP;
-                       break;
-               }
-
-               break;
-
-       case WLAN_SET128CHAR_GET128CHAR:
-               switch ((int)wrq->u.data.flags) {
-               case WLAN_SUBCMD_BT_ADD:
-                       ret = wlan_bt_add_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_BT_DEL:
-                       ret = wlan_bt_del_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_BT_LIST:
-                       ret = wlan_bt_list_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_ADD:
-                       ret = wlan_fwt_add_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_DEL:
-                       ret = wlan_fwt_del_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_LOOKUP:
-                       ret = wlan_fwt_lookup_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_LIST_NEIGHBOR:
-                       ret = wlan_fwt_list_neighbor_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_LIST:
-                       ret = wlan_fwt_list_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_LIST_ROUTE:
-                       ret = wlan_fwt_list_route_ioctl(priv, req);
-                       break;
-               }
-               break;
-
-       case WLAN_SETNONE_GETONEINT:
-               switch (wrq->u.param.value) {
-               case WLANGETREGION:
-                       pdata = (int *)wrq->u.name;
-                       *pdata = (int)adapter->regioncode;
-                       break;
-               case WLAN_SUBCMD_FWT_CLEANUP:   /* fwt_cleanup */
-                       ret = wlan_fwt_cleanup_ioctl(priv, req);
-                       break;
-
-               case WLAN_SUBCMD_FWT_TIME:      /* fwt_time */
-                       ret = wlan_fwt_time_ioctl(priv, req);
-                       break;
-
-               case WLAN_SUBCMD_MESH_GET_TTL:
-                       ret = wlan_mesh_get_ttl_ioctl(priv, req);
-                       break;
-
-               case WLAN_SUBCMD_BT_GET_INVERT:
-                       ret = wlan_bt_get_invert_ioctl(priv, req);
-                       break ;
-
-               default:
-                       ret = -EOPNOTSUPP;
-
-               }
-
-               break;
-
-       case WLAN_SET_GET_SIXTEEN_INT:
-               switch ((int)wrq->u.data.flags) {
-               case WLAN_LED_GPIO_CTRL:
-                       {
-                               int i;
-                               int data[16];
-
-                               struct cmd_ds_802_11_led_ctrl ctrl;
-                               struct mrvlietypes_ledgpio *gpio =
-                                   (struct mrvlietypes_ledgpio *) ctrl.data;
-
-                               memset(&ctrl, 0, sizeof(ctrl));
-                               if (wrq->u.data.length > MAX_LEDS * 2)
-                                       return -ENOTSUPP;
-                               if ((wrq->u.data.length % 2) != 0)
-                                       return -ENOTSUPP;
-                               if (wrq->u.data.length == 0) {
-                                       ctrl.action =
-                                           cpu_to_le16
-                                           (cmd_act_get);
-                               } else {
-                                       if (copy_from_user
-                                           (data, wrq->u.data.pointer,
-                                            sizeof(int) *
-                                            wrq->u.data.length)) {
-                                               lbs_deb_ioctl(
-                                                      "Copy from user failed\n");
-                                               return -EFAULT;
-                                       }
-
-                                       ctrl.action =
-                                           cpu_to_le16
-                                           (cmd_act_set);
-                                       ctrl.numled = cpu_to_le16(0);
-                                       gpio->header.type =
-                                           cpu_to_le16(TLV_TYPE_LED_GPIO);
-                                       gpio->header.len = wrq->u.data.length;
-                                       for (i = 0; i < wrq->u.data.length;
-                                            i += 2) {
-                                               gpio->ledpin[i / 2].led =
-                                                   data[i];
-                                               gpio->ledpin[i / 2].pin =
-                                                   data[i + 1];
-                                       }
-                               }
-                               ret =
-                                   libertas_prepare_and_send_command(priv,
-                                                         cmd_802_11_led_gpio_ctrl,
-                                                         0,
-                                                         cmd_option_waitforrsp,
-                                                         0, (void *)&ctrl);
-                               for (i = 0; i < gpio->header.len; i += 2) {
-                                       data[i] = gpio->ledpin[i / 2].led;
-                                       data[i + 1] = gpio->ledpin[i / 2].pin;
-                               }
-                               if (copy_to_user(wrq->u.data.pointer, data,
-                                                sizeof(int) *
-                                                gpio->header.len)) {
-                                       lbs_deb_ioctl("Copy to user failed\n");
-                                       return -EFAULT;
-                               }
-
-                               wrq->u.data.length = gpio->header.len;
-                       }
-                       break;
-               }
-               break;
-
-       default:
-               ret = -EINVAL;
-               break;
-       }
-
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-
index 623ab4b1697388103305d04257bc4f535d6e9066..4a59306a3f05feb9d7f31f4273bc3a549ff9cf3f 100644 (file)
@@ -181,7 +181,8 @@ u16 libertas_region_code_to_index[MRVDRV_MAX_REGION_CODE] =
  * @brief Get function for sysfs attribute anycast_mask
  */
 static ssize_t libertas_anycast_get(struct device * dev,
-               struct device_attribute *attr, char * buf) {
+               struct device_attribute *attr, char * buf)
+{
        struct cmd_ds_mesh_access mesh_access;
 
        memset(&mesh_access, 0, sizeof(mesh_access));
@@ -197,7 +198,8 @@ static ssize_t libertas_anycast_get(struct device * dev,
  * @brief Set function for sysfs attribute anycast_mask
  */
 static ssize_t libertas_anycast_set(struct device * dev,
-               struct device_attribute *attr, const char * buf, size_t count) {
+               struct device_attribute *attr, const char * buf, size_t count)
+{
        struct cmd_ds_mesh_access mesh_access;
        uint32_t datum;
 
@@ -799,7 +801,6 @@ wlan_private *libertas_add_card(void *card, struct device *dmdev)
        dev->open = wlan_open;
        dev->hard_start_xmit = wlan_pre_start_xmit;
        dev->stop = wlan_close;
-       dev->do_ioctl = libertas_do_ioctl;
        dev->set_mac_address = wlan_set_mac_address;
        dev->tx_timeout = wlan_tx_timeout;
        dev->get_stats = wlan_get_stats;
@@ -918,7 +919,6 @@ int libertas_add_mesh(wlan_private *priv, struct device *dev)
        mesh_dev->open = mesh_open;
        mesh_dev->hard_start_xmit = mesh_pre_start_xmit;
        mesh_dev->stop = mesh_close;
-       mesh_dev->do_ioctl = libertas_do_ioctl;
        mesh_dev->get_stats = wlan_get_stats;
        mesh_dev->set_mac_address = wlan_set_mac_address;
        mesh_dev->ethtool_ops = &libertas_ethtool_ops;
index 606af50fa09b79584ec4df8ce5617fe22d41f5b9..c3043dcb541ea0c1cb129f0b1a8d9988ebf56cc2 100644 (file)
@@ -214,38 +214,6 @@ done:
        return matched;
 }
 
-/**
- *  @brief Post process the scan table after a new scan command has completed
- *
- *  Inspect each entry of the scan table and try to find an entry that
- *    matches our current associated/joined network from the scan.  If
- *    one is found, update the stored copy of the bssdescriptor for our
- *    current network.
- *
- *  Debug dump the current scan table contents if compiled accordingly.
- *
- *  @param priv   A pointer to wlan_private structure
- *
- *  @return       void
- */
-static void wlan_scan_process_results(wlan_private * priv)
-{
-       wlan_adapter *adapter = priv->adapter;
-       struct bss_descriptor * iter_bss;
-       int i = 0;
-
-       if (adapter->connect_status == libertas_connected)
-               return;
-
-       mutex_lock(&adapter->lock);
-       list_for_each_entry (iter_bss, &adapter->network_list, list) {
-               lbs_deb_scan("Scan:(%02d) " MAC_FMT ", RSSI[%03d], SSID[%s]\n",
-                      i++, MAC_ARG(iter_bss->bssid), (s32) iter_bss->rssi,
-                      escape_essid(iter_bss->ssid, iter_bss->ssid_len));
-       }
-       mutex_unlock(&adapter->lock);
-}
-
 /**
  *  @brief Create a channel list for the driver to scan based on region info
  *
@@ -791,6 +759,10 @@ int wlan_scan_networks(wlan_private * priv,
        u8 scancurrentchanonly;
        int maxchanperscan;
        int ret;
+#ifdef CONFIG_LIBERTAS_DEBUG
+       struct bss_descriptor * iter_bss;
+       int i = 0;
+#endif
 
        lbs_deb_enter(LBS_DEB_ASSOC);
 
@@ -832,11 +804,16 @@ int wlan_scan_networks(wlan_private * priv,
                                     puserscanin,
                                     full_scan);
 
-       /*  Process the resulting scan table:
-        *    - Remove any bad ssids
-        *    - Update our current BSS information from scan data
-        */
-       wlan_scan_process_results(priv);
+#ifdef CONFIG_LIBERTAS_DEBUG
+       /* Dump the scan table */
+       mutex_lock(&adapter->lock);
+       list_for_each_entry (iter_bss, &adapter->network_list, list) {
+               lbs_deb_scan("Scan:(%02d) " MAC_FMT ", RSSI[%03d], SSID[%s]\n",
+                      i++, MAC_ARG(iter_bss->bssid), (s32) iter_bss->rssi,
+                      escape_essid(iter_bss->ssid, iter_bss->ssid_len));
+       }
+       mutex_unlock(&adapter->lock);
+#endif
 
        if (priv->adapter->connect_status == libertas_connected) {
                netif_carrier_on(priv->dev);
index 8939251a2f4cd4efe3e775a10d396f39269e1f77..f42b796b5e47ed83a1c54c332a64790bd5f32f15 100644 (file)
@@ -913,148 +913,6 @@ out:
        return 0;
 }
 
-/*
- * iwpriv settable callbacks
- */
-
-static const iw_handler wlan_private_handler[] = {
-       NULL,                   /* SIOCIWFIRSTPRIV */
-};
-
-static const struct iw_priv_args wlan_private_args[] = {
-       /*
-        * { cmd, set_args, get_args, name }
-        */
-       /* Using iwpriv sub-command feature */
-       {
-        WLAN_SETONEINT_GETNONE,        /* IOCTL: 24 */
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        IW_PRIV_TYPE_NONE,
-        ""},
-       {
-        WLANSETREGION,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        IW_PRIV_TYPE_NONE,
-        "setregioncode"},
-       {
-        WLAN_SUBCMD_MESH_SET_TTL,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        IW_PRIV_TYPE_NONE,
-        "mesh_set_ttl"},
-       {
-        WLAN_SETNONE_GETONEINT,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        ""},
-       {
-        WLANGETREGION,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "getregioncode"},
-       {
-        WLAN_SUBCMD_FWT_CLEANUP,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "fwt_cleanup"},
-       {
-        WLAN_SUBCMD_FWT_TIME,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "fwt_time"},
-       {
-        WLAN_SUBCMD_MESH_GET_TTL,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "mesh_get_ttl"},
-       {
-        WLAN_SETNONE_GETNONE,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_NONE,
-        ""},
-       {
-        WLAN_SUBCMD_FWT_RESET,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_NONE,
-        "fwt_reset"},
-       {
-        WLAN_SUBCMD_BT_RESET,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_NONE,
-        "bt_reset"},
-       {
-        WLAN_SET128CHAR_GET128CHAR,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        ""},
-       /* BT Management */
-       {
-        WLAN_SUBCMD_BT_ADD,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "bt_add"},
-       {
-        WLAN_SUBCMD_BT_DEL,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "bt_del"},
-       {
-        WLAN_SUBCMD_BT_LIST,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "bt_list"},
-       {
-        WLAN_SUBCMD_BT_SET_INVERT,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        IW_PRIV_TYPE_NONE,
-        "bt_set_invert"},
-       {
-        WLAN_SUBCMD_BT_GET_INVERT,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "bt_get_invert"},
-       /* FWT Management */
-       {
-        WLAN_SUBCMD_FWT_ADD,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_add"},
-       {
-        WLAN_SUBCMD_FWT_DEL,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_del"},
-       {
-        WLAN_SUBCMD_FWT_LOOKUP,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_lookup"},
-       {
-        WLAN_SUBCMD_FWT_LIST_NEIGHBOR,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_list_neigh"},
-       {
-        WLAN_SUBCMD_FWT_LIST,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_list"},
-       {
-        WLAN_SUBCMD_FWT_LIST_ROUTE,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_list_route"},
-       {
-        WLAN_SET_GET_SIXTEEN_INT,
-        IW_PRIV_TYPE_INT | 16,
-        IW_PRIV_TYPE_INT | 16,
-        ""},
-       {
-        WLAN_LED_GPIO_CTRL,
-        IW_PRIV_TYPE_INT | 16,
-        IW_PRIV_TYPE_INT | 16,
-        "ledgpio"},
-};
-
 static struct iw_statistics *wlan_get_wireless_stats(struct net_device *dev)
 {
        enum {
@@ -2444,22 +2302,12 @@ static const iw_handler mesh_wlan_handler[] = {
 };
 struct iw_handler_def libertas_handler_def = {
        .num_standard   = sizeof(wlan_handler) / sizeof(iw_handler),
-       .num_private    = sizeof(wlan_private_handler) / sizeof(iw_handler),
-       .num_private_args = sizeof(wlan_private_args) /
-               sizeof(struct iw_priv_args),
        .standard       = (iw_handler *) wlan_handler,
-       .private        = (iw_handler *) wlan_private_handler,
-       .private_args   = (struct iw_priv_args *)wlan_private_args,
        .get_wireless_stats = wlan_get_wireless_stats,
 };
 
 struct iw_handler_def mesh_handler_def = {
        .num_standard   = sizeof(mesh_wlan_handler) / sizeof(iw_handler),
-       .num_private    = sizeof(wlan_private_handler) / sizeof(iw_handler),
-       .num_private_args = sizeof(wlan_private_args) /
-               sizeof(struct iw_priv_args),
        .standard       = (iw_handler *) mesh_wlan_handler,
-       .private        = (iw_handler *) wlan_private_handler,
-       .private_args   = (struct iw_priv_args *)wlan_private_args,
        .get_wireless_stats = wlan_get_wireless_stats,
 };
index d555056b25b736715bd96eec834c0044ee6a8f71..3d5196c9553aa6228cdade43ffd95364ad91a1c7 100644 (file)
@@ -7,45 +7,6 @@
 #define SUBCMD_OFFSET                  4
 #define SUBCMD_DATA(x)                 *((int *)(x->u.name + SUBCMD_OFFSET))
 
-/** PRIVATE CMD ID */
-#define        WLANIOCTL                       SIOCIWFIRSTPRIV
-
-#define WLAN_SETNONE_GETNONE           (WLANIOCTL + 8)
-#define WLAN_SUBCMD_BT_RESET                   13
-#define WLAN_SUBCMD_FWT_RESET                  14
-
-#define WLAN_SETNONE_GETONEINT         (WLANIOCTL + 15)
-#define WLANGETREGION                          1
-
-#define WLAN_SUBCMD_FWT_CLEANUP                        15
-#define WLAN_SUBCMD_FWT_TIME                   16
-#define WLAN_SUBCMD_MESH_GET_TTL               17
-#define WLAN_SUBCMD_BT_GET_INVERT              18
-
-#define WLAN_SETONEINT_GETNONE         (WLANIOCTL + 24)
-#define WLANSETREGION                          8
-#define WLAN_SUBCMD_MESH_SET_TTL               18
-#define WLAN_SUBCMD_BT_SET_INVERT              19
-
-#define WLAN_SET128CHAR_GET128CHAR     (WLANIOCTL + 25)
-#define WLAN_SUBCMD_BT_ADD                     18
-#define WLAN_SUBCMD_BT_DEL                     19
-#define WLAN_SUBCMD_BT_LIST                    20
-#define WLAN_SUBCMD_FWT_ADD                    21
-#define WLAN_SUBCMD_FWT_DEL                    22
-#define WLAN_SUBCMD_FWT_LOOKUP                 23
-#define WLAN_SUBCMD_FWT_LIST_NEIGHBOR          24
-#define WLAN_SUBCMD_FWT_LIST                   25
-#define WLAN_SUBCMD_FWT_LIST_ROUTE             26
-
-#define WLAN_SET_GET_SIXTEEN_INT       (WLANIOCTL + 29)
-#define WLAN_LED_GPIO_CTRL                     5
-
-#define WLAN_LINKMODE_802_3                    0
-#define WLAN_LINKMODE_802_11                   2
-#define WLAN_RADIOMODE_NONE                            0
-#define WLAN_RADIOMODE_RADIOTAP                        2
-
 /** wlan_ioctl_regrdwr */
 struct wlan_ioctl_regrdwr {
        /** Which register to access */
@@ -57,9 +18,13 @@ struct wlan_ioctl_regrdwr {
        u32 value;
 };
 
+#define WLAN_LINKMODE_802_3                    0
+#define WLAN_LINKMODE_802_11                   2
+#define WLAN_RADIOMODE_NONE                    0
+#define WLAN_RADIOMODE_RADIOTAP                        2
+
 extern struct iw_handler_def libertas_handler_def;
 extern struct iw_handler_def mesh_handler_def;
-int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int i);
 int wlan_radio_ioctl(wlan_private * priv, u8 option);
 
 #endif                         /* _WLAN_WEXT_H_ */
index 2b2f5c12019b82b94f7115088f8de140d10d271a..eb46cb0e3cb7e488495397e400fd866013b1b649 100644 (file)
@@ -60,6 +60,7 @@ config BLK_DEV_SD
        depends on SCSI
        ---help---
          If you want to use SCSI hard disks, Fibre Channel disks,
+         Serial ATA (SATA) or Parallel ATA (PATA) hard disks,
          USB storage or the SCSI or parallel port version of
          the IOMEGA ZIP drive, say Y and read the SCSI-HOWTO,
          the Disk-HOWTO and the Multi-Disk-HOWTO, available from
index 8593f3dfd2990a013b6fd580e22e1e82b83d4fbf..52bb2638f7ab703e9a3d5205b097ddbf90a071e2 100644 (file)
@@ -1106,7 +1106,7 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode,
        spin_lock_irqsave(&dio->bio_lock, flags);
        ret2 = --dio->refcount;
        spin_unlock_irqrestore(&dio->bio_lock, flags);
-       BUG_ON(!dio->is_async && ret2 != 0);
+
        if (ret2 == 0) {
                ret = dio_complete(dio, offset, ret);
                kfree(dio);
index 12e83f67eee493cfe625430e14e1e7a938d09395..7b363786c2d2f745c30dcd53b0005e18b056df11 100644 (file)
@@ -210,8 +210,7 @@ static void jffs2_kill_tn(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info *
  * offset, and the one with the smallest length will come first in the
  * ordering.
  *
- * Returns 0 if the node was inserted
- *         1 if the node is obsolete (because we can't mark it so yet)
+ * Returns 0 if the node was handled (including marking it obsolete)
  *         < 0 an if error occurred
  */
 static int jffs2_add_tn_to_tree(struct jffs2_sb_info *c,
@@ -572,8 +571,7 @@ static struct jffs2_raw_node_ref *jffs2_first_valid_node(struct jffs2_raw_node_r
  * Helper function for jffs2_get_inode_nodes().
  * It is called every time an directory entry node is found.
  *
- * Returns: 0 on succes;
- *         1 if the node should be marked obsolete;
+ * Returns: 0 on success;
  *         negative error code on failure.
  */
 static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref,
@@ -680,8 +678,7 @@ static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_r
  * Helper function for jffs2_get_inode_nodes().
  * It is called every time an inode node is found.
  *
- * Returns: 0 on success;
- *         1 if the node should be marked obsolete;
+ * Returns: 0 on success (possibly after marking a bad node obsolete);
  *         negative error code on failure.
  */
 static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref,
@@ -690,7 +687,7 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
 {
        struct jffs2_tmp_dnode_info *tn;
        uint32_t len, csize;
-       int ret = 1;
+       int ret = 0;
        uint32_t crc;
 
        /* Obsoleted. This cannot happen, surely? dwmw2 20020308 */
@@ -719,8 +716,9 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
                /* Sanity checks */
                if (unlikely(je32_to_cpu(rd->offset) > je32_to_cpu(rd->isize)) ||
                    unlikely(PAD(je32_to_cpu(rd->csize) + sizeof(*rd)) != PAD(je32_to_cpu(rd->totlen)))) {
-                               JFFS2_WARNING("inode node header CRC is corrupted at %#08x\n", ref_offset(ref));
-                               jffs2_dbg_dump_node(c, ref_offset(ref));
+                       JFFS2_WARNING("inode node header CRC is corrupted at %#08x\n", ref_offset(ref));
+                       jffs2_dbg_dump_node(c, ref_offset(ref));
+                       jffs2_mark_node_obsolete(c, ref);
                        goto free_out;
                }
 
@@ -775,6 +773,7 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
                        if (len >= csize && unlikely(tn->partial_crc != je32_to_cpu(rd->data_crc))) {
                                JFFS2_NOTICE("wrong data CRC in data node at 0x%08x: read %#08x, calculated %#08x.\n",
                                        ref_offset(ref), tn->partial_crc, je32_to_cpu(rd->data_crc));
+                               jffs2_mark_node_obsolete(c, ref);
                                goto free_out;
                        }
 
@@ -854,7 +853,6 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
  * It is called every time an unknown node is found.
  *
  * Returns: 0 on success;
- *         1 if the node should be marked obsolete;
  *         negative error code on failure.
  */
 static inline int read_unknown(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref, struct jffs2_unknown_node *un)
@@ -1088,10 +1086,7 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf
                        }
 
                        err = read_unknown(c, ref, &node->u);
-                       if (err == 1) {
-                               jffs2_mark_node_obsolete(c, ref);
-                               break;
-                       } else if (unlikely(err))
+                       if (unlikely(err))
                                goto free_out;
 
                }
diff --git a/include/asm-blackfin/macros.h b/include/asm-blackfin/macros.h
deleted file mode 100644 (file)
index e69de29..0000000
index aba2b30a8ed8133e06634629a7bca47e1dc8b220..6bb3e0d4705db8ab8234524a0e757cb22f6acc12 100644 (file)
@@ -124,6 +124,10 @@ static inline __attribute_pure__ uint32_t bfin_compiled_revid(void)
        return 4;
 #elif defined(CONFIG_BF_REV_0_5)
        return 5;
+#elif defined(CONFIG_BF_REV_ANY)
+       return 0xffff;
+#else
+       return -1;
 #endif
 }
 
index c3f9a6a20eb0110c351e6a6e89934da8ac5cbb4b..a5511ebb2d5323d62cfb6df084dd77bfc5f1a70f 100644 (file)
@@ -6,8 +6,8 @@
  * Copyright (C) 2006  Ralf Baechle <ralf@linux-mips.org>
  *
  */
-#ifndef __ASM_MACH_IP35_DMA_COHERENCE_H
-#define __ASM_MACH_IP35_DMA_COHERENCE_H
+#ifndef __ASM_MACH_IP32_DMA_COHERENCE_H
+#define __ASM_MACH_IP32_DMA_COHERENCE_H
 
 #include <asm/ip32/crime.h>
 
@@ -69,4 +69,4 @@ static inline int plat_device_is_coherent(struct device *dev)
        return 0;               /* IP32 is non-cohernet */
 }
 
-#endif /* __ASM_MACH_IP35_DMA_COHERENCE_H */
+#endif /* __ASM_MACH_IP32_DMA_COHERENCE_H */
index 1906938285c0fdf5d36de2e8e232bb777e32a635..85b44366343acddece25827d4dcd5cb0d16beae5 100644 (file)
@@ -86,7 +86,7 @@ struct pt_regs {
 
 extern asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit);
 
-extern NORET_TYPE void die(const char *, struct pt_regs *);
+extern NORET_TYPE void die(const char *, struct pt_regs *) ATTRIB_NORET;
 
 static inline void die_if_kernel(const char *str, struct pt_regs *regs)
 {
index 59d6fec8fbfff9a3c18969a2655b13d392e0aedd..ed16de0a6398b92e7a1912f2db813a6e43fbbc97 100644 (file)
 #  define __ARCH_WANT_COMPAT_SYS_TIME
 # endif
 
+/* whitelists for checksyscalls */
+#define __IGNORE_select
+#define __IGNORE_vfork
+#define __IGNORE_time
+#define __IGNORE_uselib
+#define __IGNORE_fadvise64_64
+#define __IGNORE_getdents64
+#if _MIPS_SIM == _MIPS_SIM_NABI32
+#define __IGNORE_truncate64
+#define __IGNORE_ftruncate64
+#define __IGNORE_stat64
+#define __IGNORE_lstat64
+#define __IGNORE_fstat64
+#define __IGNORE_fstatat64
+#endif
+
 #endif /* !__ASSEMBLY__ */
 
 /*
index 87aa5ff931e0aa63aba54ed98be8b43c38cf411d..cf53bb5814cb88b087fd1dcbfc064223b537d46a 100644 (file)
@@ -122,7 +122,6 @@ void second_overflow(void)
                         */
                        time_interpolator_update(-NSEC_PER_SEC);
                        time_state = TIME_OOP;
-                       clock_was_set();
                        printk(KERN_NOTICE "Clock: inserting leap second "
                                        "23:59:60 UTC\n");
                }
@@ -137,7 +136,6 @@ void second_overflow(void)
                         */
                        time_interpolator_update(NSEC_PER_SEC);
                        time_state = TIME_WAIT;
-                       clock_was_set();
                        printk(KERN_NOTICE "Clock: deleting leap second "
                                        "23:59:59 UTC\n");
                }
index a9c4472e92041e0fbeba9d9cc0a271f9e18c4a95..b344e67071280c9df522ef77f56ffa62ed1b4d63 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
 
 /* Shouldn't this be in a header file somewhere? */
 #define        BYTES_PER_WORD          sizeof(void *)
+#define        REDZONE_ALIGN           max(BYTES_PER_WORD, __alignof__(unsigned long long))
 
 #ifndef cache_line_size
 #define cache_line_size()      L1_CACHE_BYTES
@@ -547,7 +548,7 @@ static unsigned long long *dbg_redzone2(struct kmem_cache *cachep, void *objp)
        if (cachep->flags & SLAB_STORE_USER)
                return (unsigned long long *)(objp + cachep->buffer_size -
                                              sizeof(unsigned long long) -
-                                             BYTES_PER_WORD);
+                                             REDZONE_ALIGN);
        return (unsigned long long *) (objp + cachep->buffer_size -
                                       sizeof(unsigned long long));
 }
@@ -2178,7 +2179,8 @@ kmem_cache_create (const char *name, size_t size, size_t align,
         * above the next power of two: caches with object sizes just above a
         * power of two have a significant amount of internal fragmentation.
         */
-       if (size < 4096 || fls(size - 1) == fls(size-1 + 3 * BYTES_PER_WORD))
+       if (size < 4096 || fls(size - 1) == fls(size-1 + REDZONE_ALIGN +
+                                               2 * sizeof(unsigned long long)))
                flags |= SLAB_RED_ZONE | SLAB_STORE_USER;
        if (!(flags & SLAB_DESTROY_BY_RCU))
                flags |= SLAB_POISON;
@@ -2219,12 +2221,20 @@ kmem_cache_create (const char *name, size_t size, size_t align,
        }
 
        /*
-        * Redzoning and user store require word alignment. Note this will be
-        * overridden by architecture or caller mandated alignment if either
-        * is greater than BYTES_PER_WORD.
+        * Redzoning and user store require word alignment or possibly larger.
+        * Note this will be overridden by architecture or caller mandated
+        * alignment if either is greater than BYTES_PER_WORD.
         */
-       if (flags & SLAB_RED_ZONE || flags & SLAB_STORE_USER)
-               ralign = __alignof__(unsigned long long);
+       if (flags & SLAB_STORE_USER)
+               ralign = BYTES_PER_WORD;
+
+       if (flags & SLAB_RED_ZONE) {
+               ralign = REDZONE_ALIGN;
+               /* If redzoning, ensure that the second redzone is suitably
+                * aligned, by adjusting the object size accordingly. */
+               size += REDZONE_ALIGN - 1;
+               size &= ~(REDZONE_ALIGN - 1);
+       }
 
        /* 2) arch mandated alignment */
        if (ralign < ARCH_SLAB_MINALIGN) {
@@ -2261,9 +2271,13 @@ kmem_cache_create (const char *name, size_t size, size_t align,
        }
        if (flags & SLAB_STORE_USER) {
                /* user store requires one word storage behind the end of
-                * the real object.
+                * the real object. But if the second red zone needs to be
+                * aligned to 64 bits, we must allow that much space.
                 */
-               size += BYTES_PER_WORD;
+               if (flags & SLAB_RED_ZONE)
+                       size += REDZONE_ALIGN;
+               else
+                       size += BYTES_PER_WORD;
        }
 #if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC)
        if (size >= malloc_sizes[INDEX_L3 + 1].cs_size
index 202049a45764761d29344fbfd643257c80731689..0437f2f09986beb793b53d22daf5ee6d683eeb57 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1798,8 +1798,6 @@ static struct kmem_cache_node * __init early_kmem_cache_node_alloc(gfp_t gfpflag
        BUG_ON(kmalloc_caches->size < sizeof(struct kmem_cache_node));
 
        page = new_slab(kmalloc_caches, gfpflags | GFP_THISNODE, node);
-       /* new_slab() disables interupts */
-       local_irq_enable();
 
        BUG_ON(!page);
        n = page->freelist;
@@ -1811,6 +1809,12 @@ static struct kmem_cache_node * __init early_kmem_cache_node_alloc(gfp_t gfpflag
        init_kmem_cache_node(n);
        atomic_long_inc(&n->nr_slabs);
        add_partial(n, page);
+
+       /*
+        * new_slab() disables interupts. If we do not reenable interrupts here
+        * then bootup would continue with interrupts disabled.
+        */
+       local_irq_enable();
        return n;
 }