diff options
142 files changed, 1149 insertions, 721 deletions
diff --git a/Documentation/ABI/testing/sysfs-firmware-sgi_uv b/Documentation/ABI/testing/sysfs-firmware-sgi_uv new file mode 100644 index 000000000000..4573fd4b7876 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-firmware-sgi_uv | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | What: /sys/firmware/sgi_uv/ | ||
| 2 | Date: August 2008 | ||
| 3 | Contact: Russ Anderson <rja@sgi.com> | ||
| 4 | Description: | ||
| 5 | The /sys/firmware/sgi_uv directory contains information | ||
| 6 | about the SGI UV platform. | ||
| 7 | |||
| 8 | Under that directory are a number of files: | ||
| 9 | |||
| 10 | partition_id | ||
| 11 | coherence_id | ||
| 12 | |||
| 13 | The partition_id entry contains the partition id. | ||
| 14 | SGI UV systems can be partitioned into multiple physical | ||
| 15 | machines, which each partition running a unique copy | ||
| 16 | of the operating system. Each partition will have a unique | ||
| 17 | partition id. To display the partition id, use the command: | ||
| 18 | |||
| 19 | cat /sys/firmware/sgi_uv/partition_id | ||
| 20 | |||
| 21 | The coherence_id entry contains the coherence id. | ||
| 22 | A partitioned SGI UV system can have one or more coherence | ||
| 23 | domain. The coherence id indicates which coherence domain | ||
| 24 | this partition is in. To display the coherence id, use the | ||
| 25 | command: | ||
| 26 | |||
| 27 | cat /sys/firmware/sgi_uv/coherence_id | ||
diff --git a/Documentation/dontdiff b/Documentation/dontdiff index 881e6dd03aea..27809357da58 100644 --- a/Documentation/dontdiff +++ b/Documentation/dontdiff | |||
| @@ -5,6 +5,8 @@ | |||
| 5 | *.css | 5 | *.css |
| 6 | *.dvi | 6 | *.dvi |
| 7 | *.eps | 7 | *.eps |
| 8 | *.fw.gen.S | ||
| 9 | *.fw | ||
| 8 | *.gif | 10 | *.gif |
| 9 | *.grep | 11 | *.grep |
| 10 | *.grp | 12 | *.grp |
diff --git a/Documentation/filesystems/ntfs.txt b/Documentation/filesystems/ntfs.txt index e79ee2db183a..ac2a261c5f7d 100644 --- a/Documentation/filesystems/ntfs.txt +++ b/Documentation/filesystems/ntfs.txt | |||
| @@ -40,7 +40,7 @@ Web site | |||
| 40 | ======== | 40 | ======== |
| 41 | 41 | ||
| 42 | There is plenty of additional information on the linux-ntfs web site | 42 | There is plenty of additional information on the linux-ntfs web site |
| 43 | at http://linux-ntfs.sourceforge.net/ | 43 | at http://www.linux-ntfs.org/ |
| 44 | 44 | ||
| 45 | The web site has a lot of additional information, such as a comprehensive | 45 | The web site has a lot of additional information, such as a comprehensive |
| 46 | FAQ, documentation on the NTFS on-disk format, information on the Linux-NTFS | 46 | FAQ, documentation on the NTFS on-disk format, information on the Linux-NTFS |
| @@ -272,7 +272,7 @@ And you would know that /dev/hda2 has a size of 37768814 - 4209030 + 1 = | |||
| 272 | For Win2k and later dynamic disks, you can for example use the ldminfo utility | 272 | For Win2k and later dynamic disks, you can for example use the ldminfo utility |
| 273 | which is part of the Linux LDM tools (the latest version at the time of | 273 | which is part of the Linux LDM tools (the latest version at the time of |
| 274 | writing is linux-ldm-0.0.8.tar.bz2). You can download it from: | 274 | writing is linux-ldm-0.0.8.tar.bz2). You can download it from: |
| 275 | http://linux-ntfs.sourceforge.net/downloads.html | 275 | http://www.linux-ntfs.org/ |
| 276 | Simply extract the downloaded archive (tar xvjf linux-ldm-0.0.8.tar.bz2), go | 276 | Simply extract the downloaded archive (tar xvjf linux-ldm-0.0.8.tar.bz2), go |
| 277 | into it (cd linux-ldm-0.0.8) and change to the test directory (cd test). You | 277 | into it (cd linux-ldm-0.0.8) and change to the test directory (cd test). You |
| 278 | will find the precompiled (i386) ldminfo utility there. NOTE: You will not be | 278 | will find the precompiled (i386) ldminfo utility there. NOTE: You will not be |
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index 64557821ee59..394eb2cc1c39 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
| @@ -1339,6 +1339,25 @@ Enables/Disables the protection of the per-process proc entries "maps" and | |||
| 1339 | "smaps". When enabled, the contents of these files are visible only to | 1339 | "smaps". When enabled, the contents of these files are visible only to |
| 1340 | readers that are allowed to ptrace() the given process. | 1340 | readers that are allowed to ptrace() the given process. |
| 1341 | 1341 | ||
| 1342 | msgmni | ||
| 1343 | ------ | ||
| 1344 | |||
| 1345 | Maximum number of message queue ids on the system. | ||
| 1346 | This value scales to the amount of lowmem. It is automatically recomputed | ||
| 1347 | upon memory add/remove or ipc namespace creation/removal. | ||
| 1348 | When a value is written into this file, msgmni's value becomes fixed, i.e. it | ||
| 1349 | is not recomputed anymore when one of the above events occurs. | ||
| 1350 | Use auto_msgmni to change this behavior. | ||
| 1351 | |||
| 1352 | auto_msgmni | ||
| 1353 | ----------- | ||
| 1354 | |||
| 1355 | Enables/Disables automatic recomputing of msgmni upon memory add/remove or | ||
| 1356 | upon ipc namespace creation/removal (see the msgmni description above). | ||
| 1357 | Echoing "1" into this file enables msgmni automatic recomputing. | ||
| 1358 | Echoing "0" turns it off. | ||
| 1359 | auto_msgmni default value is 1. | ||
| 1360 | |||
| 1342 | 1361 | ||
| 1343 | 2.4 /proc/sys/vm - The virtual memory subsystem | 1362 | 2.4 /proc/sys/vm - The virtual memory subsystem |
| 1344 | ----------------------------------------------- | 1363 | ----------------------------------------------- |
diff --git a/MAINTAINERS b/MAINTAINERS index c4ca99cf80df..ced3c202f8e6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -419,6 +419,12 @@ L: linux-laptop@vger.kernel.org | |||
| 419 | W: http://www.canb.auug.org.au/~sfr/ | 419 | W: http://www.canb.auug.org.au/~sfr/ |
| 420 | S: Supported | 420 | S: Supported |
| 421 | 421 | ||
| 422 | APPLE BCM5974 MULTITOUCH DRIVER | ||
| 423 | P: Henrik Rydberg | ||
| 424 | M: rydberg@euromail.se | ||
| 425 | L: linux-input@vger.kernel.org | ||
| 426 | S: Maintained | ||
| 427 | |||
| 422 | APPLE SMC DRIVER | 428 | APPLE SMC DRIVER |
| 423 | P: Nicolas Boichat | 429 | P: Nicolas Boichat |
| 424 | M: nicolas@boichat.ch | 430 | M: nicolas@boichat.ch |
| @@ -3051,7 +3057,7 @@ P: Anton Altaparmakov | |||
| 3051 | M: aia21@cantab.net | 3057 | M: aia21@cantab.net |
| 3052 | L: linux-ntfs-dev@lists.sourceforge.net | 3058 | L: linux-ntfs-dev@lists.sourceforge.net |
| 3053 | L: linux-kernel@vger.kernel.org | 3059 | L: linux-kernel@vger.kernel.org |
| 3054 | W: http://linux-ntfs.sf.net/ | 3060 | W: http://www.linux-ntfs.org/ |
| 3055 | T: git kernel.org:/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git | 3061 | T: git kernel.org:/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git |
| 3056 | S: Maintained | 3062 | S: Maintained |
| 3057 | 3063 | ||
diff --git a/arch/m68k/atari/atakeyb.c b/arch/m68k/atari/atakeyb.c index 8a2a53b33616..bb959fbab2dc 100644 --- a/arch/m68k/atari/atakeyb.c +++ b/arch/m68k/atari/atakeyb.c | |||
| @@ -580,13 +580,15 @@ int atari_keyb_init(void) | |||
| 580 | do { | 580 | do { |
| 581 | /* reset IKBD ACIA */ | 581 | /* reset IKBD ACIA */ |
| 582 | acia.key_ctrl = ACIA_RESET | | 582 | acia.key_ctrl = ACIA_RESET | |
| 583 | (atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : 0; | 583 | ((atari_switches & ATARI_SWITCH_IKBD) ? |
| 584 | ACIA_RHTID : 0); | ||
| 584 | (void)acia.key_ctrl; | 585 | (void)acia.key_ctrl; |
| 585 | (void)acia.key_data; | 586 | (void)acia.key_data; |
| 586 | 587 | ||
| 587 | /* reset MIDI ACIA */ | 588 | /* reset MIDI ACIA */ |
| 588 | acia.mid_ctrl = ACIA_RESET | | 589 | acia.mid_ctrl = ACIA_RESET | |
| 589 | (atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0; | 590 | ((atari_switches & ATARI_SWITCH_MIDI) ? |
| 591 | ACIA_RHTID : 0); | ||
| 590 | (void)acia.mid_ctrl; | 592 | (void)acia.mid_ctrl; |
| 591 | (void)acia.mid_data; | 593 | (void)acia.mid_data; |
| 592 | 594 | ||
| @@ -599,7 +601,8 @@ int atari_keyb_init(void) | |||
| 599 | ACIA_RHTID : ACIA_RLTID); | 601 | ACIA_RHTID : ACIA_RLTID); |
| 600 | 602 | ||
| 601 | acia.mid_ctrl = ACIA_DIV16 | ACIA_D8N1S | | 603 | acia.mid_ctrl = ACIA_DIV16 | ACIA_D8N1S | |
| 602 | (atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0; | 604 | ((atari_switches & ATARI_SWITCH_MIDI) ? |
| 605 | ACIA_RHTID : 0); | ||
| 603 | 606 | ||
| 604 | /* make sure the interrupt line is up */ | 607 | /* make sure the interrupt line is up */ |
| 605 | } while ((mfp.par_dt_reg & 0x10) == 0); | 608 | } while ((mfp.par_dt_reg & 0x10) == 0); |
diff --git a/arch/parisc/hpux/fs.c b/arch/parisc/hpux/fs.c index 69ff671498e5..12c04c5e558b 100644 --- a/arch/parisc/hpux/fs.c +++ b/arch/parisc/hpux/fs.c | |||
| @@ -104,7 +104,7 @@ static int filldir(void * __buf, const char * name, int namlen, loff_t offset, | |||
| 104 | buf->count -= reclen; | 104 | buf->count -= reclen; |
| 105 | return 0; | 105 | return 0; |
| 106 | Efault: | 106 | Efault: |
| 107 | buffer->error = -EFAULT; | 107 | buf->error = -EFAULT; |
| 108 | return -EFAULT; | 108 | return -EFAULT; |
| 109 | } | 109 | } |
| 110 | 110 | ||
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 9155c9312c1e..c6be19e9ceae 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
| @@ -116,6 +116,11 @@ ifeq ($(CONFIG_6xx),y) | |||
| 116 | KBUILD_CFLAGS += -mcpu=powerpc | 116 | KBUILD_CFLAGS += -mcpu=powerpc |
| 117 | endif | 117 | endif |
| 118 | 118 | ||
| 119 | # Work around a gcc code-gen bug with -fno-omit-frame-pointer. | ||
| 120 | ifeq ($(CONFIG_FTRACE),y) | ||
| 121 | KBUILD_CFLAGS += -mno-sched-epilog | ||
| 122 | endif | ||
| 123 | |||
| 119 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 | 124 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 |
| 120 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec | 125 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec |
| 121 | cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec | 126 | cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec |
diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h index db0b8f3b8807..4597c491e9b5 100644 --- a/arch/powerpc/include/asm/pgtable-ppc64.h +++ b/arch/powerpc/include/asm/pgtable-ppc64.h | |||
| @@ -153,12 +153,10 @@ | |||
| 153 | #define __S110 PAGE_SHARED_X | 153 | #define __S110 PAGE_SHARED_X |
| 154 | #define __S111 PAGE_SHARED_X | 154 | #define __S111 PAGE_SHARED_X |
| 155 | 155 | ||
| 156 | #ifdef CONFIG_HUGETLB_PAGE | 156 | #ifdef CONFIG_PPC_MM_SLICES |
| 157 | |||
| 158 | #define HAVE_ARCH_UNMAPPED_AREA | 157 | #define HAVE_ARCH_UNMAPPED_AREA |
| 159 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN | 158 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN |
| 160 | 159 | #endif /* CONFIG_PPC_MM_SLICES */ | |
| 161 | #endif | ||
| 162 | 160 | ||
| 163 | #ifndef __ASSEMBLY__ | 161 | #ifndef __ASSEMBLY__ |
| 164 | 162 | ||
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 64f5948ebc9d..946daea780f1 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
| @@ -14,12 +14,13 @@ endif | |||
| 14 | 14 | ||
| 15 | ifdef CONFIG_FTRACE | 15 | ifdef CONFIG_FTRACE |
| 16 | # Do not trace early boot code | 16 | # Do not trace early boot code |
| 17 | CFLAGS_REMOVE_cputable.o = -pg | 17 | CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog |
| 18 | CFLAGS_REMOVE_prom_init.o = -pg | 18 | CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog |
| 19 | CFLAGS_REMOVE_btext.o = -pg -mno-sched-epilog | ||
| 19 | 20 | ||
| 20 | ifdef CONFIG_DYNAMIC_FTRACE | 21 | ifdef CONFIG_DYNAMIC_FTRACE |
| 21 | # dynamic ftrace setup. | 22 | # dynamic ftrace setup. |
| 22 | CFLAGS_REMOVE_ftrace.o = -pg | 23 | CFLAGS_REMOVE_ftrace.o = -pg -mno-sched-epilog |
| 23 | endif | 24 | endif |
| 24 | 25 | ||
| 25 | endif | 26 | endif |
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c index 367129789cc0..5af4e9b2dbe2 100644 --- a/arch/powerpc/kernel/align.c +++ b/arch/powerpc/kernel/align.c | |||
| @@ -647,7 +647,7 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg, | |||
| 647 | unsigned int flags, unsigned int length) | 647 | unsigned int flags, unsigned int length) |
| 648 | { | 648 | { |
| 649 | char *ptr = (char *) ¤t->thread.TS_FPR(reg); | 649 | char *ptr = (char *) ¤t->thread.TS_FPR(reg); |
| 650 | int ret; | 650 | int ret = 0; |
| 651 | 651 | ||
| 652 | flush_vsx_to_thread(current); | 652 | flush_vsx_to_thread(current); |
| 653 | 653 | ||
diff --git a/arch/powerpc/kernel/idle_6xx.S b/arch/powerpc/kernel/idle_6xx.S index 019b02d8844f..15c611de1ee2 100644 --- a/arch/powerpc/kernel/idle_6xx.S +++ b/arch/powerpc/kernel/idle_6xx.S | |||
| @@ -158,7 +158,7 @@ _GLOBAL(power_save_ppc32_restore) | |||
| 158 | stw r9,_NIP(r11) /* make it do a blr */ | 158 | stw r9,_NIP(r11) /* make it do a blr */ |
| 159 | 159 | ||
| 160 | #ifdef CONFIG_SMP | 160 | #ifdef CONFIG_SMP |
| 161 | mfspr r12,SPRN_SPRG3 | 161 | rlwinm r12,r11,0,0,31-THREAD_SHIFT |
| 162 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ | 162 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ |
| 163 | slwi r11,r11,2 | 163 | slwi r11,r11,2 |
| 164 | #else | 164 | #else |
diff --git a/arch/powerpc/kernel/idle_e500.S b/arch/powerpc/kernel/idle_e500.S index 06304034b393..47a1a983ff88 100644 --- a/arch/powerpc/kernel/idle_e500.S +++ b/arch/powerpc/kernel/idle_e500.S | |||
| @@ -84,10 +84,11 @@ _GLOBAL(power_save_ppc32_restore) | |||
| 84 | stw r9,_NIP(r11) /* make it do a blr */ | 84 | stw r9,_NIP(r11) /* make it do a blr */ |
| 85 | 85 | ||
| 86 | #ifdef CONFIG_SMP | 86 | #ifdef CONFIG_SMP |
| 87 | mfspr r12,SPRN_SPRG3 | 87 | rlwinm r12,r1,0,0,31-THREAD_SHIFT |
| 88 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ | 88 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ |
| 89 | slwi r11,r11,2 | 89 | slwi r11,r11,2 |
| 90 | #else | 90 | #else |
| 91 | li r11,0 | 91 | li r11,0 |
| 92 | #endif | 92 | #endif |
| 93 | |||
| 93 | b transfer_to_handler_cont | 94 | b transfer_to_handler_cont |
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index 4a8ce62fe112..9f6c1ca1739e 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
| @@ -66,11 +66,12 @@ SECTIONS | |||
| 66 | __got2_end = .; | 66 | __got2_end = .; |
| 67 | #endif /* CONFIG_PPC32 */ | 67 | #endif /* CONFIG_PPC32 */ |
| 68 | 68 | ||
| 69 | . = ALIGN(PAGE_SIZE); | ||
| 70 | _etext = .; | ||
| 71 | PROVIDE32 (etext = .); | ||
| 72 | } :kernel | 69 | } :kernel |
| 73 | 70 | ||
| 71 | . = ALIGN(PAGE_SIZE); | ||
| 72 | _etext = .; | ||
| 73 | PROVIDE32 (etext = .); | ||
| 74 | |||
| 74 | /* Read-only data */ | 75 | /* Read-only data */ |
| 75 | RODATA | 76 | RODATA |
| 76 | 77 | ||
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 14be408dfc9b..8920eea34528 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
| @@ -191,12 +191,17 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend, | |||
| 191 | unsigned long hash, hpteg; | 191 | unsigned long hash, hpteg; |
| 192 | unsigned long vsid = get_kernel_vsid(vaddr, ssize); | 192 | unsigned long vsid = get_kernel_vsid(vaddr, ssize); |
| 193 | unsigned long va = hpt_va(vaddr, vsid, ssize); | 193 | unsigned long va = hpt_va(vaddr, vsid, ssize); |
| 194 | unsigned long tprot = prot; | ||
| 195 | |||
| 196 | /* Make kernel text executable */ | ||
| 197 | if (in_kernel_text(vaddr)) | ||
| 198 | tprot &= ~HPTE_R_N; | ||
| 194 | 199 | ||
| 195 | hash = hpt_hash(va, shift, ssize); | 200 | hash = hpt_hash(va, shift, ssize); |
| 196 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); | 201 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); |
| 197 | 202 | ||
| 198 | BUG_ON(!ppc_md.hpte_insert); | 203 | BUG_ON(!ppc_md.hpte_insert); |
| 199 | ret = ppc_md.hpte_insert(hpteg, va, paddr, prot, | 204 | ret = ppc_md.hpte_insert(hpteg, va, paddr, tprot, |
| 200 | HPTE_V_BOLTED, psize, ssize); | 205 | HPTE_V_BOLTED, psize, ssize); |
| 201 | 206 | ||
| 202 | if (ret < 0) | 207 | if (ret < 0) |
| @@ -584,7 +589,7 @@ void __init htab_initialize(void) | |||
| 584 | { | 589 | { |
| 585 | unsigned long table; | 590 | unsigned long table; |
| 586 | unsigned long pteg_count; | 591 | unsigned long pteg_count; |
| 587 | unsigned long prot, tprot; | 592 | unsigned long prot; |
| 588 | unsigned long base = 0, size = 0, limit; | 593 | unsigned long base = 0, size = 0, limit; |
| 589 | int i; | 594 | int i; |
| 590 | 595 | ||
| @@ -660,10 +665,9 @@ void __init htab_initialize(void) | |||
| 660 | for (i=0; i < lmb.memory.cnt; i++) { | 665 | for (i=0; i < lmb.memory.cnt; i++) { |
| 661 | base = (unsigned long)__va(lmb.memory.region[i].base); | 666 | base = (unsigned long)__va(lmb.memory.region[i].base); |
| 662 | size = lmb.memory.region[i].size; | 667 | size = lmb.memory.region[i].size; |
| 663 | tprot = prot | (in_kernel_text(base) ? _PAGE_EXEC : 0); | ||
| 664 | 668 | ||
| 665 | DBG("creating mapping for region: %lx..%lx (prot: %x)\n", | 669 | DBG("creating mapping for region: %lx..%lx (prot: %x)\n", |
| 666 | base, size, tprot); | 670 | base, size, prot); |
| 667 | 671 | ||
| 668 | #ifdef CONFIG_U3_DART | 672 | #ifdef CONFIG_U3_DART |
| 669 | /* Do not map the DART space. Fortunately, it will be aligned | 673 | /* Do not map the DART space. Fortunately, it will be aligned |
| @@ -680,21 +684,21 @@ void __init htab_initialize(void) | |||
| 680 | unsigned long dart_table_end = dart_tablebase + 16 * MB; | 684 | unsigned long dart_table_end = dart_tablebase + 16 * MB; |
| 681 | if (base != dart_tablebase) | 685 | if (base != dart_tablebase) |
| 682 | BUG_ON(htab_bolt_mapping(base, dart_tablebase, | 686 | BUG_ON(htab_bolt_mapping(base, dart_tablebase, |
| 683 | __pa(base), tprot, | 687 | __pa(base), prot, |
| 684 | mmu_linear_psize, | 688 | mmu_linear_psize, |
| 685 | mmu_kernel_ssize)); | 689 | mmu_kernel_ssize)); |
| 686 | if ((base + size) > dart_table_end) | 690 | if ((base + size) > dart_table_end) |
| 687 | BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB, | 691 | BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB, |
| 688 | base + size, | 692 | base + size, |
| 689 | __pa(dart_table_end), | 693 | __pa(dart_table_end), |
| 690 | tprot, | 694 | prot, |
| 691 | mmu_linear_psize, | 695 | mmu_linear_psize, |
| 692 | mmu_kernel_ssize)); | 696 | mmu_kernel_ssize)); |
| 693 | continue; | 697 | continue; |
| 694 | } | 698 | } |
| 695 | #endif /* CONFIG_U3_DART */ | 699 | #endif /* CONFIG_U3_DART */ |
| 696 | BUG_ON(htab_bolt_mapping(base, base + size, __pa(base), | 700 | BUG_ON(htab_bolt_mapping(base, base + size, __pa(base), |
| 697 | tprot, mmu_linear_psize, mmu_kernel_ssize)); | 701 | prot, mmu_linear_psize, mmu_kernel_ssize)); |
| 698 | } | 702 | } |
| 699 | 703 | ||
| 700 | /* | 704 | /* |
diff --git a/arch/powerpc/platforms/powermac/Makefile b/arch/powerpc/platforms/powermac/Makefile index 58ecdd72630f..be60d64be7ad 100644 --- a/arch/powerpc/platforms/powermac/Makefile +++ b/arch/powerpc/platforms/powermac/Makefile | |||
| @@ -2,7 +2,7 @@ CFLAGS_bootx_init.o += -fPIC | |||
| 2 | 2 | ||
| 3 | ifdef CONFIG_FTRACE | 3 | ifdef CONFIG_FTRACE |
| 4 | # Do not trace early boot code | 4 | # Do not trace early boot code |
| 5 | CFLAGS_REMOVE_bootx_init.o = -pg | 5 | CFLAGS_REMOVE_bootx_init.o = -pg -mno-sched-epilog |
| 6 | endif | 6 | endif |
| 7 | 7 | ||
| 8 | obj-y += pic.o setup.o time.o feature.o pci.o \ | 8 | obj-y += pic.o setup.o time.o feature.o pci.o \ |
diff --git a/arch/sparc/include/asm/smp_32.h b/arch/sparc/include/asm/smp_32.h index 7201752cf934..a8180e546a48 100644 --- a/arch/sparc/include/asm/smp_32.h +++ b/arch/sparc/include/asm/smp_32.h | |||
| @@ -50,27 +50,24 @@ struct seq_file; | |||
| 50 | void smp_bogo(struct seq_file *); | 50 | void smp_bogo(struct seq_file *); |
| 51 | void smp_info(struct seq_file *); | 51 | void smp_info(struct seq_file *); |
| 52 | 52 | ||
| 53 | BTFIXUPDEF_CALL(void, smp_cross_call, smpfunc_t, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) | 53 | BTFIXUPDEF_CALL(void, smp_cross_call, smpfunc_t, cpumask_t, unsigned long, unsigned long, unsigned long, unsigned long) |
| 54 | BTFIXUPDEF_CALL(int, __hard_smp_processor_id, void) | 54 | BTFIXUPDEF_CALL(int, __hard_smp_processor_id, void) |
| 55 | BTFIXUPDEF_BLACKBOX(hard_smp_processor_id) | 55 | BTFIXUPDEF_BLACKBOX(hard_smp_processor_id) |
| 56 | BTFIXUPDEF_BLACKBOX(load_current) | 56 | BTFIXUPDEF_BLACKBOX(load_current) |
| 57 | 57 | ||
| 58 | #define smp_cross_call(func,arg1,arg2,arg3,arg4,arg5) BTFIXUP_CALL(smp_cross_call)(func,arg1,arg2,arg3,arg4,arg5) | 58 | #define smp_cross_call(func,mask,arg1,arg2,arg3,arg4) BTFIXUP_CALL(smp_cross_call)(func,mask,arg1,arg2,arg3,arg4) |
| 59 | 59 | ||
| 60 | static inline void xc0(smpfunc_t func) { smp_cross_call(func, 0, 0, 0, 0, 0); } | 60 | static inline void xc0(smpfunc_t func) { smp_cross_call(func, cpu_online_map, 0, 0, 0, 0); } |
| 61 | static inline void xc1(smpfunc_t func, unsigned long arg1) | 61 | static inline void xc1(smpfunc_t func, unsigned long arg1) |
| 62 | { smp_cross_call(func, arg1, 0, 0, 0, 0); } | 62 | { smp_cross_call(func, cpu_online_map, arg1, 0, 0, 0); } |
| 63 | static inline void xc2(smpfunc_t func, unsigned long arg1, unsigned long arg2) | 63 | static inline void xc2(smpfunc_t func, unsigned long arg1, unsigned long arg2) |
| 64 | { smp_cross_call(func, arg1, arg2, 0, 0, 0); } | 64 | { smp_cross_call(func, cpu_online_map, arg1, arg2, 0, 0); } |
| 65 | static inline void xc3(smpfunc_t func, unsigned long arg1, unsigned long arg2, | 65 | static inline void xc3(smpfunc_t func, unsigned long arg1, unsigned long arg2, |
| 66 | unsigned long arg3) | 66 | unsigned long arg3) |
| 67 | { smp_cross_call(func, arg1, arg2, arg3, 0, 0); } | 67 | { smp_cross_call(func, cpu_online_map, arg1, arg2, arg3, 0); } |
| 68 | static inline void xc4(smpfunc_t func, unsigned long arg1, unsigned long arg2, | 68 | static inline void xc4(smpfunc_t func, unsigned long arg1, unsigned long arg2, |
| 69 | unsigned long arg3, unsigned long arg4) | 69 | unsigned long arg3, unsigned long arg4) |
| 70 | { smp_cross_call(func, arg1, arg2, arg3, arg4, 0); } | 70 | { smp_cross_call(func, cpu_online_map, arg1, arg2, arg3, arg4); } |
| 71 | static inline void xc5(smpfunc_t func, unsigned long arg1, unsigned long arg2, | ||
| 72 | unsigned long arg3, unsigned long arg4, unsigned long arg5) | ||
| 73 | { smp_cross_call(func, arg1, arg2, arg3, arg4, arg5); } | ||
| 74 | 71 | ||
| 75 | static inline int smp_call_function(void (*func)(void *info), void *info, int wait) | 72 | static inline int smp_call_function(void (*func)(void *info), void *info, int wait) |
| 76 | { | 73 | { |
| @@ -78,6 +75,14 @@ static inline int smp_call_function(void (*func)(void *info), void *info, int wa | |||
| 78 | return 0; | 75 | return 0; |
| 79 | } | 76 | } |
| 80 | 77 | ||
| 78 | static inline int smp_call_function_single(int cpuid, void (*func) (void *info), | ||
| 79 | void *info, int wait) | ||
| 80 | { | ||
| 81 | smp_cross_call((smpfunc_t)func, cpumask_of_cpu(cpuid), | ||
| 82 | (unsigned long) info, 0, 0, 0); | ||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | |||
| 81 | static inline int cpu_logical_map(int cpu) | 86 | static inline int cpu_logical_map(int cpu) |
| 82 | { | 87 | { |
| 83 | return cpu; | 88 | return cpu; |
diff --git a/arch/sparc/kernel/of_device.c b/arch/sparc/kernel/of_device.c index cc4c235c4f59..c481d45f97b7 100644 --- a/arch/sparc/kernel/of_device.c +++ b/arch/sparc/kernel/of_device.c | |||
| @@ -70,7 +70,7 @@ struct of_bus { | |||
| 70 | int *addrc, int *sizec); | 70 | int *addrc, int *sizec); |
| 71 | int (*map)(u32 *addr, const u32 *range, | 71 | int (*map)(u32 *addr, const u32 *range, |
| 72 | int na, int ns, int pna); | 72 | int na, int ns, int pna); |
| 73 | unsigned int (*get_flags)(const u32 *addr); | 73 | unsigned long (*get_flags)(const u32 *addr, unsigned long); |
| 74 | }; | 74 | }; |
| 75 | 75 | ||
| 76 | /* | 76 | /* |
| @@ -130,8 +130,10 @@ static int of_bus_default_map(u32 *addr, const u32 *range, | |||
| 130 | return 0; | 130 | return 0; |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | static unsigned int of_bus_default_get_flags(const u32 *addr) | 133 | static unsigned long of_bus_default_get_flags(const u32 *addr, unsigned long flags) |
| 134 | { | 134 | { |
| 135 | if (flags) | ||
| 136 | return flags; | ||
| 135 | return IORESOURCE_MEM; | 137 | return IORESOURCE_MEM; |
| 136 | } | 138 | } |
| 137 | 139 | ||
| @@ -194,17 +196,21 @@ static int of_bus_pci_map(u32 *addr, const u32 *range, | |||
| 194 | return 0; | 196 | return 0; |
| 195 | } | 197 | } |
| 196 | 198 | ||
| 197 | static unsigned int of_bus_pci_get_flags(const u32 *addr) | 199 | static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags) |
| 198 | { | 200 | { |
| 199 | unsigned int flags = 0; | ||
| 200 | u32 w = addr[0]; | 201 | u32 w = addr[0]; |
| 201 | 202 | ||
| 203 | /* For PCI, we override whatever child busses may have used. */ | ||
| 204 | flags = 0; | ||
| 202 | switch((w >> 24) & 0x03) { | 205 | switch((w >> 24) & 0x03) { |
| 203 | case 0x01: | 206 | case 0x01: |
| 204 | flags |= IORESOURCE_IO; | 207 | flags |= IORESOURCE_IO; |
| 208 | break; | ||
| 209 | |||
| 205 | case 0x02: /* 32 bits */ | 210 | case 0x02: /* 32 bits */ |
| 206 | case 0x03: /* 64 bits */ | 211 | case 0x03: /* 64 bits */ |
| 207 | flags |= IORESOURCE_MEM; | 212 | flags |= IORESOURCE_MEM; |
| 213 | break; | ||
| 208 | } | 214 | } |
| 209 | if (w & 0x40000000) | 215 | if (w & 0x40000000) |
| 210 | flags |= IORESOURCE_PREFETCH; | 216 | flags |= IORESOURCE_PREFETCH; |
| @@ -362,10 +368,11 @@ static void __init build_device_resources(struct of_device *op, | |||
| 362 | int pna, pns; | 368 | int pna, pns; |
| 363 | 369 | ||
| 364 | size = of_read_addr(reg + na, ns); | 370 | size = of_read_addr(reg + na, ns); |
| 365 | flags = bus->get_flags(reg); | ||
| 366 | 371 | ||
| 367 | memcpy(addr, reg, na * 4); | 372 | memcpy(addr, reg, na * 4); |
| 368 | 373 | ||
| 374 | flags = bus->get_flags(reg, 0); | ||
| 375 | |||
| 369 | /* If the immediate parent has no ranges property to apply, | 376 | /* If the immediate parent has no ranges property to apply, |
| 370 | * just use a 1<->1 mapping. | 377 | * just use a 1<->1 mapping. |
| 371 | */ | 378 | */ |
| @@ -393,6 +400,8 @@ static void __init build_device_resources(struct of_device *op, | |||
| 393 | dna, dns, pna)) | 400 | dna, dns, pna)) |
| 394 | break; | 401 | break; |
| 395 | 402 | ||
| 403 | flags = pbus->get_flags(addr, flags); | ||
| 404 | |||
| 396 | dna = pna; | 405 | dna = pna; |
| 397 | dns = pns; | 406 | dns = pns; |
| 398 | dbus = pbus; | 407 | dbus = pbus; |
diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c index dfde77ff0848..69596402a500 100644 --- a/arch/sparc/kernel/sun4d_smp.c +++ b/arch/sparc/kernel/sun4d_smp.c | |||
| @@ -262,8 +262,9 @@ static struct smp_funcall { | |||
| 262 | static DEFINE_SPINLOCK(cross_call_lock); | 262 | static DEFINE_SPINLOCK(cross_call_lock); |
| 263 | 263 | ||
| 264 | /* Cross calls must be serialized, at least currently. */ | 264 | /* Cross calls must be serialized, at least currently. */ |
| 265 | void smp4d_cross_call(smpfunc_t func, unsigned long arg1, unsigned long arg2, | 265 | static void smp4d_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, |
| 266 | unsigned long arg3, unsigned long arg4, unsigned long arg5) | 266 | unsigned long arg2, unsigned long arg3, |
| 267 | unsigned long arg4) | ||
| 267 | { | 268 | { |
| 268 | if(smp_processors_ready) { | 269 | if(smp_processors_ready) { |
| 269 | register int high = smp_highest_cpu; | 270 | register int high = smp_highest_cpu; |
| @@ -278,7 +279,7 @@ void smp4d_cross_call(smpfunc_t func, unsigned long arg1, unsigned long arg2, | |||
| 278 | register unsigned long a2 asm("i2") = arg2; | 279 | register unsigned long a2 asm("i2") = arg2; |
| 279 | register unsigned long a3 asm("i3") = arg3; | 280 | register unsigned long a3 asm("i3") = arg3; |
| 280 | register unsigned long a4 asm("i4") = arg4; | 281 | register unsigned long a4 asm("i4") = arg4; |
| 281 | register unsigned long a5 asm("i5") = arg5; | 282 | register unsigned long a5 asm("i5") = 0; |
| 282 | 283 | ||
| 283 | __asm__ __volatile__( | 284 | __asm__ __volatile__( |
| 284 | "std %0, [%6]\n\t" | 285 | "std %0, [%6]\n\t" |
| @@ -290,11 +291,10 @@ void smp4d_cross_call(smpfunc_t func, unsigned long arg1, unsigned long arg2, | |||
| 290 | 291 | ||
| 291 | /* Init receive/complete mapping, plus fire the IPI's off. */ | 292 | /* Init receive/complete mapping, plus fire the IPI's off. */ |
| 292 | { | 293 | { |
| 293 | cpumask_t mask; | ||
| 294 | register int i; | 294 | register int i; |
| 295 | 295 | ||
| 296 | mask = cpumask_of_cpu(hard_smp4d_processor_id()); | 296 | cpu_clear(smp_processor_id(), mask); |
| 297 | cpus_andnot(mask, cpu_online_map, mask); | 297 | cpus_and(mask, cpu_online_map, mask); |
| 298 | for(i = 0; i <= high; i++) { | 298 | for(i = 0; i <= high; i++) { |
| 299 | if (cpu_isset(i, mask)) { | 299 | if (cpu_isset(i, mask)) { |
| 300 | ccall_info.processors_in[i] = 0; | 300 | ccall_info.processors_in[i] = 0; |
| @@ -309,12 +309,16 @@ void smp4d_cross_call(smpfunc_t func, unsigned long arg1, unsigned long arg2, | |||
| 309 | 309 | ||
| 310 | i = 0; | 310 | i = 0; |
| 311 | do { | 311 | do { |
| 312 | if (!cpu_isset(i, mask)) | ||
| 313 | continue; | ||
| 312 | while(!ccall_info.processors_in[i]) | 314 | while(!ccall_info.processors_in[i]) |
| 313 | barrier(); | 315 | barrier(); |
| 314 | } while(++i <= high); | 316 | } while(++i <= high); |
| 315 | 317 | ||
| 316 | i = 0; | 318 | i = 0; |
| 317 | do { | 319 | do { |
| 320 | if (!cpu_isset(i, mask)) | ||
| 321 | continue; | ||
| 318 | while(!ccall_info.processors_out[i]) | 322 | while(!ccall_info.processors_out[i]) |
| 319 | barrier(); | 323 | barrier(); |
| 320 | } while(++i <= high); | 324 | } while(++i <= high); |
diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index 406ac1abc83a..a14a76ac7f36 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c | |||
| @@ -244,9 +244,9 @@ static struct smp_funcall { | |||
| 244 | static DEFINE_SPINLOCK(cross_call_lock); | 244 | static DEFINE_SPINLOCK(cross_call_lock); |
| 245 | 245 | ||
| 246 | /* Cross calls must be serialized, at least currently. */ | 246 | /* Cross calls must be serialized, at least currently. */ |
| 247 | static void smp4m_cross_call(smpfunc_t func, unsigned long arg1, | 247 | static void smp4m_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1, |
| 248 | unsigned long arg2, unsigned long arg3, | 248 | unsigned long arg2, unsigned long arg3, |
| 249 | unsigned long arg4, unsigned long arg5) | 249 | unsigned long arg4) |
| 250 | { | 250 | { |
| 251 | register int ncpus = SUN4M_NCPUS; | 251 | register int ncpus = SUN4M_NCPUS; |
| 252 | unsigned long flags; | 252 | unsigned long flags; |
| @@ -259,14 +259,14 @@ static void smp4m_cross_call(smpfunc_t func, unsigned long arg1, | |||
| 259 | ccall_info.arg2 = arg2; | 259 | ccall_info.arg2 = arg2; |
| 260 | ccall_info.arg3 = arg3; | 260 | ccall_info.arg3 = arg3; |
| 261 | ccall_info.arg4 = arg4; | 261 | ccall_info.arg4 = arg4; |
| 262 | ccall_info.arg5 = arg5; | 262 | ccall_info.arg5 = 0; |
| 263 | 263 | ||
| 264 | /* Init receive/complete mapping, plus fire the IPI's off. */ | 264 | /* Init receive/complete mapping, plus fire the IPI's off. */ |
| 265 | { | 265 | { |
| 266 | cpumask_t mask = cpu_online_map; | ||
| 267 | register int i; | 266 | register int i; |
| 268 | 267 | ||
| 269 | cpu_clear(smp_processor_id(), mask); | 268 | cpu_clear(smp_processor_id(), mask); |
| 269 | cpus_and(mask, cpu_online_map, mask); | ||
| 270 | for(i = 0; i < ncpus; i++) { | 270 | for(i = 0; i < ncpus; i++) { |
| 271 | if (cpu_isset(i, mask)) { | 271 | if (cpu_isset(i, mask)) { |
| 272 | ccall_info.processors_in[i] = 0; | 272 | ccall_info.processors_in[i] = 0; |
| @@ -284,12 +284,16 @@ static void smp4m_cross_call(smpfunc_t func, unsigned long arg1, | |||
| 284 | 284 | ||
| 285 | i = 0; | 285 | i = 0; |
| 286 | do { | 286 | do { |
| 287 | if (!cpu_isset(i, mask)) | ||
| 288 | continue; | ||
| 287 | while(!ccall_info.processors_in[i]) | 289 | while(!ccall_info.processors_in[i]) |
| 288 | barrier(); | 290 | barrier(); |
| 289 | } while(++i < ncpus); | 291 | } while(++i < ncpus); |
| 290 | 292 | ||
| 291 | i = 0; | 293 | i = 0; |
| 292 | do { | 294 | do { |
| 295 | if (!cpu_isset(i, mask)) | ||
| 296 | continue; | ||
| 293 | while(!ccall_info.processors_out[i]) | 297 | while(!ccall_info.processors_out[i]) |
| 294 | barrier(); | 298 | barrier(); |
| 295 | } while(++i < ncpus); | 299 | } while(++i < ncpus); |
diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c index f8b50cbf4bf7..f845f150f565 100644 --- a/arch/sparc64/kernel/of_device.c +++ b/arch/sparc64/kernel/of_device.c | |||
| @@ -96,7 +96,7 @@ struct of_bus { | |||
| 96 | int *addrc, int *sizec); | 96 | int *addrc, int *sizec); |
| 97 | int (*map)(u32 *addr, const u32 *range, | 97 | int (*map)(u32 *addr, const u32 *range, |
| 98 | int na, int ns, int pna); | 98 | int na, int ns, int pna); |
| 99 | unsigned int (*get_flags)(const u32 *addr); | 99 | unsigned long (*get_flags)(const u32 *addr, unsigned long); |
| 100 | }; | 100 | }; |
| 101 | 101 | ||
| 102 | /* | 102 | /* |
| @@ -156,8 +156,10 @@ static int of_bus_default_map(u32 *addr, const u32 *range, | |||
| 156 | return 0; | 156 | return 0; |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | static unsigned int of_bus_default_get_flags(const u32 *addr) | 159 | static unsigned long of_bus_default_get_flags(const u32 *addr, unsigned long flags) |
| 160 | { | 160 | { |
| 161 | if (flags) | ||
| 162 | return flags; | ||
| 161 | return IORESOURCE_MEM; | 163 | return IORESOURCE_MEM; |
| 162 | } | 164 | } |
| 163 | 165 | ||
| @@ -249,17 +251,21 @@ static int of_bus_pci_map(u32 *addr, const u32 *range, | |||
| 249 | return 0; | 251 | return 0; |
| 250 | } | 252 | } |
| 251 | 253 | ||
| 252 | static unsigned int of_bus_pci_get_flags(const u32 *addr) | 254 | static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags) |
| 253 | { | 255 | { |
| 254 | unsigned int flags = 0; | ||
| 255 | u32 w = addr[0]; | 256 | u32 w = addr[0]; |
| 256 | 257 | ||
| 258 | /* For PCI, we override whatever child busses may have used. */ | ||
| 259 | flags = 0; | ||
| 257 | switch((w >> 24) & 0x03) { | 260 | switch((w >> 24) & 0x03) { |
| 258 | case 0x01: | 261 | case 0x01: |
| 259 | flags |= IORESOURCE_IO; | 262 | flags |= IORESOURCE_IO; |
| 263 | break; | ||
| 264 | |||
| 260 | case 0x02: /* 32 bits */ | 265 | case 0x02: /* 32 bits */ |
| 261 | case 0x03: /* 64 bits */ | 266 | case 0x03: /* 64 bits */ |
| 262 | flags |= IORESOURCE_MEM; | 267 | flags |= IORESOURCE_MEM; |
| 268 | break; | ||
| 263 | } | 269 | } |
| 264 | if (w & 0x40000000) | 270 | if (w & 0x40000000) |
| 265 | flags |= IORESOURCE_PREFETCH; | 271 | flags |= IORESOURCE_PREFETCH; |
| @@ -478,10 +484,10 @@ static void __init build_device_resources(struct of_device *op, | |||
| 478 | int pna, pns; | 484 | int pna, pns; |
| 479 | 485 | ||
| 480 | size = of_read_addr(reg + na, ns); | 486 | size = of_read_addr(reg + na, ns); |
| 481 | flags = bus->get_flags(reg); | ||
| 482 | |||
| 483 | memcpy(addr, reg, na * 4); | 487 | memcpy(addr, reg, na * 4); |
| 484 | 488 | ||
| 489 | flags = bus->get_flags(addr, 0); | ||
| 490 | |||
| 485 | if (use_1to1_mapping(pp)) { | 491 | if (use_1to1_mapping(pp)) { |
| 486 | result = of_read_addr(addr, na); | 492 | result = of_read_addr(addr, na); |
| 487 | goto build_res; | 493 | goto build_res; |
| @@ -506,6 +512,8 @@ static void __init build_device_resources(struct of_device *op, | |||
| 506 | dna, dns, pna)) | 512 | dna, dns, pna)) |
| 507 | break; | 513 | break; |
| 508 | 514 | ||
| 515 | flags = pbus->get_flags(addr, flags); | ||
| 516 | |||
| 509 | dna = pna; | 517 | dna = pna; |
| 510 | dns = pns; | 518 | dns = pns; |
| 511 | dbus = pbus; | 519 | dbus = pbus; |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index b4aeb0f696dc..a41df7bef035 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
| @@ -1843,7 +1843,7 @@ static int pavail_rescan_ents __initdata; | |||
| 1843 | * memory list again, and make sure it provides at least as much | 1843 | * memory list again, and make sure it provides at least as much |
| 1844 | * memory as 'pavail' does. | 1844 | * memory as 'pavail' does. |
| 1845 | */ | 1845 | */ |
| 1846 | static void setup_valid_addr_bitmap_from_pavail(void) | 1846 | static void __init setup_valid_addr_bitmap_from_pavail(void) |
| 1847 | { | 1847 | { |
| 1848 | int i; | 1848 | int i; |
| 1849 | 1849 | ||
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 8e786b0d665a..346cae5ac423 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
| @@ -122,80 +122,217 @@ static u64 tsc_read_refs(u64 *pm, u64 *hpet) | |||
| 122 | return ULLONG_MAX; | 122 | return ULLONG_MAX; |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | /** | 125 | /* |
| 126 | * native_calibrate_tsc - calibrate the tsc on boot | 126 | * Try to calibrate the TSC against the Programmable |
| 127 | * Interrupt Timer and return the frequency of the TSC | ||
| 128 | * in kHz. | ||
| 129 | * | ||
| 130 | * Return ULONG_MAX on failure to calibrate. | ||
| 127 | */ | 131 | */ |
| 128 | unsigned long native_calibrate_tsc(void) | 132 | static unsigned long pit_calibrate_tsc(void) |
| 129 | { | 133 | { |
| 130 | unsigned long flags; | 134 | u64 tsc, t1, t2, delta; |
| 131 | u64 tsc1, tsc2, tr1, tr2, delta, pm1, pm2, hpet1, hpet2; | 135 | unsigned long tscmin, tscmax; |
| 132 | int hpet = is_hpet_enabled(); | 136 | int pitcnt; |
| 133 | unsigned int tsc_khz_val = 0; | ||
| 134 | |||
| 135 | local_irq_save(flags); | ||
| 136 | |||
| 137 | tsc1 = tsc_read_refs(&pm1, hpet ? &hpet1 : NULL); | ||
| 138 | 137 | ||
| 138 | /* Set the Gate high, disable speaker */ | ||
| 139 | outb((inb(0x61) & ~0x02) | 0x01, 0x61); | 139 | outb((inb(0x61) & ~0x02) | 0x01, 0x61); |
| 140 | 140 | ||
| 141 | /* | ||
| 142 | * Setup CTC channel 2* for mode 0, (interrupt on terminal | ||
| 143 | * count mode), binary count. Set the latch register to 50ms | ||
| 144 | * (LSB then MSB) to begin countdown. | ||
| 145 | */ | ||
| 141 | outb(0xb0, 0x43); | 146 | outb(0xb0, 0x43); |
| 142 | outb((CLOCK_TICK_RATE / (1000 / 50)) & 0xff, 0x42); | 147 | outb((CLOCK_TICK_RATE / (1000 / 50)) & 0xff, 0x42); |
| 143 | outb((CLOCK_TICK_RATE / (1000 / 50)) >> 8, 0x42); | 148 | outb((CLOCK_TICK_RATE / (1000 / 50)) >> 8, 0x42); |
| 144 | tr1 = get_cycles(); | ||
| 145 | while ((inb(0x61) & 0x20) == 0); | ||
| 146 | tr2 = get_cycles(); | ||
| 147 | 149 | ||
| 148 | tsc2 = tsc_read_refs(&pm2, hpet ? &hpet2 : NULL); | 150 | tsc = t1 = t2 = get_cycles(); |
| 149 | 151 | ||
| 150 | local_irq_restore(flags); | 152 | pitcnt = 0; |
| 153 | tscmax = 0; | ||
| 154 | tscmin = ULONG_MAX; | ||
| 155 | while ((inb(0x61) & 0x20) == 0) { | ||
| 156 | t2 = get_cycles(); | ||
| 157 | delta = t2 - tsc; | ||
| 158 | tsc = t2; | ||
| 159 | if ((unsigned long) delta < tscmin) | ||
| 160 | tscmin = (unsigned int) delta; | ||
| 161 | if ((unsigned long) delta > tscmax) | ||
| 162 | tscmax = (unsigned int) delta; | ||
| 163 | pitcnt++; | ||
| 164 | } | ||
| 151 | 165 | ||
| 152 | /* | 166 | /* |
| 153 | * Preset the result with the raw and inaccurate PIT | 167 | * Sanity checks: |
| 154 | * calibration value | 168 | * |
| 169 | * If we were not able to read the PIT more than 5000 | ||
| 170 | * times, then we have been hit by a massive SMI | ||
| 171 | * | ||
| 172 | * If the maximum is 10 times larger than the minimum, | ||
| 173 | * then we got hit by an SMI as well. | ||
| 155 | */ | 174 | */ |
| 156 | delta = (tr2 - tr1); | 175 | if (pitcnt < 5000 || tscmax > 10 * tscmin) |
| 176 | return ULONG_MAX; | ||
| 177 | |||
| 178 | /* Calculate the PIT value */ | ||
| 179 | delta = t2 - t1; | ||
| 157 | do_div(delta, 50); | 180 | do_div(delta, 50); |
| 158 | tsc_khz_val = delta; | 181 | return delta; |
| 182 | } | ||
| 183 | |||
| 184 | |||
| 185 | /** | ||
| 186 | * native_calibrate_tsc - calibrate the tsc on boot | ||
| 187 | */ | ||
| 188 | unsigned long native_calibrate_tsc(void) | ||
| 189 | { | ||
| 190 | u64 tsc1, tsc2, delta, pm1, pm2, hpet1, hpet2; | ||
| 191 | unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX; | ||
| 192 | unsigned long flags; | ||
| 193 | int hpet = is_hpet_enabled(), i; | ||
| 159 | 194 | ||
| 160 | /* hpet or pmtimer available ? */ | 195 | /* |
| 196 | * Run 5 calibration loops to get the lowest frequency value | ||
| 197 | * (the best estimate). We use two different calibration modes | ||
| 198 | * here: | ||
| 199 | * | ||
| 200 | * 1) PIT loop. We set the PIT Channel 2 to oneshot mode and | ||
| 201 | * load a timeout of 50ms. We read the time right after we | ||
| 202 | * started the timer and wait until the PIT count down reaches | ||
| 203 | * zero. In each wait loop iteration we read the TSC and check | ||
| 204 | * the delta to the previous read. We keep track of the min | ||
| 205 | * and max values of that delta. The delta is mostly defined | ||
| 206 | * by the IO time of the PIT access, so we can detect when a | ||
| 207 | * SMI/SMM disturbance happend between the two reads. If the | ||
| 208 | * maximum time is significantly larger than the minimum time, | ||
| 209 | * then we discard the result and have another try. | ||
| 210 | * | ||
| 211 | * 2) Reference counter. If available we use the HPET or the | ||
| 212 | * PMTIMER as a reference to check the sanity of that value. | ||
| 213 | * We use separate TSC readouts and check inside of the | ||
| 214 | * reference read for a SMI/SMM disturbance. We dicard | ||
| 215 | * disturbed values here as well. We do that around the PIT | ||
| 216 | * calibration delay loop as we have to wait for a certain | ||
| 217 | * amount of time anyway. | ||
| 218 | */ | ||
| 219 | for (i = 0; i < 5; i++) { | ||
| 220 | unsigned long tsc_pit_khz; | ||
| 221 | |||
| 222 | /* | ||
| 223 | * Read the start value and the reference count of | ||
| 224 | * hpet/pmtimer when available. Then do the PIT | ||
| 225 | * calibration, which will take at least 50ms, and | ||
| 226 | * read the end value. | ||
| 227 | */ | ||
| 228 | local_irq_save(flags); | ||
| 229 | tsc1 = tsc_read_refs(&pm1, hpet ? &hpet1 : NULL); | ||
| 230 | tsc_pit_khz = pit_calibrate_tsc(); | ||
| 231 | tsc2 = tsc_read_refs(&pm2, hpet ? &hpet2 : NULL); | ||
| 232 | local_irq_restore(flags); | ||
| 233 | |||
| 234 | /* Pick the lowest PIT TSC calibration so far */ | ||
| 235 | tsc_pit_min = min(tsc_pit_min, tsc_pit_khz); | ||
| 236 | |||
| 237 | /* hpet or pmtimer available ? */ | ||
| 238 | if (!hpet && !pm1 && !pm2) | ||
| 239 | continue; | ||
| 240 | |||
| 241 | /* Check, whether the sampling was disturbed by an SMI */ | ||
| 242 | if (tsc1 == ULLONG_MAX || tsc2 == ULLONG_MAX) | ||
| 243 | continue; | ||
| 244 | |||
| 245 | tsc2 = (tsc2 - tsc1) * 1000000LL; | ||
| 246 | |||
| 247 | if (hpet) { | ||
| 248 | if (hpet2 < hpet1) | ||
| 249 | hpet2 += 0x100000000ULL; | ||
| 250 | hpet2 -= hpet1; | ||
| 251 | tsc1 = ((u64)hpet2 * hpet_readl(HPET_PERIOD)); | ||
| 252 | do_div(tsc1, 1000000); | ||
| 253 | } else { | ||
| 254 | if (pm2 < pm1) | ||
| 255 | pm2 += (u64)ACPI_PM_OVRRUN; | ||
| 256 | pm2 -= pm1; | ||
| 257 | tsc1 = pm2 * 1000000000LL; | ||
| 258 | do_div(tsc1, PMTMR_TICKS_PER_SEC); | ||
| 259 | } | ||
| 260 | |||
| 261 | do_div(tsc2, tsc1); | ||
| 262 | tsc_ref_min = min(tsc_ref_min, (unsigned long) tsc2); | ||
| 263 | } | ||
| 264 | |||
| 265 | /* | ||
| 266 | * Now check the results. | ||
| 267 | */ | ||
| 268 | if (tsc_pit_min == ULONG_MAX) { | ||
| 269 | /* PIT gave no useful value */ | ||
| 270 | printk(KERN_WARNING "TSC: PIT calibration failed due to " | ||
| 271 | "SMI disturbance.\n"); | ||
| 272 | |||
| 273 | /* We don't have an alternative source, disable TSC */ | ||
| 274 | if (!hpet && !pm1 && !pm2) { | ||
| 275 | printk("TSC: No reference (HPET/PMTIMER) available\n"); | ||
| 276 | return 0; | ||
| 277 | } | ||
| 278 | |||
| 279 | /* The alternative source failed as well, disable TSC */ | ||
| 280 | if (tsc_ref_min == ULONG_MAX) { | ||
| 281 | printk(KERN_WARNING "TSC: HPET/PMTIMER calibration " | ||
| 282 | "failed due to SMI disturbance.\n"); | ||
| 283 | return 0; | ||
| 284 | } | ||
| 285 | |||
| 286 | /* Use the alternative source */ | ||
| 287 | printk(KERN_INFO "TSC: using %s reference calibration\n", | ||
| 288 | hpet ? "HPET" : "PMTIMER"); | ||
| 289 | |||
| 290 | return tsc_ref_min; | ||
| 291 | } | ||
| 292 | |||
| 293 | /* We don't have an alternative source, use the PIT calibration value */ | ||
| 161 | if (!hpet && !pm1 && !pm2) { | 294 | if (!hpet && !pm1 && !pm2) { |
| 162 | printk(KERN_INFO "TSC calibrated against PIT\n"); | 295 | printk(KERN_INFO "TSC: Using PIT calibration value\n"); |
| 163 | goto out; | 296 | return tsc_pit_min; |
| 164 | } | 297 | } |
| 165 | 298 | ||
| 166 | /* Check, whether the sampling was disturbed by an SMI */ | 299 | /* The alternative source failed, use the PIT calibration value */ |
| 167 | if (tsc1 == ULLONG_MAX || tsc2 == ULLONG_MAX) { | 300 | if (tsc_ref_min == ULONG_MAX) { |
| 168 | printk(KERN_WARNING "TSC calibration disturbed by SMI, " | 301 | printk(KERN_WARNING "TSC: HPET/PMTIMER calibration failed due " |
| 169 | "using PIT calibration result\n"); | 302 | "to SMI disturbance. Using PIT calibration\n"); |
| 170 | goto out; | 303 | return tsc_pit_min; |
| 171 | } | 304 | } |
| 172 | 305 | ||
| 173 | tsc2 = (tsc2 - tsc1) * 1000000LL; | 306 | /* Check the reference deviation */ |
| 174 | 307 | delta = ((u64) tsc_pit_min) * 100; | |
| 175 | if (hpet) { | 308 | do_div(delta, tsc_ref_min); |
| 176 | printk(KERN_INFO "TSC calibrated against HPET\n"); | 309 | |
| 177 | if (hpet2 < hpet1) | 310 | /* |
| 178 | hpet2 += 0x100000000ULL; | 311 | * If both calibration results are inside a 5% window, the we |
| 179 | hpet2 -= hpet1; | 312 | * use the lower frequency of those as it is probably the |
| 180 | tsc1 = ((u64)hpet2 * hpet_readl(HPET_PERIOD)); | 313 | * closest estimate. |
| 181 | do_div(tsc1, 1000000); | 314 | */ |
| 182 | } else { | 315 | if (delta >= 95 && delta <= 105) { |
| 183 | printk(KERN_INFO "TSC calibrated against PM_TIMER\n"); | 316 | printk(KERN_INFO "TSC: PIT calibration confirmed by %s.\n", |
| 184 | if (pm2 < pm1) | 317 | hpet ? "HPET" : "PMTIMER"); |
| 185 | pm2 += (u64)ACPI_PM_OVRRUN; | 318 | printk(KERN_INFO "TSC: using %s calibration value\n", |
| 186 | pm2 -= pm1; | 319 | tsc_pit_min <= tsc_ref_min ? "PIT" : |
| 187 | tsc1 = pm2 * 1000000000LL; | 320 | hpet ? "HPET" : "PMTIMER"); |
| 188 | do_div(tsc1, PMTMR_TICKS_PER_SEC); | 321 | return tsc_pit_min <= tsc_ref_min ? tsc_pit_min : tsc_ref_min; |
| 189 | } | 322 | } |
| 190 | 323 | ||
| 191 | do_div(tsc2, tsc1); | 324 | printk(KERN_WARNING "TSC: PIT calibration deviates from %s: %lu %lu.\n", |
| 192 | tsc_khz_val = tsc2; | 325 | hpet ? "HPET" : "PMTIMER", tsc_pit_min, tsc_ref_min); |
| 193 | 326 | ||
| 194 | out: | 327 | /* |
| 195 | return tsc_khz_val; | 328 | * The calibration values differ too much. In doubt, we use |
| 329 | * the PIT value as we know that there are PMTIMERs around | ||
| 330 | * running at double speed. | ||
| 331 | */ | ||
| 332 | printk(KERN_INFO "TSC: Using PIT calibration value\n"); | ||
| 333 | return tsc_pit_min; | ||
| 196 | } | 334 | } |
| 197 | 335 | ||
| 198 | |||
| 199 | #ifdef CONFIG_X86_32 | 336 | #ifdef CONFIG_X86_32 |
| 200 | /* Only called from the Powernow K7 cpu freq driver */ | 337 | /* Only called from the Powernow K7 cpu freq driver */ |
| 201 | int recalibrate_cpu_khz(void) | 338 | int recalibrate_cpu_khz(void) |
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 5807d1bc73f7..8791fc55e715 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
| @@ -128,8 +128,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
| 128 | pr = pci_find_parent_resource(dev, r); | 128 | pr = pci_find_parent_resource(dev, r); |
| 129 | if (!r->start || !pr || | 129 | if (!r->start || !pr || |
| 130 | request_resource(pr, r) < 0) { | 130 | request_resource(pr, r) < 0) { |
| 131 | dev_err(&dev->dev, "BAR %d: can't " | 131 | dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx); |
| 132 | "allocate resource\n", idx); | ||
| 133 | /* | 132 | /* |
| 134 | * Something is wrong with the region. | 133 | * Something is wrong with the region. |
| 135 | * Invalidate the resource to prevent | 134 | * Invalidate the resource to prevent |
| @@ -164,15 +163,13 @@ static void __init pcibios_allocate_resources(int pass) | |||
| 164 | else | 163 | else |
| 165 | disabled = !(command & PCI_COMMAND_MEMORY); | 164 | disabled = !(command & PCI_COMMAND_MEMORY); |
| 166 | if (pass == disabled) { | 165 | if (pass == disabled) { |
| 167 | dev_dbg(&dev->dev, "resource %#08llx-%#08llx " | 166 | dev_dbg(&dev->dev, "resource %#08llx-%#08llx (f=%lx, d=%d, p=%d)\n", |
| 168 | "(f=%lx, d=%d, p=%d)\n", | ||
| 169 | (unsigned long long) r->start, | 167 | (unsigned long long) r->start, |
| 170 | (unsigned long long) r->end, | 168 | (unsigned long long) r->end, |
| 171 | r->flags, disabled, pass); | 169 | r->flags, disabled, pass); |
| 172 | pr = pci_find_parent_resource(dev, r); | 170 | pr = pci_find_parent_resource(dev, r); |
| 173 | if (!pr || request_resource(pr, r) < 0) { | 171 | if (!pr || request_resource(pr, r) < 0) { |
| 174 | dev_err(&dev->dev, "BAR %d: can't " | 172 | dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx); |
| 175 | "allocate resource\n", idx); | ||
| 176 | /* We'll assign a new address later */ | 173 | /* We'll assign a new address later */ |
| 177 | r->end -= r->start; | 174 | r->end -= r->start; |
| 178 | r->start = 0; | 175 | r->start = 0; |
diff --git a/block/cmd-filter.c b/block/cmd-filter.c index 1d4026206ac2..228b6447e89f 100644 --- a/block/cmd-filter.c +++ b/block/cmd-filter.c | |||
| @@ -223,6 +223,7 @@ int blk_register_filter(struct gendisk *disk) | |||
| 223 | 223 | ||
| 224 | return 0; | 224 | return 0; |
| 225 | } | 225 | } |
| 226 | EXPORT_SYMBOL(blk_register_filter); | ||
| 226 | 227 | ||
| 227 | void blk_unregister_filter(struct gendisk *disk) | 228 | void blk_unregister_filter(struct gendisk *disk) |
| 228 | { | 229 | { |
| @@ -231,4 +232,4 @@ void blk_unregister_filter(struct gendisk *disk) | |||
| 231 | kobject_put(&filter->kobj); | 232 | kobject_put(&filter->kobj); |
| 232 | kobject_put(disk->holder_dir->parent); | 233 | kobject_put(disk->holder_dir->parent); |
| 233 | } | 234 | } |
| 234 | 235 | EXPORT_SYMBOL(blk_unregister_filter); | |
diff --git a/block/genhd.c b/block/genhd.c index 656c2c7abf99..e0ce23ac2ece 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
| @@ -190,7 +190,6 @@ void add_disk(struct gendisk *disk) | |||
| 190 | disk->minors, NULL, exact_match, exact_lock, disk); | 190 | disk->minors, NULL, exact_match, exact_lock, disk); |
| 191 | register_disk(disk); | 191 | register_disk(disk); |
| 192 | blk_register_queue(disk); | 192 | blk_register_queue(disk); |
| 193 | blk_register_filter(disk); | ||
| 194 | 193 | ||
| 195 | bdi = &disk->queue->backing_dev_info; | 194 | bdi = &disk->queue->backing_dev_info; |
| 196 | bdi_register_dev(bdi, MKDEV(disk->major, disk->first_minor)); | 195 | bdi_register_dev(bdi, MKDEV(disk->major, disk->first_minor)); |
| @@ -203,7 +202,6 @@ EXPORT_SYMBOL(del_gendisk); /* in partitions/check.c */ | |||
| 203 | 202 | ||
| 204 | void unlink_gendisk(struct gendisk *disk) | 203 | void unlink_gendisk(struct gendisk *disk) |
| 205 | { | 204 | { |
| 206 | blk_unregister_filter(disk); | ||
| 207 | sysfs_remove_link(&disk->dev.kobj, "bdi"); | 205 | sysfs_remove_link(&disk->dev.kobj, "bdi"); |
| 208 | bdi_unregister(&disk->queue->backing_dev_info); | 206 | bdi_unregister(&disk->queue->backing_dev_info); |
| 209 | blk_unregister_queue(disk); | 207 | blk_unregister_queue(disk); |
| @@ -309,7 +307,7 @@ static void *part_start(struct seq_file *part, loff_t *pos) | |||
| 309 | loff_t k = *pos; | 307 | loff_t k = *pos; |
| 310 | 308 | ||
| 311 | if (!k) | 309 | if (!k) |
| 312 | seq_puts(part, "major minor #blocks name\n\n"); | 310 | part->private = (void *)1LU; /* tell show to print header */ |
| 313 | 311 | ||
| 314 | mutex_lock(&block_class_lock); | 312 | mutex_lock(&block_class_lock); |
| 315 | dev = class_find_device(&block_class, NULL, &k, find_start); | 313 | dev = class_find_device(&block_class, NULL, &k, find_start); |
| @@ -351,6 +349,17 @@ static int show_partition(struct seq_file *part, void *v) | |||
| 351 | int n; | 349 | int n; |
| 352 | char buf[BDEVNAME_SIZE]; | 350 | char buf[BDEVNAME_SIZE]; |
| 353 | 351 | ||
| 352 | /* | ||
| 353 | * Print header if start told us to do. This is to preserve | ||
| 354 | * the original behavior of not printing header if no | ||
| 355 | * partition exists. This hackery will be removed later with | ||
| 356 | * class iteration clean up. | ||
| 357 | */ | ||
| 358 | if (part->private) { | ||
| 359 | seq_puts(part, "major minor #blocks name\n\n"); | ||
| 360 | part->private = NULL; | ||
| 361 | } | ||
| 362 | |||
| 354 | /* Don't show non-partitionable removeable devices or empty devices */ | 363 | /* Don't show non-partitionable removeable devices or empty devices */ |
| 355 | if (!get_capacity(sgp) || | 364 | if (!get_capacity(sgp) || |
| 356 | (sgp->minors == 1 && (sgp->flags & GENHD_FL_REMOVABLE))) | 365 | (sgp->minors == 1 && (sgp->flags & GENHD_FL_REMOVABLE))) |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index d3f0a62efcc1..ee68ac54c0d4 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -138,7 +138,7 @@ static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = { | |||
| 138 | { | 138 | { |
| 139 | set_no_mwait, "Extensa 5220", { | 139 | set_no_mwait, "Extensa 5220", { |
| 140 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), | 140 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), |
| 141 | DMI_MATCH(DMI_SYS_VENDOR, "ACER"), | 141 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
| 142 | DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), | 142 | DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), |
| 143 | DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, | 143 | DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, |
| 144 | {}, | 144 | {}, |
diff --git a/drivers/char/random.c b/drivers/char/random.c index 1838aa3d24fe..7ce1ac4baa6d 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
| @@ -407,7 +407,7 @@ struct entropy_store { | |||
| 407 | /* read-write data: */ | 407 | /* read-write data: */ |
| 408 | spinlock_t lock; | 408 | spinlock_t lock; |
| 409 | unsigned add_ptr; | 409 | unsigned add_ptr; |
| 410 | int entropy_count; | 410 | int entropy_count; /* Must at no time exceed ->POOLBITS! */ |
| 411 | int input_rotate; | 411 | int input_rotate; |
| 412 | }; | 412 | }; |
| 413 | 413 | ||
| @@ -520,6 +520,7 @@ static void mix_pool_bytes(struct entropy_store *r, const void *in, int bytes) | |||
| 520 | static void credit_entropy_bits(struct entropy_store *r, int nbits) | 520 | static void credit_entropy_bits(struct entropy_store *r, int nbits) |
| 521 | { | 521 | { |
| 522 | unsigned long flags; | 522 | unsigned long flags; |
| 523 | int entropy_count; | ||
| 523 | 524 | ||
| 524 | if (!nbits) | 525 | if (!nbits) |
| 525 | return; | 526 | return; |
| @@ -527,20 +528,20 @@ static void credit_entropy_bits(struct entropy_store *r, int nbits) | |||
| 527 | spin_lock_irqsave(&r->lock, flags); | 528 | spin_lock_irqsave(&r->lock, flags); |
| 528 | 529 | ||
| 529 | DEBUG_ENT("added %d entropy credits to %s\n", nbits, r->name); | 530 | DEBUG_ENT("added %d entropy credits to %s\n", nbits, r->name); |
| 530 | r->entropy_count += nbits; | 531 | entropy_count = r->entropy_count; |
| 531 | if (r->entropy_count < 0) { | 532 | entropy_count += nbits; |
| 533 | if (entropy_count < 0) { | ||
| 532 | DEBUG_ENT("negative entropy/overflow\n"); | 534 | DEBUG_ENT("negative entropy/overflow\n"); |
| 533 | r->entropy_count = 0; | 535 | entropy_count = 0; |
| 534 | } else if (r->entropy_count > r->poolinfo->POOLBITS) | 536 | } else if (entropy_count > r->poolinfo->POOLBITS) |
| 535 | r->entropy_count = r->poolinfo->POOLBITS; | 537 | entropy_count = r->poolinfo->POOLBITS; |
| 538 | r->entropy_count = entropy_count; | ||
| 536 | 539 | ||
| 537 | /* should we wake readers? */ | 540 | /* should we wake readers? */ |
| 538 | if (r == &input_pool && | 541 | if (r == &input_pool && entropy_count >= random_read_wakeup_thresh) { |
| 539 | r->entropy_count >= random_read_wakeup_thresh) { | ||
| 540 | wake_up_interruptible(&random_read_wait); | 542 | wake_up_interruptible(&random_read_wait); |
| 541 | kill_fasync(&fasync, SIGIO, POLL_IN); | 543 | kill_fasync(&fasync, SIGIO, POLL_IN); |
| 542 | } | 544 | } |
| 543 | |||
| 544 | spin_unlock_irqrestore(&r->lock, flags); | 545 | spin_unlock_irqrestore(&r->lock, flags); |
| 545 | } | 546 | } |
| 546 | 547 | ||
diff --git a/drivers/firmware/iscsi_ibft.c b/drivers/firmware/iscsi_ibft.c index 8024e3bfd877..b91ef63126ed 100644 --- a/drivers/firmware/iscsi_ibft.c +++ b/drivers/firmware/iscsi_ibft.c | |||
| @@ -669,8 +669,7 @@ static int __init ibft_register_kobjects(struct ibft_table_header *header, | |||
| 669 | 669 | ||
| 670 | control = (void *)header + sizeof(*header); | 670 | control = (void *)header + sizeof(*header); |
| 671 | end = (void *)control + control->hdr.length; | 671 | end = (void *)control + control->hdr.length; |
| 672 | eot_offset = (void *)header + header->length - | 672 | eot_offset = (void *)header + header->length - (void *)control; |
| 673 | (void *)control - sizeof(*header); | ||
| 674 | rc = ibft_verify_hdr("control", (struct ibft_hdr *)control, id_control, | 673 | rc = ibft_verify_hdr("control", (struct ibft_hdr *)control, id_control, |
| 675 | sizeof(*control)); | 674 | sizeof(*control)); |
| 676 | 675 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index 3331f88dcfb6..248ab4a7d39f 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
| @@ -223,7 +223,7 @@ static int radeon_do_wait_for_fifo(drm_radeon_private_t * dev_priv, int entries) | |||
| 223 | return 0; | 223 | return 0; |
| 224 | DRM_UDELAY(1); | 224 | DRM_UDELAY(1); |
| 225 | } | 225 | } |
| 226 | DRM_INFO("wait for fifo failed status : 0x%08X 0x%08X\n", | 226 | DRM_DEBUG("wait for fifo failed status : 0x%08X 0x%08X\n", |
| 227 | RADEON_READ(RADEON_RBBM_STATUS), | 227 | RADEON_READ(RADEON_RBBM_STATUS), |
| 228 | RADEON_READ(R300_VAP_CNTL_STATUS)); | 228 | RADEON_READ(R300_VAP_CNTL_STATUS)); |
| 229 | 229 | ||
| @@ -252,7 +252,7 @@ static int radeon_do_wait_for_idle(drm_radeon_private_t * dev_priv) | |||
| 252 | } | 252 | } |
| 253 | DRM_UDELAY(1); | 253 | DRM_UDELAY(1); |
| 254 | } | 254 | } |
| 255 | DRM_INFO("wait idle failed status : 0x%08X 0x%08X\n", | 255 | DRM_DEBUG("wait idle failed status : 0x%08X 0x%08X\n", |
| 256 | RADEON_READ(RADEON_RBBM_STATUS), | 256 | RADEON_READ(RADEON_RBBM_STATUS), |
| 257 | RADEON_READ(R300_VAP_CNTL_STATUS)); | 257 | RADEON_READ(R300_VAP_CNTL_STATUS)); |
| 258 | 258 | ||
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index a34758d29516..fc735ab08ff4 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
| @@ -242,7 +242,7 @@ config BLK_DEV_IDEFLOPPY | |||
| 242 | module will be called ide-floppy. | 242 | module will be called ide-floppy. |
| 243 | 243 | ||
| 244 | config BLK_DEV_IDESCSI | 244 | config BLK_DEV_IDESCSI |
| 245 | tristate "SCSI emulation support" | 245 | tristate "SCSI emulation support (DEPRECATED)" |
| 246 | depends on SCSI | 246 | depends on SCSI |
| 247 | select IDE_ATAPI | 247 | select IDE_ATAPI |
| 248 | ---help--- | 248 | ---help--- |
| @@ -255,20 +255,6 @@ config BLK_DEV_IDESCSI | |||
| 255 | and will allow you to use a SCSI device driver instead of a native | 255 | and will allow you to use a SCSI device driver instead of a native |
| 256 | ATAPI driver. | 256 | ATAPI driver. |
| 257 | 257 | ||
| 258 | This is useful if you have an ATAPI device for which no native | ||
| 259 | driver has been written (for example, an ATAPI PD-CD drive); | ||
| 260 | you can then use this emulation together with an appropriate SCSI | ||
| 261 | device driver. In order to do this, say Y here and to "SCSI support" | ||
| 262 | and "SCSI generic support", below. You must then provide the kernel | ||
| 263 | command line "hdx=ide-scsi" (try "man bootparam" or see the | ||
| 264 | documentation of your boot loader (lilo or loadlin) about how to | ||
| 265 | pass options to the kernel at boot time) for devices if you want the | ||
| 266 | native EIDE sub-drivers to skip over the native support, so that | ||
| 267 | this SCSI emulation can be used instead. | ||
| 268 | |||
| 269 | Note that this option does NOT allow you to attach SCSI devices to a | ||
| 270 | box that doesn't have a SCSI host adapter installed. | ||
| 271 | |||
| 272 | If both this SCSI emulation and native ATAPI support are compiled | 258 | If both this SCSI emulation and native ATAPI support are compiled |
| 273 | into the kernel, the native support will be used. | 259 | into the kernel, the native support will be used. |
| 274 | 260 | ||
diff --git a/drivers/ide/arm/palm_bk3710.c b/drivers/ide/arm/palm_bk3710.c index f788fa5a977b..4fd91dcf1dc2 100644 --- a/drivers/ide/arm/palm_bk3710.c +++ b/drivers/ide/arm/palm_bk3710.c | |||
| @@ -343,11 +343,10 @@ static struct ide_port_info __devinitdata palm_bk3710_port_info = { | |||
| 343 | .mwdma_mask = ATA_MWDMA2, | 343 | .mwdma_mask = ATA_MWDMA2, |
| 344 | }; | 344 | }; |
| 345 | 345 | ||
| 346 | static int __devinit palm_bk3710_probe(struct platform_device *pdev) | 346 | static int __init palm_bk3710_probe(struct platform_device *pdev) |
| 347 | { | 347 | { |
| 348 | struct clk *clk; | 348 | struct clk *clk; |
| 349 | struct resource *mem, *irq; | 349 | struct resource *mem, *irq; |
| 350 | struct ide_host *host; | ||
| 351 | unsigned long base, rate; | 350 | unsigned long base, rate; |
| 352 | int i, rc; | 351 | int i, rc; |
| 353 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | 352 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; |
| @@ -390,6 +389,7 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev) | |||
| 390 | hw.io_ports_array[i] = base + IDE_PALM_ATA_PRI_REG_OFFSET + i; | 389 | hw.io_ports_array[i] = base + IDE_PALM_ATA_PRI_REG_OFFSET + i; |
| 391 | hw.io_ports.ctl_addr = base + IDE_PALM_ATA_PRI_CTL_OFFSET; | 390 | hw.io_ports.ctl_addr = base + IDE_PALM_ATA_PRI_CTL_OFFSET; |
| 392 | hw.irq = irq->start; | 391 | hw.irq = irq->start; |
| 392 | hw.dev = &pdev->dev; | ||
| 393 | hw.chipset = ide_palm3710; | 393 | hw.chipset = ide_palm3710; |
| 394 | 394 | ||
| 395 | palm_bk3710_port_info.udma_mask = rate < 100000000 ? ATA_UDMA4 : | 395 | palm_bk3710_port_info.udma_mask = rate < 100000000 ? ATA_UDMA4 : |
| @@ -413,13 +413,11 @@ static struct platform_driver platform_bk_driver = { | |||
| 413 | .name = "palm_bk3710", | 413 | .name = "palm_bk3710", |
| 414 | .owner = THIS_MODULE, | 414 | .owner = THIS_MODULE, |
| 415 | }, | 415 | }, |
| 416 | .probe = palm_bk3710_probe, | ||
| 417 | .remove = NULL, | ||
| 418 | }; | 416 | }; |
| 419 | 417 | ||
| 420 | static int __init palm_bk3710_init(void) | 418 | static int __init palm_bk3710_init(void) |
| 421 | { | 419 | { |
| 422 | return platform_driver_register(&platform_bk_driver); | 420 | return platform_driver_probe(&platform_bk_driver, palm_bk3710_probe); |
| 423 | } | 421 | } |
| 424 | 422 | ||
| 425 | module_init(palm_bk3710_init); | 423 | module_init(palm_bk3710_init); |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 49a8c589e346..f1489999cf91 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
| @@ -1933,6 +1933,7 @@ static void ide_cd_remove(ide_drive_t *drive) | |||
| 1933 | 1933 | ||
| 1934 | ide_proc_unregister_driver(drive, info->driver); | 1934 | ide_proc_unregister_driver(drive, info->driver); |
| 1935 | 1935 | ||
| 1936 | blk_unregister_filter(info->disk); | ||
| 1936 | del_gendisk(info->disk); | 1937 | del_gendisk(info->disk); |
| 1937 | 1938 | ||
| 1938 | ide_cd_put(info); | 1939 | ide_cd_put(info); |
| @@ -2158,6 +2159,7 @@ static int ide_cd_probe(ide_drive_t *drive) | |||
| 2158 | g->fops = &idecd_ops; | 2159 | g->fops = &idecd_ops; |
| 2159 | g->flags |= GENHD_FL_REMOVABLE; | 2160 | g->flags |= GENHD_FL_REMOVABLE; |
| 2160 | add_disk(g); | 2161 | add_disk(g); |
| 2162 | blk_register_filter(g); | ||
| 2161 | return 0; | 2163 | return 0; |
| 2162 | 2164 | ||
| 2163 | out_free_cd: | 2165 | out_free_cd: |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 68b9cf0138b0..07ef88bd109b 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
| @@ -445,20 +445,6 @@ static void idedisk_check_hpa(ide_drive_t *drive) | |||
| 445 | } | 445 | } |
| 446 | } | 446 | } |
| 447 | 447 | ||
| 448 | /* | ||
| 449 | * Compute drive->capacity, the full capacity of the drive | ||
| 450 | * Called with drive->id != NULL. | ||
| 451 | * | ||
| 452 | * To compute capacity, this uses either of | ||
| 453 | * | ||
| 454 | * 1. CHS value set by user (whatever user sets will be trusted) | ||
| 455 | * 2. LBA value from target drive (require new ATA feature) | ||
| 456 | * 3. LBA value from system BIOS (new one is OK, old one may break) | ||
| 457 | * 4. CHS value from system BIOS (traditional style) | ||
| 458 | * | ||
| 459 | * in above order (i.e., if value of higher priority is available, | ||
| 460 | * reset will be ignored). | ||
| 461 | */ | ||
| 462 | static void init_idedisk_capacity(ide_drive_t *drive) | 448 | static void init_idedisk_capacity(ide_drive_t *drive) |
| 463 | { | 449 | { |
| 464 | struct hd_driveid *id = drive->id; | 450 | struct hd_driveid *id = drive->id; |
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 7e65bad522cb..ac89a5deaca2 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
| @@ -238,15 +238,47 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde | |||
| 238 | 238 | ||
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | static mdk_rdev_t *next_active_rdev(mdk_rdev_t *rdev, mddev_t *mddev) | ||
| 242 | { | ||
| 243 | /* Iterate the disks of an mddev, using rcu to protect access to the | ||
| 244 | * linked list, and raising the refcount of devices we return to ensure | ||
| 245 | * they don't disappear while in use. | ||
| 246 | * As devices are only added or removed when raid_disk is < 0 and | ||
| 247 | * nr_pending is 0 and In_sync is clear, the entries we return will | ||
| 248 | * still be in the same position on the list when we re-enter | ||
| 249 | * list_for_each_continue_rcu. | ||
| 250 | */ | ||
| 251 | struct list_head *pos; | ||
| 252 | rcu_read_lock(); | ||
| 253 | if (rdev == NULL) | ||
| 254 | /* start at the beginning */ | ||
| 255 | pos = &mddev->disks; | ||
| 256 | else { | ||
| 257 | /* release the previous rdev and start from there. */ | ||
| 258 | rdev_dec_pending(rdev, mddev); | ||
| 259 | pos = &rdev->same_set; | ||
| 260 | } | ||
| 261 | list_for_each_continue_rcu(pos, &mddev->disks) { | ||
| 262 | rdev = list_entry(pos, mdk_rdev_t, same_set); | ||
| 263 | if (rdev->raid_disk >= 0 && | ||
| 264 | test_bit(In_sync, &rdev->flags) && | ||
| 265 | !test_bit(Faulty, &rdev->flags)) { | ||
| 266 | /* this is a usable devices */ | ||
| 267 | atomic_inc(&rdev->nr_pending); | ||
| 268 | rcu_read_unlock(); | ||
| 269 | return rdev; | ||
| 270 | } | ||
| 271 | } | ||
| 272 | rcu_read_unlock(); | ||
| 273 | return NULL; | ||
| 274 | } | ||
| 275 | |||
| 241 | static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait) | 276 | static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait) |
| 242 | { | 277 | { |
| 243 | mdk_rdev_t *rdev; | 278 | mdk_rdev_t *rdev = NULL; |
| 244 | mddev_t *mddev = bitmap->mddev; | 279 | mddev_t *mddev = bitmap->mddev; |
| 245 | 280 | ||
| 246 | rcu_read_lock(); | 281 | while ((rdev = next_active_rdev(rdev, mddev)) != NULL) { |
| 247 | rdev_for_each_rcu(rdev, mddev) | ||
| 248 | if (test_bit(In_sync, &rdev->flags) | ||
| 249 | && !test_bit(Faulty, &rdev->flags)) { | ||
| 250 | int size = PAGE_SIZE; | 282 | int size = PAGE_SIZE; |
| 251 | if (page->index == bitmap->file_pages-1) | 283 | if (page->index == bitmap->file_pages-1) |
| 252 | size = roundup(bitmap->last_page_size, | 284 | size = roundup(bitmap->last_page_size, |
| @@ -281,8 +313,7 @@ static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait) | |||
| 281 | + page->index * (PAGE_SIZE/512), | 313 | + page->index * (PAGE_SIZE/512), |
| 282 | size, | 314 | size, |
| 283 | page); | 315 | page); |
| 284 | } | 316 | } |
| 285 | rcu_read_unlock(); | ||
| 286 | 317 | ||
| 287 | if (wait) | 318 | if (wait) |
| 288 | md_super_wait(mddev); | 319 | md_super_wait(mddev); |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 8cfadc5bd2ba..4790c83d78d0 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -3841,8 +3841,6 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
| 3841 | 3841 | ||
| 3842 | del_timer_sync(&mddev->safemode_timer); | 3842 | del_timer_sync(&mddev->safemode_timer); |
| 3843 | 3843 | ||
| 3844 | invalidate_partition(disk, 0); | ||
| 3845 | |||
| 3846 | switch(mode) { | 3844 | switch(mode) { |
| 3847 | case 1: /* readonly */ | 3845 | case 1: /* readonly */ |
| 3848 | err = -ENXIO; | 3846 | err = -ENXIO; |
diff --git a/drivers/misc/acer-wmi.c b/drivers/misc/acer-wmi.c index c6c77a505ec1..d8b0d326e452 100644 --- a/drivers/misc/acer-wmi.c +++ b/drivers/misc/acer-wmi.c | |||
| @@ -1189,7 +1189,7 @@ static int create_debugfs(void) | |||
| 1189 | return 0; | 1189 | return 0; |
| 1190 | 1190 | ||
| 1191 | error_debugfs: | 1191 | error_debugfs: |
| 1192 | remove_debugfs(); | 1192 | remove_debugfs(); |
| 1193 | return -ENOMEM; | 1193 | return -ENOMEM; |
| 1194 | } | 1194 | } |
| 1195 | 1195 | ||
| @@ -1272,6 +1272,7 @@ error_platform_register: | |||
| 1272 | static void __exit acer_wmi_exit(void) | 1272 | static void __exit acer_wmi_exit(void) |
| 1273 | { | 1273 | { |
| 1274 | remove_sysfs(acer_platform_device); | 1274 | remove_sysfs(acer_platform_device); |
| 1275 | remove_debugfs(); | ||
| 1275 | platform_device_del(acer_platform_device); | 1276 | platform_device_del(acer_platform_device); |
| 1276 | platform_driver_unregister(&acer_platform_driver); | 1277 | platform_driver_unregister(&acer_platform_driver); |
| 1277 | 1278 | ||
diff --git a/drivers/misc/hp-wmi.c b/drivers/misc/hp-wmi.c index 1dbcbcb323a2..6d407c2a4f91 100644 --- a/drivers/misc/hp-wmi.c +++ b/drivers/misc/hp-wmi.c | |||
| @@ -49,6 +49,7 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4"); | |||
| 49 | #define HPWMI_ALS_QUERY 0x3 | 49 | #define HPWMI_ALS_QUERY 0x3 |
| 50 | #define HPWMI_DOCK_QUERY 0x4 | 50 | #define HPWMI_DOCK_QUERY 0x4 |
| 51 | #define HPWMI_WIRELESS_QUERY 0x5 | 51 | #define HPWMI_WIRELESS_QUERY 0x5 |
| 52 | #define HPWMI_HOTKEY_QUERY 0xc | ||
| 52 | 53 | ||
| 53 | static int __init hp_wmi_bios_setup(struct platform_device *device); | 54 | static int __init hp_wmi_bios_setup(struct platform_device *device); |
| 54 | static int __exit hp_wmi_bios_remove(struct platform_device *device); | 55 | static int __exit hp_wmi_bios_remove(struct platform_device *device); |
| @@ -69,7 +70,7 @@ struct bios_return { | |||
| 69 | 70 | ||
| 70 | struct key_entry { | 71 | struct key_entry { |
| 71 | char type; /* See KE_* below */ | 72 | char type; /* See KE_* below */ |
| 72 | u8 code; | 73 | u16 code; |
| 73 | u16 keycode; | 74 | u16 keycode; |
| 74 | }; | 75 | }; |
| 75 | 76 | ||
| @@ -79,7 +80,9 @@ static struct key_entry hp_wmi_keymap[] = { | |||
| 79 | {KE_SW, 0x01, SW_DOCK}, | 80 | {KE_SW, 0x01, SW_DOCK}, |
| 80 | {KE_KEY, 0x02, KEY_BRIGHTNESSUP}, | 81 | {KE_KEY, 0x02, KEY_BRIGHTNESSUP}, |
| 81 | {KE_KEY, 0x03, KEY_BRIGHTNESSDOWN}, | 82 | {KE_KEY, 0x03, KEY_BRIGHTNESSDOWN}, |
| 82 | {KE_KEY, 0x04, KEY_HELP}, | 83 | {KE_KEY, 0x20e6, KEY_PROG1}, |
| 84 | {KE_KEY, 0x2142, KEY_MEDIA}, | ||
| 85 | {KE_KEY, 0x231b, KEY_HELP}, | ||
| 83 | {KE_END, 0} | 86 | {KE_END, 0} |
| 84 | }; | 87 | }; |
| 85 | 88 | ||
| @@ -177,9 +180,9 @@ static int hp_wmi_wifi_state(void) | |||
| 177 | int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); | 180 | int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); |
| 178 | 181 | ||
| 179 | if (wireless & 0x100) | 182 | if (wireless & 0x100) |
| 180 | return 1; | 183 | return RFKILL_STATE_UNBLOCKED; |
| 181 | else | 184 | else |
| 182 | return 0; | 185 | return RFKILL_STATE_SOFT_BLOCKED; |
| 183 | } | 186 | } |
| 184 | 187 | ||
| 185 | static int hp_wmi_bluetooth_state(void) | 188 | static int hp_wmi_bluetooth_state(void) |
| @@ -187,9 +190,9 @@ static int hp_wmi_bluetooth_state(void) | |||
| 187 | int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); | 190 | int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); |
| 188 | 191 | ||
| 189 | if (wireless & 0x10000) | 192 | if (wireless & 0x10000) |
| 190 | return 1; | 193 | return RFKILL_STATE_UNBLOCKED; |
| 191 | else | 194 | else |
| 192 | return 0; | 195 | return RFKILL_STATE_SOFT_BLOCKED; |
| 193 | } | 196 | } |
| 194 | 197 | ||
| 195 | static int hp_wmi_wwan_state(void) | 198 | static int hp_wmi_wwan_state(void) |
| @@ -197,9 +200,9 @@ static int hp_wmi_wwan_state(void) | |||
| 197 | int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); | 200 | int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); |
| 198 | 201 | ||
| 199 | if (wireless & 0x1000000) | 202 | if (wireless & 0x1000000) |
| 200 | return 1; | 203 | return RFKILL_STATE_UNBLOCKED; |
| 201 | else | 204 | else |
| 202 | return 0; | 205 | return RFKILL_STATE_SOFT_BLOCKED; |
| 203 | } | 206 | } |
| 204 | 207 | ||
| 205 | static ssize_t show_display(struct device *dev, struct device_attribute *attr, | 208 | static ssize_t show_display(struct device *dev, struct device_attribute *attr, |
| @@ -318,6 +321,9 @@ void hp_wmi_notify(u32 value, void *context) | |||
| 318 | 321 | ||
| 319 | if (obj && obj->type == ACPI_TYPE_BUFFER && obj->buffer.length == 8) { | 322 | if (obj && obj->type == ACPI_TYPE_BUFFER && obj->buffer.length == 8) { |
| 320 | int eventcode = *((u8 *) obj->buffer.pointer); | 323 | int eventcode = *((u8 *) obj->buffer.pointer); |
| 324 | if (eventcode == 0x4) | ||
| 325 | eventcode = hp_wmi_perform_query(HPWMI_HOTKEY_QUERY, 0, | ||
| 326 | 0); | ||
| 321 | key = hp_wmi_get_entry_by_scancode(eventcode); | 327 | key = hp_wmi_get_entry_by_scancode(eventcode); |
| 322 | if (key) { | 328 | if (key) { |
| 323 | switch (key->type) { | 329 | switch (key->type) { |
| @@ -338,12 +344,14 @@ void hp_wmi_notify(u32 value, void *context) | |||
| 338 | } | 344 | } |
| 339 | } else if (eventcode == 0x5) { | 345 | } else if (eventcode == 0x5) { |
| 340 | if (wifi_rfkill) | 346 | if (wifi_rfkill) |
| 341 | wifi_rfkill->state = hp_wmi_wifi_state(); | 347 | rfkill_force_state(wifi_rfkill, |
| 348 | hp_wmi_wifi_state()); | ||
| 342 | if (bluetooth_rfkill) | 349 | if (bluetooth_rfkill) |
| 343 | bluetooth_rfkill->state = | 350 | rfkill_force_state(bluetooth_rfkill, |
| 344 | hp_wmi_bluetooth_state(); | 351 | hp_wmi_bluetooth_state()); |
| 345 | if (wwan_rfkill) | 352 | if (wwan_rfkill) |
| 346 | wwan_rfkill->state = hp_wmi_wwan_state(); | 353 | rfkill_force_state(wwan_rfkill, |
| 354 | hp_wmi_wwan_state()); | ||
| 347 | } else | 355 | } else |
| 348 | printk(KERN_INFO "HP WMI: Unknown key pressed - %x\n", | 356 | printk(KERN_INFO "HP WMI: Unknown key pressed - %x\n", |
| 349 | eventcode); | 357 | eventcode); |
| @@ -398,6 +406,7 @@ static void cleanup_sysfs(struct platform_device *device) | |||
| 398 | static int __init hp_wmi_bios_setup(struct platform_device *device) | 406 | static int __init hp_wmi_bios_setup(struct platform_device *device) |
| 399 | { | 407 | { |
| 400 | int err; | 408 | int err; |
| 409 | int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); | ||
| 401 | 410 | ||
| 402 | err = device_create_file(&device->dev, &dev_attr_display); | 411 | err = device_create_file(&device->dev, &dev_attr_display); |
| 403 | if (err) | 412 | if (err) |
| @@ -412,28 +421,33 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) | |||
| 412 | if (err) | 421 | if (err) |
| 413 | goto add_sysfs_error; | 422 | goto add_sysfs_error; |
| 414 | 423 | ||
| 415 | wifi_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WLAN); | 424 | if (wireless & 0x1) { |
| 416 | wifi_rfkill->name = "hp-wifi"; | 425 | wifi_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WLAN); |
| 417 | wifi_rfkill->state = hp_wmi_wifi_state(); | 426 | wifi_rfkill->name = "hp-wifi"; |
| 418 | wifi_rfkill->toggle_radio = hp_wmi_wifi_set; | 427 | wifi_rfkill->state = hp_wmi_wifi_state(); |
| 419 | wifi_rfkill->user_claim_unsupported = 1; | 428 | wifi_rfkill->toggle_radio = hp_wmi_wifi_set; |
| 420 | 429 | wifi_rfkill->user_claim_unsupported = 1; | |
| 421 | bluetooth_rfkill = rfkill_allocate(&device->dev, | 430 | rfkill_register(wifi_rfkill); |
| 422 | RFKILL_TYPE_BLUETOOTH); | 431 | } |
| 423 | bluetooth_rfkill->name = "hp-bluetooth"; | 432 | |
| 424 | bluetooth_rfkill->state = hp_wmi_bluetooth_state(); | 433 | if (wireless & 0x2) { |
| 425 | bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set; | 434 | bluetooth_rfkill = rfkill_allocate(&device->dev, |
| 426 | bluetooth_rfkill->user_claim_unsupported = 1; | 435 | RFKILL_TYPE_BLUETOOTH); |
| 427 | 436 | bluetooth_rfkill->name = "hp-bluetooth"; | |
| 428 | wwan_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WIMAX); | 437 | bluetooth_rfkill->state = hp_wmi_bluetooth_state(); |
| 429 | wwan_rfkill->name = "hp-wwan"; | 438 | bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set; |
| 430 | wwan_rfkill->state = hp_wmi_wwan_state(); | 439 | bluetooth_rfkill->user_claim_unsupported = 1; |
| 431 | wwan_rfkill->toggle_radio = hp_wmi_wwan_set; | 440 | rfkill_register(bluetooth_rfkill); |
| 432 | wwan_rfkill->user_claim_unsupported = 1; | 441 | } |
| 433 | 442 | ||
| 434 | rfkill_register(wifi_rfkill); | 443 | if (wireless & 0x4) { |
| 435 | rfkill_register(bluetooth_rfkill); | 444 | wwan_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WWAN); |
| 436 | rfkill_register(wwan_rfkill); | 445 | wwan_rfkill->name = "hp-wwan"; |
| 446 | wwan_rfkill->state = hp_wmi_wwan_state(); | ||
| 447 | wwan_rfkill->toggle_radio = hp_wmi_wwan_set; | ||
| 448 | wwan_rfkill->user_claim_unsupported = 1; | ||
| 449 | rfkill_register(wwan_rfkill); | ||
| 450 | } | ||
| 437 | 451 | ||
| 438 | return 0; | 452 | return 0; |
| 439 | add_sysfs_error: | 453 | add_sysfs_error: |
| @@ -445,9 +459,12 @@ static int __exit hp_wmi_bios_remove(struct platform_device *device) | |||
| 445 | { | 459 | { |
| 446 | cleanup_sysfs(device); | 460 | cleanup_sysfs(device); |
| 447 | 461 | ||
| 448 | rfkill_unregister(wifi_rfkill); | 462 | if (wifi_rfkill) |
| 449 | rfkill_unregister(bluetooth_rfkill); | 463 | rfkill_unregister(wifi_rfkill); |
| 450 | rfkill_unregister(wwan_rfkill); | 464 | if (bluetooth_rfkill) |
| 465 | rfkill_unregister(bluetooth_rfkill); | ||
| 466 | if (wwan_rfkill) | ||
| 467 | rfkill_unregister(wwan_rfkill); | ||
| 451 | 468 | ||
| 452 | return 0; | 469 | return 0; |
| 453 | } | 470 | } |
diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c index 6915f40ac8ab..1f8b5b36222c 100644 --- a/drivers/mmc/host/at91_mci.c +++ b/drivers/mmc/host/at91_mci.c | |||
| @@ -621,12 +621,21 @@ static void at91_mci_send_command(struct at91mci_host *host, struct mmc_command | |||
| 621 | if (cpu_is_at91sam9260 () || cpu_is_at91sam9263()) | 621 | if (cpu_is_at91sam9260 () || cpu_is_at91sam9263()) |
| 622 | if (host->total_length < 12) | 622 | if (host->total_length < 12) |
| 623 | host->total_length = 12; | 623 | host->total_length = 12; |
| 624 | host->buffer = dma_alloc_coherent(NULL, | 624 | |
| 625 | host->total_length, | 625 | host->buffer = kmalloc(host->total_length, GFP_KERNEL); |
| 626 | &host->physical_address, GFP_KERNEL); | 626 | if (!host->buffer) { |
| 627 | pr_debug("Can't alloc tx buffer\n"); | ||
| 628 | cmd->error = -ENOMEM; | ||
| 629 | mmc_request_done(host->mmc, host->request); | ||
| 630 | return; | ||
| 631 | } | ||
| 627 | 632 | ||
| 628 | at91_mci_sg_to_dma(host, data); | 633 | at91_mci_sg_to_dma(host, data); |
| 629 | 634 | ||
| 635 | host->physical_address = dma_map_single(NULL, | ||
| 636 | host->buffer, host->total_length, | ||
| 637 | DMA_TO_DEVICE); | ||
| 638 | |||
| 630 | pr_debug("Transmitting %d bytes\n", host->total_length); | 639 | pr_debug("Transmitting %d bytes\n", host->total_length); |
| 631 | 640 | ||
| 632 | at91_mci_write(host, ATMEL_PDC_TPR, host->physical_address); | 641 | at91_mci_write(host, ATMEL_PDC_TPR, host->physical_address); |
| @@ -694,7 +703,10 @@ static void at91_mci_completed_command(struct at91mci_host *host, unsigned int s | |||
| 694 | cmd->resp[3] = at91_mci_read(host, AT91_MCI_RSPR(3)); | 703 | cmd->resp[3] = at91_mci_read(host, AT91_MCI_RSPR(3)); |
| 695 | 704 | ||
| 696 | if (host->buffer) { | 705 | if (host->buffer) { |
| 697 | dma_free_coherent(NULL, host->total_length, host->buffer, host->physical_address); | 706 | dma_unmap_single(NULL, |
| 707 | host->physical_address, host->total_length, | ||
| 708 | DMA_TO_DEVICE); | ||
| 709 | kfree(host->buffer); | ||
| 698 | host->buffer = NULL; | 710 | host->buffer = NULL; |
| 699 | } | 711 | } |
| 700 | 712 | ||
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index d2f331876e4c..e00d424e6575 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c | |||
| @@ -410,16 +410,20 @@ static int mtd_ioctl(struct inode *inode, struct file *file, | |||
| 410 | 410 | ||
| 411 | case MEMGETREGIONINFO: | 411 | case MEMGETREGIONINFO: |
| 412 | { | 412 | { |
| 413 | struct region_info_user ur; | 413 | uint32_t ur_idx; |
| 414 | struct mtd_erase_region_info *kr; | ||
| 415 | struct region_info_user *ur = (struct region_info_user *) argp; | ||
| 414 | 416 | ||
| 415 | if (copy_from_user(&ur, argp, sizeof(struct region_info_user))) | 417 | if (get_user(ur_idx, &(ur->regionindex))) |
| 416 | return -EFAULT; | 418 | return -EFAULT; |
| 417 | 419 | ||
| 418 | if (ur.regionindex >= mtd->numeraseregions) | 420 | kr = &(mtd->eraseregions[ur_idx]); |
| 419 | return -EINVAL; | 421 | |
| 420 | if (copy_to_user(argp, &(mtd->eraseregions[ur.regionindex]), | 422 | if (put_user(kr->offset, &(ur->offset)) |
| 421 | sizeof(struct mtd_erase_region_info))) | 423 | || put_user(kr->erasesize, &(ur->erasesize)) |
| 424 | || put_user(kr->numblocks, &(ur->numblocks))) | ||
| 422 | return -EFAULT; | 425 | return -EFAULT; |
| 426 | |||
| 423 | break; | 427 | break; |
| 424 | } | 428 | } |
| 425 | 429 | ||
diff --git a/drivers/net/bnx2x.h b/drivers/net/bnx2x.h index a14dba1afcc5..fd705d1295a7 100644 --- a/drivers/net/bnx2x.h +++ b/drivers/net/bnx2x.h | |||
| @@ -151,6 +151,8 @@ struct sw_rx_page { | |||
| 151 | #define PAGES_PER_SGE_SHIFT 0 | 151 | #define PAGES_PER_SGE_SHIFT 0 |
| 152 | #define PAGES_PER_SGE (1 << PAGES_PER_SGE_SHIFT) | 152 | #define PAGES_PER_SGE (1 << PAGES_PER_SGE_SHIFT) |
| 153 | 153 | ||
| 154 | #define BCM_RX_ETH_PAYLOAD_ALIGN 64 | ||
| 155 | |||
| 154 | /* SGE ring related macros */ | 156 | /* SGE ring related macros */ |
| 155 | #define NUM_RX_SGE_PAGES 2 | 157 | #define NUM_RX_SGE_PAGES 2 |
| 156 | #define RX_SGE_CNT (BCM_PAGE_SIZE / sizeof(struct eth_rx_sge)) | 158 | #define RX_SGE_CNT (BCM_PAGE_SIZE / sizeof(struct eth_rx_sge)) |
| @@ -750,8 +752,7 @@ struct bnx2x { | |||
| 750 | 752 | ||
| 751 | u32 rx_csum; | 753 | u32 rx_csum; |
| 752 | u32 rx_offset; | 754 | u32 rx_offset; |
| 753 | u32 rx_buf_use_size; /* useable size */ | 755 | u32 rx_buf_size; |
| 754 | u32 rx_buf_size; /* with alignment */ | ||
| 755 | #define ETH_OVREHEAD (ETH_HLEN + 8) /* 8 for CRC + VLAN */ | 756 | #define ETH_OVREHEAD (ETH_HLEN + 8) /* 8 for CRC + VLAN */ |
| 756 | #define ETH_MIN_PACKET_SIZE 60 | 757 | #define ETH_MIN_PACKET_SIZE 60 |
| 757 | #define ETH_MAX_PACKET_SIZE 1500 | 758 | #define ETH_MAX_PACKET_SIZE 1500 |
diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c index 82deea0a63f5..a8eb3c4a47c8 100644 --- a/drivers/net/bnx2x_main.c +++ b/drivers/net/bnx2x_main.c | |||
| @@ -59,8 +59,8 @@ | |||
| 59 | #include "bnx2x.h" | 59 | #include "bnx2x.h" |
| 60 | #include "bnx2x_init.h" | 60 | #include "bnx2x_init.h" |
| 61 | 61 | ||
| 62 | #define DRV_MODULE_VERSION "1.45.20" | 62 | #define DRV_MODULE_VERSION "1.45.21" |
| 63 | #define DRV_MODULE_RELDATE "2008/08/25" | 63 | #define DRV_MODULE_RELDATE "2008/09/03" |
| 64 | #define BNX2X_BC_VER 0x040200 | 64 | #define BNX2X_BC_VER 0x040200 |
| 65 | 65 | ||
| 66 | /* Time in jiffies before concluding the transmitter is hung */ | 66 | /* Time in jiffies before concluding the transmitter is hung */ |
| @@ -1027,7 +1027,7 @@ static inline int bnx2x_alloc_rx_skb(struct bnx2x *bp, | |||
| 1027 | if (unlikely(skb == NULL)) | 1027 | if (unlikely(skb == NULL)) |
| 1028 | return -ENOMEM; | 1028 | return -ENOMEM; |
| 1029 | 1029 | ||
| 1030 | mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size, | 1030 | mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_size, |
| 1031 | PCI_DMA_FROMDEVICE); | 1031 | PCI_DMA_FROMDEVICE); |
| 1032 | if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) { | 1032 | if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) { |
| 1033 | dev_kfree_skb(skb); | 1033 | dev_kfree_skb(skb); |
| @@ -1169,7 +1169,7 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue, | |||
| 1169 | /* move empty skb from pool to prod and map it */ | 1169 | /* move empty skb from pool to prod and map it */ |
| 1170 | prod_rx_buf->skb = fp->tpa_pool[queue].skb; | 1170 | prod_rx_buf->skb = fp->tpa_pool[queue].skb; |
| 1171 | mapping = pci_map_single(bp->pdev, fp->tpa_pool[queue].skb->data, | 1171 | mapping = pci_map_single(bp->pdev, fp->tpa_pool[queue].skb->data, |
| 1172 | bp->rx_buf_use_size, PCI_DMA_FROMDEVICE); | 1172 | bp->rx_buf_size, PCI_DMA_FROMDEVICE); |
| 1173 | pci_unmap_addr_set(prod_rx_buf, mapping, mapping); | 1173 | pci_unmap_addr_set(prod_rx_buf, mapping, mapping); |
| 1174 | 1174 | ||
| 1175 | /* move partial skb from cons to pool (don't unmap yet) */ | 1175 | /* move partial skb from cons to pool (don't unmap yet) */ |
| @@ -1276,7 +1276,7 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, | |||
| 1276 | pool entry status to BNX2X_TPA_STOP even if new skb allocation | 1276 | pool entry status to BNX2X_TPA_STOP even if new skb allocation |
| 1277 | fails. */ | 1277 | fails. */ |
| 1278 | pci_unmap_single(bp->pdev, pci_unmap_addr(rx_buf, mapping), | 1278 | pci_unmap_single(bp->pdev, pci_unmap_addr(rx_buf, mapping), |
| 1279 | bp->rx_buf_use_size, PCI_DMA_FROMDEVICE); | 1279 | bp->rx_buf_size, PCI_DMA_FROMDEVICE); |
| 1280 | 1280 | ||
| 1281 | if (likely(new_skb)) { | 1281 | if (likely(new_skb)) { |
| 1282 | /* fix ip xsum and give it to the stack */ | 1282 | /* fix ip xsum and give it to the stack */ |
| @@ -1520,7 +1520,7 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) | |||
| 1520 | } else if (bnx2x_alloc_rx_skb(bp, fp, bd_prod) == 0) { | 1520 | } else if (bnx2x_alloc_rx_skb(bp, fp, bd_prod) == 0) { |
| 1521 | pci_unmap_single(bp->pdev, | 1521 | pci_unmap_single(bp->pdev, |
| 1522 | pci_unmap_addr(rx_buf, mapping), | 1522 | pci_unmap_addr(rx_buf, mapping), |
| 1523 | bp->rx_buf_use_size, | 1523 | bp->rx_buf_size, |
| 1524 | PCI_DMA_FROMDEVICE); | 1524 | PCI_DMA_FROMDEVICE); |
| 1525 | skb_reserve(skb, pad); | 1525 | skb_reserve(skb, pad); |
| 1526 | skb_put(skb, len); | 1526 | skb_put(skb, len); |
| @@ -4229,7 +4229,7 @@ static inline void bnx2x_free_tpa_pool(struct bnx2x *bp, | |||
| 4229 | if (fp->tpa_state[i] == BNX2X_TPA_START) | 4229 | if (fp->tpa_state[i] == BNX2X_TPA_START) |
| 4230 | pci_unmap_single(bp->pdev, | 4230 | pci_unmap_single(bp->pdev, |
| 4231 | pci_unmap_addr(rx_buf, mapping), | 4231 | pci_unmap_addr(rx_buf, mapping), |
| 4232 | bp->rx_buf_use_size, | 4232 | bp->rx_buf_size, |
| 4233 | PCI_DMA_FROMDEVICE); | 4233 | PCI_DMA_FROMDEVICE); |
| 4234 | 4234 | ||
| 4235 | dev_kfree_skb(skb); | 4235 | dev_kfree_skb(skb); |
| @@ -4245,15 +4245,14 @@ static void bnx2x_init_rx_rings(struct bnx2x *bp) | |||
| 4245 | u16 ring_prod, cqe_ring_prod; | 4245 | u16 ring_prod, cqe_ring_prod; |
| 4246 | int i, j; | 4246 | int i, j; |
| 4247 | 4247 | ||
| 4248 | bp->rx_buf_use_size = bp->dev->mtu; | 4248 | bp->rx_buf_size = bp->dev->mtu; |
| 4249 | bp->rx_buf_use_size += bp->rx_offset + ETH_OVREHEAD; | 4249 | bp->rx_buf_size += bp->rx_offset + ETH_OVREHEAD + |
| 4250 | bp->rx_buf_size = bp->rx_buf_use_size + 64; | 4250 | BCM_RX_ETH_PAYLOAD_ALIGN; |
| 4251 | 4251 | ||
| 4252 | if (bp->flags & TPA_ENABLE_FLAG) { | 4252 | if (bp->flags & TPA_ENABLE_FLAG) { |
| 4253 | DP(NETIF_MSG_IFUP, | 4253 | DP(NETIF_MSG_IFUP, |
| 4254 | "rx_buf_use_size %d rx_buf_size %d effective_mtu %d\n", | 4254 | "rx_buf_size %d effective_mtu %d\n", |
| 4255 | bp->rx_buf_use_size, bp->rx_buf_size, | 4255 | bp->rx_buf_size, bp->dev->mtu + ETH_OVREHEAD); |
| 4256 | bp->dev->mtu + ETH_OVREHEAD); | ||
| 4257 | 4256 | ||
| 4258 | for_each_queue(bp, j) { | 4257 | for_each_queue(bp, j) { |
| 4259 | struct bnx2x_fastpath *fp = &bp->fp[j]; | 4258 | struct bnx2x_fastpath *fp = &bp->fp[j]; |
| @@ -4462,9 +4461,10 @@ static void bnx2x_init_context(struct bnx2x *bp) | |||
| 4462 | context->ustorm_st_context.common.status_block_id = sb_id; | 4461 | context->ustorm_st_context.common.status_block_id = sb_id; |
| 4463 | context->ustorm_st_context.common.flags = | 4462 | context->ustorm_st_context.common.flags = |
| 4464 | USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_MC_ALIGNMENT; | 4463 | USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_MC_ALIGNMENT; |
| 4465 | context->ustorm_st_context.common.mc_alignment_size = 64; | 4464 | context->ustorm_st_context.common.mc_alignment_size = |
| 4465 | BCM_RX_ETH_PAYLOAD_ALIGN; | ||
| 4466 | context->ustorm_st_context.common.bd_buff_size = | 4466 | context->ustorm_st_context.common.bd_buff_size = |
| 4467 | bp->rx_buf_use_size; | 4467 | bp->rx_buf_size; |
| 4468 | context->ustorm_st_context.common.bd_page_base_hi = | 4468 | context->ustorm_st_context.common.bd_page_base_hi = |
| 4469 | U64_HI(fp->rx_desc_mapping); | 4469 | U64_HI(fp->rx_desc_mapping); |
| 4470 | context->ustorm_st_context.common.bd_page_base_lo = | 4470 | context->ustorm_st_context.common.bd_page_base_lo = |
| @@ -4717,7 +4717,7 @@ static void bnx2x_init_internal_func(struct bnx2x *bp) | |||
| 4717 | } | 4717 | } |
| 4718 | 4718 | ||
| 4719 | /* Init CQ ring mapping and aggregation size */ | 4719 | /* Init CQ ring mapping and aggregation size */ |
| 4720 | max_agg_size = min((u32)(bp->rx_buf_use_size + | 4720 | max_agg_size = min((u32)(bp->rx_buf_size + |
| 4721 | 8*BCM_PAGE_SIZE*PAGES_PER_SGE), | 4721 | 8*BCM_PAGE_SIZE*PAGES_PER_SGE), |
| 4722 | (u32)0xffff); | 4722 | (u32)0xffff); |
| 4723 | for_each_queue(bp, i) { | 4723 | for_each_queue(bp, i) { |
| @@ -5940,7 +5940,7 @@ static void bnx2x_free_rx_skbs(struct bnx2x *bp) | |||
| 5940 | 5940 | ||
| 5941 | pci_unmap_single(bp->pdev, | 5941 | pci_unmap_single(bp->pdev, |
| 5942 | pci_unmap_addr(rx_buf, mapping), | 5942 | pci_unmap_addr(rx_buf, mapping), |
| 5943 | bp->rx_buf_use_size, | 5943 | bp->rx_buf_size, |
| 5944 | PCI_DMA_FROMDEVICE); | 5944 | PCI_DMA_FROMDEVICE); |
| 5945 | 5945 | ||
| 5946 | rx_buf->skb = NULL; | 5946 | rx_buf->skb = NULL; |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 53f41b649f03..a417be7f8be5 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -2304,6 +2304,12 @@ static int __devinit ixgbe_set_interrupt_capability(struct ixgbe_adapter | |||
| 2304 | int vector, v_budget; | 2304 | int vector, v_budget; |
| 2305 | 2305 | ||
| 2306 | /* | 2306 | /* |
| 2307 | * Set the default interrupt throttle rate. | ||
| 2308 | */ | ||
| 2309 | adapter->rx_eitr = (1000000 / IXGBE_DEFAULT_ITR_RX_USECS); | ||
| 2310 | adapter->tx_eitr = (1000000 / IXGBE_DEFAULT_ITR_TX_USECS); | ||
| 2311 | |||
| 2312 | /* | ||
| 2307 | * It's easy to be greedy for MSI-X vectors, but it really | 2313 | * It's easy to be greedy for MSI-X vectors, but it really |
| 2308 | * doesn't do us much good if we have a lot more vectors | 2314 | * doesn't do us much good if we have a lot more vectors |
| 2309 | * than CPU's. So let's be conservative and only ask for | 2315 | * than CPU's. So let's be conservative and only ask for |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 32bb47adbe39..008fd6618a5f 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -359,16 +359,6 @@ static void netxen_pcie_strap_init(struct netxen_adapter *adapter) | |||
| 359 | int i, pos; | 359 | int i, pos; |
| 360 | struct pci_dev *pdev; | 360 | struct pci_dev *pdev; |
| 361 | 361 | ||
| 362 | pdev = pci_get_device(0x1166, 0x0140, NULL); | ||
| 363 | if (pdev) { | ||
| 364 | pci_dev_put(pdev); | ||
| 365 | adapter->hw_read_wx(adapter, | ||
| 366 | NETXEN_PCIE_REG(PCIE_TGT_SPLIT_CHICKEN), &chicken, 4); | ||
| 367 | chicken |= 0x4000; | ||
| 368 | adapter->hw_write_wx(adapter, | ||
| 369 | NETXEN_PCIE_REG(PCIE_TGT_SPLIT_CHICKEN), &chicken, 4); | ||
| 370 | } | ||
| 371 | |||
| 372 | pdev = adapter->pdev; | 362 | pdev = adapter->pdev; |
| 373 | 363 | ||
| 374 | adapter->hw_read_wx(adapter, | 364 | adapter->hw_read_wx(adapter, |
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index 3f682d49a4e6..52bf11b73c6e 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
| @@ -784,6 +784,7 @@ static struct pcmcia_device_id axnet_ids[] = { | |||
| 784 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEther PCC-TXD", 0x5261440f, 0x436768c5), | 784 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEther PCC-TXD", 0x5261440f, 0x436768c5), |
| 785 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEtherII PCC-TXD", 0x5261440f, 0x730df72e), | 785 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEtherII PCC-TXD", 0x5261440f, 0x730df72e), |
| 786 | PCMCIA_DEVICE_PROD_ID12("Dynalink", "L100C16", 0x55632fd5, 0x66bc2a90), | 786 | PCMCIA_DEVICE_PROD_ID12("Dynalink", "L100C16", 0x55632fd5, 0x66bc2a90), |
| 787 | PCMCIA_DEVICE_PROD_ID12("IO DATA", "ETXPCM", 0x547e66dc, 0x233adac2), | ||
| 787 | PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V3)", 0x0733cc81, 0x232019a8), | 788 | PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V3)", 0x0733cc81, 0x232019a8), |
| 788 | PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC3-TX", 0x481e0094, 0xf91af609), | 789 | PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC3-TX", 0x481e0094, 0xf91af609), |
| 789 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "100BASE", 0x281f1c5d, 0x7c2add04), | 790 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "100BASE", 0x281f1c5d, 0x7c2add04), |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 2d4c4ad89b8d..ebc1ae6bcbe5 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
| @@ -1626,6 +1626,7 @@ static struct pcmcia_device_id pcnet_ids[] = { | |||
| 1626 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d), | 1626 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d), |
| 1627 | PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d), | 1627 | PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d), |
| 1628 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa), | 1628 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa), |
| 1629 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-TD", 0x5261440f, 0x47d5ca83), | ||
| 1629 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9), | 1630 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9), |
| 1630 | PCMCIA_DEVICE_PROD_ID12("Corega,K.K.", "Ethernet LAN Card", 0x110d26d9, 0x9fd2f0a2), | 1631 | PCMCIA_DEVICE_PROD_ID12("Corega,K.K.", "Ethernet LAN Card", 0x110d26d9, 0x9fd2f0a2), |
| 1631 | PCMCIA_DEVICE_PROD_ID12("corega,K.K.", "Ethernet LAN Card", 0x9791a90e, 0x9fd2f0a2), | 1632 | PCMCIA_DEVICE_PROD_ID12("corega,K.K.", "Ethernet LAN Card", 0x9791a90e, 0x9fd2f0a2), |
| @@ -1737,7 +1738,6 @@ static struct pcmcia_device_id pcnet_ids[] = { | |||
| 1737 | PCMCIA_DEVICE_PROD_ID1("CyQ've 10 Base-T LAN CARD", 0x94faf360), | 1738 | PCMCIA_DEVICE_PROD_ID1("CyQ've 10 Base-T LAN CARD", 0x94faf360), |
| 1738 | PCMCIA_DEVICE_PROD_ID1("EP-210 PCMCIA LAN CARD.", 0x8850b4de), | 1739 | PCMCIA_DEVICE_PROD_ID1("EP-210 PCMCIA LAN CARD.", 0x8850b4de), |
| 1739 | PCMCIA_DEVICE_PROD_ID1("ETHER-C16", 0x06a8514f), | 1740 | PCMCIA_DEVICE_PROD_ID1("ETHER-C16", 0x06a8514f), |
| 1740 | PCMCIA_DEVICE_PROD_ID1("IC-CARD", 0x60cb09a6), | ||
| 1741 | PCMCIA_DEVICE_PROD_ID1("NE2000 Compatible", 0x75b8ad5a), | 1741 | PCMCIA_DEVICE_PROD_ID1("NE2000 Compatible", 0x75b8ad5a), |
| 1742 | PCMCIA_DEVICE_PROD_ID2("EN-6200P2", 0xa996d078), | 1742 | PCMCIA_DEVICE_PROD_ID2("EN-6200P2", 0xa996d078), |
| 1743 | /* too generic! */ | 1743 | /* too generic! */ |
diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c index a84ba487c713..8c19307e5040 100644 --- a/drivers/net/usb/pegasus.c +++ b/drivers/net/usb/pegasus.c | |||
| @@ -117,7 +117,7 @@ static void ctrl_callback(struct urb *urb) | |||
| 117 | case -ENOENT: | 117 | case -ENOENT: |
| 118 | break; | 118 | break; |
| 119 | default: | 119 | default: |
| 120 | if (netif_msg_drv(pegasus)) | 120 | if (netif_msg_drv(pegasus) && printk_ratelimit()) |
| 121 | dev_dbg(&pegasus->intf->dev, "%s, status %d\n", | 121 | dev_dbg(&pegasus->intf->dev, "%s, status %d\n", |
| 122 | __FUNCTION__, urb->status); | 122 | __FUNCTION__, urb->status); |
| 123 | } | 123 | } |
| @@ -166,7 +166,7 @@ static int get_registers(pegasus_t * pegasus, __u16 indx, __u16 size, | |||
| 166 | set_current_state(TASK_RUNNING); | 166 | set_current_state(TASK_RUNNING); |
| 167 | if (ret == -ENODEV) | 167 | if (ret == -ENODEV) |
| 168 | netif_device_detach(pegasus->net); | 168 | netif_device_detach(pegasus->net); |
| 169 | if (netif_msg_drv(pegasus)) | 169 | if (netif_msg_drv(pegasus) && printk_ratelimit()) |
| 170 | dev_err(&pegasus->intf->dev, "%s, status %d\n", | 170 | dev_err(&pegasus->intf->dev, "%s, status %d\n", |
| 171 | __FUNCTION__, ret); | 171 | __FUNCTION__, ret); |
| 172 | goto out; | 172 | goto out; |
| @@ -275,7 +275,7 @@ static int set_register(pegasus_t * pegasus, __u16 indx, __u8 data) | |||
| 275 | if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { | 275 | if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { |
| 276 | if (ret == -ENODEV) | 276 | if (ret == -ENODEV) |
| 277 | netif_device_detach(pegasus->net); | 277 | netif_device_detach(pegasus->net); |
| 278 | if (netif_msg_drv(pegasus)) | 278 | if (netif_msg_drv(pegasus) && printk_ratelimit()) |
| 279 | dev_err(&pegasus->intf->dev, "%s, status %d\n", | 279 | dev_err(&pegasus->intf->dev, "%s, status %d\n", |
| 280 | __FUNCTION__, ret); | 280 | __FUNCTION__, ret); |
| 281 | goto out; | 281 | goto out; |
| @@ -1209,8 +1209,7 @@ static void pegasus_set_multicast(struct net_device *net) | |||
| 1209 | pegasus->eth_regs[EthCtrl2] |= RX_PROMISCUOUS; | 1209 | pegasus->eth_regs[EthCtrl2] |= RX_PROMISCUOUS; |
| 1210 | if (netif_msg_link(pegasus)) | 1210 | if (netif_msg_link(pegasus)) |
| 1211 | pr_info("%s: Promiscuous mode enabled.\n", net->name); | 1211 | pr_info("%s: Promiscuous mode enabled.\n", net->name); |
| 1212 | } else if (net->mc_count || | 1212 | } else if (net->mc_count || (net->flags & IFF_ALLMULTI)) { |
| 1213 | (net->flags & IFF_ALLMULTI)) { | ||
| 1214 | pegasus->eth_regs[EthCtrl0] |= RX_MULTICAST; | 1213 | pegasus->eth_regs[EthCtrl0] |= RX_MULTICAST; |
| 1215 | pegasus->eth_regs[EthCtrl2] &= ~RX_PROMISCUOUS; | 1214 | pegasus->eth_regs[EthCtrl2] &= ~RX_PROMISCUOUS; |
| 1216 | if (netif_msg_link(pegasus)) | 1215 | if (netif_msg_link(pegasus)) |
| @@ -1220,6 +1219,8 @@ static void pegasus_set_multicast(struct net_device *net) | |||
| 1220 | pegasus->eth_regs[EthCtrl2] &= ~RX_PROMISCUOUS; | 1219 | pegasus->eth_regs[EthCtrl2] &= ~RX_PROMISCUOUS; |
| 1221 | } | 1220 | } |
| 1222 | 1221 | ||
| 1222 | pegasus->ctrl_urb->status = 0; | ||
| 1223 | |||
| 1223 | pegasus->flags |= ETH_REGS_CHANGE; | 1224 | pegasus->flags |= ETH_REGS_CHANGE; |
| 1224 | ctrl_callback(pegasus->ctrl_urb); | 1225 | ctrl_callback(pegasus->ctrl_urb); |
| 1225 | } | 1226 | } |
diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c index a17eb130f574..6dbfed0b4149 100644 --- a/drivers/net/wireless/ath9k/hw.c +++ b/drivers/net/wireless/ath9k/hw.c | |||
| @@ -7285,15 +7285,15 @@ ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry, | |||
| 7285 | } | 7285 | } |
| 7286 | break; | 7286 | break; |
| 7287 | case ATH9K_CIPHER_WEP: | 7287 | case ATH9K_CIPHER_WEP: |
| 7288 | if (k->kv_len < 40 / NBBY) { | 7288 | if (k->kv_len < LEN_WEP40) { |
| 7289 | DPRINTF(ah->ah_sc, ATH_DBG_KEYCACHE, | 7289 | DPRINTF(ah->ah_sc, ATH_DBG_KEYCACHE, |
| 7290 | "%s: WEP key length %u too small\n", | 7290 | "%s: WEP key length %u too small\n", |
| 7291 | __func__, k->kv_len); | 7291 | __func__, k->kv_len); |
| 7292 | return false; | 7292 | return false; |
| 7293 | } | 7293 | } |
| 7294 | if (k->kv_len <= 40 / NBBY) | 7294 | if (k->kv_len <= LEN_WEP40) |
| 7295 | keyType = AR_KEYTABLE_TYPE_40; | 7295 | keyType = AR_KEYTABLE_TYPE_40; |
| 7296 | else if (k->kv_len <= 104 / NBBY) | 7296 | else if (k->kv_len <= LEN_WEP104) |
| 7297 | keyType = AR_KEYTABLE_TYPE_104; | 7297 | keyType = AR_KEYTABLE_TYPE_104; |
| 7298 | else | 7298 | else |
| 7299 | keyType = AR_KEYTABLE_TYPE_128; | 7299 | keyType = AR_KEYTABLE_TYPE_128; |
| @@ -7313,7 +7313,7 @@ ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry, | |||
| 7313 | key2 = get_unaligned_le32(k->kv_val + 6) ^ xorMask; | 7313 | key2 = get_unaligned_le32(k->kv_val + 6) ^ xorMask; |
| 7314 | key3 = (get_unaligned_le16(k->kv_val + 10) ^ xorMask) & 0xffff; | 7314 | key3 = (get_unaligned_le16(k->kv_val + 10) ^ xorMask) & 0xffff; |
| 7315 | key4 = get_unaligned_le32(k->kv_val + 12) ^ xorMask; | 7315 | key4 = get_unaligned_le32(k->kv_val + 12) ^ xorMask; |
| 7316 | if (k->kv_len <= 104 / NBBY) | 7316 | if (k->kv_len <= LEN_WEP104) |
| 7317 | key4 &= 0xff; | 7317 | key4 &= 0xff; |
| 7318 | 7318 | ||
| 7319 | if (keyType == AR_KEYTABLE_TYPE_TKIP && ATH9K_IS_MIC_ENABLED(ah)) { | 7319 | if (keyType == AR_KEYTABLE_TYPE_TKIP && ATH9K_IS_MIC_ENABLED(ah)) { |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index 2888778040e4..c5107f269f24 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
| @@ -206,7 +206,8 @@ static int ath_key_config(struct ath_softc *sc, | |||
| 206 | if (!ret) | 206 | if (!ret) |
| 207 | return -EIO; | 207 | return -EIO; |
| 208 | 208 | ||
| 209 | sc->sc_keytype = hk.kv_type; | 209 | if (mac) |
| 210 | sc->sc_keytype = hk.kv_type; | ||
| 210 | return 0; | 211 | return 0; |
| 211 | } | 212 | } |
| 212 | 213 | ||
| @@ -756,7 +757,8 @@ static int ath9k_set_key(struct ieee80211_hw *hw, | |||
| 756 | key->hw_key_idx = key->keyidx; | 757 | key->hw_key_idx = key->keyidx; |
| 757 | /* push IV and Michael MIC generation to stack */ | 758 | /* push IV and Michael MIC generation to stack */ |
| 758 | key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; | 759 | key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; |
| 759 | key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; | 760 | if (key->alg == ALG_TKIP) |
| 761 | key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; | ||
| 760 | } | 762 | } |
| 761 | break; | 763 | break; |
| 762 | case DISABLE_KEY: | 764 | case DISABLE_KEY: |
| @@ -1065,8 +1067,16 @@ void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb, | |||
| 1065 | tx_info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK; | 1067 | tx_info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK; |
| 1066 | tx_status->flags &= ~ATH_TX_BAR; | 1068 | tx_status->flags &= ~ATH_TX_BAR; |
| 1067 | } | 1069 | } |
| 1068 | if (tx_status->flags) | 1070 | |
| 1069 | tx_info->status.excessive_retries = 1; | 1071 | if (tx_status->flags & (ATH_TX_ERROR | ATH_TX_XRETRY)) { |
| 1072 | if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK)) { | ||
| 1073 | /* Frame was not ACKed, but an ACK was expected */ | ||
| 1074 | tx_info->status.excessive_retries = 1; | ||
| 1075 | } | ||
| 1076 | } else { | ||
| 1077 | /* Frame was ACKed */ | ||
| 1078 | tx_info->flags |= IEEE80211_TX_STAT_ACK; | ||
| 1079 | } | ||
| 1070 | 1080 | ||
| 1071 | tx_info->status.retry_count = tx_status->retries; | 1081 | tx_info->status.retry_count = tx_status->retries; |
| 1072 | 1082 | ||
diff --git a/drivers/net/wireless/ath9k/recv.c b/drivers/net/wireless/ath9k/recv.c index 2fe806175c01..20ddb7acdb94 100644 --- a/drivers/net/wireless/ath9k/recv.c +++ b/drivers/net/wireless/ath9k/recv.c | |||
| @@ -360,8 +360,9 @@ static void ath_rx_flush_tid(struct ath_softc *sc, | |||
| 360 | struct ath_arx_tid *rxtid, int drop) | 360 | struct ath_arx_tid *rxtid, int drop) |
| 361 | { | 361 | { |
| 362 | struct ath_rxbuf *rxbuf; | 362 | struct ath_rxbuf *rxbuf; |
| 363 | unsigned long flag; | ||
| 363 | 364 | ||
| 364 | spin_lock_bh(&rxtid->tidlock); | 365 | spin_lock_irqsave(&rxtid->tidlock, flag); |
| 365 | while (rxtid->baw_head != rxtid->baw_tail) { | 366 | while (rxtid->baw_head != rxtid->baw_tail) { |
| 366 | rxbuf = rxtid->rxbuf + rxtid->baw_head; | 367 | rxbuf = rxtid->rxbuf + rxtid->baw_head; |
| 367 | if (!rxbuf->rx_wbuf) { | 368 | if (!rxbuf->rx_wbuf) { |
| @@ -382,7 +383,7 @@ static void ath_rx_flush_tid(struct ath_softc *sc, | |||
| 382 | INCR(rxtid->baw_head, ATH_TID_MAX_BUFS); | 383 | INCR(rxtid->baw_head, ATH_TID_MAX_BUFS); |
| 383 | INCR(rxtid->seq_next, IEEE80211_SEQ_MAX); | 384 | INCR(rxtid->seq_next, IEEE80211_SEQ_MAX); |
| 384 | } | 385 | } |
| 385 | spin_unlock_bh(&rxtid->tidlock); | 386 | spin_unlock_irqrestore(&rxtid->tidlock, flag); |
| 386 | } | 387 | } |
| 387 | 388 | ||
| 388 | static struct sk_buff *ath_rxbuf_alloc(struct ath_softc *sc, | 389 | static struct sk_buff *ath_rxbuf_alloc(struct ath_softc *sc, |
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c index 157f830ee6b8..550129f717e2 100644 --- a/drivers/net/wireless/ath9k/xmit.c +++ b/drivers/net/wireless/ath9k/xmit.c | |||
| @@ -357,9 +357,9 @@ static int ath_tx_prepare(struct ath_softc *sc, | |||
| 357 | txctl->flags = ATH9K_TXDESC_CLRDMASK; /* needed for crypto errors */ | 357 | txctl->flags = ATH9K_TXDESC_CLRDMASK; /* needed for crypto errors */ |
| 358 | 358 | ||
| 359 | if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) | 359 | if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) |
| 360 | tx_info->flags |= ATH9K_TXDESC_NOACK; | 360 | txctl->flags |= ATH9K_TXDESC_NOACK; |
| 361 | if (tx_info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) | 361 | if (tx_info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) |
| 362 | tx_info->flags |= ATH9K_TXDESC_RTSENA; | 362 | txctl->flags |= ATH9K_TXDESC_RTSENA; |
| 363 | 363 | ||
| 364 | /* | 364 | /* |
| 365 | * Setup for rate calculations. | 365 | * Setup for rate calculations. |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index e2581229d8b2..23fed3298962 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
| @@ -474,8 +474,8 @@ static void iwl4965_apm_stop(struct iwl_priv *priv) | |||
| 474 | iwl_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); | 474 | iwl_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); |
| 475 | 475 | ||
| 476 | udelay(10); | 476 | udelay(10); |
| 477 | 477 | /* clear "init complete" move adapter D0A* --> D0U state */ | |
| 478 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 478 | iwl_clear_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
| 479 | spin_unlock_irqrestore(&priv->lock, flags); | 479 | spin_unlock_irqrestore(&priv->lock, flags); |
| 480 | } | 480 | } |
| 481 | 481 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index cbc01a00eaf4..b08036a9d894 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
| @@ -145,7 +145,8 @@ static void iwl5000_apm_stop(struct iwl_priv *priv) | |||
| 145 | 145 | ||
| 146 | udelay(10); | 146 | udelay(10); |
| 147 | 147 | ||
| 148 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 148 | /* clear "init complete" move adapter D0A* --> D0U state */ |
| 149 | iwl_clear_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | ||
| 149 | 150 | ||
| 150 | spin_unlock_irqrestore(&priv->lock, flags); | 151 | spin_unlock_irqrestore(&priv->lock, flags); |
| 151 | } | 152 | } |
| @@ -577,14 +578,11 @@ static int iwl5000_load_section(struct iwl_priv *priv, | |||
| 577 | FH_TFDIB_CTRL0_REG(FH_SRVC_CHNL), | 578 | FH_TFDIB_CTRL0_REG(FH_SRVC_CHNL), |
| 578 | phy_addr & FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK); | 579 | phy_addr & FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK); |
| 579 | 580 | ||
| 580 | /* FIME: write the MSB of the phy_addr in CTRL1 | ||
| 581 | * iwl_write_direct32(priv, | ||
| 582 | IWL_FH_TFDIB_CTRL1_REG(IWL_FH_SRVC_CHNL), | ||
| 583 | ((phy_addr & MSB_MSK) | ||
| 584 | << FH_MEM_TFDIB_REG1_ADDR_BITSHIFT) | byte_count); | ||
| 585 | */ | ||
| 586 | iwl_write_direct32(priv, | 581 | iwl_write_direct32(priv, |
| 587 | FH_TFDIB_CTRL1_REG(FH_SRVC_CHNL), byte_cnt); | 582 | FH_TFDIB_CTRL1_REG(FH_SRVC_CHNL), |
| 583 | (iwl_get_dma_hi_address(phy_addr) | ||
| 584 | << FH_MEM_TFDIB_REG1_ADDR_BITSHIFT) | byte_cnt); | ||
| 585 | |||
| 588 | iwl_write_direct32(priv, | 586 | iwl_write_direct32(priv, |
| 589 | FH_TCSR_CHNL_TX_BUF_STS_REG(FH_SRVC_CHNL), | 587 | FH_TCSR_CHNL_TX_BUF_STS_REG(FH_SRVC_CHNL), |
| 590 | 1 << FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM | | 588 | 1 << FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM | |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 754fef5b592f..90a2b6dee7c0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
| @@ -1153,7 +1153,8 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv, | |||
| 1153 | !sta->ht_info.ht_supported) | 1153 | !sta->ht_info.ht_supported) |
| 1154 | return -1; | 1154 | return -1; |
| 1155 | 1155 | ||
| 1156 | if (priv->current_ht_config.tx_mimo_ps_mode == IWL_MIMO_PS_STATIC) | 1156 | if (((sta->ht_info.cap & IEEE80211_HT_CAP_MIMO_PS) >> 2) |
| 1157 | == IWL_MIMO_PS_STATIC) | ||
| 1157 | return -1; | 1158 | return -1; |
| 1158 | 1159 | ||
| 1159 | /* Need both Tx chains/antennas to support MIMO */ | 1160 | /* Need both Tx chains/antennas to support MIMO */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 061ffba9c884..e01f048a02dd 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -181,14 +181,14 @@ static int iwl4965_check_rxon_cmd(struct iwl_rxon_cmd *rxon) | |||
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | /** | 183 | /** |
| 184 | * iwl4965_full_rxon_required - check if full RXON (vs RXON_ASSOC) cmd is needed | 184 | * iwl_full_rxon_required - check if full RXON (vs RXON_ASSOC) cmd is needed |
| 185 | * @priv: staging_rxon is compared to active_rxon | 185 | * @priv: staging_rxon is compared to active_rxon |
| 186 | * | 186 | * |
| 187 | * If the RXON structure is changing enough to require a new tune, | 187 | * If the RXON structure is changing enough to require a new tune, |
| 188 | * or is clearing the RXON_FILTER_ASSOC_MSK, then return 1 to indicate that | 188 | * or is clearing the RXON_FILTER_ASSOC_MSK, then return 1 to indicate that |
| 189 | * a new tune (full RXON command, rather than RXON_ASSOC cmd) is required. | 189 | * a new tune (full RXON command, rather than RXON_ASSOC cmd) is required. |
| 190 | */ | 190 | */ |
| 191 | static int iwl4965_full_rxon_required(struct iwl_priv *priv) | 191 | static int iwl_full_rxon_required(struct iwl_priv *priv) |
| 192 | { | 192 | { |
| 193 | 193 | ||
| 194 | /* These items are only settable from the full RXON command */ | 194 | /* These items are only settable from the full RXON command */ |
| @@ -207,7 +207,6 @@ static int iwl4965_full_rxon_required(struct iwl_priv *priv) | |||
| 207 | priv->active_rxon.ofdm_ht_single_stream_basic_rates) || | 207 | priv->active_rxon.ofdm_ht_single_stream_basic_rates) || |
| 208 | (priv->staging_rxon.ofdm_ht_dual_stream_basic_rates != | 208 | (priv->staging_rxon.ofdm_ht_dual_stream_basic_rates != |
| 209 | priv->active_rxon.ofdm_ht_dual_stream_basic_rates) || | 209 | priv->active_rxon.ofdm_ht_dual_stream_basic_rates) || |
| 210 | (priv->staging_rxon.rx_chain != priv->active_rxon.rx_chain) || | ||
| 211 | (priv->staging_rxon.assoc_id != priv->active_rxon.assoc_id)) | 210 | (priv->staging_rxon.assoc_id != priv->active_rxon.assoc_id)) |
| 212 | return 1; | 211 | return 1; |
| 213 | 212 | ||
| @@ -263,7 +262,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv) | |||
| 263 | /* If we don't need to send a full RXON, we can use | 262 | /* If we don't need to send a full RXON, we can use |
| 264 | * iwl4965_rxon_assoc_cmd which is used to reconfigure filter | 263 | * iwl4965_rxon_assoc_cmd which is used to reconfigure filter |
| 265 | * and other flags for the current radio configuration. */ | 264 | * and other flags for the current radio configuration. */ |
| 266 | if (!iwl4965_full_rxon_required(priv)) { | 265 | if (!iwl_full_rxon_required(priv)) { |
| 267 | ret = iwl_send_rxon_assoc(priv); | 266 | ret = iwl_send_rxon_assoc(priv); |
| 268 | if (ret) { | 267 | if (ret) { |
| 269 | IWL_ERROR("Error setting RXON_ASSOC (%d)\n", ret); | 268 | IWL_ERROR("Error setting RXON_ASSOC (%d)\n", ret); |
| @@ -587,8 +586,6 @@ static void iwl4965_ht_conf(struct iwl_priv *priv, | |||
| 587 | iwl_conf->supported_chan_width = 0; | 586 | iwl_conf->supported_chan_width = 0; |
| 588 | } | 587 | } |
| 589 | 588 | ||
| 590 | iwl_conf->tx_mimo_ps_mode = | ||
| 591 | (u8)((ht_conf->cap & IEEE80211_HT_CAP_MIMO_PS) >> 2); | ||
| 592 | memcpy(iwl_conf->supp_mcs_set, ht_conf->supp_mcs_set, 16); | 589 | memcpy(iwl_conf->supp_mcs_set, ht_conf->supp_mcs_set, 16); |
| 593 | 590 | ||
| 594 | iwl_conf->control_channel = ht_bss_conf->primary_channel; | 591 | iwl_conf->control_channel = ht_bss_conf->primary_channel; |
| @@ -2190,7 +2187,10 @@ static void __iwl4965_down(struct iwl_priv *priv) | |||
| 2190 | udelay(5); | 2187 | udelay(5); |
| 2191 | 2188 | ||
| 2192 | /* FIXME: apm_ops.suspend(priv) */ | 2189 | /* FIXME: apm_ops.suspend(priv) */ |
| 2193 | priv->cfg->ops->lib->apm_ops.reset(priv); | 2190 | if (exit_pending || test_bit(STATUS_IN_SUSPEND, &priv->status)) |
| 2191 | priv->cfg->ops->lib->apm_ops.stop(priv); | ||
| 2192 | else | ||
| 2193 | priv->cfg->ops->lib->apm_ops.reset(priv); | ||
| 2194 | priv->cfg->ops->lib->free_shared_mem(priv); | 2194 | priv->cfg->ops->lib->free_shared_mem(priv); |
| 2195 | 2195 | ||
| 2196 | exit: | 2196 | exit: |
| @@ -2602,6 +2602,7 @@ static int iwl4965_mac_start(struct ieee80211_hw *hw) | |||
| 2602 | { | 2602 | { |
| 2603 | struct iwl_priv *priv = hw->priv; | 2603 | struct iwl_priv *priv = hw->priv; |
| 2604 | int ret; | 2604 | int ret; |
| 2605 | u16 pci_cmd; | ||
| 2605 | 2606 | ||
| 2606 | IWL_DEBUG_MAC80211("enter\n"); | 2607 | IWL_DEBUG_MAC80211("enter\n"); |
| 2607 | 2608 | ||
| @@ -2612,6 +2613,13 @@ static int iwl4965_mac_start(struct ieee80211_hw *hw) | |||
| 2612 | pci_restore_state(priv->pci_dev); | 2613 | pci_restore_state(priv->pci_dev); |
| 2613 | pci_enable_msi(priv->pci_dev); | 2614 | pci_enable_msi(priv->pci_dev); |
| 2614 | 2615 | ||
| 2616 | /* enable interrupts if needed: hw bug w/a */ | ||
| 2617 | pci_read_config_word(priv->pci_dev, PCI_COMMAND, &pci_cmd); | ||
| 2618 | if (pci_cmd & PCI_COMMAND_INTX_DISABLE) { | ||
| 2619 | pci_cmd &= ~PCI_COMMAND_INTX_DISABLE; | ||
| 2620 | pci_write_config_word(priv->pci_dev, PCI_COMMAND, pci_cmd); | ||
| 2621 | } | ||
| 2622 | |||
| 2615 | ret = request_irq(priv->pci_dev->irq, iwl4965_isr, IRQF_SHARED, | 2623 | ret = request_irq(priv->pci_dev->irq, iwl4965_isr, IRQF_SHARED, |
| 2616 | DRV_NAME, priv); | 2624 | DRV_NAME, priv); |
| 2617 | if (ret) { | 2625 | if (ret) { |
| @@ -3580,7 +3588,7 @@ static int iwl4965_mac_beacon_update(struct ieee80211_hw *hw, struct sk_buff *sk | |||
| 3580 | 3588 | ||
| 3581 | priv->assoc_id = 0; | 3589 | priv->assoc_id = 0; |
| 3582 | timestamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; | 3590 | timestamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; |
| 3583 | priv->timestamp = le64_to_cpu(timestamp) + (priv->beacon_int * 1000); | 3591 | priv->timestamp = le64_to_cpu(timestamp); |
| 3584 | 3592 | ||
| 3585 | IWL_DEBUG_MAC80211("leave\n"); | 3593 | IWL_DEBUG_MAC80211("leave\n"); |
| 3586 | spin_unlock_irqrestore(&priv->lock, flags); | 3594 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -4364,15 +4372,18 @@ static void __devexit iwl4965_pci_remove(struct pci_dev *pdev) | |||
| 4364 | iwl_dbgfs_unregister(priv); | 4372 | iwl_dbgfs_unregister(priv); |
| 4365 | sysfs_remove_group(&pdev->dev.kobj, &iwl4965_attribute_group); | 4373 | sysfs_remove_group(&pdev->dev.kobj, &iwl4965_attribute_group); |
| 4366 | 4374 | ||
| 4375 | /* ieee80211_unregister_hw call wil cause iwl4965_mac_stop to | ||
| 4376 | * to be called and iwl4965_down since we are removing the device | ||
| 4377 | * we need to set STATUS_EXIT_PENDING bit. | ||
| 4378 | */ | ||
| 4379 | set_bit(STATUS_EXIT_PENDING, &priv->status); | ||
| 4367 | if (priv->mac80211_registered) { | 4380 | if (priv->mac80211_registered) { |
| 4368 | ieee80211_unregister_hw(priv->hw); | 4381 | ieee80211_unregister_hw(priv->hw); |
| 4369 | priv->mac80211_registered = 0; | 4382 | priv->mac80211_registered = 0; |
| 4383 | } else { | ||
| 4384 | iwl4965_down(priv); | ||
| 4370 | } | 4385 | } |
| 4371 | 4386 | ||
| 4372 | set_bit(STATUS_EXIT_PENDING, &priv->status); | ||
| 4373 | |||
| 4374 | iwl4965_down(priv); | ||
| 4375 | |||
| 4376 | /* make sure we flush any pending irq or | 4387 | /* make sure we flush any pending irq or |
| 4377 | * tasklet for the driver | 4388 | * tasklet for the driver |
| 4378 | */ | 4389 | */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index c72f72579bea..80f2f84defa8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
| @@ -592,12 +592,11 @@ static void iwlcore_free_geos(struct iwl_priv *priv) | |||
| 592 | clear_bit(STATUS_GEO_CONFIGURED, &priv->status); | 592 | clear_bit(STATUS_GEO_CONFIGURED, &priv->status); |
| 593 | } | 593 | } |
| 594 | 594 | ||
| 595 | static u8 is_single_rx_stream(struct iwl_priv *priv) | 595 | static bool is_single_rx_stream(struct iwl_priv *priv) |
| 596 | { | 596 | { |
| 597 | return !priv->current_ht_config.is_ht || | 597 | return !priv->current_ht_config.is_ht || |
| 598 | ((priv->current_ht_config.supp_mcs_set[1] == 0) && | 598 | ((priv->current_ht_config.supp_mcs_set[1] == 0) && |
| 599 | (priv->current_ht_config.supp_mcs_set[2] == 0)) || | 599 | (priv->current_ht_config.supp_mcs_set[2] == 0)); |
| 600 | priv->ps_mode == IWL_MIMO_PS_STATIC; | ||
| 601 | } | 600 | } |
| 602 | 601 | ||
| 603 | static u8 iwl_is_channel_extension(struct iwl_priv *priv, | 602 | static u8 iwl_is_channel_extension(struct iwl_priv *priv, |
| @@ -704,33 +703,39 @@ EXPORT_SYMBOL(iwl_set_rxon_ht); | |||
| 704 | * MIMO (dual stream) requires at least 2, but works better with 3. | 703 | * MIMO (dual stream) requires at least 2, but works better with 3. |
| 705 | * This does not determine *which* chains to use, just how many. | 704 | * This does not determine *which* chains to use, just how many. |
| 706 | */ | 705 | */ |
| 707 | static int iwlcore_get_rx_chain_counter(struct iwl_priv *priv, | 706 | static int iwl_get_active_rx_chain_count(struct iwl_priv *priv) |
| 708 | u8 *idle_state, u8 *rx_state) | ||
| 709 | { | 707 | { |
| 710 | u8 is_single = is_single_rx_stream(priv); | 708 | bool is_single = is_single_rx_stream(priv); |
| 711 | u8 is_cam = test_bit(STATUS_POWER_PMI, &priv->status) ? 0 : 1; | 709 | bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->status); |
| 712 | 710 | ||
| 713 | /* # of Rx chains to use when expecting MIMO. */ | 711 | /* # of Rx chains to use when expecting MIMO. */ |
| 714 | if (is_single || (!is_cam && (priv->ps_mode == IWL_MIMO_PS_STATIC))) | 712 | if (is_single || (!is_cam && (priv->ps_mode == IWL_MIMO_PS_STATIC))) |
| 715 | *rx_state = 2; | 713 | return 2; |
| 716 | else | 714 | else |
| 717 | *rx_state = 3; | 715 | return 3; |
| 716 | } | ||
| 718 | 717 | ||
| 718 | static int iwl_get_idle_rx_chain_count(struct iwl_priv *priv, int active_cnt) | ||
| 719 | { | ||
| 720 | int idle_cnt; | ||
| 721 | bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->status); | ||
| 719 | /* # Rx chains when idling and maybe trying to save power */ | 722 | /* # Rx chains when idling and maybe trying to save power */ |
| 720 | switch (priv->ps_mode) { | 723 | switch (priv->ps_mode) { |
| 721 | case IWL_MIMO_PS_STATIC: | 724 | case IWL_MIMO_PS_STATIC: |
| 722 | case IWL_MIMO_PS_DYNAMIC: | 725 | case IWL_MIMO_PS_DYNAMIC: |
| 723 | *idle_state = (is_cam) ? 2 : 1; | 726 | idle_cnt = (is_cam) ? 2 : 1; |
| 724 | break; | 727 | break; |
| 725 | case IWL_MIMO_PS_NONE: | 728 | case IWL_MIMO_PS_NONE: |
| 726 | *idle_state = (is_cam) ? *rx_state : 1; | 729 | idle_cnt = (is_cam) ? active_cnt : 1; |
| 727 | break; | 730 | break; |
| 731 | case IWL_MIMO_PS_INVALID: | ||
| 728 | default: | 732 | default: |
| 729 | *idle_state = 1; | 733 | IWL_ERROR("invalide mimo ps mode %d\n", priv->ps_mode); |
| 734 | WARN_ON(1); | ||
| 735 | idle_cnt = -1; | ||
| 730 | break; | 736 | break; |
| 731 | } | 737 | } |
| 732 | 738 | return idle_cnt; | |
| 733 | return 0; | ||
| 734 | } | 739 | } |
| 735 | 740 | ||
| 736 | /** | 741 | /** |
| @@ -741,34 +746,44 @@ static int iwlcore_get_rx_chain_counter(struct iwl_priv *priv, | |||
| 741 | */ | 746 | */ |
| 742 | void iwl_set_rxon_chain(struct iwl_priv *priv) | 747 | void iwl_set_rxon_chain(struct iwl_priv *priv) |
| 743 | { | 748 | { |
| 744 | u8 is_single = is_single_rx_stream(priv); | 749 | bool is_single = is_single_rx_stream(priv); |
| 745 | u8 idle_state, rx_state; | 750 | bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->status); |
| 746 | 751 | u8 idle_rx_cnt, active_rx_cnt; | |
| 747 | priv->staging_rxon.rx_chain = 0; | 752 | u16 rx_chain; |
| 748 | rx_state = idle_state = 3; | ||
| 749 | 753 | ||
| 750 | /* Tell uCode which antennas are actually connected. | 754 | /* Tell uCode which antennas are actually connected. |
| 751 | * Before first association, we assume all antennas are connected. | 755 | * Before first association, we assume all antennas are connected. |
| 752 | * Just after first association, iwl_chain_noise_calibration() | 756 | * Just after first association, iwl_chain_noise_calibration() |
| 753 | * checks which antennas actually *are* connected. */ | 757 | * checks which antennas actually *are* connected. */ |
| 754 | priv->staging_rxon.rx_chain |= | 758 | rx_chain = priv->hw_params.valid_rx_ant << RXON_RX_CHAIN_VALID_POS; |
| 755 | cpu_to_le16(priv->hw_params.valid_rx_ant << | ||
| 756 | RXON_RX_CHAIN_VALID_POS); | ||
| 757 | 759 | ||
| 758 | /* How many receivers should we use? */ | 760 | /* How many receivers should we use? */ |
| 759 | iwlcore_get_rx_chain_counter(priv, &idle_state, &rx_state); | 761 | active_rx_cnt = iwl_get_active_rx_chain_count(priv); |
| 760 | priv->staging_rxon.rx_chain |= | 762 | idle_rx_cnt = iwl_get_idle_rx_chain_count(priv, active_rx_cnt); |
| 761 | cpu_to_le16(rx_state << RXON_RX_CHAIN_MIMO_CNT_POS); | 763 | |
| 762 | priv->staging_rxon.rx_chain |= | 764 | /* correct rx chain count accoridng hw settings */ |
| 763 | cpu_to_le16(idle_state << RXON_RX_CHAIN_CNT_POS); | 765 | if (priv->hw_params.rx_chains_num < active_rx_cnt) |
| 764 | 766 | active_rx_cnt = priv->hw_params.rx_chains_num; | |
| 765 | if (!is_single && (rx_state >= 2) && | 767 | |
| 766 | !test_bit(STATUS_POWER_PMI, &priv->status)) | 768 | if (priv->hw_params.rx_chains_num < idle_rx_cnt) |
| 769 | idle_rx_cnt = priv->hw_params.rx_chains_num; | ||
| 770 | |||
| 771 | rx_chain |= active_rx_cnt << RXON_RX_CHAIN_MIMO_CNT_POS; | ||
| 772 | rx_chain |= idle_rx_cnt << RXON_RX_CHAIN_CNT_POS; | ||
| 773 | |||
| 774 | priv->staging_rxon.rx_chain = cpu_to_le16(rx_chain); | ||
| 775 | |||
| 776 | if (!is_single && (active_rx_cnt >= 2) && is_cam) | ||
| 767 | priv->staging_rxon.rx_chain |= RXON_RX_CHAIN_MIMO_FORCE_MSK; | 777 | priv->staging_rxon.rx_chain |= RXON_RX_CHAIN_MIMO_FORCE_MSK; |
| 768 | else | 778 | else |
| 769 | priv->staging_rxon.rx_chain &= ~RXON_RX_CHAIN_MIMO_FORCE_MSK; | 779 | priv->staging_rxon.rx_chain &= ~RXON_RX_CHAIN_MIMO_FORCE_MSK; |
| 770 | 780 | ||
| 771 | IWL_DEBUG_ASSOC("rx chain %X\n", priv->staging_rxon.rx_chain); | 781 | IWL_DEBUG_ASSOC("rx_chain=0x%Xi active=%d idle=%d\n", |
| 782 | priv->staging_rxon.rx_chain, | ||
| 783 | active_rx_cnt, idle_rx_cnt); | ||
| 784 | |||
| 785 | WARN_ON(active_rx_cnt == 0 || idle_rx_cnt == 0 || | ||
| 786 | active_rx_cnt < idle_rx_cnt); | ||
| 772 | } | 787 | } |
| 773 | EXPORT_SYMBOL(iwl_set_rxon_chain); | 788 | EXPORT_SYMBOL(iwl_set_rxon_chain); |
| 774 | 789 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index c19db438306c..cdfb343c7ec6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
| @@ -412,7 +412,6 @@ struct iwl_ht_info { | |||
| 412 | /* self configuration data */ | 412 | /* self configuration data */ |
| 413 | u8 is_ht; | 413 | u8 is_ht; |
| 414 | u8 supported_chan_width; | 414 | u8 supported_chan_width; |
| 415 | u16 tx_mimo_ps_mode; | ||
| 416 | u8 is_green_field; | 415 | u8 is_green_field; |
| 417 | u8 sgf; /* HT_SHORT_GI_* short guard interval */ | 416 | u8 sgf; /* HT_SHORT_GI_* short guard interval */ |
| 418 | u8 max_amsdu_size; | 417 | u8 max_amsdu_size; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-fh.h b/drivers/net/wireless/iwlwifi/iwl-fh.h index 944642450d3d..cd11c0ca2991 100644 --- a/drivers/net/wireless/iwlwifi/iwl-fh.h +++ b/drivers/net/wireless/iwlwifi/iwl-fh.h | |||
| @@ -287,6 +287,7 @@ | |||
| 287 | 287 | ||
| 288 | #define FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE (0x01000000) | 288 | #define FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE (0x01000000) |
| 289 | 289 | ||
| 290 | #define FH_MEM_TFDIB_REG1_ADDR_BITSHIFT 28 | ||
| 290 | 291 | ||
| 291 | /** | 292 | /** |
| 292 | * Transmit DMA Channel Control/Status Registers (TCSR) | 293 | * Transmit DMA Channel Control/Status Registers (TCSR) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index f3f6ea49fdd2..e81bfc42a7cb 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
| @@ -1173,7 +1173,10 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, | |||
| 1173 | 1173 | ||
| 1174 | rx_status.antenna = 0; | 1174 | rx_status.antenna = 0; |
| 1175 | rx_status.flag = 0; | 1175 | rx_status.flag = 0; |
| 1176 | rx_status.flag |= RX_FLAG_TSFT; | 1176 | |
| 1177 | /* TSF isn't reliable. In order to allow smooth user experience, | ||
| 1178 | * this W/A doesn't propagate it to the mac80211 */ | ||
| 1179 | /*rx_status.flag |= RX_FLAG_TSFT;*/ | ||
| 1177 | 1180 | ||
| 1178 | if ((unlikely(rx_start->cfg_phy_cnt > 20))) { | 1181 | if ((unlikely(rx_start->cfg_phy_cnt > 20))) { |
| 1179 | IWL_DEBUG_DROP("dsp size out of range [0,20]: %d/n", | 1182 | IWL_DEBUG_DROP("dsp size out of range [0,20]: %d/n", |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 9bb6adb28b73..6c8ac3a87d54 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
| @@ -421,7 +421,7 @@ static int iwl_get_channels_for_scan(struct iwl_priv *priv, | |||
| 421 | else | 421 | else |
| 422 | scan_ch->type = SCAN_CHANNEL_TYPE_ACTIVE; | 422 | scan_ch->type = SCAN_CHANNEL_TYPE_ACTIVE; |
| 423 | 423 | ||
| 424 | if ((scan_ch->type & SCAN_CHANNEL_TYPE_ACTIVE) && n_probes) | 424 | if (n_probes) |
| 425 | scan_ch->type |= IWL_SCAN_PROBE_MASK(n_probes); | 425 | scan_ch->type |= IWL_SCAN_PROBE_MASK(n_probes); |
| 426 | 426 | ||
| 427 | scan_ch->active_dwell = cpu_to_le16(active_dwell); | 427 | scan_ch->active_dwell = cpu_to_le16(active_dwell); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index d82823b5c8ab..78b1a7a4ca40 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
| @@ -402,12 +402,11 @@ static int iwl_hw_tx_queue_init(struct iwl_priv *priv, | |||
| 402 | /** | 402 | /** |
| 403 | * iwl_tx_queue_init - Allocate and initialize one tx/cmd queue | 403 | * iwl_tx_queue_init - Allocate and initialize one tx/cmd queue |
| 404 | */ | 404 | */ |
| 405 | static int iwl_tx_queue_init(struct iwl_priv *priv, | 405 | static int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq, |
| 406 | struct iwl_tx_queue *txq, | ||
| 407 | int slots_num, u32 txq_id) | 406 | int slots_num, u32 txq_id) |
| 408 | { | 407 | { |
| 409 | int i, len; | 408 | int i, len; |
| 410 | int rc = 0; | 409 | int ret; |
| 411 | 410 | ||
| 412 | /* | 411 | /* |
| 413 | * Alloc buffer array for commands (Tx or other types of commands). | 412 | * Alloc buffer array for commands (Tx or other types of commands). |
| @@ -426,19 +425,16 @@ static int iwl_tx_queue_init(struct iwl_priv *priv, | |||
| 426 | continue; | 425 | continue; |
| 427 | } | 426 | } |
| 428 | 427 | ||
| 429 | txq->cmd[i] = kmalloc(len, GFP_KERNEL | GFP_DMA); | 428 | txq->cmd[i] = kmalloc(len, GFP_KERNEL); |
| 430 | if (!txq->cmd[i]) | 429 | if (!txq->cmd[i]) |
| 431 | return -ENOMEM; | 430 | goto err; |
| 432 | } | 431 | } |
| 433 | 432 | ||
| 434 | /* Alloc driver data array and TFD circular buffer */ | 433 | /* Alloc driver data array and TFD circular buffer */ |
| 435 | rc = iwl_tx_queue_alloc(priv, txq, txq_id); | 434 | ret = iwl_tx_queue_alloc(priv, txq, txq_id); |
| 436 | if (rc) { | 435 | if (ret) |
| 437 | for (i = 0; i < slots_num; i++) | 436 | goto err; |
| 438 | kfree(txq->cmd[i]); | ||
| 439 | 437 | ||
| 440 | return -ENOMEM; | ||
| 441 | } | ||
| 442 | txq->need_update = 0; | 438 | txq->need_update = 0; |
| 443 | 439 | ||
| 444 | /* TFD_QUEUE_SIZE_MAX must be power-of-two size, otherwise | 440 | /* TFD_QUEUE_SIZE_MAX must be power-of-two size, otherwise |
| @@ -452,6 +448,17 @@ static int iwl_tx_queue_init(struct iwl_priv *priv, | |||
| 452 | iwl_hw_tx_queue_init(priv, txq); | 448 | iwl_hw_tx_queue_init(priv, txq); |
| 453 | 449 | ||
| 454 | return 0; | 450 | return 0; |
| 451 | err: | ||
| 452 | for (i = 0; i < slots_num; i++) { | ||
| 453 | kfree(txq->cmd[i]); | ||
| 454 | txq->cmd[i] = NULL; | ||
| 455 | } | ||
| 456 | |||
| 457 | if (txq_id == IWL_CMD_QUEUE_NUM) { | ||
| 458 | kfree(txq->cmd[slots_num]); | ||
| 459 | txq->cmd[slots_num] = NULL; | ||
| 460 | } | ||
| 461 | return -ENOMEM; | ||
| 455 | } | 462 | } |
| 456 | /** | 463 | /** |
| 457 | * iwl_hw_txq_ctx_free - Free TXQ Context | 464 | * iwl_hw_txq_ctx_free - Free TXQ Context |
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c index 04d7a251e3f0..8941919001bb 100644 --- a/drivers/net/wireless/libertas/if_cs.c +++ b/drivers/net/wireless/libertas/if_cs.c | |||
| @@ -595,7 +595,7 @@ static int if_cs_prog_helper(struct if_cs_card *card) | |||
| 595 | if (ret < 0) { | 595 | if (ret < 0) { |
| 596 | lbs_pr_err("can't download helper at 0x%x, ret %d\n", | 596 | lbs_pr_err("can't download helper at 0x%x, ret %d\n", |
| 597 | sent, ret); | 597 | sent, ret); |
| 598 | goto done; | 598 | goto err_release; |
| 599 | } | 599 | } |
| 600 | 600 | ||
| 601 | if (count == 0) | 601 | if (count == 0) |
| @@ -604,9 +604,8 @@ static int if_cs_prog_helper(struct if_cs_card *card) | |||
| 604 | sent += count; | 604 | sent += count; |
| 605 | } | 605 | } |
| 606 | 606 | ||
| 607 | err_release: | ||
| 607 | release_firmware(fw); | 608 | release_firmware(fw); |
| 608 | ret = 0; | ||
| 609 | |||
| 610 | done: | 609 | done: |
| 611 | lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret); | 610 | lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret); |
| 612 | return ret; | 611 | return ret; |
| @@ -676,14 +675,8 @@ static int if_cs_prog_real(struct if_cs_card *card) | |||
| 676 | } | 675 | } |
| 677 | 676 | ||
| 678 | ret = if_cs_poll_while_fw_download(card, IF_CS_SCRATCH, 0x5a); | 677 | ret = if_cs_poll_while_fw_download(card, IF_CS_SCRATCH, 0x5a); |
| 679 | if (ret < 0) { | 678 | if (ret < 0) |
| 680 | lbs_pr_err("firmware download failed\n"); | 679 | lbs_pr_err("firmware download failed\n"); |
| 681 | goto err_release; | ||
| 682 | } | ||
| 683 | |||
| 684 | ret = 0; | ||
| 685 | goto done; | ||
| 686 | |||
| 687 | 680 | ||
| 688 | err_release: | 681 | err_release: |
| 689 | release_firmware(fw); | 682 | release_firmware(fw); |
diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c index 1ebcafe7ca5f..36c004e15602 100644 --- a/drivers/net/wireless/orinoco.c +++ b/drivers/net/wireless/orinoco.c | |||
| @@ -1970,6 +1970,9 @@ __orinoco_set_multicast_list(struct net_device *dev) | |||
| 1970 | priv->promiscuous = promisc; | 1970 | priv->promiscuous = promisc; |
| 1971 | } | 1971 | } |
| 1972 | 1972 | ||
| 1973 | /* If we're not in promiscuous mode, then we need to set the | ||
| 1974 | * group address if either we want to multicast, or if we were | ||
| 1975 | * multicasting and want to stop */ | ||
| 1973 | if (! promisc && (mc_count || priv->mc_count) ) { | 1976 | if (! promisc && (mc_count || priv->mc_count) ) { |
| 1974 | struct dev_mc_list *p = dev->mc_list; | 1977 | struct dev_mc_list *p = dev->mc_list; |
| 1975 | struct hermes_multicast mclist; | 1978 | struct hermes_multicast mclist; |
| @@ -1989,9 +1992,10 @@ __orinoco_set_multicast_list(struct net_device *dev) | |||
| 1989 | printk(KERN_WARNING "%s: Multicast list is " | 1992 | printk(KERN_WARNING "%s: Multicast list is " |
| 1990 | "longer than mc_count\n", dev->name); | 1993 | "longer than mc_count\n", dev->name); |
| 1991 | 1994 | ||
| 1992 | err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNFGROUPADDRESSES, | 1995 | err = hermes_write_ltv(hw, USER_BAP, |
| 1993 | HERMES_BYTES_TO_RECLEN(priv->mc_count * ETH_ALEN), | 1996 | HERMES_RID_CNFGROUPADDRESSES, |
| 1994 | &mclist); | 1997 | HERMES_BYTES_TO_RECLEN(mc_count * ETH_ALEN), |
| 1998 | &mclist); | ||
| 1995 | if (err) | 1999 | if (err) |
| 1996 | printk(KERN_ERR "%s: Error %d setting multicast list.\n", | 2000 | printk(KERN_ERR "%s: Error %d setting multicast list.\n", |
| 1997 | dev->name, err); | 2001 | dev->name, err); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00reg.h b/drivers/net/wireless/rt2x00/rt2x00reg.h index 7e88ce5651b9..2ea7866abd5d 100644 --- a/drivers/net/wireless/rt2x00/rt2x00reg.h +++ b/drivers/net/wireless/rt2x00/rt2x00reg.h | |||
| @@ -136,7 +136,7 @@ struct rt2x00_field32 { | |||
| 136 | */ | 136 | */ |
| 137 | #define is_power_of_two(x) ( !((x) & ((x)-1)) ) | 137 | #define is_power_of_two(x) ( !((x) & ((x)-1)) ) |
| 138 | #define low_bit_mask(x) ( ((x)-1) & ~(x) ) | 138 | #define low_bit_mask(x) ( ((x)-1) & ~(x) ) |
| 139 | #define is_valid_mask(x) is_power_of_two(1 + (x) + low_bit_mask(x)) | 139 | #define is_valid_mask(x) is_power_of_two(1LU + (x) + low_bit_mask(x)) |
| 140 | 140 | ||
| 141 | /* | 141 | /* |
| 142 | * Macro's to find first set bit in a variable. | 142 | * Macro's to find first set bit in a variable. |
| @@ -173,8 +173,7 @@ struct rt2x00_field32 { | |||
| 173 | * does not exceed the given typelimit. | 173 | * does not exceed the given typelimit. |
| 174 | */ | 174 | */ |
| 175 | #define FIELD_CHECK(__mask, __type) \ | 175 | #define FIELD_CHECK(__mask, __type) \ |
| 176 | BUILD_BUG_ON(!__builtin_constant_p(__mask) || \ | 176 | BUILD_BUG_ON(!(__mask) || \ |
| 177 | !(__mask) || \ | ||
| 178 | !is_valid_mask(__mask) || \ | 177 | !is_valid_mask(__mask) || \ |
| 179 | (__mask) != (__type)(__mask)) \ | 178 | (__mask) != (__type)(__mask)) \ |
| 180 | 179 | ||
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 6ea349aba3ba..b184367637d0 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
| @@ -800,7 +800,6 @@ static void __exit cmos_do_remove(struct device *dev) | |||
| 800 | static int cmos_suspend(struct device *dev, pm_message_t mesg) | 800 | static int cmos_suspend(struct device *dev, pm_message_t mesg) |
| 801 | { | 801 | { |
| 802 | struct cmos_rtc *cmos = dev_get_drvdata(dev); | 802 | struct cmos_rtc *cmos = dev_get_drvdata(dev); |
| 803 | int do_wake = device_may_wakeup(dev); | ||
| 804 | unsigned char tmp; | 803 | unsigned char tmp; |
| 805 | 804 | ||
| 806 | /* only the alarm might be a wakeup event source */ | 805 | /* only the alarm might be a wakeup event source */ |
| @@ -809,7 +808,7 @@ static int cmos_suspend(struct device *dev, pm_message_t mesg) | |||
| 809 | if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) { | 808 | if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) { |
| 810 | unsigned char mask; | 809 | unsigned char mask; |
| 811 | 810 | ||
| 812 | if (do_wake) | 811 | if (device_may_wakeup(dev)) |
| 813 | mask = RTC_IRQMASK & ~RTC_AIE; | 812 | mask = RTC_IRQMASK & ~RTC_AIE; |
| 814 | else | 813 | else |
| 815 | mask = RTC_IRQMASK; | 814 | mask = RTC_IRQMASK; |
| @@ -837,6 +836,17 @@ static int cmos_suspend(struct device *dev, pm_message_t mesg) | |||
| 837 | return 0; | 836 | return 0; |
| 838 | } | 837 | } |
| 839 | 838 | ||
| 839 | /* We want RTC alarms to wake us from e.g. ACPI G2/S5 "soft off", even | ||
| 840 | * after a detour through G3 "mechanical off", although the ACPI spec | ||
| 841 | * says wakeup should only work from G1/S4 "hibernate". To most users, | ||
| 842 | * distinctions between S4 and S5 are pointless. So when the hardware | ||
| 843 | * allows, don't draw that distinction. | ||
| 844 | */ | ||
| 845 | static inline int cmos_poweroff(struct device *dev) | ||
| 846 | { | ||
| 847 | return cmos_suspend(dev, PMSG_HIBERNATE); | ||
| 848 | } | ||
| 849 | |||
| 840 | static int cmos_resume(struct device *dev) | 850 | static int cmos_resume(struct device *dev) |
| 841 | { | 851 | { |
| 842 | struct cmos_rtc *cmos = dev_get_drvdata(dev); | 852 | struct cmos_rtc *cmos = dev_get_drvdata(dev); |
| @@ -884,6 +894,12 @@ static int cmos_resume(struct device *dev) | |||
| 884 | #else | 894 | #else |
| 885 | #define cmos_suspend NULL | 895 | #define cmos_suspend NULL |
| 886 | #define cmos_resume NULL | 896 | #define cmos_resume NULL |
| 897 | |||
| 898 | static inline int cmos_poweroff(struct device *dev) | ||
| 899 | { | ||
| 900 | return -ENOSYS; | ||
| 901 | } | ||
| 902 | |||
| 887 | #endif | 903 | #endif |
| 888 | 904 | ||
| 889 | /*----------------------------------------------------------------*/ | 905 | /*----------------------------------------------------------------*/ |
| @@ -903,10 +919,6 @@ static int cmos_resume(struct device *dev) | |||
| 903 | static int __devinit | 919 | static int __devinit |
| 904 | cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) | 920 | cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) |
| 905 | { | 921 | { |
| 906 | /* REVISIT paranoia argues for a shutdown notifier, since PNP | ||
| 907 | * drivers can't provide shutdown() methods to disable IRQs. | ||
| 908 | * Or better yet, fix PNP to allow those methods... | ||
| 909 | */ | ||
| 910 | if (pnp_port_start(pnp,0) == 0x70 && !pnp_irq_valid(pnp,0)) | 922 | if (pnp_port_start(pnp,0) == 0x70 && !pnp_irq_valid(pnp,0)) |
| 911 | /* Some machines contain a PNP entry for the RTC, but | 923 | /* Some machines contain a PNP entry for the RTC, but |
| 912 | * don't define the IRQ. It should always be safe to | 924 | * don't define the IRQ. It should always be safe to |
| @@ -942,6 +954,13 @@ static int cmos_pnp_resume(struct pnp_dev *pnp) | |||
| 942 | #define cmos_pnp_resume NULL | 954 | #define cmos_pnp_resume NULL |
| 943 | #endif | 955 | #endif |
| 944 | 956 | ||
| 957 | static void cmos_pnp_shutdown(struct device *pdev) | ||
| 958 | { | ||
| 959 | if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(pdev)) | ||
| 960 | return; | ||
| 961 | |||
| 962 | cmos_do_shutdown(); | ||
| 963 | } | ||
| 945 | 964 | ||
| 946 | static const struct pnp_device_id rtc_ids[] = { | 965 | static const struct pnp_device_id rtc_ids[] = { |
| 947 | { .id = "PNP0b00", }, | 966 | { .id = "PNP0b00", }, |
| @@ -961,6 +980,10 @@ static struct pnp_driver cmos_pnp_driver = { | |||
| 961 | .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, | 980 | .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, |
| 962 | .suspend = cmos_pnp_suspend, | 981 | .suspend = cmos_pnp_suspend, |
| 963 | .resume = cmos_pnp_resume, | 982 | .resume = cmos_pnp_resume, |
| 983 | .driver = { | ||
| 984 | .name = (char *)driver_name, | ||
| 985 | .shutdown = cmos_pnp_shutdown, | ||
| 986 | } | ||
| 964 | }; | 987 | }; |
| 965 | 988 | ||
| 966 | #endif /* CONFIG_PNP */ | 989 | #endif /* CONFIG_PNP */ |
| @@ -986,6 +1009,9 @@ static int __exit cmos_platform_remove(struct platform_device *pdev) | |||
| 986 | 1009 | ||
| 987 | static void cmos_platform_shutdown(struct platform_device *pdev) | 1010 | static void cmos_platform_shutdown(struct platform_device *pdev) |
| 988 | { | 1011 | { |
| 1012 | if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(&pdev->dev)) | ||
| 1013 | return; | ||
| 1014 | |||
| 989 | cmos_do_shutdown(); | 1015 | cmos_do_shutdown(); |
| 990 | } | 1016 | } |
| 991 | 1017 | ||
diff --git a/drivers/rtc/rtc-lib.c b/drivers/rtc/rtc-lib.c index 9f996ec881ce..dd70bf73ce9d 100644 --- a/drivers/rtc/rtc-lib.c +++ b/drivers/rtc/rtc-lib.c | |||
| @@ -51,10 +51,11 @@ EXPORT_SYMBOL(rtc_year_days); | |||
| 51 | */ | 51 | */ |
| 52 | void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) | 52 | void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) |
| 53 | { | 53 | { |
| 54 | unsigned int days, month, year; | 54 | unsigned int month, year; |
| 55 | int days; | ||
| 55 | 56 | ||
| 56 | days = time / 86400; | 57 | days = time / 86400; |
| 57 | time -= days * 86400; | 58 | time -= (unsigned int) days * 86400; |
| 58 | 59 | ||
| 59 | /* day of the week, 1970-01-01 was a Thursday */ | 60 | /* day of the week, 1970-01-01 was a Thursday */ |
| 60 | tm->tm_wday = (days + 4) % 7; | 61 | tm->tm_wday = (days + 4) % 7; |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index e5e7d7856454..2a2bc89aba83 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -1875,6 +1875,7 @@ static int sd_probe(struct device *dev) | |||
| 1875 | 1875 | ||
| 1876 | dev_set_drvdata(dev, sdkp); | 1876 | dev_set_drvdata(dev, sdkp); |
| 1877 | add_disk(gd); | 1877 | add_disk(gd); |
| 1878 | blk_register_filter(gd); | ||
| 1878 | sd_dif_config_host(sdkp); | 1879 | sd_dif_config_host(sdkp); |
| 1879 | 1880 | ||
| 1880 | sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", | 1881 | sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", |
| @@ -1908,6 +1909,7 @@ static int sd_remove(struct device *dev) | |||
| 1908 | struct scsi_disk *sdkp = dev_get_drvdata(dev); | 1909 | struct scsi_disk *sdkp = dev_get_drvdata(dev); |
| 1909 | 1910 | ||
| 1910 | device_del(&sdkp->dev); | 1911 | device_del(&sdkp->dev); |
| 1912 | blk_unregister_filter(sdkp->disk); | ||
| 1911 | del_gendisk(sdkp->disk); | 1913 | del_gendisk(sdkp->disk); |
| 1912 | sd_shutdown(dev); | 1914 | sd_shutdown(dev); |
| 1913 | 1915 | ||
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 27f5bfd1def3..3292965bfd84 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
| @@ -656,6 +656,7 @@ static int sr_probe(struct device *dev) | |||
| 656 | dev_set_drvdata(dev, cd); | 656 | dev_set_drvdata(dev, cd); |
| 657 | disk->flags |= GENHD_FL_REMOVABLE; | 657 | disk->flags |= GENHD_FL_REMOVABLE; |
| 658 | add_disk(disk); | 658 | add_disk(disk); |
| 659 | blk_register_filter(disk); | ||
| 659 | 660 | ||
| 660 | sdev_printk(KERN_DEBUG, sdev, | 661 | sdev_printk(KERN_DEBUG, sdev, |
| 661 | "Attached scsi CD-ROM %s\n", cd->cdi.name); | 662 | "Attached scsi CD-ROM %s\n", cd->cdi.name); |
| @@ -894,6 +895,7 @@ static int sr_remove(struct device *dev) | |||
| 894 | { | 895 | { |
| 895 | struct scsi_cd *cd = dev_get_drvdata(dev); | 896 | struct scsi_cd *cd = dev_get_drvdata(dev); |
| 896 | 897 | ||
| 898 | blk_unregister_filter(cd->disk); | ||
| 897 | del_gendisk(cd->disk); | 899 | del_gendisk(cd->disk); |
| 898 | 900 | ||
| 899 | mutex_lock(&sr_ref_mutex); | 901 | mutex_lock(&sr_ref_mutex); |
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 342e12fb1c25..9ccc563d8730 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
| @@ -1908,15 +1908,23 @@ static int serial8250_startup(struct uart_port *port) | |||
| 1908 | * kick the UART on a regular basis. | 1908 | * kick the UART on a regular basis. |
| 1909 | */ | 1909 | */ |
| 1910 | if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) { | 1910 | if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) { |
| 1911 | up->bugs |= UART_BUG_THRE; | ||
| 1911 | pr_debug("ttyS%d - using backup timer\n", port->line); | 1912 | pr_debug("ttyS%d - using backup timer\n", port->line); |
| 1912 | up->timer.function = serial8250_backup_timeout; | ||
| 1913 | up->timer.data = (unsigned long)up; | ||
| 1914 | mod_timer(&up->timer, jiffies + | ||
| 1915 | poll_timeout(up->port.timeout) + HZ / 5); | ||
| 1916 | } | 1913 | } |
| 1917 | } | 1914 | } |
| 1918 | 1915 | ||
| 1919 | /* | 1916 | /* |
| 1917 | * The above check will only give an accurate result the first time | ||
| 1918 | * the port is opened so this value needs to be preserved. | ||
| 1919 | */ | ||
| 1920 | if (up->bugs & UART_BUG_THRE) { | ||
| 1921 | up->timer.function = serial8250_backup_timeout; | ||
| 1922 | up->timer.data = (unsigned long)up; | ||
| 1923 | mod_timer(&up->timer, jiffies + | ||
| 1924 | poll_timeout(up->port.timeout) + HZ / 5); | ||
| 1925 | } | ||
| 1926 | |||
| 1927 | /* | ||
| 1920 | * If the "interrupt" for this port doesn't correspond with any | 1928 | * If the "interrupt" for this port doesn't correspond with any |
| 1921 | * hardware interrupt, we use a timer-based system. The original | 1929 | * hardware interrupt, we use a timer-based system. The original |
| 1922 | * driver used to do this with IRQ0. | 1930 | * driver used to do this with IRQ0. |
diff --git a/drivers/serial/8250.h b/drivers/serial/8250.h index 78c00162b04e..520260326f3d 100644 --- a/drivers/serial/8250.h +++ b/drivers/serial/8250.h | |||
| @@ -47,6 +47,7 @@ struct serial8250_config { | |||
| 47 | #define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */ | 47 | #define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */ |
| 48 | #define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */ | 48 | #define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */ |
| 49 | #define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */ | 49 | #define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */ |
| 50 | #define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */ | ||
| 50 | 51 | ||
| 51 | #define PROBE_RSA (1 << 0) | 52 | #define PROBE_RSA (1 << 0) |
| 52 | #define PROBE_ANY (~0) | 53 | #define PROBE_ANY (~0) |
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c index c14b2435d23e..e729fb279645 100644 --- a/drivers/video/cirrusfb.c +++ b/drivers/video/cirrusfb.c | |||
| @@ -628,27 +628,18 @@ static long cirrusfb_get_mclk(long freq, int bpp, long *div) | |||
| 628 | static int cirrusfb_check_var(struct fb_var_screeninfo *var, | 628 | static int cirrusfb_check_var(struct fb_var_screeninfo *var, |
| 629 | struct fb_info *info) | 629 | struct fb_info *info) |
| 630 | { | 630 | { |
| 631 | int nom, den; /* translyting from pixels->bytes */ | 631 | int yres; |
| 632 | int yres, i; | 632 | /* memory size in pixels */ |
| 633 | static struct { int xres, yres; } modes[] = | 633 | unsigned pixels = info->screen_size * 8 / var->bits_per_pixel; |
| 634 | { { 1600, 1280 }, | ||
| 635 | { 1280, 1024 }, | ||
| 636 | { 1024, 768 }, | ||
| 637 | { 800, 600 }, | ||
| 638 | { 640, 480 }, | ||
| 639 | { -1, -1 } }; | ||
| 640 | 634 | ||
| 641 | switch (var->bits_per_pixel) { | 635 | switch (var->bits_per_pixel) { |
| 642 | case 1: | 636 | case 1: |
| 643 | nom = 4; | 637 | pixels /= 4; |
| 644 | den = 8; | ||
| 645 | break; /* 8 pixel per byte, only 1/4th of mem usable */ | 638 | break; /* 8 pixel per byte, only 1/4th of mem usable */ |
| 646 | case 8: | 639 | case 8: |
| 647 | case 16: | 640 | case 16: |
| 648 | case 24: | 641 | case 24: |
| 649 | case 32: | 642 | case 32: |
| 650 | nom = var->bits_per_pixel / 8; | ||
| 651 | den = 1; | ||
| 652 | break; /* 1 pixel == 1 byte */ | 643 | break; /* 1 pixel == 1 byte */ |
| 653 | default: | 644 | default: |
| 654 | printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected..." | 645 | printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected..." |
| @@ -658,43 +649,29 @@ static int cirrusfb_check_var(struct fb_var_screeninfo *var, | |||
| 658 | return -EINVAL; | 649 | return -EINVAL; |
| 659 | } | 650 | } |
| 660 | 651 | ||
| 661 | if (var->xres * nom / den * var->yres > info->screen_size) { | 652 | if (var->xres_virtual < var->xres) |
| 662 | printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected..." | 653 | var->xres_virtual = var->xres; |
| 663 | "resolution too high to fit into video memory!\n", | ||
| 664 | var->xres, var->yres, var->bits_per_pixel); | ||
| 665 | DPRINTK("EXIT - EINVAL error\n"); | ||
| 666 | return -EINVAL; | ||
| 667 | } | ||
| 668 | |||
| 669 | /* use highest possible virtual resolution */ | 654 | /* use highest possible virtual resolution */ |
| 670 | if (var->xres_virtual == -1 && | 655 | if (var->yres_virtual == -1) { |
| 671 | var->yres_virtual == -1) { | 656 | var->yres_virtual = pixels / var->xres_virtual; |
| 672 | printk(KERN_INFO | ||
| 673 | "cirrusfb: using maximum available virtual resolution\n"); | ||
| 674 | for (i = 0; modes[i].xres != -1; i++) { | ||
| 675 | int size = modes[i].xres * nom / den * modes[i].yres; | ||
| 676 | if (size < info->screen_size / 2) | ||
| 677 | break; | ||
| 678 | } | ||
| 679 | if (modes[i].xres == -1) { | ||
| 680 | printk(KERN_ERR "cirrusfb: could not find a virtual " | ||
| 681 | "resolution that fits into video memory!!\n"); | ||
| 682 | DPRINTK("EXIT - EINVAL error\n"); | ||
| 683 | return -EINVAL; | ||
| 684 | } | ||
| 685 | var->xres_virtual = modes[i].xres; | ||
| 686 | var->yres_virtual = modes[i].yres; | ||
| 687 | 657 | ||
| 688 | printk(KERN_INFO "cirrusfb: virtual resolution set to " | 658 | printk(KERN_INFO "cirrusfb: virtual resolution set to " |
| 689 | "maximum of %dx%d\n", var->xres_virtual, | 659 | "maximum of %dx%d\n", var->xres_virtual, |
| 690 | var->yres_virtual); | 660 | var->yres_virtual); |
| 691 | } | 661 | } |
| 692 | |||
| 693 | if (var->xres_virtual < var->xres) | ||
| 694 | var->xres_virtual = var->xres; | ||
| 695 | if (var->yres_virtual < var->yres) | 662 | if (var->yres_virtual < var->yres) |
| 696 | var->yres_virtual = var->yres; | 663 | var->yres_virtual = var->yres; |
| 697 | 664 | ||
| 665 | if (var->xres_virtual * var->yres_virtual > pixels) { | ||
| 666 | printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected... " | ||
| 667 | "virtual resolution too high to fit into video memory!\n", | ||
| 668 | var->xres_virtual, var->yres_virtual, | ||
| 669 | var->bits_per_pixel); | ||
| 670 | DPRINTK("EXIT - EINVAL error\n"); | ||
| 671 | return -EINVAL; | ||
| 672 | } | ||
| 673 | |||
| 674 | |||
| 698 | if (var->xoffset < 0) | 675 | if (var->xoffset < 0) |
| 699 | var->xoffset = 0; | 676 | var->xoffset = 0; |
| 700 | if (var->yoffset < 0) | 677 | if (var->yoffset < 0) |
diff --git a/drivers/video/tdfxfb.c b/drivers/video/tdfxfb.c index 77aafcfae037..4599a4385bc9 100644 --- a/drivers/video/tdfxfb.c +++ b/drivers/video/tdfxfb.c | |||
| @@ -95,7 +95,6 @@ static inline int mtrr_del(int reg, unsigned long base, | |||
| 95 | #define VOODOO5_MAX_PIXCLOCK 350000 | 95 | #define VOODOO5_MAX_PIXCLOCK 350000 |
| 96 | 96 | ||
| 97 | static struct fb_fix_screeninfo tdfx_fix __devinitdata = { | 97 | static struct fb_fix_screeninfo tdfx_fix __devinitdata = { |
| 98 | .id = "3Dfx", | ||
| 99 | .type = FB_TYPE_PACKED_PIXELS, | 98 | .type = FB_TYPE_PACKED_PIXELS, |
| 100 | .visual = FB_VISUAL_PSEUDOCOLOR, | 99 | .visual = FB_VISUAL_PSEUDOCOLOR, |
| 101 | .ypanstep = 1, | 100 | .ypanstep = 1, |
| @@ -426,7 +425,7 @@ static unsigned long do_lfb_size(struct tdfx_par *par, unsigned short dev_id) | |||
| 426 | if (dev_id < PCI_DEVICE_ID_3DFX_VOODOO5) { | 425 | if (dev_id < PCI_DEVICE_ID_3DFX_VOODOO5) { |
| 427 | /* Banshee/Voodoo3 */ | 426 | /* Banshee/Voodoo3 */ |
| 428 | chip_size = 2; | 427 | chip_size = 2; |
| 429 | if (has_sgram && (draminit0 & DRAMINIT0_SGRAM_TYPE)) | 428 | if (has_sgram && !(draminit0 & DRAMINIT0_SGRAM_TYPE)) |
| 430 | chip_size = 1; | 429 | chip_size = 1; |
| 431 | } else { | 430 | } else { |
| 432 | /* Voodoo4/5 */ | 431 | /* Voodoo4/5 */ |
| @@ -1200,15 +1199,15 @@ static int __devinit tdfxfb_probe(struct pci_dev *pdev, | |||
| 1200 | /* Configure the default fb_fix_screeninfo first */ | 1199 | /* Configure the default fb_fix_screeninfo first */ |
| 1201 | switch (pdev->device) { | 1200 | switch (pdev->device) { |
| 1202 | case PCI_DEVICE_ID_3DFX_BANSHEE: | 1201 | case PCI_DEVICE_ID_3DFX_BANSHEE: |
| 1203 | strcat(tdfx_fix.id, " Banshee"); | 1202 | strcpy(tdfx_fix.id, "3Dfx Banshee"); |
| 1204 | default_par->max_pixclock = BANSHEE_MAX_PIXCLOCK; | 1203 | default_par->max_pixclock = BANSHEE_MAX_PIXCLOCK; |
| 1205 | break; | 1204 | break; |
| 1206 | case PCI_DEVICE_ID_3DFX_VOODOO3: | 1205 | case PCI_DEVICE_ID_3DFX_VOODOO3: |
| 1207 | strcat(tdfx_fix.id, " Voodoo3"); | 1206 | strcpy(tdfx_fix.id, "3Dfx Voodoo3"); |
| 1208 | default_par->max_pixclock = VOODOO3_MAX_PIXCLOCK; | 1207 | default_par->max_pixclock = VOODOO3_MAX_PIXCLOCK; |
| 1209 | break; | 1208 | break; |
| 1210 | case PCI_DEVICE_ID_3DFX_VOODOO5: | 1209 | case PCI_DEVICE_ID_3DFX_VOODOO5: |
| 1211 | strcat(tdfx_fix.id, " Voodoo5"); | 1210 | strcpy(tdfx_fix.id, "3Dfx Voodoo5"); |
| 1212 | default_par->max_pixclock = VOODOO5_MAX_PIXCLOCK; | 1211 | default_par->max_pixclock = VOODOO5_MAX_PIXCLOCK; |
| 1213 | break; | 1212 | break; |
| 1214 | } | 1213 | } |
diff --git a/firmware/Makefile b/firmware/Makefile index 9fe86041f86e..da75a6fbc6ba 100644 --- a/firmware/Makefile +++ b/firmware/Makefile | |||
| @@ -146,15 +146,27 @@ $(patsubst %,$(obj)/%.gen.o, $(fw-external-y)): $(obj)/%.gen.o: $(fwdir)/% | |||
| 146 | $(obj)/%: $(obj)/%.ihex | $(objtree)/$(obj)/$$(dir %) | 146 | $(obj)/%: $(obj)/%.ihex | $(objtree)/$(obj)/$$(dir %) |
| 147 | $(call cmd,ihex) | 147 | $(call cmd,ihex) |
| 148 | 148 | ||
| 149 | # Don't depend on ihex2fw if we're installing and it already exists. | ||
| 150 | # Putting it after | in the dependencies doesn't seem sufficient when | ||
| 151 | # we're installing after a cross-compile, because ihex2fw has dependencies | ||
| 152 | # on stuff like /usr/lib/gcc/ppc64-redhat-linux/4.3.0/include/stddef.h and | ||
| 153 | # thus wants to be rebuilt. Which it can't be, if the prebuilt kernel tree | ||
| 154 | # is exported read-only for someone to run 'make install'. | ||
| 155 | ifeq ($(INSTALL):$(wildcard $(obj)/ihex2fw),install:$(obj)/ihex2fw) | ||
| 156 | ihex2fw_dep := | ||
| 157 | else | ||
| 158 | ihex2fw_dep := $(obj)/ihex2fw | ||
| 159 | endif | ||
| 160 | |||
| 149 | # .HEX is also Intel HEX, but where the offset and length in each record | 161 | # .HEX is also Intel HEX, but where the offset and length in each record |
| 150 | # is actually meaningful, because the firmware has to be loaded in a certain | 162 | # is actually meaningful, because the firmware has to be loaded in a certain |
| 151 | # order rather than as a single binary blob. Thus, we convert them into our | 163 | # order rather than as a single binary blob. Thus, we convert them into our |
| 152 | # more compact binary representation of ihex records (<linux/ihex.h>) | 164 | # more compact binary representation of ihex records (<linux/ihex.h>) |
| 153 | $(obj)/%.fw: $(obj)/%.HEX $(obj)/ihex2fw | $(objtree)/$(obj)/$$(dir %) | 165 | $(obj)/%.fw: $(obj)/%.HEX $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %) |
| 154 | $(call cmd,ihex2fw) | 166 | $(call cmd,ihex2fw) |
| 155 | 167 | ||
| 156 | # .H16 is our own modified form of Intel HEX, with 16-bit length for records. | 168 | # .H16 is our own modified form of Intel HEX, with 16-bit length for records. |
| 157 | $(obj)/%.fw: $(obj)/%.H16 $(obj)/ihex2fw | $(objtree)/$(obj)/$$(dir %) | 169 | $(obj)/%.fw: $(obj)/%.H16 $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %) |
| 158 | $(call cmd,h16tofw) | 170 | $(call cmd,h16tofw) |
| 159 | 171 | ||
| 160 | $(firmware-dirs): | 172 | $(firmware-dirs): |
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index f9e4ad97a79e..06e521a945c3 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
| @@ -9,7 +9,10 @@ files (e.g. "cp -a") to Windows servers. For mkdir and create honor setgid bit | |||
| 9 | on parent directory when server supports Unix Extensions but not POSIX | 9 | on parent directory when server supports Unix Extensions but not POSIX |
| 10 | create. Update cifs.upcall version to handle new Kerberos sec flags | 10 | create. Update cifs.upcall version to handle new Kerberos sec flags |
| 11 | (this requires update of cifs.upcall program from Samba). Fix memory leak | 11 | (this requires update of cifs.upcall program from Samba). Fix memory leak |
| 12 | on dns_upcall (resolving DFS referralls). | 12 | on dns_upcall (resolving DFS referralls). Fix plain text password |
| 13 | authentication (requires setting SecurityFlags to 0x30030 to enable | ||
| 14 | lanman and plain text though). Fix writes to be at correct offset when | ||
| 15 | file is open with O_APPEND and file is on a directio (forcediretio) mount. | ||
| 13 | 16 | ||
| 14 | Version 1.53 | 17 | Version 1.53 |
| 15 | ------------ | 18 | ------------ |
diff --git a/fs/cifs/README b/fs/cifs/README index 68b5c1169d9d..bd2343d4c6a6 100644 --- a/fs/cifs/README +++ b/fs/cifs/README | |||
| @@ -542,10 +542,20 @@ SecurityFlags Flags which control security negotiation and | |||
| 542 | hashing mechanisms (as "must use") on the other hand | 542 | hashing mechanisms (as "must use") on the other hand |
| 543 | does not make much sense. Default flags are | 543 | does not make much sense. Default flags are |
| 544 | 0x07007 | 544 | 0x07007 |
| 545 | (NTLM, NTLMv2 and packet signing allowed). Maximum | 545 | (NTLM, NTLMv2 and packet signing allowed). The maximum |
| 546 | allowable flags if you want to allow mounts to servers | 546 | allowable flags if you want to allow mounts to servers |
| 547 | using weaker password hashes is 0x37037 (lanman, | 547 | using weaker password hashes is 0x37037 (lanman, |
| 548 | plaintext, ntlm, ntlmv2, signing allowed): | 548 | plaintext, ntlm, ntlmv2, signing allowed). Some |
| 549 | SecurityFlags require the corresponding menuconfig | ||
| 550 | options to be enabled (lanman and plaintext require | ||
| 551 | CONFIG_CIFS_WEAK_PW_HASH for example). Enabling | ||
| 552 | plaintext authentication currently requires also | ||
| 553 | enabling lanman authentication in the security flags | ||
| 554 | because the cifs module only supports sending | ||
| 555 | laintext passwords using the older lanman dialect | ||
| 556 | form of the session setup SMB. (e.g. for authentication | ||
| 557 | using plain text passwords, set the SecurityFlags | ||
| 558 | to 0x30030): | ||
| 549 | 559 | ||
| 550 | may use packet signing 0x00001 | 560 | may use packet signing 0x00001 |
| 551 | must use packet signing 0x01001 | 561 | must use packet signing 0x01001 |
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index 83fd40dc1ef0..bd5f13d38450 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c | |||
| @@ -294,6 +294,7 @@ void calc_lanman_hash(struct cifsSesInfo *ses, char *lnm_session_key) | |||
| 294 | 294 | ||
| 295 | if ((ses->server->secMode & SECMODE_PW_ENCRYPT) == 0) | 295 | if ((ses->server->secMode & SECMODE_PW_ENCRYPT) == 0) |
| 296 | if (extended_security & CIFSSEC_MAY_PLNTXT) { | 296 | if (extended_security & CIFSSEC_MAY_PLNTXT) { |
| 297 | memset(lnm_session_key, 0, CIFS_SESS_KEY_SIZE); | ||
| 297 | memcpy(lnm_session_key, password_with_pad, | 298 | memcpy(lnm_session_key, password_with_pad, |
| 298 | CIFS_ENCPWD_SIZE); | 299 | CIFS_ENCPWD_SIZE); |
| 299 | return; | 300 | return; |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index ff14d14903a0..cbefe1f1f9fe 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -833,6 +833,10 @@ ssize_t cifs_user_write(struct file *file, const char __user *write_data, | |||
| 833 | return -EBADF; | 833 | return -EBADF; |
| 834 | open_file = (struct cifsFileInfo *) file->private_data; | 834 | open_file = (struct cifsFileInfo *) file->private_data; |
| 835 | 835 | ||
| 836 | rc = generic_write_checks(file, poffset, &write_size, 0); | ||
| 837 | if (rc) | ||
| 838 | return rc; | ||
| 839 | |||
| 836 | xid = GetXid(); | 840 | xid = GetXid(); |
| 837 | 841 | ||
| 838 | if (*poffset > file->f_path.dentry->d_inode->i_size) | 842 | if (*poffset > file->f_path.dentry->d_inode->i_size) |
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index b537fad3bf50..252fdc0567f1 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
| @@ -409,6 +409,8 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time, | |||
| 409 | #ifdef CONFIG_CIFS_WEAK_PW_HASH | 409 | #ifdef CONFIG_CIFS_WEAK_PW_HASH |
| 410 | char lnm_session_key[CIFS_SESS_KEY_SIZE]; | 410 | char lnm_session_key[CIFS_SESS_KEY_SIZE]; |
| 411 | 411 | ||
| 412 | pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE; | ||
| 413 | |||
| 412 | /* no capabilities flags in old lanman negotiation */ | 414 | /* no capabilities flags in old lanman negotiation */ |
| 413 | 415 | ||
| 414 | pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE); | 416 | pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE); |
diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c index b6ed38380ab8..54b8b4140c8f 100644 --- a/fs/nfsd/nfs4acl.c +++ b/fs/nfsd/nfs4acl.c | |||
| @@ -443,7 +443,7 @@ init_state(struct posix_acl_state *state, int cnt) | |||
| 443 | * enough space for either: | 443 | * enough space for either: |
| 444 | */ | 444 | */ |
| 445 | alloc = sizeof(struct posix_ace_state_array) | 445 | alloc = sizeof(struct posix_ace_state_array) |
| 446 | + cnt*sizeof(struct posix_ace_state); | 446 | + cnt*sizeof(struct posix_user_ace_state); |
| 447 | state->users = kzalloc(alloc, GFP_KERNEL); | 447 | state->users = kzalloc(alloc, GFP_KERNEL); |
| 448 | if (!state->users) | 448 | if (!state->users) |
| 449 | return -ENOMEM; | 449 | return -ENOMEM; |
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 2e51adac65de..e5b51ffafc6c 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c | |||
| @@ -867,11 +867,6 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, | |||
| 867 | int slack_bytes; | 867 | int slack_bytes; |
| 868 | __be32 status; | 868 | __be32 status; |
| 869 | 869 | ||
| 870 | status = nfserr_resource; | ||
| 871 | cstate = cstate_alloc(); | ||
| 872 | if (cstate == NULL) | ||
| 873 | goto out; | ||
| 874 | |||
| 875 | resp->xbuf = &rqstp->rq_res; | 870 | resp->xbuf = &rqstp->rq_res; |
| 876 | resp->p = rqstp->rq_res.head[0].iov_base + rqstp->rq_res.head[0].iov_len; | 871 | resp->p = rqstp->rq_res.head[0].iov_base + rqstp->rq_res.head[0].iov_len; |
| 877 | resp->tagp = resp->p; | 872 | resp->tagp = resp->p; |
| @@ -890,6 +885,11 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, | |||
| 890 | if (args->minorversion > NFSD_SUPPORTED_MINOR_VERSION) | 885 | if (args->minorversion > NFSD_SUPPORTED_MINOR_VERSION) |
| 891 | goto out; | 886 | goto out; |
| 892 | 887 | ||
| 888 | status = nfserr_resource; | ||
| 889 | cstate = cstate_alloc(); | ||
| 890 | if (cstate == NULL) | ||
| 891 | goto out; | ||
| 892 | |||
| 893 | status = nfs_ok; | 893 | status = nfs_ok; |
| 894 | while (!status && resp->opcnt < args->opcnt) { | 894 | while (!status && resp->opcnt < args->opcnt) { |
| 895 | op = &args->ops[resp->opcnt++]; | 895 | op = &args->ops[resp->opcnt++]; |
| @@ -957,9 +957,9 @@ encode_op: | |||
| 957 | nfsd4_increment_op_stats(op->opnum); | 957 | nfsd4_increment_op_stats(op->opnum); |
| 958 | } | 958 | } |
| 959 | 959 | ||
| 960 | cstate_free(cstate); | ||
| 960 | out: | 961 | out: |
| 961 | nfsd4_release_compoundargs(args); | 962 | nfsd4_release_compoundargs(args); |
| 962 | cstate_free(cstate); | ||
| 963 | dprintk("nfsv4 compound returned %d\n", ntohl(status)); | 963 | dprintk("nfsv4 compound returned %d\n", ntohl(status)); |
| 964 | return status; | 964 | return status; |
| 965 | } | 965 | } |
diff --git a/fs/ntfs/usnjrnl.h b/fs/ntfs/usnjrnl.h index 3a8af75351e8..4087fbdac327 100644 --- a/fs/ntfs/usnjrnl.h +++ b/fs/ntfs/usnjrnl.h | |||
| @@ -113,7 +113,7 @@ typedef struct { | |||
| 113 | * Reason flags (32-bit). Cumulative flags describing the change(s) to the | 113 | * Reason flags (32-bit). Cumulative flags describing the change(s) to the |
| 114 | * file since it was last opened. I think the names speak for themselves but | 114 | * file since it was last opened. I think the names speak for themselves but |
| 115 | * if you disagree check out the descriptions in the Linux NTFS project NTFS | 115 | * if you disagree check out the descriptions in the Linux NTFS project NTFS |
| 116 | * documentation: http://linux-ntfs.sourceforge.net/ntfs/files/usnjrnl.html | 116 | * documentation: http://www.linux-ntfs.org/ |
| 117 | */ | 117 | */ |
| 118 | enum { | 118 | enum { |
| 119 | USN_REASON_DATA_OVERWRITE = const_cpu_to_le32(0x00000001), | 119 | USN_REASON_DATA_OVERWRITE = const_cpu_to_le32(0x00000001), |
| @@ -145,7 +145,7 @@ typedef le32 USN_REASON_FLAGS; | |||
| 145 | * Source info flags (32-bit). Information about the source of the change(s) | 145 | * Source info flags (32-bit). Information about the source of the change(s) |
| 146 | * to the file. For detailed descriptions of what these mean, see the Linux | 146 | * to the file. For detailed descriptions of what these mean, see the Linux |
| 147 | * NTFS project NTFS documentation: | 147 | * NTFS project NTFS documentation: |
| 148 | * http://linux-ntfs.sourceforge.net/ntfs/files/usnjrnl.html | 148 | * http://www.linux-ntfs.org/ |
| 149 | */ | 149 | */ |
| 150 | enum { | 150 | enum { |
| 151 | USN_SOURCE_DATA_MANAGEMENT = const_cpu_to_le32(0x00000001), | 151 | USN_SOURCE_DATA_MANAGEMENT = const_cpu_to_le32(0x00000001), |
diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c index ded969862960..00f10a2dcf12 100644 --- a/fs/proc/proc_misc.c +++ b/fs/proc/proc_misc.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/tty.h> | 24 | #include <linux/tty.h> |
| 25 | #include <linux/string.h> | 25 | #include <linux/string.h> |
| 26 | #include <linux/mman.h> | 26 | #include <linux/mman.h> |
| 27 | #include <linux/quicklist.h> | ||
| 27 | #include <linux/proc_fs.h> | 28 | #include <linux/proc_fs.h> |
| 28 | #include <linux/ioport.h> | 29 | #include <linux/ioport.h> |
| 29 | #include <linux/mm.h> | 30 | #include <linux/mm.h> |
| @@ -189,7 +190,8 @@ static int meminfo_read_proc(char *page, char **start, off_t off, | |||
| 189 | "Committed_AS: %8lu kB\n" | 190 | "Committed_AS: %8lu kB\n" |
| 190 | "VmallocTotal: %8lu kB\n" | 191 | "VmallocTotal: %8lu kB\n" |
| 191 | "VmallocUsed: %8lu kB\n" | 192 | "VmallocUsed: %8lu kB\n" |
| 192 | "VmallocChunk: %8lu kB\n", | 193 | "VmallocChunk: %8lu kB\n" |
| 194 | "Quicklists: %8lu kB\n", | ||
| 193 | K(i.totalram), | 195 | K(i.totalram), |
| 194 | K(i.freeram), | 196 | K(i.freeram), |
| 195 | K(i.bufferram), | 197 | K(i.bufferram), |
| @@ -221,7 +223,8 @@ static int meminfo_read_proc(char *page, char **start, off_t off, | |||
| 221 | K(committed), | 223 | K(committed), |
| 222 | (unsigned long)VMALLOC_TOTAL >> 10, | 224 | (unsigned long)VMALLOC_TOTAL >> 10, |
| 223 | vmi.used >> 10, | 225 | vmi.used >> 10, |
| 224 | vmi.largest_chunk >> 10 | 226 | vmi.largest_chunk >> 10, |
| 227 | K(quicklist_total_size()) | ||
| 225 | ); | 228 | ); |
| 226 | 229 | ||
| 227 | len += hugetlb_report_meminfo(page + len); | 230 | len += hugetlb_report_meminfo(page + len); |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 7d970678f940..59391250d51c 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
| @@ -297,7 +297,6 @@ unifdef-y += parport.h | |||
| 297 | unifdef-y += patchkey.h | 297 | unifdef-y += patchkey.h |
| 298 | unifdef-y += pci.h | 298 | unifdef-y += pci.h |
| 299 | unifdef-y += personality.h | 299 | unifdef-y += personality.h |
| 300 | unifdef-y += pim.h | ||
| 301 | unifdef-y += pktcdvd.h | 300 | unifdef-y += pktcdvd.h |
| 302 | unifdef-y += pmu.h | 301 | unifdef-y += pmu.h |
| 303 | unifdef-y += poll.h | 302 | unifdef-y += poll.h |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 87c12ed96954..1524829f73f2 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -1111,7 +1111,6 @@ void ide_setup_pci_noise(struct pci_dev *, const struct ide_port_info *); | |||
| 1111 | #ifdef CONFIG_BLK_DEV_IDEDMA_PCI | 1111 | #ifdef CONFIG_BLK_DEV_IDEDMA_PCI |
| 1112 | int ide_pci_set_master(struct pci_dev *, const char *); | 1112 | int ide_pci_set_master(struct pci_dev *, const char *); |
| 1113 | unsigned long ide_pci_dma_base(ide_hwif_t *, const struct ide_port_info *); | 1113 | unsigned long ide_pci_dma_base(ide_hwif_t *, const struct ide_port_info *); |
| 1114 | extern const struct ide_dma_ops sff_dma_ops; | ||
| 1115 | int ide_pci_check_simplex(ide_hwif_t *, const struct ide_port_info *); | 1114 | int ide_pci_check_simplex(ide_hwif_t *, const struct ide_port_info *); |
| 1116 | int ide_hwif_setup_dma(ide_hwif_t *, const struct ide_port_info *); | 1115 | int ide_hwif_setup_dma(ide_hwif_t *, const struct ide_port_info *); |
| 1117 | #else | 1116 | #else |
| @@ -1275,6 +1274,7 @@ extern int __ide_dma_end(ide_drive_t *); | |||
| 1275 | int ide_dma_test_irq(ide_drive_t *); | 1274 | int ide_dma_test_irq(ide_drive_t *); |
| 1276 | extern void ide_dma_lost_irq(ide_drive_t *); | 1275 | extern void ide_dma_lost_irq(ide_drive_t *); |
| 1277 | extern void ide_dma_timeout(ide_drive_t *); | 1276 | extern void ide_dma_timeout(ide_drive_t *); |
| 1277 | extern const struct ide_dma_ops sff_dma_ops; | ||
| 1278 | #endif /* CONFIG_BLK_DEV_IDEDMA_SFF */ | 1278 | #endif /* CONFIG_BLK_DEV_IDEDMA_SFF */ |
| 1279 | 1279 | ||
| 1280 | #else | 1280 | #else |
| @@ -1448,8 +1448,7 @@ static inline void ide_dump_identify(u8 *id) | |||
| 1448 | 1448 | ||
| 1449 | static inline int hwif_to_node(ide_hwif_t *hwif) | 1449 | static inline int hwif_to_node(ide_hwif_t *hwif) |
| 1450 | { | 1450 | { |
| 1451 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 1451 | return hwif->dev ? dev_to_node(hwif->dev) : -1; |
| 1452 | return hwif->dev ? pcibus_to_node(dev->bus) : -1; | ||
| 1453 | } | 1452 | } |
| 1454 | 1453 | ||
| 1455 | static inline ide_drive_t *ide_get_paired_drive(ide_drive_t *drive) | 1454 | static inline ide_drive_t *ide_get_paired_drive(ide_drive_t *drive) |
diff --git a/include/linux/mroute.h b/include/linux/mroute.h index 07112ee9293a..8a455694d682 100644 --- a/include/linux/mroute.h +++ b/include/linux/mroute.h | |||
| @@ -6,7 +6,6 @@ | |||
| 6 | #ifdef __KERNEL__ | 6 | #ifdef __KERNEL__ |
| 7 | #include <linux/in.h> | 7 | #include <linux/in.h> |
| 8 | #endif | 8 | #endif |
| 9 | #include <linux/pim.h> | ||
| 10 | 9 | ||
| 11 | /* | 10 | /* |
| 12 | * Based on the MROUTING 3.5 defines primarily to keep | 11 | * Based on the MROUTING 3.5 defines primarily to keep |
| @@ -130,6 +129,7 @@ struct igmpmsg | |||
| 130 | */ | 129 | */ |
| 131 | 130 | ||
| 132 | #ifdef __KERNEL__ | 131 | #ifdef __KERNEL__ |
| 132 | #include <linux/pim.h> | ||
| 133 | #include <net/sock.h> | 133 | #include <net/sock.h> |
| 134 | 134 | ||
| 135 | #ifdef CONFIG_IP_MROUTE | 135 | #ifdef CONFIG_IP_MROUTE |
diff --git a/include/linux/mroute6.h b/include/linux/mroute6.h index 5cf50473a10f..6f4c180179e2 100644 --- a/include/linux/mroute6.h +++ b/include/linux/mroute6.h | |||
| @@ -115,6 +115,7 @@ struct sioc_mif_req6 | |||
| 115 | 115 | ||
| 116 | #ifdef __KERNEL__ | 116 | #ifdef __KERNEL__ |
| 117 | 117 | ||
| 118 | #include <linux/pim.h> | ||
| 118 | #include <linux/skbuff.h> /* for struct sk_buff_head */ | 119 | #include <linux/skbuff.h> /* for struct sk_buff_head */ |
| 119 | 120 | ||
| 120 | #ifdef CONFIG_IPV6_MROUTE | 121 | #ifdef CONFIG_IPV6_MROUTE |
diff --git a/include/linux/pim.h b/include/linux/pim.h index 236ffd317394..1ba0661561a4 100644 --- a/include/linux/pim.h +++ b/include/linux/pim.h | |||
| @@ -3,22 +3,6 @@ | |||
| 3 | 3 | ||
| 4 | #include <asm/byteorder.h> | 4 | #include <asm/byteorder.h> |
| 5 | 5 | ||
| 6 | #ifndef __KERNEL__ | ||
| 7 | struct pim { | ||
| 8 | #if defined(__LITTLE_ENDIAN_BITFIELD) | ||
| 9 | __u8 pim_type:4, /* PIM message type */ | ||
| 10 | pim_ver:4; /* PIM version */ | ||
| 11 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
| 12 | __u8 pim_ver:4; /* PIM version */ | ||
| 13 | pim_type:4; /* PIM message type */ | ||
| 14 | #endif | ||
| 15 | __u8 pim_rsv; /* Reserved */ | ||
| 16 | __be16 pim_cksum; /* Checksum */ | ||
| 17 | }; | ||
| 18 | |||
| 19 | #define PIM_MINLEN 8 | ||
| 20 | #endif | ||
| 21 | |||
| 22 | /* Message types - V1 */ | 6 | /* Message types - V1 */ |
| 23 | #define PIM_V1_VERSION __constant_htonl(0x10000000) | 7 | #define PIM_V1_VERSION __constant_htonl(0x10000000) |
| 24 | #define PIM_V1_REGISTER 1 | 8 | #define PIM_V1_REGISTER 1 |
| @@ -27,7 +11,6 @@ struct pim { | |||
| 27 | #define PIM_VERSION 2 | 11 | #define PIM_VERSION 2 |
| 28 | #define PIM_REGISTER 1 | 12 | #define PIM_REGISTER 1 |
| 29 | 13 | ||
| 30 | #if defined(__KERNEL__) | ||
| 31 | #define PIM_NULL_REGISTER __constant_htonl(0x40000000) | 14 | #define PIM_NULL_REGISTER __constant_htonl(0x40000000) |
| 32 | 15 | ||
| 33 | /* PIMv2 register message header layout (ietf-draft-idmr-pimvsm-v2-00.ps */ | 16 | /* PIMv2 register message header layout (ietf-draft-idmr-pimvsm-v2-00.ps */ |
| @@ -42,4 +25,3 @@ struct pimreghdr | |||
| 42 | struct sk_buff; | 25 | struct sk_buff; |
| 43 | extern int pim_rcv_v1(struct sk_buff *); | 26 | extern int pim_rcv_v1(struct sk_buff *); |
| 44 | #endif | 27 | #endif |
| 45 | #endif | ||
diff --git a/include/linux/quicklist.h b/include/linux/quicklist.h index 39b66713a0bb..bd466439c588 100644 --- a/include/linux/quicklist.h +++ b/include/linux/quicklist.h | |||
| @@ -80,6 +80,13 @@ void quicklist_trim(int nr, void (*dtor)(void *), | |||
| 80 | 80 | ||
| 81 | unsigned long quicklist_total_size(void); | 81 | unsigned long quicklist_total_size(void); |
| 82 | 82 | ||
| 83 | #else | ||
| 84 | |||
| 85 | static inline unsigned long quicklist_total_size(void) | ||
| 86 | { | ||
| 87 | return 0; | ||
| 88 | } | ||
| 89 | |||
| 83 | #endif | 90 | #endif |
| 84 | 91 | ||
| 85 | #endif /* LINUX_QUICKLIST_H */ | 92 | #endif /* LINUX_QUICKLIST_H */ |
diff --git a/include/linux/sunrpc/svc_rdma.h b/include/linux/sunrpc/svc_rdma.h index ef2e3a20bf3b..dc05b54bd3a3 100644 --- a/include/linux/sunrpc/svc_rdma.h +++ b/include/linux/sunrpc/svc_rdma.h | |||
| @@ -143,7 +143,6 @@ struct svcxprt_rdma { | |||
| 143 | unsigned long sc_flags; | 143 | unsigned long sc_flags; |
| 144 | struct list_head sc_dto_q; /* DTO tasklet I/O pending Q */ | 144 | struct list_head sc_dto_q; /* DTO tasklet I/O pending Q */ |
| 145 | struct list_head sc_read_complete_q; | 145 | struct list_head sc_read_complete_q; |
| 146 | spinlock_t sc_read_complete_lock; | ||
| 147 | struct work_struct sc_work; | 146 | struct work_struct sc_work; |
| 148 | }; | 147 | }; |
| 149 | /* sc_flags */ | 148 | /* sc_flags */ |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 972f8e61d36a..59cedfb040e7 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
| @@ -243,10 +243,11 @@ static inline int open_arg(int flags, int mask) | |||
| 243 | 243 | ||
| 244 | static int audit_match_perm(struct audit_context *ctx, int mask) | 244 | static int audit_match_perm(struct audit_context *ctx, int mask) |
| 245 | { | 245 | { |
| 246 | unsigned n; | ||
| 246 | if (unlikely(!ctx)) | 247 | if (unlikely(!ctx)) |
| 247 | return 0; | 248 | return 0; |
| 248 | 249 | ||
| 249 | unsigned n = ctx->major; | 250 | n = ctx->major; |
| 250 | switch (audit_classify_syscall(ctx->arch, n)) { | 251 | switch (audit_classify_syscall(ctx->arch, n)) { |
| 251 | case 0: /* native */ | 252 | case 0: /* native */ |
| 252 | if ((mask & AUDIT_PERM_WRITE) && | 253 | if ((mask & AUDIT_PERM_WRITE) && |
diff --git a/kernel/exit.c b/kernel/exit.c index 75c647387639..25ed2ad986df 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -831,26 +831,50 @@ static void reparent_thread(struct task_struct *p, struct task_struct *father) | |||
| 831 | * the child reaper process (ie "init") in our pid | 831 | * the child reaper process (ie "init") in our pid |
| 832 | * space. | 832 | * space. |
| 833 | */ | 833 | */ |
| 834 | static struct task_struct *find_new_reaper(struct task_struct *father) | ||
| 835 | { | ||
| 836 | struct pid_namespace *pid_ns = task_active_pid_ns(father); | ||
| 837 | struct task_struct *thread; | ||
| 838 | |||
| 839 | thread = father; | ||
| 840 | while_each_thread(father, thread) { | ||
| 841 | if (thread->flags & PF_EXITING) | ||
| 842 | continue; | ||
| 843 | if (unlikely(pid_ns->child_reaper == father)) | ||
| 844 | pid_ns->child_reaper = thread; | ||
| 845 | return thread; | ||
| 846 | } | ||
| 847 | |||
| 848 | if (unlikely(pid_ns->child_reaper == father)) { | ||
| 849 | write_unlock_irq(&tasklist_lock); | ||
| 850 | if (unlikely(pid_ns == &init_pid_ns)) | ||
| 851 | panic("Attempted to kill init!"); | ||
| 852 | |||
| 853 | zap_pid_ns_processes(pid_ns); | ||
| 854 | write_lock_irq(&tasklist_lock); | ||
| 855 | /* | ||
| 856 | * We can not clear ->child_reaper or leave it alone. | ||
| 857 | * There may by stealth EXIT_DEAD tasks on ->children, | ||
| 858 | * forget_original_parent() must move them somewhere. | ||
| 859 | */ | ||
| 860 | pid_ns->child_reaper = init_pid_ns.child_reaper; | ||
| 861 | } | ||
| 862 | |||
| 863 | return pid_ns->child_reaper; | ||
| 864 | } | ||
| 865 | |||
| 834 | static void forget_original_parent(struct task_struct *father) | 866 | static void forget_original_parent(struct task_struct *father) |
| 835 | { | 867 | { |
| 836 | struct task_struct *p, *n, *reaper = father; | 868 | struct task_struct *p, *n, *reaper; |
| 837 | LIST_HEAD(ptrace_dead); | 869 | LIST_HEAD(ptrace_dead); |
| 838 | 870 | ||
| 839 | write_lock_irq(&tasklist_lock); | 871 | write_lock_irq(&tasklist_lock); |
| 840 | 872 | reaper = find_new_reaper(father); | |
| 841 | /* | 873 | /* |
| 842 | * First clean up ptrace if we were using it. | 874 | * First clean up ptrace if we were using it. |
| 843 | */ | 875 | */ |
| 844 | ptrace_exit(father, &ptrace_dead); | 876 | ptrace_exit(father, &ptrace_dead); |
| 845 | 877 | ||
| 846 | do { | ||
| 847 | reaper = next_thread(reaper); | ||
| 848 | if (reaper == father) { | ||
| 849 | reaper = task_child_reaper(father); | ||
| 850 | break; | ||
| 851 | } | ||
| 852 | } while (reaper->flags & PF_EXITING); | ||
| 853 | |||
| 854 | list_for_each_entry_safe(p, n, &father->children, sibling) { | 878 | list_for_each_entry_safe(p, n, &father->children, sibling) { |
| 855 | p->real_parent = reaper; | 879 | p->real_parent = reaper; |
| 856 | if (p->parent == father) { | 880 | if (p->parent == father) { |
| @@ -959,39 +983,6 @@ static void check_stack_usage(void) | |||
| 959 | static inline void check_stack_usage(void) {} | 983 | static inline void check_stack_usage(void) {} |
| 960 | #endif | 984 | #endif |
| 961 | 985 | ||
| 962 | static inline void exit_child_reaper(struct task_struct *tsk) | ||
| 963 | { | ||
| 964 | if (likely(tsk->group_leader != task_child_reaper(tsk))) | ||
| 965 | return; | ||
| 966 | |||
| 967 | if (tsk->nsproxy->pid_ns == &init_pid_ns) | ||
| 968 | panic("Attempted to kill init!"); | ||
| 969 | |||
| 970 | /* | ||
| 971 | * @tsk is the last thread in the 'cgroup-init' and is exiting. | ||
| 972 | * Terminate all remaining processes in the namespace and reap them | ||
| 973 | * before exiting @tsk. | ||
| 974 | * | ||
| 975 | * Note that @tsk (last thread of cgroup-init) may not necessarily | ||
| 976 | * be the child-reaper (i.e main thread of cgroup-init) of the | ||
| 977 | * namespace i.e the child_reaper may have already exited. | ||
| 978 | * | ||
| 979 | * Even after a child_reaper exits, we let it inherit orphaned children, | ||
| 980 | * because, pid_ns->child_reaper remains valid as long as there is | ||
| 981 | * at least one living sub-thread in the cgroup init. | ||
| 982 | |||
| 983 | * This living sub-thread of the cgroup-init will be notified when | ||
| 984 | * a child inherited by the 'child-reaper' exits (do_notify_parent() | ||
| 985 | * uses __group_send_sig_info()). Further, when reaping child processes, | ||
| 986 | * do_wait() iterates over children of all living sub threads. | ||
| 987 | |||
| 988 | * i.e even though 'child_reaper' thread is listed as the parent of the | ||
| 989 | * orphaned children, any living sub-thread in the cgroup-init can | ||
| 990 | * perform the role of the child_reaper. | ||
| 991 | */ | ||
| 992 | zap_pid_ns_processes(tsk->nsproxy->pid_ns); | ||
| 993 | } | ||
| 994 | |||
| 995 | NORET_TYPE void do_exit(long code) | 986 | NORET_TYPE void do_exit(long code) |
| 996 | { | 987 | { |
| 997 | struct task_struct *tsk = current; | 988 | struct task_struct *tsk = current; |
| @@ -1051,7 +1042,6 @@ NORET_TYPE void do_exit(long code) | |||
| 1051 | } | 1042 | } |
| 1052 | group_dead = atomic_dec_and_test(&tsk->signal->live); | 1043 | group_dead = atomic_dec_and_test(&tsk->signal->live); |
| 1053 | if (group_dead) { | 1044 | if (group_dead) { |
| 1054 | exit_child_reaper(tsk); | ||
| 1055 | hrtimer_cancel(&tsk->signal->real_timer); | 1045 | hrtimer_cancel(&tsk->signal->real_timer); |
| 1056 | exit_itimers(tsk->signal); | 1046 | exit_itimers(tsk->signal); |
| 1057 | } | 1047 | } |
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index ea567b78d1aa..fab8ea86fac3 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c | |||
| @@ -179,9 +179,6 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns) | |||
| 179 | rc = sys_wait4(-1, NULL, __WALL, NULL); | 179 | rc = sys_wait4(-1, NULL, __WALL, NULL); |
| 180 | } while (rc != -ECHILD); | 180 | } while (rc != -ECHILD); |
| 181 | 181 | ||
| 182 | |||
| 183 | /* Child reaper for the pid namespace is going away */ | ||
| 184 | pid_ns->child_reaper = NULL; | ||
| 185 | acct_exit_ns(pid_ns); | 182 | acct_exit_ns(pid_ns); |
| 186 | return; | 183 | return; |
| 187 | } | 184 | } |
diff --git a/kernel/pm_qos_params.c b/kernel/pm_qos_params.c index da9c2dda6a4e..dfdec524d1b7 100644 --- a/kernel/pm_qos_params.c +++ b/kernel/pm_qos_params.c | |||
| @@ -43,7 +43,7 @@ | |||
| 43 | #include <linux/uaccess.h> | 43 | #include <linux/uaccess.h> |
| 44 | 44 | ||
| 45 | /* | 45 | /* |
| 46 | * locking rule: all changes to target_value or requirements or notifiers lists | 46 | * locking rule: all changes to requirements or notifiers lists |
| 47 | * or pm_qos_object list and pm_qos_objects need to happen with pm_qos_lock | 47 | * or pm_qos_object list and pm_qos_objects need to happen with pm_qos_lock |
| 48 | * held, taken with _irqsave. One lock to rule them all | 48 | * held, taken with _irqsave. One lock to rule them all |
| 49 | */ | 49 | */ |
| @@ -66,7 +66,7 @@ struct pm_qos_object { | |||
| 66 | struct miscdevice pm_qos_power_miscdev; | 66 | struct miscdevice pm_qos_power_miscdev; |
| 67 | char *name; | 67 | char *name; |
| 68 | s32 default_value; | 68 | s32 default_value; |
| 69 | s32 target_value; | 69 | atomic_t target_value; |
| 70 | s32 (*comparitor)(s32, s32); | 70 | s32 (*comparitor)(s32, s32); |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
| @@ -77,7 +77,7 @@ static struct pm_qos_object cpu_dma_pm_qos = { | |||
| 77 | .notifiers = &cpu_dma_lat_notifier, | 77 | .notifiers = &cpu_dma_lat_notifier, |
| 78 | .name = "cpu_dma_latency", | 78 | .name = "cpu_dma_latency", |
| 79 | .default_value = 2000 * USEC_PER_SEC, | 79 | .default_value = 2000 * USEC_PER_SEC, |
| 80 | .target_value = 2000 * USEC_PER_SEC, | 80 | .target_value = ATOMIC_INIT(2000 * USEC_PER_SEC), |
| 81 | .comparitor = min_compare | 81 | .comparitor = min_compare |
| 82 | }; | 82 | }; |
| 83 | 83 | ||
| @@ -87,7 +87,7 @@ static struct pm_qos_object network_lat_pm_qos = { | |||
| 87 | .notifiers = &network_lat_notifier, | 87 | .notifiers = &network_lat_notifier, |
| 88 | .name = "network_latency", | 88 | .name = "network_latency", |
| 89 | .default_value = 2000 * USEC_PER_SEC, | 89 | .default_value = 2000 * USEC_PER_SEC, |
| 90 | .target_value = 2000 * USEC_PER_SEC, | 90 | .target_value = ATOMIC_INIT(2000 * USEC_PER_SEC), |
| 91 | .comparitor = min_compare | 91 | .comparitor = min_compare |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| @@ -99,7 +99,7 @@ static struct pm_qos_object network_throughput_pm_qos = { | |||
| 99 | .notifiers = &network_throughput_notifier, | 99 | .notifiers = &network_throughput_notifier, |
| 100 | .name = "network_throughput", | 100 | .name = "network_throughput", |
| 101 | .default_value = 0, | 101 | .default_value = 0, |
| 102 | .target_value = 0, | 102 | .target_value = ATOMIC_INIT(0), |
| 103 | .comparitor = max_compare | 103 | .comparitor = max_compare |
| 104 | }; | 104 | }; |
| 105 | 105 | ||
| @@ -150,11 +150,11 @@ static void update_target(int target) | |||
| 150 | extreme_value = pm_qos_array[target]->comparitor( | 150 | extreme_value = pm_qos_array[target]->comparitor( |
| 151 | extreme_value, node->value); | 151 | extreme_value, node->value); |
| 152 | } | 152 | } |
| 153 | if (pm_qos_array[target]->target_value != extreme_value) { | 153 | if (atomic_read(&pm_qos_array[target]->target_value) != extreme_value) { |
| 154 | call_notifier = 1; | 154 | call_notifier = 1; |
| 155 | pm_qos_array[target]->target_value = extreme_value; | 155 | atomic_set(&pm_qos_array[target]->target_value, extreme_value); |
| 156 | pr_debug(KERN_ERR "new target for qos %d is %d\n", target, | 156 | pr_debug(KERN_ERR "new target for qos %d is %d\n", target, |
| 157 | pm_qos_array[target]->target_value); | 157 | atomic_read(&pm_qos_array[target]->target_value)); |
| 158 | } | 158 | } |
| 159 | spin_unlock_irqrestore(&pm_qos_lock, flags); | 159 | spin_unlock_irqrestore(&pm_qos_lock, flags); |
| 160 | 160 | ||
| @@ -193,14 +193,7 @@ static int find_pm_qos_object_by_minor(int minor) | |||
| 193 | */ | 193 | */ |
| 194 | int pm_qos_requirement(int pm_qos_class) | 194 | int pm_qos_requirement(int pm_qos_class) |
| 195 | { | 195 | { |
| 196 | int ret_val; | 196 | return atomic_read(&pm_qos_array[pm_qos_class]->target_value); |
| 197 | unsigned long flags; | ||
| 198 | |||
| 199 | spin_lock_irqsave(&pm_qos_lock, flags); | ||
| 200 | ret_val = pm_qos_array[pm_qos_class]->target_value; | ||
| 201 | spin_unlock_irqrestore(&pm_qos_lock, flags); | ||
| 202 | |||
| 203 | return ret_val; | ||
| 204 | } | 197 | } |
| 205 | EXPORT_SYMBOL_GPL(pm_qos_requirement); | 198 | EXPORT_SYMBOL_GPL(pm_qos_requirement); |
| 206 | 199 | ||
diff --git a/kernel/resource.c b/kernel/resource.c index cf0a178c7513..03d796c1b2e9 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
| @@ -438,7 +438,7 @@ int insert_resource(struct resource *parent, struct resource *new) | |||
| 438 | 438 | ||
| 439 | /** | 439 | /** |
| 440 | * insert_resource_expand_to_fit - Insert a resource into the resource tree | 440 | * insert_resource_expand_to_fit - Insert a resource into the resource tree |
| 441 | * @parent: parent of the new resource | 441 | * @root: root resource descriptor |
| 442 | * @new: new resource to insert | 442 | * @new: new resource to insert |
| 443 | * | 443 | * |
| 444 | * Insert a resource into the resource tree, possibly expanding it in order | 444 | * Insert a resource into the resource tree, possibly expanding it in order |
diff --git a/kernel/softlockup.c b/kernel/softlockup.c index 1a07f8ca4b92..cb838ee93a82 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c | |||
| @@ -180,10 +180,6 @@ static void check_hung_task(struct task_struct *t, unsigned long now) | |||
| 180 | if (t->flags & PF_FROZEN) | 180 | if (t->flags & PF_FROZEN) |
| 181 | return; | 181 | return; |
| 182 | 182 | ||
| 183 | /* Don't check for tasks waiting on network file systems like NFS */ | ||
| 184 | if (t->state & TASK_KILLABLE) | ||
| 185 | return; | ||
| 186 | |||
| 187 | if (switch_count != t->last_switch_count || !t->last_switch_timestamp) { | 183 | if (switch_count != t->last_switch_count || !t->last_switch_timestamp) { |
| 188 | t->last_switch_count = switch_count; | 184 | t->last_switch_count = switch_count; |
| 189 | t->last_switch_timestamp = now; | 185 | t->last_switch_timestamp = now; |
| @@ -237,7 +233,8 @@ static void check_hung_uninterruptible_tasks(int this_cpu) | |||
| 237 | do_each_thread(g, t) { | 233 | do_each_thread(g, t) { |
| 238 | if (!--max_count) | 234 | if (!--max_count) |
| 239 | goto unlock; | 235 | goto unlock; |
| 240 | if (t->state & TASK_UNINTERRUPTIBLE) | 236 | /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ |
| 237 | if (t->state == TASK_UNINTERRUPTIBLE) | ||
| 241 | check_hung_task(t, now); | 238 | check_hung_task(t, now); |
| 242 | } while_each_thread(g, t); | 239 | } while_each_thread(g, t); |
| 243 | unlock: | 240 | unlock: |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 8b5a7d304a5f..0b504814e378 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
| @@ -394,7 +394,7 @@ config LOCKDEP | |||
| 394 | bool | 394 | bool |
| 395 | depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT | 395 | depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT |
| 396 | select STACKTRACE | 396 | select STACKTRACE |
| 397 | select FRAME_POINTER if !X86 && !MIPS | 397 | select FRAME_POINTER if !X86 && !MIPS && !PPC |
| 398 | select KALLSYMS | 398 | select KALLSYMS |
| 399 | select KALLSYMS_ALL | 399 | select KALLSYMS_ALL |
| 400 | 400 | ||
| @@ -676,13 +676,13 @@ config FAULT_INJECTION_STACKTRACE_FILTER | |||
| 676 | depends on FAULT_INJECTION_DEBUG_FS && STACKTRACE_SUPPORT | 676 | depends on FAULT_INJECTION_DEBUG_FS && STACKTRACE_SUPPORT |
| 677 | depends on !X86_64 | 677 | depends on !X86_64 |
| 678 | select STACKTRACE | 678 | select STACKTRACE |
| 679 | select FRAME_POINTER | 679 | select FRAME_POINTER if !PPC |
| 680 | help | 680 | help |
| 681 | Provide stacktrace filter for fault-injection capabilities | 681 | Provide stacktrace filter for fault-injection capabilities |
| 682 | 682 | ||
| 683 | config LATENCYTOP | 683 | config LATENCYTOP |
| 684 | bool "Latency measuring infrastructure" | 684 | bool "Latency measuring infrastructure" |
| 685 | select FRAME_POINTER if !MIPS | 685 | select FRAME_POINTER if !MIPS && !PPC |
| 686 | select KALLSYMS | 686 | select KALLSYMS |
| 687 | select KALLSYMS_ALL | 687 | select KALLSYMS_ALL |
| 688 | select STACKTRACE | 688 | select STACKTRACE |
diff --git a/mm/filemap.c b/mm/filemap.c index 54e968650855..876bc595d0f8 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
| @@ -2129,13 +2129,20 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 2129 | * After a write we want buffered reads to be sure to go to disk to get | 2129 | * After a write we want buffered reads to be sure to go to disk to get |
| 2130 | * the new data. We invalidate clean cached page from the region we're | 2130 | * the new data. We invalidate clean cached page from the region we're |
| 2131 | * about to write. We do this *before* the write so that we can return | 2131 | * about to write. We do this *before* the write so that we can return |
| 2132 | * -EIO without clobbering -EIOCBQUEUED from ->direct_IO(). | 2132 | * without clobbering -EIOCBQUEUED from ->direct_IO(). |
| 2133 | */ | 2133 | */ |
| 2134 | if (mapping->nrpages) { | 2134 | if (mapping->nrpages) { |
| 2135 | written = invalidate_inode_pages2_range(mapping, | 2135 | written = invalidate_inode_pages2_range(mapping, |
| 2136 | pos >> PAGE_CACHE_SHIFT, end); | 2136 | pos >> PAGE_CACHE_SHIFT, end); |
| 2137 | if (written) | 2137 | /* |
| 2138 | * If a page can not be invalidated, return 0 to fall back | ||
| 2139 | * to buffered write. | ||
| 2140 | */ | ||
| 2141 | if (written) { | ||
| 2142 | if (written == -EBUSY) | ||
| 2143 | return 0; | ||
| 2138 | goto out; | 2144 | goto out; |
| 2145 | } | ||
| 2139 | } | 2146 | } |
| 2140 | 2147 | ||
| 2141 | written = mapping->a_ops->direct_IO(WRITE, iocb, iov, pos, *nr_segs); | 2148 | written = mapping->a_ops->direct_IO(WRITE, iocb, iov, pos, *nr_segs); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index af982f7cdb2a..e293c58bea58 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -694,6 +694,9 @@ static int move_freepages(struct zone *zone, | |||
| 694 | #endif | 694 | #endif |
| 695 | 695 | ||
| 696 | for (page = start_page; page <= end_page;) { | 696 | for (page = start_page; page <= end_page;) { |
| 697 | /* Make sure we are not inadvertently changing nodes */ | ||
| 698 | VM_BUG_ON(page_to_nid(page) != zone_to_nid(zone)); | ||
| 699 | |||
| 697 | if (!pfn_valid_within(page_to_pfn(page))) { | 700 | if (!pfn_valid_within(page_to_pfn(page))) { |
| 698 | page++; | 701 | page++; |
| 699 | continue; | 702 | continue; |
| @@ -2516,6 +2519,10 @@ static void setup_zone_migrate_reserve(struct zone *zone) | |||
| 2516 | continue; | 2519 | continue; |
| 2517 | page = pfn_to_page(pfn); | 2520 | page = pfn_to_page(pfn); |
| 2518 | 2521 | ||
| 2522 | /* Watch out for overlapping nodes */ | ||
| 2523 | if (page_to_nid(page) != zone_to_nid(zone)) | ||
| 2524 | continue; | ||
| 2525 | |||
| 2519 | /* Blocks with reserved pages will never free, skip them. */ | 2526 | /* Blocks with reserved pages will never free, skip them. */ |
| 2520 | if (PageReserved(page)) | 2527 | if (PageReserved(page)) |
| 2521 | continue; | 2528 | continue; |
| @@ -4064,7 +4071,7 @@ void __init set_dma_reserve(unsigned long new_dma_reserve) | |||
| 4064 | } | 4071 | } |
| 4065 | 4072 | ||
| 4066 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 4073 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
| 4067 | struct pglist_data contig_page_data = { .bdata = &bootmem_node_data[0] }; | 4074 | struct pglist_data __refdata contig_page_data = { .bdata = &bootmem_node_data[0] }; |
| 4068 | EXPORT_SYMBOL(contig_page_data); | 4075 | EXPORT_SYMBOL(contig_page_data); |
| 4069 | #endif | 4076 | #endif |
| 4070 | 4077 | ||
diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 3444b58033c8..c69f84fe038d 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c | |||
| @@ -2,7 +2,6 @@ | |||
| 2 | * linux/mm/page_isolation.c | 2 | * linux/mm/page_isolation.c |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | #include <stddef.h> | ||
| 6 | #include <linux/mm.h> | 5 | #include <linux/mm.h> |
| 7 | #include <linux/page-isolation.h> | 6 | #include <linux/page-isolation.h> |
| 8 | #include <linux/pageblock-flags.h> | 7 | #include <linux/pageblock-flags.h> |
diff --git a/mm/quicklist.c b/mm/quicklist.c index 3f703f7cb398..8dbb6805ef35 100644 --- a/mm/quicklist.c +++ b/mm/quicklist.c | |||
| @@ -26,7 +26,10 @@ DEFINE_PER_CPU(struct quicklist, quicklist)[CONFIG_NR_QUICK]; | |||
| 26 | static unsigned long max_pages(unsigned long min_pages) | 26 | static unsigned long max_pages(unsigned long min_pages) |
| 27 | { | 27 | { |
| 28 | unsigned long node_free_pages, max; | 28 | unsigned long node_free_pages, max; |
| 29 | struct zone *zones = NODE_DATA(numa_node_id())->node_zones; | 29 | int node = numa_node_id(); |
| 30 | struct zone *zones = NODE_DATA(node)->node_zones; | ||
| 31 | int num_cpus_on_node; | ||
| 32 | node_to_cpumask_ptr(cpumask_on_node, node); | ||
| 30 | 33 | ||
| 31 | node_free_pages = | 34 | node_free_pages = |
| 32 | #ifdef CONFIG_ZONE_DMA | 35 | #ifdef CONFIG_ZONE_DMA |
| @@ -38,6 +41,10 @@ static unsigned long max_pages(unsigned long min_pages) | |||
| 38 | zone_page_state(&zones[ZONE_NORMAL], NR_FREE_PAGES); | 41 | zone_page_state(&zones[ZONE_NORMAL], NR_FREE_PAGES); |
| 39 | 42 | ||
| 40 | max = node_free_pages / FRACTION_OF_NODE_MEM; | 43 | max = node_free_pages / FRACTION_OF_NODE_MEM; |
| 44 | |||
| 45 | num_cpus_on_node = cpus_weight_nr(*cpumask_on_node); | ||
| 46 | max /= num_cpus_on_node; | ||
| 47 | |||
| 41 | return max(max, min_pages); | 48 | return max(max, min_pages); |
| 42 | } | 49 | } |
| 43 | 50 | ||
diff --git a/mm/truncate.c b/mm/truncate.c index 250505091d37..6650c1d878b4 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
| @@ -380,7 +380,7 @@ static int do_launder_page(struct address_space *mapping, struct page *page) | |||
| 380 | * Any pages which are found to be mapped into pagetables are unmapped prior to | 380 | * Any pages which are found to be mapped into pagetables are unmapped prior to |
| 381 | * invalidation. | 381 | * invalidation. |
| 382 | * | 382 | * |
| 383 | * Returns -EIO if any pages could not be invalidated. | 383 | * Returns -EBUSY if any pages could not be invalidated. |
| 384 | */ | 384 | */ |
| 385 | int invalidate_inode_pages2_range(struct address_space *mapping, | 385 | int invalidate_inode_pages2_range(struct address_space *mapping, |
| 386 | pgoff_t start, pgoff_t end) | 386 | pgoff_t start, pgoff_t end) |
| @@ -440,7 +440,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping, | |||
| 440 | ret2 = do_launder_page(mapping, page); | 440 | ret2 = do_launder_page(mapping, page); |
| 441 | if (ret2 == 0) { | 441 | if (ret2 == 0) { |
| 442 | if (!invalidate_complete_page2(mapping, page)) | 442 | if (!invalidate_complete_page2(mapping, page)) |
| 443 | ret2 = -EIO; | 443 | ret2 = -EBUSY; |
| 444 | } | 444 | } |
| 445 | if (ret2 < 0) | 445 | if (ret2 < 0) |
| 446 | ret = ret2; | 446 | ret = ret2; |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 91d3d96805d0..b12dae2b0b2d 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -1029,6 +1029,11 @@ skip: | |||
| 1029 | } | 1029 | } |
| 1030 | } | 1030 | } |
| 1031 | 1031 | ||
| 1032 | static inline bool inetdev_valid_mtu(unsigned mtu) | ||
| 1033 | { | ||
| 1034 | return mtu >= 68; | ||
| 1035 | } | ||
| 1036 | |||
| 1032 | /* Called only under RTNL semaphore */ | 1037 | /* Called only under RTNL semaphore */ |
| 1033 | 1038 | ||
| 1034 | static int inetdev_event(struct notifier_block *this, unsigned long event, | 1039 | static int inetdev_event(struct notifier_block *this, unsigned long event, |
| @@ -1048,6 +1053,10 @@ static int inetdev_event(struct notifier_block *this, unsigned long event, | |||
| 1048 | IN_DEV_CONF_SET(in_dev, NOXFRM, 1); | 1053 | IN_DEV_CONF_SET(in_dev, NOXFRM, 1); |
| 1049 | IN_DEV_CONF_SET(in_dev, NOPOLICY, 1); | 1054 | IN_DEV_CONF_SET(in_dev, NOPOLICY, 1); |
| 1050 | } | 1055 | } |
| 1056 | } else if (event == NETDEV_CHANGEMTU) { | ||
| 1057 | /* Re-enabling IP */ | ||
| 1058 | if (inetdev_valid_mtu(dev->mtu)) | ||
| 1059 | in_dev = inetdev_init(dev); | ||
| 1051 | } | 1060 | } |
| 1052 | goto out; | 1061 | goto out; |
| 1053 | } | 1062 | } |
| @@ -1058,7 +1067,7 @@ static int inetdev_event(struct notifier_block *this, unsigned long event, | |||
| 1058 | dev->ip_ptr = NULL; | 1067 | dev->ip_ptr = NULL; |
| 1059 | break; | 1068 | break; |
| 1060 | case NETDEV_UP: | 1069 | case NETDEV_UP: |
| 1061 | if (dev->mtu < 68) | 1070 | if (!inetdev_valid_mtu(dev->mtu)) |
| 1062 | break; | 1071 | break; |
| 1063 | if (dev->flags & IFF_LOOPBACK) { | 1072 | if (dev->flags & IFF_LOOPBACK) { |
| 1064 | struct in_ifaddr *ifa; | 1073 | struct in_ifaddr *ifa; |
| @@ -1080,9 +1089,9 @@ static int inetdev_event(struct notifier_block *this, unsigned long event, | |||
| 1080 | ip_mc_down(in_dev); | 1089 | ip_mc_down(in_dev); |
| 1081 | break; | 1090 | break; |
| 1082 | case NETDEV_CHANGEMTU: | 1091 | case NETDEV_CHANGEMTU: |
| 1083 | if (dev->mtu >= 68) | 1092 | if (inetdev_valid_mtu(dev->mtu)) |
| 1084 | break; | 1093 | break; |
| 1085 | /* MTU falled under 68, disable IP */ | 1094 | /* disable IP when MTU is not enough */ |
| 1086 | case NETDEV_UNREGISTER: | 1095 | case NETDEV_UNREGISTER: |
| 1087 | inetdev_destroy(in_dev); | 1096 | inetdev_destroy(in_dev); |
| 1088 | break; | 1097 | break; |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 01d47674f7e5..e53e493606c5 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
| @@ -377,14 +377,14 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) | |||
| 377 | skb_checksum_complete(skb)) { | 377 | skb_checksum_complete(skb)) { |
| 378 | atomic_inc(&sk->sk_drops); | 378 | atomic_inc(&sk->sk_drops); |
| 379 | kfree_skb(skb); | 379 | kfree_skb(skb); |
| 380 | return 0; | 380 | return NET_RX_DROP; |
| 381 | } | 381 | } |
| 382 | 382 | ||
| 383 | /* Charge it to the socket. */ | 383 | /* Charge it to the socket. */ |
| 384 | if (sock_queue_rcv_skb(sk,skb)<0) { | 384 | if (sock_queue_rcv_skb(sk,skb)<0) { |
| 385 | atomic_inc(&sk->sk_drops); | 385 | atomic_inc(&sk->sk_drops); |
| 386 | kfree_skb(skb); | 386 | kfree_skb(skb); |
| 387 | return 0; | 387 | return NET_RX_DROP; |
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | return 0; | 390 | return 0; |
| @@ -429,7 +429,7 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 429 | if (skb_checksum_complete(skb)) { | 429 | if (skb_checksum_complete(skb)) { |
| 430 | atomic_inc(&sk->sk_drops); | 430 | atomic_inc(&sk->sk_drops); |
| 431 | kfree_skb(skb); | 431 | kfree_skb(skb); |
| 432 | return 0; | 432 | return NET_RX_DROP; |
| 433 | } | 433 | } |
| 434 | } | 434 | } |
| 435 | 435 | ||
diff --git a/net/mac80211/debugfs_key.c b/net/mac80211/debugfs_key.c index 7439b63df5d0..cf82acec913a 100644 --- a/net/mac80211/debugfs_key.c +++ b/net/mac80211/debugfs_key.c | |||
| @@ -265,7 +265,7 @@ void ieee80211_debugfs_key_add_default(struct ieee80211_sub_if_data *sdata) | |||
| 265 | key = sdata->default_key; | 265 | key = sdata->default_key; |
| 266 | if (key) { | 266 | if (key) { |
| 267 | sprintf(buf, "../keys/%d", key->debugfs.cnt); | 267 | sprintf(buf, "../keys/%d", key->debugfs.cnt); |
| 268 | sdata->debugfs.default_key = | 268 | sdata->common_debugfs.default_key = |
| 269 | debugfs_create_symlink("default_key", | 269 | debugfs_create_symlink("default_key", |
| 270 | sdata->debugfsdir, buf); | 270 | sdata->debugfsdir, buf); |
| 271 | } else | 271 | } else |
| @@ -277,8 +277,8 @@ void ieee80211_debugfs_key_remove_default(struct ieee80211_sub_if_data *sdata) | |||
| 277 | if (!sdata) | 277 | if (!sdata) |
| 278 | return; | 278 | return; |
| 279 | 279 | ||
| 280 | debugfs_remove(sdata->debugfs.default_key); | 280 | debugfs_remove(sdata->common_debugfs.default_key); |
| 281 | sdata->debugfs.default_key = NULL; | 281 | sdata->common_debugfs.default_key = NULL; |
| 282 | } | 282 | } |
| 283 | 283 | ||
| 284 | void ieee80211_debugfs_key_sta_del(struct ieee80211_key *key, | 284 | void ieee80211_debugfs_key_sta_del(struct ieee80211_key *key, |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 586a9b49b0fc..4498d8713652 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -496,8 +496,10 @@ struct ieee80211_sub_if_data { | |||
| 496 | struct { | 496 | struct { |
| 497 | struct dentry *mode; | 497 | struct dentry *mode; |
| 498 | } monitor; | 498 | } monitor; |
| 499 | struct dentry *default_key; | ||
| 500 | } debugfs; | 499 | } debugfs; |
| 500 | struct { | ||
| 501 | struct dentry *default_key; | ||
| 502 | } common_debugfs; | ||
| 501 | 503 | ||
| 502 | #ifdef CONFIG_MAC80211_MESH | 504 | #ifdef CONFIG_MAC80211_MESH |
| 503 | struct dentry *mesh_stats_dir; | 505 | struct dentry *mesh_stats_dir; |
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 5cafdd4c8018..8eb79e92e94c 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
| @@ -205,7 +205,7 @@ replay: | |||
| 205 | } | 205 | } |
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | root_lock = qdisc_root_lock(q); | 208 | root_lock = qdisc_root_sleeping_lock(q); |
| 209 | 209 | ||
| 210 | if (tp == NULL) { | 210 | if (tp == NULL) { |
| 211 | /* Proto-tcf does not exist, create new one */ | 211 | /* Proto-tcf does not exist, create new one */ |
diff --git a/net/sched/cls_route.c b/net/sched/cls_route.c index 481260a4f10f..e3d8455eebc2 100644 --- a/net/sched/cls_route.c +++ b/net/sched/cls_route.c | |||
| @@ -75,7 +75,7 @@ static __inline__ int route4_fastmap_hash(u32 id, int iif) | |||
| 75 | static inline | 75 | static inline |
| 76 | void route4_reset_fastmap(struct Qdisc *q, struct route4_head *head, u32 id) | 76 | void route4_reset_fastmap(struct Qdisc *q, struct route4_head *head, u32 id) |
| 77 | { | 77 | { |
| 78 | spinlock_t *root_lock = qdisc_root_lock(q); | 78 | spinlock_t *root_lock = qdisc_root_sleeping_lock(q); |
| 79 | 79 | ||
| 80 | spin_lock_bh(root_lock); | 80 | spin_lock_bh(root_lock); |
| 81 | memset(head->fastmap, 0, sizeof(head->fastmap)); | 81 | memset(head->fastmap, 0, sizeof(head->fastmap)); |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 506b709510b6..1122c952aa99 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
| @@ -1169,8 +1169,8 @@ static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid, | |||
| 1169 | if (q->stab && qdisc_dump_stab(skb, q->stab) < 0) | 1169 | if (q->stab && qdisc_dump_stab(skb, q->stab) < 0) |
| 1170 | goto nla_put_failure; | 1170 | goto nla_put_failure; |
| 1171 | 1171 | ||
| 1172 | if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, | 1172 | if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, TCA_XSTATS, |
| 1173 | TCA_XSTATS, qdisc_root_lock(q), &d) < 0) | 1173 | qdisc_root_sleeping_lock(q), &d) < 0) |
| 1174 | goto nla_put_failure; | 1174 | goto nla_put_failure; |
| 1175 | 1175 | ||
| 1176 | if (q->ops->dump_stats && q->ops->dump_stats(q, &d) < 0) | 1176 | if (q->ops->dump_stats && q->ops->dump_stats(q, &d) < 0) |
| @@ -1461,8 +1461,8 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q, | |||
| 1461 | if (cl_ops->dump && cl_ops->dump(q, cl, skb, tcm) < 0) | 1461 | if (cl_ops->dump && cl_ops->dump(q, cl, skb, tcm) < 0) |
| 1462 | goto nla_put_failure; | 1462 | goto nla_put_failure; |
| 1463 | 1463 | ||
| 1464 | if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, | 1464 | if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, TCA_XSTATS, |
| 1465 | TCA_XSTATS, qdisc_root_lock(q), &d) < 0) | 1465 | qdisc_root_sleeping_lock(q), &d) < 0) |
| 1466 | goto nla_put_failure; | 1466 | goto nla_put_failure; |
| 1467 | 1467 | ||
| 1468 | if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0) | 1468 | if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0) |
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 9b720adedead..8b06fa900482 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
| @@ -1754,7 +1754,7 @@ static void cbq_put(struct Qdisc *sch, unsigned long arg) | |||
| 1754 | 1754 | ||
| 1755 | if (--cl->refcnt == 0) { | 1755 | if (--cl->refcnt == 0) { |
| 1756 | #ifdef CONFIG_NET_CLS_ACT | 1756 | #ifdef CONFIG_NET_CLS_ACT |
| 1757 | spinlock_t *root_lock = qdisc_root_lock(sch); | 1757 | spinlock_t *root_lock = qdisc_root_sleeping_lock(sch); |
| 1758 | struct cbq_sched_data *q = qdisc_priv(sch); | 1758 | struct cbq_sched_data *q = qdisc_priv(sch); |
| 1759 | 1759 | ||
| 1760 | spin_lock_bh(root_lock); | 1760 | spin_lock_bh(root_lock); |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 97d4761cc31e..d14f02056ae6 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
| @@ -1043,7 +1043,7 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt) | |||
| 1043 | 1043 | ||
| 1044 | static int htb_dump(struct Qdisc *sch, struct sk_buff *skb) | 1044 | static int htb_dump(struct Qdisc *sch, struct sk_buff *skb) |
| 1045 | { | 1045 | { |
| 1046 | spinlock_t *root_lock = qdisc_root_lock(sch); | 1046 | spinlock_t *root_lock = qdisc_root_sleeping_lock(sch); |
| 1047 | struct htb_sched *q = qdisc_priv(sch); | 1047 | struct htb_sched *q = qdisc_priv(sch); |
| 1048 | struct nlattr *nest; | 1048 | struct nlattr *nest; |
| 1049 | struct tc_htb_glob gopt; | 1049 | struct tc_htb_glob gopt; |
| @@ -1075,7 +1075,7 @@ static int htb_dump_class(struct Qdisc *sch, unsigned long arg, | |||
| 1075 | struct sk_buff *skb, struct tcmsg *tcm) | 1075 | struct sk_buff *skb, struct tcmsg *tcm) |
| 1076 | { | 1076 | { |
| 1077 | struct htb_class *cl = (struct htb_class *)arg; | 1077 | struct htb_class *cl = (struct htb_class *)arg; |
| 1078 | spinlock_t *root_lock = qdisc_root_lock(sch); | 1078 | spinlock_t *root_lock = qdisc_root_sleeping_lock(sch); |
| 1079 | struct nlattr *nest; | 1079 | struct nlattr *nest; |
| 1080 | struct tc_htb_opt opt; | 1080 | struct tc_htb_opt opt; |
| 1081 | 1081 | ||
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index fb0294d0b55e..3781e55046d0 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
| @@ -341,7 +341,7 @@ static int get_dist_table(struct Qdisc *sch, const struct nlattr *attr) | |||
| 341 | for (i = 0; i < n; i++) | 341 | for (i = 0; i < n; i++) |
| 342 | d->table[i] = data[i]; | 342 | d->table[i] = data[i]; |
| 343 | 343 | ||
| 344 | root_lock = qdisc_root_lock(sch); | 344 | root_lock = qdisc_root_sleeping_lock(sch); |
| 345 | 345 | ||
| 346 | spin_lock_bh(root_lock); | 346 | spin_lock_bh(root_lock); |
| 347 | d = xchg(&q->delay_dist, d); | 347 | d = xchg(&q->delay_dist, d); |
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index 2c35c678563b..d35ef059abb1 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c | |||
| @@ -161,7 +161,7 @@ teql_destroy(struct Qdisc* sch) | |||
| 161 | txq = netdev_get_tx_queue(master->dev, 0); | 161 | txq = netdev_get_tx_queue(master->dev, 0); |
| 162 | master->slaves = NULL; | 162 | master->slaves = NULL; |
| 163 | 163 | ||
| 164 | root_lock = qdisc_root_lock(txq->qdisc); | 164 | root_lock = qdisc_root_sleeping_lock(txq->qdisc); |
| 165 | spin_lock_bh(root_lock); | 165 | spin_lock_bh(root_lock); |
| 166 | qdisc_reset(txq->qdisc); | 166 | qdisc_reset(txq->qdisc); |
| 167 | spin_unlock_bh(root_lock); | 167 | spin_unlock_bh(root_lock); |
diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c index 0f8c439b848a..5231f7aaac0e 100644 --- a/net/sunrpc/sysctl.c +++ b/net/sunrpc/sysctl.c | |||
| @@ -60,24 +60,14 @@ static int proc_do_xprt(ctl_table *table, int write, struct file *file, | |||
| 60 | void __user *buffer, size_t *lenp, loff_t *ppos) | 60 | void __user *buffer, size_t *lenp, loff_t *ppos) |
| 61 | { | 61 | { |
| 62 | char tmpbuf[256]; | 62 | char tmpbuf[256]; |
| 63 | int len; | 63 | size_t len; |
| 64 | |||
| 64 | if ((*ppos && !write) || !*lenp) { | 65 | if ((*ppos && !write) || !*lenp) { |
| 65 | *lenp = 0; | 66 | *lenp = 0; |
| 66 | return 0; | 67 | return 0; |
| 67 | } | 68 | } |
| 68 | if (write) | 69 | len = svc_print_xprts(tmpbuf, sizeof(tmpbuf)); |
| 69 | return -EINVAL; | 70 | return simple_read_from_buffer(buffer, *lenp, ppos, tmpbuf, len); |
| 70 | else { | ||
| 71 | len = svc_print_xprts(tmpbuf, sizeof(tmpbuf)); | ||
| 72 | if (!access_ok(VERIFY_WRITE, buffer, len)) | ||
| 73 | return -EFAULT; | ||
| 74 | |||
| 75 | if (__copy_to_user(buffer, tmpbuf, len)) | ||
| 76 | return -EFAULT; | ||
| 77 | } | ||
| 78 | *lenp -= len; | ||
| 79 | *ppos += len; | ||
| 80 | return 0; | ||
| 81 | } | 71 | } |
| 82 | 72 | ||
| 83 | static int | 73 | static int |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c index b4b17f44cb29..74de31a06616 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | |||
| @@ -443,18 +443,18 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) | |||
| 443 | 443 | ||
| 444 | dprintk("svcrdma: rqstp=%p\n", rqstp); | 444 | dprintk("svcrdma: rqstp=%p\n", rqstp); |
| 445 | 445 | ||
| 446 | spin_lock_bh(&rdma_xprt->sc_read_complete_lock); | 446 | spin_lock_bh(&rdma_xprt->sc_rq_dto_lock); |
| 447 | if (!list_empty(&rdma_xprt->sc_read_complete_q)) { | 447 | if (!list_empty(&rdma_xprt->sc_read_complete_q)) { |
| 448 | ctxt = list_entry(rdma_xprt->sc_read_complete_q.next, | 448 | ctxt = list_entry(rdma_xprt->sc_read_complete_q.next, |
| 449 | struct svc_rdma_op_ctxt, | 449 | struct svc_rdma_op_ctxt, |
| 450 | dto_q); | 450 | dto_q); |
| 451 | list_del_init(&ctxt->dto_q); | 451 | list_del_init(&ctxt->dto_q); |
| 452 | } | 452 | } |
| 453 | spin_unlock_bh(&rdma_xprt->sc_read_complete_lock); | 453 | if (ctxt) { |
| 454 | if (ctxt) | 454 | spin_unlock_bh(&rdma_xprt->sc_rq_dto_lock); |
| 455 | return rdma_read_complete(rqstp, ctxt); | 455 | return rdma_read_complete(rqstp, ctxt); |
| 456 | } | ||
| 456 | 457 | ||
| 457 | spin_lock_bh(&rdma_xprt->sc_rq_dto_lock); | ||
| 458 | if (!list_empty(&rdma_xprt->sc_rq_dto_q)) { | 458 | if (!list_empty(&rdma_xprt->sc_rq_dto_q)) { |
| 459 | ctxt = list_entry(rdma_xprt->sc_rq_dto_q.next, | 459 | ctxt = list_entry(rdma_xprt->sc_rq_dto_q.next, |
| 460 | struct svc_rdma_op_ctxt, | 460 | struct svc_rdma_op_ctxt, |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index 19ddc382b777..900cb69728c6 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c | |||
| @@ -359,11 +359,11 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt) | |||
| 359 | if (test_bit(RDMACTXT_F_LAST_CTXT, &ctxt->flags)) { | 359 | if (test_bit(RDMACTXT_F_LAST_CTXT, &ctxt->flags)) { |
| 360 | struct svc_rdma_op_ctxt *read_hdr = ctxt->read_hdr; | 360 | struct svc_rdma_op_ctxt *read_hdr = ctxt->read_hdr; |
| 361 | BUG_ON(!read_hdr); | 361 | BUG_ON(!read_hdr); |
| 362 | spin_lock_bh(&xprt->sc_rq_dto_lock); | ||
| 362 | set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags); | 363 | set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags); |
| 363 | spin_lock_bh(&xprt->sc_read_complete_lock); | ||
| 364 | list_add_tail(&read_hdr->dto_q, | 364 | list_add_tail(&read_hdr->dto_q, |
| 365 | &xprt->sc_read_complete_q); | 365 | &xprt->sc_read_complete_q); |
| 366 | spin_unlock_bh(&xprt->sc_read_complete_lock); | 366 | spin_unlock_bh(&xprt->sc_rq_dto_lock); |
| 367 | svc_xprt_enqueue(&xprt->sc_xprt); | 367 | svc_xprt_enqueue(&xprt->sc_xprt); |
| 368 | } | 368 | } |
| 369 | svc_rdma_put_context(ctxt, 0); | 369 | svc_rdma_put_context(ctxt, 0); |
| @@ -428,7 +428,6 @@ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv, | |||
| 428 | init_waitqueue_head(&cma_xprt->sc_send_wait); | 428 | init_waitqueue_head(&cma_xprt->sc_send_wait); |
| 429 | 429 | ||
| 430 | spin_lock_init(&cma_xprt->sc_lock); | 430 | spin_lock_init(&cma_xprt->sc_lock); |
| 431 | spin_lock_init(&cma_xprt->sc_read_complete_lock); | ||
| 432 | spin_lock_init(&cma_xprt->sc_rq_dto_lock); | 431 | spin_lock_init(&cma_xprt->sc_rq_dto_lock); |
| 433 | 432 | ||
| 434 | cma_xprt->sc_ord = svcrdma_ord; | 433 | cma_xprt->sc_ord = svcrdma_ord; |
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index b1ff16aa4bdb..3ddaff42d1bb 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
| @@ -96,8 +96,8 @@ struct bcbearer { | |||
| 96 | struct media media; | 96 | struct media media; |
| 97 | struct bcbearer_pair bpairs[MAX_BEARERS]; | 97 | struct bcbearer_pair bpairs[MAX_BEARERS]; |
| 98 | struct bcbearer_pair bpairs_temp[TIPC_MAX_LINK_PRI + 1]; | 98 | struct bcbearer_pair bpairs_temp[TIPC_MAX_LINK_PRI + 1]; |
| 99 | struct node_map remains; | 99 | struct tipc_node_map remains; |
| 100 | struct node_map remains_new; | 100 | struct tipc_node_map remains_new; |
| 101 | }; | 101 | }; |
| 102 | 102 | ||
| 103 | /** | 103 | /** |
| @@ -110,7 +110,7 @@ struct bcbearer { | |||
| 110 | 110 | ||
| 111 | struct bclink { | 111 | struct bclink { |
| 112 | struct link link; | 112 | struct link link; |
| 113 | struct node node; | 113 | struct tipc_node node; |
| 114 | }; | 114 | }; |
| 115 | 115 | ||
| 116 | 116 | ||
| @@ -149,7 +149,7 @@ static void bcbuf_decr_acks(struct sk_buff *buf) | |||
| 149 | * Called with 'node' locked, bc_lock unlocked | 149 | * Called with 'node' locked, bc_lock unlocked |
| 150 | */ | 150 | */ |
| 151 | 151 | ||
| 152 | static void bclink_set_gap(struct node *n_ptr) | 152 | static void bclink_set_gap(struct tipc_node *n_ptr) |
| 153 | { | 153 | { |
| 154 | struct sk_buff *buf = n_ptr->bclink.deferred_head; | 154 | struct sk_buff *buf = n_ptr->bclink.deferred_head; |
| 155 | 155 | ||
| @@ -202,7 +202,7 @@ static void bclink_retransmit_pkt(u32 after, u32 to) | |||
| 202 | * Node is locked, bc_lock unlocked. | 202 | * Node is locked, bc_lock unlocked. |
| 203 | */ | 203 | */ |
| 204 | 204 | ||
| 205 | void tipc_bclink_acknowledge(struct node *n_ptr, u32 acked) | 205 | void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked) |
| 206 | { | 206 | { |
| 207 | struct sk_buff *crs; | 207 | struct sk_buff *crs; |
| 208 | struct sk_buff *next; | 208 | struct sk_buff *next; |
| @@ -250,7 +250,7 @@ void tipc_bclink_acknowledge(struct node *n_ptr, u32 acked) | |||
| 250 | * tipc_net_lock and node lock set | 250 | * tipc_net_lock and node lock set |
| 251 | */ | 251 | */ |
| 252 | 252 | ||
| 253 | static void bclink_send_ack(struct node *n_ptr) | 253 | static void bclink_send_ack(struct tipc_node *n_ptr) |
| 254 | { | 254 | { |
| 255 | struct link *l_ptr = n_ptr->active_links[n_ptr->addr & 1]; | 255 | struct link *l_ptr = n_ptr->active_links[n_ptr->addr & 1]; |
| 256 | 256 | ||
| @@ -264,7 +264,7 @@ static void bclink_send_ack(struct node *n_ptr) | |||
| 264 | * tipc_net_lock and node lock set | 264 | * tipc_net_lock and node lock set |
| 265 | */ | 265 | */ |
| 266 | 266 | ||
| 267 | static void bclink_send_nack(struct node *n_ptr) | 267 | static void bclink_send_nack(struct tipc_node *n_ptr) |
| 268 | { | 268 | { |
| 269 | struct sk_buff *buf; | 269 | struct sk_buff *buf; |
| 270 | struct tipc_msg *msg; | 270 | struct tipc_msg *msg; |
| @@ -308,7 +308,7 @@ static void bclink_send_nack(struct node *n_ptr) | |||
| 308 | * tipc_net_lock and node lock set | 308 | * tipc_net_lock and node lock set |
| 309 | */ | 309 | */ |
| 310 | 310 | ||
| 311 | void tipc_bclink_check_gap(struct node *n_ptr, u32 last_sent) | 311 | void tipc_bclink_check_gap(struct tipc_node *n_ptr, u32 last_sent) |
| 312 | { | 312 | { |
| 313 | if (!n_ptr->bclink.supported || | 313 | if (!n_ptr->bclink.supported || |
| 314 | less_eq(last_sent, mod(n_ptr->bclink.last_in))) | 314 | less_eq(last_sent, mod(n_ptr->bclink.last_in))) |
| @@ -328,7 +328,7 @@ void tipc_bclink_check_gap(struct node *n_ptr, u32 last_sent) | |||
| 328 | 328 | ||
| 329 | static void tipc_bclink_peek_nack(u32 dest, u32 sender_tag, u32 gap_after, u32 gap_to) | 329 | static void tipc_bclink_peek_nack(u32 dest, u32 sender_tag, u32 gap_after, u32 gap_to) |
| 330 | { | 330 | { |
| 331 | struct node *n_ptr = tipc_node_find(dest); | 331 | struct tipc_node *n_ptr = tipc_node_find(dest); |
| 332 | u32 my_after, my_to; | 332 | u32 my_after, my_to; |
| 333 | 333 | ||
| 334 | if (unlikely(!n_ptr || !tipc_node_is_up(n_ptr))) | 334 | if (unlikely(!n_ptr || !tipc_node_is_up(n_ptr))) |
| @@ -418,7 +418,7 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) | |||
| 418 | static int rx_count = 0; | 418 | static int rx_count = 0; |
| 419 | #endif | 419 | #endif |
| 420 | struct tipc_msg *msg = buf_msg(buf); | 420 | struct tipc_msg *msg = buf_msg(buf); |
| 421 | struct node* node = tipc_node_find(msg_prevnode(msg)); | 421 | struct tipc_node* node = tipc_node_find(msg_prevnode(msg)); |
| 422 | u32 next_in; | 422 | u32 next_in; |
| 423 | u32 seqno; | 423 | u32 seqno; |
| 424 | struct sk_buff *deferred; | 424 | struct sk_buff *deferred; |
| @@ -538,7 +538,7 @@ u32 tipc_bclink_get_last_sent(void) | |||
| 538 | return last_sent; | 538 | return last_sent; |
| 539 | } | 539 | } |
| 540 | 540 | ||
| 541 | u32 tipc_bclink_acks_missing(struct node *n_ptr) | 541 | u32 tipc_bclink_acks_missing(struct tipc_node *n_ptr) |
| 542 | { | 542 | { |
| 543 | return (n_ptr->bclink.supported && | 543 | return (n_ptr->bclink.supported && |
| 544 | (tipc_bclink_get_last_sent() != n_ptr->bclink.acked)); | 544 | (tipc_bclink_get_last_sent() != n_ptr->bclink.acked)); |
diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h index a2416fa6b906..5aa024b99c55 100644 --- a/net/tipc/bcast.h +++ b/net/tipc/bcast.h | |||
| @@ -41,12 +41,12 @@ | |||
| 41 | #define WSIZE 32 | 41 | #define WSIZE 32 |
| 42 | 42 | ||
| 43 | /** | 43 | /** |
| 44 | * struct node_map - set of node identifiers | 44 | * struct tipc_node_map - set of node identifiers |
| 45 | * @count: # of nodes in set | 45 | * @count: # of nodes in set |
| 46 | * @map: bitmap of node identifiers that are in the set | 46 | * @map: bitmap of node identifiers that are in the set |
| 47 | */ | 47 | */ |
| 48 | 48 | ||
| 49 | struct node_map { | 49 | struct tipc_node_map { |
| 50 | u32 count; | 50 | u32 count; |
| 51 | u32 map[MAX_NODES / WSIZE]; | 51 | u32 map[MAX_NODES / WSIZE]; |
| 52 | }; | 52 | }; |
| @@ -68,7 +68,7 @@ struct port_list { | |||
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| 70 | 70 | ||
| 71 | struct node; | 71 | struct tipc_node; |
| 72 | 72 | ||
| 73 | extern char tipc_bclink_name[]; | 73 | extern char tipc_bclink_name[]; |
| 74 | 74 | ||
| @@ -77,7 +77,7 @@ extern char tipc_bclink_name[]; | |||
| 77 | * nmap_add - add a node to a node map | 77 | * nmap_add - add a node to a node map |
| 78 | */ | 78 | */ |
| 79 | 79 | ||
| 80 | static inline void tipc_nmap_add(struct node_map *nm_ptr, u32 node) | 80 | static inline void tipc_nmap_add(struct tipc_node_map *nm_ptr, u32 node) |
| 81 | { | 81 | { |
| 82 | int n = tipc_node(node); | 82 | int n = tipc_node(node); |
| 83 | int w = n / WSIZE; | 83 | int w = n / WSIZE; |
| @@ -93,7 +93,7 @@ static inline void tipc_nmap_add(struct node_map *nm_ptr, u32 node) | |||
| 93 | * nmap_remove - remove a node from a node map | 93 | * nmap_remove - remove a node from a node map |
| 94 | */ | 94 | */ |
| 95 | 95 | ||
| 96 | static inline void tipc_nmap_remove(struct node_map *nm_ptr, u32 node) | 96 | static inline void tipc_nmap_remove(struct tipc_node_map *nm_ptr, u32 node) |
| 97 | { | 97 | { |
| 98 | int n = tipc_node(node); | 98 | int n = tipc_node(node); |
| 99 | int w = n / WSIZE; | 99 | int w = n / WSIZE; |
| @@ -109,7 +109,7 @@ static inline void tipc_nmap_remove(struct node_map *nm_ptr, u32 node) | |||
| 109 | * nmap_equal - test for equality of node maps | 109 | * nmap_equal - test for equality of node maps |
| 110 | */ | 110 | */ |
| 111 | 111 | ||
| 112 | static inline int tipc_nmap_equal(struct node_map *nm_a, struct node_map *nm_b) | 112 | static inline int tipc_nmap_equal(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b) |
| 113 | { | 113 | { |
| 114 | return !memcmp(nm_a, nm_b, sizeof(*nm_a)); | 114 | return !memcmp(nm_a, nm_b, sizeof(*nm_a)); |
| 115 | } | 115 | } |
| @@ -121,8 +121,8 @@ static inline int tipc_nmap_equal(struct node_map *nm_a, struct node_map *nm_b) | |||
| 121 | * @nm_diff: output node map A-B (i.e. nodes of A that are not in B) | 121 | * @nm_diff: output node map A-B (i.e. nodes of A that are not in B) |
| 122 | */ | 122 | */ |
| 123 | 123 | ||
| 124 | static inline void tipc_nmap_diff(struct node_map *nm_a, struct node_map *nm_b, | 124 | static inline void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b, |
| 125 | struct node_map *nm_diff) | 125 | struct tipc_node_map *nm_diff) |
| 126 | { | 126 | { |
| 127 | int stop = sizeof(nm_a->map) / sizeof(u32); | 127 | int stop = sizeof(nm_a->map) / sizeof(u32); |
| 128 | int w; | 128 | int w; |
| @@ -195,12 +195,12 @@ static inline void tipc_port_list_free(struct port_list *pl_ptr) | |||
| 195 | 195 | ||
| 196 | int tipc_bclink_init(void); | 196 | int tipc_bclink_init(void); |
| 197 | void tipc_bclink_stop(void); | 197 | void tipc_bclink_stop(void); |
| 198 | void tipc_bclink_acknowledge(struct node *n_ptr, u32 acked); | 198 | void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked); |
| 199 | int tipc_bclink_send_msg(struct sk_buff *buf); | 199 | int tipc_bclink_send_msg(struct sk_buff *buf); |
| 200 | void tipc_bclink_recv_pkt(struct sk_buff *buf); | 200 | void tipc_bclink_recv_pkt(struct sk_buff *buf); |
| 201 | u32 tipc_bclink_get_last_sent(void); | 201 | u32 tipc_bclink_get_last_sent(void); |
| 202 | u32 tipc_bclink_acks_missing(struct node *n_ptr); | 202 | u32 tipc_bclink_acks_missing(struct tipc_node *n_ptr); |
| 203 | void tipc_bclink_check_gap(struct node *n_ptr, u32 seqno); | 203 | void tipc_bclink_check_gap(struct tipc_node *n_ptr, u32 seqno); |
| 204 | int tipc_bclink_stats(char *stats_buf, const u32 buf_size); | 204 | int tipc_bclink_stats(char *stats_buf, const u32 buf_size); |
| 205 | int tipc_bclink_reset_stats(void); | 205 | int tipc_bclink_reset_stats(void); |
| 206 | int tipc_bclink_set_queue_limits(u32 limit); | 206 | int tipc_bclink_set_queue_limits(u32 limit); |
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 6a9aba3edd08..a7a36779b9b3 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
| @@ -599,7 +599,7 @@ int tipc_block_bearer(const char *name) | |||
| 599 | spin_lock_bh(&b_ptr->publ.lock); | 599 | spin_lock_bh(&b_ptr->publ.lock); |
| 600 | b_ptr->publ.blocked = 1; | 600 | b_ptr->publ.blocked = 1; |
| 601 | list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) { | 601 | list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) { |
| 602 | struct node *n_ptr = l_ptr->owner; | 602 | struct tipc_node *n_ptr = l_ptr->owner; |
| 603 | 603 | ||
| 604 | spin_lock_bh(&n_ptr->lock); | 604 | spin_lock_bh(&n_ptr->lock); |
| 605 | tipc_link_reset(l_ptr); | 605 | tipc_link_reset(l_ptr); |
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h index 6a36b6600e6c..ca5734892713 100644 --- a/net/tipc/bearer.h +++ b/net/tipc/bearer.h | |||
| @@ -104,7 +104,7 @@ struct bearer { | |||
| 104 | u32 continue_count; | 104 | u32 continue_count; |
| 105 | int active; | 105 | int active; |
| 106 | char net_plane; | 106 | char net_plane; |
| 107 | struct node_map nodes; | 107 | struct tipc_node_map nodes; |
| 108 | }; | 108 | }; |
| 109 | 109 | ||
| 110 | struct bearer_name { | 110 | struct bearer_name { |
diff --git a/net/tipc/cluster.c b/net/tipc/cluster.c index 46ee6c58532d..689fdefe9d04 100644 --- a/net/tipc/cluster.c +++ b/net/tipc/cluster.c | |||
| @@ -48,8 +48,8 @@ static void tipc_cltr_multicast(struct cluster *c_ptr, struct sk_buff *buf, | |||
| 48 | u32 lower, u32 upper); | 48 | u32 lower, u32 upper); |
| 49 | static struct sk_buff *tipc_cltr_prepare_routing_msg(u32 data_size, u32 dest); | 49 | static struct sk_buff *tipc_cltr_prepare_routing_msg(u32 data_size, u32 dest); |
| 50 | 50 | ||
| 51 | struct node **tipc_local_nodes = NULL; | 51 | struct tipc_node **tipc_local_nodes = NULL; |
| 52 | struct node_map tipc_cltr_bcast_nodes = {0,{0,}}; | 52 | struct tipc_node_map tipc_cltr_bcast_nodes = {0,{0,}}; |
| 53 | u32 tipc_highest_allowed_slave = 0; | 53 | u32 tipc_highest_allowed_slave = 0; |
| 54 | 54 | ||
| 55 | struct cluster *tipc_cltr_create(u32 addr) | 55 | struct cluster *tipc_cltr_create(u32 addr) |
| @@ -115,7 +115,7 @@ void tipc_cltr_delete(struct cluster *c_ptr) | |||
| 115 | 115 | ||
| 116 | u32 tipc_cltr_next_node(struct cluster *c_ptr, u32 addr) | 116 | u32 tipc_cltr_next_node(struct cluster *c_ptr, u32 addr) |
| 117 | { | 117 | { |
| 118 | struct node *n_ptr; | 118 | struct tipc_node *n_ptr; |
| 119 | u32 n_num = tipc_node(addr) + 1; | 119 | u32 n_num = tipc_node(addr) + 1; |
| 120 | 120 | ||
| 121 | if (!c_ptr) | 121 | if (!c_ptr) |
| @@ -133,7 +133,7 @@ u32 tipc_cltr_next_node(struct cluster *c_ptr, u32 addr) | |||
| 133 | return 0; | 133 | return 0; |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | void tipc_cltr_attach_node(struct cluster *c_ptr, struct node *n_ptr) | 136 | void tipc_cltr_attach_node(struct cluster *c_ptr, struct tipc_node *n_ptr) |
| 137 | { | 137 | { |
| 138 | u32 n_num = tipc_node(n_ptr->addr); | 138 | u32 n_num = tipc_node(n_ptr->addr); |
| 139 | u32 max_n_num = tipc_max_nodes; | 139 | u32 max_n_num = tipc_max_nodes; |
| @@ -196,7 +196,7 @@ u32 tipc_cltr_select_router(struct cluster *c_ptr, u32 ref) | |||
| 196 | * Uses deterministic and fair algorithm. | 196 | * Uses deterministic and fair algorithm. |
| 197 | */ | 197 | */ |
| 198 | 198 | ||
| 199 | struct node *tipc_cltr_select_node(struct cluster *c_ptr, u32 selector) | 199 | struct tipc_node *tipc_cltr_select_node(struct cluster *c_ptr, u32 selector) |
| 200 | { | 200 | { |
| 201 | u32 n_num; | 201 | u32 n_num; |
| 202 | u32 mask = tipc_max_nodes; | 202 | u32 mask = tipc_max_nodes; |
| @@ -379,7 +379,7 @@ void tipc_cltr_recv_routing_table(struct sk_buff *buf) | |||
| 379 | { | 379 | { |
| 380 | struct tipc_msg *msg = buf_msg(buf); | 380 | struct tipc_msg *msg = buf_msg(buf); |
| 381 | struct cluster *c_ptr; | 381 | struct cluster *c_ptr; |
| 382 | struct node *n_ptr; | 382 | struct tipc_node *n_ptr; |
| 383 | unchar *node_table; | 383 | unchar *node_table; |
| 384 | u32 table_size; | 384 | u32 table_size; |
| 385 | u32 router; | 385 | u32 router; |
| @@ -499,7 +499,7 @@ static void tipc_cltr_multicast(struct cluster *c_ptr, struct sk_buff *buf, | |||
| 499 | u32 lower, u32 upper) | 499 | u32 lower, u32 upper) |
| 500 | { | 500 | { |
| 501 | struct sk_buff *buf_copy; | 501 | struct sk_buff *buf_copy; |
| 502 | struct node *n_ptr; | 502 | struct tipc_node *n_ptr; |
| 503 | u32 n_num; | 503 | u32 n_num; |
| 504 | u32 tstop; | 504 | u32 tstop; |
| 505 | 505 | ||
| @@ -534,7 +534,7 @@ void tipc_cltr_broadcast(struct sk_buff *buf) | |||
| 534 | { | 534 | { |
| 535 | struct sk_buff *buf_copy; | 535 | struct sk_buff *buf_copy; |
| 536 | struct cluster *c_ptr; | 536 | struct cluster *c_ptr; |
| 537 | struct node *n_ptr; | 537 | struct tipc_node *n_ptr; |
| 538 | u32 n_num; | 538 | u32 n_num; |
| 539 | u32 tstart; | 539 | u32 tstart; |
| 540 | u32 tstop; | 540 | u32 tstop; |
diff --git a/net/tipc/cluster.h b/net/tipc/cluster.h index 62df074afaec..333efb0b9c44 100644 --- a/net/tipc/cluster.h +++ b/net/tipc/cluster.h | |||
| @@ -54,24 +54,24 @@ | |||
| 54 | struct cluster { | 54 | struct cluster { |
| 55 | u32 addr; | 55 | u32 addr; |
| 56 | struct _zone *owner; | 56 | struct _zone *owner; |
| 57 | struct node **nodes; | 57 | struct tipc_node **nodes; |
| 58 | u32 highest_node; | 58 | u32 highest_node; |
| 59 | u32 highest_slave; | 59 | u32 highest_slave; |
| 60 | }; | 60 | }; |
| 61 | 61 | ||
| 62 | 62 | ||
| 63 | extern struct node **tipc_local_nodes; | 63 | extern struct tipc_node **tipc_local_nodes; |
| 64 | extern u32 tipc_highest_allowed_slave; | 64 | extern u32 tipc_highest_allowed_slave; |
| 65 | extern struct node_map tipc_cltr_bcast_nodes; | 65 | extern struct tipc_node_map tipc_cltr_bcast_nodes; |
| 66 | 66 | ||
| 67 | void tipc_cltr_remove_as_router(struct cluster *c_ptr, u32 router); | 67 | void tipc_cltr_remove_as_router(struct cluster *c_ptr, u32 router); |
| 68 | void tipc_cltr_send_ext_routes(struct cluster *c_ptr, u32 dest); | 68 | void tipc_cltr_send_ext_routes(struct cluster *c_ptr, u32 dest); |
| 69 | struct node *tipc_cltr_select_node(struct cluster *c_ptr, u32 selector); | 69 | struct tipc_node *tipc_cltr_select_node(struct cluster *c_ptr, u32 selector); |
| 70 | u32 tipc_cltr_select_router(struct cluster *c_ptr, u32 ref); | 70 | u32 tipc_cltr_select_router(struct cluster *c_ptr, u32 ref); |
| 71 | void tipc_cltr_recv_routing_table(struct sk_buff *buf); | 71 | void tipc_cltr_recv_routing_table(struct sk_buff *buf); |
| 72 | struct cluster *tipc_cltr_create(u32 addr); | 72 | struct cluster *tipc_cltr_create(u32 addr); |
| 73 | void tipc_cltr_delete(struct cluster *c_ptr); | 73 | void tipc_cltr_delete(struct cluster *c_ptr); |
| 74 | void tipc_cltr_attach_node(struct cluster *c_ptr, struct node *n_ptr); | 74 | void tipc_cltr_attach_node(struct cluster *c_ptr, struct tipc_node *n_ptr); |
| 75 | void tipc_cltr_send_slave_routes(struct cluster *c_ptr, u32 dest); | 75 | void tipc_cltr_send_slave_routes(struct cluster *c_ptr, u32 dest); |
| 76 | void tipc_cltr_broadcast(struct sk_buff *buf); | 76 | void tipc_cltr_broadcast(struct sk_buff *buf); |
| 77 | int tipc_cltr_init(void); | 77 | int tipc_cltr_init(void); |
diff --git a/net/tipc/discover.c b/net/tipc/discover.c index 1657f0e795ff..74b7d1e28aec 100644 --- a/net/tipc/discover.c +++ b/net/tipc/discover.c | |||
| @@ -193,7 +193,7 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct bearer *b_ptr) | |||
| 193 | /* Always accept link here */ | 193 | /* Always accept link here */ |
| 194 | struct sk_buff *rbuf; | 194 | struct sk_buff *rbuf; |
| 195 | struct tipc_media_addr *addr; | 195 | struct tipc_media_addr *addr; |
| 196 | struct node *n_ptr = tipc_node_find(orig); | 196 | struct tipc_node *n_ptr = tipc_node_find(orig); |
| 197 | int link_fully_up; | 197 | int link_fully_up; |
| 198 | 198 | ||
| 199 | dbg(" in own cluster\n"); | 199 | dbg(" in own cluster\n"); |
diff --git a/net/tipc/link.c b/net/tipc/link.c index d60113ba4b1b..dd4c18b9a35b 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
| @@ -1155,7 +1155,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf) | |||
| 1155 | int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector) | 1155 | int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector) |
| 1156 | { | 1156 | { |
| 1157 | struct link *l_ptr; | 1157 | struct link *l_ptr; |
| 1158 | struct node *n_ptr; | 1158 | struct tipc_node *n_ptr; |
| 1159 | int res = -ELINKCONG; | 1159 | int res = -ELINKCONG; |
| 1160 | 1160 | ||
| 1161 | read_lock_bh(&tipc_net_lock); | 1161 | read_lock_bh(&tipc_net_lock); |
| @@ -1226,7 +1226,7 @@ static int link_send_buf_fast(struct link *l_ptr, struct sk_buff *buf, | |||
| 1226 | int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode) | 1226 | int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode) |
| 1227 | { | 1227 | { |
| 1228 | struct link *l_ptr; | 1228 | struct link *l_ptr; |
| 1229 | struct node *n_ptr; | 1229 | struct tipc_node *n_ptr; |
| 1230 | int res; | 1230 | int res; |
| 1231 | u32 selector = msg_origport(buf_msg(buf)) & 1; | 1231 | u32 selector = msg_origport(buf_msg(buf)) & 1; |
| 1232 | u32 dummy; | 1232 | u32 dummy; |
| @@ -1270,7 +1270,7 @@ int tipc_link_send_sections_fast(struct port *sender, | |||
| 1270 | struct tipc_msg *hdr = &sender->publ.phdr; | 1270 | struct tipc_msg *hdr = &sender->publ.phdr; |
| 1271 | struct link *l_ptr; | 1271 | struct link *l_ptr; |
| 1272 | struct sk_buff *buf; | 1272 | struct sk_buff *buf; |
| 1273 | struct node *node; | 1273 | struct tipc_node *node; |
| 1274 | int res; | 1274 | int res; |
| 1275 | u32 selector = msg_origport(hdr) & 1; | 1275 | u32 selector = msg_origport(hdr) & 1; |
| 1276 | 1276 | ||
| @@ -1364,7 +1364,7 @@ static int link_send_sections_long(struct port *sender, | |||
| 1364 | u32 destaddr) | 1364 | u32 destaddr) |
| 1365 | { | 1365 | { |
| 1366 | struct link *l_ptr; | 1366 | struct link *l_ptr; |
| 1367 | struct node *node; | 1367 | struct tipc_node *node; |
| 1368 | struct tipc_msg *hdr = &sender->publ.phdr; | 1368 | struct tipc_msg *hdr = &sender->publ.phdr; |
| 1369 | u32 dsz = msg_data_sz(hdr); | 1369 | u32 dsz = msg_data_sz(hdr); |
| 1370 | u32 max_pkt,fragm_sz,rest; | 1370 | u32 max_pkt,fragm_sz,rest; |
| @@ -1636,7 +1636,7 @@ void tipc_link_push_queue(struct link *l_ptr) | |||
| 1636 | 1636 | ||
| 1637 | static void link_reset_all(unsigned long addr) | 1637 | static void link_reset_all(unsigned long addr) |
| 1638 | { | 1638 | { |
| 1639 | struct node *n_ptr; | 1639 | struct tipc_node *n_ptr; |
| 1640 | char addr_string[16]; | 1640 | char addr_string[16]; |
| 1641 | u32 i; | 1641 | u32 i; |
| 1642 | 1642 | ||
| @@ -1682,7 +1682,7 @@ static void link_retransmit_failure(struct link *l_ptr, struct sk_buff *buf) | |||
| 1682 | 1682 | ||
| 1683 | /* Handle failure on broadcast link */ | 1683 | /* Handle failure on broadcast link */ |
| 1684 | 1684 | ||
| 1685 | struct node *n_ptr; | 1685 | struct tipc_node *n_ptr; |
| 1686 | char addr_string[16]; | 1686 | char addr_string[16]; |
| 1687 | 1687 | ||
| 1688 | tipc_printf(TIPC_OUTPUT, "Msg seq number: %u, ", msg_seqno(msg)); | 1688 | tipc_printf(TIPC_OUTPUT, "Msg seq number: %u, ", msg_seqno(msg)); |
| @@ -1843,7 +1843,7 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) | |||
| 1843 | read_lock_bh(&tipc_net_lock); | 1843 | read_lock_bh(&tipc_net_lock); |
| 1844 | while (head) { | 1844 | while (head) { |
| 1845 | struct bearer *b_ptr = (struct bearer *)tb_ptr; | 1845 | struct bearer *b_ptr = (struct bearer *)tb_ptr; |
| 1846 | struct node *n_ptr; | 1846 | struct tipc_node *n_ptr; |
| 1847 | struct link *l_ptr; | 1847 | struct link *l_ptr; |
| 1848 | struct sk_buff *crs; | 1848 | struct sk_buff *crs; |
| 1849 | struct sk_buff *buf = head; | 1849 | struct sk_buff *buf = head; |
| @@ -2935,7 +2935,7 @@ void tipc_link_set_queue_limits(struct link *l_ptr, u32 window) | |||
| 2935 | * Returns pointer to link (or 0 if invalid link name). | 2935 | * Returns pointer to link (or 0 if invalid link name). |
| 2936 | */ | 2936 | */ |
| 2937 | 2937 | ||
| 2938 | static struct link *link_find_link(const char *name, struct node **node) | 2938 | static struct link *link_find_link(const char *name, struct tipc_node **node) |
| 2939 | { | 2939 | { |
| 2940 | struct link_name link_name_parts; | 2940 | struct link_name link_name_parts; |
| 2941 | struct bearer *b_ptr; | 2941 | struct bearer *b_ptr; |
| @@ -2965,7 +2965,7 @@ struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space | |||
| 2965 | struct tipc_link_config *args; | 2965 | struct tipc_link_config *args; |
| 2966 | u32 new_value; | 2966 | u32 new_value; |
| 2967 | struct link *l_ptr; | 2967 | struct link *l_ptr; |
| 2968 | struct node *node; | 2968 | struct tipc_node *node; |
| 2969 | int res; | 2969 | int res; |
| 2970 | 2970 | ||
| 2971 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_CONFIG)) | 2971 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_CONFIG)) |
| @@ -3043,7 +3043,7 @@ struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_ | |||
| 3043 | { | 3043 | { |
| 3044 | char *link_name; | 3044 | char *link_name; |
| 3045 | struct link *l_ptr; | 3045 | struct link *l_ptr; |
| 3046 | struct node *node; | 3046 | struct tipc_node *node; |
| 3047 | 3047 | ||
| 3048 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_NAME)) | 3048 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_NAME)) |
| 3049 | return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); | 3049 | return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); |
| @@ -3091,7 +3091,7 @@ static int tipc_link_stats(const char *name, char *buf, const u32 buf_size) | |||
| 3091 | { | 3091 | { |
| 3092 | struct print_buf pb; | 3092 | struct print_buf pb; |
| 3093 | struct link *l_ptr; | 3093 | struct link *l_ptr; |
| 3094 | struct node *node; | 3094 | struct tipc_node *node; |
| 3095 | char *status; | 3095 | char *status; |
| 3096 | u32 profile_total = 0; | 3096 | u32 profile_total = 0; |
| 3097 | 3097 | ||
| @@ -3207,7 +3207,7 @@ int link_control(const char *name, u32 op, u32 val) | |||
| 3207 | int res = -EINVAL; | 3207 | int res = -EINVAL; |
| 3208 | struct link *l_ptr; | 3208 | struct link *l_ptr; |
| 3209 | u32 bearer_id; | 3209 | u32 bearer_id; |
| 3210 | struct node * node; | 3210 | struct tipc_node * node; |
| 3211 | u32 a; | 3211 | u32 a; |
| 3212 | 3212 | ||
| 3213 | a = link_name2addr(name, &bearer_id); | 3213 | a = link_name2addr(name, &bearer_id); |
| @@ -3249,7 +3249,7 @@ int link_control(const char *name, u32 op, u32 val) | |||
| 3249 | 3249 | ||
| 3250 | u32 tipc_link_get_max_pkt(u32 dest, u32 selector) | 3250 | u32 tipc_link_get_max_pkt(u32 dest, u32 selector) |
| 3251 | { | 3251 | { |
| 3252 | struct node *n_ptr; | 3252 | struct tipc_node *n_ptr; |
| 3253 | struct link *l_ptr; | 3253 | struct link *l_ptr; |
| 3254 | u32 res = MAX_PKT_DEFAULT; | 3254 | u32 res = MAX_PKT_DEFAULT; |
| 3255 | 3255 | ||
diff --git a/net/tipc/link.h b/net/tipc/link.h index 52f3e7c1871f..6a51e38ad25c 100644 --- a/net/tipc/link.h +++ b/net/tipc/link.h | |||
| @@ -116,7 +116,7 @@ struct link { | |||
| 116 | char name[TIPC_MAX_LINK_NAME]; | 116 | char name[TIPC_MAX_LINK_NAME]; |
| 117 | struct tipc_media_addr media_addr; | 117 | struct tipc_media_addr media_addr; |
| 118 | struct timer_list timer; | 118 | struct timer_list timer; |
| 119 | struct node *owner; | 119 | struct tipc_node *owner; |
| 120 | struct list_head link_list; | 120 | struct list_head link_list; |
| 121 | 121 | ||
| 122 | /* Management and link supervision data */ | 122 | /* Management and link supervision data */ |
diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h index b9e7cd336d76..139882d4ed00 100644 --- a/net/tipc/name_table.h +++ b/net/tipc/name_table.h | |||
| @@ -76,7 +76,7 @@ struct publication { | |||
| 76 | u32 node; | 76 | u32 node; |
| 77 | u32 ref; | 77 | u32 ref; |
| 78 | u32 key; | 78 | u32 key; |
| 79 | struct node_subscr subscr; | 79 | struct tipc_node_subscr subscr; |
| 80 | struct list_head local_list; | 80 | struct list_head local_list; |
| 81 | struct list_head pport_list; | 81 | struct list_head pport_list; |
| 82 | struct publication *node_list_next; | 82 | struct publication *node_list_next; |
diff --git a/net/tipc/net.c b/net/tipc/net.c index ec7b04fbdc43..7906608bf510 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c | |||
| @@ -118,7 +118,7 @@ | |||
| 118 | DEFINE_RWLOCK(tipc_net_lock); | 118 | DEFINE_RWLOCK(tipc_net_lock); |
| 119 | struct network tipc_net = { NULL }; | 119 | struct network tipc_net = { NULL }; |
| 120 | 120 | ||
| 121 | struct node *tipc_net_select_remote_node(u32 addr, u32 ref) | 121 | struct tipc_node *tipc_net_select_remote_node(u32 addr, u32 ref) |
| 122 | { | 122 | { |
| 123 | return tipc_zone_select_remote_node(tipc_net.zones[tipc_zone(addr)], addr, ref); | 123 | return tipc_zone_select_remote_node(tipc_net.zones[tipc_zone(addr)], addr, ref); |
| 124 | } | 124 | } |
diff --git a/net/tipc/net.h b/net/tipc/net.h index d154ac2bda9a..de2b9ad8f646 100644 --- a/net/tipc/net.h +++ b/net/tipc/net.h | |||
| @@ -55,7 +55,7 @@ extern rwlock_t tipc_net_lock; | |||
| 55 | void tipc_net_remove_as_router(u32 router); | 55 | void tipc_net_remove_as_router(u32 router); |
| 56 | void tipc_net_send_external_routes(u32 dest); | 56 | void tipc_net_send_external_routes(u32 dest); |
| 57 | void tipc_net_route_msg(struct sk_buff *buf); | 57 | void tipc_net_route_msg(struct sk_buff *buf); |
| 58 | struct node *tipc_net_select_remote_node(u32 addr, u32 ref); | 58 | struct tipc_node *tipc_net_select_remote_node(u32 addr, u32 ref); |
| 59 | u32 tipc_net_select_router(u32 addr, u32 ref); | 59 | u32 tipc_net_select_router(u32 addr, u32 ref); |
| 60 | 60 | ||
| 61 | int tipc_net_start(u32 addr); | 61 | int tipc_net_start(u32 addr); |
diff --git a/net/tipc/node.c b/net/tipc/node.c index ee952ad60218..20d98c56e152 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
| @@ -46,11 +46,11 @@ | |||
| 46 | #include "bearer.h" | 46 | #include "bearer.h" |
| 47 | #include "name_distr.h" | 47 | #include "name_distr.h" |
| 48 | 48 | ||
| 49 | void node_print(struct print_buf *buf, struct node *n_ptr, char *str); | 49 | void node_print(struct print_buf *buf, struct tipc_node *n_ptr, char *str); |
| 50 | static void node_lost_contact(struct node *n_ptr); | 50 | static void node_lost_contact(struct tipc_node *n_ptr); |
| 51 | static void node_established_contact(struct node *n_ptr); | 51 | static void node_established_contact(struct tipc_node *n_ptr); |
| 52 | 52 | ||
| 53 | struct node *tipc_nodes = NULL; /* sorted list of nodes within cluster */ | 53 | struct tipc_node *tipc_nodes = NULL; /* sorted list of nodes within cluster */ |
| 54 | 54 | ||
| 55 | static DEFINE_SPINLOCK(node_create_lock); | 55 | static DEFINE_SPINLOCK(node_create_lock); |
| 56 | 56 | ||
| @@ -66,11 +66,11 @@ u32 tipc_own_tag = 0; | |||
| 66 | * but this is a non-trivial change.) | 66 | * but this is a non-trivial change.) |
| 67 | */ | 67 | */ |
| 68 | 68 | ||
| 69 | struct node *tipc_node_create(u32 addr) | 69 | struct tipc_node *tipc_node_create(u32 addr) |
| 70 | { | 70 | { |
| 71 | struct cluster *c_ptr; | 71 | struct cluster *c_ptr; |
| 72 | struct node *n_ptr; | 72 | struct tipc_node *n_ptr; |
| 73 | struct node **curr_node; | 73 | struct tipc_node **curr_node; |
| 74 | 74 | ||
| 75 | spin_lock_bh(&node_create_lock); | 75 | spin_lock_bh(&node_create_lock); |
| 76 | 76 | ||
| @@ -120,7 +120,7 @@ struct node *tipc_node_create(u32 addr) | |||
| 120 | return n_ptr; | 120 | return n_ptr; |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | void tipc_node_delete(struct node *n_ptr) | 123 | void tipc_node_delete(struct tipc_node *n_ptr) |
| 124 | { | 124 | { |
| 125 | if (!n_ptr) | 125 | if (!n_ptr) |
| 126 | return; | 126 | return; |
| @@ -146,7 +146,7 @@ void tipc_node_delete(struct node *n_ptr) | |||
| 146 | * Link becomes active (alone or shared) or standby, depending on its priority. | 146 | * Link becomes active (alone or shared) or standby, depending on its priority. |
| 147 | */ | 147 | */ |
| 148 | 148 | ||
| 149 | void tipc_node_link_up(struct node *n_ptr, struct link *l_ptr) | 149 | void tipc_node_link_up(struct tipc_node *n_ptr, struct link *l_ptr) |
| 150 | { | 150 | { |
| 151 | struct link **active = &n_ptr->active_links[0]; | 151 | struct link **active = &n_ptr->active_links[0]; |
| 152 | 152 | ||
| @@ -180,7 +180,7 @@ void tipc_node_link_up(struct node *n_ptr, struct link *l_ptr) | |||
| 180 | * node_select_active_links - select active link | 180 | * node_select_active_links - select active link |
| 181 | */ | 181 | */ |
| 182 | 182 | ||
| 183 | static void node_select_active_links(struct node *n_ptr) | 183 | static void node_select_active_links(struct tipc_node *n_ptr) |
| 184 | { | 184 | { |
| 185 | struct link **active = &n_ptr->active_links[0]; | 185 | struct link **active = &n_ptr->active_links[0]; |
| 186 | u32 i; | 186 | u32 i; |
| @@ -208,7 +208,7 @@ static void node_select_active_links(struct node *n_ptr) | |||
| 208 | * tipc_node_link_down - handle loss of link | 208 | * tipc_node_link_down - handle loss of link |
| 209 | */ | 209 | */ |
| 210 | 210 | ||
| 211 | void tipc_node_link_down(struct node *n_ptr, struct link *l_ptr) | 211 | void tipc_node_link_down(struct tipc_node *n_ptr, struct link *l_ptr) |
| 212 | { | 212 | { |
| 213 | struct link **active; | 213 | struct link **active; |
| 214 | 214 | ||
| @@ -235,30 +235,30 @@ void tipc_node_link_down(struct node *n_ptr, struct link *l_ptr) | |||
| 235 | node_lost_contact(n_ptr); | 235 | node_lost_contact(n_ptr); |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | int tipc_node_has_active_links(struct node *n_ptr) | 238 | int tipc_node_has_active_links(struct tipc_node *n_ptr) |
| 239 | { | 239 | { |
| 240 | return (n_ptr && | 240 | return (n_ptr && |
| 241 | ((n_ptr->active_links[0]) || (n_ptr->active_links[1]))); | 241 | ((n_ptr->active_links[0]) || (n_ptr->active_links[1]))); |
| 242 | } | 242 | } |
| 243 | 243 | ||
| 244 | int tipc_node_has_redundant_links(struct node *n_ptr) | 244 | int tipc_node_has_redundant_links(struct tipc_node *n_ptr) |
| 245 | { | 245 | { |
| 246 | return (n_ptr->working_links > 1); | 246 | return (n_ptr->working_links > 1); |
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | static int tipc_node_has_active_routes(struct node *n_ptr) | 249 | static int tipc_node_has_active_routes(struct tipc_node *n_ptr) |
| 250 | { | 250 | { |
| 251 | return (n_ptr && (n_ptr->last_router >= 0)); | 251 | return (n_ptr && (n_ptr->last_router >= 0)); |
| 252 | } | 252 | } |
| 253 | 253 | ||
| 254 | int tipc_node_is_up(struct node *n_ptr) | 254 | int tipc_node_is_up(struct tipc_node *n_ptr) |
| 255 | { | 255 | { |
| 256 | return (tipc_node_has_active_links(n_ptr) || tipc_node_has_active_routes(n_ptr)); | 256 | return (tipc_node_has_active_links(n_ptr) || tipc_node_has_active_routes(n_ptr)); |
| 257 | } | 257 | } |
| 258 | 258 | ||
| 259 | struct node *tipc_node_attach_link(struct link *l_ptr) | 259 | struct tipc_node *tipc_node_attach_link(struct link *l_ptr) |
| 260 | { | 260 | { |
| 261 | struct node *n_ptr = tipc_node_find(l_ptr->addr); | 261 | struct tipc_node *n_ptr = tipc_node_find(l_ptr->addr); |
| 262 | 262 | ||
| 263 | if (!n_ptr) | 263 | if (!n_ptr) |
| 264 | n_ptr = tipc_node_create(l_ptr->addr); | 264 | n_ptr = tipc_node_create(l_ptr->addr); |
| @@ -285,7 +285,7 @@ struct node *tipc_node_attach_link(struct link *l_ptr) | |||
| 285 | return NULL; | 285 | return NULL; |
| 286 | } | 286 | } |
| 287 | 287 | ||
| 288 | void tipc_node_detach_link(struct node *n_ptr, struct link *l_ptr) | 288 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr) |
| 289 | { | 289 | { |
| 290 | n_ptr->links[l_ptr->b_ptr->identity] = NULL; | 290 | n_ptr->links[l_ptr->b_ptr->identity] = NULL; |
| 291 | tipc_net.zones[tipc_zone(l_ptr->addr)]->links--; | 291 | tipc_net.zones[tipc_zone(l_ptr->addr)]->links--; |
| @@ -338,7 +338,7 @@ void tipc_node_detach_link(struct node *n_ptr, struct link *l_ptr) | |||
| 338 | * | 338 | * |
| 339 | */ | 339 | */ |
| 340 | 340 | ||
| 341 | static void node_established_contact(struct node *n_ptr) | 341 | static void node_established_contact(struct tipc_node *n_ptr) |
| 342 | { | 342 | { |
| 343 | struct cluster *c_ptr; | 343 | struct cluster *c_ptr; |
| 344 | 344 | ||
| @@ -384,10 +384,10 @@ static void node_established_contact(struct node *n_ptr) | |||
| 384 | tipc_highest_allowed_slave); | 384 | tipc_highest_allowed_slave); |
| 385 | } | 385 | } |
| 386 | 386 | ||
| 387 | static void node_lost_contact(struct node *n_ptr) | 387 | static void node_lost_contact(struct tipc_node *n_ptr) |
| 388 | { | 388 | { |
| 389 | struct cluster *c_ptr; | 389 | struct cluster *c_ptr; |
| 390 | struct node_subscr *ns, *tns; | 390 | struct tipc_node_subscr *ns, *tns; |
| 391 | char addr_string[16]; | 391 | char addr_string[16]; |
| 392 | u32 i; | 392 | u32 i; |
| 393 | 393 | ||
| @@ -466,9 +466,9 @@ static void node_lost_contact(struct node *n_ptr) | |||
| 466 | * Called by when cluster local lookup has failed. | 466 | * Called by when cluster local lookup has failed. |
| 467 | */ | 467 | */ |
| 468 | 468 | ||
| 469 | struct node *tipc_node_select_next_hop(u32 addr, u32 selector) | 469 | struct tipc_node *tipc_node_select_next_hop(u32 addr, u32 selector) |
| 470 | { | 470 | { |
| 471 | struct node *n_ptr; | 471 | struct tipc_node *n_ptr; |
| 472 | u32 router_addr; | 472 | u32 router_addr; |
| 473 | 473 | ||
| 474 | if (!tipc_addr_domain_valid(addr)) | 474 | if (!tipc_addr_domain_valid(addr)) |
| @@ -513,7 +513,7 @@ struct node *tipc_node_select_next_hop(u32 addr, u32 selector) | |||
| 513 | * Uses a deterministic and fair algorithm for selecting router node. | 513 | * Uses a deterministic and fair algorithm for selecting router node. |
| 514 | */ | 514 | */ |
| 515 | 515 | ||
| 516 | u32 tipc_node_select_router(struct node *n_ptr, u32 ref) | 516 | u32 tipc_node_select_router(struct tipc_node *n_ptr, u32 ref) |
| 517 | { | 517 | { |
| 518 | u32 ulim; | 518 | u32 ulim; |
| 519 | u32 mask; | 519 | u32 mask; |
| @@ -551,7 +551,7 @@ u32 tipc_node_select_router(struct node *n_ptr, u32 ref) | |||
| 551 | return tipc_addr(own_zone(), own_cluster(), r); | 551 | return tipc_addr(own_zone(), own_cluster(), r); |
| 552 | } | 552 | } |
| 553 | 553 | ||
| 554 | void tipc_node_add_router(struct node *n_ptr, u32 router) | 554 | void tipc_node_add_router(struct tipc_node *n_ptr, u32 router) |
| 555 | { | 555 | { |
| 556 | u32 r_num = tipc_node(router); | 556 | u32 r_num = tipc_node(router); |
| 557 | 557 | ||
| @@ -562,7 +562,7 @@ void tipc_node_add_router(struct node *n_ptr, u32 router) | |||
| 562 | !n_ptr->routers[n_ptr->last_router]); | 562 | !n_ptr->routers[n_ptr->last_router]); |
| 563 | } | 563 | } |
| 564 | 564 | ||
| 565 | void tipc_node_remove_router(struct node *n_ptr, u32 router) | 565 | void tipc_node_remove_router(struct tipc_node *n_ptr, u32 router) |
| 566 | { | 566 | { |
| 567 | u32 r_num = tipc_node(router); | 567 | u32 r_num = tipc_node(router); |
| 568 | 568 | ||
| @@ -580,7 +580,7 @@ void tipc_node_remove_router(struct node *n_ptr, u32 router) | |||
| 580 | } | 580 | } |
| 581 | 581 | ||
| 582 | #if 0 | 582 | #if 0 |
| 583 | void node_print(struct print_buf *buf, struct node *n_ptr, char *str) | 583 | void node_print(struct print_buf *buf, struct tipc_node *n_ptr, char *str) |
| 584 | { | 584 | { |
| 585 | u32 i; | 585 | u32 i; |
| 586 | 586 | ||
| @@ -597,7 +597,7 @@ void node_print(struct print_buf *buf, struct node *n_ptr, char *str) | |||
| 597 | 597 | ||
| 598 | u32 tipc_available_nodes(const u32 domain) | 598 | u32 tipc_available_nodes(const u32 domain) |
| 599 | { | 599 | { |
| 600 | struct node *n_ptr; | 600 | struct tipc_node *n_ptr; |
| 601 | u32 cnt = 0; | 601 | u32 cnt = 0; |
| 602 | 602 | ||
| 603 | read_lock_bh(&tipc_net_lock); | 603 | read_lock_bh(&tipc_net_lock); |
| @@ -615,7 +615,7 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) | |||
| 615 | { | 615 | { |
| 616 | u32 domain; | 616 | u32 domain; |
| 617 | struct sk_buff *buf; | 617 | struct sk_buff *buf; |
| 618 | struct node *n_ptr; | 618 | struct tipc_node *n_ptr; |
| 619 | struct tipc_node_info node_info; | 619 | struct tipc_node_info node_info; |
| 620 | u32 payload_size; | 620 | u32 payload_size; |
| 621 | 621 | ||
| @@ -667,7 +667,7 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space) | |||
| 667 | { | 667 | { |
| 668 | u32 domain; | 668 | u32 domain; |
| 669 | struct sk_buff *buf; | 669 | struct sk_buff *buf; |
| 670 | struct node *n_ptr; | 670 | struct tipc_node *n_ptr; |
| 671 | struct tipc_link_info link_info; | 671 | struct tipc_link_info link_info; |
| 672 | u32 payload_size; | 672 | u32 payload_size; |
| 673 | 673 | ||
diff --git a/net/tipc/node.h b/net/tipc/node.h index cd1882654bbb..6f990da5d143 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
| @@ -43,7 +43,7 @@ | |||
| 43 | #include "bearer.h" | 43 | #include "bearer.h" |
| 44 | 44 | ||
| 45 | /** | 45 | /** |
| 46 | * struct node - TIPC node structure | 46 | * struct tipc_node - TIPC node structure |
| 47 | * @addr: network address of node | 47 | * @addr: network address of node |
| 48 | * @lock: spinlock governing access to structure | 48 | * @lock: spinlock governing access to structure |
| 49 | * @owner: pointer to cluster that node belongs to | 49 | * @owner: pointer to cluster that node belongs to |
| @@ -68,11 +68,11 @@ | |||
| 68 | * @defragm: list of partially reassembled b'cast message fragments from node | 68 | * @defragm: list of partially reassembled b'cast message fragments from node |
| 69 | */ | 69 | */ |
| 70 | 70 | ||
| 71 | struct node { | 71 | struct tipc_node { |
| 72 | u32 addr; | 72 | u32 addr; |
| 73 | spinlock_t lock; | 73 | spinlock_t lock; |
| 74 | struct cluster *owner; | 74 | struct cluster *owner; |
| 75 | struct node *next; | 75 | struct tipc_node *next; |
| 76 | struct list_head nsub; | 76 | struct list_head nsub; |
| 77 | struct link *active_links[2]; | 77 | struct link *active_links[2]; |
| 78 | struct link *links[MAX_BEARERS]; | 78 | struct link *links[MAX_BEARERS]; |
| @@ -94,26 +94,26 @@ struct node { | |||
| 94 | } bclink; | 94 | } bclink; |
| 95 | }; | 95 | }; |
| 96 | 96 | ||
| 97 | extern struct node *tipc_nodes; | 97 | extern struct tipc_node *tipc_nodes; |
| 98 | extern u32 tipc_own_tag; | 98 | extern u32 tipc_own_tag; |
| 99 | 99 | ||
| 100 | struct node *tipc_node_create(u32 addr); | 100 | struct tipc_node *tipc_node_create(u32 addr); |
| 101 | void tipc_node_delete(struct node *n_ptr); | 101 | void tipc_node_delete(struct tipc_node *n_ptr); |
| 102 | struct node *tipc_node_attach_link(struct link *l_ptr); | 102 | struct tipc_node *tipc_node_attach_link(struct link *l_ptr); |
| 103 | void tipc_node_detach_link(struct node *n_ptr, struct link *l_ptr); | 103 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr); |
| 104 | void tipc_node_link_down(struct node *n_ptr, struct link *l_ptr); | 104 | void tipc_node_link_down(struct tipc_node *n_ptr, struct link *l_ptr); |
| 105 | void tipc_node_link_up(struct node *n_ptr, struct link *l_ptr); | 105 | void tipc_node_link_up(struct tipc_node *n_ptr, struct link *l_ptr); |
| 106 | int tipc_node_has_active_links(struct node *n_ptr); | 106 | int tipc_node_has_active_links(struct tipc_node *n_ptr); |
| 107 | int tipc_node_has_redundant_links(struct node *n_ptr); | 107 | int tipc_node_has_redundant_links(struct tipc_node *n_ptr); |
| 108 | u32 tipc_node_select_router(struct node *n_ptr, u32 ref); | 108 | u32 tipc_node_select_router(struct tipc_node *n_ptr, u32 ref); |
| 109 | struct node *tipc_node_select_next_hop(u32 addr, u32 selector); | 109 | struct tipc_node *tipc_node_select_next_hop(u32 addr, u32 selector); |
| 110 | int tipc_node_is_up(struct node *n_ptr); | 110 | int tipc_node_is_up(struct tipc_node *n_ptr); |
| 111 | void tipc_node_add_router(struct node *n_ptr, u32 router); | 111 | void tipc_node_add_router(struct tipc_node *n_ptr, u32 router); |
| 112 | void tipc_node_remove_router(struct node *n_ptr, u32 router); | 112 | void tipc_node_remove_router(struct tipc_node *n_ptr, u32 router); |
| 113 | struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space); | 113 | struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space); |
| 114 | struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space); | 114 | struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space); |
| 115 | 115 | ||
| 116 | static inline struct node *tipc_node_find(u32 addr) | 116 | static inline struct tipc_node *tipc_node_find(u32 addr) |
| 117 | { | 117 | { |
| 118 | if (likely(in_own_cluster(addr))) | 118 | if (likely(in_own_cluster(addr))) |
| 119 | return tipc_local_nodes[tipc_node(addr)]; | 119 | return tipc_local_nodes[tipc_node(addr)]; |
| @@ -126,19 +126,19 @@ static inline struct node *tipc_node_find(u32 addr) | |||
| 126 | return NULL; | 126 | return NULL; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static inline struct node *tipc_node_select(u32 addr, u32 selector) | 129 | static inline struct tipc_node *tipc_node_select(u32 addr, u32 selector) |
| 130 | { | 130 | { |
| 131 | if (likely(in_own_cluster(addr))) | 131 | if (likely(in_own_cluster(addr))) |
| 132 | return tipc_local_nodes[tipc_node(addr)]; | 132 | return tipc_local_nodes[tipc_node(addr)]; |
| 133 | return tipc_node_select_next_hop(addr, selector); | 133 | return tipc_node_select_next_hop(addr, selector); |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | static inline void tipc_node_lock(struct node *n_ptr) | 136 | static inline void tipc_node_lock(struct tipc_node *n_ptr) |
| 137 | { | 137 | { |
| 138 | spin_lock_bh(&n_ptr->lock); | 138 | spin_lock_bh(&n_ptr->lock); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | static inline void tipc_node_unlock(struct node *n_ptr) | 141 | static inline void tipc_node_unlock(struct tipc_node *n_ptr) |
| 142 | { | 142 | { |
| 143 | spin_unlock_bh(&n_ptr->lock); | 143 | spin_unlock_bh(&n_ptr->lock); |
| 144 | } | 144 | } |
diff --git a/net/tipc/node_subscr.c b/net/tipc/node_subscr.c index 8ecbd0fb6103..19194d476a9e 100644 --- a/net/tipc/node_subscr.c +++ b/net/tipc/node_subscr.c | |||
| @@ -44,7 +44,7 @@ | |||
| 44 | * tipc_nodesub_subscribe - create "node down" subscription for specified node | 44 | * tipc_nodesub_subscribe - create "node down" subscription for specified node |
| 45 | */ | 45 | */ |
| 46 | 46 | ||
| 47 | void tipc_nodesub_subscribe(struct node_subscr *node_sub, u32 addr, | 47 | void tipc_nodesub_subscribe(struct tipc_node_subscr *node_sub, u32 addr, |
| 48 | void *usr_handle, net_ev_handler handle_down) | 48 | void *usr_handle, net_ev_handler handle_down) |
| 49 | { | 49 | { |
| 50 | if (addr == tipc_own_addr) { | 50 | if (addr == tipc_own_addr) { |
| @@ -69,7 +69,7 @@ void tipc_nodesub_subscribe(struct node_subscr *node_sub, u32 addr, | |||
| 69 | * tipc_nodesub_unsubscribe - cancel "node down" subscription (if any) | 69 | * tipc_nodesub_unsubscribe - cancel "node down" subscription (if any) |
| 70 | */ | 70 | */ |
| 71 | 71 | ||
| 72 | void tipc_nodesub_unsubscribe(struct node_subscr *node_sub) | 72 | void tipc_nodesub_unsubscribe(struct tipc_node_subscr *node_sub) |
| 73 | { | 73 | { |
| 74 | if (!node_sub->node) | 74 | if (!node_sub->node) |
| 75 | return; | 75 | return; |
diff --git a/net/tipc/node_subscr.h b/net/tipc/node_subscr.h index 5f3f5859b84c..006ed739f515 100644 --- a/net/tipc/node_subscr.h +++ b/net/tipc/node_subscr.h | |||
| @@ -42,22 +42,22 @@ | |||
| 42 | typedef void (*net_ev_handler) (void *usr_handle); | 42 | typedef void (*net_ev_handler) (void *usr_handle); |
| 43 | 43 | ||
| 44 | /** | 44 | /** |
| 45 | * struct node_subscr - "node down" subscription entry | 45 | * struct tipc_node_subscr - "node down" subscription entry |
| 46 | * @node: ptr to node structure of interest (or NULL, if none) | 46 | * @node: ptr to node structure of interest (or NULL, if none) |
| 47 | * @handle_node_down: routine to invoke when node fails | 47 | * @handle_node_down: routine to invoke when node fails |
| 48 | * @usr_handle: argument to pass to routine when node fails | 48 | * @usr_handle: argument to pass to routine when node fails |
| 49 | * @nodesub_list: adjacent entries in list of subscriptions for the node | 49 | * @nodesub_list: adjacent entries in list of subscriptions for the node |
| 50 | */ | 50 | */ |
| 51 | 51 | ||
| 52 | struct node_subscr { | 52 | struct tipc_node_subscr { |
| 53 | struct node *node; | 53 | struct tipc_node *node; |
| 54 | net_ev_handler handle_node_down; | 54 | net_ev_handler handle_node_down; |
| 55 | void *usr_handle; | 55 | void *usr_handle; |
| 56 | struct list_head nodesub_list; | 56 | struct list_head nodesub_list; |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | void tipc_nodesub_subscribe(struct node_subscr *node_sub, u32 addr, | 59 | void tipc_nodesub_subscribe(struct tipc_node_subscr *node_sub, u32 addr, |
| 60 | void *usr_handle, net_ev_handler handle_down); | 60 | void *usr_handle, net_ev_handler handle_down); |
| 61 | void tipc_nodesub_unsubscribe(struct node_subscr *node_sub); | 61 | void tipc_nodesub_unsubscribe(struct tipc_node_subscr *node_sub); |
| 62 | 62 | ||
| 63 | #endif | 63 | #endif |
diff --git a/net/tipc/port.h b/net/tipc/port.h index e5f8c16429bd..ff31ee4a1dc3 100644 --- a/net/tipc/port.h +++ b/net/tipc/port.h | |||
| @@ -105,7 +105,7 @@ struct port { | |||
| 105 | u32 probing_interval; | 105 | u32 probing_interval; |
| 106 | u32 last_in_seqno; | 106 | u32 last_in_seqno; |
| 107 | struct timer_list timer; | 107 | struct timer_list timer; |
| 108 | struct node_subscr subscription; | 108 | struct tipc_node_subscr subscription; |
| 109 | }; | 109 | }; |
| 110 | 110 | ||
| 111 | extern spinlock_t tipc_port_list_lock; | 111 | extern spinlock_t tipc_port_list_lock; |
diff --git a/net/tipc/zone.c b/net/tipc/zone.c index 3506f8563441..2c01ba2d86bf 100644 --- a/net/tipc/zone.c +++ b/net/tipc/zone.c | |||
| @@ -111,10 +111,10 @@ void tipc_zone_send_external_routes(struct _zone *z_ptr, u32 dest) | |||
| 111 | } | 111 | } |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | struct node *tipc_zone_select_remote_node(struct _zone *z_ptr, u32 addr, u32 ref) | 114 | struct tipc_node *tipc_zone_select_remote_node(struct _zone *z_ptr, u32 addr, u32 ref) |
| 115 | { | 115 | { |
| 116 | struct cluster *c_ptr; | 116 | struct cluster *c_ptr; |
| 117 | struct node *n_ptr; | 117 | struct tipc_node *n_ptr; |
| 118 | u32 c_num; | 118 | u32 c_num; |
| 119 | 119 | ||
| 120 | if (!z_ptr) | 120 | if (!z_ptr) |
diff --git a/net/tipc/zone.h b/net/tipc/zone.h index 6e7a08df8af5..7bdc3406ba9b 100644 --- a/net/tipc/zone.h +++ b/net/tipc/zone.h | |||
| @@ -54,7 +54,7 @@ struct _zone { | |||
| 54 | u32 links; | 54 | u32 links; |
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| 57 | struct node *tipc_zone_select_remote_node(struct _zone *z_ptr, u32 addr, u32 ref); | 57 | struct tipc_node *tipc_zone_select_remote_node(struct _zone *z_ptr, u32 addr, u32 ref); |
| 58 | u32 tipc_zone_select_router(struct _zone *z_ptr, u32 addr, u32 ref); | 58 | u32 tipc_zone_select_router(struct _zone *z_ptr, u32 addr, u32 ref); |
| 59 | void tipc_zone_remove_as_router(struct _zone *z_ptr, u32 router); | 59 | void tipc_zone_remove_as_router(struct _zone *z_ptr, u32 router); |
| 60 | void tipc_zone_send_external_routes(struct _zone *z_ptr, u32 dest); | 60 | void tipc_zone_send_external_routes(struct _zone *z_ptr, u32 dest); |
diff --git a/net/wireless/Kconfig b/net/wireless/Kconfig index ab015c62d561..833b024f8f66 100644 --- a/net/wireless/Kconfig +++ b/net/wireless/Kconfig | |||
| @@ -39,4 +39,5 @@ config WIRELESS_EXT_SYSFS | |||
| 39 | files in /sys/class/net/*/wireless/. The same information | 39 | files in /sys/class/net/*/wireless/. The same information |
| 40 | is available via the ioctls as well. | 40 | is available via the ioctls as well. |
| 41 | 41 | ||
| 42 | Say Y if you have programs using it (we don't know of any). | 42 | Say Y if you have programs using it, like old versions of |
| 43 | hal. | ||
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 841b32a2e680..46914b79d850 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -1731,8 +1731,7 @@ restart: | |||
| 1731 | * We can't enlist stable bundles either. | 1731 | * We can't enlist stable bundles either. |
| 1732 | */ | 1732 | */ |
| 1733 | write_unlock_bh(&policy->lock); | 1733 | write_unlock_bh(&policy->lock); |
| 1734 | if (dst) | 1734 | dst_free(dst); |
| 1735 | dst_free(dst); | ||
| 1736 | 1735 | ||
| 1737 | if (pol_dead) | 1736 | if (pol_dead) |
| 1738 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTPOLDEAD); | 1737 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTPOLDEAD); |
| @@ -1748,8 +1747,7 @@ restart: | |||
| 1748 | err = xfrm_dst_update_origin(dst, fl); | 1747 | err = xfrm_dst_update_origin(dst, fl); |
| 1749 | if (unlikely(err)) { | 1748 | if (unlikely(err)) { |
| 1750 | write_unlock_bh(&policy->lock); | 1749 | write_unlock_bh(&policy->lock); |
| 1751 | if (dst) | 1750 | dst_free(dst); |
| 1752 | dst_free(dst); | ||
| 1753 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTBUNDLECHECKERROR); | 1751 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTBUNDLECHECKERROR); |
| 1754 | goto error; | 1752 | goto error; |
| 1755 | } | 1753 | } |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 4c6914ef7d92..7bd62f61593f 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
| @@ -780,11 +780,13 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | |||
| 780 | { | 780 | { |
| 781 | unsigned int h; | 781 | unsigned int h; |
| 782 | struct hlist_node *entry; | 782 | struct hlist_node *entry; |
| 783 | struct xfrm_state *x, *x0; | 783 | struct xfrm_state *x, *x0, *to_put; |
| 784 | int acquire_in_progress = 0; | 784 | int acquire_in_progress = 0; |
| 785 | int error = 0; | 785 | int error = 0; |
| 786 | struct xfrm_state *best = NULL; | 786 | struct xfrm_state *best = NULL; |
| 787 | 787 | ||
| 788 | to_put = NULL; | ||
| 789 | |||
| 788 | spin_lock_bh(&xfrm_state_lock); | 790 | spin_lock_bh(&xfrm_state_lock); |
| 789 | h = xfrm_dst_hash(daddr, saddr, tmpl->reqid, family); | 791 | h = xfrm_dst_hash(daddr, saddr, tmpl->reqid, family); |
| 790 | hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) { | 792 | hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) { |
| @@ -833,7 +835,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | |||
| 833 | if (tmpl->id.spi && | 835 | if (tmpl->id.spi && |
| 834 | (x0 = __xfrm_state_lookup(daddr, tmpl->id.spi, | 836 | (x0 = __xfrm_state_lookup(daddr, tmpl->id.spi, |
| 835 | tmpl->id.proto, family)) != NULL) { | 837 | tmpl->id.proto, family)) != NULL) { |
| 836 | xfrm_state_put(x0); | 838 | to_put = x0; |
| 837 | error = -EEXIST; | 839 | error = -EEXIST; |
| 838 | goto out; | 840 | goto out; |
| 839 | } | 841 | } |
| @@ -849,7 +851,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | |||
| 849 | error = security_xfrm_state_alloc_acquire(x, pol->security, fl->secid); | 851 | error = security_xfrm_state_alloc_acquire(x, pol->security, fl->secid); |
| 850 | if (error) { | 852 | if (error) { |
| 851 | x->km.state = XFRM_STATE_DEAD; | 853 | x->km.state = XFRM_STATE_DEAD; |
| 852 | xfrm_state_put(x); | 854 | to_put = x; |
| 853 | x = NULL; | 855 | x = NULL; |
| 854 | goto out; | 856 | goto out; |
| 855 | } | 857 | } |
| @@ -870,7 +872,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | |||
| 870 | xfrm_hash_grow_check(x->bydst.next != NULL); | 872 | xfrm_hash_grow_check(x->bydst.next != NULL); |
| 871 | } else { | 873 | } else { |
| 872 | x->km.state = XFRM_STATE_DEAD; | 874 | x->km.state = XFRM_STATE_DEAD; |
| 873 | xfrm_state_put(x); | 875 | to_put = x; |
| 874 | x = NULL; | 876 | x = NULL; |
| 875 | error = -ESRCH; | 877 | error = -ESRCH; |
| 876 | } | 878 | } |
| @@ -881,6 +883,8 @@ out: | |||
| 881 | else | 883 | else |
| 882 | *err = acquire_in_progress ? -EAGAIN : error; | 884 | *err = acquire_in_progress ? -EAGAIN : error; |
| 883 | spin_unlock_bh(&xfrm_state_lock); | 885 | spin_unlock_bh(&xfrm_state_lock); |
| 886 | if (to_put) | ||
| 887 | xfrm_state_put(to_put); | ||
| 884 | return x; | 888 | return x; |
| 885 | } | 889 | } |
| 886 | 890 | ||
| @@ -1067,18 +1071,20 @@ static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq); | |||
| 1067 | 1071 | ||
| 1068 | int xfrm_state_add(struct xfrm_state *x) | 1072 | int xfrm_state_add(struct xfrm_state *x) |
| 1069 | { | 1073 | { |
| 1070 | struct xfrm_state *x1; | 1074 | struct xfrm_state *x1, *to_put; |
| 1071 | int family; | 1075 | int family; |
| 1072 | int err; | 1076 | int err; |
| 1073 | int use_spi = xfrm_id_proto_match(x->id.proto, IPSEC_PROTO_ANY); | 1077 | int use_spi = xfrm_id_proto_match(x->id.proto, IPSEC_PROTO_ANY); |
| 1074 | 1078 | ||
| 1075 | family = x->props.family; | 1079 | family = x->props.family; |
| 1076 | 1080 | ||
| 1081 | to_put = NULL; | ||
| 1082 | |||
| 1077 | spin_lock_bh(&xfrm_state_lock); | 1083 | spin_lock_bh(&xfrm_state_lock); |
| 1078 | 1084 | ||
| 1079 | x1 = __xfrm_state_locate(x, use_spi, family); | 1085 | x1 = __xfrm_state_locate(x, use_spi, family); |
| 1080 | if (x1) { | 1086 | if (x1) { |
| 1081 | xfrm_state_put(x1); | 1087 | to_put = x1; |
| 1082 | x1 = NULL; | 1088 | x1 = NULL; |
| 1083 | err = -EEXIST; | 1089 | err = -EEXIST; |
| 1084 | goto out; | 1090 | goto out; |
| @@ -1088,7 +1094,7 @@ int xfrm_state_add(struct xfrm_state *x) | |||
| 1088 | x1 = __xfrm_find_acq_byseq(x->km.seq); | 1094 | x1 = __xfrm_find_acq_byseq(x->km.seq); |
| 1089 | if (x1 && ((x1->id.proto != x->id.proto) || | 1095 | if (x1 && ((x1->id.proto != x->id.proto) || |
| 1090 | xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family))) { | 1096 | xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family))) { |
| 1091 | xfrm_state_put(x1); | 1097 | to_put = x1; |
| 1092 | x1 = NULL; | 1098 | x1 = NULL; |
| 1093 | } | 1099 | } |
| 1094 | } | 1100 | } |
| @@ -1110,6 +1116,9 @@ out: | |||
| 1110 | xfrm_state_put(x1); | 1116 | xfrm_state_put(x1); |
| 1111 | } | 1117 | } |
| 1112 | 1118 | ||
| 1119 | if (to_put) | ||
| 1120 | xfrm_state_put(to_put); | ||
| 1121 | |||
| 1113 | return err; | 1122 | return err; |
| 1114 | } | 1123 | } |
| 1115 | EXPORT_SYMBOL(xfrm_state_add); | 1124 | EXPORT_SYMBOL(xfrm_state_add); |
| @@ -1269,10 +1278,12 @@ EXPORT_SYMBOL(xfrm_state_migrate); | |||
| 1269 | 1278 | ||
| 1270 | int xfrm_state_update(struct xfrm_state *x) | 1279 | int xfrm_state_update(struct xfrm_state *x) |
| 1271 | { | 1280 | { |
| 1272 | struct xfrm_state *x1; | 1281 | struct xfrm_state *x1, *to_put; |
| 1273 | int err; | 1282 | int err; |
| 1274 | int use_spi = xfrm_id_proto_match(x->id.proto, IPSEC_PROTO_ANY); | 1283 | int use_spi = xfrm_id_proto_match(x->id.proto, IPSEC_PROTO_ANY); |
| 1275 | 1284 | ||
| 1285 | to_put = NULL; | ||
| 1286 | |||
| 1276 | spin_lock_bh(&xfrm_state_lock); | 1287 | spin_lock_bh(&xfrm_state_lock); |
| 1277 | x1 = __xfrm_state_locate(x, use_spi, x->props.family); | 1288 | x1 = __xfrm_state_locate(x, use_spi, x->props.family); |
| 1278 | 1289 | ||
| @@ -1281,7 +1292,7 @@ int xfrm_state_update(struct xfrm_state *x) | |||
| 1281 | goto out; | 1292 | goto out; |
| 1282 | 1293 | ||
| 1283 | if (xfrm_state_kern(x1)) { | 1294 | if (xfrm_state_kern(x1)) { |
| 1284 | xfrm_state_put(x1); | 1295 | to_put = x1; |
| 1285 | err = -EEXIST; | 1296 | err = -EEXIST; |
| 1286 | goto out; | 1297 | goto out; |
| 1287 | } | 1298 | } |
| @@ -1295,6 +1306,9 @@ int xfrm_state_update(struct xfrm_state *x) | |||
| 1295 | out: | 1306 | out: |
| 1296 | spin_unlock_bh(&xfrm_state_lock); | 1307 | spin_unlock_bh(&xfrm_state_lock); |
| 1297 | 1308 | ||
| 1309 | if (to_put) | ||
| 1310 | xfrm_state_put(to_put); | ||
| 1311 | |||
| 1298 | if (err) | 1312 | if (err) |
| 1299 | return err; | 1313 | return err; |
| 1300 | 1314 | ||
diff --git a/security/device_cgroup.c b/security/device_cgroup.c index 7bd296cca041..46f23971f7e4 100644 --- a/security/device_cgroup.c +++ b/security/device_cgroup.c | |||
| @@ -508,12 +508,11 @@ int devcgroup_inode_permission(struct inode *inode, int mask) | |||
| 508 | return 0; | 508 | return 0; |
| 509 | if (!S_ISBLK(inode->i_mode) && !S_ISCHR(inode->i_mode)) | 509 | if (!S_ISBLK(inode->i_mode) && !S_ISCHR(inode->i_mode)) |
| 510 | return 0; | 510 | return 0; |
| 511 | dev_cgroup = css_to_devcgroup(task_subsys_state(current, | ||
| 512 | devices_subsys_id)); | ||
| 513 | if (!dev_cgroup) | ||
| 514 | return 0; | ||
| 515 | 511 | ||
| 516 | rcu_read_lock(); | 512 | rcu_read_lock(); |
| 513 | |||
| 514 | dev_cgroup = task_devcgroup(current); | ||
| 515 | |||
| 517 | list_for_each_entry_rcu(wh, &dev_cgroup->whitelist, list) { | 516 | list_for_each_entry_rcu(wh, &dev_cgroup->whitelist, list) { |
| 518 | if (wh->type & DEV_ALL) | 517 | if (wh->type & DEV_ALL) |
| 519 | goto acc_check; | 518 | goto acc_check; |
| @@ -533,6 +532,7 @@ acc_check: | |||
| 533 | rcu_read_unlock(); | 532 | rcu_read_unlock(); |
| 534 | return 0; | 533 | return 0; |
| 535 | } | 534 | } |
| 535 | |||
| 536 | rcu_read_unlock(); | 536 | rcu_read_unlock(); |
| 537 | 537 | ||
| 538 | return -EPERM; | 538 | return -EPERM; |
| @@ -543,12 +543,10 @@ int devcgroup_inode_mknod(int mode, dev_t dev) | |||
| 543 | struct dev_cgroup *dev_cgroup; | 543 | struct dev_cgroup *dev_cgroup; |
| 544 | struct dev_whitelist_item *wh; | 544 | struct dev_whitelist_item *wh; |
| 545 | 545 | ||
| 546 | dev_cgroup = css_to_devcgroup(task_subsys_state(current, | ||
| 547 | devices_subsys_id)); | ||
| 548 | if (!dev_cgroup) | ||
| 549 | return 0; | ||
| 550 | |||
| 551 | rcu_read_lock(); | 546 | rcu_read_lock(); |
| 547 | |||
| 548 | dev_cgroup = task_devcgroup(current); | ||
| 549 | |||
| 552 | list_for_each_entry(wh, &dev_cgroup->whitelist, list) { | 550 | list_for_each_entry(wh, &dev_cgroup->whitelist, list) { |
| 553 | if (wh->type & DEV_ALL) | 551 | if (wh->type & DEV_ALL) |
| 554 | goto acc_check; | 552 | goto acc_check; |
| @@ -566,6 +564,8 @@ acc_check: | |||
| 566 | rcu_read_unlock(); | 564 | rcu_read_unlock(); |
| 567 | return 0; | 565 | return 0; |
| 568 | } | 566 | } |
| 567 | |||
| 569 | rcu_read_unlock(); | 568 | rcu_read_unlock(); |
| 569 | |||
| 570 | return -EPERM; | 570 | return -EPERM; |
| 571 | } | 571 | } |
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index b52f923ce680..d11a8154500f 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c | |||
| @@ -811,11 +811,12 @@ static int string_to_context_struct(struct policydb *pol, | |||
| 811 | /* Check the validity of the new context. */ | 811 | /* Check the validity of the new context. */ |
| 812 | if (!policydb_context_isvalid(pol, ctx)) { | 812 | if (!policydb_context_isvalid(pol, ctx)) { |
| 813 | rc = -EINVAL; | 813 | rc = -EINVAL; |
| 814 | context_destroy(ctx); | ||
| 815 | goto out; | 814 | goto out; |
| 816 | } | 815 | } |
| 817 | rc = 0; | 816 | rc = 0; |
| 818 | out: | 817 | out: |
| 818 | if (rc) | ||
| 819 | context_destroy(ctx); | ||
| 819 | return rc; | 820 | return rc; |
| 820 | } | 821 | } |
| 821 | 822 | ||
| @@ -868,8 +869,7 @@ static int security_context_to_sid_core(const char *scontext, u32 scontext_len, | |||
| 868 | } else if (rc) | 869 | } else if (rc) |
| 869 | goto out; | 870 | goto out; |
| 870 | rc = sidtab_context_to_sid(&sidtab, &context, sid); | 871 | rc = sidtab_context_to_sid(&sidtab, &context, sid); |
| 871 | if (rc) | 872 | context_destroy(&context); |
| 872 | context_destroy(&context); | ||
| 873 | out: | 873 | out: |
| 874 | read_unlock(&policy_rwlock); | 874 | read_unlock(&policy_rwlock); |
| 875 | kfree(scontext2); | 875 | kfree(scontext2); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index d6ec9eef2910..66025161bd69 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -14066,6 +14066,13 @@ static struct hda_verb alc662_auto_init_verbs[] = { | |||
| 14066 | { } | 14066 | { } |
| 14067 | }; | 14067 | }; |
| 14068 | 14068 | ||
| 14069 | /* additional verbs for ALC663 */ | ||
| 14070 | static struct hda_verb alc663_auto_init_verbs[] = { | ||
| 14071 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 14072 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 14073 | { } | ||
| 14074 | }; | ||
| 14075 | |||
| 14069 | static struct hda_verb alc663_m51va_init_verbs[] = { | 14076 | static struct hda_verb alc663_m51va_init_verbs[] = { |
| 14070 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | 14077 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
| 14071 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 14078 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| @@ -14594,6 +14601,14 @@ static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, | |||
| 14594 | if (!pin) | 14601 | if (!pin) |
| 14595 | return 0; | 14602 | return 0; |
| 14596 | 14603 | ||
| 14604 | if (pin == 0x17) { | ||
| 14605 | /* ALC663 has a mono output pin on 0x17 */ | ||
| 14606 | sprintf(name, "%s Playback Switch", pfx); | ||
| 14607 | err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, | ||
| 14608 | HDA_COMPOSE_AMP_VAL(pin, 2, 0, HDA_OUTPUT)); | ||
| 14609 | return err; | ||
| 14610 | } | ||
| 14611 | |||
| 14597 | if (alc880_is_fixed_pin(pin)) { | 14612 | if (alc880_is_fixed_pin(pin)) { |
| 14598 | nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); | 14613 | nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); |
| 14599 | /* printk("DAC nid=%x\n",nid); */ | 14614 | /* printk("DAC nid=%x\n",nid); */ |
| @@ -14764,6 +14779,14 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
| 14764 | spec->input_mux = &spec->private_imux; | 14779 | spec->input_mux = &spec->private_imux; |
| 14765 | 14780 | ||
| 14766 | spec->init_verbs[spec->num_init_verbs++] = alc662_auto_init_verbs; | 14781 | spec->init_verbs[spec->num_init_verbs++] = alc662_auto_init_verbs; |
| 14782 | if (codec->vendor_id == 0x10ec0663) | ||
| 14783 | spec->init_verbs[spec->num_init_verbs++] = | ||
| 14784 | alc663_auto_init_verbs; | ||
| 14785 | |||
| 14786 | err = alc_auto_add_mic_boost(codec); | ||
| 14787 | if (err < 0) | ||
| 14788 | return err; | ||
| 14789 | |||
| 14767 | spec->mixers[spec->num_mixers] = alc662_capture_mixer; | 14790 | spec->mixers[spec->num_mixers] = alc662_capture_mixer; |
| 14768 | spec->num_mixers++; | 14791 | spec->num_mixers++; |
| 14769 | return 1; | 14792 | return 1; |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7fdafcb0015d..ad994fcab725 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -560,8 +560,9 @@ static struct hda_verb dell_eq_core_init[] = { | |||
| 560 | }; | 560 | }; |
| 561 | 561 | ||
| 562 | static struct hda_verb dell_m6_core_init[] = { | 562 | static struct hda_verb dell_m6_core_init[] = { |
| 563 | /* set master volume and direct control */ | 563 | /* set master volume to max value without distortion |
| 564 | { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, | 564 | * and direct control */ |
| 565 | { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec}, | ||
| 565 | /* setup audio connections */ | 566 | /* setup audio connections */ |
| 566 | { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, | 567 | { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| 567 | { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, | 568 | { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, |
diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index 8548818eea08..c796b1882776 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
| 17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
| 18 | #include <linux/clk.h> | 18 | #include <linux/clk.h> |
| 19 | #include <linux/platform_device.h> | ||
| 19 | #include <sound/core.h> | 20 | #include <sound/core.h> |
| 20 | #include <sound/pcm.h> | 21 | #include <sound/pcm.h> |
| 21 | #include <sound/initval.h> | 22 | #include <sound/initval.h> |
| @@ -81,7 +82,6 @@ static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream) | |||
| 81 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 82 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 82 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | 83 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; |
| 83 | 84 | ||
| 84 | clk_i2s = clk_get(NULL, "I2SCLK"); | ||
| 85 | if (IS_ERR(clk_i2s)) | 85 | if (IS_ERR(clk_i2s)) |
| 86 | return PTR_ERR(clk_i2s); | 86 | return PTR_ERR(clk_i2s); |
| 87 | 87 | ||
| @@ -152,6 +152,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 152 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx); | 152 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx); |
| 153 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm); | 153 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm); |
| 154 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk); | 154 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk); |
| 155 | BUG_ON(IS_ERR(clk_i2s)); | ||
| 155 | clk_enable(clk_i2s); | 156 | clk_enable(clk_i2s); |
| 156 | pxa_i2s_wait(); | 157 | pxa_i2s_wait(); |
| 157 | 158 | ||
| @@ -317,6 +318,43 @@ struct snd_soc_dai pxa_i2s_dai = { | |||
| 317 | 318 | ||
| 318 | EXPORT_SYMBOL_GPL(pxa_i2s_dai); | 319 | EXPORT_SYMBOL_GPL(pxa_i2s_dai); |
| 319 | 320 | ||
| 321 | static int pxa2xx_i2s_probe(struct platform_device *dev) | ||
| 322 | { | ||
| 323 | clk_i2s = clk_get(&dev->dev, "I2SCLK"); | ||
| 324 | return IS_ERR(clk_i2s) ? PTR_ERR(clk_i2s) : 0; | ||
| 325 | } | ||
| 326 | |||
| 327 | static int __devexit pxa2xx_i2s_remove(struct platform_device *dev) | ||
| 328 | { | ||
| 329 | clk_put(clk_i2s); | ||
| 330 | clk_i2s = ERR_PTR(-ENOENT); | ||
| 331 | return 0; | ||
| 332 | } | ||
| 333 | |||
| 334 | static struct platform_driver pxa2xx_i2s_driver = { | ||
| 335 | .probe = pxa2xx_i2s_probe, | ||
| 336 | .remove = __devexit_p(pxa2xx_i2s_remove), | ||
| 337 | |||
| 338 | .driver = { | ||
| 339 | .name = "pxa2xx-i2s", | ||
| 340 | .owner = THIS_MODULE, | ||
| 341 | }, | ||
| 342 | }; | ||
| 343 | |||
| 344 | static int __init pxa2xx_i2s_init(void) | ||
| 345 | { | ||
| 346 | clk_i2s = ERR_PTR(-ENOENT); | ||
| 347 | return platform_driver_register(&pxa2xx_i2s_driver); | ||
| 348 | } | ||
| 349 | |||
| 350 | static void __exit pxa2xx_i2s_exit(void) | ||
| 351 | { | ||
| 352 | platform_driver_unregister(&pxa2xx_i2s_driver); | ||
| 353 | } | ||
| 354 | |||
| 355 | module_init(pxa2xx_i2s_init); | ||
| 356 | module_exit(pxa2xx_i2s_exit); | ||
| 357 | |||
| 320 | /* Module information */ | 358 | /* Module information */ |
| 321 | MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); | 359 | MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); |
| 322 | MODULE_DESCRIPTION("pxa2xx I2S SoC Interface"); | 360 | MODULE_DESCRIPTION("pxa2xx I2S SoC Interface"); |
