diff options
110 files changed, 725 insertions, 508 deletions
diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index 8b0563633442..43e89b1537d9 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX | |||
| @@ -134,8 +134,6 @@ dvb/ | |||
| 134 | - info on Linux Digital Video Broadcast (DVB) subsystem. | 134 | - info on Linux Digital Video Broadcast (DVB) subsystem. |
| 135 | early-userspace/ | 135 | early-userspace/ |
| 136 | - info about initramfs, klibc, and userspace early during boot. | 136 | - info about initramfs, klibc, and userspace early during boot. |
| 137 | ecryptfs.txt | ||
| 138 | - docs on eCryptfs: stacked cryptographic filesystem for Linux. | ||
| 139 | eisa.txt | 137 | eisa.txt |
| 140 | - info on EISA bus support. | 138 | - info on EISA bus support. |
| 141 | exception.txt | 139 | exception.txt |
diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index 397575880dc4..a30dd4480ad4 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches | |||
| @@ -126,7 +126,7 @@ the reviewers time and will get your patch rejected, probably | |||
| 126 | without even being read. | 126 | without even being read. |
| 127 | 127 | ||
| 128 | At a minimum you should check your patches with the patch style | 128 | At a minimum you should check your patches with the patch style |
| 129 | checker prior to submission (scripts/patchcheck.pl). You should | 129 | checker prior to submission (scripts/checkpatch.pl). You should |
| 130 | be able to justify all violations that remain in your patch. | 130 | be able to justify all violations that remain in your patch. |
| 131 | 131 | ||
| 132 | 132 | ||
diff --git a/Documentation/filesystems/00-INDEX b/Documentation/filesystems/00-INDEX index 571785887a4f..59db1bca7027 100644 --- a/Documentation/filesystems/00-INDEX +++ b/Documentation/filesystems/00-INDEX | |||
| @@ -32,6 +32,8 @@ directory-locking | |||
| 32 | - info about the locking scheme used for directory operations. | 32 | - info about the locking scheme used for directory operations. |
| 33 | dlmfs.txt | 33 | dlmfs.txt |
| 34 | - info on the userspace interface to the OCFS2 DLM. | 34 | - info on the userspace interface to the OCFS2 DLM. |
| 35 | ecryptfs.txt | ||
| 36 | - docs on eCryptfs: stacked cryptographic filesystem for Linux. | ||
| 35 | ext2.txt | 37 | ext2.txt |
| 36 | - info, mount options and specifications for the Ext2 filesystem. | 38 | - info, mount options and specifications for the Ext2 filesystem. |
| 37 | ext3.txt | 39 | ext3.txt |
diff --git a/Documentation/filesystems/ocfs2.txt b/Documentation/filesystems/ocfs2.txt index 8ccf0c1b58ed..ed55238023a9 100644 --- a/Documentation/filesystems/ocfs2.txt +++ b/Documentation/filesystems/ocfs2.txt | |||
| @@ -28,11 +28,7 @@ Manish Singh <manish.singh@oracle.com> | |||
| 28 | Caveats | 28 | Caveats |
| 29 | ======= | 29 | ======= |
| 30 | Features which OCFS2 does not support yet: | 30 | Features which OCFS2 does not support yet: |
| 31 | - sparse files | ||
| 32 | - extended attributes | 31 | - extended attributes |
| 33 | - shared writable mmap | ||
| 34 | - loopback is supported, but data written will not | ||
| 35 | be cluster coherent. | ||
| 36 | - quotas | 32 | - quotas |
| 37 | - cluster aware flock | 33 | - cluster aware flock |
| 38 | - cluster aware lockf | 34 | - cluster aware lockf |
| @@ -57,3 +53,12 @@ nointr Do not allow signals to interrupt cluster | |||
| 57 | atime_quantum=60(*) OCFS2 will not update atime unless this number | 53 | atime_quantum=60(*) OCFS2 will not update atime unless this number |
| 58 | of seconds has passed since the last update. | 54 | of seconds has passed since the last update. |
| 59 | Set to zero to always update atime. | 55 | Set to zero to always update atime. |
| 56 | data=ordered (*) All data are forced directly out to the main file | ||
| 57 | system prior to its metadata being committed to the | ||
| 58 | journal. | ||
| 59 | data=writeback Data ordering is not preserved, data may be written | ||
| 60 | into the main file system after its metadata has been | ||
| 61 | committed to the journal. | ||
| 62 | preferred_slot=0(*) During mount, try to use this filesystem slot first. If | ||
| 63 | it is in use by another node, the first empty one found | ||
| 64 | will be chosen. Invalid values will be ignored. | ||
diff --git a/Documentation/networking/multiqueue.txt b/Documentation/networking/multiqueue.txt index 00b60cce2224..ea5a42e8f79f 100644 --- a/Documentation/networking/multiqueue.txt +++ b/Documentation/networking/multiqueue.txt | |||
| @@ -58,9 +58,13 @@ software, so it's a straight round-robin qdisc. It uses the same syntax and | |||
| 58 | classification priomap that sch_prio uses, so it should be intuitive to | 58 | classification priomap that sch_prio uses, so it should be intuitive to |
| 59 | configure for people who've used sch_prio. | 59 | configure for people who've used sch_prio. |
| 60 | 60 | ||
| 61 | The PRIO qdisc naturally plugs into a multiqueue device. If PRIO has been | 61 | In order to utilitize the multiqueue features of the qdiscs, the network |
| 62 | built with NET_SCH_PRIO_MQ, then upon load, it will make sure the number of | 62 | device layer needs to enable multiple queue support. This can be done by |
| 63 | bands requested is equal to the number of queues on the hardware. If they | 63 | selecting NETDEVICES_MULTIQUEUE under Drivers. |
| 64 | |||
| 65 | The PRIO qdisc naturally plugs into a multiqueue device. If | ||
| 66 | NETDEVICES_MULTIQUEUE is selected, then on qdisc load, the number of | ||
| 67 | bands requested is compared to the number of queues on the hardware. If they | ||
| 64 | are equal, it sets a one-to-one mapping up between the queues and bands. If | 68 | are equal, it sets a one-to-one mapping up between the queues and bands. If |
| 65 | they're not equal, it will not load the qdisc. This is the same behavior | 69 | they're not equal, it will not load the qdisc. This is the same behavior |
| 66 | for RR. Once the association is made, any skb that is classified will have | 70 | for RR. Once the association is made, any skb that is classified will have |
diff --git a/arch/h8300/Kconfig.debug b/arch/h8300/Kconfig.debug index 554efe604a08..996d97e953b0 100644 --- a/arch/h8300/Kconfig.debug +++ b/arch/h8300/Kconfig.debug | |||
| @@ -59,7 +59,7 @@ config BLKDEV_RESERVE | |||
| 59 | help | 59 | help |
| 60 | Reserved BLKDEV area. | 60 | Reserved BLKDEV area. |
| 61 | 61 | ||
| 62 | config CONFIG_BLKDEV_RESERVE_ADDRESS | 62 | config BLKDEV_RESERVE_ADDRESS |
| 63 | hex 'start address' | 63 | hex 'start address' |
| 64 | depends on BLKDEV_RESERVE | 64 | depends on BLKDEV_RESERVE |
| 65 | help | 65 | help |
diff --git a/arch/i386/mm/highmem.c b/arch/i386/mm/highmem.c index ad8d86cc683e..1c3bf95f7356 100644 --- a/arch/i386/mm/highmem.c +++ b/arch/i386/mm/highmem.c | |||
| @@ -34,17 +34,16 @@ void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot) | |||
| 34 | /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ | 34 | /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ |
| 35 | pagefault_disable(); | 35 | pagefault_disable(); |
| 36 | 36 | ||
| 37 | idx = type + KM_TYPE_NR*smp_processor_id(); | ||
| 38 | BUG_ON(!pte_none(*(kmap_pte-idx))); | ||
| 39 | |||
| 40 | if (!PageHighMem(page)) | 37 | if (!PageHighMem(page)) |
| 41 | return page_address(page); | 38 | return page_address(page); |
| 42 | 39 | ||
| 40 | idx = type + KM_TYPE_NR*smp_processor_id(); | ||
| 43 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | 41 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); |
| 42 | BUG_ON(!pte_none(*(kmap_pte-idx))); | ||
| 44 | set_pte(kmap_pte-idx, mk_pte(page, prot)); | 43 | set_pte(kmap_pte-idx, mk_pte(page, prot)); |
| 45 | arch_flush_lazy_mmu_mode(); | 44 | arch_flush_lazy_mmu_mode(); |
| 46 | 45 | ||
| 47 | return (void*) vaddr; | 46 | return (void *)vaddr; |
| 48 | } | 47 | } |
| 49 | 48 | ||
| 50 | void *kmap_atomic(struct page *page, enum km_type type) | 49 | void *kmap_atomic(struct page *page, enum km_type type) |
diff --git a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c index 665db063a40a..8434f2323b87 100644 --- a/arch/i386/pci/irq.c +++ b/arch/i386/pci/irq.c | |||
| @@ -550,6 +550,7 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route | |||
| 550 | case PCI_DEVICE_ID_INTEL_ICH9_3: | 550 | case PCI_DEVICE_ID_INTEL_ICH9_3: |
| 551 | case PCI_DEVICE_ID_INTEL_ICH9_4: | 551 | case PCI_DEVICE_ID_INTEL_ICH9_4: |
| 552 | case PCI_DEVICE_ID_INTEL_ICH9_5: | 552 | case PCI_DEVICE_ID_INTEL_ICH9_5: |
| 553 | case PCI_DEVICE_ID_INTEL_TOLAPAI_0: | ||
| 553 | r->name = "PIIX/ICH"; | 554 | r->name = "PIIX/ICH"; |
| 554 | r->get = pirq_piix_get; | 555 | r->get = pirq_piix_get; |
| 555 | r->set = pirq_piix_set; | 556 | r->set = pirq_piix_set; |
diff --git a/arch/i386/pci/pcbios.c b/arch/i386/pci/pcbios.c index 5f5193401bea..10ac8c316c46 100644 --- a/arch/i386/pci/pcbios.c +++ b/arch/i386/pci/pcbios.c | |||
| @@ -412,7 +412,7 @@ struct irq_routing_options { | |||
| 412 | u16 segment; | 412 | u16 segment; |
| 413 | } __attribute__((packed)); | 413 | } __attribute__((packed)); |
| 414 | 414 | ||
| 415 | struct irq_routing_table * __devinit pcibios_get_irq_routing_table(void) | 415 | struct irq_routing_table * pcibios_get_irq_routing_table(void) |
| 416 | { | 416 | { |
| 417 | struct irq_routing_options opt; | 417 | struct irq_routing_options opt; |
| 418 | struct irq_routing_table *rt = NULL; | 418 | struct irq_routing_table *rt = NULL; |
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S index e162ee685d20..918f5dbeaef6 100644 --- a/arch/m68k/kernel/entry.S +++ b/arch/m68k/kernel/entry.S | |||
| @@ -735,4 +735,14 @@ sys_call_table: | |||
| 735 | .long sys_tee | 735 | .long sys_tee |
| 736 | .long sys_vmsplice | 736 | .long sys_vmsplice |
| 737 | .long sys_move_pages /* 310 */ | 737 | .long sys_move_pages /* 310 */ |
| 738 | .long sys_sched_setaffinity | ||
| 739 | .long sys_sched_getaffinity | ||
| 740 | .long sys_kexec_load | ||
| 741 | .long sys_getcpu | ||
| 742 | .long sys_epoll_pwait /* 315 */ | ||
| 743 | .long sys_utimensat | ||
| 744 | .long sys_signalfd | ||
| 745 | .long sys_timerfd | ||
| 746 | .long sys_eventfd | ||
| 747 | .long sys_fallocate /* 320 */ | ||
| 738 | 748 | ||
diff --git a/arch/m68knommu/kernel/syscalltable.S b/arch/m68knommu/kernel/syscalltable.S index 4603f4f3c935..9620093514bc 100644 --- a/arch/m68knommu/kernel/syscalltable.S +++ b/arch/m68knommu/kernel/syscalltable.S | |||
| @@ -329,6 +329,16 @@ ENTRY(sys_call_table) | |||
| 329 | .long sys_tee | 329 | .long sys_tee |
| 330 | .long sys_vmsplice | 330 | .long sys_vmsplice |
| 331 | .long sys_move_pages /* 310 */ | 331 | .long sys_move_pages /* 310 */ |
| 332 | .long sys_sched_setaffinity | ||
| 333 | .long sys_sched_getaffinity | ||
| 334 | .long sys_kexec_load | ||
| 335 | .long sys_getcpu | ||
| 336 | .long sys_epoll_pwait /* 315 */ | ||
| 337 | .long sys_utimensat | ||
| 338 | .long sys_signalfd | ||
| 339 | .long sys_timerfd | ||
| 340 | .long sys_eventfd | ||
| 341 | .long sys_fallocate /* 320 */ | ||
| 332 | 342 | ||
| 333 | .rept NR_syscalls-(.-sys_call_table)/4 | 343 | .rept NR_syscalls-(.-sys_call_table)/4 |
| 334 | .long sys_ni_syscall | 344 | .long sys_ni_syscall |
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c index 09d91505b90c..5240432e6d1d 100644 --- a/arch/mips/mm/init.c +++ b/arch/mips/mm/init.c | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | * Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com | 8 | * Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com |
| 9 | * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. | 9 | * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. |
| 10 | */ | 10 | */ |
| 11 | #include <linux/bug.h> | ||
| 11 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 12 | #include <linux/module.h> | 13 | #include <linux/module.h> |
| 13 | #include <linux/signal.h> | 14 | #include <linux/signal.h> |
| @@ -132,6 +133,8 @@ void *kmap_coherent(struct page *page, unsigned long addr) | |||
| 132 | pte_t pte; | 133 | pte_t pte; |
| 133 | int tlbidx; | 134 | int tlbidx; |
| 134 | 135 | ||
| 136 | BUG_ON(Page_dcache_dirty(page)); | ||
| 137 | |||
| 135 | inc_preempt_count(); | 138 | inc_preempt_count(); |
| 136 | idx = (addr >> PAGE_SHIFT) & (FIX_N_COLOURS - 1); | 139 | idx = (addr >> PAGE_SHIFT) & (FIX_N_COLOURS - 1); |
| 137 | #ifdef CONFIG_MIPS_MT_SMTC | 140 | #ifdef CONFIG_MIPS_MT_SMTC |
| @@ -208,7 +211,7 @@ void copy_user_highpage(struct page *to, struct page *from, | |||
| 208 | void *vfrom, *vto; | 211 | void *vfrom, *vto; |
| 209 | 212 | ||
| 210 | vto = kmap_atomic(to, KM_USER1); | 213 | vto = kmap_atomic(to, KM_USER1); |
| 211 | if (cpu_has_dc_aliases) { | 214 | if (cpu_has_dc_aliases && !Page_dcache_dirty(from)) { |
| 212 | vfrom = kmap_coherent(from, vaddr); | 215 | vfrom = kmap_coherent(from, vaddr); |
| 213 | copy_page(vto, vfrom); | 216 | copy_page(vto, vfrom); |
| 214 | kunmap_coherent(); | 217 | kunmap_coherent(); |
diff --git a/arch/mips/sgi-ip22/ip22-platform.c b/arch/mips/sgi-ip22/ip22-platform.c index 78b608d2d4e1..28ffec8e5d1a 100644 --- a/arch/mips/sgi-ip22/ip22-platform.c +++ b/arch/mips/sgi-ip22/ip22-platform.c | |||
| @@ -150,8 +150,8 @@ static int __init sgiseeq_devinit(void) | |||
| 150 | return res; | 150 | return res; |
| 151 | 151 | ||
| 152 | /* Second HPC is missing? */ | 152 | /* Second HPC is missing? */ |
| 153 | if (ip22_is_fullhouse() || | 153 | if (!ip22_is_fullhouse() || |
| 154 | !get_dbe(tmp, (unsigned int *)&hpc3c1->pbdma[1])) | 154 | get_dbe(tmp, (unsigned int *)&hpc3c1->pbdma[1])) |
| 155 | return 0; | 155 | return 0; |
| 156 | 156 | ||
| 157 | sgimc->giopar |= SGIMC_GIOPAR_MASTEREXP1 | SGIMC_GIOPAR_EXP164 | | 157 | sgimc->giopar |= SGIMC_GIOPAR_MASTEREXP1 | SGIMC_GIOPAR_EXP164 | |
diff --git a/arch/mips/sgi-ip22/ip22-time.c b/arch/mips/sgi-ip22/ip22-time.c index 8e88a442b22a..de3d01823ad5 100644 --- a/arch/mips/sgi-ip22/ip22-time.c +++ b/arch/mips/sgi-ip22/ip22-time.c | |||
| @@ -114,8 +114,8 @@ static unsigned long dosample(void) | |||
| 114 | } while (msb); | 114 | } while (msb); |
| 115 | 115 | ||
| 116 | /* Stop the counter. */ | 116 | /* Stop the counter. */ |
| 117 | writeb(sgint->tcword, (SGINT_TCWORD_CNT2 | SGINT_TCWORD_CALL | | 117 | writeb(SGINT_TCWORD_CNT2 | SGINT_TCWORD_CALL | SGINT_TCWORD_MSWST, |
| 118 | SGINT_TCWORD_MSWST)); | 118 | &sgint->tcword); |
| 119 | /* | 119 | /* |
| 120 | * Return the difference, this is how far the r4k counter increments | 120 | * Return the difference, this is how far the r4k counter increments |
| 121 | * for every 1/HZ seconds. We round off the nearest 1 MHz of master | 121 | * for every 1/HZ seconds. We round off the nearest 1 MHz of master |
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c index 139b4cff8019..e8dac81d8a0d 100644 --- a/arch/sparc64/kernel/pci.c +++ b/arch/sparc64/kernel/pci.c | |||
| @@ -744,7 +744,7 @@ static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm, | |||
| 744 | { | 744 | { |
| 745 | struct device_node *child; | 745 | struct device_node *child; |
| 746 | const u32 *reg; | 746 | const u32 *reg; |
| 747 | int reglen, devfn; | 747 | int reglen, devfn, prev_devfn; |
| 748 | struct pci_dev *dev; | 748 | struct pci_dev *dev; |
| 749 | 749 | ||
| 750 | if (ofpci_verbose) | 750 | if (ofpci_verbose) |
| @@ -752,14 +752,25 @@ static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm, | |||
| 752 | node->full_name, bus->number); | 752 | node->full_name, bus->number); |
| 753 | 753 | ||
| 754 | child = NULL; | 754 | child = NULL; |
| 755 | prev_devfn = -1; | ||
| 755 | while ((child = of_get_next_child(node, child)) != NULL) { | 756 | while ((child = of_get_next_child(node, child)) != NULL) { |
| 756 | if (ofpci_verbose) | 757 | if (ofpci_verbose) |
| 757 | printk(" * %s\n", child->full_name); | 758 | printk(" * %s\n", child->full_name); |
| 758 | reg = of_get_property(child, "reg", ®len); | 759 | reg = of_get_property(child, "reg", ®len); |
| 759 | if (reg == NULL || reglen < 20) | 760 | if (reg == NULL || reglen < 20) |
| 760 | continue; | 761 | continue; |
| 762 | |||
| 761 | devfn = (reg[0] >> 8) & 0xff; | 763 | devfn = (reg[0] >> 8) & 0xff; |
| 762 | 764 | ||
| 765 | /* This is a workaround for some device trees | ||
| 766 | * which list PCI devices twice. On the V100 | ||
| 767 | * for example, device number 3 is listed twice. | ||
| 768 | * Once as "pm" and once again as "lomp". | ||
| 769 | */ | ||
| 770 | if (devfn == prev_devfn) | ||
| 771 | continue; | ||
| 772 | prev_devfn = devfn; | ||
| 773 | |||
| 763 | /* create a new pci_dev for this device */ | 774 | /* create a new pci_dev for this device */ |
| 764 | dev = of_create_pci_dev(pbm, child, bus, devfn, 0); | 775 | dev = of_create_pci_dev(pbm, child, bus, devfn, 0); |
| 765 | if (!dev) | 776 | if (!dev) |
diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c index 94e5edc12ac9..71bdc3b3189c 100644 --- a/drivers/ata/pata_ali.c +++ b/drivers/ata/pata_ali.c | |||
| @@ -48,6 +48,13 @@ static struct dmi_system_id cable_dmi_table[] = { | |||
| 48 | DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"), | 48 | DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"), |
| 49 | }, | 49 | }, |
| 50 | }, | 50 | }, |
| 51 | { | ||
| 52 | .ident = "Toshiba Satelite S1800-814", | ||
| 53 | .matches = { | ||
| 54 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
| 55 | DMI_MATCH(DMI_PRODUCT_NAME, "S1800-814"), | ||
| 56 | }, | ||
| 57 | }, | ||
| 51 | { } | 58 | { } |
| 52 | }; | 59 | }; |
| 53 | 60 | ||
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index 92bf868ca056..504a95d888b2 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | #define DAC960_DriverVersion "2.5.48" | 20 | #define DAC960_DriverVersion "2.5.49" |
| 21 | #define DAC960_DriverDate "14 May 2006" | 21 | #define DAC960_DriverDate "21 Aug 2007" |
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
| @@ -1165,9 +1165,9 @@ static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T | |||
| 1165 | int i; | 1165 | int i; |
| 1166 | 1166 | ||
| 1167 | 1167 | ||
| 1168 | if (pci_set_dma_mask(Controller->PCIDevice, DAC690_V1_PciDmaMask)) | 1168 | if (pci_set_dma_mask(Controller->PCIDevice, DMA_32BIT_MASK)) |
| 1169 | return DAC960_Failure(Controller, "DMA mask out of range"); | 1169 | return DAC960_Failure(Controller, "DMA mask out of range"); |
| 1170 | Controller->BounceBufferLimit = DAC690_V1_PciDmaMask; | 1170 | Controller->BounceBufferLimit = DMA_32BIT_MASK; |
| 1171 | 1171 | ||
| 1172 | if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller)) { | 1172 | if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller)) { |
| 1173 | CommandMailboxesSize = 0; | 1173 | CommandMailboxesSize = 0; |
| @@ -1368,9 +1368,12 @@ static bool DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T | |||
| 1368 | dma_addr_t CommandMailboxDMA; | 1368 | dma_addr_t CommandMailboxDMA; |
| 1369 | DAC960_V2_CommandStatus_T CommandStatus; | 1369 | DAC960_V2_CommandStatus_T CommandStatus; |
| 1370 | 1370 | ||
| 1371 | if (pci_set_dma_mask(Controller->PCIDevice, DAC690_V2_PciDmaMask)) | 1371 | if (!pci_set_dma_mask(Controller->PCIDevice, DMA_64BIT_MASK)) |
| 1372 | return DAC960_Failure(Controller, "DMA mask out of range"); | 1372 | Controller->BounceBufferLimit = DMA_64BIT_MASK; |
| 1373 | Controller->BounceBufferLimit = DAC690_V2_PciDmaMask; | 1373 | else if (!pci_set_dma_mask(Controller->PCIDevice, DMA_32BIT_MASK)) |
| 1374 | Controller->BounceBufferLimit = DMA_32BIT_MASK; | ||
| 1375 | else | ||
| 1376 | return DAC960_Failure(Controller, "DMA mask out of range"); | ||
| 1374 | 1377 | ||
| 1375 | /* This is a temporary dma mapping, used only in the scope of this function */ | 1378 | /* This is a temporary dma mapping, used only in the scope of this function */ |
| 1376 | CommandMailbox = pci_alloc_consistent(PCI_Device, | 1379 | CommandMailbox = pci_alloc_consistent(PCI_Device, |
diff --git a/drivers/block/DAC960.h b/drivers/block/DAC960.h index f5e2436c39aa..85fa9bb63759 100644 --- a/drivers/block/DAC960.h +++ b/drivers/block/DAC960.h | |||
| @@ -61,13 +61,6 @@ | |||
| 61 | #define DAC960_V2_MaxPhysicalDevices 272 | 61 | #define DAC960_V2_MaxPhysicalDevices 272 |
| 62 | 62 | ||
| 63 | /* | 63 | /* |
| 64 | Define the pci dma mask supported by DAC960 V1 and V2 Firmware Controlers | ||
| 65 | */ | ||
| 66 | |||
| 67 | #define DAC690_V1_PciDmaMask 0xffffffff | ||
| 68 | #define DAC690_V2_PciDmaMask 0xffffffffffffffffULL | ||
| 69 | |||
| 70 | /* | ||
| 71 | Define a 32/64 bit I/O Address data type. | 64 | Define a 32/64 bit I/O Address data type. |
| 72 | */ | 65 | */ |
| 73 | 66 | ||
diff --git a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c index 59b054810ed0..98a9cdeaffb6 100644 --- a/drivers/bluetooth/hci_usb.c +++ b/drivers/bluetooth/hci_usb.c | |||
| @@ -691,15 +691,18 @@ static void hci_usb_rx_complete(struct urb *urb) | |||
| 691 | urb->iso_frame_desc[i].offset, | 691 | urb->iso_frame_desc[i].offset, |
| 692 | urb->iso_frame_desc[i].actual_length); | 692 | urb->iso_frame_desc[i].actual_length); |
| 693 | 693 | ||
| 694 | if (!urb->iso_frame_desc[i].status) | 694 | if (!urb->iso_frame_desc[i].status) { |
| 695 | husb->hdev->stat.byte_rx += urb->iso_frame_desc[i].actual_length; | ||
| 695 | hci_recv_fragment(husb->hdev, _urb->type, | 696 | hci_recv_fragment(husb->hdev, _urb->type, |
| 696 | urb->transfer_buffer + urb->iso_frame_desc[i].offset, | 697 | urb->transfer_buffer + urb->iso_frame_desc[i].offset, |
| 697 | urb->iso_frame_desc[i].actual_length); | 698 | urb->iso_frame_desc[i].actual_length); |
| 699 | } | ||
| 698 | } | 700 | } |
| 699 | #else | 701 | #else |
| 700 | ; | 702 | ; |
| 701 | #endif | 703 | #endif |
| 702 | } else { | 704 | } else { |
| 705 | husb->hdev->stat.byte_rx += count; | ||
| 703 | err = hci_recv_fragment(husb->hdev, _urb->type, urb->transfer_buffer, count); | 706 | err = hci_recv_fragment(husb->hdev, _urb->type, urb->transfer_buffer, count); |
| 704 | if (err < 0) { | 707 | if (err < 0) { |
| 705 | BT_ERR("%s corrupted packet: type %d count %d", | 708 | BT_ERR("%s corrupted packet: type %d count %d", |
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index 2c9ca2c64628..7c69bf259caa 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
| @@ -506,6 +506,11 @@ static void intel_i830_init_gtt_entries(void) | |||
| 506 | break; | 506 | break; |
| 507 | } | 507 | } |
| 508 | } else { | 508 | } else { |
| 509 | /* G33's GTT stolen memory is separate from gfx data | ||
| 510 | * stolen memory. | ||
| 511 | */ | ||
| 512 | if (IS_G33) | ||
| 513 | size = 0; | ||
| 509 | switch (gmch_ctrl & I830_GMCH_GMS_MASK) { | 514 | switch (gmch_ctrl & I830_GMCH_GMS_MASK) { |
| 510 | case I855_GMCH_GMS_STOLEN_1M: | 515 | case I855_GMCH_GMS_STOLEN_1M: |
| 511 | gtt_entries = MB(1) - KB(size); | 516 | gtt_entries = MB(1) - KB(size); |
| @@ -914,6 +919,7 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge) | |||
| 914 | struct aper_size_info_fixed *size; | 919 | struct aper_size_info_fixed *size; |
| 915 | int num_entries; | 920 | int num_entries; |
| 916 | u32 temp, temp2; | 921 | u32 temp, temp2; |
| 922 | int gtt_map_size = 256 * 1024; | ||
| 917 | 923 | ||
| 918 | size = agp_bridge->current_size; | 924 | size = agp_bridge->current_size; |
| 919 | page_order = size->page_order; | 925 | page_order = size->page_order; |
| @@ -923,7 +929,9 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge) | |||
| 923 | pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp); | 929 | pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp); |
| 924 | pci_read_config_dword(intel_private.pcidev, I915_PTEADDR,&temp2); | 930 | pci_read_config_dword(intel_private.pcidev, I915_PTEADDR,&temp2); |
| 925 | 931 | ||
| 926 | intel_private.gtt = ioremap(temp2, 256 * 1024); | 932 | if (IS_G33) |
| 933 | gtt_map_size = 1024 * 1024; /* 1M on G33 */ | ||
| 934 | intel_private.gtt = ioremap(temp2, gtt_map_size); | ||
| 927 | if (!intel_private.gtt) | 935 | if (!intel_private.gtt) |
| 928 | return -ENOMEM; | 936 | return -ENOMEM; |
| 929 | 937 | ||
diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c index 3423e9ee6481..4a8969cef315 100644 --- a/drivers/char/tty_ioctl.c +++ b/drivers/char/tty_ioctl.c | |||
| @@ -796,14 +796,14 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file, | |||
| 796 | retval = inq_canon(tty); | 796 | retval = inq_canon(tty); |
| 797 | return put_user(retval, (unsigned int __user *) arg); | 797 | return put_user(retval, (unsigned int __user *) arg); |
| 798 | case TIOCGLCKTRMIOS: | 798 | case TIOCGLCKTRMIOS: |
| 799 | if (kernel_termios_to_user_termios((struct termios __user *)arg, real_tty->termios_locked)) | 799 | if (kernel_termios_to_user_termios_1((struct termios __user *)arg, real_tty->termios_locked)) |
| 800 | return -EFAULT; | 800 | return -EFAULT; |
| 801 | return 0; | 801 | return 0; |
| 802 | 802 | ||
| 803 | case TIOCSLCKTRMIOS: | 803 | case TIOCSLCKTRMIOS: |
| 804 | if (!capable(CAP_SYS_ADMIN)) | 804 | if (!capable(CAP_SYS_ADMIN)) |
| 805 | return -EPERM; | 805 | return -EPERM; |
| 806 | if (user_termios_to_kernel_termios(real_tty->termios_locked, (struct termios __user *) arg)) | 806 | if (user_termios_to_kernel_termios_1(real_tty->termios_locked, (struct termios __user *) arg)) |
| 807 | return -EFAULT; | 807 | return -EFAULT; |
| 808 | return 0; | 808 | return 0; |
| 809 | 809 | ||
diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c index 3bba224cb55d..6eb434749cd5 100644 --- a/drivers/edac/e752x_edac.c +++ b/drivers/edac/e752x_edac.c | |||
| @@ -967,7 +967,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
| 967 | if (!force_function_unhide && !(stat8 & (1 << 5))) { | 967 | if (!force_function_unhide && !(stat8 & (1 << 5))) { |
| 968 | printk(KERN_INFO "Contact your BIOS vendor to see if the " | 968 | printk(KERN_INFO "Contact your BIOS vendor to see if the " |
| 969 | "E752x error registers can be safely un-hidden\n"); | 969 | "E752x error registers can be safely un-hidden\n"); |
| 970 | return -ENOMEM; | 970 | return -ENODEV; |
| 971 | } | 971 | } |
| 972 | stat8 |= (1 << 5); | 972 | stat8 |= (1 << 5); |
| 973 | pci_write_config_byte(pdev, E752X_DEVPRES1, stat8); | 973 | pci_write_config_byte(pdev, E752X_DEVPRES1, stat8); |
diff --git a/drivers/edac/edac_core.h b/drivers/edac/edac_core.h index 4e6bad15c4ba..e80af67664cc 100644 --- a/drivers/edac/edac_core.h +++ b/drivers/edac/edac_core.h | |||
| @@ -75,7 +75,7 @@ extern int edac_debug_level; | |||
| 75 | #define edac_debug_printk(level, fmt, arg...) \ | 75 | #define edac_debug_printk(level, fmt, arg...) \ |
| 76 | do { \ | 76 | do { \ |
| 77 | if (level <= edac_debug_level) \ | 77 | if (level <= edac_debug_level) \ |
| 78 | edac_printk(KERN_EMERG, EDAC_DEBUG, fmt, ##arg); \ | 78 | edac_printk(KERN_DEBUG, EDAC_DEBUG, fmt, ##arg); \ |
| 79 | } while(0) | 79 | } while(0) |
| 80 | 80 | ||
| 81 | #define debugf0( ... ) edac_debug_printk(0, __VA_ARGS__ ) | 81 | #define debugf0( ... ) edac_debug_printk(0, __VA_ARGS__ ) |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 7adb61bad6ad..4200251ff635 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
| @@ -781,7 +781,7 @@ endif | |||
| 781 | 781 | ||
| 782 | config BLK_DEV_IDE_PMAC | 782 | config BLK_DEV_IDE_PMAC |
| 783 | bool "Builtin PowerMac IDE support" | 783 | bool "Builtin PowerMac IDE support" |
| 784 | depends on PPC_PMAC && IDE=y | 784 | depends on PPC_PMAC && IDE=y && BLK_DEV_IDE=y |
| 785 | help | 785 | help |
| 786 | This driver provides support for the built-in IDE controller on | 786 | This driver provides support for the built-in IDE controller on |
| 787 | most of the recent Apple Power Macintoshes and PowerBooks. | 787 | most of the recent Apple Power Macintoshes and PowerBooks. |
| @@ -946,7 +946,7 @@ config BLK_DEV_Q40IDE | |||
| 946 | 946 | ||
| 947 | config BLK_DEV_MPC8xx_IDE | 947 | config BLK_DEV_MPC8xx_IDE |
| 948 | bool "MPC8xx IDE support" | 948 | bool "MPC8xx IDE support" |
| 949 | depends on 8xx && IDE=y && BLK_DEV_IDE=y | 949 | depends on 8xx && IDE=y && BLK_DEV_IDE=y && !PPC_MERGE |
| 950 | select IDE_GENERIC | 950 | select IDE_GENERIC |
| 951 | help | 951 | help |
| 952 | This option provides support for IDE on Motorola MPC8xx Systems. | 952 | This option provides support for IDE on Motorola MPC8xx Systems. |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index f4cd2700cae5..646a54e233d3 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
| @@ -615,8 +615,7 @@ u8 eighty_ninty_three (ide_drive_t *drive) | |||
| 615 | if (hwif->cbl != ATA_CBL_PATA80 && !ivb) | 615 | if (hwif->cbl != ATA_CBL_PATA80 && !ivb) |
| 616 | goto no_80w; | 616 | goto no_80w; |
| 617 | 617 | ||
| 618 | /* Check for SATA but only if we are ATA5 or higher */ | 618 | if (ide_dev_is_sata(id)) |
| 619 | if (id->hw_config == 0 && (id->major_rev_num & 0x7FE0)) | ||
| 620 | return 1; | 619 | return 1; |
| 621 | 620 | ||
| 622 | /* | 621 | /* |
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index 025689de50e9..11ecb618007c 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
| @@ -596,6 +596,13 @@ static struct dmi_system_id cable_dmi_table[] = { | |||
| 596 | DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"), | 596 | DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"), |
| 597 | }, | 597 | }, |
| 598 | }, | 598 | }, |
| 599 | { | ||
| 600 | .ident = "Toshiba Satellite S1800-814", | ||
| 601 | .matches = { | ||
| 602 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
| 603 | DMI_MATCH(DMI_PRODUCT_NAME, "S1800-814"), | ||
| 604 | }, | ||
| 605 | }, | ||
| 599 | { } | 606 | { } |
| 600 | }; | 607 | }; |
| 601 | 608 | ||
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index 2cd74c345a6c..39f1c89f7c86 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/drivers/ide/pci/hpt366.c Version 1.10 Jun 29, 2007 | 2 | * linux/drivers/ide/pci/hpt366.c Version 1.12 Aug 19, 2007 |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> | 4 | * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> |
| 5 | * Portions Copyright (C) 2001 Sun Microsystems, Inc. | 5 | * Portions Copyright (C) 2001 Sun Microsystems, Inc. |
| @@ -68,7 +68,8 @@ | |||
| 68 | * HPT37x chip family; save space by introducing the separate transfer mode | 68 | * HPT37x chip family; save space by introducing the separate transfer mode |
| 69 | * table in which the mode lookup is done | 69 | * table in which the mode lookup is done |
| 70 | * - use f_CNT value saved by the HighPoint BIOS as reading it directly gives | 70 | * - use f_CNT value saved by the HighPoint BIOS as reading it directly gives |
| 71 | * the wrong PCI frequency since DPLL has already been calibrated by BIOS | 71 | * the wrong PCI frequency since DPLL has already been calibrated by BIOS; |
| 72 | * read it only from the function 0 of HPT374 chips | ||
| 72 | * - fix the hotswap code: it caused RESET- to glitch when tristating the bus, | 73 | * - fix the hotswap code: it caused RESET- to glitch when tristating the bus, |
| 73 | * and for HPT36x the obsolete HDIO_TRISTATE_HWIF handler was called instead | 74 | * and for HPT36x the obsolete HDIO_TRISTATE_HWIF handler was called instead |
| 74 | * - pass to init_chipset() handlers a copy of the IDE PCI device structure as | 75 | * - pass to init_chipset() handlers a copy of the IDE PCI device structure as |
| @@ -113,6 +114,7 @@ | |||
| 113 | * unify HPT36x/37x timing setup code and the speedproc handlers by joining | 114 | * unify HPT36x/37x timing setup code and the speedproc handlers by joining |
| 114 | * the register setting lists into the table indexed by the clock selected | 115 | * the register setting lists into the table indexed by the clock selected |
| 115 | * - set the correct hwif->ultra_mask for each individual chip | 116 | * - set the correct hwif->ultra_mask for each individual chip |
| 117 | * - add UltraDMA mode filtering for the HPT37[24] based SATA cards | ||
| 116 | * Sergei Shtylyov, <sshtylyov@ru.mvista.com> or <source@mvista.com> | 118 | * Sergei Shtylyov, <sshtylyov@ru.mvista.com> or <source@mvista.com> |
| 117 | */ | 119 | */ |
| 118 | 120 | ||
| @@ -517,42 +519,44 @@ static int check_in_drive_list(ide_drive_t *drive, const char **list) | |||
| 517 | } | 519 | } |
| 518 | 520 | ||
| 519 | /* | 521 | /* |
| 520 | * Note for the future; the SATA hpt37x we must set | 522 | * The Marvell bridge chips used on the HighPoint SATA cards do not seem |
| 521 | * either PIO or UDMA modes 0,4,5 | 523 | * to support the UltraDMA modes 1, 2, and 3 as well as any MWDMA modes... |
| 522 | */ | 524 | */ |
| 523 | 525 | ||
| 524 | static u8 hpt3xx_udma_filter(ide_drive_t *drive) | 526 | static u8 hpt3xx_udma_filter(ide_drive_t *drive) |
| 525 | { | 527 | { |
| 526 | struct hpt_info *info = pci_get_drvdata(HWIF(drive)->pci_dev); | 528 | ide_hwif_t *hwif = HWIF(drive); |
| 527 | u8 mask; | 529 | struct hpt_info *info = pci_get_drvdata(hwif->pci_dev); |
| 530 | u8 mask = hwif->ultra_mask; | ||
| 528 | 531 | ||
| 529 | switch (info->chip_type) { | 532 | switch (info->chip_type) { |
| 530 | case HPT370A: | ||
| 531 | if (!HPT370_ALLOW_ATA100_5 || | ||
| 532 | check_in_drive_list(drive, bad_ata100_5)) | ||
| 533 | return 0x1f; | ||
| 534 | else | ||
| 535 | return 0x3f; | ||
| 536 | case HPT370: | ||
| 537 | if (!HPT370_ALLOW_ATA100_5 || | ||
| 538 | check_in_drive_list(drive, bad_ata100_5)) | ||
| 539 | mask = 0x1f; | ||
| 540 | else | ||
| 541 | mask = 0x3f; | ||
| 542 | break; | ||
| 543 | case HPT36x: | 533 | case HPT36x: |
| 544 | if (!HPT366_ALLOW_ATA66_4 || | 534 | if (!HPT366_ALLOW_ATA66_4 || |
| 545 | check_in_drive_list(drive, bad_ata66_4)) | 535 | check_in_drive_list(drive, bad_ata66_4)) |
| 546 | mask = 0x0f; | 536 | mask = ATA_UDMA3; |
| 547 | else | ||
| 548 | mask = 0x1f; | ||
| 549 | 537 | ||
| 550 | if (!HPT366_ALLOW_ATA66_3 || | 538 | if (!HPT366_ALLOW_ATA66_3 || |
| 551 | check_in_drive_list(drive, bad_ata66_3)) | 539 | check_in_drive_list(drive, bad_ata66_3)) |
| 552 | mask = 0x07; | 540 | mask = ATA_UDMA2; |
| 541 | break; | ||
| 542 | case HPT370: | ||
| 543 | if (!HPT370_ALLOW_ATA100_5 || | ||
| 544 | check_in_drive_list(drive, bad_ata100_5)) | ||
| 545 | mask = ATA_UDMA4; | ||
| 553 | break; | 546 | break; |
| 547 | case HPT370A: | ||
| 548 | if (!HPT370_ALLOW_ATA100_5 || | ||
| 549 | check_in_drive_list(drive, bad_ata100_5)) | ||
| 550 | return ATA_UDMA4; | ||
| 551 | case HPT372 : | ||
| 552 | case HPT372A: | ||
| 553 | case HPT372N: | ||
| 554 | case HPT374 : | ||
| 555 | if (ide_dev_is_sata(drive->id)) | ||
| 556 | mask &= ~0x0e; | ||
| 557 | /* Fall thru */ | ||
| 554 | default: | 558 | default: |
| 555 | return 0x7f; | 559 | return mask; |
| 556 | } | 560 | } |
| 557 | 561 | ||
| 558 | return check_in_drive_list(drive, bad_ata33) ? 0x00 : mask; | 562 | return check_in_drive_list(drive, bad_ata33) ? 0x00 : mask; |
| @@ -981,6 +985,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
| 981 | struct hpt_info *info = kmalloc(sizeof(struct hpt_info), GFP_KERNEL); | 985 | struct hpt_info *info = kmalloc(sizeof(struct hpt_info), GFP_KERNEL); |
| 982 | unsigned long io_base = pci_resource_start(dev, 4); | 986 | unsigned long io_base = pci_resource_start(dev, 4); |
| 983 | u8 pci_clk, dpll_clk = 0; /* PCI and DPLL clock in MHz */ | 987 | u8 pci_clk, dpll_clk = 0; /* PCI and DPLL clock in MHz */ |
| 988 | u8 chip_type; | ||
| 984 | enum ata_clock clock; | 989 | enum ata_clock clock; |
| 985 | 990 | ||
| 986 | if (info == NULL) { | 991 | if (info == NULL) { |
| @@ -992,7 +997,8 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
| 992 | * Copy everything from a static "template" structure | 997 | * Copy everything from a static "template" structure |
| 993 | * to just allocated per-chip hpt_info structure. | 998 | * to just allocated per-chip hpt_info structure. |
| 994 | */ | 999 | */ |
| 995 | *info = *(struct hpt_info *)pci_get_drvdata(dev); | 1000 | memcpy(info, pci_get_drvdata(dev), sizeof(struct hpt_info)); |
| 1001 | chip_type = info->chip_type; | ||
| 996 | 1002 | ||
| 997 | pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, (L1_CACHE_BYTES / 4)); | 1003 | pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, (L1_CACHE_BYTES / 4)); |
| 998 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x78); | 1004 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x78); |
| @@ -1002,7 +1008,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
| 1002 | /* | 1008 | /* |
| 1003 | * First, try to estimate the PCI clock frequency... | 1009 | * First, try to estimate the PCI clock frequency... |
| 1004 | */ | 1010 | */ |
| 1005 | if (info->chip_type >= HPT370) { | 1011 | if (chip_type >= HPT370) { |
| 1006 | u8 scr1 = 0; | 1012 | u8 scr1 = 0; |
| 1007 | u16 f_cnt = 0; | 1013 | u16 f_cnt = 0; |
| 1008 | u32 temp = 0; | 1014 | u32 temp = 0; |
| @@ -1016,7 +1022,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
| 1016 | * HighPoint does this for HPT372A. | 1022 | * HighPoint does this for HPT372A. |
| 1017 | * NOTE: This register is only writeable via I/O space. | 1023 | * NOTE: This register is only writeable via I/O space. |
| 1018 | */ | 1024 | */ |
| 1019 | if (info->chip_type == HPT372A) | 1025 | if (chip_type == HPT372A) |
| 1020 | outb(0x0e, io_base + 0x9c); | 1026 | outb(0x0e, io_base + 0x9c); |
| 1021 | 1027 | ||
| 1022 | /* | 1028 | /* |
| @@ -1034,13 +1040,28 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
| 1034 | * First try reading the register in which the HighPoint BIOS | 1040 | * First try reading the register in which the HighPoint BIOS |
| 1035 | * saves f_CNT value before reprogramming the DPLL from its | 1041 | * saves f_CNT value before reprogramming the DPLL from its |
| 1036 | * default setting (which differs for the various chips). | 1042 | * default setting (which differs for the various chips). |
| 1037 | * NOTE: This register is only accessible via I/O space. | ||
| 1038 | * | 1043 | * |
| 1039 | * In case the signature check fails, we'll have to resort to | 1044 | * NOTE: This register is only accessible via I/O space; |
| 1040 | * reading the f_CNT register itself in hopes that nobody has | 1045 | * HPT374 BIOS only saves it for the function 0, so we have to |
| 1041 | * touched the DPLL yet... | 1046 | * always read it from there -- no need to check the result of |
| 1047 | * pci_get_slot() for the function 0 as the whole device has | ||
| 1048 | * been already "pinned" (via function 1) in init_setup_hpt374() | ||
| 1049 | */ | ||
| 1050 | if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) { | ||
| 1051 | struct pci_dev *dev1 = pci_get_slot(dev->bus, | ||
| 1052 | dev->devfn - 1); | ||
| 1053 | unsigned long io_base = pci_resource_start(dev1, 4); | ||
| 1054 | |||
| 1055 | temp = inl(io_base + 0x90); | ||
| 1056 | pci_dev_put(dev1); | ||
| 1057 | } else | ||
| 1058 | temp = inl(io_base + 0x90); | ||
| 1059 | |||
| 1060 | /* | ||
| 1061 | * In case the signature check fails, we'll have to | ||
| 1062 | * resort to reading the f_CNT register itself in hopes | ||
| 1063 | * that nobody has touched the DPLL yet... | ||
| 1042 | */ | 1064 | */ |
| 1043 | temp = inl(io_base + 0x90); | ||
| 1044 | if ((temp & 0xFFFFF000) != 0xABCDE000) { | 1065 | if ((temp & 0xFFFFF000) != 0xABCDE000) { |
| 1045 | int i; | 1066 | int i; |
| 1046 | 1067 | ||
| @@ -1120,7 +1141,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
| 1120 | * We also don't like using the DPLL because this causes glitches | 1141 | * We also don't like using the DPLL because this causes glitches |
| 1121 | * on PRST-/SRST- when the state engine gets reset... | 1142 | * on PRST-/SRST- when the state engine gets reset... |
| 1122 | */ | 1143 | */ |
| 1123 | if (info->chip_type >= HPT374 || info->settings[clock] == NULL) { | 1144 | if (chip_type >= HPT374 || info->settings[clock] == NULL) { |
| 1124 | u16 f_low, delta = pci_clk < 50 ? 2 : 4; | 1145 | u16 f_low, delta = pci_clk < 50 ? 2 : 4; |
| 1125 | int adjust; | 1146 | int adjust; |
| 1126 | 1147 | ||
| @@ -1190,7 +1211,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
| 1190 | /* Point to this chip's own instance of the hpt_info structure. */ | 1211 | /* Point to this chip's own instance of the hpt_info structure. */ |
| 1191 | pci_set_drvdata(dev, info); | 1212 | pci_set_drvdata(dev, info); |
| 1192 | 1213 | ||
| 1193 | if (info->chip_type >= HPT370) { | 1214 | if (chip_type >= HPT370) { |
| 1194 | u8 mcr1, mcr4; | 1215 | u8 mcr1, mcr4; |
| 1195 | 1216 | ||
| 1196 | /* | 1217 | /* |
| @@ -1209,7 +1230,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
| 1209 | * the MISC. register to stretch the UltraDMA Tss timing. | 1230 | * the MISC. register to stretch the UltraDMA Tss timing. |
| 1210 | * NOTE: This register is only writeable via I/O space. | 1231 | * NOTE: This register is only writeable via I/O space. |
| 1211 | */ | 1232 | */ |
| 1212 | if (info->chip_type == HPT371N && clock == ATA_CLOCK_66MHZ) | 1233 | if (chip_type == HPT371N && clock == ATA_CLOCK_66MHZ) |
| 1213 | 1234 | ||
| 1214 | outb(inb(io_base + 0x9c) | 0x04, io_base + 0x9c); | 1235 | outb(inb(io_base + 0x9c) | 0x04, io_base + 0x9c); |
| 1215 | 1236 | ||
| @@ -1218,25 +1239,24 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
| 1218 | 1239 | ||
| 1219 | static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) | 1240 | static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) |
| 1220 | { | 1241 | { |
| 1221 | struct pci_dev *dev = hwif->pci_dev; | 1242 | struct pci_dev *dev = hwif->pci_dev; |
| 1222 | struct hpt_info *info = pci_get_drvdata(dev); | 1243 | struct hpt_info *info = pci_get_drvdata(dev); |
| 1223 | int serialize = HPT_SERIALIZE_IO; | 1244 | int serialize = HPT_SERIALIZE_IO; |
| 1224 | u8 scr1 = 0, ata66 = hwif->channel ? 0x01 : 0x02; | 1245 | u8 scr1 = 0, ata66 = hwif->channel ? 0x01 : 0x02; |
| 1225 | u8 chip_type = info->chip_type; | 1246 | u8 chip_type = info->chip_type; |
| 1226 | u8 new_mcr, old_mcr = 0; | 1247 | u8 new_mcr, old_mcr = 0; |
| 1227 | 1248 | ||
| 1228 | /* Cache the channel's MISC. control registers' offset */ | 1249 | /* Cache the channel's MISC. control registers' offset */ |
| 1229 | hwif->select_data = hwif->channel ? 0x54 : 0x50; | 1250 | hwif->select_data = hwif->channel ? 0x54 : 0x50; |
| 1230 | 1251 | ||
| 1231 | hwif->tuneproc = &hpt3xx_tune_drive; | 1252 | hwif->tuneproc = &hpt3xx_tune_drive; |
| 1232 | hwif->speedproc = &hpt3xx_tune_chipset; | 1253 | hwif->speedproc = &hpt3xx_tune_chipset; |
| 1233 | hwif->quirkproc = &hpt3xx_quirkproc; | 1254 | hwif->quirkproc = &hpt3xx_quirkproc; |
| 1234 | hwif->intrproc = &hpt3xx_intrproc; | 1255 | hwif->intrproc = &hpt3xx_intrproc; |
| 1235 | hwif->maskproc = &hpt3xx_maskproc; | 1256 | hwif->maskproc = &hpt3xx_maskproc; |
| 1236 | hwif->busproc = &hpt3xx_busproc; | 1257 | hwif->busproc = &hpt3xx_busproc; |
| 1237 | 1258 | ||
| 1238 | if (chip_type <= HPT370A) | 1259 | hwif->udma_filter = &hpt3xx_udma_filter; |
| 1239 | hwif->udma_filter = &hpt3xx_udma_filter; | ||
| 1240 | 1260 | ||
| 1241 | /* | 1261 | /* |
| 1242 | * HPT3xxN chips have some complications: | 1262 | * HPT3xxN chips have some complications: |
| @@ -1486,19 +1506,19 @@ static int __devinit init_setup_hpt366(struct pci_dev *dev, ide_pci_device_t *d) | |||
| 1486 | d->host_flags |= IDE_HFLAG_SINGLE; | 1506 | d->host_flags |= IDE_HFLAG_SINGLE; |
| 1487 | d->enablebits[0].mask = d->enablebits[0].val = 0x10; | 1507 | d->enablebits[0].mask = d->enablebits[0].val = 0x10; |
| 1488 | 1508 | ||
| 1489 | d->udma_mask = HPT366_ALLOW_ATA66_3 ? | 1509 | d->udma_mask = HPT366_ALLOW_ATA66_3 ? (HPT366_ALLOW_ATA66_4 ? |
| 1490 | (HPT366_ALLOW_ATA66_4 ? 0x1f : 0x0f) : 0x07; | 1510 | ATA_UDMA4 : ATA_UDMA3) : ATA_UDMA2; |
| 1491 | break; | 1511 | break; |
| 1492 | case 3: | 1512 | case 3: |
| 1493 | case 4: | 1513 | case 4: |
| 1494 | d->udma_mask = HPT370_ALLOW_ATA100_5 ? 0x3f : 0x1f; | 1514 | d->udma_mask = HPT370_ALLOW_ATA100_5 ? ATA_UDMA5 : ATA_UDMA4; |
| 1495 | break; | 1515 | break; |
| 1496 | default: | 1516 | default: |
| 1497 | rev = 6; | 1517 | rev = 6; |
| 1498 | /* fall thru */ | 1518 | /* fall thru */ |
| 1499 | case 5: | 1519 | case 5: |
| 1500 | case 6: | 1520 | case 6: |
| 1501 | d->udma_mask = HPT372_ALLOW_ATA133_6 ? 0x7f : 0x3f; | 1521 | d->udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5; |
| 1502 | break; | 1522 | break; |
| 1503 | } | 1523 | } |
| 1504 | 1524 | ||
| @@ -1559,7 +1579,7 @@ static ide_pci_device_t hpt366_chipsets[] __devinitdata = { | |||
| 1559 | .init_dma = init_dma_hpt366, | 1579 | .init_dma = init_dma_hpt366, |
| 1560 | .autodma = AUTODMA, | 1580 | .autodma = AUTODMA, |
| 1561 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1581 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
| 1562 | .udma_mask = HPT372_ALLOW_ATA133_6 ? 0x7f : 0x3f, | 1582 | .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
| 1563 | .bootable = OFF_BOARD, | 1583 | .bootable = OFF_BOARD, |
| 1564 | .extra = 240, | 1584 | .extra = 240, |
| 1565 | .pio_mask = ATA_PIO4, | 1585 | .pio_mask = ATA_PIO4, |
| @@ -1571,7 +1591,7 @@ static ide_pci_device_t hpt366_chipsets[] __devinitdata = { | |||
| 1571 | .init_dma = init_dma_hpt366, | 1591 | .init_dma = init_dma_hpt366, |
| 1572 | .autodma = AUTODMA, | 1592 | .autodma = AUTODMA, |
| 1573 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1593 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
| 1574 | .udma_mask = HPT302_ALLOW_ATA133_6 ? 0x7f : 0x3f, | 1594 | .udma_mask = HPT302_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
| 1575 | .bootable = OFF_BOARD, | 1595 | .bootable = OFF_BOARD, |
| 1576 | .extra = 240, | 1596 | .extra = 240, |
| 1577 | .pio_mask = ATA_PIO4, | 1597 | .pio_mask = ATA_PIO4, |
| @@ -1583,7 +1603,7 @@ static ide_pci_device_t hpt366_chipsets[] __devinitdata = { | |||
| 1583 | .init_dma = init_dma_hpt366, | 1603 | .init_dma = init_dma_hpt366, |
| 1584 | .autodma = AUTODMA, | 1604 | .autodma = AUTODMA, |
| 1585 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1605 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
| 1586 | .udma_mask = HPT371_ALLOW_ATA133_6 ? 0x7f : 0x3f, | 1606 | .udma_mask = HPT371_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
| 1587 | .bootable = OFF_BOARD, | 1607 | .bootable = OFF_BOARD, |
| 1588 | .extra = 240, | 1608 | .extra = 240, |
| 1589 | .pio_mask = ATA_PIO4, | 1609 | .pio_mask = ATA_PIO4, |
| @@ -1595,7 +1615,7 @@ static ide_pci_device_t hpt366_chipsets[] __devinitdata = { | |||
| 1595 | .init_dma = init_dma_hpt366, | 1615 | .init_dma = init_dma_hpt366, |
| 1596 | .autodma = AUTODMA, | 1616 | .autodma = AUTODMA, |
| 1597 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1617 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
| 1598 | .udma_mask = 0x3f, | 1618 | .udma_mask = ATA_UDMA5, |
| 1599 | .bootable = OFF_BOARD, | 1619 | .bootable = OFF_BOARD, |
| 1600 | .extra = 240, | 1620 | .extra = 240, |
| 1601 | .pio_mask = ATA_PIO4, | 1621 | .pio_mask = ATA_PIO4, |
| @@ -1607,7 +1627,7 @@ static ide_pci_device_t hpt366_chipsets[] __devinitdata = { | |||
| 1607 | .init_dma = init_dma_hpt366, | 1627 | .init_dma = init_dma_hpt366, |
| 1608 | .autodma = AUTODMA, | 1628 | .autodma = AUTODMA, |
| 1609 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1629 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
| 1610 | .udma_mask = HPT372_ALLOW_ATA133_6 ? 0x7f : 0x3f, | 1630 | .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
| 1611 | .bootable = OFF_BOARD, | 1631 | .bootable = OFF_BOARD, |
| 1612 | .extra = 240, | 1632 | .extra = 240, |
| 1613 | .pio_mask = ATA_PIO4, | 1633 | .pio_mask = ATA_PIO4, |
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index f6db2f37efad..7b0e479c355c 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | * Split from: | 9 | * Split from: |
| 10 | * linux/drivers/ide/pdc202xx.c Version 0.35 Mar. 30, 2002 | 10 | * linux/drivers/ide/pdc202xx.c Version 0.35 Mar. 30, 2002 |
| 11 | * Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org> | 11 | * Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org> |
| 12 | * Copyright (C) 2005-2006 MontaVista Software, Inc. | 12 | * Copyright (C) 2005-2007 MontaVista Software, Inc. |
| 13 | * Portions Copyright (C) 1999 Promise Technology, Inc. | 13 | * Portions Copyright (C) 1999 Promise Technology, Inc. |
| 14 | * Author: Frank Tiernan (frankt@promise.com) | 14 | * Author: Frank Tiernan (frankt@promise.com) |
| 15 | * Released under terms of General Public License | 15 | * Released under terms of General Public License |
| @@ -341,7 +341,7 @@ static long __devinit detect_pll_input_clock(unsigned long dma_base) | |||
| 341 | */ | 341 | */ |
| 342 | usec_elapsed = (end_time.tv_sec - start_time.tv_sec) * 1000000 + | 342 | usec_elapsed = (end_time.tv_sec - start_time.tv_sec) * 1000000 + |
| 343 | (end_time.tv_usec - start_time.tv_usec); | 343 | (end_time.tv_usec - start_time.tv_usec); |
| 344 | pll_input = ((start_count - end_count) & 0x3ffffff) / 10 * | 344 | pll_input = ((start_count - end_count) & 0x3fffffff) / 10 * |
| 345 | (10000000 / usec_elapsed); | 345 | (10000000 / usec_elapsed); |
| 346 | 346 | ||
| 347 | DBG("start[%ld] end[%ld]\n", start_count, end_count); | 347 | DBG("start[%ld] end[%ld]\n", start_count, end_count); |
| @@ -535,7 +535,7 @@ static int __devinit init_setup_pdc20270(struct pci_dev *dev, | |||
| 535 | (dev->bus->self->device == PCI_DEVICE_ID_DEC_21150)) { | 535 | (dev->bus->self->device == PCI_DEVICE_ID_DEC_21150)) { |
| 536 | if (PCI_SLOT(dev->devfn) & 2) | 536 | if (PCI_SLOT(dev->devfn) & 2) |
| 537 | return -ENODEV; | 537 | return -ENODEV; |
| 538 | d->extra = 0; | 538 | |
| 539 | while ((findev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, findev)) != NULL) { | 539 | while ((findev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, findev)) != NULL) { |
| 540 | if ((findev->vendor == dev->vendor) && | 540 | if ((findev->vendor == dev->vendor) && |
| 541 | (findev->device == dev->device) && | 541 | (findev->device == dev->device) && |
| @@ -544,7 +544,8 @@ static int __devinit init_setup_pdc20270(struct pci_dev *dev, | |||
| 544 | findev->irq = dev->irq; | 544 | findev->irq = dev->irq; |
| 545 | } | 545 | } |
| 546 | ret = ide_setup_pci_devices(dev, findev, d); | 546 | ret = ide_setup_pci_devices(dev, findev, d); |
| 547 | pci_dev_put(findev); | 547 | if (ret < 0) |
| 548 | pci_dev_put(findev); | ||
| 548 | return ret; | 549 | return ret; |
| 549 | } | 550 | } |
| 550 | } | 551 | } |
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c index 8c539381d622..a7be7795e6af 100644 --- a/drivers/ide/pci/via82cxxx.c +++ b/drivers/ide/pci/via82cxxx.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * | 2 | * |
| 3 | * Version 3.46 | 3 | * Version 3.47 |
| 4 | * | 4 | * |
| 5 | * VIA IDE driver for Linux. Supported southbridges: | 5 | * VIA IDE driver for Linux. Supported southbridges: |
| 6 | * | 6 | * |
| @@ -430,19 +430,26 @@ static struct dmi_system_id cable_dmi_table[] = { | |||
| 430 | { } | 430 | { } |
| 431 | }; | 431 | }; |
| 432 | 432 | ||
| 433 | static int via_cable_override(void) | 433 | static int via_cable_override(struct pci_dev *pdev) |
| 434 | { | 434 | { |
| 435 | /* Systems by DMI */ | 435 | /* Systems by DMI */ |
| 436 | if (dmi_check_system(cable_dmi_table)) | 436 | if (dmi_check_system(cable_dmi_table)) |
| 437 | return 1; | 437 | return 1; |
| 438 | |||
| 439 | /* Arima W730-K8/Targa Visionary 811/... */ | ||
| 440 | if (pdev->subsystem_vendor == 0x161F && | ||
| 441 | pdev->subsystem_device == 0x2032) | ||
| 442 | return 1; | ||
| 443 | |||
| 438 | return 0; | 444 | return 0; |
| 439 | } | 445 | } |
| 440 | 446 | ||
| 441 | static u8 __devinit via82cxxx_cable_detect(ide_hwif_t *hwif) | 447 | static u8 __devinit via82cxxx_cable_detect(ide_hwif_t *hwif) |
| 442 | { | 448 | { |
| 443 | struct via82cxxx_dev *vdev = pci_get_drvdata(hwif->pci_dev); | 449 | struct pci_dev *pdev = hwif->pci_dev; |
| 450 | struct via82cxxx_dev *vdev = pci_get_drvdata(pdev); | ||
| 444 | 451 | ||
| 445 | if (via_cable_override()) | 452 | if (via_cable_override(pdev)) |
| 446 | return ATA_CBL_PATA40_SHORT; | 453 | return ATA_CBL_PATA40_SHORT; |
| 447 | 454 | ||
| 448 | if ((vdev->via_80w >> hwif->channel) & 1) | 455 | if ((vdev->via_80w >> hwif->channel) & 1) |
diff --git a/drivers/ide/ppc/mpc8xx.c b/drivers/ide/ppc/mpc8xx.c index 8859fe2f5ac2..dab79afa9b22 100644 --- a/drivers/ide/ppc/mpc8xx.c +++ b/drivers/ide/ppc/mpc8xx.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | #include <asm/mpc8xx.h> | 32 | #include <asm/mpc8xx.h> |
| 33 | #include <asm/mmu.h> | 33 | #include <asm/mmu.h> |
| 34 | #include <asm/processor.h> | 34 | #include <asm/processor.h> |
| 35 | #include <asm/residual.h> | ||
| 36 | #include <asm/io.h> | 35 | #include <asm/io.h> |
| 37 | #include <asm/pgtable.h> | 36 | #include <asm/pgtable.h> |
| 38 | #include <asm/ide.h> | 37 | #include <asm/ide.h> |
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index 30e596c0f120..1129f8c30840 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
| @@ -816,19 +816,15 @@ static int __init ide_scan_pcidev(struct pci_dev *dev) | |||
| 816 | struct list_head *l; | 816 | struct list_head *l; |
| 817 | struct pci_driver *d; | 817 | struct pci_driver *d; |
| 818 | 818 | ||
| 819 | list_for_each(l, &ide_pci_drivers) | 819 | list_for_each(l, &ide_pci_drivers) { |
| 820 | { | ||
| 821 | d = list_entry(l, struct pci_driver, node); | 820 | d = list_entry(l, struct pci_driver, node); |
| 822 | if(d->id_table) | 821 | if (d->id_table) { |
| 823 | { | 822 | const struct pci_device_id *id = pci_match_id(d->id_table, |
| 824 | const struct pci_device_id *id = pci_match_id(d->id_table, dev); | 823 | dev); |
| 825 | if(id != NULL) | 824 | if (id != NULL && d->probe(dev, id) >= 0) { |
| 826 | { | 825 | dev->driver = d; |
| 827 | if(d->probe(dev, id) >= 0) | 826 | pci_dev_get(dev); |
| 828 | { | 827 | return 1; |
| 829 | dev->driver = d; | ||
| 830 | return 1; | ||
| 831 | } | ||
| 832 | } | 828 | } |
| 833 | } | 829 | } |
| 834 | } | 830 | } |
| @@ -851,15 +847,13 @@ void __init ide_scan_pcibus (int scan_direction) | |||
| 851 | struct list_head *l, *n; | 847 | struct list_head *l, *n; |
| 852 | 848 | ||
| 853 | pre_init = 0; | 849 | pre_init = 0; |
| 854 | if (!scan_direction) { | 850 | if (!scan_direction) |
| 855 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 851 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) |
| 856 | ide_scan_pcidev(dev); | 852 | ide_scan_pcidev(dev); |
| 857 | } | 853 | else |
| 858 | } else { | 854 | while ((dev = pci_get_device_reverse(PCI_ANY_ID, PCI_ANY_ID, dev)) |
| 859 | while ((dev = pci_get_device_reverse(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 855 | != NULL) |
| 860 | ide_scan_pcidev(dev); | 856 | ide_scan_pcidev(dev); |
| 861 | } | ||
| 862 | } | ||
| 863 | 857 | ||
| 864 | /* | 858 | /* |
| 865 | * Hand the drivers over to the PCI layer now we | 859 | * Hand the drivers over to the PCI layer now we |
| @@ -869,12 +863,9 @@ void __init ide_scan_pcibus (int scan_direction) | |||
| 869 | list_for_each_safe(l, n, &ide_pci_drivers) { | 863 | list_for_each_safe(l, n, &ide_pci_drivers) { |
| 870 | list_del(l); | 864 | list_del(l); |
| 871 | d = list_entry(l, struct pci_driver, node); | 865 | d = list_entry(l, struct pci_driver, node); |
| 872 | if (__pci_register_driver(d, d->driver.owner, | 866 | if (__pci_register_driver(d, d->driver.owner, d->driver.mod_name)) |
| 873 | d->driver.mod_name)) { | 867 | printk(KERN_ERR "%s: failed to register driver for %s\n", |
| 874 | printk(KERN_ERR "%s: failed to register driver " | 868 | __FUNCTION__, d->driver.mod_name); |
| 875 | "for %s\n", __FUNCTION__, | ||
| 876 | d->driver.mod_name); | ||
| 877 | } | ||
| 878 | } | 869 | } |
| 879 | } | 870 | } |
| 880 | #endif | 871 | #endif |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 702a526cf45b..f8fe42148093 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -211,6 +211,16 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
| 211 | }, | 211 | }, |
| 212 | }, | 212 | }, |
| 213 | { | 213 | { |
| 214 | /* | ||
| 215 | * Like DV4017EA does not raise AUXERR for errors on MUX ports. | ||
| 216 | */ | ||
| 217 | .ident = "HP Pavilion DV4270ca", | ||
| 218 | .matches = { | ||
| 219 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 220 | DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"), | ||
| 221 | }, | ||
| 222 | }, | ||
| 223 | { | ||
| 214 | .ident = "Toshiba P10", | 224 | .ident = "Toshiba P10", |
| 215 | .matches = { | 225 | .matches = { |
| 216 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | 226 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 06b05dd22485..c2eea2767e10 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
| @@ -1040,7 +1040,7 @@ static void __devinit i8042_register_ports(void) | |||
| 1040 | } | 1040 | } |
| 1041 | } | 1041 | } |
| 1042 | 1042 | ||
| 1043 | static void __devinit i8042_unregister_ports(void) | 1043 | static void __devexit i8042_unregister_ports(void) |
| 1044 | { | 1044 | { |
| 1045 | int i; | 1045 | int i; |
| 1046 | 1046 | ||
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index b407028ffc59..741f6c6f1e50 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c | |||
| @@ -767,7 +767,7 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
| 767 | le16_to_cpu(udev->descriptor.idProduct)); | 767 | le16_to_cpu(udev->descriptor.idProduct)); |
| 768 | 768 | ||
| 769 | usb_make_path(udev, usbtouch->phys, sizeof(usbtouch->phys)); | 769 | usb_make_path(udev, usbtouch->phys, sizeof(usbtouch->phys)); |
| 770 | strlcpy(usbtouch->phys, "/input0", sizeof(usbtouch->phys)); | 770 | strlcat(usbtouch->phys, "/input0", sizeof(usbtouch->phys)); |
| 771 | 771 | ||
| 772 | input_dev->name = usbtouch->name; | 772 | input_dev->name = usbtouch->name; |
| 773 | input_dev->phys = usbtouch->phys; | 773 | input_dev->phys = usbtouch->phys; |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 2aff4be35dc4..4d63773ee73a 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -2541,7 +2541,7 @@ static void handle_stripe_expansion(raid5_conf_t *conf, struct stripe_head *sh, | |||
| 2541 | struct dma_async_tx_descriptor *tx = NULL; | 2541 | struct dma_async_tx_descriptor *tx = NULL; |
| 2542 | clear_bit(STRIPE_EXPAND_SOURCE, &sh->state); | 2542 | clear_bit(STRIPE_EXPAND_SOURCE, &sh->state); |
| 2543 | for (i = 0; i < sh->disks; i++) | 2543 | for (i = 0; i < sh->disks; i++) |
| 2544 | if (i != sh->pd_idx && (r6s && i != r6s->qd_idx)) { | 2544 | if (i != sh->pd_idx && (!r6s || i != r6s->qd_idx)) { |
| 2545 | int dd_idx, pd_idx, j; | 2545 | int dd_idx, pd_idx, j; |
| 2546 | struct stripe_head *sh2; | 2546 | struct stripe_head *sh2; |
| 2547 | 2547 | ||
| @@ -2574,7 +2574,8 @@ static void handle_stripe_expansion(raid5_conf_t *conf, struct stripe_head *sh, | |||
| 2574 | set_bit(R5_UPTODATE, &sh2->dev[dd_idx].flags); | 2574 | set_bit(R5_UPTODATE, &sh2->dev[dd_idx].flags); |
| 2575 | for (j = 0; j < conf->raid_disks; j++) | 2575 | for (j = 0; j < conf->raid_disks; j++) |
| 2576 | if (j != sh2->pd_idx && | 2576 | if (j != sh2->pd_idx && |
| 2577 | (r6s && j != r6s->qd_idx) && | 2577 | (!r6s || j != raid6_next_disk(sh2->pd_idx, |
| 2578 | sh2->disks)) && | ||
| 2578 | !test_bit(R5_Expanded, &sh2->dev[j].flags)) | 2579 | !test_bit(R5_Expanded, &sh2->dev[j].flags)) |
| 2579 | break; | 2580 | break; |
| 2580 | if (j == conf->raid_disks) { | 2581 | if (j == conf->raid_disks) { |
| @@ -2583,12 +2584,12 @@ static void handle_stripe_expansion(raid5_conf_t *conf, struct stripe_head *sh, | |||
| 2583 | } | 2584 | } |
| 2584 | release_stripe(sh2); | 2585 | release_stripe(sh2); |
| 2585 | 2586 | ||
| 2586 | /* done submitting copies, wait for them to complete */ | ||
| 2587 | if (i + 1 >= sh->disks) { | ||
| 2588 | async_tx_ack(tx); | ||
| 2589 | dma_wait_for_async_tx(tx); | ||
| 2590 | } | ||
| 2591 | } | 2587 | } |
| 2588 | /* done submitting copies, wait for them to complete */ | ||
| 2589 | if (tx) { | ||
| 2590 | async_tx_ack(tx); | ||
| 2591 | dma_wait_for_async_tx(tx); | ||
| 2592 | } | ||
| 2592 | } | 2593 | } |
| 2593 | 2594 | ||
| 2594 | /* | 2595 | /* |
| @@ -2855,7 +2856,7 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 2855 | sh->disks = conf->raid_disks; | 2856 | sh->disks = conf->raid_disks; |
| 2856 | sh->pd_idx = stripe_to_pdidx(sh->sector, conf, | 2857 | sh->pd_idx = stripe_to_pdidx(sh->sector, conf, |
| 2857 | conf->raid_disks); | 2858 | conf->raid_disks); |
| 2858 | s.locked += handle_write_operations5(sh, 0, 1); | 2859 | s.locked += handle_write_operations5(sh, 1, 1); |
| 2859 | } else if (s.expanded && | 2860 | } else if (s.expanded && |
| 2860 | !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) { | 2861 | !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) { |
| 2861 | clear_bit(STRIPE_EXPAND_READY, &sh->state); | 2862 | clear_bit(STRIPE_EXPAND_READY, &sh->state); |
diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c index bfebd2fa7ada..955ea60583b5 100644 --- a/drivers/mmc/host/at91_mci.c +++ b/drivers/mmc/host/at91_mci.c | |||
| @@ -941,7 +941,7 @@ static int __exit at91_mci_remove(struct platform_device *pdev) | |||
| 941 | 941 | ||
| 942 | host = mmc_priv(mmc); | 942 | host = mmc_priv(mmc); |
| 943 | 943 | ||
| 944 | if (host->present != -1) { | 944 | if (host->board->det_pin) { |
| 945 | device_init_wakeup(&pdev->dev, 0); | 945 | device_init_wakeup(&pdev->dev, 0); |
| 946 | free_irq(host->board->det_pin, host); | 946 | free_irq(host->board->det_pin, host); |
| 947 | cancel_delayed_work(&host->mmc->detect); | 947 | cancel_delayed_work(&host->mmc->detect); |
| @@ -972,7 +972,7 @@ static int at91_mci_suspend(struct platform_device *pdev, pm_message_t state) | |||
| 972 | struct at91mci_host *host = mmc_priv(mmc); | 972 | struct at91mci_host *host = mmc_priv(mmc); |
| 973 | int ret = 0; | 973 | int ret = 0; |
| 974 | 974 | ||
| 975 | if (device_may_wakeup(&pdev->dev)) | 975 | if (host->board->det_pin && device_may_wakeup(&pdev->dev)) |
| 976 | enable_irq_wake(host->board->det_pin); | 976 | enable_irq_wake(host->board->det_pin); |
| 977 | 977 | ||
| 978 | if (mmc) | 978 | if (mmc) |
| @@ -987,7 +987,7 @@ static int at91_mci_resume(struct platform_device *pdev) | |||
| 987 | struct at91mci_host *host = mmc_priv(mmc); | 987 | struct at91mci_host *host = mmc_priv(mmc); |
| 988 | int ret = 0; | 988 | int ret = 0; |
| 989 | 989 | ||
| 990 | if (device_may_wakeup(&pdev->dev)) | 990 | if (host->board->det_pin && device_may_wakeup(&pdev->dev)) |
| 991 | disable_irq_wake(host->board->det_pin); | 991 | disable_irq_wake(host->board->det_pin); |
| 992 | 992 | ||
| 993 | if (mmc) | 993 | if (mmc) |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 58740428dd07..9034a05734ef 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -64,8 +64,8 @@ | |||
| 64 | 64 | ||
| 65 | #define DRV_MODULE_NAME "tg3" | 65 | #define DRV_MODULE_NAME "tg3" |
| 66 | #define PFX DRV_MODULE_NAME ": " | 66 | #define PFX DRV_MODULE_NAME ": " |
| 67 | #define DRV_MODULE_VERSION "3.80" | 67 | #define DRV_MODULE_VERSION "3.81" |
| 68 | #define DRV_MODULE_RELDATE "August 2, 2007" | 68 | #define DRV_MODULE_RELDATE "September 5, 2007" |
| 69 | 69 | ||
| 70 | #define TG3_DEF_MAC_MODE 0 | 70 | #define TG3_DEF_MAC_MODE 0 |
| 71 | #define TG3_DEF_RX_MODE 0 | 71 | #define TG3_DEF_RX_MODE 0 |
| @@ -7127,6 +7127,10 @@ static int tg3_open(struct net_device *dev) | |||
| 7127 | } else if (pci_enable_msi(tp->pdev) == 0) { | 7127 | } else if (pci_enable_msi(tp->pdev) == 0) { |
| 7128 | u32 msi_mode; | 7128 | u32 msi_mode; |
| 7129 | 7129 | ||
| 7130 | /* Hardware bug - MSI won't work if INTX disabled. */ | ||
| 7131 | if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) | ||
| 7132 | pci_intx(tp->pdev, 1); | ||
| 7133 | |||
| 7130 | msi_mode = tr32(MSGINT_MODE); | 7134 | msi_mode = tr32(MSGINT_MODE); |
| 7131 | tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE); | 7135 | tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE); |
| 7132 | tp->tg3_flags2 |= TG3_FLG2_USING_MSI; | 7136 | tp->tg3_flags2 |= TG3_FLG2_USING_MSI; |
| @@ -12172,6 +12176,11 @@ static int tg3_resume(struct pci_dev *pdev) | |||
| 12172 | if (err) | 12176 | if (err) |
| 12173 | return err; | 12177 | return err; |
| 12174 | 12178 | ||
| 12179 | /* Hardware bug - MSI won't work if INTX disabled. */ | ||
| 12180 | if ((tp->tg3_flags2 & TG3_FLG2_5780_CLASS) && | ||
| 12181 | (tp->tg3_flags2 & TG3_FLG2_USING_MSI)) | ||
| 12182 | pci_intx(tp->pdev, 1); | ||
| 12183 | |||
| 12175 | netif_device_attach(dev); | 12184 | netif_device_attach(dev); |
| 12176 | 12185 | ||
| 12177 | tg3_full_lock(tp, 0); | 12186 | tg3_full_lock(tp, 0); |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 27e00b2d7b5b..171ca712e523 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -285,7 +285,7 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) | |||
| 285 | } | 285 | } |
| 286 | } | 286 | } |
| 287 | 287 | ||
| 288 | void __devinit pci_read_bridge_bases(struct pci_bus *child) | 288 | void pci_read_bridge_bases(struct pci_bus *child) |
| 289 | { | 289 | { |
| 290 | struct pci_dev *dev = child->self; | 290 | struct pci_dev *dev = child->self; |
| 291 | u8 io_base_lo, io_limit_lo; | 291 | u8 io_base_lo, io_limit_lo; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 2d40f437b9fc..7dcaa09b3c20 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -972,8 +972,8 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, k8t_sound_ho | |||
| 972 | * | 972 | * |
| 973 | * The SMBus PCI Device can be activated by setting a bit in the ICH LPC | 973 | * The SMBus PCI Device can be activated by setting a bit in the ICH LPC |
| 974 | * bridge. Unfortunately, this device has no subvendor/subdevice ID. So it | 974 | * bridge. Unfortunately, this device has no subvendor/subdevice ID. So it |
| 975 | * becomes necessary to do this tweak in two steps -- I've chosen the Host | 975 | * becomes necessary to do this tweak in two steps -- the chosen trigger |
| 976 | * bridge as trigger. | 976 | * is either the Host bridge (preferred) or on-board VGA controller. |
| 977 | * | 977 | * |
| 978 | * Note that we used to unhide the SMBus that way on Toshiba laptops | 978 | * Note that we used to unhide the SMBus that way on Toshiba laptops |
| 979 | * (Satellite A40 and Tecra M2) but then found that the thermal management | 979 | * (Satellite A40 and Tecra M2) but then found that the thermal management |
| @@ -1070,6 +1070,14 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) | |||
| 1070 | case 0x0058: /* Compaq Evo N620c */ | 1070 | case 0x0058: /* Compaq Evo N620c */ |
| 1071 | asus_hides_smbus = 1; | 1071 | asus_hides_smbus = 1; |
| 1072 | } | 1072 | } |
| 1073 | else if (dev->device == PCI_DEVICE_ID_INTEL_82810_IG3) | ||
| 1074 | switch(dev->subsystem_device) { | ||
| 1075 | case 0xB16C: /* Compaq Deskpro EP 401963-001 (PCA# 010174) */ | ||
| 1076 | /* Motherboard doesn't have Host bridge | ||
| 1077 | * subvendor/subdevice IDs, therefore checking | ||
| 1078 | * its on-board VGA controller */ | ||
| 1079 | asus_hides_smbus = 1; | ||
| 1080 | } | ||
| 1073 | } | 1081 | } |
| 1074 | } | 1082 | } |
| 1075 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845_HB, asus_hides_smbus_hostbridge ); | 1083 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845_HB, asus_hides_smbus_hostbridge ); |
| @@ -1082,6 +1090,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, as | |||
| 1082 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); | 1090 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); |
| 1083 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); | 1091 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); |
| 1084 | 1092 | ||
| 1093 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810_IG3, asus_hides_smbus_hostbridge ); | ||
| 1094 | |||
| 1085 | static void asus_hides_smbus_lpc(struct pci_dev *dev) | 1095 | static void asus_hides_smbus_lpc(struct pci_dev *dev) |
| 1086 | { | 1096 | { |
| 1087 | u16 val; | 1097 | u16 val; |
| @@ -1099,12 +1109,14 @@ static void asus_hides_smbus_lpc(struct pci_dev *dev) | |||
| 1099 | printk(KERN_INFO "PCI: Enabled i801 SMBus device\n"); | 1109 | printk(KERN_INFO "PCI: Enabled i801 SMBus device\n"); |
| 1100 | } | 1110 | } |
| 1101 | } | 1111 | } |
| 1112 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, asus_hides_smbus_lpc ); | ||
| 1102 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); | 1113 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); |
| 1103 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); | 1114 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); |
| 1104 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc ); | 1115 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc ); |
| 1105 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); | 1116 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); |
| 1106 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); | 1117 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); |
| 1107 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); | 1118 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); |
| 1119 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, asus_hides_smbus_lpc ); | ||
| 1108 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); | 1120 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); |
| 1109 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); | 1121 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); |
| 1110 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc ); | 1122 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc ); |
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index 90755d4cdb9f..6b0cf0c2a088 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c | |||
| @@ -107,108 +107,6 @@ static void quirk_sb16audio_resources(struct pnp_dev *dev) | |||
| 107 | "pnp: SB audio device quirk - increasing port range\n"); | 107 | "pnp: SB audio device quirk - increasing port range\n"); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | static int quirk_smc_fir_enabled(struct pnp_dev *dev) | ||
| 111 | { | ||
| 112 | unsigned long firbase; | ||
| 113 | u8 bank, high, low, chip; | ||
| 114 | |||
| 115 | if (!pnp_port_valid(dev, 1)) | ||
| 116 | return 0; | ||
| 117 | |||
| 118 | firbase = pnp_port_start(dev, 1); | ||
| 119 | |||
| 120 | /* Select register bank 3 */ | ||
| 121 | bank = inb(firbase + 7); | ||
| 122 | bank &= 0xf0; | ||
| 123 | bank |= 3; | ||
| 124 | outb(bank, firbase + 7); | ||
| 125 | |||
| 126 | high = inb(firbase + 0); | ||
| 127 | low = inb(firbase + 1); | ||
| 128 | chip = inb(firbase + 2); | ||
| 129 | |||
| 130 | /* This corresponds to the check in smsc_ircc_present() */ | ||
| 131 | if (high == 0x10 && low == 0xb8 && (chip == 0xf1 || chip == 0xf2)) | ||
| 132 | return 1; | ||
| 133 | |||
| 134 | return 0; | ||
| 135 | } | ||
| 136 | |||
| 137 | static void quirk_smc_enable(struct pnp_dev *dev) | ||
| 138 | { | ||
| 139 | struct resource fir, sir, irq; | ||
| 140 | |||
| 141 | pnp_activate_dev(dev); | ||
| 142 | if (quirk_smc_fir_enabled(dev)) | ||
| 143 | return; | ||
| 144 | |||
| 145 | /* | ||
| 146 | * Sometimes the BIOS claims the device is enabled, but it reports | ||
| 147 | * the wrong FIR resources or doesn't properly configure ISA or LPC | ||
| 148 | * bridges on the way to the device. | ||
| 149 | * | ||
| 150 | * HP nc6000 and nc8000/nw8000 laptops have known problems like | ||
| 151 | * this. Fortunately, they do fix things up if we auto-configure | ||
| 152 | * the device using its _PRS and _SRS methods. | ||
| 153 | */ | ||
| 154 | dev_err(&dev->dev, "%s not responding at SIR 0x%lx, FIR 0x%lx; " | ||
| 155 | "auto-configuring\n", dev->id->id, | ||
| 156 | (unsigned long)pnp_port_start(dev, 0), | ||
| 157 | (unsigned long)pnp_port_start(dev, 1)); | ||
| 158 | |||
| 159 | pnp_disable_dev(dev); | ||
| 160 | pnp_init_resource_table(&dev->res); | ||
| 161 | pnp_auto_config_dev(dev); | ||
| 162 | pnp_activate_dev(dev); | ||
| 163 | if (quirk_smc_fir_enabled(dev)) { | ||
| 164 | dev_err(&dev->dev, "responds at SIR 0x%lx, FIR 0x%lx\n", | ||
| 165 | (unsigned long)pnp_port_start(dev, 0), | ||
| 166 | (unsigned long)pnp_port_start(dev, 1)); | ||
| 167 | return; | ||
| 168 | } | ||
| 169 | |||
| 170 | /* | ||
| 171 | * The Toshiba Portege 4000 _CRS reports the FIR region first, | ||
| 172 | * followed by the SIR region. The BIOS will configure the bridge, | ||
| 173 | * but only if we call _SRS with SIR first, then FIR. It also | ||
| 174 | * reports the IRQ as active high, when it is really active low. | ||
| 175 | */ | ||
| 176 | dev_err(&dev->dev, "not responding at SIR 0x%lx, FIR 0x%lx; " | ||
| 177 | "swapping SIR/FIR and reconfiguring\n", | ||
| 178 | (unsigned long)pnp_port_start(dev, 0), | ||
| 179 | (unsigned long)pnp_port_start(dev, 1)); | ||
| 180 | |||
| 181 | /* | ||
| 182 | * Clear IORESOURCE_AUTO so pnp_activate_dev() doesn't reassign | ||
| 183 | * these resources any more. | ||
| 184 | */ | ||
| 185 | fir = dev->res.port_resource[0]; | ||
| 186 | sir = dev->res.port_resource[1]; | ||
| 187 | fir.flags &= ~IORESOURCE_AUTO; | ||
| 188 | sir.flags &= ~IORESOURCE_AUTO; | ||
| 189 | |||
| 190 | irq = dev->res.irq_resource[0]; | ||
| 191 | irq.flags &= ~IORESOURCE_AUTO; | ||
| 192 | irq.flags &= ~IORESOURCE_BITS; | ||
| 193 | irq.flags |= IORESOURCE_IRQ_LOWEDGE; | ||
| 194 | |||
| 195 | pnp_disable_dev(dev); | ||
| 196 | dev->res.port_resource[0] = sir; | ||
| 197 | dev->res.port_resource[1] = fir; | ||
| 198 | dev->res.irq_resource[0] = irq; | ||
| 199 | pnp_activate_dev(dev); | ||
| 200 | |||
| 201 | if (quirk_smc_fir_enabled(dev)) { | ||
| 202 | dev_err(&dev->dev, "responds at SIR 0x%lx, FIR 0x%lx\n", | ||
| 203 | (unsigned long)pnp_port_start(dev, 0), | ||
| 204 | (unsigned long)pnp_port_start(dev, 1)); | ||
| 205 | return; | ||
| 206 | } | ||
| 207 | |||
| 208 | dev_err(&dev->dev, "giving up; try \"smsc-ircc2.nopnp\" and " | ||
| 209 | "email bjorn.helgaas@hp.com\n"); | ||
| 210 | } | ||
| 211 | |||
| 212 | /* | 110 | /* |
| 213 | * PnP Quirks | 111 | * PnP Quirks |
| 214 | * Cards or devices that need some tweaking due to incomplete resource info | 112 | * Cards or devices that need some tweaking due to incomplete resource info |
| @@ -229,7 +127,6 @@ static struct pnp_fixup pnp_fixups[] = { | |||
| 229 | {"CTL0043", quirk_sb16audio_resources}, | 127 | {"CTL0043", quirk_sb16audio_resources}, |
| 230 | {"CTL0044", quirk_sb16audio_resources}, | 128 | {"CTL0044", quirk_sb16audio_resources}, |
| 231 | {"CTL0045", quirk_sb16audio_resources}, | 129 | {"CTL0045", quirk_sb16audio_resources}, |
| 232 | {"SMCf010", quirk_smc_enable}, | ||
| 233 | {""} | 130 | {""} |
| 234 | }; | 131 | }; |
| 235 | 132 | ||
diff --git a/drivers/rtc/rtc-v3020.c b/drivers/rtc/rtc-v3020.c index 3b58d3d5d38a..a6b572978dc0 100644 --- a/drivers/rtc/rtc-v3020.c +++ b/drivers/rtc/rtc-v3020.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
| 27 | #include <linux/bcd.h> | 27 | #include <linux/bcd.h> |
| 28 | #include <linux/rtc-v3020.h> | 28 | #include <linux/rtc-v3020.h> |
| 29 | #include <linux/delay.h> | ||
| 29 | 30 | ||
| 30 | #include <asm/io.h> | 31 | #include <asm/io.h> |
| 31 | 32 | ||
| @@ -47,6 +48,7 @@ static void v3020_set_reg(struct v3020 *chip, unsigned char address, | |||
| 47 | for (i = 0; i < 4; i++) { | 48 | for (i = 0; i < 4; i++) { |
| 48 | writel((tmp & 1) << chip->leftshift, chip->ioaddress); | 49 | writel((tmp & 1) << chip->leftshift, chip->ioaddress); |
| 49 | tmp >>= 1; | 50 | tmp >>= 1; |
| 51 | udelay(1); | ||
| 50 | } | 52 | } |
| 51 | 53 | ||
| 52 | /* Commands dont have data */ | 54 | /* Commands dont have data */ |
| @@ -54,6 +56,7 @@ static void v3020_set_reg(struct v3020 *chip, unsigned char address, | |||
| 54 | for (i = 0; i < 8; i++) { | 56 | for (i = 0; i < 8; i++) { |
| 55 | writel((data & 1) << chip->leftshift, chip->ioaddress); | 57 | writel((data & 1) << chip->leftshift, chip->ioaddress); |
| 56 | data >>= 1; | 58 | data >>= 1; |
| 59 | udelay(1); | ||
| 57 | } | 60 | } |
| 58 | } | 61 | } |
| 59 | } | 62 | } |
| @@ -66,12 +69,14 @@ static unsigned char v3020_get_reg(struct v3020 *chip, unsigned char address) | |||
| 66 | for (i = 0; i < 4; i++) { | 69 | for (i = 0; i < 4; i++) { |
| 67 | writel((address & 1) << chip->leftshift, chip->ioaddress); | 70 | writel((address & 1) << chip->leftshift, chip->ioaddress); |
| 68 | address >>= 1; | 71 | address >>= 1; |
| 72 | udelay(1); | ||
| 69 | } | 73 | } |
| 70 | 74 | ||
| 71 | for (i = 0; i < 8; i++) { | 75 | for (i = 0; i < 8; i++) { |
| 72 | data >>= 1; | 76 | data >>= 1; |
| 73 | if (readl(chip->ioaddress) & (1 << chip->leftshift)) | 77 | if (readl(chip->ioaddress) & (1 << chip->leftshift)) |
| 74 | data |= 0x80; | 78 | data |= 0x80; |
| 79 | udelay(1); | ||
| 75 | } | 80 | } |
| 76 | 81 | ||
| 77 | return data; | 82 | return data; |
| @@ -95,7 +100,7 @@ static int v3020_read_time(struct device *dev, struct rtc_time *dt) | |||
| 95 | tmp = v3020_get_reg(chip, V3020_MONTH_DAY); | 100 | tmp = v3020_get_reg(chip, V3020_MONTH_DAY); |
| 96 | dt->tm_mday = BCD2BIN(tmp); | 101 | dt->tm_mday = BCD2BIN(tmp); |
| 97 | tmp = v3020_get_reg(chip, V3020_MONTH); | 102 | tmp = v3020_get_reg(chip, V3020_MONTH); |
| 98 | dt->tm_mon = BCD2BIN(tmp); | 103 | dt->tm_mon = BCD2BIN(tmp) - 1; |
| 99 | tmp = v3020_get_reg(chip, V3020_WEEK_DAY); | 104 | tmp = v3020_get_reg(chip, V3020_WEEK_DAY); |
| 100 | dt->tm_wday = BCD2BIN(tmp); | 105 | dt->tm_wday = BCD2BIN(tmp); |
| 101 | tmp = v3020_get_reg(chip, V3020_YEAR); | 106 | tmp = v3020_get_reg(chip, V3020_YEAR); |
| @@ -135,7 +140,7 @@ static int v3020_set_time(struct device *dev, struct rtc_time *dt) | |||
| 135 | v3020_set_reg(chip, V3020_MINUTES, BIN2BCD(dt->tm_min)); | 140 | v3020_set_reg(chip, V3020_MINUTES, BIN2BCD(dt->tm_min)); |
| 136 | v3020_set_reg(chip, V3020_HOURS, BIN2BCD(dt->tm_hour)); | 141 | v3020_set_reg(chip, V3020_HOURS, BIN2BCD(dt->tm_hour)); |
| 137 | v3020_set_reg(chip, V3020_MONTH_DAY, BIN2BCD(dt->tm_mday)); | 142 | v3020_set_reg(chip, V3020_MONTH_DAY, BIN2BCD(dt->tm_mday)); |
| 138 | v3020_set_reg(chip, V3020_MONTH, BIN2BCD(dt->tm_mon)); | 143 | v3020_set_reg(chip, V3020_MONTH, BIN2BCD(dt->tm_mon + 1)); |
| 139 | v3020_set_reg(chip, V3020_WEEK_DAY, BIN2BCD(dt->tm_wday)); | 144 | v3020_set_reg(chip, V3020_WEEK_DAY, BIN2BCD(dt->tm_wday)); |
| 140 | v3020_set_reg(chip, V3020_YEAR, BIN2BCD(dt->tm_year % 100)); | 145 | v3020_set_reg(chip, V3020_YEAR, BIN2BCD(dt->tm_year % 100)); |
| 141 | 146 | ||
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index ab5ec1feaf4e..90aa53fc4f3e 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
| @@ -1503,7 +1503,7 @@ zfcp_gid_pn_buffers_alloc(struct zfcp_gid_pn_data **gid_pn, mempool_t *pool) | |||
| 1503 | data->ct.pool = pool; | 1503 | data->ct.pool = pool; |
| 1504 | } | 1504 | } |
| 1505 | } else { | 1505 | } else { |
| 1506 | data = kmalloc(sizeof(struct zfcp_gid_pn_data), GFP_ATOMIC); | 1506 | data = kmem_cache_alloc(zfcp_data.gid_pn_cache, GFP_ATOMIC); |
| 1507 | } | 1507 | } |
| 1508 | 1508 | ||
| 1509 | if (NULL == data) | 1509 | if (NULL == data) |
| @@ -1531,7 +1531,7 @@ static void zfcp_gid_pn_buffers_free(struct zfcp_gid_pn_data *gid_pn) | |||
| 1531 | if (gid_pn->ct.pool) | 1531 | if (gid_pn->ct.pool) |
| 1532 | mempool_free(gid_pn, gid_pn->ct.pool); | 1532 | mempool_free(gid_pn, gid_pn->ct.pool); |
| 1533 | else | 1533 | else |
| 1534 | kfree(gid_pn); | 1534 | kmem_cache_free(zfcp_data.gid_pn_cache, gid_pn); |
| 1535 | } | 1535 | } |
| 1536 | 1536 | ||
| 1537 | /** | 1537 | /** |
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index 81daa8204bfe..c6899efdc8f6 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
| @@ -640,13 +640,9 @@ int | |||
| 640 | zfcp_qdio_sbals_from_scsicmnd(struct zfcp_fsf_req *fsf_req, | 640 | zfcp_qdio_sbals_from_scsicmnd(struct zfcp_fsf_req *fsf_req, |
| 641 | unsigned long sbtype, struct scsi_cmnd *scsi_cmnd) | 641 | unsigned long sbtype, struct scsi_cmnd *scsi_cmnd) |
| 642 | { | 642 | { |
| 643 | if (scsi_sg_count(scsi_cmnd)) | 643 | return zfcp_qdio_sbals_from_sg(fsf_req, sbtype, scsi_sglist(scsi_cmnd), |
| 644 | return zfcp_qdio_sbals_from_sg(fsf_req, sbtype, | 644 | scsi_sg_count(scsi_cmnd), |
| 645 | scsi_sglist(scsi_cmnd), | 645 | ZFCP_MAX_SBALS_PER_REQ); |
| 646 | scsi_sg_count(scsi_cmnd), | ||
| 647 | ZFCP_MAX_SBALS_PER_REQ); | ||
| 648 | else | ||
| 649 | return 0; | ||
| 650 | } | 646 | } |
| 651 | 647 | ||
| 652 | /** | 648 | /** |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 0acf6db0a08d..ad7eb4a9261c 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
| @@ -764,7 +764,9 @@ zfcp_reset_fc_host_stats(struct Scsi_Host *shost) | |||
| 764 | return; | 764 | return; |
| 765 | 765 | ||
| 766 | ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); | 766 | ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); |
| 767 | if (ret == 0) { | 767 | if (ret) { |
| 768 | kfree(data); | ||
| 769 | } else { | ||
| 768 | adapter->stats_reset = jiffies/HZ; | 770 | adapter->stats_reset = jiffies/HZ; |
| 769 | old_data = adapter->stats_reset_data; | 771 | old_data = adapter->stats_reset_data; |
| 770 | adapter->stats_reset_data = data; /* finally freed in | 772 | adapter->stats_reset_data = data; /* finally freed in |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 5606d1e62978..efceed451b46 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
| @@ -737,12 +737,19 @@ check_mgmt: | |||
| 737 | */ | 737 | */ |
| 738 | conn->ctask = list_entry(conn->xmitqueue.next, | 738 | conn->ctask = list_entry(conn->xmitqueue.next, |
| 739 | struct iscsi_cmd_task, running); | 739 | struct iscsi_cmd_task, running); |
| 740 | if (conn->ctask->state == ISCSI_TASK_PENDING) { | 740 | switch (conn->ctask->state) { |
| 741 | case ISCSI_TASK_ABORTING: | ||
| 742 | break; | ||
| 743 | case ISCSI_TASK_PENDING: | ||
| 741 | iscsi_prep_scsi_cmd_pdu(conn->ctask); | 744 | iscsi_prep_scsi_cmd_pdu(conn->ctask); |
| 742 | conn->session->tt->init_cmd_task(conn->ctask); | 745 | conn->session->tt->init_cmd_task(conn->ctask); |
| 746 | /* fall through */ | ||
| 747 | default: | ||
| 748 | conn->ctask->state = ISCSI_TASK_RUNNING; | ||
| 749 | break; | ||
| 743 | } | 750 | } |
| 744 | conn->ctask->state = ISCSI_TASK_RUNNING; | ||
| 745 | list_move_tail(conn->xmitqueue.next, &conn->run_list); | 751 | list_move_tail(conn->xmitqueue.next, &conn->run_list); |
| 752 | |||
| 746 | rc = iscsi_xmit_ctask(conn); | 753 | rc = iscsi_xmit_ctask(conn); |
| 747 | if (rc) | 754 | if (rc) |
| 748 | goto again; | 755 | goto again; |
| @@ -1049,7 +1056,9 @@ static int iscsi_exec_abort_task(struct scsi_cmnd *sc, | |||
| 1049 | ctask->mtask = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)hdr, | 1056 | ctask->mtask = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)hdr, |
| 1050 | NULL, 0); | 1057 | NULL, 0); |
| 1051 | if (!ctask->mtask) { | 1058 | if (!ctask->mtask) { |
| 1059 | spin_unlock_bh(&session->lock); | ||
| 1052 | iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); | 1060 | iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); |
| 1061 | spin_lock_bh(&session->lock) | ||
| 1053 | debug_scsi("abort sent failure [itt 0x%x]\n", ctask->itt); | 1062 | debug_scsi("abort sent failure [itt 0x%x]\n", ctask->itt); |
| 1054 | return -EPERM; | 1063 | return -EPERM; |
| 1055 | } | 1064 | } |
| @@ -1066,6 +1075,7 @@ static int iscsi_exec_abort_task(struct scsi_cmnd *sc, | |||
| 1066 | debug_scsi("abort set timeout [itt 0x%x]\n", ctask->itt); | 1075 | debug_scsi("abort set timeout [itt 0x%x]\n", ctask->itt); |
| 1067 | } | 1076 | } |
| 1068 | spin_unlock_bh(&session->lock); | 1077 | spin_unlock_bh(&session->lock); |
| 1078 | mutex_unlock(&session->eh_mutex); | ||
| 1069 | scsi_queue_work(session->host, &conn->xmitwork); | 1079 | scsi_queue_work(session->host, &conn->xmitwork); |
| 1070 | 1080 | ||
| 1071 | /* | 1081 | /* |
| @@ -1083,6 +1093,7 @@ static int iscsi_exec_abort_task(struct scsi_cmnd *sc, | |||
| 1083 | if (signal_pending(current)) | 1093 | if (signal_pending(current)) |
| 1084 | flush_signals(current); | 1094 | flush_signals(current); |
| 1085 | del_timer_sync(&conn->tmabort_timer); | 1095 | del_timer_sync(&conn->tmabort_timer); |
| 1096 | mutex_lock(&session->eh_mutex); | ||
| 1086 | spin_lock_bh(&session->lock); | 1097 | spin_lock_bh(&session->lock); |
| 1087 | return 0; | 1098 | return 0; |
| 1088 | } | 1099 | } |
| @@ -1158,31 +1169,45 @@ static void fail_command(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, | |||
| 1158 | __iscsi_put_ctask(ctask); | 1169 | __iscsi_put_ctask(ctask); |
| 1159 | } | 1170 | } |
| 1160 | 1171 | ||
| 1172 | static void iscsi_suspend_tx(struct iscsi_conn *conn) | ||
| 1173 | { | ||
| 1174 | set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); | ||
| 1175 | scsi_flush_work(conn->session->host); | ||
| 1176 | } | ||
| 1177 | |||
| 1178 | static void iscsi_start_tx(struct iscsi_conn *conn) | ||
| 1179 | { | ||
| 1180 | clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); | ||
| 1181 | scsi_queue_work(conn->session->host, &conn->xmitwork); | ||
| 1182 | } | ||
| 1183 | |||
| 1161 | int iscsi_eh_abort(struct scsi_cmnd *sc) | 1184 | int iscsi_eh_abort(struct scsi_cmnd *sc) |
| 1162 | { | 1185 | { |
| 1186 | struct Scsi_Host *host = sc->device->host; | ||
| 1187 | struct iscsi_session *session = iscsi_hostdata(host->hostdata); | ||
| 1163 | struct iscsi_cmd_task *ctask; | 1188 | struct iscsi_cmd_task *ctask; |
| 1164 | struct iscsi_conn *conn; | 1189 | struct iscsi_conn *conn; |
| 1165 | struct iscsi_session *session; | ||
| 1166 | int rc; | 1190 | int rc; |
| 1167 | 1191 | ||
| 1192 | mutex_lock(&session->eh_mutex); | ||
| 1193 | spin_lock_bh(&session->lock); | ||
| 1168 | /* | 1194 | /* |
| 1169 | * if session was ISCSI_STATE_IN_RECOVERY then we may not have | 1195 | * if session was ISCSI_STATE_IN_RECOVERY then we may not have |
| 1170 | * got the command. | 1196 | * got the command. |
| 1171 | */ | 1197 | */ |
| 1172 | if (!sc->SCp.ptr) { | 1198 | if (!sc->SCp.ptr) { |
| 1173 | debug_scsi("sc never reached iscsi layer or it completed.\n"); | 1199 | debug_scsi("sc never reached iscsi layer or it completed.\n"); |
| 1200 | spin_unlock_bh(&session->lock); | ||
| 1201 | mutex_unlock(&session->eh_mutex); | ||
| 1174 | return SUCCESS; | 1202 | return SUCCESS; |
| 1175 | } | 1203 | } |
| 1176 | 1204 | ||
| 1177 | ctask = (struct iscsi_cmd_task *)sc->SCp.ptr; | 1205 | ctask = (struct iscsi_cmd_task *)sc->SCp.ptr; |
| 1178 | conn = ctask->conn; | 1206 | conn = ctask->conn; |
| 1179 | session = conn->session; | ||
| 1180 | 1207 | ||
| 1181 | conn->eh_abort_cnt++; | 1208 | conn->eh_abort_cnt++; |
| 1182 | debug_scsi("aborting [sc %p itt 0x%x]\n", sc, ctask->itt); | 1209 | debug_scsi("aborting [sc %p itt 0x%x]\n", sc, ctask->itt); |
| 1183 | 1210 | ||
| 1184 | spin_lock_bh(&session->lock); | ||
| 1185 | |||
| 1186 | /* | 1211 | /* |
| 1187 | * If we are not logged in or we have started a new session | 1212 | * If we are not logged in or we have started a new session |
| 1188 | * then let the host reset code handle this | 1213 | * then let the host reset code handle this |
| @@ -1219,6 +1244,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc) | |||
| 1219 | switch (conn->tmabort_state) { | 1244 | switch (conn->tmabort_state) { |
| 1220 | case TMABORT_SUCCESS: | 1245 | case TMABORT_SUCCESS: |
| 1221 | spin_unlock_bh(&session->lock); | 1246 | spin_unlock_bh(&session->lock); |
| 1247 | iscsi_suspend_tx(conn); | ||
| 1222 | /* | 1248 | /* |
| 1223 | * clean up task if aborted. grab the recv lock as a writer | 1249 | * clean up task if aborted. grab the recv lock as a writer |
| 1224 | */ | 1250 | */ |
| @@ -1227,11 +1253,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc) | |||
| 1227 | fail_command(conn, ctask, DID_ABORT << 16); | 1253 | fail_command(conn, ctask, DID_ABORT << 16); |
| 1228 | spin_unlock(&session->lock); | 1254 | spin_unlock(&session->lock); |
| 1229 | write_unlock_bh(conn->recv_lock); | 1255 | write_unlock_bh(conn->recv_lock); |
| 1230 | /* | 1256 | iscsi_start_tx(conn); |
| 1231 | * make sure xmit thread is not still touching the | ||
| 1232 | * ctask/scsi_cmnd | ||
| 1233 | */ | ||
| 1234 | scsi_flush_work(session->host); | ||
| 1235 | goto success_unlocked; | 1257 | goto success_unlocked; |
| 1236 | case TMABORT_NOT_FOUND: | 1258 | case TMABORT_NOT_FOUND: |
| 1237 | if (!ctask->sc) { | 1259 | if (!ctask->sc) { |
| @@ -1251,12 +1273,14 @@ success: | |||
| 1251 | spin_unlock_bh(&session->lock); | 1273 | spin_unlock_bh(&session->lock); |
| 1252 | success_unlocked: | 1274 | success_unlocked: |
| 1253 | debug_scsi("abort success [sc %lx itt 0x%x]\n", (long)sc, ctask->itt); | 1275 | debug_scsi("abort success [sc %lx itt 0x%x]\n", (long)sc, ctask->itt); |
| 1276 | mutex_unlock(&session->eh_mutex); | ||
| 1254 | return SUCCESS; | 1277 | return SUCCESS; |
| 1255 | 1278 | ||
| 1256 | failed: | 1279 | failed: |
| 1257 | spin_unlock_bh(&session->lock); | 1280 | spin_unlock_bh(&session->lock); |
| 1258 | failed_unlocked: | 1281 | failed_unlocked: |
| 1259 | debug_scsi("abort failed [sc %lx itt 0x%x]\n", (long)sc, ctask->itt); | 1282 | debug_scsi("abort failed [sc %lx itt 0x%x]\n", (long)sc, ctask->itt); |
| 1283 | mutex_unlock(&session->eh_mutex); | ||
| 1260 | return FAILED; | 1284 | return FAILED; |
| 1261 | } | 1285 | } |
| 1262 | EXPORT_SYMBOL_GPL(iscsi_eh_abort); | 1286 | EXPORT_SYMBOL_GPL(iscsi_eh_abort); |
| @@ -1403,6 +1427,7 @@ iscsi_session_setup(struct iscsi_transport *iscsit, | |||
| 1403 | session->max_cmdsn = initial_cmdsn + 1; | 1427 | session->max_cmdsn = initial_cmdsn + 1; |
| 1404 | session->max_r2t = 1; | 1428 | session->max_r2t = 1; |
| 1405 | session->tt = iscsit; | 1429 | session->tt = iscsit; |
| 1430 | mutex_init(&session->eh_mutex); | ||
| 1406 | 1431 | ||
| 1407 | /* initialize SCSI PDU commands pool */ | 1432 | /* initialize SCSI PDU commands pool */ |
| 1408 | if (iscsi_pool_init(&session->cmdpool, session->cmds_max, | 1433 | if (iscsi_pool_init(&session->cmdpool, session->cmds_max, |
| @@ -1736,9 +1761,22 @@ static void iscsi_start_session_recovery(struct iscsi_session *session, | |||
| 1736 | { | 1761 | { |
| 1737 | int old_stop_stage; | 1762 | int old_stop_stage; |
| 1738 | 1763 | ||
| 1764 | mutex_lock(&session->eh_mutex); | ||
| 1739 | spin_lock_bh(&session->lock); | 1765 | spin_lock_bh(&session->lock); |
| 1740 | if (conn->stop_stage == STOP_CONN_TERM) { | 1766 | if (conn->stop_stage == STOP_CONN_TERM) { |
| 1741 | spin_unlock_bh(&session->lock); | 1767 | spin_unlock_bh(&session->lock); |
| 1768 | mutex_unlock(&session->eh_mutex); | ||
| 1769 | return; | ||
| 1770 | } | ||
| 1771 | |||
| 1772 | /* | ||
| 1773 | * The LLD either freed/unset the lock on us, or userspace called | ||
| 1774 | * stop but did not create a proper connection (connection was never | ||
| 1775 | * bound or it was unbound then stop was called). | ||
| 1776 | */ | ||
| 1777 | if (!conn->recv_lock) { | ||
| 1778 | spin_unlock_bh(&session->lock); | ||
| 1779 | mutex_unlock(&session->eh_mutex); | ||
| 1742 | return; | 1780 | return; |
| 1743 | } | 1781 | } |
| 1744 | 1782 | ||
| @@ -1755,9 +1793,9 @@ static void iscsi_start_session_recovery(struct iscsi_session *session, | |||
| 1755 | old_stop_stage = conn->stop_stage; | 1793 | old_stop_stage = conn->stop_stage; |
| 1756 | conn->stop_stage = flag; | 1794 | conn->stop_stage = flag; |
| 1757 | conn->c_stage = ISCSI_CONN_STOPPED; | 1795 | conn->c_stage = ISCSI_CONN_STOPPED; |
| 1758 | set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); | ||
| 1759 | spin_unlock_bh(&session->lock); | 1796 | spin_unlock_bh(&session->lock); |
| 1760 | scsi_flush_work(session->host); | 1797 | |
| 1798 | iscsi_suspend_tx(conn); | ||
| 1761 | 1799 | ||
| 1762 | write_lock_bh(conn->recv_lock); | 1800 | write_lock_bh(conn->recv_lock); |
| 1763 | set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); | 1801 | set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); |
| @@ -1786,6 +1824,7 @@ static void iscsi_start_session_recovery(struct iscsi_session *session, | |||
| 1786 | fail_all_commands(conn); | 1824 | fail_all_commands(conn); |
| 1787 | flush_control_queues(session, conn); | 1825 | flush_control_queues(session, conn); |
| 1788 | spin_unlock_bh(&session->lock); | 1826 | spin_unlock_bh(&session->lock); |
| 1827 | mutex_unlock(&session->eh_mutex); | ||
| 1789 | } | 1828 | } |
| 1790 | 1829 | ||
| 1791 | void iscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) | 1830 | void iscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 563d18f4ff50..c6680348b648 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
| @@ -2050,21 +2050,18 @@ qla25xx_fw_dump_failed: | |||
| 2050 | void | 2050 | void |
| 2051 | qla2x00_dump_regs(scsi_qla_host_t *ha) | 2051 | qla2x00_dump_regs(scsi_qla_host_t *ha) |
| 2052 | { | 2052 | { |
| 2053 | int i; | ||
| 2053 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; | 2054 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; |
| 2055 | struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24; | ||
| 2056 | uint16_t __iomem *mbx_reg; | ||
| 2057 | |||
| 2058 | mbx_reg = IS_FWI2_CAPABLE(ha) ? ®24->mailbox0: | ||
| 2059 | MAILBOX_REG(ha, reg, 0); | ||
| 2054 | 2060 | ||
| 2055 | printk("Mailbox registers:\n"); | 2061 | printk("Mailbox registers:\n"); |
| 2056 | printk("scsi(%ld): mbox 0 0x%04x \n", | 2062 | for (i = 0; i < 6; i++) |
| 2057 | ha->host_no, RD_MAILBOX_REG(ha, reg, 0)); | 2063 | printk("scsi(%ld): mbox %d 0x%04x \n", ha->host_no, i, |
| 2058 | printk("scsi(%ld): mbox 1 0x%04x \n", | 2064 | RD_REG_WORD(mbx_reg++)); |
| 2059 | ha->host_no, RD_MAILBOX_REG(ha, reg, 1)); | ||
| 2060 | printk("scsi(%ld): mbox 2 0x%04x \n", | ||
| 2061 | ha->host_no, RD_MAILBOX_REG(ha, reg, 2)); | ||
| 2062 | printk("scsi(%ld): mbox 3 0x%04x \n", | ||
| 2063 | ha->host_no, RD_MAILBOX_REG(ha, reg, 3)); | ||
| 2064 | printk("scsi(%ld): mbox 4 0x%04x \n", | ||
| 2065 | ha->host_no, RD_MAILBOX_REG(ha, reg, 4)); | ||
| 2066 | printk("scsi(%ld): mbox 5 0x%04x \n", | ||
| 2067 | ha->host_no, RD_MAILBOX_REG(ha, reg, 5)); | ||
| 2068 | } | 2065 | } |
| 2069 | 2066 | ||
| 2070 | 2067 | ||
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 27ae3a532a55..c1964866a423 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
| @@ -1502,7 +1502,6 @@ typedef struct { | |||
| 1502 | uint8_t node_name[WWN_SIZE]; | 1502 | uint8_t node_name[WWN_SIZE]; |
| 1503 | uint8_t port_name[WWN_SIZE]; | 1503 | uint8_t port_name[WWN_SIZE]; |
| 1504 | uint8_t fabric_port_name[WWN_SIZE]; | 1504 | uint8_t fabric_port_name[WWN_SIZE]; |
| 1505 | uint16_t fp_speeds; | ||
| 1506 | uint16_t fp_speed; | 1505 | uint16_t fp_speed; |
| 1507 | } sw_info_t; | 1506 | } sw_info_t; |
| 1508 | 1507 | ||
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index b06cbb8580d3..a7e23583f899 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c | |||
| @@ -295,6 +295,8 @@ qla2x00_gid_pt(scsi_qla_host_t *ha, sw_info_t *list) | |||
| 295 | list[i].d_id.b.domain = gid_data->port_id[0]; | 295 | list[i].d_id.b.domain = gid_data->port_id[0]; |
| 296 | list[i].d_id.b.area = gid_data->port_id[1]; | 296 | list[i].d_id.b.area = gid_data->port_id[1]; |
| 297 | list[i].d_id.b.al_pa = gid_data->port_id[2]; | 297 | list[i].d_id.b.al_pa = gid_data->port_id[2]; |
| 298 | memset(list[i].fabric_port_name, 0, WWN_SIZE); | ||
| 299 | list[i].fp_speed = PORT_SPEED_UNKNOWN; | ||
| 298 | 300 | ||
| 299 | /* Last one exit. */ | 301 | /* Last one exit. */ |
| 300 | if (gid_data->control_byte & BIT_7) { | 302 | if (gid_data->control_byte & BIT_7) { |
| @@ -1707,8 +1709,6 @@ qla2x00_gfpn_id(scsi_qla_host_t *ha, sw_info_t *list) | |||
| 1707 | 1709 | ||
| 1708 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 1710 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { |
| 1709 | /* Issue GFPN_ID */ | 1711 | /* Issue GFPN_ID */ |
| 1710 | memset(list[i].fabric_port_name, 0, WWN_SIZE); | ||
| 1711 | |||
| 1712 | /* Prepare common MS IOCB */ | 1712 | /* Prepare common MS IOCB */ |
| 1713 | ms_pkt = ha->isp_ops->prep_ms_iocb(ha, GFPN_ID_REQ_SIZE, | 1713 | ms_pkt = ha->isp_ops->prep_ms_iocb(ha, GFPN_ID_REQ_SIZE, |
| 1714 | GFPN_ID_RSP_SIZE); | 1714 | GFPN_ID_RSP_SIZE); |
| @@ -1821,8 +1821,6 @@ qla2x00_gpsc(scsi_qla_host_t *ha, sw_info_t *list) | |||
| 1821 | 1821 | ||
| 1822 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 1822 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { |
| 1823 | /* Issue GFPN_ID */ | 1823 | /* Issue GFPN_ID */ |
| 1824 | list[i].fp_speeds = list[i].fp_speed = 0; | ||
| 1825 | |||
| 1826 | /* Prepare common MS IOCB */ | 1824 | /* Prepare common MS IOCB */ |
| 1827 | ms_pkt = qla24xx_prep_ms_fm_iocb(ha, GPSC_REQ_SIZE, | 1825 | ms_pkt = qla24xx_prep_ms_fm_iocb(ha, GPSC_REQ_SIZE, |
| 1828 | GPSC_RSP_SIZE); | 1826 | GPSC_RSP_SIZE); |
| @@ -1858,9 +1856,21 @@ qla2x00_gpsc(scsi_qla_host_t *ha, sw_info_t *list) | |||
| 1858 | } | 1856 | } |
| 1859 | rval = QLA_FUNCTION_FAILED; | 1857 | rval = QLA_FUNCTION_FAILED; |
| 1860 | } else { | 1858 | } else { |
| 1861 | /* Save portname */ | 1859 | /* Save port-speed */ |
| 1862 | list[i].fp_speeds = ct_rsp->rsp.gpsc.speeds; | 1860 | switch (be16_to_cpu(ct_rsp->rsp.gpsc.speed)) { |
| 1863 | list[i].fp_speed = ct_rsp->rsp.gpsc.speed; | 1861 | case BIT_15: |
| 1862 | list[i].fp_speed = PORT_SPEED_1GB; | ||
| 1863 | break; | ||
| 1864 | case BIT_14: | ||
| 1865 | list[i].fp_speed = PORT_SPEED_2GB; | ||
| 1866 | break; | ||
| 1867 | case BIT_13: | ||
| 1868 | list[i].fp_speed = PORT_SPEED_4GB; | ||
| 1869 | break; | ||
| 1870 | case BIT_11: | ||
| 1871 | list[i].fp_speed = PORT_SPEED_8GB; | ||
| 1872 | break; | ||
| 1873 | } | ||
| 1864 | 1874 | ||
| 1865 | DEBUG2_3(printk("scsi(%ld): GPSC ext entry - " | 1875 | DEBUG2_3(printk("scsi(%ld): GPSC ext entry - " |
| 1866 | "fpn %02x%02x%02x%02x%02x%02x%02x%02x speeds=%04x " | 1876 | "fpn %02x%02x%02x%02x%02x%02x%02x%02x speeds=%04x " |
| @@ -1873,8 +1883,8 @@ qla2x00_gpsc(scsi_qla_host_t *ha, sw_info_t *list) | |||
| 1873 | list[i].fabric_port_name[5], | 1883 | list[i].fabric_port_name[5], |
| 1874 | list[i].fabric_port_name[6], | 1884 | list[i].fabric_port_name[6], |
| 1875 | list[i].fabric_port_name[7], | 1885 | list[i].fabric_port_name[7], |
| 1876 | be16_to_cpu(list[i].fp_speeds), | 1886 | be16_to_cpu(ct_rsp->rsp.gpsc.speeds), |
| 1877 | be16_to_cpu(list[i].fp_speed))); | 1887 | be16_to_cpu(ct_rsp->rsp.gpsc.speed))); |
| 1878 | } | 1888 | } |
| 1879 | 1889 | ||
| 1880 | /* Last device exit. */ | 1890 | /* Last device exit. */ |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 374abe19b547..1a058ec9bd0c 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
| @@ -2079,17 +2079,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *ha) | |||
| 2079 | } | 2079 | } |
| 2080 | 2080 | ||
| 2081 | /* Base iIDMA settings on HBA port speed. */ | 2081 | /* Base iIDMA settings on HBA port speed. */ |
| 2082 | switch (ha->link_data_rate) { | 2082 | fcport->fp_speed = ha->link_data_rate; |
| 2083 | case PORT_SPEED_1GB: | ||
| 2084 | fcport->fp_speed = cpu_to_be16(BIT_15); | ||
| 2085 | break; | ||
| 2086 | case PORT_SPEED_2GB: | ||
| 2087 | fcport->fp_speed = cpu_to_be16(BIT_14); | ||
| 2088 | break; | ||
| 2089 | case PORT_SPEED_4GB: | ||
| 2090 | fcport->fp_speed = cpu_to_be16(BIT_13); | ||
| 2091 | break; | ||
| 2092 | } | ||
| 2093 | 2083 | ||
| 2094 | qla2x00_update_fcport(ha, fcport); | 2084 | qla2x00_update_fcport(ha, fcport); |
| 2095 | 2085 | ||
| @@ -2130,38 +2120,25 @@ static void | |||
| 2130 | qla2x00_iidma_fcport(scsi_qla_host_t *ha, fc_port_t *fcport) | 2120 | qla2x00_iidma_fcport(scsi_qla_host_t *ha, fc_port_t *fcport) |
| 2131 | { | 2121 | { |
| 2132 | #define LS_UNKNOWN 2 | 2122 | #define LS_UNKNOWN 2 |
| 2133 | static char *link_speeds[5] = { "1", "2", "?", "4" }; | 2123 | static char *link_speeds[5] = { "1", "2", "?", "4", "8" }; |
| 2134 | int rval; | 2124 | int rval; |
| 2135 | uint16_t port_speed, mb[6]; | 2125 | uint16_t mb[6]; |
| 2136 | 2126 | ||
| 2137 | if (!IS_IIDMA_CAPABLE(ha)) | 2127 | if (!IS_IIDMA_CAPABLE(ha)) |
| 2138 | return; | 2128 | return; |
| 2139 | 2129 | ||
| 2140 | switch (be16_to_cpu(fcport->fp_speed)) { | 2130 | if (fcport->fp_speed == PORT_SPEED_UNKNOWN) { |
| 2141 | case BIT_15: | ||
| 2142 | port_speed = PORT_SPEED_1GB; | ||
| 2143 | break; | ||
| 2144 | case BIT_14: | ||
| 2145 | port_speed = PORT_SPEED_2GB; | ||
| 2146 | break; | ||
| 2147 | case BIT_13: | ||
| 2148 | port_speed = PORT_SPEED_4GB; | ||
| 2149 | break; | ||
| 2150 | default: | ||
| 2151 | DEBUG2(printk("scsi(%ld): %02x%02x%02x%02x%02x%02x%02x%02x -- " | 2131 | DEBUG2(printk("scsi(%ld): %02x%02x%02x%02x%02x%02x%02x%02x -- " |
| 2152 | "unsupported FM port operating speed (%04x).\n", | 2132 | "unsupported FM port operating speed.\n", |
| 2153 | ha->host_no, fcport->port_name[0], fcport->port_name[1], | 2133 | ha->host_no, fcport->port_name[0], fcport->port_name[1], |
| 2154 | fcport->port_name[2], fcport->port_name[3], | 2134 | fcport->port_name[2], fcport->port_name[3], |
| 2155 | fcport->port_name[4], fcport->port_name[5], | 2135 | fcport->port_name[4], fcport->port_name[5], |
| 2156 | fcport->port_name[6], fcport->port_name[7], | 2136 | fcport->port_name[6], fcport->port_name[7])); |
| 2157 | be16_to_cpu(fcport->fp_speed))); | ||
| 2158 | port_speed = PORT_SPEED_UNKNOWN; | ||
| 2159 | break; | ||
| 2160 | } | ||
| 2161 | if (port_speed == PORT_SPEED_UNKNOWN) | ||
| 2162 | return; | 2137 | return; |
| 2138 | } | ||
| 2163 | 2139 | ||
| 2164 | rval = qla2x00_set_idma_speed(ha, fcport->loop_id, port_speed, mb); | 2140 | rval = qla2x00_set_idma_speed(ha, fcport->loop_id, fcport->fp_speed, |
| 2141 | mb); | ||
| 2165 | if (rval != QLA_SUCCESS) { | 2142 | if (rval != QLA_SUCCESS) { |
| 2166 | DEBUG2(printk("scsi(%ld): Unable to adjust iIDMA " | 2143 | DEBUG2(printk("scsi(%ld): Unable to adjust iIDMA " |
| 2167 | "%02x%02x%02x%02x%02x%02x%02x%02x -- %04x %x %04x %04x.\n", | 2144 | "%02x%02x%02x%02x%02x%02x%02x%02x -- %04x %x %04x %04x.\n", |
| @@ -2169,12 +2146,12 @@ qla2x00_iidma_fcport(scsi_qla_host_t *ha, fc_port_t *fcport) | |||
| 2169 | fcport->port_name[2], fcport->port_name[3], | 2146 | fcport->port_name[2], fcport->port_name[3], |
| 2170 | fcport->port_name[4], fcport->port_name[5], | 2147 | fcport->port_name[4], fcport->port_name[5], |
| 2171 | fcport->port_name[6], fcport->port_name[7], rval, | 2148 | fcport->port_name[6], fcport->port_name[7], rval, |
| 2172 | port_speed, mb[0], mb[1])); | 2149 | fcport->fp_speed, mb[0], mb[1])); |
| 2173 | } else { | 2150 | } else { |
| 2174 | DEBUG2(qla_printk(KERN_INFO, ha, | 2151 | DEBUG2(qla_printk(KERN_INFO, ha, |
| 2175 | "iIDMA adjusted to %s GB/s on " | 2152 | "iIDMA adjusted to %s GB/s on " |
| 2176 | "%02x%02x%02x%02x%02x%02x%02x%02x.\n", | 2153 | "%02x%02x%02x%02x%02x%02x%02x%02x.\n", |
| 2177 | link_speeds[port_speed], fcport->port_name[0], | 2154 | link_speeds[fcport->fp_speed], fcport->port_name[0], |
| 2178 | fcport->port_name[1], fcport->port_name[2], | 2155 | fcport->port_name[1], fcport->port_name[2], |
| 2179 | fcport->port_name[3], fcport->port_name[4], | 2156 | fcport->port_name[3], fcport->port_name[4], |
| 2180 | fcport->port_name[5], fcport->port_name[6], | 2157 | fcport->port_name[5], fcport->port_name[6], |
| @@ -3354,7 +3331,8 @@ qla2x00_restart_isp(scsi_qla_host_t *ha) | |||
| 3354 | 3331 | ||
| 3355 | spin_lock_irqsave(&ha->hardware_lock, flags); | 3332 | spin_lock_irqsave(&ha->hardware_lock, flags); |
| 3356 | 3333 | ||
| 3357 | if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) { | 3334 | if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha) && |
| 3335 | !IS_QLA25XX(ha)) { | ||
| 3358 | /* | 3336 | /* |
| 3359 | * Disable SRAM, Instruction RAM and GP RAM | 3337 | * Disable SRAM, Instruction RAM and GP RAM |
| 3360 | * parity. | 3338 | * parity. |
| @@ -3370,7 +3348,8 @@ qla2x00_restart_isp(scsi_qla_host_t *ha) | |||
| 3370 | 3348 | ||
| 3371 | spin_lock_irqsave(&ha->hardware_lock, flags); | 3349 | spin_lock_irqsave(&ha->hardware_lock, flags); |
| 3372 | 3350 | ||
| 3373 | if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) { | 3351 | if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha) && |
| 3352 | !IS_QLA25XX(ha)) { | ||
| 3374 | /* Enable proper parity */ | 3353 | /* Enable proper parity */ |
| 3375 | if (IS_QLA2300(ha)) | 3354 | if (IS_QLA2300(ha)) |
| 3376 | /* SRAM parity */ | 3355 | /* SRAM parity */ |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 50539da467bf..eecae9905ece 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
| @@ -490,6 +490,7 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) | |||
| 490 | set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); | 490 | set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); |
| 491 | 491 | ||
| 492 | ha->flags.gpsc_supported = 1; | 492 | ha->flags.gpsc_supported = 1; |
| 493 | ha->flags.management_server_logged_in = 0; | ||
| 493 | break; | 494 | break; |
| 494 | 495 | ||
| 495 | case MBA_CHG_IN_CONNECTION: /* Change in connection mode */ | 496 | case MBA_CHG_IN_CONNECTION: /* Change in connection mode */ |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 93c0c7e4f08f..acca898ce0a2 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -1564,7 +1564,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1564 | struct Scsi_Host *host; | 1564 | struct Scsi_Host *host; |
| 1565 | scsi_qla_host_t *ha; | 1565 | scsi_qla_host_t *ha; |
| 1566 | unsigned long flags = 0; | 1566 | unsigned long flags = 0; |
| 1567 | char pci_info[20]; | 1567 | char pci_info[30]; |
| 1568 | char fw_str[30]; | 1568 | char fw_str[30]; |
| 1569 | struct scsi_host_template *sht; | 1569 | struct scsi_host_template *sht; |
| 1570 | 1570 | ||
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index dd1f8ceb79c4..18095b9b76f4 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | /* | 7 | /* |
| 8 | * Driver version | 8 | * Driver version |
| 9 | */ | 9 | */ |
| 10 | #define QLA2XXX_VERSION "8.02.00-k2" | 10 | #define QLA2XXX_VERSION "8.02.00-k3" |
| 11 | 11 | ||
| 12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
| 13 | #define QLA_DRIVER_MINOR_VER 2 | 13 | #define QLA_DRIVER_MINOR_VER 2 |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 64ff6a5f6afd..81b52b7cca21 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
| @@ -611,7 +611,7 @@ config SERIAL_BFIN | |||
| 611 | 611 | ||
| 612 | config SERIAL_BFIN_CONSOLE | 612 | config SERIAL_BFIN_CONSOLE |
| 613 | bool "Console on Blackfin serial port" | 613 | bool "Console on Blackfin serial port" |
| 614 | depends on SERIAL_BFIN | 614 | depends on SERIAL_BFIN=y |
| 615 | select SERIAL_CORE_CONSOLE | 615 | select SERIAL_CORE_CONSOLE |
| 616 | 616 | ||
| 617 | choice | 617 | choice |
| @@ -832,10 +832,10 @@ config SERIAL_MUX | |||
| 832 | 4. Change the kernel command console parameter to: console=ttyB0 | 832 | 4. Change the kernel command console parameter to: console=ttyB0 |
| 833 | 833 | ||
| 834 | config SERIAL_MUX_CONSOLE | 834 | config SERIAL_MUX_CONSOLE |
| 835 | bool "Support for console on serial MUX" | 835 | bool "Support for console on serial MUX" |
| 836 | depends on SERIAL_MUX | 836 | depends on SERIAL_MUX=y |
| 837 | select SERIAL_CORE_CONSOLE | 837 | select SERIAL_CORE_CONSOLE |
| 838 | default y | 838 | default y |
| 839 | 839 | ||
| 840 | config PDC_CONSOLE | 840 | config PDC_CONSOLE |
| 841 | bool "PDC software console support" | 841 | bool "PDC software console support" |
diff --git a/drivers/serial/sb1250-duart.c b/drivers/serial/sb1250-duart.c index 201253755011..2d6c08b3dbcf 100644 --- a/drivers/serial/sb1250-duart.c +++ b/drivers/serial/sb1250-duart.c | |||
| @@ -58,6 +58,12 @@ | |||
| 58 | #define SBD_CTRLREGS(line) A_BCM1480_DUART_CTRLREG((line), 0) | 58 | #define SBD_CTRLREGS(line) A_BCM1480_DUART_CTRLREG((line), 0) |
| 59 | #define SBD_INT(line) (K_BCM1480_INT_UART_0 + (line)) | 59 | #define SBD_INT(line) (K_BCM1480_INT_UART_0 + (line)) |
| 60 | 60 | ||
| 61 | #define DUART_CHANREG_SPACING BCM1480_DUART_CHANREG_SPACING | ||
| 62 | |||
| 63 | #define R_DUART_IMRREG(line) R_BCM1480_DUART_IMRREG(line) | ||
| 64 | #define R_DUART_INCHREG(line) R_BCM1480_DUART_INCHREG(line) | ||
| 65 | #define R_DUART_ISRREG(line) R_BCM1480_DUART_ISRREG(line) | ||
| 66 | |||
| 61 | #elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X) | 67 | #elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X) |
| 62 | #include <asm/sibyte/sb1250_regs.h> | 68 | #include <asm/sibyte/sb1250_regs.h> |
| 63 | #include <asm/sibyte/sb1250_int.h> | 69 | #include <asm/sibyte/sb1250_int.h> |
diff --git a/drivers/spi/spi_mpc83xx.c b/drivers/spi/spi_mpc83xx.c index fcbf1b8a5264..32cda77b31cd 100644 --- a/drivers/spi/spi_mpc83xx.c +++ b/drivers/spi/spi_mpc83xx.c | |||
| @@ -384,11 +384,8 @@ irqreturn_t mpc83xx_spi_irq(s32 irq, void *context_data) | |||
| 384 | 384 | ||
| 385 | mpc83xx_spi->count -= 1; | 385 | mpc83xx_spi->count -= 1; |
| 386 | if (mpc83xx_spi->count) { | 386 | if (mpc83xx_spi->count) { |
| 387 | if (mpc83xx_spi->tx) { | 387 | u32 word = mpc83xx_spi->get_tx(mpc83xx_spi); |
| 388 | u32 word = mpc83xx_spi->get_tx(mpc83xx_spi); | 388 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->transmit, word); |
| 389 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->transmit, | ||
| 390 | word); | ||
| 391 | } | ||
| 392 | } else { | 389 | } else { |
| 393 | complete(&mpc83xx_spi->done); | 390 | complete(&mpc83xx_spi->done); |
| 394 | } | 391 | } |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index a1ad11d0c47c..63b1243a9139 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
| @@ -60,7 +60,7 @@ ssize_t usb_store_new_id(struct usb_dynids *dynids, | |||
| 60 | dynid->id.match_flags = USB_DEVICE_ID_MATCH_DEVICE; | 60 | dynid->id.match_flags = USB_DEVICE_ID_MATCH_DEVICE; |
| 61 | 61 | ||
| 62 | spin_lock(&dynids->lock); | 62 | spin_lock(&dynids->lock); |
| 63 | list_add_tail(&dynids->list, &dynid->node); | 63 | list_add_tail(&dynid->node, &dynids->list); |
| 64 | spin_unlock(&dynids->lock); | 64 | spin_unlock(&dynids->lock); |
| 65 | 65 | ||
| 66 | if (get_driver(driver)) { | 66 | if (get_driver(driver)) { |
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 9e467118dc94..7f17d0fd76c0 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c | |||
| @@ -28,10 +28,16 @@ | |||
| 28 | * devices is broken... | 28 | * devices is broken... |
| 29 | */ | 29 | */ |
| 30 | static const struct usb_device_id usb_quirk_list[] = { | 30 | static const struct usb_device_id usb_quirk_list[] = { |
| 31 | /* CBM - Flash disk */ | ||
| 32 | { USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
| 31 | /* HP 5300/5370C scanner */ | 33 | /* HP 5300/5370C scanner */ |
| 32 | { USB_DEVICE(0x03f0, 0x0701), .driver_info = USB_QUIRK_STRING_FETCH_255 }, | 34 | { USB_DEVICE(0x03f0, 0x0701), .driver_info = USB_QUIRK_STRING_FETCH_255 }, |
| 33 | /* Hewlett-Packard PhotoSmart 720 / PhotoSmart 935 (storage) */ | 35 | /* Hewlett-Packard PhotoSmart 720 / PhotoSmart 935 (storage) */ |
| 34 | { USB_DEVICE(0x03f0, 0x4002), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | 36 | { USB_DEVICE(0x03f0, 0x4002), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, |
| 37 | |||
| 38 | /* SGS Thomson Microelectronics 4in1 card reader */ | ||
| 39 | { USB_DEVICE(0x0483, 0x0321), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | ||
| 40 | |||
| 35 | /* Acer Peripherals Inc. (now BenQ Corp.) Prisa 640BU */ | 41 | /* Acer Peripherals Inc. (now BenQ Corp.) Prisa 640BU */ |
| 36 | { USB_DEVICE(0x04a5, 0x207e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | 42 | { USB_DEVICE(0x04a5, 0x207e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, |
| 37 | /* Benq S2W 3300U */ | 43 | /* Benq S2W 3300U */ |
| @@ -66,6 +72,19 @@ static const struct usb_device_id usb_quirk_list[] = { | |||
| 66 | { USB_DEVICE(0x05cc, 0x2267), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | 72 | { USB_DEVICE(0x05cc, 0x2267), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, |
| 67 | /* Ultima Electronics Corp.*/ | 73 | /* Ultima Electronics Corp.*/ |
| 68 | { USB_DEVICE(0x05d8, 0x4005), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | 74 | { USB_DEVICE(0x05d8, 0x4005), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, |
| 75 | |||
| 76 | /* Genesys USB-to-IDE */ | ||
| 77 | { USB_DEVICE(0x0503, 0x0702), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | ||
| 78 | |||
| 79 | /* USB Graphical LCD - EEH Datalink GmbH */ | ||
| 80 | { USB_DEVICE(0x060c, 0x04eb), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | ||
| 81 | |||
| 82 | /* INTEL VALUE SSD */ | ||
| 83 | { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
| 84 | |||
| 85 | /* M-Systems Flash Disk Pioneers */ | ||
| 86 | { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
| 87 | |||
| 69 | /* Agfa Snapscan1212u */ | 88 | /* Agfa Snapscan1212u */ |
| 70 | { USB_DEVICE(0x06bd, 0x2061), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | 89 | { USB_DEVICE(0x06bd, 0x2061), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, |
| 71 | /* Seagate RSS LLC */ | 90 | /* Seagate RSS LLC */ |
| @@ -87,6 +106,12 @@ static const struct usb_device_id usb_quirk_list[] = { | |||
| 87 | { USB_DEVICE(0x0fca, 0x0004), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | 106 | { USB_DEVICE(0x0fca, 0x0004), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, |
| 88 | { USB_DEVICE(0x0fca, 0x0006), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | 107 | { USB_DEVICE(0x0fca, 0x0006), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, |
| 89 | 108 | ||
| 109 | /* Apple iPhone */ | ||
| 110 | { USB_DEVICE(0x05ac, 0x1290), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | ||
| 111 | |||
| 112 | /* SKYMEDI USB_DRIVE */ | ||
| 113 | { USB_DEVICE(0x1516, 0x8628), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
| 114 | |||
| 90 | { } /* terminating entry must be last */ | 115 | { } /* terminating entry must be last */ |
| 91 | }; | 116 | }; |
| 92 | 117 | ||
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index 9cd98e73dc1d..ce4d2e09633d 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c | |||
| @@ -1691,14 +1691,12 @@ static int gs_setup_class(struct usb_gadget *gadget, | |||
| 1691 | 1691 | ||
| 1692 | switch (ctrl->bRequest) { | 1692 | switch (ctrl->bRequest) { |
| 1693 | case USB_CDC_REQ_SET_LINE_CODING: | 1693 | case USB_CDC_REQ_SET_LINE_CODING: |
| 1694 | ret = min(wLength, | 1694 | /* FIXME Submit req to read the data; have its completion |
| 1695 | (u16)sizeof(struct usb_cdc_line_coding)); | 1695 | * handler copy that data to port->port_line_coding (iff |
| 1696 | if (port) { | 1696 | * it's valid) and maybe pass it on. Until then, fail. |
| 1697 | spin_lock(&port->port_lock); | 1697 | */ |
| 1698 | memcpy(&port->port_line_coding, req->buf, ret); | 1698 | printk(KERN_WARNING "gs_setup: set_line_coding " |
| 1699 | spin_unlock(&port->port_lock); | 1699 | "unuspported\n"); |
| 1700 | } | ||
| 1701 | ret = 0; | ||
| 1702 | break; | 1700 | break; |
| 1703 | 1701 | ||
| 1704 | case USB_CDC_REQ_GET_LINE_CODING: | 1702 | case USB_CDC_REQ_GET_LINE_CODING: |
| @@ -1713,11 +1711,18 @@ static int gs_setup_class(struct usb_gadget *gadget, | |||
| 1713 | break; | 1711 | break; |
| 1714 | 1712 | ||
| 1715 | case USB_CDC_REQ_SET_CONTROL_LINE_STATE: | 1713 | case USB_CDC_REQ_SET_CONTROL_LINE_STATE: |
| 1716 | ret = 0; | 1714 | /* FIXME Submit req to read the data; have its completion |
| 1715 | * handler use that to set the state (iff it's valid) and | ||
| 1716 | * maybe pass it on. Until then, fail. | ||
| 1717 | */ | ||
| 1718 | printk(KERN_WARNING "gs_setup: set_control_line_state " | ||
| 1719 | "unuspported\n"); | ||
| 1717 | break; | 1720 | break; |
| 1718 | 1721 | ||
| 1719 | default: | 1722 | default: |
| 1720 | printk(KERN_ERR "gs_setup: unknown class request, type=%02x, request=%02x, value=%04x, index=%04x, length=%d\n", | 1723 | printk(KERN_ERR "gs_setup: unknown class request, " |
| 1724 | "type=%02x, request=%02x, value=%04x, " | ||
| 1725 | "index=%04x, length=%d\n", | ||
| 1721 | ctrl->bRequestType, ctrl->bRequest, | 1726 | ctrl->bRequestType, ctrl->bRequest, |
| 1722 | wValue, wIndex, wLength); | 1727 | wValue, wIndex, wLength); |
| 1723 | break; | 1728 | break; |
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index 9f37ba44c132..b64ca91d9b02 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c | |||
| @@ -3404,6 +3404,7 @@ static void sisusb_disconnect(struct usb_interface *intf) | |||
| 3404 | } | 3404 | } |
| 3405 | 3405 | ||
| 3406 | static struct usb_device_id sisusb_table [] = { | 3406 | static struct usb_device_id sisusb_table [] = { |
| 3407 | { USB_DEVICE(0x0711, 0x0550) }, | ||
| 3407 | { USB_DEVICE(0x0711, 0x0900) }, | 3408 | { USB_DEVICE(0x0711, 0x0900) }, |
| 3408 | { USB_DEVICE(0x0711, 0x0901) }, | 3409 | { USB_DEVICE(0x0711, 0x0901) }, |
| 3409 | { USB_DEVICE(0x0711, 0x0902) }, | 3410 | { USB_DEVICE(0x0711, 0x0902) }, |
diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c index c08a38402b93..a47a24f8820d 100644 --- a/drivers/usb/serial/bus.c +++ b/drivers/usb/serial/bus.c | |||
| @@ -138,7 +138,7 @@ static void free_dynids(struct usb_serial_driver *drv) | |||
| 138 | static struct driver_attribute drv_attrs[] = { | 138 | static struct driver_attribute drv_attrs[] = { |
| 139 | __ATTR_NULL, | 139 | __ATTR_NULL, |
| 140 | }; | 140 | }; |
| 141 | static inline void free_dynids(struct usb_driver *drv) | 141 | static inline void free_dynids(struct usb_serial_driver *drv) |
| 142 | { | 142 | { |
| 143 | } | 143 | } |
| 144 | #endif | 144 | #endif |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 1370c423d7c2..2d045857b181 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -568,6 +568,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 568 | { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) }, | 568 | { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) }, |
| 569 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, | 569 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, |
| 570 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, | 570 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, |
| 571 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, | ||
| 571 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), | 572 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), |
| 572 | .driver_info = (kernel_ulong_t)&ftdi_olimex_quirk }, | 573 | .driver_info = (kernel_ulong_t)&ftdi_olimex_quirk }, |
| 573 | { }, /* Optional parameter entry */ | 574 | { }, /* Optional parameter entry */ |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index c70e1de6389e..b57b90ae9f9d 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
| @@ -534,6 +534,14 @@ | |||
| 534 | #define OLIMEX_VID 0x15BA | 534 | #define OLIMEX_VID 0x15BA |
| 535 | #define OLIMEX_ARM_USB_OCD_PID 0x0003 | 535 | #define OLIMEX_ARM_USB_OCD_PID 0x0003 |
| 536 | 536 | ||
| 537 | |||
| 538 | /* | ||
| 539 | * The Mobility Lab (TML) | ||
| 540 | * Submitted by Pierre Castella | ||
| 541 | */ | ||
| 542 | #define TML_VID 0x1B91 /* Vendor ID */ | ||
| 543 | #define TML_USB_SERIAL_PID 0x0064 /* USB - Serial Converter */ | ||
| 544 | |||
| 537 | /* Commands */ | 545 | /* Commands */ |
| 538 | #define FTDI_SIO_RESET 0 /* Reset the port */ | 546 | #define FTDI_SIO_RESET 0 /* Reset the port */ |
| 539 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ | 547 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 4cb3c165742b..a18659e0700c 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -108,6 +108,7 @@ static int option_send_setup(struct usb_serial_port *port); | |||
| 108 | #define HUAWEI_VENDOR_ID 0x12D1 | 108 | #define HUAWEI_VENDOR_ID 0x12D1 |
| 109 | #define HUAWEI_PRODUCT_E600 0x1001 | 109 | #define HUAWEI_PRODUCT_E600 0x1001 |
| 110 | #define HUAWEI_PRODUCT_E220 0x1003 | 110 | #define HUAWEI_PRODUCT_E220 0x1003 |
| 111 | #define HUAWEI_PRODUCT_E220BIS 0x1004 | ||
| 111 | 112 | ||
| 112 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 | 113 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 |
| 113 | #define DELL_VENDOR_ID 0x413C | 114 | #define DELL_VENDOR_ID 0x413C |
| @@ -158,6 +159,7 @@ static struct usb_device_id option_ids[] = { | |||
| 158 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) }, | 159 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) }, |
| 159 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 160 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
| 160 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) }, | 161 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) }, |
| 162 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS) }, | ||
| 161 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1100) }, /* Novatel Merlin XS620/S640 */ | 163 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1100) }, /* Novatel Merlin XS620/S640 */ |
| 162 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1110) }, /* Novatel Merlin S620 */ | 164 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1110) }, /* Novatel Merlin S620 */ |
| 163 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1120) }, /* Novatel Merlin EX720 */ | 165 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1120) }, /* Novatel Merlin EX720 */ |
| @@ -176,6 +178,7 @@ static struct usb_device_id option_ids[] = { | |||
| 176 | { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */ | 178 | { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */ |
| 177 | { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */ | 179 | { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */ |
| 178 | { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */ | 180 | { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */ |
| 181 | { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */ | ||
| 179 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, | 182 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, |
| 180 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, | 183 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, |
| 181 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, | 184 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, |
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index 833ada47fc54..64f3f66a7a35 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c | |||
| @@ -817,21 +817,6 @@ static int oti6858_ioctl(struct usb_serial_port *port, struct file *file, | |||
| 817 | __FUNCTION__, port->number, cmd, arg); | 817 | __FUNCTION__, port->number, cmd, arg); |
| 818 | 818 | ||
| 819 | switch (cmd) { | 819 | switch (cmd) { |
| 820 | case TCGETS: | ||
| 821 | if (kernel_termios_to_user_termios((struct ktermios __user *)arg, | ||
| 822 | port->tty->termios)) | ||
| 823 | return -EFAULT; | ||
| 824 | return 0; | ||
| 825 | |||
| 826 | case TCSETS: | ||
| 827 | case TCSETSW: /* FIXME: this is not the same! */ | ||
| 828 | case TCSETSF: /* FIXME: this is not the same! */ | ||
| 829 | if (user_termios_to_kernel_termios(port->tty->termios, | ||
| 830 | (struct ktermios __user *)arg)) | ||
| 831 | return -EFAULT; | ||
| 832 | oti6858_set_termios(port, NULL); | ||
| 833 | return 0; | ||
| 834 | |||
| 835 | case TCFLSH: | 820 | case TCFLSH: |
| 836 | /* FIXME */ | 821 | /* FIXME */ |
| 837 | return 0; | 822 | return 0; |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 2d92ce31018f..c6b78ba815ea 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -348,6 +348,13 @@ UNUSUAL_DEV( 0x04b0, 0x0411, 0x0100, 0x0101, | |||
| 348 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 348 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 349 | US_FL_FIX_CAPACITY), | 349 | US_FL_FIX_CAPACITY), |
| 350 | 350 | ||
| 351 | /* Reported by Ortwin Glueck <odi@odi.ch> */ | ||
| 352 | UNUSUAL_DEV( 0x04b0, 0x0413, 0x0110, 0x0110, | ||
| 353 | "NIKON", | ||
| 354 | "NIKON DSC D40", | ||
| 355 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 356 | US_FL_FIX_CAPACITY), | ||
| 357 | |||
| 351 | /* BENQ DC5330 | 358 | /* BENQ DC5330 |
| 352 | * Reported by Manuel Fombuena <mfombuena@ya.com> and | 359 | * Reported by Manuel Fombuena <mfombuena@ya.com> and |
| 353 | * Frank Copeland <fjc@thingy.apana.org.au> */ | 360 | * Frank Copeland <fjc@thingy.apana.org.au> */ |
| @@ -897,6 +904,22 @@ UNUSUAL_DEV( 0x069b, 0x3004, 0x0001, 0x0001, | |||
| 897 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 904 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 898 | US_FL_FIX_CAPACITY ), | 905 | US_FL_FIX_CAPACITY ), |
| 899 | 906 | ||
| 907 | /* Reported by Massimiliano Ghilardi <massimiliano.ghilardi@gmail.com> | ||
| 908 | * This USB MP3/AVI player device fails and disconnects if more than 128 | ||
| 909 | * sectors (64kB) are read/written in a single command, and may be present | ||
| 910 | * at least in the following products: | ||
| 911 | * "Magnex Digital Video Panel DVP 1800" | ||
| 912 | * "MP4 AIGO 4GB SLOT SD" | ||
| 913 | * "Teclast TL-C260 MP3" | ||
| 914 | * "i.Meizu PMP MP3/MP4" | ||
| 915 | * "Speed MV8 MP4 Audio Player" | ||
| 916 | */ | ||
| 917 | UNUSUAL_DEV( 0x071b, 0x3203, 0x0100, 0x0100, | ||
| 918 | "RockChip", | ||
| 919 | "ROCK MP3", | ||
| 920 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 921 | US_FL_MAX_SECTORS_64), | ||
| 922 | |||
| 900 | /* Reported by Olivier Blondeau <zeitoun@gmail.com> */ | 923 | /* Reported by Olivier Blondeau <zeitoun@gmail.com> */ |
| 901 | UNUSUAL_DEV( 0x0727, 0x0306, 0x0100, 0x0100, | 924 | UNUSUAL_DEV( 0x0727, 0x0306, 0x0100, 0x0100, |
| 902 | "ATMEL", | 925 | "ATMEL", |
| @@ -1393,6 +1416,13 @@ UNUSUAL_DEV( 0x0fce, 0xe030, 0x0000, 0x0000, | |||
| 1393 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1416 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 1394 | US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ), | 1417 | US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ), |
| 1395 | 1418 | ||
| 1419 | /* Reported by Ricardo Barberis <ricardo@dattatec.com> */ | ||
| 1420 | UNUSUAL_DEV( 0x0fce, 0xe092, 0x0000, 0x0000, | ||
| 1421 | "Sony Ericsson", | ||
| 1422 | "P1i", | ||
| 1423 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 1424 | US_FL_IGNORE_RESIDUE ), | ||
| 1425 | |||
| 1396 | /* Reported by Emmanuel Vasilakis <evas@forthnet.gr> */ | 1426 | /* Reported by Emmanuel Vasilakis <evas@forthnet.gr> */ |
| 1397 | UNUSUAL_DEV( 0x0fce, 0xe031, 0x0000, 0x0000, | 1427 | UNUSUAL_DEV( 0x0fce, 0xe031, 0x0000, 0x0000, |
| 1398 | "Sony Ericsson", | 1428 | "Sony Ericsson", |
diff --git a/drivers/video/intelfb/intelfbhw.c b/drivers/video/intelfb/intelfbhw.c index 16bc8d75e36e..b21d0dec9283 100644 --- a/drivers/video/intelfb/intelfbhw.c +++ b/drivers/video/intelfb/intelfbhw.c | |||
| @@ -924,10 +924,10 @@ calc_pll_params(int index, int clock, u32 *retm1, u32 *retm2, u32 *retn, u32 *re | |||
| 924 | if (m > pll->max_m) | 924 | if (m > pll->max_m) |
| 925 | m = pll->max_m - 1; | 925 | m = pll->max_m - 1; |
| 926 | for (testm = m - 1; testm <= m; testm++) { | 926 | for (testm = m - 1; testm <= m; testm++) { |
| 927 | f_out = calc_vclock3(index, m, n, p); | 927 | f_out = calc_vclock3(index, testm, n, p); |
| 928 | if (splitm(index, testm, &m1, &m2)) { | 928 | if (splitm(index, testm, &m1, &m2)) { |
| 929 | WRN_MSG("cannot split m = %d\n", m); | 929 | WRN_MSG("cannot split m = %d\n", |
| 930 | n++; | 930 | testm); |
| 931 | continue; | 931 | continue; |
| 932 | } | 932 | } |
| 933 | if (clock > f_out) | 933 | if (clock > f_out) |
diff --git a/fs/Kconfig b/fs/Kconfig index 58a0650293e1..f9eed6d79066 100644 --- a/fs/Kconfig +++ b/fs/Kconfig | |||
| @@ -441,9 +441,6 @@ config OCFS2_FS | |||
| 441 | 441 | ||
| 442 | Note: Features which OCFS2 does not support yet: | 442 | Note: Features which OCFS2 does not support yet: |
| 443 | - extended attributes | 443 | - extended attributes |
| 444 | - shared writeable mmap | ||
| 445 | - loopback is supported, but data written will not | ||
| 446 | be cluster coherent. | ||
| 447 | - quotas | 444 | - quotas |
| 448 | - cluster aware flock | 445 | - cluster aware flock |
| 449 | - Directory change notification (F_NOTIFY) | 446 | - Directory change notification (F_NOTIFY) |
diff --git a/fs/afs/mntpt.c b/fs/afs/mntpt.c index a3684dcc76e7..6f8c96fb29eb 100644 --- a/fs/afs/mntpt.c +++ b/fs/afs/mntpt.c | |||
| @@ -235,8 +235,8 @@ static void *afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
| 235 | err = do_add_mount(newmnt, nd, MNT_SHRINKABLE, &afs_vfsmounts); | 235 | err = do_add_mount(newmnt, nd, MNT_SHRINKABLE, &afs_vfsmounts); |
| 236 | switch (err) { | 236 | switch (err) { |
| 237 | case 0: | 237 | case 0: |
| 238 | mntput(nd->mnt); | ||
| 239 | dput(nd->dentry); | 238 | dput(nd->dentry); |
| 239 | mntput(nd->mnt); | ||
| 240 | nd->mnt = newmnt; | 240 | nd->mnt = newmnt; |
| 241 | nd->dentry = dget(newmnt->mnt_root); | 241 | nd->dentry = dget(newmnt->mnt_root); |
| 242 | schedule_delayed_work(&afs_mntpt_expiry_timer, | 242 | schedule_delayed_work(&afs_mntpt_expiry_timer, |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 22cfdd61c060..9537316a0714 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
| @@ -2578,8 +2578,11 @@ static int ext3_release_dquot(struct dquot *dquot) | |||
| 2578 | 2578 | ||
| 2579 | handle = ext3_journal_start(dquot_to_inode(dquot), | 2579 | handle = ext3_journal_start(dquot_to_inode(dquot), |
| 2580 | EXT3_QUOTA_DEL_BLOCKS(dquot->dq_sb)); | 2580 | EXT3_QUOTA_DEL_BLOCKS(dquot->dq_sb)); |
| 2581 | if (IS_ERR(handle)) | 2581 | if (IS_ERR(handle)) { |
| 2582 | /* Release dquot anyway to avoid endless cycle in dqput() */ | ||
| 2583 | dquot_release(dquot); | ||
| 2582 | return PTR_ERR(handle); | 2584 | return PTR_ERR(handle); |
| 2585 | } | ||
| 2583 | ret = dquot_release(dquot); | 2586 | ret = dquot_release(dquot); |
| 2584 | err = ext3_journal_stop(handle); | 2587 | err = ext3_journal_stop(handle); |
| 2585 | if (!ret) | 2588 | if (!ret) |
| @@ -2712,6 +2715,12 @@ static ssize_t ext3_quota_write(struct super_block *sb, int type, | |||
| 2712 | struct buffer_head *bh; | 2715 | struct buffer_head *bh; |
| 2713 | handle_t *handle = journal_current_handle(); | 2716 | handle_t *handle = journal_current_handle(); |
| 2714 | 2717 | ||
| 2718 | if (!handle) { | ||
| 2719 | printk(KERN_WARNING "EXT3-fs: Quota write (off=%Lu, len=%Lu)" | ||
| 2720 | " cancelled because transaction is not started.\n", | ||
| 2721 | (unsigned long long)off, (unsigned long long)len); | ||
| 2722 | return -EIO; | ||
| 2723 | } | ||
| 2715 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); | 2724 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); |
| 2716 | while (towrite > 0) { | 2725 | while (towrite > 0) { |
| 2717 | tocopy = sb->s_blocksize - offset < towrite ? | 2726 | tocopy = sb->s_blocksize - offset < towrite ? |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 4550b83ab1c9..3c1397fa83df 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -2698,8 +2698,11 @@ static int ext4_release_dquot(struct dquot *dquot) | |||
| 2698 | 2698 | ||
| 2699 | handle = ext4_journal_start(dquot_to_inode(dquot), | 2699 | handle = ext4_journal_start(dquot_to_inode(dquot), |
| 2700 | EXT4_QUOTA_DEL_BLOCKS(dquot->dq_sb)); | 2700 | EXT4_QUOTA_DEL_BLOCKS(dquot->dq_sb)); |
| 2701 | if (IS_ERR(handle)) | 2701 | if (IS_ERR(handle)) { |
| 2702 | /* Release dquot anyway to avoid endless cycle in dqput() */ | ||
| 2703 | dquot_release(dquot); | ||
| 2702 | return PTR_ERR(handle); | 2704 | return PTR_ERR(handle); |
| 2705 | } | ||
| 2703 | ret = dquot_release(dquot); | 2706 | ret = dquot_release(dquot); |
| 2704 | err = ext4_journal_stop(handle); | 2707 | err = ext4_journal_stop(handle); |
| 2705 | if (!ret) | 2708 | if (!ret) |
| @@ -2832,6 +2835,12 @@ static ssize_t ext4_quota_write(struct super_block *sb, int type, | |||
| 2832 | struct buffer_head *bh; | 2835 | struct buffer_head *bh; |
| 2833 | handle_t *handle = journal_current_handle(); | 2836 | handle_t *handle = journal_current_handle(); |
| 2834 | 2837 | ||
| 2838 | if (!handle) { | ||
| 2839 | printk(KERN_WARNING "EXT4-fs: Quota write (off=%Lu, len=%Lu)" | ||
| 2840 | " cancelled because transaction is not started.\n", | ||
| 2841 | (unsigned long long)off, (unsigned long long)len); | ||
| 2842 | return -EIO; | ||
| 2843 | } | ||
| 2835 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); | 2844 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); |
| 2836 | while (towrite > 0) { | 2845 | while (towrite > 0) { |
| 2837 | tocopy = sb->s_blocksize - offset < towrite ? | 2846 | tocopy = sb->s_blocksize - offset < towrite ? |
diff --git a/fs/locks.c b/fs/locks.c index 50857d2d3404..c795eaaf6c4c 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
| @@ -782,7 +782,7 @@ find_conflict: | |||
| 782 | if (request->fl_flags & FL_ACCESS) | 782 | if (request->fl_flags & FL_ACCESS) |
| 783 | goto out; | 783 | goto out; |
| 784 | locks_copy_lock(new_fl, request); | 784 | locks_copy_lock(new_fl, request); |
| 785 | locks_insert_lock(&inode->i_flock, new_fl); | 785 | locks_insert_lock(before, new_fl); |
| 786 | new_fl = NULL; | 786 | new_fl = NULL; |
| 787 | error = 0; | 787 | error = 0; |
| 788 | 788 | ||
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index 4f517665c9a0..778a850b4634 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c | |||
| @@ -5602,6 +5602,7 @@ static int ocfs2_do_truncate(struct ocfs2_super *osb, | |||
| 5602 | clusters_to_del; | 5602 | clusters_to_del; |
| 5603 | spin_unlock(&OCFS2_I(inode)->ip_lock); | 5603 | spin_unlock(&OCFS2_I(inode)->ip_lock); |
| 5604 | le32_add_cpu(&fe->i_clusters, -clusters_to_del); | 5604 | le32_add_cpu(&fe->i_clusters, -clusters_to_del); |
| 5605 | inode->i_blocks = ocfs2_inode_sector_count(inode); | ||
| 5605 | 5606 | ||
| 5606 | status = ocfs2_trim_tree(inode, path, handle, tc, | 5607 | status = ocfs2_trim_tree(inode, path, handle, tc, |
| 5607 | clusters_to_del, &delete_blk); | 5608 | clusters_to_del, &delete_blk); |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 460d440310f2..50cd8a209012 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
| @@ -855,6 +855,7 @@ static int ocfs2_alloc_write_ctxt(struct ocfs2_write_ctxt **wcp, | |||
| 855 | struct ocfs2_super *osb, loff_t pos, | 855 | struct ocfs2_super *osb, loff_t pos, |
| 856 | unsigned len, struct buffer_head *di_bh) | 856 | unsigned len, struct buffer_head *di_bh) |
| 857 | { | 857 | { |
| 858 | u32 cend; | ||
| 858 | struct ocfs2_write_ctxt *wc; | 859 | struct ocfs2_write_ctxt *wc; |
| 859 | 860 | ||
| 860 | wc = kzalloc(sizeof(struct ocfs2_write_ctxt), GFP_NOFS); | 861 | wc = kzalloc(sizeof(struct ocfs2_write_ctxt), GFP_NOFS); |
| @@ -862,7 +863,8 @@ static int ocfs2_alloc_write_ctxt(struct ocfs2_write_ctxt **wcp, | |||
| 862 | return -ENOMEM; | 863 | return -ENOMEM; |
| 863 | 864 | ||
| 864 | wc->w_cpos = pos >> osb->s_clustersize_bits; | 865 | wc->w_cpos = pos >> osb->s_clustersize_bits; |
| 865 | wc->w_clen = ocfs2_clusters_for_bytes(osb->sb, len); | 866 | cend = (pos + len - 1) >> osb->s_clustersize_bits; |
| 867 | wc->w_clen = cend - wc->w_cpos + 1; | ||
| 866 | get_bh(di_bh); | 868 | get_bh(di_bh); |
| 867 | wc->w_di_bh = di_bh; | 869 | wc->w_di_bh = di_bh; |
| 868 | 870 | ||
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 4ffa715be09c..7e34e66159c6 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
| @@ -314,7 +314,6 @@ static int ocfs2_orphan_for_truncate(struct ocfs2_super *osb, | |||
| 314 | } | 314 | } |
| 315 | 315 | ||
| 316 | i_size_write(inode, new_i_size); | 316 | i_size_write(inode, new_i_size); |
| 317 | inode->i_blocks = ocfs2_align_bytes_to_sectors(new_i_size); | ||
| 318 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; | 317 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; |
| 319 | 318 | ||
| 320 | di = (struct ocfs2_dinode *) fe_bh->b_data; | 319 | di = (struct ocfs2_dinode *) fe_bh->b_data; |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index f2fc9a795deb..c034b5129c1e 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
| @@ -81,8 +81,15 @@ static struct dentry *ocfs2_debugfs_root = NULL; | |||
| 81 | MODULE_AUTHOR("Oracle"); | 81 | MODULE_AUTHOR("Oracle"); |
| 82 | MODULE_LICENSE("GPL"); | 82 | MODULE_LICENSE("GPL"); |
| 83 | 83 | ||
| 84 | struct mount_options | ||
| 85 | { | ||
| 86 | unsigned long mount_opt; | ||
| 87 | unsigned int atime_quantum; | ||
| 88 | signed short slot; | ||
| 89 | }; | ||
| 90 | |||
| 84 | static int ocfs2_parse_options(struct super_block *sb, char *options, | 91 | static int ocfs2_parse_options(struct super_block *sb, char *options, |
| 85 | unsigned long *mount_opt, s16 *slot, | 92 | struct mount_options *mopt, |
| 86 | int is_remount); | 93 | int is_remount); |
| 87 | static void ocfs2_put_super(struct super_block *sb); | 94 | static void ocfs2_put_super(struct super_block *sb); |
| 88 | static int ocfs2_mount_volume(struct super_block *sb); | 95 | static int ocfs2_mount_volume(struct super_block *sb); |
| @@ -367,24 +374,23 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) | |||
| 367 | { | 374 | { |
| 368 | int incompat_features; | 375 | int incompat_features; |
| 369 | int ret = 0; | 376 | int ret = 0; |
| 370 | unsigned long parsed_options; | 377 | struct mount_options parsed_options; |
| 371 | s16 slot; | ||
| 372 | struct ocfs2_super *osb = OCFS2_SB(sb); | 378 | struct ocfs2_super *osb = OCFS2_SB(sb); |
| 373 | 379 | ||
| 374 | if (!ocfs2_parse_options(sb, data, &parsed_options, &slot, 1)) { | 380 | if (!ocfs2_parse_options(sb, data, &parsed_options, 1)) { |
| 375 | ret = -EINVAL; | 381 | ret = -EINVAL; |
| 376 | goto out; | 382 | goto out; |
| 377 | } | 383 | } |
| 378 | 384 | ||
| 379 | if ((osb->s_mount_opt & OCFS2_MOUNT_HB_LOCAL) != | 385 | if ((osb->s_mount_opt & OCFS2_MOUNT_HB_LOCAL) != |
| 380 | (parsed_options & OCFS2_MOUNT_HB_LOCAL)) { | 386 | (parsed_options.mount_opt & OCFS2_MOUNT_HB_LOCAL)) { |
| 381 | ret = -EINVAL; | 387 | ret = -EINVAL; |
| 382 | mlog(ML_ERROR, "Cannot change heartbeat mode on remount\n"); | 388 | mlog(ML_ERROR, "Cannot change heartbeat mode on remount\n"); |
| 383 | goto out; | 389 | goto out; |
| 384 | } | 390 | } |
| 385 | 391 | ||
| 386 | if ((osb->s_mount_opt & OCFS2_MOUNT_DATA_WRITEBACK) != | 392 | if ((osb->s_mount_opt & OCFS2_MOUNT_DATA_WRITEBACK) != |
| 387 | (parsed_options & OCFS2_MOUNT_DATA_WRITEBACK)) { | 393 | (parsed_options.mount_opt & OCFS2_MOUNT_DATA_WRITEBACK)) { |
| 388 | ret = -EINVAL; | 394 | ret = -EINVAL; |
| 389 | mlog(ML_ERROR, "Cannot change data mode on remount\n"); | 395 | mlog(ML_ERROR, "Cannot change data mode on remount\n"); |
| 390 | goto out; | 396 | goto out; |
| @@ -435,7 +441,9 @@ unlock_osb: | |||
| 435 | 441 | ||
| 436 | /* Only save off the new mount options in case of a successful | 442 | /* Only save off the new mount options in case of a successful |
| 437 | * remount. */ | 443 | * remount. */ |
| 438 | osb->s_mount_opt = parsed_options; | 444 | osb->s_mount_opt = parsed_options.mount_opt; |
| 445 | osb->s_atime_quantum = parsed_options.atime_quantum; | ||
| 446 | osb->preferred_slot = parsed_options.slot; | ||
| 439 | } | 447 | } |
| 440 | out: | 448 | out: |
| 441 | return ret; | 449 | return ret; |
| @@ -547,8 +555,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 547 | { | 555 | { |
| 548 | struct dentry *root; | 556 | struct dentry *root; |
| 549 | int status, sector_size; | 557 | int status, sector_size; |
| 550 | unsigned long parsed_opt; | 558 | struct mount_options parsed_options; |
| 551 | s16 slot; | ||
| 552 | struct inode *inode = NULL; | 559 | struct inode *inode = NULL; |
| 553 | struct ocfs2_super *osb = NULL; | 560 | struct ocfs2_super *osb = NULL; |
| 554 | struct buffer_head *bh = NULL; | 561 | struct buffer_head *bh = NULL; |
| @@ -556,14 +563,14 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 556 | 563 | ||
| 557 | mlog_entry("%p, %p, %i", sb, data, silent); | 564 | mlog_entry("%p, %p, %i", sb, data, silent); |
| 558 | 565 | ||
| 559 | if (!ocfs2_parse_options(sb, data, &parsed_opt, &slot, 0)) { | 566 | if (!ocfs2_parse_options(sb, data, &parsed_options, 0)) { |
| 560 | status = -EINVAL; | 567 | status = -EINVAL; |
| 561 | goto read_super_error; | 568 | goto read_super_error; |
| 562 | } | 569 | } |
| 563 | 570 | ||
| 564 | /* for now we only have one cluster/node, make sure we see it | 571 | /* for now we only have one cluster/node, make sure we see it |
| 565 | * in the heartbeat universe */ | 572 | * in the heartbeat universe */ |
| 566 | if (parsed_opt & OCFS2_MOUNT_HB_LOCAL) { | 573 | if (parsed_options.mount_opt & OCFS2_MOUNT_HB_LOCAL) { |
| 567 | if (!o2hb_check_local_node_heartbeating()) { | 574 | if (!o2hb_check_local_node_heartbeating()) { |
| 568 | status = -EINVAL; | 575 | status = -EINVAL; |
| 569 | goto read_super_error; | 576 | goto read_super_error; |
| @@ -585,8 +592,9 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 585 | } | 592 | } |
| 586 | brelse(bh); | 593 | brelse(bh); |
| 587 | bh = NULL; | 594 | bh = NULL; |
| 588 | osb->s_mount_opt = parsed_opt; | 595 | osb->s_mount_opt = parsed_options.mount_opt; |
| 589 | osb->preferred_slot = slot; | 596 | osb->s_atime_quantum = parsed_options.atime_quantum; |
| 597 | osb->preferred_slot = parsed_options.slot; | ||
| 590 | 598 | ||
| 591 | sb->s_magic = OCFS2_SUPER_MAGIC; | 599 | sb->s_magic = OCFS2_SUPER_MAGIC; |
| 592 | 600 | ||
| @@ -728,8 +736,7 @@ static struct file_system_type ocfs2_fs_type = { | |||
| 728 | 736 | ||
| 729 | static int ocfs2_parse_options(struct super_block *sb, | 737 | static int ocfs2_parse_options(struct super_block *sb, |
| 730 | char *options, | 738 | char *options, |
| 731 | unsigned long *mount_opt, | 739 | struct mount_options *mopt, |
| 732 | s16 *slot, | ||
| 733 | int is_remount) | 740 | int is_remount) |
| 734 | { | 741 | { |
| 735 | int status; | 742 | int status; |
| @@ -738,8 +745,9 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 738 | mlog_entry("remount: %d, options: \"%s\"\n", is_remount, | 745 | mlog_entry("remount: %d, options: \"%s\"\n", is_remount, |
| 739 | options ? options : "(none)"); | 746 | options ? options : "(none)"); |
| 740 | 747 | ||
| 741 | *mount_opt = 0; | 748 | mopt->mount_opt = 0; |
| 742 | *slot = OCFS2_INVALID_SLOT; | 749 | mopt->atime_quantum = OCFS2_DEFAULT_ATIME_QUANTUM; |
| 750 | mopt->slot = OCFS2_INVALID_SLOT; | ||
| 743 | 751 | ||
| 744 | if (!options) { | 752 | if (!options) { |
| 745 | status = 1; | 753 | status = 1; |
| @@ -749,7 +757,6 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 749 | while ((p = strsep(&options, ",")) != NULL) { | 757 | while ((p = strsep(&options, ",")) != NULL) { |
| 750 | int token, option; | 758 | int token, option; |
| 751 | substring_t args[MAX_OPT_ARGS]; | 759 | substring_t args[MAX_OPT_ARGS]; |
| 752 | struct ocfs2_super * osb = OCFS2_SB(sb); | ||
| 753 | 760 | ||
| 754 | if (!*p) | 761 | if (!*p) |
| 755 | continue; | 762 | continue; |
| @@ -757,10 +764,10 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 757 | token = match_token(p, tokens, args); | 764 | token = match_token(p, tokens, args); |
| 758 | switch (token) { | 765 | switch (token) { |
| 759 | case Opt_hb_local: | 766 | case Opt_hb_local: |
| 760 | *mount_opt |= OCFS2_MOUNT_HB_LOCAL; | 767 | mopt->mount_opt |= OCFS2_MOUNT_HB_LOCAL; |
| 761 | break; | 768 | break; |
| 762 | case Opt_hb_none: | 769 | case Opt_hb_none: |
| 763 | *mount_opt &= ~OCFS2_MOUNT_HB_LOCAL; | 770 | mopt->mount_opt &= ~OCFS2_MOUNT_HB_LOCAL; |
| 764 | break; | 771 | break; |
| 765 | case Opt_barrier: | 772 | case Opt_barrier: |
| 766 | if (match_int(&args[0], &option)) { | 773 | if (match_int(&args[0], &option)) { |
| @@ -768,27 +775,27 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 768 | goto bail; | 775 | goto bail; |
| 769 | } | 776 | } |
| 770 | if (option) | 777 | if (option) |
| 771 | *mount_opt |= OCFS2_MOUNT_BARRIER; | 778 | mopt->mount_opt |= OCFS2_MOUNT_BARRIER; |
| 772 | else | 779 | else |
| 773 | *mount_opt &= ~OCFS2_MOUNT_BARRIER; | 780 | mopt->mount_opt &= ~OCFS2_MOUNT_BARRIER; |
| 774 | break; | 781 | break; |
| 775 | case Opt_intr: | 782 | case Opt_intr: |
| 776 | *mount_opt &= ~OCFS2_MOUNT_NOINTR; | 783 | mopt->mount_opt &= ~OCFS2_MOUNT_NOINTR; |
| 777 | break; | 784 | break; |
| 778 | case Opt_nointr: | 785 | case Opt_nointr: |
| 779 | *mount_opt |= OCFS2_MOUNT_NOINTR; | 786 | mopt->mount_opt |= OCFS2_MOUNT_NOINTR; |
| 780 | break; | 787 | break; |
| 781 | case Opt_err_panic: | 788 | case Opt_err_panic: |
| 782 | *mount_opt |= OCFS2_MOUNT_ERRORS_PANIC; | 789 | mopt->mount_opt |= OCFS2_MOUNT_ERRORS_PANIC; |
| 783 | break; | 790 | break; |
| 784 | case Opt_err_ro: | 791 | case Opt_err_ro: |
| 785 | *mount_opt &= ~OCFS2_MOUNT_ERRORS_PANIC; | 792 | mopt->mount_opt &= ~OCFS2_MOUNT_ERRORS_PANIC; |
| 786 | break; | 793 | break; |
| 787 | case Opt_data_ordered: | 794 | case Opt_data_ordered: |
| 788 | *mount_opt &= ~OCFS2_MOUNT_DATA_WRITEBACK; | 795 | mopt->mount_opt &= ~OCFS2_MOUNT_DATA_WRITEBACK; |
| 789 | break; | 796 | break; |
| 790 | case Opt_data_writeback: | 797 | case Opt_data_writeback: |
| 791 | *mount_opt |= OCFS2_MOUNT_DATA_WRITEBACK; | 798 | mopt->mount_opt |= OCFS2_MOUNT_DATA_WRITEBACK; |
| 792 | break; | 799 | break; |
| 793 | case Opt_atime_quantum: | 800 | case Opt_atime_quantum: |
| 794 | if (match_int(&args[0], &option)) { | 801 | if (match_int(&args[0], &option)) { |
| @@ -796,9 +803,7 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 796 | goto bail; | 803 | goto bail; |
| 797 | } | 804 | } |
| 798 | if (option >= 0) | 805 | if (option >= 0) |
| 799 | osb->s_atime_quantum = option; | 806 | mopt->atime_quantum = option; |
| 800 | else | ||
| 801 | osb->s_atime_quantum = OCFS2_DEFAULT_ATIME_QUANTUM; | ||
| 802 | break; | 807 | break; |
| 803 | case Opt_slot: | 808 | case Opt_slot: |
| 804 | option = 0; | 809 | option = 0; |
| @@ -807,7 +812,7 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 807 | goto bail; | 812 | goto bail; |
| 808 | } | 813 | } |
| 809 | if (option) | 814 | if (option) |
| 810 | *slot = (s16)option; | 815 | mopt->slot = (s16)option; |
| 811 | break; | 816 | break; |
| 812 | default: | 817 | default: |
| 813 | mlog(ML_ERROR, | 818 | mlog(ML_ERROR, |
diff --git a/fs/proc/inode.c b/fs/proc/inode.c index a5b0dfd89a17..0e4d37c93eea 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/string.h> | 11 | #include <linux/string.h> |
| 12 | #include <linux/stat.h> | 12 | #include <linux/stat.h> |
| 13 | #include <linux/completion.h> | 13 | #include <linux/completion.h> |
| 14 | #include <linux/poll.h> | ||
| 14 | #include <linux/file.h> | 15 | #include <linux/file.h> |
| 15 | #include <linux/limits.h> | 16 | #include <linux/limits.h> |
| 16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| @@ -232,7 +233,7 @@ static ssize_t proc_reg_write(struct file *file, const char __user *buf, size_t | |||
| 232 | static unsigned int proc_reg_poll(struct file *file, struct poll_table_struct *pts) | 233 | static unsigned int proc_reg_poll(struct file *file, struct poll_table_struct *pts) |
| 233 | { | 234 | { |
| 234 | struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); | 235 | struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); |
| 235 | unsigned int rv = 0; | 236 | unsigned int rv = DEFAULT_POLLMASK; |
| 236 | unsigned int (*poll)(struct file *, struct poll_table_struct *); | 237 | unsigned int (*poll)(struct file *, struct poll_table_struct *); |
| 237 | 238 | ||
| 238 | spin_lock(&pde->pde_unload_lock); | 239 | spin_lock(&pde->pde_unload_lock); |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 5b68dd3f191a..a005451930b7 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
| @@ -1915,8 +1915,11 @@ static int reiserfs_release_dquot(struct dquot *dquot) | |||
| 1915 | ret = | 1915 | ret = |
| 1916 | journal_begin(&th, dquot->dq_sb, | 1916 | journal_begin(&th, dquot->dq_sb, |
| 1917 | REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb)); | 1917 | REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb)); |
| 1918 | if (ret) | 1918 | if (ret) { |
| 1919 | /* Release dquot anyway to avoid endless cycle in dqput() */ | ||
| 1920 | dquot_release(dquot); | ||
| 1919 | goto out; | 1921 | goto out; |
| 1922 | } | ||
| 1920 | ret = dquot_release(dquot); | 1923 | ret = dquot_release(dquot); |
| 1921 | err = | 1924 | err = |
| 1922 | journal_end(&th, dquot->dq_sb, | 1925 | journal_end(&th, dquot->dq_sb, |
| @@ -2067,6 +2070,12 @@ static ssize_t reiserfs_quota_write(struct super_block *sb, int type, | |||
| 2067 | size_t towrite = len; | 2070 | size_t towrite = len; |
| 2068 | struct buffer_head tmp_bh, *bh; | 2071 | struct buffer_head tmp_bh, *bh; |
| 2069 | 2072 | ||
| 2073 | if (!current->journal_info) { | ||
| 2074 | printk(KERN_WARNING "reiserfs: Quota write (off=%Lu, len=%Lu)" | ||
| 2075 | " cancelled because transaction is not started.\n", | ||
| 2076 | (unsigned long long)off, (unsigned long long)len); | ||
| 2077 | return -EIO; | ||
| 2078 | } | ||
| 2070 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); | 2079 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); |
| 2071 | while (towrite > 0) { | 2080 | while (towrite > 0) { |
| 2072 | tocopy = sb->s_blocksize - offset < towrite ? | 2081 | tocopy = sb->s_blocksize - offset < towrite ? |
| @@ -2098,7 +2107,7 @@ static ssize_t reiserfs_quota_write(struct super_block *sb, int type, | |||
| 2098 | data += tocopy; | 2107 | data += tocopy; |
| 2099 | blk++; | 2108 | blk++; |
| 2100 | } | 2109 | } |
| 2101 | out: | 2110 | out: |
| 2102 | if (len == towrite) | 2111 | if (len == towrite) |
| 2103 | return err; | 2112 | return err; |
| 2104 | if (inode->i_size < off + len - towrite) | 2113 | if (inode->i_size < off + len - towrite) |
diff --git a/fs/select.c b/fs/select.c index a974082b0824..46dca31c607a 100644 --- a/fs/select.c +++ b/fs/select.c | |||
| @@ -26,8 +26,6 @@ | |||
| 26 | 26 | ||
| 27 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
| 28 | 28 | ||
| 29 | #define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM) | ||
| 30 | |||
| 31 | struct poll_table_page { | 29 | struct poll_table_page { |
| 32 | struct poll_table_page * next; | 30 | struct poll_table_page * next; |
| 33 | struct poll_table_entry * entry; | 31 | struct poll_table_entry * entry; |
diff --git a/include/asm-generic/termios.h b/include/asm-generic/termios.h index 3769e6bd63b1..33dca30a3c45 100644 --- a/include/asm-generic/termios.h +++ b/include/asm-generic/termios.h | |||
| @@ -63,6 +63,8 @@ static inline int kernel_termios_to_user_termio(struct termio __user *termio, | |||
| 63 | 63 | ||
| 64 | #define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios)) | 64 | #define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios)) |
| 65 | #define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios)) | 65 | #define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios)) |
| 66 | #define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios)) | ||
| 67 | #define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios)) | ||
| 66 | 68 | ||
| 67 | #endif /* __ARCH_TERMIO_GETPUT */ | 69 | #endif /* __ARCH_TERMIO_GETPUT */ |
| 68 | 70 | ||
diff --git a/include/asm-m68k/unistd.h b/include/asm-m68k/unistd.h index fdbb60e6a0d4..a30fe9c64143 100644 --- a/include/asm-m68k/unistd.h +++ b/include/asm-m68k/unistd.h | |||
| @@ -313,10 +313,20 @@ | |||
| 313 | #define __NR_tee 308 | 313 | #define __NR_tee 308 |
| 314 | #define __NR_vmsplice 309 | 314 | #define __NR_vmsplice 309 |
| 315 | #define __NR_move_pages 310 | 315 | #define __NR_move_pages 310 |
| 316 | #define __NR_sched_setaffinity 311 | ||
| 317 | #define __NR_sched_getaffinity 312 | ||
| 318 | #define __NR_kexec_load 313 | ||
| 319 | #define __NR_getcpu 314 | ||
| 320 | #define __NR_epoll_pwait 315 | ||
| 321 | #define __NR_utimensat 316 | ||
| 322 | #define __NR_signalfd 317 | ||
| 323 | #define __NR_timerfd 318 | ||
| 324 | #define __NR_eventfd 319 | ||
| 325 | #define __NR_fallocate 320 | ||
| 316 | 326 | ||
| 317 | #ifdef __KERNEL__ | 327 | #ifdef __KERNEL__ |
| 318 | 328 | ||
| 319 | #define NR_syscalls 311 | 329 | #define NR_syscalls 321 |
| 320 | 330 | ||
| 321 | #define __ARCH_WANT_IPC_PARSE_VERSION | 331 | #define __ARCH_WANT_IPC_PARSE_VERSION |
| 322 | #define __ARCH_WANT_OLD_READDIR | 332 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/include/asm-m68knommu/unistd.h b/include/asm-m68knommu/unistd.h index 82e03195f325..eb1b566793fe 100644 --- a/include/asm-m68knommu/unistd.h +++ b/include/asm-m68knommu/unistd.h | |||
| @@ -314,10 +314,20 @@ | |||
| 314 | #define __NR_tee 308 | 314 | #define __NR_tee 308 |
| 315 | #define __NR_vmsplice 309 | 315 | #define __NR_vmsplice 309 |
| 316 | #define __NR_move_pages 310 | 316 | #define __NR_move_pages 310 |
| 317 | #define __NR_sched_setaffinity 311 | ||
| 318 | #define __NR_sched_getaffinity 312 | ||
| 319 | #define __NR_kexec_load 313 | ||
| 320 | #define __NR_getcpu 314 | ||
| 321 | #define __NR_epoll_pwait 315 | ||
| 322 | #define __NR_utimensat 316 | ||
| 323 | #define __NR_signalfd 317 | ||
| 324 | #define __NR_timerfd 318 | ||
| 325 | #define __NR_eventfd 319 | ||
| 326 | #define __NR_fallocate 320 | ||
| 317 | 327 | ||
| 318 | #ifdef __KERNEL__ | 328 | #ifdef __KERNEL__ |
| 319 | 329 | ||
| 320 | #define NR_syscalls 311 | 330 | #define NR_syscalls 321 |
| 321 | 331 | ||
| 322 | #define __ARCH_WANT_IPC_PARSE_VERSION | 332 | #define __ARCH_WANT_IPC_PARSE_VERSION |
| 323 | #define __ARCH_WANT_OLD_READDIR | 333 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/include/asm-mips/sibyte/bcm1480_regs.h b/include/asm-mips/sibyte/bcm1480_regs.h index 2738c1366f66..c34d36b6b8c2 100644 --- a/include/asm-mips/sibyte/bcm1480_regs.h +++ b/include/asm-mips/sibyte/bcm1480_regs.h | |||
| @@ -227,10 +227,15 @@ | |||
| 227 | (A_BCM1480_DUART(chan) + \ | 227 | (A_BCM1480_DUART(chan) + \ |
| 228 | BCM1480_DUART_CHANREG_SPACING * 3 + (reg)) | 228 | BCM1480_DUART_CHANREG_SPACING * 3 + (reg)) |
| 229 | 229 | ||
| 230 | #define DUART_IMRISR_SPACING 0x20 | ||
| 231 | #define DUART_INCHNG_SPACING 0x10 | ||
| 232 | |||
| 230 | #define R_BCM1480_DUART_IMRREG(chan) \ | 233 | #define R_BCM1480_DUART_IMRREG(chan) \ |
| 231 | (R_DUART_IMR_A + ((chan) & 1) * DUART_IMRISR_SPACING) | 234 | (R_DUART_IMR_A + ((chan) & 1) * DUART_IMRISR_SPACING) |
| 232 | #define R_BCM1480_DUART_ISRREG(chan) \ | 235 | #define R_BCM1480_DUART_ISRREG(chan) \ |
| 233 | (R_DUART_ISR_A + ((chan) & 1) * DUART_IMRISR_SPACING) | 236 | (R_DUART_ISR_A + ((chan) & 1) * DUART_IMRISR_SPACING) |
| 237 | #define R_BCM1480_DUART_INCHREG(chan) \ | ||
| 238 | (R_DUART_IN_CHNG_A + ((chan) & 1) * DUART_INCHNG_SPACING) | ||
| 234 | 239 | ||
| 235 | #define A_BCM1480_DUART_IMRREG(chan) \ | 240 | #define A_BCM1480_DUART_IMRREG(chan) \ |
| 236 | (A_BCM1480_DUART_CTRLREG((chan), R_BCM1480_DUART_IMRREG(chan))) | 241 | (A_BCM1480_DUART_CTRLREG((chan), R_BCM1480_DUART_IMRREG(chan))) |
diff --git a/include/linux/aer.h b/include/linux/aer.h index 509656286e53..bcf236d825e8 100644 --- a/include/linux/aer.h +++ b/include/linux/aer.h | |||
| @@ -15,11 +15,26 @@ extern int pci_disable_pcie_error_reporting(struct pci_dev *dev); | |||
| 15 | extern int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev); | 15 | extern int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev); |
| 16 | extern int pci_cleanup_aer_correct_error_status(struct pci_dev *dev); | 16 | extern int pci_cleanup_aer_correct_error_status(struct pci_dev *dev); |
| 17 | #else | 17 | #else |
| 18 | #define pci_enable_pcie_error_reporting(dev) (-EINVAL) | 18 | static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev) |
| 19 | #define pci_find_aer_capability(dev) (0) | 19 | { |
| 20 | #define pci_disable_pcie_error_reporting(dev) (-EINVAL) | 20 | return -EINVAL; |
| 21 | #define pci_cleanup_aer_uncorrect_error_status(dev) (-EINVAL) | 21 | } |
| 22 | #define pci_cleanup_aer_correct_error_status(dev) (-EINVAL) | 22 | static inline int pci_find_aer_capability(struct pci_dev *dev) |
| 23 | { | ||
| 24 | return 0; | ||
| 25 | } | ||
| 26 | static inline int pci_disable_pcie_error_reporting(struct pci_dev *dev) | ||
| 27 | { | ||
| 28 | return -EINVAL; | ||
| 29 | } | ||
| 30 | static inline int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev) | ||
| 31 | { | ||
| 32 | return -EINVAL; | ||
| 33 | } | ||
| 34 | static inline int pci_cleanup_aer_correct_error_status(struct pci_dev *dev) | ||
| 35 | { | ||
| 36 | return -EINVAL; | ||
| 37 | } | ||
| 23 | #endif | 38 | #endif |
| 24 | 39 | ||
| 25 | #endif //_AER_H_ | 40 | #endif //_AER_H_ |
diff --git a/include/linux/ide.h b/include/linux/ide.h index c792b4fd1588..b9f66c10caa0 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -1378,6 +1378,19 @@ static inline int ide_dev_has_iordy(struct hd_driveid *id) | |||
| 1378 | return ((id->field_valid & 2) && (id->capability & 8)) ? 1 : 0; | 1378 | return ((id->field_valid & 2) && (id->capability & 8)) ? 1 : 0; |
| 1379 | } | 1379 | } |
| 1380 | 1380 | ||
| 1381 | static inline int ide_dev_is_sata(struct hd_driveid *id) | ||
| 1382 | { | ||
| 1383 | /* | ||
| 1384 | * See if word 93 is 0 AND drive is at least ATA-5 compatible | ||
| 1385 | * verifying that word 80 by casting it to a signed type -- | ||
| 1386 | * this trick allows us to filter out the reserved values of | ||
| 1387 | * 0x0000 and 0xffff along with the earlier ATA revisions... | ||
| 1388 | */ | ||
| 1389 | if (id->hw_config == 0 && (short)id->major_rev_num >= 0x0020) | ||
| 1390 | return 1; | ||
| 1391 | return 0; | ||
| 1392 | } | ||
| 1393 | |||
| 1381 | u8 ide_dump_status(ide_drive_t *, const char *, u8); | 1394 | u8 ide_dump_status(ide_drive_t *, const char *, u8); |
| 1382 | 1395 | ||
| 1383 | typedef struct ide_pio_timings_s { | 1396 | typedef struct ide_pio_timings_s { |
diff --git a/include/linux/input.h b/include/linux/input.h index cf2b5619aa13..36e00aa6f03b 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
| @@ -558,6 +558,8 @@ struct input_absinfo { | |||
| 558 | #define KEY_BRL_DOT6 0x1f6 | 558 | #define KEY_BRL_DOT6 0x1f6 |
| 559 | #define KEY_BRL_DOT7 0x1f7 | 559 | #define KEY_BRL_DOT7 0x1f7 |
| 560 | #define KEY_BRL_DOT8 0x1f8 | 560 | #define KEY_BRL_DOT8 0x1f8 |
| 561 | #define KEY_BRL_DOT9 0x1f9 | ||
| 562 | #define KEY_BRL_DOT10 0x1fa | ||
| 561 | 563 | ||
| 562 | /* We avoid low common keys in module aliases so they don't get huge. */ | 564 | /* We avoid low common keys in module aliases so they don't get huge. */ |
| 563 | #define KEY_MIN_INTERESTING KEY_MUTE | 565 | #define KEY_MIN_INTERESTING KEY_MUTE |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index f592df74b3cf..47160fe378c9 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -34,6 +34,7 @@ extern const char linux_proc_banner[]; | |||
| 34 | 34 | ||
| 35 | #define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) | 35 | #define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) |
| 36 | #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) | 36 | #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) |
| 37 | #define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a))) | ||
| 37 | 38 | ||
| 38 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) | 39 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) |
| 39 | 40 | ||
diff --git a/include/linux/keyboard.h b/include/linux/keyboard.h index de76843bbe8a..7ddbc30aa8e7 100644 --- a/include/linux/keyboard.h +++ b/include/linux/keyboard.h | |||
| @@ -437,8 +437,10 @@ extern unsigned short plain_map[NR_KEYS]; | |||
| 437 | #define K_BRL_DOT6 K(KT_BRL, 6) | 437 | #define K_BRL_DOT6 K(KT_BRL, 6) |
| 438 | #define K_BRL_DOT7 K(KT_BRL, 7) | 438 | #define K_BRL_DOT7 K(KT_BRL, 7) |
| 439 | #define K_BRL_DOT8 K(KT_BRL, 8) | 439 | #define K_BRL_DOT8 K(KT_BRL, 8) |
| 440 | #define K_BRL_DOT9 K(KT_BRL, 9) | ||
| 441 | #define K_BRL_DOT10 K(KT_BRL, 10) | ||
| 440 | 442 | ||
| 441 | #define NR_BRL 9 | 443 | #define NR_BRL 11 |
| 442 | 444 | ||
| 443 | #define MAX_DIACR 256 | 445 | #define MAX_DIACR 256 |
| 444 | #endif | 446 | #endif |
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 0eed0b7ab2df..1dd075eda595 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h | |||
| @@ -88,9 +88,8 @@ struct nf_sockopt_ops | |||
| 88 | int (*compat_get)(struct sock *sk, int optval, | 88 | int (*compat_get)(struct sock *sk, int optval, |
| 89 | void __user *user, int *len); | 89 | void __user *user, int *len); |
| 90 | 90 | ||
| 91 | /* Number of users inside set() or get(). */ | 91 | /* Use the module struct to lock set/get code in place */ |
| 92 | unsigned int use; | 92 | struct module *owner; |
| 93 | struct task_struct *cleanup_task; | ||
| 94 | }; | 93 | }; |
| 95 | 94 | ||
| 96 | /* Each queued (to userspace) skbuff has one of these. */ | 95 | /* Each queued (to userspace) skbuff has one of these. */ |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index d41747b9fd15..55f307ffbf96 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -2293,6 +2293,8 @@ | |||
| 2293 | #define PCI_DEVICE_ID_INTEL_MCH_PC 0x3599 | 2293 | #define PCI_DEVICE_ID_INTEL_MCH_PC 0x3599 |
| 2294 | #define PCI_DEVICE_ID_INTEL_MCH_PC1 0x359a | 2294 | #define PCI_DEVICE_ID_INTEL_MCH_PC1 0x359a |
| 2295 | #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e | 2295 | #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e |
| 2296 | #define PCI_DEVICE_ID_INTEL_TOLAPAI_0 0x5031 | ||
| 2297 | #define PCI_DEVICE_ID_INTEL_TOLAPAI_1 0x5032 | ||
| 2296 | #define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000 | 2298 | #define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000 |
| 2297 | #define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010 | 2299 | #define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010 |
| 2298 | #define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020 | 2300 | #define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020 |
diff --git a/include/linux/poll.h b/include/linux/poll.h index 27690798623f..16d813b364ef 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h | |||
| @@ -21,6 +21,8 @@ | |||
| 21 | #define WQUEUES_STACK_ALLOC (MAX_STACK_ALLOC - FRONTEND_STACK_ALLOC) | 21 | #define WQUEUES_STACK_ALLOC (MAX_STACK_ALLOC - FRONTEND_STACK_ALLOC) |
| 22 | #define N_INLINE_POLL_ENTRIES (WQUEUES_STACK_ALLOC / sizeof(struct poll_table_entry)) | 22 | #define N_INLINE_POLL_ENTRIES (WQUEUES_STACK_ALLOC / sizeof(struct poll_table_entry)) |
| 23 | 23 | ||
| 24 | #define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM) | ||
| 25 | |||
| 24 | struct poll_table_struct; | 26 | struct poll_table_struct; |
| 25 | 27 | ||
| 26 | /* | 28 | /* |
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h index 007d442412e2..b4b31132618b 100644 --- a/include/scsi/libiscsi.h +++ b/include/scsi/libiscsi.h | |||
| @@ -205,6 +205,13 @@ struct iscsi_queue { | |||
| 205 | }; | 205 | }; |
| 206 | 206 | ||
| 207 | struct iscsi_session { | 207 | struct iscsi_session { |
| 208 | /* | ||
| 209 | * Syncs up the scsi eh thread with the iscsi eh thread when sending | ||
| 210 | * task management functions. This must be taken before the session | ||
| 211 | * and recv lock. | ||
| 212 | */ | ||
| 213 | struct mutex eh_mutex; | ||
| 214 | |||
| 208 | /* iSCSI session-wide sequencing */ | 215 | /* iSCSI session-wide sequencing */ |
| 209 | uint32_t cmdsn; | 216 | uint32_t cmdsn; |
| 210 | uint32_t exp_cmdsn; | 217 | uint32_t exp_cmdsn; |
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index f7921360efad..7e52eb051f22 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c | |||
| @@ -61,10 +61,10 @@ void compat_exit_robust_list(struct task_struct *curr) | |||
| 61 | if (fetch_robust_entry(&upending, &pending, | 61 | if (fetch_robust_entry(&upending, &pending, |
| 62 | &head->list_op_pending, &pip)) | 62 | &head->list_op_pending, &pip)) |
| 63 | return; | 63 | return; |
| 64 | if (upending) | 64 | if (pending) |
| 65 | handle_futex_death((void __user *)pending + futex_offset, curr, pip); | 65 | handle_futex_death((void __user *)pending + futex_offset, curr, pip); |
| 66 | 66 | ||
| 67 | while (compat_ptr(uentry) != &head->list) { | 67 | while (entry != (struct robust_list __user *) &head->list) { |
| 68 | /* | 68 | /* |
| 69 | * A pending lock might already be on the list, so | 69 | * A pending lock might already be on the list, so |
| 70 | * dont process it twice: | 70 | * dont process it twice: |
diff --git a/kernel/kmod.c b/kernel/kmod.c index 9809cc1f33d6..c6a4f8aebeba 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
| @@ -505,7 +505,7 @@ int call_usermodehelper_pipe(char *path, char **argv, char **envp, | |||
| 505 | if (ret < 0) | 505 | if (ret < 0) |
| 506 | goto out; | 506 | goto out; |
| 507 | 507 | ||
| 508 | return call_usermodehelper_exec(sub_info, 1); | 508 | return call_usermodehelper_exec(sub_info, UMH_WAIT_EXEC); |
| 509 | 509 | ||
| 510 | out: | 510 | out: |
| 511 | call_usermodehelper_freeinfo(sub_info); | 511 | call_usermodehelper_freeinfo(sub_info); |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index cd91237dbfe3..de6a2d6b3ebb 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
| @@ -226,7 +226,7 @@ static void sync_cmos_clock(unsigned long dummy) | |||
| 226 | 226 | ||
| 227 | static void notify_cmos_timer(void) | 227 | static void notify_cmos_timer(void) |
| 228 | { | 228 | { |
| 229 | if (no_sync_cmos_clock) | 229 | if (!no_sync_cmos_clock) |
| 230 | mod_timer(&sync_cmos_timer, jiffies + 1); | 230 | mod_timer(&sync_cmos_timer, jiffies + 1); |
| 231 | } | 231 | } |
| 232 | 232 | ||
| @@ -986,7 +986,9 @@ out: | |||
| 986 | 986 | ||
| 987 | __setup("slub_debug", setup_slub_debug); | 987 | __setup("slub_debug", setup_slub_debug); |
| 988 | 988 | ||
| 989 | static void kmem_cache_open_debug_check(struct kmem_cache *s) | 989 | static unsigned long kmem_cache_flags(unsigned long objsize, |
| 990 | unsigned long flags, const char *name, | ||
| 991 | void (*ctor)(void *, struct kmem_cache *, unsigned long)) | ||
| 990 | { | 992 | { |
| 991 | /* | 993 | /* |
| 992 | * The page->offset field is only 16 bit wide. This is an offset | 994 | * The page->offset field is only 16 bit wide. This is an offset |
| @@ -1000,19 +1002,21 @@ static void kmem_cache_open_debug_check(struct kmem_cache *s) | |||
| 1000 | * Debugging or ctor may create a need to move the free | 1002 | * Debugging or ctor may create a need to move the free |
| 1001 | * pointer. Fail if this happens. | 1003 | * pointer. Fail if this happens. |
| 1002 | */ | 1004 | */ |
| 1003 | if (s->objsize >= 65535 * sizeof(void *)) { | 1005 | if (objsize >= 65535 * sizeof(void *)) { |
| 1004 | BUG_ON(s->flags & (SLAB_RED_ZONE | SLAB_POISON | | 1006 | BUG_ON(flags & (SLAB_RED_ZONE | SLAB_POISON | |
| 1005 | SLAB_STORE_USER | SLAB_DESTROY_BY_RCU)); | 1007 | SLAB_STORE_USER | SLAB_DESTROY_BY_RCU)); |
| 1006 | BUG_ON(s->ctor); | 1008 | BUG_ON(ctor); |
| 1007 | } | 1009 | } else { |
| 1008 | else | ||
| 1009 | /* | 1010 | /* |
| 1010 | * Enable debugging if selected on the kernel commandline. | 1011 | * Enable debugging if selected on the kernel commandline. |
| 1011 | */ | 1012 | */ |
| 1012 | if (slub_debug && (!slub_debug_slabs || | 1013 | if (slub_debug && (!slub_debug_slabs || |
| 1013 | strncmp(slub_debug_slabs, s->name, | 1014 | strncmp(slub_debug_slabs, name, |
| 1014 | strlen(slub_debug_slabs)) == 0)) | 1015 | strlen(slub_debug_slabs)) == 0)) |
| 1015 | s->flags |= slub_debug; | 1016 | flags |= slub_debug; |
| 1017 | } | ||
| 1018 | |||
| 1019 | return flags; | ||
| 1016 | } | 1020 | } |
| 1017 | #else | 1021 | #else |
| 1018 | static inline void setup_object_debug(struct kmem_cache *s, | 1022 | static inline void setup_object_debug(struct kmem_cache *s, |
| @@ -1029,7 +1033,12 @@ static inline int slab_pad_check(struct kmem_cache *s, struct page *page) | |||
| 1029 | static inline int check_object(struct kmem_cache *s, struct page *page, | 1033 | static inline int check_object(struct kmem_cache *s, struct page *page, |
| 1030 | void *object, int active) { return 1; } | 1034 | void *object, int active) { return 1; } |
| 1031 | static inline void add_full(struct kmem_cache_node *n, struct page *page) {} | 1035 | static inline void add_full(struct kmem_cache_node *n, struct page *page) {} |
| 1032 | static inline void kmem_cache_open_debug_check(struct kmem_cache *s) {} | 1036 | static inline unsigned long kmem_cache_flags(unsigned long objsize, |
| 1037 | unsigned long flags, const char *name, | ||
| 1038 | void (*ctor)(void *, struct kmem_cache *, unsigned long)) | ||
| 1039 | { | ||
| 1040 | return flags; | ||
| 1041 | } | ||
| 1033 | #define slub_debug 0 | 1042 | #define slub_debug 0 |
| 1034 | #endif | 1043 | #endif |
| 1035 | /* | 1044 | /* |
| @@ -2088,9 +2097,8 @@ static int kmem_cache_open(struct kmem_cache *s, gfp_t gfpflags, | |||
| 2088 | s->name = name; | 2097 | s->name = name; |
| 2089 | s->ctor = ctor; | 2098 | s->ctor = ctor; |
| 2090 | s->objsize = size; | 2099 | s->objsize = size; |
| 2091 | s->flags = flags; | ||
| 2092 | s->align = align; | 2100 | s->align = align; |
| 2093 | kmem_cache_open_debug_check(s); | 2101 | s->flags = kmem_cache_flags(size, flags, name, ctor); |
| 2094 | 2102 | ||
| 2095 | if (!calculate_sizes(s)) | 2103 | if (!calculate_sizes(s)) |
| 2096 | goto error; | 2104 | goto error; |
| @@ -2660,7 +2668,7 @@ static int slab_unmergeable(struct kmem_cache *s) | |||
| 2660 | } | 2668 | } |
| 2661 | 2669 | ||
| 2662 | static struct kmem_cache *find_mergeable(size_t size, | 2670 | static struct kmem_cache *find_mergeable(size_t size, |
| 2663 | size_t align, unsigned long flags, | 2671 | size_t align, unsigned long flags, const char *name, |
| 2664 | void (*ctor)(void *, struct kmem_cache *, unsigned long)) | 2672 | void (*ctor)(void *, struct kmem_cache *, unsigned long)) |
| 2665 | { | 2673 | { |
| 2666 | struct kmem_cache *s; | 2674 | struct kmem_cache *s; |
| @@ -2674,6 +2682,7 @@ static struct kmem_cache *find_mergeable(size_t size, | |||
| 2674 | size = ALIGN(size, sizeof(void *)); | 2682 | size = ALIGN(size, sizeof(void *)); |
| 2675 | align = calculate_alignment(flags, align, size); | 2683 | align = calculate_alignment(flags, align, size); |
| 2676 | size = ALIGN(size, align); | 2684 | size = ALIGN(size, align); |
| 2685 | flags = kmem_cache_flags(size, flags, name, NULL); | ||
| 2677 | 2686 | ||
| 2678 | list_for_each_entry(s, &slab_caches, list) { | 2687 | list_for_each_entry(s, &slab_caches, list) { |
| 2679 | if (slab_unmergeable(s)) | 2688 | if (slab_unmergeable(s)) |
| @@ -2682,8 +2691,7 @@ static struct kmem_cache *find_mergeable(size_t size, | |||
| 2682 | if (size > s->size) | 2691 | if (size > s->size) |
| 2683 | continue; | 2692 | continue; |
| 2684 | 2693 | ||
| 2685 | if (((flags | slub_debug) & SLUB_MERGE_SAME) != | 2694 | if ((flags & SLUB_MERGE_SAME) != (s->flags & SLUB_MERGE_SAME)) |
| 2686 | (s->flags & SLUB_MERGE_SAME)) | ||
| 2687 | continue; | 2695 | continue; |
| 2688 | /* | 2696 | /* |
| 2689 | * Check if alignment is compatible. | 2697 | * Check if alignment is compatible. |
| @@ -2707,7 +2715,7 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, | |||
| 2707 | struct kmem_cache *s; | 2715 | struct kmem_cache *s; |
| 2708 | 2716 | ||
| 2709 | down_write(&slub_lock); | 2717 | down_write(&slub_lock); |
| 2710 | s = find_mergeable(size, align, flags, ctor); | 2718 | s = find_mergeable(size, align, flags, name, ctor); |
| 2711 | if (s) { | 2719 | if (s) { |
| 2712 | s->refcount++; | 2720 | s->refcount++; |
| 2713 | /* | 2721 | /* |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 63caa414945d..18e3afc964df 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
| @@ -183,6 +183,7 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt) | |||
| 183 | { | 183 | { |
| 184 | struct sk_buff *skb; | 184 | struct sk_buff *skb; |
| 185 | __le16 param; | 185 | __le16 param; |
| 186 | __u8 flt_type; | ||
| 186 | 187 | ||
| 187 | BT_DBG("%s %ld", hdev->name, opt); | 188 | BT_DBG("%s %ld", hdev->name, opt); |
| 188 | 189 | ||
| @@ -233,11 +234,8 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt) | |||
| 233 | /* Optional initialization */ | 234 | /* Optional initialization */ |
| 234 | 235 | ||
| 235 | /* Clear Event Filters */ | 236 | /* Clear Event Filters */ |
| 236 | { | 237 | flt_type = HCI_FLT_CLEAR_ALL; |
| 237 | struct hci_cp_set_event_flt cp; | 238 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_SET_EVENT_FLT, 1, &flt_type); |
| 238 | cp.flt_type = HCI_FLT_CLEAR_ALL; | ||
| 239 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_SET_EVENT_FLT, sizeof(cp), &cp); | ||
| 240 | } | ||
| 241 | 239 | ||
| 242 | /* Page timeout ~20 secs */ | 240 | /* Page timeout ~20 secs */ |
| 243 | param = cpu_to_le16(0x8000); | 241 | param = cpu_to_le16(0x8000); |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 1dae3dfc66a9..5ccea5fbd236 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <linux/skbuff.h> | 37 | #include <linux/skbuff.h> |
| 38 | #include <linux/workqueue.h> | 38 | #include <linux/workqueue.h> |
| 39 | #include <linux/interrupt.h> | 39 | #include <linux/interrupt.h> |
| 40 | #include <linux/compat.h> | ||
| 40 | #include <linux/socket.h> | 41 | #include <linux/socket.h> |
| 41 | #include <linux/ioctl.h> | 42 | #include <linux/ioctl.h> |
| 42 | #include <net/sock.h> | 43 | #include <net/sock.h> |
| @@ -70,15 +71,15 @@ static struct hci_sec_filter hci_sec_filter = { | |||
| 70 | { | 71 | { |
| 71 | { 0x0 }, | 72 | { 0x0 }, |
| 72 | /* OGF_LINK_CTL */ | 73 | /* OGF_LINK_CTL */ |
| 73 | { 0xbe000006, 0x00000001, 0x000000, 0x00 }, | 74 | { 0xbe000006, 0x00000001, 0x00000000, 0x00 }, |
| 74 | /* OGF_LINK_POLICY */ | 75 | /* OGF_LINK_POLICY */ |
| 75 | { 0x00005200, 0x00000000, 0x000000, 0x00 }, | 76 | { 0x00005200, 0x00000000, 0x00000000, 0x00 }, |
| 76 | /* OGF_HOST_CTL */ | 77 | /* OGF_HOST_CTL */ |
| 77 | { 0xaab00200, 0x2b402aaa, 0x020154, 0x00 }, | 78 | { 0xaab00200, 0x2b402aaa, 0x05220154, 0x00 }, |
| 78 | /* OGF_INFO_PARAM */ | 79 | /* OGF_INFO_PARAM */ |
| 79 | { 0x000002be, 0x00000000, 0x000000, 0x00 }, | 80 | { 0x000002be, 0x00000000, 0x00000000, 0x00 }, |
| 80 | /* OGF_STATUS_PARAM */ | 81 | /* OGF_STATUS_PARAM */ |
| 81 | { 0x000000ea, 0x00000000, 0x000000, 0x00 } | 82 | { 0x000000ea, 0x00000000, 0x00000000, 0x00 } |
| 82 | } | 83 | } |
| 83 | }; | 84 | }; |
| 84 | 85 | ||
| @@ -342,9 +343,24 @@ static inline void hci_sock_cmsg(struct sock *sk, struct msghdr *msg, struct sk_ | |||
| 342 | 343 | ||
| 343 | if (mask & HCI_CMSG_TSTAMP) { | 344 | if (mask & HCI_CMSG_TSTAMP) { |
| 344 | struct timeval tv; | 345 | struct timeval tv; |
| 346 | void *data; | ||
| 347 | int len; | ||
| 345 | 348 | ||
| 346 | skb_get_timestamp(skb, &tv); | 349 | skb_get_timestamp(skb, &tv); |
| 347 | put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, sizeof(tv), &tv); | 350 | |
| 351 | data = &tv; | ||
| 352 | len = sizeof(tv); | ||
| 353 | #ifdef CONFIG_COMPAT | ||
| 354 | if (msg->msg_flags & MSG_CMSG_COMPAT) { | ||
| 355 | struct compat_timeval ctv; | ||
| 356 | ctv.tv_sec = tv.tv_sec; | ||
| 357 | ctv.tv_usec = tv.tv_usec; | ||
| 358 | data = &ctv; | ||
| 359 | len = sizeof(ctv); | ||
| 360 | } | ||
| 361 | #endif | ||
| 362 | |||
| 363 | put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, len, data); | ||
| 348 | } | 364 | } |
| 349 | } | 365 | } |
| 350 | 366 | ||
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index 4169a2a89a39..6018d0e51938 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c | |||
| @@ -1513,6 +1513,7 @@ static struct nf_sockopt_ops ebt_sockopts = | |||
| 1513 | .get_optmin = EBT_BASE_CTL, | 1513 | .get_optmin = EBT_BASE_CTL, |
| 1514 | .get_optmax = EBT_SO_GET_MAX + 1, | 1514 | .get_optmax = EBT_SO_GET_MAX + 1, |
| 1515 | .get = do_ebt_get_ctl, | 1515 | .get = do_ebt_get_ctl, |
| 1516 | .owner = THIS_MODULE, | ||
| 1516 | }; | 1517 | }; |
| 1517 | 1518 | ||
| 1518 | static int __init ebtables_init(void) | 1519 | static int __init ebtables_init(void) |
diff --git a/net/core/datagram.c b/net/core/datagram.c index cb056f476126..029b93e246b4 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
| @@ -450,6 +450,9 @@ int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, | |||
| 450 | __wsum csum; | 450 | __wsum csum; |
| 451 | int chunk = skb->len - hlen; | 451 | int chunk = skb->len - hlen; |
| 452 | 452 | ||
| 453 | if (!chunk) | ||
| 454 | return 0; | ||
| 455 | |||
| 453 | /* Skip filled elements. | 456 | /* Skip filled elements. |
| 454 | * Pretty silly, look at memcpy_toiovec, though 8) | 457 | * Pretty silly, look at memcpy_toiovec, though 8) |
| 455 | */ | 458 | */ |
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index fa6604fcf0e7..8def68209edd 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
| @@ -814,7 +814,7 @@ static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 814 | for (ifa = dn_db->ifa_list, dn_idx = 0; ifa; | 814 | for (ifa = dn_db->ifa_list, dn_idx = 0; ifa; |
| 815 | ifa = ifa->ifa_next, dn_idx++) { | 815 | ifa = ifa->ifa_next, dn_idx++) { |
| 816 | if (dn_idx < skip_naddr) | 816 | if (dn_idx < skip_naddr) |
| 817 | goto cont; | 817 | continue; |
| 818 | 818 | ||
| 819 | if (dn_nl_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid, | 819 | if (dn_nl_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid, |
| 820 | cb->nlh->nlmsg_seq, RTM_NEWADDR, | 820 | cb->nlh->nlmsg_seq, RTM_NEWADDR, |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 5b77bdaa57dd..5dbe5803b7d5 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -1193,7 +1193,7 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 1193 | for (ifa = in_dev->ifa_list, ip_idx = 0; ifa; | 1193 | for (ifa = in_dev->ifa_list, ip_idx = 0; ifa; |
| 1194 | ifa = ifa->ifa_next, ip_idx++) { | 1194 | ifa = ifa->ifa_next, ip_idx++) { |
| 1195 | if (ip_idx < s_ip_idx) | 1195 | if (ip_idx < s_ip_idx) |
| 1196 | goto cont; | 1196 | continue; |
| 1197 | if (inet_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid, | 1197 | if (inet_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid, |
| 1198 | cb->nlh->nlmsg_seq, | 1198 | cb->nlh->nlmsg_seq, |
| 1199 | RTM_NEWADDR, NLM_F_MULTI) <= 0) | 1199 | RTM_NEWADDR, NLM_F_MULTI) <= 0) |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index dbeacd8b0f90..def007ec1d6f 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
| @@ -836,12 +836,16 @@ static int inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 836 | return inet_diag_get_exact(skb, nlh); | 836 | return inet_diag_get_exact(skb, nlh); |
| 837 | } | 837 | } |
| 838 | 838 | ||
| 839 | static DEFINE_MUTEX(inet_diag_mutex); | ||
| 840 | |||
| 839 | static void inet_diag_rcv(struct sock *sk, int len) | 841 | static void inet_diag_rcv(struct sock *sk, int len) |
| 840 | { | 842 | { |
| 841 | unsigned int qlen = 0; | 843 | unsigned int qlen = 0; |
| 842 | 844 | ||
| 843 | do { | 845 | do { |
| 846 | mutex_lock(&inet_diag_mutex); | ||
| 844 | netlink_run_queue(sk, &qlen, &inet_diag_rcv_msg); | 847 | netlink_run_queue(sk, &qlen, &inet_diag_rcv_msg); |
| 848 | mutex_unlock(&inet_diag_mutex); | ||
| 845 | } while (qlen); | 849 | } while (qlen); |
| 846 | } | 850 | } |
| 847 | 851 | ||
diff --git a/net/ipv4/ipvs/ip_vs_ctl.c b/net/ipv4/ipvs/ip_vs_ctl.c index 902fd578aa3c..f656d41d8d41 100644 --- a/net/ipv4/ipvs/ip_vs_ctl.c +++ b/net/ipv4/ipvs/ip_vs_ctl.c | |||
| @@ -2339,6 +2339,7 @@ static struct nf_sockopt_ops ip_vs_sockopts = { | |||
| 2339 | .get_optmin = IP_VS_BASE_CTL, | 2339 | .get_optmin = IP_VS_BASE_CTL, |
| 2340 | .get_optmax = IP_VS_SO_GET_MAX+1, | 2340 | .get_optmax = IP_VS_SO_GET_MAX+1, |
| 2341 | .get = do_ip_vs_get_ctl, | 2341 | .get = do_ip_vs_get_ctl, |
| 2342 | .owner = THIS_MODULE, | ||
| 2342 | }; | 2343 | }; |
| 2343 | 2344 | ||
| 2344 | 2345 | ||
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index d1149aba9351..29114a9ccd1d 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
| @@ -1161,6 +1161,7 @@ static struct nf_sockopt_ops arpt_sockopts = { | |||
| 1161 | .get_optmin = ARPT_BASE_CTL, | 1161 | .get_optmin = ARPT_BASE_CTL, |
| 1162 | .get_optmax = ARPT_SO_GET_MAX+1, | 1162 | .get_optmax = ARPT_SO_GET_MAX+1, |
| 1163 | .get = do_arpt_get_ctl, | 1163 | .get = do_arpt_get_ctl, |
| 1164 | .owner = THIS_MODULE, | ||
| 1164 | }; | 1165 | }; |
| 1165 | 1166 | ||
| 1166 | static int __init arp_tables_init(void) | 1167 | static int __init arp_tables_init(void) |
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index e1b402c6b855..6486894f450c 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
| @@ -2296,6 +2296,7 @@ static struct nf_sockopt_ops ipt_sockopts = { | |||
| 2296 | #ifdef CONFIG_COMPAT | 2296 | #ifdef CONFIG_COMPAT |
| 2297 | .compat_get = compat_do_ipt_get_ctl, | 2297 | .compat_get = compat_do_ipt_get_ctl, |
| 2298 | #endif | 2298 | #endif |
| 2299 | .owner = THIS_MODULE, | ||
| 2299 | }; | 2300 | }; |
| 2300 | 2301 | ||
| 2301 | static struct xt_match icmp_matchstruct __read_mostly = { | 2302 | static struct xt_match icmp_matchstruct __read_mostly = { |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index d9b5177989c6..f813e02aab30 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | |||
| @@ -87,14 +87,10 @@ static int ipv4_get_l4proto(const struct sk_buff *skb, unsigned int nhoff, | |||
| 87 | if (iph == NULL) | 87 | if (iph == NULL) |
| 88 | return -NF_DROP; | 88 | return -NF_DROP; |
| 89 | 89 | ||
| 90 | /* Never happen */ | 90 | /* Conntrack defragments packets, we might still see fragments |
| 91 | if (iph->frag_off & htons(IP_OFFSET)) { | 91 | * inside ICMP packets though. */ |
| 92 | if (net_ratelimit()) { | 92 | if (iph->frag_off & htons(IP_OFFSET)) |
| 93 | printk(KERN_ERR "ipv4_get_l4proto: Frag of proto %u\n", | ||
| 94 | iph->protocol); | ||
| 95 | } | ||
| 96 | return -NF_DROP; | 93 | return -NF_DROP; |
| 97 | } | ||
| 98 | 94 | ||
| 99 | *dataoff = nhoff + (iph->ihl << 2); | 95 | *dataoff = nhoff + (iph->ihl << 2); |
| 100 | *protonum = iph->protocol; | 96 | *protonum = iph->protocol; |
| @@ -403,6 +399,7 @@ static struct nf_sockopt_ops so_getorigdst = { | |||
| 403 | .get_optmin = SO_ORIGINAL_DST, | 399 | .get_optmin = SO_ORIGINAL_DST, |
| 404 | .get_optmax = SO_ORIGINAL_DST+1, | 400 | .get_optmax = SO_ORIGINAL_DST+1, |
| 405 | .get = &getorigdst, | 401 | .get = &getorigdst, |
| 402 | .owner = THIS_MODULE, | ||
| 406 | }; | 403 | }; |
| 407 | 404 | ||
| 408 | struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv4 __read_mostly = { | 405 | struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv4 __read_mostly = { |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 5dead399fe64..26de3c0ea31e 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -1427,8 +1427,9 @@ void ip6_flush_pending_frames(struct sock *sk) | |||
| 1427 | struct sk_buff *skb; | 1427 | struct sk_buff *skb; |
| 1428 | 1428 | ||
| 1429 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { | 1429 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { |
| 1430 | IP6_INC_STATS(ip6_dst_idev(skb->dst), | 1430 | if (skb->dst) |
| 1431 | IPSTATS_MIB_OUTDISCARDS); | 1431 | IP6_INC_STATS(ip6_dst_idev(skb->dst), |
| 1432 | IPSTATS_MIB_OUTDISCARDS); | ||
| 1432 | kfree_skb(skb); | 1433 | kfree_skb(skb); |
| 1433 | } | 1434 | } |
| 1434 | 1435 | ||
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 0358e6066a4e..73a894a2152c 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -736,7 +736,7 @@ static void ndisc_recv_ns(struct sk_buff *skb) | |||
| 736 | * so fail our DAD process | 736 | * so fail our DAD process |
| 737 | */ | 737 | */ |
| 738 | addrconf_dad_failure(ifp); | 738 | addrconf_dad_failure(ifp); |
| 739 | goto out; | 739 | return; |
| 740 | } else { | 740 | } else { |
| 741 | /* | 741 | /* |
| 742 | * This is not a dad solicitation. | 742 | * This is not a dad solicitation. |
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index aeda617246b7..cd9df02bb85c 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
| @@ -1462,6 +1462,7 @@ static struct nf_sockopt_ops ip6t_sockopts = { | |||
| 1462 | .get_optmin = IP6T_BASE_CTL, | 1462 | .get_optmin = IP6T_BASE_CTL, |
| 1463 | .get_optmax = IP6T_SO_GET_MAX+1, | 1463 | .get_optmax = IP6T_SO_GET_MAX+1, |
| 1464 | .get = do_ip6t_get_ctl, | 1464 | .get = do_ip6t_get_ctl, |
| 1465 | .owner = THIS_MODULE, | ||
| 1465 | }; | 1466 | }; |
| 1466 | 1467 | ||
| 1467 | static struct xt_match icmp6_matchstruct __read_mostly = { | 1468 | static struct xt_match icmp6_matchstruct __read_mostly = { |
diff --git a/net/netfilter/nf_sockopt.c b/net/netfilter/nf_sockopt.c index 8b8ece750313..e32761ce260c 100644 --- a/net/netfilter/nf_sockopt.c +++ b/net/netfilter/nf_sockopt.c | |||
| @@ -55,18 +55,7 @@ EXPORT_SYMBOL(nf_register_sockopt); | |||
| 55 | 55 | ||
| 56 | void nf_unregister_sockopt(struct nf_sockopt_ops *reg) | 56 | void nf_unregister_sockopt(struct nf_sockopt_ops *reg) |
| 57 | { | 57 | { |
| 58 | /* No point being interruptible: we're probably in cleanup_module() */ | ||
| 59 | restart: | ||
| 60 | mutex_lock(&nf_sockopt_mutex); | 58 | mutex_lock(&nf_sockopt_mutex); |
| 61 | if (reg->use != 0) { | ||
| 62 | /* To be woken by nf_sockopt call... */ | ||
| 63 | /* FIXME: Stuart Young's name appears gratuitously. */ | ||
| 64 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
| 65 | reg->cleanup_task = current; | ||
| 66 | mutex_unlock(&nf_sockopt_mutex); | ||
| 67 | schedule(); | ||
| 68 | goto restart; | ||
| 69 | } | ||
| 70 | list_del(®->list); | 59 | list_del(®->list); |
| 71 | mutex_unlock(&nf_sockopt_mutex); | 60 | mutex_unlock(&nf_sockopt_mutex); |
| 72 | } | 61 | } |
| @@ -86,10 +75,11 @@ static int nf_sockopt(struct sock *sk, int pf, int val, | |||
| 86 | list_for_each(i, &nf_sockopts) { | 75 | list_for_each(i, &nf_sockopts) { |
| 87 | ops = (struct nf_sockopt_ops *)i; | 76 | ops = (struct nf_sockopt_ops *)i; |
| 88 | if (ops->pf == pf) { | 77 | if (ops->pf == pf) { |
| 78 | if (!try_module_get(ops->owner)) | ||
| 79 | goto out_nosup; | ||
| 89 | if (get) { | 80 | if (get) { |
| 90 | if (val >= ops->get_optmin | 81 | if (val >= ops->get_optmin |
| 91 | && val < ops->get_optmax) { | 82 | && val < ops->get_optmax) { |
| 92 | ops->use++; | ||
| 93 | mutex_unlock(&nf_sockopt_mutex); | 83 | mutex_unlock(&nf_sockopt_mutex); |
| 94 | ret = ops->get(sk, val, opt, len); | 84 | ret = ops->get(sk, val, opt, len); |
| 95 | goto out; | 85 | goto out; |
| @@ -97,23 +87,20 @@ static int nf_sockopt(struct sock *sk, int pf, int val, | |||
| 97 | } else { | 87 | } else { |
| 98 | if (val >= ops->set_optmin | 88 | if (val >= ops->set_optmin |
| 99 | && val < ops->set_optmax) { | 89 | && val < ops->set_optmax) { |
| 100 | ops->use++; | ||
| 101 | mutex_unlock(&nf_sockopt_mutex); | 90 | mutex_unlock(&nf_sockopt_mutex); |
| 102 | ret = ops->set(sk, val, opt, *len); | 91 | ret = ops->set(sk, val, opt, *len); |
| 103 | goto out; | 92 | goto out; |
| 104 | } | 93 | } |
| 105 | } | 94 | } |
| 95 | module_put(ops->owner); | ||
| 106 | } | 96 | } |
| 107 | } | 97 | } |
| 98 | out_nosup: | ||
| 108 | mutex_unlock(&nf_sockopt_mutex); | 99 | mutex_unlock(&nf_sockopt_mutex); |
| 109 | return -ENOPROTOOPT; | 100 | return -ENOPROTOOPT; |
| 110 | 101 | ||
| 111 | out: | 102 | out: |
| 112 | mutex_lock(&nf_sockopt_mutex); | 103 | module_put(ops->owner); |
| 113 | ops->use--; | ||
| 114 | if (ops->cleanup_task) | ||
| 115 | wake_up_process(ops->cleanup_task); | ||
| 116 | mutex_unlock(&nf_sockopt_mutex); | ||
| 117 | return ret; | 104 | return ret; |
| 118 | } | 105 | } |
| 119 | 106 | ||
| @@ -144,10 +131,12 @@ static int compat_nf_sockopt(struct sock *sk, int pf, int val, | |||
| 144 | list_for_each(i, &nf_sockopts) { | 131 | list_for_each(i, &nf_sockopts) { |
| 145 | ops = (struct nf_sockopt_ops *)i; | 132 | ops = (struct nf_sockopt_ops *)i; |
| 146 | if (ops->pf == pf) { | 133 | if (ops->pf == pf) { |
| 134 | if (!try_module_get(ops->owner)) | ||
| 135 | goto out_nosup; | ||
| 136 | |||
| 147 | if (get) { | 137 | if (get) { |
| 148 | if (val >= ops->get_optmin | 138 | if (val >= ops->get_optmin |
| 149 | && val < ops->get_optmax) { | 139 | && val < ops->get_optmax) { |
| 150 | ops->use++; | ||
| 151 | mutex_unlock(&nf_sockopt_mutex); | 140 | mutex_unlock(&nf_sockopt_mutex); |
| 152 | if (ops->compat_get) | 141 | if (ops->compat_get) |
| 153 | ret = ops->compat_get(sk, | 142 | ret = ops->compat_get(sk, |
| @@ -160,7 +149,6 @@ static int compat_nf_sockopt(struct sock *sk, int pf, int val, | |||
| 160 | } else { | 149 | } else { |
| 161 | if (val >= ops->set_optmin | 150 | if (val >= ops->set_optmin |
| 162 | && val < ops->set_optmax) { | 151 | && val < ops->set_optmax) { |
| 163 | ops->use++; | ||
| 164 | mutex_unlock(&nf_sockopt_mutex); | 152 | mutex_unlock(&nf_sockopt_mutex); |
| 165 | if (ops->compat_set) | 153 | if (ops->compat_set) |
| 166 | ret = ops->compat_set(sk, | 154 | ret = ops->compat_set(sk, |
| @@ -171,17 +159,15 @@ static int compat_nf_sockopt(struct sock *sk, int pf, int val, | |||
| 171 | goto out; | 159 | goto out; |
| 172 | } | 160 | } |
| 173 | } | 161 | } |
| 162 | module_put(ops->owner); | ||
| 174 | } | 163 | } |
| 175 | } | 164 | } |
| 165 | out_nosup: | ||
| 176 | mutex_unlock(&nf_sockopt_mutex); | 166 | mutex_unlock(&nf_sockopt_mutex); |
| 177 | return -ENOPROTOOPT; | 167 | return -ENOPROTOOPT; |
| 178 | 168 | ||
| 179 | out: | 169 | out: |
| 180 | mutex_lock(&nf_sockopt_mutex); | 170 | module_put(ops->owner); |
| 181 | ops->use--; | ||
| 182 | if (ops->cleanup_task) | ||
| 183 | wake_up_process(ops->cleanup_task); | ||
| 184 | mutex_unlock(&nf_sockopt_mutex); | ||
| 185 | return ret; | 171 | return ret; |
| 186 | } | 172 | } |
| 187 | 173 | ||
