diff options
278 files changed, 2021 insertions, 1020 deletions
| @@ -3511,14 +3511,12 @@ D: The Linux Support Team Erlangen | |||
| 3511 | 3511 | ||
| 3512 | N: David Weinehall | 3512 | N: David Weinehall |
| 3513 | E: tao@acc.umu.se | 3513 | E: tao@acc.umu.se |
| 3514 | P: 1024D/DC47CA16 7ACE 0FB0 7A74 F994 9B36 E1D1 D14E 8526 DC47 CA16 | ||
| 3514 | W: http://www.acc.umu.se/~tao/ | 3515 | W: http://www.acc.umu.se/~tao/ |
| 3515 | W: http://www.acc.umu.se/~mcalinux/ | 3516 | D: v2.0 kernel maintainer |
| 3516 | D: Fixes for the NE/2-driver | 3517 | D: Fixes for the NE/2-driver |
| 3517 | D: Miscellaneous MCA-support | 3518 | D: Miscellaneous MCA-support |
| 3518 | D: Cleanup of the Config-files | 3519 | D: Cleanup of the Config-files |
| 3519 | S: Axtorpsvagen 40:20 | ||
| 3520 | S: S-903 37 UMEA | ||
| 3521 | S: Sweden | ||
| 3522 | 3520 | ||
| 3523 | N: Matt Welsh | 3521 | N: Matt Welsh |
| 3524 | E: mdw@metalab.unc.edu | 3522 | E: mdw@metalab.unc.edu |
diff --git a/Documentation/filesystems/udf.txt b/Documentation/filesystems/udf.txt index 511b4230c053..fde829a756e6 100644 --- a/Documentation/filesystems/udf.txt +++ b/Documentation/filesystems/udf.txt | |||
| @@ -7,8 +7,17 @@ If you encounter problems with reading UDF discs using this driver, | |||
| 7 | please report them to linux_udf@hpesjro.fc.hp.com, which is the | 7 | please report them to linux_udf@hpesjro.fc.hp.com, which is the |
| 8 | developer's list. | 8 | developer's list. |
| 9 | 9 | ||
| 10 | Write support requires a block driver which supports writing. The current | 10 | Write support requires a block driver which supports writing. Currently |
| 11 | scsi and ide cdrom drivers do not support writing. | 11 | dvd+rw drives and media support true random sector writes, and so a udf |
| 12 | filesystem on such devices can be directly mounted read/write. CD-RW | ||
| 13 | media however, does not support this. Instead the media can be formatted | ||
| 14 | for packet mode using the utility cdrwtool, then the pktcdvd driver can | ||
| 15 | be bound to the underlying cd device to provide the required buffering | ||
| 16 | and read-modify-write cycles to allow the filesystem random sector writes | ||
| 17 | while providing the hardware with only full packet writes. While not | ||
| 18 | required for dvd+rw media, use of the pktcdvd driver often enhances | ||
| 19 | performance due to very poor read-modify-write support supplied internally | ||
| 20 | by drive firmware. | ||
| 12 | 21 | ||
| 13 | ------------------------------------------------------------------------------- | 22 | ------------------------------------------------------------------------------- |
| 14 | The following mount options are supported: | 23 | The following mount options are supported: |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index dd00fd556a60..67473849f20e 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -164,6 +164,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 164 | acpi_skip_timer_override [HW,ACPI] | 164 | acpi_skip_timer_override [HW,ACPI] |
| 165 | Recognize and ignore IRQ0/pin2 Interrupt Override. | 165 | Recognize and ignore IRQ0/pin2 Interrupt Override. |
| 166 | For broken nForce2 BIOS resulting in XT-PIC timer. | 166 | For broken nForce2 BIOS resulting in XT-PIC timer. |
| 167 | acpi_use_timer_override [HW,ACPI} | ||
| 168 | Use timer override. For some broken Nvidia NF5 boards | ||
| 169 | that require a timer override, but don't have | ||
| 170 | HPET | ||
| 167 | 171 | ||
| 168 | acpi_dbg_layer= [HW,ACPI] | 172 | acpi_dbg_layer= [HW,ACPI] |
| 169 | Format: <int> | 173 | Format: <int> |
diff --git a/Documentation/kprobes.txt b/Documentation/kprobes.txt index ba26201d5023..d71fafffce90 100644 --- a/Documentation/kprobes.txt +++ b/Documentation/kprobes.txt | |||
| @@ -442,9 +442,10 @@ static int __init kprobe_init(void) | |||
| 442 | kp.fault_handler = handler_fault; | 442 | kp.fault_handler = handler_fault; |
| 443 | kp.symbol_name = "do_fork"; | 443 | kp.symbol_name = "do_fork"; |
| 444 | 444 | ||
| 445 | if ((ret = register_kprobe(&kp) < 0)) { | 445 | ret = register_kprobe(&kp); |
| 446 | if (ret < 0) { | ||
| 446 | printk("register_kprobe failed, returned %d\n", ret); | 447 | printk("register_kprobe failed, returned %d\n", ret); |
| 447 | return -1; | 448 | return ret; |
| 448 | } | 449 | } |
| 449 | printk("kprobe registered\n"); | 450 | printk("kprobe registered\n"); |
| 450 | return 0; | 451 | return 0; |
diff --git a/Documentation/rtc.txt b/Documentation/rtc.txt index 2a58f985795a..7cf1ec5bcdd3 100644 --- a/Documentation/rtc.txt +++ b/Documentation/rtc.txt | |||
| @@ -1,12 +1,49 @@ | |||
| 1 | 1 | ||
| 2 | Real Time Clock Driver for Linux | 2 | Real Time Clock (RTC) Drivers for Linux |
| 3 | ================================ | 3 | ======================================= |
| 4 | |||
| 5 | When Linux developers talk about a "Real Time Clock", they usually mean | ||
| 6 | something that tracks wall clock time and is battery backed so that it | ||
| 7 | works even with system power off. Such clocks will normally not track | ||
| 8 | the local time zone or daylight savings time -- unless they dual boot | ||
| 9 | with MS-Windows -- but will instead be set to Coordinated Universal Time | ||
| 10 | (UTC, formerly "Greenwich Mean Time"). | ||
| 11 | |||
| 12 | The newest non-PC hardware tends to just count seconds, like the time(2) | ||
| 13 | system call reports, but RTCs also very commonly represent time using | ||
| 14 | the Gregorian calendar and 24 hour time, as reported by gmtime(3). | ||
| 15 | |||
| 16 | Linux has two largely-compatible userspace RTC API families you may | ||
| 17 | need to know about: | ||
| 18 | |||
| 19 | * /dev/rtc ... is the RTC provided by PC compatible systems, | ||
| 20 | so it's not very portable to non-x86 systems. | ||
| 21 | |||
| 22 | * /dev/rtc0, /dev/rtc1 ... are part of a framework that's | ||
| 23 | supported by a wide variety of RTC chips on all systems. | ||
| 24 | |||
| 25 | Programmers need to understand that the PC/AT functionality is not | ||
| 26 | always available, and some systems can do much more. That is, the | ||
| 27 | RTCs use the same API to make requests in both RTC frameworks (using | ||
| 28 | different filenames of course), but the hardware may not offer the | ||
| 29 | same functionality. For example, not every RTC is hooked up to an | ||
| 30 | IRQ, so they can't all issue alarms; and where standard PC RTCs can | ||
| 31 | only issue an alarm up to 24 hours in the future, other hardware may | ||
| 32 | be able to schedule one any time in the upcoming century. | ||
| 33 | |||
| 34 | |||
| 35 | Old PC/AT-Compatible driver: /dev/rtc | ||
| 36 | -------------------------------------- | ||
| 4 | 37 | ||
| 5 | All PCs (even Alpha machines) have a Real Time Clock built into them. | 38 | All PCs (even Alpha machines) have a Real Time Clock built into them. |
| 6 | Usually they are built into the chipset of the computer, but some may | 39 | Usually they are built into the chipset of the computer, but some may |
| 7 | actually have a Motorola MC146818 (or clone) on the board. This is the | 40 | actually have a Motorola MC146818 (or clone) on the board. This is the |
| 8 | clock that keeps the date and time while your computer is turned off. | 41 | clock that keeps the date and time while your computer is turned off. |
| 9 | 42 | ||
| 43 | ACPI has standardized that MC146818 functionality, and extended it in | ||
| 44 | a few ways (enabling longer alarm periods, and wake-from-hibernate). | ||
| 45 | That functionality is NOT exposed in the old driver. | ||
| 46 | |||
| 10 | However it can also be used to generate signals from a slow 2Hz to a | 47 | However it can also be used to generate signals from a slow 2Hz to a |
| 11 | relatively fast 8192Hz, in increments of powers of two. These signals | 48 | relatively fast 8192Hz, in increments of powers of two. These signals |
| 12 | are reported by interrupt number 8. (Oh! So *that* is what IRQ 8 is | 49 | are reported by interrupt number 8. (Oh! So *that* is what IRQ 8 is |
| @@ -63,223 +100,331 @@ Rather than write 50 pages describing the ioctl() and so on, it is | |||
| 63 | perhaps more useful to include a small test program that demonstrates | 100 | perhaps more useful to include a small test program that demonstrates |
| 64 | how to use them, and demonstrates the features of the driver. This is | 101 | how to use them, and demonstrates the features of the driver. This is |
| 65 | probably a lot more useful to people interested in writing applications | 102 | probably a lot more useful to people interested in writing applications |
| 66 | that will be using this driver. | 103 | that will be using this driver. See the code at the end of this document. |
| 104 | |||
| 105 | (The original /dev/rtc driver was written by Paul Gortmaker.) | ||
| 106 | |||
| 107 | |||
| 108 | New portable "RTC Class" drivers: /dev/rtcN | ||
| 109 | -------------------------------------------- | ||
| 110 | |||
| 111 | Because Linux supports many non-ACPI and non-PC platforms, some of which | ||
| 112 | have more than one RTC style clock, it needed a more portable solution | ||
| 113 | than expecting a single battery-backed MC146818 clone on every system. | ||
| 114 | Accordingly, a new "RTC Class" framework has been defined. It offers | ||
| 115 | three different userspace interfaces: | ||
| 116 | |||
| 117 | * /dev/rtcN ... much the same as the older /dev/rtc interface | ||
| 118 | |||
| 119 | * /sys/class/rtc/rtcN ... sysfs attributes support readonly | ||
| 120 | access to some RTC attributes. | ||
| 121 | |||
| 122 | * /proc/driver/rtc ... the first RTC (rtc0) may expose itself | ||
| 123 | using a procfs interface. More information is (currently) shown | ||
| 124 | here than through sysfs. | ||
| 125 | |||
| 126 | The RTC Class framework supports a wide variety of RTCs, ranging from those | ||
| 127 | integrated into embeddable system-on-chip (SOC) processors to discrete chips | ||
| 128 | using I2C, SPI, or some other bus to communicate with the host CPU. There's | ||
| 129 | even support for PC-style RTCs ... including the features exposed on newer PCs | ||
| 130 | through ACPI. | ||
| 131 | |||
| 132 | The new framework also removes the "one RTC per system" restriction. For | ||
| 133 | example, maybe the low-power battery-backed RTC is a discrete I2C chip, but | ||
| 134 | a high functionality RTC is integrated into the SOC. That system might read | ||
| 135 | the system clock from the discrete RTC, but use the integrated one for all | ||
| 136 | other tasks, because of its greater functionality. | ||
| 137 | |||
| 138 | The ioctl() calls supported by /dev/rtc are also supported by the RTC class | ||
| 139 | framework. However, because the chips and systems are not standardized, | ||
| 140 | some PC/AT functionality might not be provided. And in the same way, some | ||
| 141 | newer features -- including those enabled by ACPI -- are exposed by the | ||
| 142 | RTC class framework, but can't be supported by the older driver. | ||
| 143 | |||
| 144 | * RTC_RD_TIME, RTC_SET_TIME ... every RTC supports at least reading | ||
| 145 | time, returning the result as a Gregorian calendar date and 24 hour | ||
| 146 | wall clock time. To be most useful, this time may also be updated. | ||
| 147 | |||
| 148 | * RTC_AIE_ON, RTC_AIE_OFF, RTC_ALM_SET, RTC_ALM_READ ... when the RTC | ||
| 149 | is connected to an IRQ line, it can often issue an alarm IRQ up to | ||
| 150 | 24 hours in the future. | ||
| 151 | |||
| 152 | * RTC_WKALM_SET, RTC_WKALM_READ ... RTCs that can issue alarms beyond | ||
| 153 | the next 24 hours use a slightly more powerful API, which supports | ||
| 154 | setting the longer alarm time and enabling its IRQ using a single | ||
| 155 | request (using the same model as EFI firmware). | ||
| 156 | |||
| 157 | * RTC_UIE_ON, RTC_UIE_OFF ... if the RTC offers IRQs, it probably | ||
| 158 | also offers update IRQs whenever the "seconds" counter changes. | ||
| 159 | If needed, the RTC framework can emulate this mechanism. | ||
| 160 | |||
| 161 | * RTC_PIE_ON, RTC_PIE_OFF, RTC_IRQP_SET, RTC_IRQP_READ ... another | ||
| 162 | feature often accessible with an IRQ line is a periodic IRQ, issued | ||
| 163 | at settable frequencies (usually 2^N Hz). | ||
| 164 | |||
| 165 | In many cases, the RTC alarm can be a system wake event, used to force | ||
| 166 | Linux out of a low power sleep state (or hibernation) back to a fully | ||
| 167 | operational state. For example, a system could enter a deep power saving | ||
| 168 | state until it's time to execute some scheduled tasks. | ||
| 67 | 169 | ||
| 68 | Paul Gortmaker | ||
| 69 | 170 | ||
| 70 | -------------------- 8< ---------------- 8< ----------------------------- | 171 | -------------------- 8< ---------------- 8< ----------------------------- |
| 71 | 172 | ||
| 72 | /* | 173 | /* |
| 73 | * Real Time Clock Driver Test/Example Program | 174 | * Real Time Clock Driver Test/Example Program |
| 74 | * | 175 | * |
| 75 | * Compile with: | 176 | * Compile with: |
| 76 | * gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest | 177 | * gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest |
| 77 | * | 178 | * |
| 78 | * Copyright (C) 1996, Paul Gortmaker. | 179 | * Copyright (C) 1996, Paul Gortmaker. |
| 79 | * | 180 | * |
| 80 | * Released under the GNU General Public License, version 2, | 181 | * Released under the GNU General Public License, version 2, |
| 81 | * included herein by reference. | 182 | * included herein by reference. |
| 82 | * | 183 | * |
| 83 | */ | 184 | */ |
| 84 | 185 | ||
| 85 | #include <stdio.h> | 186 | #include <stdio.h> |
| 86 | #include <stdlib.h> | ||
| 87 | #include <linux/rtc.h> | 187 | #include <linux/rtc.h> |
| 88 | #include <sys/ioctl.h> | 188 | #include <sys/ioctl.h> |
| 89 | #include <sys/time.h> | 189 | #include <sys/time.h> |
| 90 | #include <sys/types.h> | 190 | #include <sys/types.h> |
| 91 | #include <fcntl.h> | 191 | #include <fcntl.h> |
| 92 | #include <unistd.h> | 192 | #include <unistd.h> |
| 193 | #include <stdlib.h> | ||
| 93 | #include <errno.h> | 194 | #include <errno.h> |
| 94 | 195 | ||
| 95 | int main(void) { | ||
| 96 | |||
| 97 | int i, fd, retval, irqcount = 0; | ||
| 98 | unsigned long tmp, data; | ||
| 99 | struct rtc_time rtc_tm; | ||
| 100 | 196 | ||
| 101 | fd = open ("/dev/rtc", O_RDONLY); | 197 | /* |
| 198 | * This expects the new RTC class driver framework, working with | ||
| 199 | * clocks that will often not be clones of what the PC-AT had. | ||
| 200 | * Use the command line to specify another RTC if you need one. | ||
| 201 | */ | ||
| 202 | static const char default_rtc[] = "/dev/rtc0"; | ||
| 203 | |||
| 204 | |||
| 205 | int main(int argc, char **argv) | ||
| 206 | { | ||
| 207 | int i, fd, retval, irqcount = 0; | ||
| 208 | unsigned long tmp, data; | ||
| 209 | struct rtc_time rtc_tm; | ||
| 210 | const char *rtc = default_rtc; | ||
| 211 | |||
| 212 | switch (argc) { | ||
| 213 | case 2: | ||
| 214 | rtc = argv[1]; | ||
| 215 | /* FALLTHROUGH */ | ||
| 216 | case 1: | ||
| 217 | break; | ||
| 218 | default: | ||
| 219 | fprintf(stderr, "usage: rtctest [rtcdev]\n"); | ||
| 220 | return 1; | ||
| 221 | } | ||
| 102 | 222 | ||
| 103 | if (fd == -1) { | 223 | fd = open(rtc, O_RDONLY); |
| 104 | perror("/dev/rtc"); | ||
| 105 | exit(errno); | ||
| 106 | } | ||
| 107 | 224 | ||
| 108 | fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n"); | 225 | if (fd == -1) { |
| 226 | perror(rtc); | ||
| 227 | exit(errno); | ||
| 228 | } | ||
| 109 | 229 | ||
| 110 | /* Turn on update interrupts (one per second) */ | 230 | fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n"); |
| 111 | retval = ioctl(fd, RTC_UIE_ON, 0); | ||
| 112 | if (retval == -1) { | ||
| 113 | perror("ioctl"); | ||
| 114 | exit(errno); | ||
| 115 | } | ||
| 116 | 231 | ||
| 117 | fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading /dev/rtc:"); | 232 | /* Turn on update interrupts (one per second) */ |
| 118 | fflush(stderr); | 233 | retval = ioctl(fd, RTC_UIE_ON, 0); |
| 119 | for (i=1; i<6; i++) { | ||
| 120 | /* This read will block */ | ||
| 121 | retval = read(fd, &data, sizeof(unsigned long)); | ||
| 122 | if (retval == -1) { | 234 | if (retval == -1) { |
| 123 | perror("read"); | 235 | if (errno == ENOTTY) { |
| 236 | fprintf(stderr, | ||
| 237 | "\n...Update IRQs not supported.\n"); | ||
| 238 | goto test_READ; | ||
| 239 | } | ||
| 240 | perror("ioctl"); | ||
| 124 | exit(errno); | 241 | exit(errno); |
| 125 | } | 242 | } |
| 126 | fprintf(stderr, " %d",i); | 243 | |
| 244 | fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading %s:", | ||
| 245 | rtc); | ||
| 127 | fflush(stderr); | 246 | fflush(stderr); |
| 128 | irqcount++; | 247 | for (i=1; i<6; i++) { |
| 129 | } | 248 | /* This read will block */ |
| 249 | retval = read(fd, &data, sizeof(unsigned long)); | ||
| 250 | if (retval == -1) { | ||
| 251 | perror("read"); | ||
| 252 | exit(errno); | ||
| 253 | } | ||
| 254 | fprintf(stderr, " %d",i); | ||
| 255 | fflush(stderr); | ||
| 256 | irqcount++; | ||
| 257 | } | ||
| 130 | 258 | ||
| 131 | fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:"); | 259 | fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:"); |
| 132 | fflush(stderr); | 260 | fflush(stderr); |
| 133 | for (i=1; i<6; i++) { | 261 | for (i=1; i<6; i++) { |
| 134 | struct timeval tv = {5, 0}; /* 5 second timeout on select */ | 262 | struct timeval tv = {5, 0}; /* 5 second timeout on select */ |
| 135 | fd_set readfds; | 263 | fd_set readfds; |
| 264 | |||
| 265 | FD_ZERO(&readfds); | ||
| 266 | FD_SET(fd, &readfds); | ||
| 267 | /* The select will wait until an RTC interrupt happens. */ | ||
| 268 | retval = select(fd+1, &readfds, NULL, NULL, &tv); | ||
| 269 | if (retval == -1) { | ||
| 270 | perror("select"); | ||
| 271 | exit(errno); | ||
| 272 | } | ||
| 273 | /* This read won't block unlike the select-less case above. */ | ||
| 274 | retval = read(fd, &data, sizeof(unsigned long)); | ||
| 275 | if (retval == -1) { | ||
| 276 | perror("read"); | ||
| 277 | exit(errno); | ||
| 278 | } | ||
| 279 | fprintf(stderr, " %d",i); | ||
| 280 | fflush(stderr); | ||
| 281 | irqcount++; | ||
| 282 | } | ||
| 136 | 283 | ||
| 137 | FD_ZERO(&readfds); | 284 | /* Turn off update interrupts */ |
| 138 | FD_SET(fd, &readfds); | 285 | retval = ioctl(fd, RTC_UIE_OFF, 0); |
| 139 | /* The select will wait until an RTC interrupt happens. */ | ||
| 140 | retval = select(fd+1, &readfds, NULL, NULL, &tv); | ||
| 141 | if (retval == -1) { | 286 | if (retval == -1) { |
| 142 | perror("select"); | 287 | perror("ioctl"); |
| 143 | exit(errno); | 288 | exit(errno); |
| 144 | } | 289 | } |
| 145 | /* This read won't block unlike the select-less case above. */ | 290 | |
| 146 | retval = read(fd, &data, sizeof(unsigned long)); | 291 | test_READ: |
| 292 | /* Read the RTC time/date */ | ||
| 293 | retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); | ||
| 147 | if (retval == -1) { | 294 | if (retval == -1) { |
| 148 | perror("read"); | 295 | perror("ioctl"); |
| 149 | exit(errno); | 296 | exit(errno); |
| 150 | } | 297 | } |
| 151 | fprintf(stderr, " %d",i); | ||
| 152 | fflush(stderr); | ||
| 153 | irqcount++; | ||
| 154 | } | ||
| 155 | |||
| 156 | /* Turn off update interrupts */ | ||
| 157 | retval = ioctl(fd, RTC_UIE_OFF, 0); | ||
| 158 | if (retval == -1) { | ||
| 159 | perror("ioctl"); | ||
| 160 | exit(errno); | ||
| 161 | } | ||
| 162 | |||
| 163 | /* Read the RTC time/date */ | ||
| 164 | retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); | ||
| 165 | if (retval == -1) { | ||
| 166 | perror("ioctl"); | ||
| 167 | exit(errno); | ||
| 168 | } | ||
| 169 | |||
| 170 | fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", | ||
| 171 | rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900, | ||
| 172 | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); | ||
| 173 | |||
| 174 | /* Set the alarm to 5 sec in the future, and check for rollover */ | ||
| 175 | rtc_tm.tm_sec += 5; | ||
| 176 | if (rtc_tm.tm_sec >= 60) { | ||
| 177 | rtc_tm.tm_sec %= 60; | ||
| 178 | rtc_tm.tm_min++; | ||
| 179 | } | ||
| 180 | if (rtc_tm.tm_min == 60) { | ||
| 181 | rtc_tm.tm_min = 0; | ||
| 182 | rtc_tm.tm_hour++; | ||
| 183 | } | ||
| 184 | if (rtc_tm.tm_hour == 24) | ||
| 185 | rtc_tm.tm_hour = 0; | ||
| 186 | |||
| 187 | retval = ioctl(fd, RTC_ALM_SET, &rtc_tm); | ||
| 188 | if (retval == -1) { | ||
| 189 | perror("ioctl"); | ||
| 190 | exit(errno); | ||
| 191 | } | ||
| 192 | |||
| 193 | /* Read the current alarm settings */ | ||
| 194 | retval = ioctl(fd, RTC_ALM_READ, &rtc_tm); | ||
| 195 | if (retval == -1) { | ||
| 196 | perror("ioctl"); | ||
| 197 | exit(errno); | ||
| 198 | } | ||
| 199 | |||
| 200 | fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n", | ||
| 201 | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); | ||
| 202 | 298 | ||
| 203 | /* Enable alarm interrupts */ | 299 | fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", |
| 204 | retval = ioctl(fd, RTC_AIE_ON, 0); | 300 | rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900, |
| 205 | if (retval == -1) { | 301 | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); |
| 206 | perror("ioctl"); | ||
| 207 | exit(errno); | ||
| 208 | } | ||
| 209 | 302 | ||
| 210 | fprintf(stderr, "Waiting 5 seconds for alarm..."); | 303 | /* Set the alarm to 5 sec in the future, and check for rollover */ |
| 211 | fflush(stderr); | 304 | rtc_tm.tm_sec += 5; |
| 212 | /* This blocks until the alarm ring causes an interrupt */ | 305 | if (rtc_tm.tm_sec >= 60) { |
| 213 | retval = read(fd, &data, sizeof(unsigned long)); | 306 | rtc_tm.tm_sec %= 60; |
| 214 | if (retval == -1) { | 307 | rtc_tm.tm_min++; |
| 215 | perror("read"); | 308 | } |
| 216 | exit(errno); | 309 | if (rtc_tm.tm_min == 60) { |
| 217 | } | 310 | rtc_tm.tm_min = 0; |
| 218 | irqcount++; | 311 | rtc_tm.tm_hour++; |
| 219 | fprintf(stderr, " okay. Alarm rang.\n"); | 312 | } |
| 220 | 313 | if (rtc_tm.tm_hour == 24) | |
| 221 | /* Disable alarm interrupts */ | 314 | rtc_tm.tm_hour = 0; |
| 222 | retval = ioctl(fd, RTC_AIE_OFF, 0); | ||
| 223 | if (retval == -1) { | ||
| 224 | perror("ioctl"); | ||
| 225 | exit(errno); | ||
| 226 | } | ||
| 227 | 315 | ||
| 228 | /* Read periodic IRQ rate */ | 316 | retval = ioctl(fd, RTC_ALM_SET, &rtc_tm); |
| 229 | retval = ioctl(fd, RTC_IRQP_READ, &tmp); | 317 | if (retval == -1) { |
| 230 | if (retval == -1) { | 318 | if (errno == ENOTTY) { |
| 231 | perror("ioctl"); | 319 | fprintf(stderr, |
| 232 | exit(errno); | 320 | "\n...Alarm IRQs not supported.\n"); |
| 233 | } | 321 | goto test_PIE; |
| 234 | fprintf(stderr, "\nPeriodic IRQ rate was %ldHz.\n", tmp); | 322 | } |
| 323 | perror("ioctl"); | ||
| 324 | exit(errno); | ||
| 325 | } | ||
| 235 | 326 | ||
| 236 | fprintf(stderr, "Counting 20 interrupts at:"); | 327 | /* Read the current alarm settings */ |
| 237 | fflush(stderr); | 328 | retval = ioctl(fd, RTC_ALM_READ, &rtc_tm); |
| 329 | if (retval == -1) { | ||
| 330 | perror("ioctl"); | ||
| 331 | exit(errno); | ||
| 332 | } | ||
| 238 | 333 | ||
| 239 | /* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */ | 334 | fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n", |
| 240 | for (tmp=2; tmp<=64; tmp*=2) { | 335 | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); |
| 241 | 336 | ||
| 242 | retval = ioctl(fd, RTC_IRQP_SET, tmp); | 337 | /* Enable alarm interrupts */ |
| 338 | retval = ioctl(fd, RTC_AIE_ON, 0); | ||
| 243 | if (retval == -1) { | 339 | if (retval == -1) { |
| 244 | perror("ioctl"); | 340 | perror("ioctl"); |
| 245 | exit(errno); | 341 | exit(errno); |
| 246 | } | 342 | } |
| 247 | 343 | ||
| 248 | fprintf(stderr, "\n%ldHz:\t", tmp); | 344 | fprintf(stderr, "Waiting 5 seconds for alarm..."); |
| 249 | fflush(stderr); | 345 | fflush(stderr); |
| 346 | /* This blocks until the alarm ring causes an interrupt */ | ||
| 347 | retval = read(fd, &data, sizeof(unsigned long)); | ||
| 348 | if (retval == -1) { | ||
| 349 | perror("read"); | ||
| 350 | exit(errno); | ||
| 351 | } | ||
| 352 | irqcount++; | ||
| 353 | fprintf(stderr, " okay. Alarm rang.\n"); | ||
| 250 | 354 | ||
| 251 | /* Enable periodic interrupts */ | 355 | /* Disable alarm interrupts */ |
| 252 | retval = ioctl(fd, RTC_PIE_ON, 0); | 356 | retval = ioctl(fd, RTC_AIE_OFF, 0); |
| 253 | if (retval == -1) { | 357 | if (retval == -1) { |
| 254 | perror("ioctl"); | 358 | perror("ioctl"); |
| 255 | exit(errno); | 359 | exit(errno); |
| 256 | } | 360 | } |
| 257 | 361 | ||
| 258 | for (i=1; i<21; i++) { | 362 | test_PIE: |
| 259 | /* This blocks */ | 363 | /* Read periodic IRQ rate */ |
| 260 | retval = read(fd, &data, sizeof(unsigned long)); | 364 | retval = ioctl(fd, RTC_IRQP_READ, &tmp); |
| 365 | if (retval == -1) { | ||
| 366 | /* not all RTCs support periodic IRQs */ | ||
| 367 | if (errno == ENOTTY) { | ||
| 368 | fprintf(stderr, "\nNo periodic IRQ support\n"); | ||
| 369 | return 0; | ||
| 370 | } | ||
| 371 | perror("ioctl"); | ||
| 372 | exit(errno); | ||
| 373 | } | ||
| 374 | fprintf(stderr, "\nPeriodic IRQ rate is %ldHz.\n", tmp); | ||
| 375 | |||
| 376 | fprintf(stderr, "Counting 20 interrupts at:"); | ||
| 377 | fflush(stderr); | ||
| 378 | |||
| 379 | /* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */ | ||
| 380 | for (tmp=2; tmp<=64; tmp*=2) { | ||
| 381 | |||
| 382 | retval = ioctl(fd, RTC_IRQP_SET, tmp); | ||
| 261 | if (retval == -1) { | 383 | if (retval == -1) { |
| 262 | perror("read"); | 384 | /* not all RTCs can change their periodic IRQ rate */ |
| 263 | exit(errno); | 385 | if (errno == ENOTTY) { |
| 386 | fprintf(stderr, | ||
| 387 | "\n...Periodic IRQ rate is fixed\n"); | ||
| 388 | goto done; | ||
| 389 | } | ||
| 390 | perror("ioctl"); | ||
| 391 | exit(errno); | ||
| 264 | } | 392 | } |
| 265 | fprintf(stderr, " %d",i); | 393 | |
| 394 | fprintf(stderr, "\n%ldHz:\t", tmp); | ||
| 266 | fflush(stderr); | 395 | fflush(stderr); |
| 267 | irqcount++; | ||
| 268 | } | ||
| 269 | 396 | ||
| 270 | /* Disable periodic interrupts */ | 397 | /* Enable periodic interrupts */ |
| 271 | retval = ioctl(fd, RTC_PIE_OFF, 0); | 398 | retval = ioctl(fd, RTC_PIE_ON, 0); |
| 272 | if (retval == -1) { | 399 | if (retval == -1) { |
| 273 | perror("ioctl"); | 400 | perror("ioctl"); |
| 274 | exit(errno); | 401 | exit(errno); |
| 402 | } | ||
| 403 | |||
| 404 | for (i=1; i<21; i++) { | ||
| 405 | /* This blocks */ | ||
| 406 | retval = read(fd, &data, sizeof(unsigned long)); | ||
| 407 | if (retval == -1) { | ||
| 408 | perror("read"); | ||
| 409 | exit(errno); | ||
| 410 | } | ||
| 411 | fprintf(stderr, " %d",i); | ||
| 412 | fflush(stderr); | ||
| 413 | irqcount++; | ||
| 414 | } | ||
| 415 | |||
| 416 | /* Disable periodic interrupts */ | ||
| 417 | retval = ioctl(fd, RTC_PIE_OFF, 0); | ||
| 418 | if (retval == -1) { | ||
| 419 | perror("ioctl"); | ||
| 420 | exit(errno); | ||
| 421 | } | ||
| 275 | } | 422 | } |
| 276 | } | ||
| 277 | 423 | ||
| 278 | fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n"); | 424 | done: |
| 279 | fprintf(stderr, "\nTyping \"cat /proc/interrupts\" will show %d more events on IRQ 8.\n\n", | 425 | fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n"); |
| 280 | irqcount); | ||
| 281 | 426 | ||
| 282 | close(fd); | 427 | close(fd); |
| 283 | return 0; | ||
| 284 | 428 | ||
| 285 | } /* end main */ | 429 | return 0; |
| 430 | } | ||
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 138673a907f5..3472d9c4ef1b 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
| @@ -753,7 +753,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
| 753 | position_fix - Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size) | 753 | position_fix - Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size) |
| 754 | single_cmd - Use single immediate commands to communicate with | 754 | single_cmd - Use single immediate commands to communicate with |
| 755 | codecs (for debugging only) | 755 | codecs (for debugging only) |
| 756 | disable_msi - Disable Message Signaled Interrupt (MSI) | 756 | enable_msi - Enable Message Signaled Interrupt (MSI) (default = off) |
| 757 | 757 | ||
| 758 | This module supports one card and autoprobe. | 758 | This module supports one card and autoprobe. |
| 759 | 759 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 8732daeae303..e182992ff799 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -353,6 +353,12 @@ P: Richard Purdie | |||
| 353 | M: rpurdie@rpsys.net | 353 | M: rpurdie@rpsys.net |
| 354 | S: Maintained | 354 | S: Maintained |
| 355 | 355 | ||
| 356 | ARM/HP JORNADA 7XX MACHINE SUPPORT | ||
| 357 | P: Kristoffer Ericson | ||
| 358 | M: kristoffer_e1@hotmail.com | ||
| 359 | W: www.jlime.com | ||
| 360 | S: Maintained | ||
| 361 | |||
| 356 | ARM/TOSA MACHINE SUPPORT | 362 | ARM/TOSA MACHINE SUPPORT |
| 357 | P: Dirk Opfer | 363 | P: Dirk Opfer |
| 358 | M: dirk@opfer-online.de | 364 | M: dirk@opfer-online.de |
| @@ -3072,6 +3078,13 @@ L: video4linux-list@redhat.com | |||
| 3072 | W: http://www.linux-projects.org | 3078 | W: http://www.linux-projects.org |
| 3073 | S: Maintained | 3079 | S: Maintained |
| 3074 | 3080 | ||
| 3081 | USB GADGET/PERIPHERAL SUBSYSTEM | ||
| 3082 | P: David Brownell | ||
| 3083 | M: dbrownell@users.sourceforge.net | ||
| 3084 | L: linux-usb-devel@lists.sourceforge.net | ||
| 3085 | W: http://www.linux-usb.org/gadget | ||
| 3086 | S: Maintained | ||
| 3087 | |||
| 3075 | USB HID/HIDBP DRIVERS | 3088 | USB HID/HIDBP DRIVERS |
| 3076 | P: Vojtech Pavlik | 3089 | P: Vojtech Pavlik |
| 3077 | M: vojtech@suse.cz | 3090 | M: vojtech@suse.cz |
| @@ -3255,10 +3268,11 @@ L: linux-usb-users@lists.sourceforge.net | |||
| 3255 | L: linux-usb-devel@lists.sourceforge.net | 3268 | L: linux-usb-devel@lists.sourceforge.net |
| 3256 | S: Maintained | 3269 | S: Maintained |
| 3257 | 3270 | ||
| 3258 | USB "USBNET" DRIVER | 3271 | USB "USBNET" DRIVER FRAMEWORK |
| 3259 | P: David Brownell | 3272 | P: David Brownell |
| 3260 | M: dbrownell@users.sourceforge.net | 3273 | M: dbrownell@users.sourceforge.net |
| 3261 | L: linux-usb-devel@lists.sourceforge.net | 3274 | L: linux-usb-devel@lists.sourceforge.net |
| 3275 | W: http://www.linux-usb.org/usbnet | ||
| 3262 | S: Maintained | 3276 | S: Maintained |
| 3263 | 3277 | ||
| 3264 | USB W996[87]CF DRIVER | 3278 | USB W996[87]CF DRIVER |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 19 | 3 | SUBLEVEL = 19 |
| 4 | EXTRAVERSION =-rc5 | 4 | EXTRAVERSION = |
| 5 | NAME=Avast! A bilge rat! | 5 | NAME=Avast! A bilge rat! |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index adb05de40e24..ce00c570459d 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -879,6 +879,8 @@ endif | |||
| 879 | 879 | ||
| 880 | source "drivers/scsi/Kconfig" | 880 | source "drivers/scsi/Kconfig" |
| 881 | 881 | ||
| 882 | source "drivers/ata/Kconfig" | ||
| 883 | |||
| 882 | source "drivers/md/Kconfig" | 884 | source "drivers/md/Kconfig" |
| 883 | 885 | ||
| 884 | source "drivers/message/fusion/Kconfig" | 886 | source "drivers/message/fusion/Kconfig" |
diff --git a/arch/arm/configs/assabet_defconfig b/arch/arm/configs/assabet_defconfig index 089c9d598409..b1cd331aaecf 100644 --- a/arch/arm/configs/assabet_defconfig +++ b/arch/arm/configs/assabet_defconfig | |||
| @@ -184,6 +184,7 @@ CONFIG_BINFMT_ELF=y | |||
| 184 | # Power management options | 184 | # Power management options |
| 185 | # | 185 | # |
| 186 | CONFIG_PM=y | 186 | CONFIG_PM=y |
| 187 | # CONFIG_PM_LEGACY is not set | ||
| 187 | # CONFIG_APM is not set | 188 | # CONFIG_APM is not set |
| 188 | 189 | ||
| 189 | # | 190 | # |
diff --git a/arch/arm/configs/ateb9200_defconfig b/arch/arm/configs/ateb9200_defconfig index 15e6b0bbbde8..3de5c643848c 100644 --- a/arch/arm/configs/ateb9200_defconfig +++ b/arch/arm/configs/ateb9200_defconfig | |||
| @@ -217,7 +217,7 @@ CONFIG_BINFMT_ELF=y | |||
| 217 | # Power management options | 217 | # Power management options |
| 218 | # | 218 | # |
| 219 | CONFIG_PM=y | 219 | CONFIG_PM=y |
| 220 | CONFIG_PM_LEGACY=y | 220 | # CONFIG_PM_LEGACY is not set |
| 221 | # CONFIG_PM_DEBUG is not set | 221 | # CONFIG_PM_DEBUG is not set |
| 222 | # CONFIG_APM is not set | 222 | # CONFIG_APM is not set |
| 223 | 223 | ||
diff --git a/arch/arm/configs/cerfcube_defconfig b/arch/arm/configs/cerfcube_defconfig index f81a60005cd3..09b7acd7f647 100644 --- a/arch/arm/configs/cerfcube_defconfig +++ b/arch/arm/configs/cerfcube_defconfig | |||
| @@ -194,6 +194,7 @@ CONFIG_BINFMT_ELF=y | |||
| 194 | # Power management options | 194 | # Power management options |
| 195 | # | 195 | # |
| 196 | CONFIG_PM=y | 196 | CONFIG_PM=y |
| 197 | # CONFIG_PM_LEGACY is not set | ||
| 197 | # CONFIG_APM is not set | 198 | # CONFIG_APM is not set |
| 198 | 199 | ||
| 199 | # | 200 | # |
diff --git a/arch/arm/configs/collie_defconfig b/arch/arm/configs/collie_defconfig index 074c47a4fb2e..a3758913c0bb 100644 --- a/arch/arm/configs/collie_defconfig +++ b/arch/arm/configs/collie_defconfig | |||
| @@ -219,7 +219,7 @@ CONFIG_BINFMT_ELF=y | |||
| 219 | # Power management options | 219 | # Power management options |
| 220 | # | 220 | # |
| 221 | CONFIG_PM=y | 221 | CONFIG_PM=y |
| 222 | CONFIG_PM_LEGACY=y | 222 | # CONFIG_PM_LEGACY is not set |
| 223 | # CONFIG_PM_DEBUG is not set | 223 | # CONFIG_PM_DEBUG is not set |
| 224 | CONFIG_APM=y | 224 | CONFIG_APM=y |
| 225 | 225 | ||
diff --git a/arch/arm/configs/corgi_defconfig b/arch/arm/configs/corgi_defconfig index 3c3461e83398..c41c04fa5020 100644 --- a/arch/arm/configs/corgi_defconfig +++ b/arch/arm/configs/corgi_defconfig | |||
| @@ -208,6 +208,7 @@ CONFIG_BINFMT_MISC=m | |||
| 208 | # Power management options | 208 | # Power management options |
| 209 | # | 209 | # |
| 210 | CONFIG_PM=y | 210 | CONFIG_PM=y |
| 211 | # CONFIG_PM_LEGACY is not set | ||
| 211 | CONFIG_APM=y | 212 | CONFIG_APM=y |
| 212 | 213 | ||
| 213 | # | 214 | # |
diff --git a/arch/arm/configs/h3600_defconfig b/arch/arm/configs/h3600_defconfig index 7a0da0b7facb..8f986e9f1c62 100644 --- a/arch/arm/configs/h3600_defconfig +++ b/arch/arm/configs/h3600_defconfig | |||
| @@ -194,6 +194,7 @@ CONFIG_BINFMT_ELF=y | |||
| 194 | # Power management options | 194 | # Power management options |
| 195 | # | 195 | # |
| 196 | CONFIG_PM=y | 196 | CONFIG_PM=y |
| 197 | # CONFIG_PM_LEGACY is not set | ||
| 197 | # CONFIG_APM is not set | 198 | # CONFIG_APM is not set |
| 198 | 199 | ||
| 199 | # | 200 | # |
diff --git a/arch/arm/configs/integrator_defconfig b/arch/arm/configs/integrator_defconfig index d1ba7fdde818..692ab57ba1ca 100644 --- a/arch/arm/configs/integrator_defconfig +++ b/arch/arm/configs/integrator_defconfig | |||
| @@ -190,6 +190,7 @@ CONFIG_BINFMT_ELF=y | |||
| 190 | # Power management options | 190 | # Power management options |
| 191 | # | 191 | # |
| 192 | CONFIG_PM=y | 192 | CONFIG_PM=y |
| 193 | # CONFIG_PM_LEGACY is not set | ||
| 193 | # CONFIG_APM is not set | 194 | # CONFIG_APM is not set |
| 194 | 195 | ||
| 195 | # | 196 | # |
diff --git a/arch/arm/configs/ixp4xx_defconfig b/arch/arm/configs/ixp4xx_defconfig index 4975b914f923..fac7c3b240c0 100644 --- a/arch/arm/configs/ixp4xx_defconfig +++ b/arch/arm/configs/ixp4xx_defconfig | |||
| @@ -206,10 +206,8 @@ CONFIG_BINFMT_ELF=y | |||
| 206 | # | 206 | # |
| 207 | # Power management options | 207 | # Power management options |
| 208 | # | 208 | # |
| 209 | CONFIG_PM=y | 209 | # CONFIG_PM is not set |
| 210 | CONFIG_PM_LEGACY=y | 210 | # CONFIG_APM is not set |
| 211 | # CONFIG_PM_DEBUG is not set | ||
| 212 | CONFIG_APM=y | ||
| 213 | 211 | ||
| 214 | # | 212 | # |
| 215 | # Networking | 213 | # Networking |
diff --git a/arch/arm/configs/jornada720_defconfig b/arch/arm/configs/jornada720_defconfig index ad1048db96fb..80a6fd97eb32 100644 --- a/arch/arm/configs/jornada720_defconfig +++ b/arch/arm/configs/jornada720_defconfig | |||
| @@ -182,6 +182,7 @@ CONFIG_BINFMT_AOUT=m | |||
| 182 | # Power management options | 182 | # Power management options |
| 183 | # | 183 | # |
| 184 | CONFIG_PM=y | 184 | CONFIG_PM=y |
| 185 | # CONFIG_PM_LEGACY is not set | ||
| 185 | # CONFIG_APM is not set | 186 | # CONFIG_APM is not set |
| 186 | 187 | ||
| 187 | # | 188 | # |
diff --git a/arch/arm/configs/lart_defconfig b/arch/arm/configs/lart_defconfig index c3a932844160..a1cc34f25602 100644 --- a/arch/arm/configs/lart_defconfig +++ b/arch/arm/configs/lart_defconfig | |||
| @@ -180,6 +180,7 @@ CONFIG_BINFMT_AOUT=y | |||
| 180 | # Power management options | 180 | # Power management options |
| 181 | # | 181 | # |
| 182 | CONFIG_PM=y | 182 | CONFIG_PM=y |
| 183 | # CONFIG_PM_LEGACY is not set | ||
| 183 | CONFIG_APM=m | 184 | CONFIG_APM=m |
| 184 | 185 | ||
| 185 | # | 186 | # |
diff --git a/arch/arm/configs/neponset_defconfig b/arch/arm/configs/neponset_defconfig index 3d35255c64ed..df8168e57b7c 100644 --- a/arch/arm/configs/neponset_defconfig +++ b/arch/arm/configs/neponset_defconfig | |||
| @@ -190,6 +190,7 @@ CONFIG_BINFMT_AOUT=y | |||
| 190 | # Power management options | 190 | # Power management options |
| 191 | # | 191 | # |
| 192 | CONFIG_PM=y | 192 | CONFIG_PM=y |
| 193 | # CONFIG_PM_LEGACY is not set | ||
| 193 | CONFIG_APM=y | 194 | CONFIG_APM=y |
| 194 | 195 | ||
| 195 | # | 196 | # |
diff --git a/arch/arm/configs/omap_h2_1610_defconfig b/arch/arm/configs/omap_h2_1610_defconfig index 05adb0b34e72..b0efd4ca9935 100644 --- a/arch/arm/configs/omap_h2_1610_defconfig +++ b/arch/arm/configs/omap_h2_1610_defconfig | |||
| @@ -257,7 +257,7 @@ CONFIG_BINFMT_AOUT=y | |||
| 257 | # Power management options | 257 | # Power management options |
| 258 | # | 258 | # |
| 259 | CONFIG_PM=y | 259 | CONFIG_PM=y |
| 260 | CONFIG_PM_LEGACY=y | 260 | # CONFIG_PM_LEGACY is not set |
| 261 | # CONFIG_PM_DEBUG is not set | 261 | # CONFIG_PM_DEBUG is not set |
| 262 | # CONFIG_APM is not set | 262 | # CONFIG_APM is not set |
| 263 | 263 | ||
diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig index 0563c14395e1..c0152393e494 100644 --- a/arch/arm/configs/s3c2410_defconfig +++ b/arch/arm/configs/s3c2410_defconfig | |||
| @@ -258,7 +258,7 @@ CONFIG_BINFMT_AOUT=y | |||
| 258 | # Power management options | 258 | # Power management options |
| 259 | # | 259 | # |
| 260 | CONFIG_PM=y | 260 | CONFIG_PM=y |
| 261 | CONFIG_PM_LEGACY=y | 261 | # CONFIG_PM_LEGACY is not set |
| 262 | # CONFIG_PM_DEBUG is not set | 262 | # CONFIG_PM_DEBUG is not set |
| 263 | # CONFIG_PM_SYSFS_DEPRECATED is not set | 263 | # CONFIG_PM_SYSFS_DEPRECATED is not set |
| 264 | CONFIG_APM=y | 264 | CONFIG_APM=y |
diff --git a/arch/arm/configs/simpad_defconfig b/arch/arm/configs/simpad_defconfig index 2e5a616cc98d..140056a3507f 100644 --- a/arch/arm/configs/simpad_defconfig +++ b/arch/arm/configs/simpad_defconfig | |||
| @@ -180,6 +180,7 @@ CONFIG_BINFMT_MISC=m | |||
| 180 | # Power management options | 180 | # Power management options |
| 181 | # | 181 | # |
| 182 | CONFIG_PM=y | 182 | CONFIG_PM=y |
| 183 | # CONFIG_PM_LEGACY is not set | ||
| 183 | CONFIG_APM=y | 184 | CONFIG_APM=y |
| 184 | 185 | ||
| 185 | # | 186 | # |
diff --git a/arch/arm/configs/spitz_defconfig b/arch/arm/configs/spitz_defconfig index d1ace3abfd8a..bd03238968c1 100644 --- a/arch/arm/configs/spitz_defconfig +++ b/arch/arm/configs/spitz_defconfig | |||
| @@ -207,6 +207,7 @@ CONFIG_BINFMT_MISC=m | |||
| 207 | # Power management options | 207 | # Power management options |
| 208 | # | 208 | # |
| 209 | CONFIG_PM=y | 209 | CONFIG_PM=y |
| 210 | # CONFIG_PM_LEGACY is not set | ||
| 210 | CONFIG_APM=y | 211 | CONFIG_APM=y |
| 211 | 212 | ||
| 212 | # | 213 | # |
diff --git a/arch/arm/configs/versatile_defconfig b/arch/arm/configs/versatile_defconfig index 96b7a7762426..f7bf6ef27d19 100644 --- a/arch/arm/configs/versatile_defconfig +++ b/arch/arm/configs/versatile_defconfig | |||
| @@ -200,7 +200,7 @@ CONFIG_BINFMT_ELF=y | |||
| 200 | # Power management options | 200 | # Power management options |
| 201 | # | 201 | # |
| 202 | CONFIG_PM=y | 202 | CONFIG_PM=y |
| 203 | CONFIG_PM_LEGACY=y | 203 | # CONFIG_PM_LEGACY is not set |
| 204 | # CONFIG_PM_DEBUG is not set | 204 | # CONFIG_PM_DEBUG is not set |
| 205 | # CONFIG_APM is not set | 205 | # CONFIG_APM is not set |
| 206 | 206 | ||
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index a07d202143c3..070bcb7a6306 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
| @@ -451,6 +451,7 @@ int smp_call_function(void (*func)(void *info), void *info, int retry, | |||
| 451 | return smp_call_function_on_cpu(func, info, retry, wait, | 451 | return smp_call_function_on_cpu(func, info, retry, wait, |
| 452 | cpu_online_map); | 452 | cpu_online_map); |
| 453 | } | 453 | } |
| 454 | EXPORT_SYMBOL_GPL(smp_call_function); | ||
| 454 | 455 | ||
| 455 | void show_ipi_list(struct seq_file *p) | 456 | void show_ipi_list(struct seq_file *p) |
| 456 | { | 457 | { |
diff --git a/arch/arm/mach-ebsa110/io.c b/arch/arm/mach-ebsa110/io.c index c648bfb676a1..db38afb2aa88 100644 --- a/arch/arm/mach-ebsa110/io.c +++ b/arch/arm/mach-ebsa110/io.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | #include <asm/io.h> | 28 | #include <asm/io.h> |
| 29 | #include <asm/page.h> | 29 | #include <asm/page.h> |
| 30 | 30 | ||
| 31 | static void __iomem *__isamem_convert_addr(void __iomem *addr) | 31 | static void __iomem *__isamem_convert_addr(const volatile void __iomem *addr) |
| 32 | { | 32 | { |
| 33 | u32 ret, a = (u32 __force) addr; | 33 | u32 ret, a = (u32 __force) addr; |
| 34 | 34 | ||
| @@ -63,7 +63,7 @@ static void __iomem *__isamem_convert_addr(void __iomem *addr) | |||
| 63 | /* | 63 | /* |
| 64 | * read[bwl] and write[bwl] | 64 | * read[bwl] and write[bwl] |
| 65 | */ | 65 | */ |
| 66 | u8 __readb(void __iomem *addr) | 66 | u8 __readb(const volatile void __iomem *addr) |
| 67 | { | 67 | { |
| 68 | void __iomem *a = __isamem_convert_addr(addr); | 68 | void __iomem *a = __isamem_convert_addr(addr); |
| 69 | u32 ret; | 69 | u32 ret; |
| @@ -75,7 +75,7 @@ u8 __readb(void __iomem *addr) | |||
| 75 | return ret; | 75 | return ret; |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | u16 __readw(void __iomem *addr) | 78 | u16 __readw(const volatile void __iomem *addr) |
| 79 | { | 79 | { |
| 80 | void __iomem *a = __isamem_convert_addr(addr); | 80 | void __iomem *a = __isamem_convert_addr(addr); |
| 81 | 81 | ||
| @@ -85,7 +85,7 @@ u16 __readw(void __iomem *addr) | |||
| 85 | return __raw_readw(a); | 85 | return __raw_readw(a); |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | u32 __readl(void __iomem *addr) | 88 | u32 __readl(const volatile void __iomem *addr) |
| 89 | { | 89 | { |
| 90 | void __iomem *a = __isamem_convert_addr(addr); | 90 | void __iomem *a = __isamem_convert_addr(addr); |
| 91 | u32 ret; | 91 | u32 ret; |
diff --git a/arch/arm/mach-pnx4008/core.c b/arch/arm/mach-pnx4008/core.c index 3d73c1e93752..429c796938be 100644 --- a/arch/arm/mach-pnx4008/core.c +++ b/arch/arm/mach-pnx4008/core.c | |||
| @@ -133,10 +133,79 @@ static struct platform_device serial_device = { | |||
| 133 | }, | 133 | }, |
| 134 | }; | 134 | }; |
| 135 | 135 | ||
| 136 | static struct platform_device nand_flash_device = { | ||
| 137 | .name = "pnx4008-flash", | ||
| 138 | .id = -1, | ||
| 139 | .dev = { | ||
| 140 | .coherent_dma_mask = 0xFFFFFFFF, | ||
| 141 | }, | ||
| 142 | }; | ||
| 143 | |||
| 144 | /* The dmamask must be set for OHCI to work */ | ||
| 145 | static u64 ohci_dmamask = ~(u32) 0; | ||
| 146 | |||
| 147 | static struct resource ohci_resources[] = { | ||
| 148 | { | ||
| 149 | .start = IO_ADDRESS(PNX4008_USB_CONFIG_BASE), | ||
| 150 | .end = IO_ADDRESS(PNX4008_USB_CONFIG_BASE + 0x100), | ||
| 151 | .flags = IORESOURCE_MEM, | ||
| 152 | }, { | ||
| 153 | .start = USB_HOST_INT, | ||
| 154 | .flags = IORESOURCE_IRQ, | ||
| 155 | }, | ||
| 156 | }; | ||
| 157 | |||
| 158 | static struct platform_device ohci_device = { | ||
| 159 | .name = "pnx4008-usb-ohci", | ||
| 160 | .id = -1, | ||
| 161 | .dev = { | ||
| 162 | .dma_mask = &ohci_dmamask, | ||
| 163 | .coherent_dma_mask = 0xffffffff, | ||
| 164 | }, | ||
| 165 | .num_resources = ARRAY_SIZE(ohci_resources), | ||
| 166 | .resource = ohci_resources, | ||
| 167 | }; | ||
| 168 | |||
| 169 | static struct platform_device sdum_device = { | ||
| 170 | .name = "pnx4008-sdum", | ||
| 171 | .id = 0, | ||
| 172 | .dev = { | ||
| 173 | .coherent_dma_mask = 0xffffffff, | ||
| 174 | }, | ||
| 175 | }; | ||
| 176 | |||
| 177 | static struct platform_device rgbfb_device = { | ||
| 178 | .name = "pnx4008-rgbfb", | ||
| 179 | .id = 0, | ||
| 180 | .dev = { | ||
| 181 | .coherent_dma_mask = 0xffffffff, | ||
| 182 | } | ||
| 183 | }; | ||
| 184 | |||
| 185 | struct resource watchdog_resources[] = { | ||
| 186 | { | ||
| 187 | .start = PNX4008_WDOG_BASE, | ||
| 188 | .end = PNX4008_WDOG_BASE + SZ_4K - 1, | ||
| 189 | .flags = IORESOURCE_MEM, | ||
| 190 | }, | ||
| 191 | }; | ||
| 192 | |||
| 193 | static struct platform_device watchdog_device = { | ||
| 194 | .name = "pnx4008-watchdog", | ||
| 195 | .id = -1, | ||
| 196 | .num_resources = ARRAY_SIZE(watchdog_resources), | ||
| 197 | .resource = watchdog_resources, | ||
| 198 | }; | ||
| 199 | |||
| 136 | static struct platform_device *devices[] __initdata = { | 200 | static struct platform_device *devices[] __initdata = { |
| 137 | &spipnx_1, | 201 | &spipnx_1, |
| 138 | &spipnx_2, | 202 | &spipnx_2, |
| 139 | &serial_device, | 203 | &serial_device, |
| 204 | &ohci_device, | ||
| 205 | &nand_flash_device, | ||
| 206 | &sdum_device, | ||
| 207 | &rgbfb_device, | ||
| 208 | &watchdog_device, | ||
| 140 | }; | 209 | }; |
| 141 | 210 | ||
| 142 | 211 | ||
diff --git a/arch/arm/mm/consistent.c b/arch/arm/mm/consistent.c index 50e6b6bfb2e2..b797217e82be 100644 --- a/arch/arm/mm/consistent.c +++ b/arch/arm/mm/consistent.c | |||
| @@ -476,6 +476,9 @@ core_initcall(consistent_init); | |||
| 476 | 476 | ||
| 477 | /* | 477 | /* |
| 478 | * Make an area consistent for devices. | 478 | * Make an area consistent for devices. |
| 479 | * Note: Drivers should NOT use this function directly, as it will break | ||
| 480 | * platforms with CONFIG_DMABOUNCE. | ||
| 481 | * Use the driver DMA support - see dma-mapping.h (dma_sync_*) | ||
| 479 | */ | 482 | */ |
| 480 | void consistent_sync(void *vaddr, size_t size, int direction) | 483 | void consistent_sync(void *vaddr, size_t size, int direction) |
| 481 | { | 484 | { |
diff --git a/arch/arm/oprofile/op_counter.h b/arch/arm/oprofile/op_counter.h index 8c5351d751cf..ca942a63b52f 100644 --- a/arch/arm/oprofile/op_counter.h +++ b/arch/arm/oprofile/op_counter.h | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | #ifndef OP_COUNTER_H | 10 | #ifndef OP_COUNTER_H |
| 11 | #define OP_COUNTER_H | 11 | #define OP_COUNTER_H |
| 12 | 12 | ||
| 13 | #define OP_MAX_COUNTER 5 | ||
| 14 | |||
| 15 | /* Per performance monitor configuration as set via | 13 | /* Per performance monitor configuration as set via |
| 16 | * oprofilefs. | 14 | * oprofilefs. |
| 17 | */ | 15 | */ |
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index 22e4c466e5a3..d12fb97a5337 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c | |||
| @@ -82,6 +82,7 @@ EXPORT_SYMBOL(acpi_strict); | |||
| 82 | acpi_interrupt_flags acpi_sci_flags __initdata; | 82 | acpi_interrupt_flags acpi_sci_flags __initdata; |
| 83 | int acpi_sci_override_gsi __initdata; | 83 | int acpi_sci_override_gsi __initdata; |
| 84 | int acpi_skip_timer_override __initdata; | 84 | int acpi_skip_timer_override __initdata; |
| 85 | int acpi_use_timer_override __initdata; | ||
| 85 | 86 | ||
| 86 | #ifdef CONFIG_X86_LOCAL_APIC | 87 | #ifdef CONFIG_X86_LOCAL_APIC |
| 87 | static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; | 88 | static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; |
| @@ -1300,6 +1301,13 @@ static int __init parse_acpi_skip_timer_override(char *arg) | |||
| 1300 | return 0; | 1301 | return 0; |
| 1301 | } | 1302 | } |
| 1302 | early_param("acpi_skip_timer_override", parse_acpi_skip_timer_override); | 1303 | early_param("acpi_skip_timer_override", parse_acpi_skip_timer_override); |
| 1304 | |||
| 1305 | static int __init parse_acpi_use_timer_override(char *arg) | ||
| 1306 | { | ||
| 1307 | acpi_use_timer_override = 1; | ||
| 1308 | return 0; | ||
| 1309 | } | ||
| 1310 | early_param("acpi_use_timer_override", parse_acpi_use_timer_override); | ||
| 1303 | #endif /* CONFIG_X86_IO_APIC */ | 1311 | #endif /* CONFIG_X86_IO_APIC */ |
| 1304 | 1312 | ||
| 1305 | static int __init setup_acpi_sci(char *s) | 1313 | static int __init setup_acpi_sci(char *s) |
diff --git a/arch/i386/kernel/acpi/earlyquirk.c b/arch/i386/kernel/acpi/earlyquirk.c index fe799b11ac0a..c9841692bb7c 100644 --- a/arch/i386/kernel/acpi/earlyquirk.c +++ b/arch/i386/kernel/acpi/earlyquirk.c | |||
| @@ -27,11 +27,17 @@ static int __init check_bridge(int vendor, int device) | |||
| 27 | #ifdef CONFIG_ACPI | 27 | #ifdef CONFIG_ACPI |
| 28 | /* According to Nvidia all timer overrides are bogus unless HPET | 28 | /* According to Nvidia all timer overrides are bogus unless HPET |
| 29 | is enabled. */ | 29 | is enabled. */ |
| 30 | if (vendor == PCI_VENDOR_ID_NVIDIA) { | 30 | if (!acpi_use_timer_override && vendor == PCI_VENDOR_ID_NVIDIA) { |
| 31 | nvidia_hpet_detected = 0; | 31 | nvidia_hpet_detected = 0; |
| 32 | acpi_table_parse(ACPI_HPET, nvidia_hpet_check); | 32 | acpi_table_parse(ACPI_HPET, nvidia_hpet_check); |
| 33 | if (nvidia_hpet_detected == 0) { | 33 | if (nvidia_hpet_detected == 0) { |
| 34 | acpi_skip_timer_override = 1; | 34 | acpi_skip_timer_override = 1; |
| 35 | printk(KERN_INFO "Nvidia board " | ||
| 36 | "detected. Ignoring ACPI " | ||
| 37 | "timer override.\n"); | ||
| 38 | printk(KERN_INFO "If you got timer trouble " | ||
| 39 | "try acpi_use_timer_override\n"); | ||
| 40 | |||
| 35 | } | 41 | } |
| 36 | } | 42 | } |
| 37 | #endif | 43 | #endif |
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c index ad84bc2802a6..3b7a63e0ed1a 100644 --- a/arch/i386/kernel/io_apic.c +++ b/arch/i386/kernel/io_apic.c | |||
| @@ -1287,9 +1287,11 @@ static void ioapic_register_intr(int irq, int vector, unsigned long trigger) | |||
| 1287 | trigger == IOAPIC_LEVEL) | 1287 | trigger == IOAPIC_LEVEL) |
| 1288 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 1288 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
| 1289 | handle_fasteoi_irq, "fasteoi"); | 1289 | handle_fasteoi_irq, "fasteoi"); |
| 1290 | else | 1290 | else { |
| 1291 | irq_desc[irq].status |= IRQ_DELAYED_DISABLE; | ||
| 1291 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 1292 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
| 1292 | handle_edge_irq, "edge"); | 1293 | handle_edge_irq, "edge"); |
| 1294 | } | ||
| 1293 | set_intr_gate(vector, interrupt[irq]); | 1295 | set_intr_gate(vector, interrupt[irq]); |
| 1294 | } | 1296 | } |
| 1295 | 1297 | ||
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 1e1fa3e391a3..dd53c58f64f1 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
| @@ -205,7 +205,7 @@ void cpu_idle(void) | |||
| 205 | void cpu_idle_wait(void) | 205 | void cpu_idle_wait(void) |
| 206 | { | 206 | { |
| 207 | unsigned int cpu, this_cpu = get_cpu(); | 207 | unsigned int cpu, this_cpu = get_cpu(); |
| 208 | cpumask_t map; | 208 | cpumask_t map, tmp = current->cpus_allowed; |
| 209 | 209 | ||
| 210 | set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); | 210 | set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); |
| 211 | put_cpu(); | 211 | put_cpu(); |
| @@ -227,6 +227,8 @@ void cpu_idle_wait(void) | |||
| 227 | } | 227 | } |
| 228 | cpus_and(map, map, cpu_online_map); | 228 | cpus_and(map, map, cpu_online_map); |
| 229 | } while (!cpus_empty(map)); | 229 | } while (!cpus_empty(map)); |
| 230 | |||
| 231 | set_cpus_allowed(current, tmp); | ||
| 230 | } | 232 | } |
| 231 | EXPORT_SYMBOL_GPL(cpu_idle_wait); | 233 | EXPORT_SYMBOL_GPL(cpu_idle_wait); |
| 232 | 234 | ||
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index 00489b706d27..fe9c5e8e7e6f 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c | |||
| @@ -129,15 +129,19 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo, | |||
| 129 | 129 | ||
| 130 | #ifdef CONFIG_FRAME_POINTER | 130 | #ifdef CONFIG_FRAME_POINTER |
| 131 | while (valid_stack_ptr(tinfo, (void *)ebp)) { | 131 | while (valid_stack_ptr(tinfo, (void *)ebp)) { |
| 132 | unsigned long new_ebp; | ||
| 132 | addr = *(unsigned long *)(ebp + 4); | 133 | addr = *(unsigned long *)(ebp + 4); |
| 133 | ops->address(data, addr); | 134 | ops->address(data, addr); |
| 134 | /* | 135 | /* |
| 135 | * break out of recursive entries (such as | 136 | * break out of recursive entries (such as |
| 136 | * end_of_stack_stop_unwind_function): | 137 | * end_of_stack_stop_unwind_function). Also, |
| 138 | * we can never allow a frame pointer to | ||
| 139 | * move downwards! | ||
| 137 | */ | 140 | */ |
| 138 | if (ebp == *(unsigned long *)ebp) | 141 | new_ebp = *(unsigned long *)ebp; |
| 142 | if (new_ebp <= ebp) | ||
| 139 | break; | 143 | break; |
| 140 | ebp = *(unsigned long *)ebp; | 144 | ebp = new_ebp; |
| 141 | } | 145 | } |
| 142 | #else | 146 | #else |
| 143 | while (valid_stack_ptr(tinfo, stack)) { | 147 | while (valid_stack_ptr(tinfo, stack)) { |
diff --git a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c index dbc4aae91959..69163998adeb 100644 --- a/arch/i386/pci/irq.c +++ b/arch/i386/pci/irq.c | |||
| @@ -255,13 +255,13 @@ static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, i | |||
| 255 | */ | 255 | */ |
| 256 | static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | 256 | static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
| 257 | { | 257 | { |
| 258 | static const unsigned int pirqmap[4] = { 3, 2, 5, 1 }; | 258 | static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; |
| 259 | return read_config_nybble(router, 0x55, pirqmap[pirq-1]); | 259 | return read_config_nybble(router, 0x55, pirqmap[pirq-1]); |
| 260 | } | 260 | } |
| 261 | 261 | ||
| 262 | static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | 262 | static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
| 263 | { | 263 | { |
| 264 | static const unsigned int pirqmap[4] = { 3, 2, 5, 1 }; | 264 | static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; |
| 265 | write_config_nybble(router, 0x55, pirqmap[pirq-1], irq); | 265 | write_config_nybble(router, 0x55, pirqmap[pirq-1], irq); |
| 266 | return 1; | 266 | return 1; |
| 267 | } | 267 | } |
diff --git a/arch/ia64/hp/sim/Kconfig b/arch/ia64/hp/sim/Kconfig index 18ccb1266e18..f92306bbedb8 100644 --- a/arch/ia64/hp/sim/Kconfig +++ b/arch/ia64/hp/sim/Kconfig | |||
| @@ -13,8 +13,8 @@ config HP_SIMSERIAL_CONSOLE | |||
| 13 | depends on HP_SIMSERIAL | 13 | depends on HP_SIMSERIAL |
| 14 | 14 | ||
| 15 | config HP_SIMSCSI | 15 | config HP_SIMSCSI |
| 16 | tristate "Simulated SCSI disk" | 16 | bool "Simulated SCSI disk" |
| 17 | depends on SCSI | 17 | depends on SCSI=y |
| 18 | 18 | ||
| 19 | endmenu | 19 | endmenu |
| 20 | 20 | ||
diff --git a/arch/ia64/hp/sim/hpsim_irq.c b/arch/ia64/hp/sim/hpsim_irq.c index 8145547bb52d..c2f58ff364e7 100644 --- a/arch/ia64/hp/sim/hpsim_irq.c +++ b/arch/ia64/hp/sim/hpsim_irq.c | |||
| @@ -27,7 +27,7 @@ hpsim_set_affinity_noop (unsigned int a, cpumask_t b) | |||
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | static struct hw_interrupt_type irq_type_hp_sim = { | 29 | static struct hw_interrupt_type irq_type_hp_sim = { |
| 30 | .typename = "hpsim", | 30 | .name = "hpsim", |
| 31 | .startup = hpsim_irq_startup, | 31 | .startup = hpsim_irq_startup, |
| 32 | .shutdown = hpsim_irq_noop, | 32 | .shutdown = hpsim_irq_noop, |
| 33 | .enable = hpsim_irq_noop, | 33 | .enable = hpsim_irq_noop, |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 9bf15fefa7e4..60d64950e3c2 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
| @@ -426,7 +426,7 @@ iosapic_end_level_irq (unsigned int irq) | |||
| 426 | #define iosapic_ack_level_irq nop | 426 | #define iosapic_ack_level_irq nop |
| 427 | 427 | ||
| 428 | struct hw_interrupt_type irq_type_iosapic_level = { | 428 | struct hw_interrupt_type irq_type_iosapic_level = { |
| 429 | .typename = "IO-SAPIC-level", | 429 | .name = "IO-SAPIC-level", |
| 430 | .startup = iosapic_startup_level_irq, | 430 | .startup = iosapic_startup_level_irq, |
| 431 | .shutdown = iosapic_shutdown_level_irq, | 431 | .shutdown = iosapic_shutdown_level_irq, |
| 432 | .enable = iosapic_enable_level_irq, | 432 | .enable = iosapic_enable_level_irq, |
| @@ -473,7 +473,7 @@ iosapic_ack_edge_irq (unsigned int irq) | |||
| 473 | #define iosapic_end_edge_irq nop | 473 | #define iosapic_end_edge_irq nop |
| 474 | 474 | ||
| 475 | struct hw_interrupt_type irq_type_iosapic_edge = { | 475 | struct hw_interrupt_type irq_type_iosapic_edge = { |
| 476 | .typename = "IO-SAPIC-edge", | 476 | .name = "IO-SAPIC-edge", |
| 477 | .startup = iosapic_startup_edge_irq, | 477 | .startup = iosapic_startup_edge_irq, |
| 478 | .shutdown = iosapic_disable_edge_irq, | 478 | .shutdown = iosapic_disable_edge_irq, |
| 479 | .enable = iosapic_enable_edge_irq, | 479 | .enable = iosapic_enable_edge_irq, |
| @@ -664,7 +664,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery, | |||
| 664 | printk(KERN_WARNING | 664 | printk(KERN_WARNING |
| 665 | "%s: changing vector %d from %s to %s\n", | 665 | "%s: changing vector %d from %s to %s\n", |
| 666 | __FUNCTION__, vector, | 666 | __FUNCTION__, vector, |
| 667 | idesc->chip->typename, irq_type->typename); | 667 | idesc->chip->name, irq_type->name); |
| 668 | idesc->chip = irq_type; | 668 | idesc->chip = irq_type; |
| 669 | } | 669 | } |
| 670 | return 0; | 670 | return 0; |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index f07c0864b0b4..54d55e4d64f7 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
| @@ -76,7 +76,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
| 76 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 76 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
| 77 | } | 77 | } |
| 78 | #endif | 78 | #endif |
| 79 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 79 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
| 80 | seq_printf(p, " %s", action->name); | 80 | seq_printf(p, " %s", action->name); |
| 81 | 81 | ||
| 82 | for (action=action->next; action; action = action->next) | 82 | for (action=action->next; action; action = action->next) |
| @@ -197,7 +197,7 @@ void fixup_irqs(void) | |||
| 197 | struct pt_regs *old_regs = set_irq_regs(NULL); | 197 | struct pt_regs *old_regs = set_irq_regs(NULL); |
| 198 | 198 | ||
| 199 | vectors_in_migration[irq]=0; | 199 | vectors_in_migration[irq]=0; |
| 200 | __do_IRQ(irq); | 200 | generic_handle_irq(irq); |
| 201 | set_irq_regs(old_regs); | 201 | set_irq_regs(old_regs); |
| 202 | } | 202 | } |
| 203 | } | 203 | } |
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index 9c6dafa2d0df..ba3ba8bc50be 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
| @@ -186,7 +186,7 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs) | |||
| 186 | ia64_setreg(_IA64_REG_CR_TPR, vector); | 186 | ia64_setreg(_IA64_REG_CR_TPR, vector); |
| 187 | ia64_srlz_d(); | 187 | ia64_srlz_d(); |
| 188 | 188 | ||
| 189 | __do_IRQ(local_vector_to_irq(vector)); | 189 | generic_handle_irq(local_vector_to_irq(vector)); |
| 190 | 190 | ||
| 191 | /* | 191 | /* |
| 192 | * Disable interrupts and send EOI: | 192 | * Disable interrupts and send EOI: |
| @@ -242,7 +242,7 @@ void ia64_process_pending_intr(void) | |||
| 242 | * Probably could shared code. | 242 | * Probably could shared code. |
| 243 | */ | 243 | */ |
| 244 | vectors_in_migration[local_vector_to_irq(vector)]=0; | 244 | vectors_in_migration[local_vector_to_irq(vector)]=0; |
| 245 | __do_IRQ(local_vector_to_irq(vector)); | 245 | generic_handle_irq(local_vector_to_irq(vector)); |
| 246 | set_irq_regs(old_regs); | 246 | set_irq_regs(old_regs); |
| 247 | 247 | ||
| 248 | /* | 248 | /* |
diff --git a/arch/ia64/kernel/irq_lsapic.c b/arch/ia64/kernel/irq_lsapic.c index 1ab58b09f3d7..c2f07beb1759 100644 --- a/arch/ia64/kernel/irq_lsapic.c +++ b/arch/ia64/kernel/irq_lsapic.c | |||
| @@ -34,7 +34,7 @@ static int lsapic_retrigger(unsigned int irq) | |||
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | struct hw_interrupt_type irq_type_ia64_lsapic = { | 36 | struct hw_interrupt_type irq_type_ia64_lsapic = { |
| 37 | .typename = "LSAPIC", | 37 | .name = "LSAPIC", |
| 38 | .startup = lsapic_noop_startup, | 38 | .startup = lsapic_noop_startup, |
| 39 | .shutdown = lsapic_noop, | 39 | .shutdown = lsapic_noop, |
| 40 | .enable = lsapic_noop, | 40 | .enable = lsapic_noop, |
diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c index eee5c1cfbe32..f3a9585e98a8 100644 --- a/arch/ia64/mm/hugetlbpage.c +++ b/arch/ia64/mm/hugetlbpage.c | |||
| @@ -70,8 +70,10 @@ huge_pte_offset (struct mm_struct *mm, unsigned long addr) | |||
| 70 | * Don't actually need to do any preparation, but need to make sure | 70 | * Don't actually need to do any preparation, but need to make sure |
| 71 | * the address is in the right region. | 71 | * the address is in the right region. |
| 72 | */ | 72 | */ |
| 73 | int prepare_hugepage_range(unsigned long addr, unsigned long len) | 73 | int prepare_hugepage_range(unsigned long addr, unsigned long len, pgoff_t pgoff) |
| 74 | { | 74 | { |
| 75 | if (pgoff & (~HPAGE_MASK >> PAGE_SHIFT)) | ||
| 76 | return -EINVAL; | ||
| 75 | if (len & ~HPAGE_MASK) | 77 | if (len & ~HPAGE_MASK) |
| 76 | return -EINVAL; | 78 | return -EINVAL; |
| 77 | if (addr & ~HPAGE_MASK) | 79 | if (addr & ~HPAGE_MASK) |
diff --git a/arch/ia64/sn/kernel/bte.c b/arch/ia64/sn/kernel/bte.c index 7f73ad4408aa..ff1c55601178 100644 --- a/arch/ia64/sn/kernel/bte.c +++ b/arch/ia64/sn/kernel/bte.c | |||
| @@ -381,14 +381,13 @@ bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | |||
| 381 | * bcopy to the destination. | 381 | * bcopy to the destination. |
| 382 | */ | 382 | */ |
| 383 | 383 | ||
| 384 | /* Add the leader from source */ | ||
| 385 | headBteLen = len + (src & L1_CACHE_MASK); | ||
| 386 | /* Add the trailing bytes from footer. */ | ||
| 387 | headBteLen += L1_CACHE_BYTES - (headBteLen & L1_CACHE_MASK); | ||
| 388 | headBteSource = src & ~L1_CACHE_MASK; | ||
| 389 | headBcopySrcOffset = src & L1_CACHE_MASK; | 384 | headBcopySrcOffset = src & L1_CACHE_MASK; |
| 390 | headBcopyDest = dest; | 385 | headBcopyDest = dest; |
| 391 | headBcopyLen = len; | 386 | headBcopyLen = len; |
| 387 | |||
| 388 | headBteSource = src - headBcopySrcOffset; | ||
| 389 | /* Add the leading and trailing bytes from source */ | ||
| 390 | headBteLen = L1_CACHE_ALIGN(len + headBcopySrcOffset); | ||
| 392 | } | 391 | } |
| 393 | 392 | ||
| 394 | if (headBcopyLen > 0) { | 393 | if (headBcopyLen > 0) { |
diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c index 7bb6ad188ba3..0b49459a878a 100644 --- a/arch/ia64/sn/kernel/irq.c +++ b/arch/ia64/sn/kernel/irq.c | |||
| @@ -201,7 +201,7 @@ static void sn_set_affinity_irq(unsigned int irq, cpumask_t mask) | |||
| 201 | } | 201 | } |
| 202 | 202 | ||
| 203 | struct hw_interrupt_type irq_type_sn = { | 203 | struct hw_interrupt_type irq_type_sn = { |
| 204 | .typename = "SN hub", | 204 | .name = "SN hub", |
| 205 | .startup = sn_startup_irq, | 205 | .startup = sn_startup_irq, |
| 206 | .shutdown = sn_shutdown_irq, | 206 | .shutdown = sn_shutdown_irq, |
| 207 | .enable = sn_enable_irq, | 207 | .enable = sn_enable_irq, |
diff --git a/arch/m68knommu/kernel/setup.c b/arch/m68knommu/kernel/setup.c index bde9811cf98c..7b21959eaeae 100644 --- a/arch/m68knommu/kernel/setup.c +++ b/arch/m68knommu/kernel/setup.c | |||
| @@ -62,7 +62,7 @@ int (*mach_kbdrate) (struct kbd_repeat *); | |||
| 62 | void (*mach_kbd_leds) (unsigned int); | 62 | void (*mach_kbd_leds) (unsigned int); |
| 63 | /* machine dependent irq functions */ | 63 | /* machine dependent irq functions */ |
| 64 | void (*mach_init_IRQ) (void); | 64 | void (*mach_init_IRQ) (void); |
| 65 | irqreturn_t (*(*mach_default_handler)[]) (int, void *, struct pt_regs *); | 65 | irq_handler_t mach_default_handler; |
| 66 | int (*mach_get_irq_list) (struct seq_file *, void *); | 66 | int (*mach_get_irq_list) (struct seq_file *, void *); |
| 67 | void (*mach_process_int) (int irq, struct pt_regs *fp); | 67 | void (*mach_process_int) (int irq, struct pt_regs *fp); |
| 68 | void (*mach_trap_init) (void); | 68 | void (*mach_trap_init) (void); |
diff --git a/arch/m68knommu/kernel/time.c b/arch/m68knommu/kernel/time.c index c5667bdddd5e..9226264abf1a 100644 --- a/arch/m68knommu/kernel/time.c +++ b/arch/m68knommu/kernel/time.c | |||
| @@ -54,7 +54,7 @@ static irqreturn_t timer_interrupt(int irq, void *dummy, struct pt_regs * regs) | |||
| 54 | update_process_times(user_mode(regs)); | 54 | update_process_times(user_mode(regs)); |
| 55 | #endif | 55 | #endif |
| 56 | if (current->pid) | 56 | if (current->pid) |
| 57 | profile_tick(CPU_PROFILING, regs); | 57 | profile_tick(CPU_PROFILING); |
| 58 | 58 | ||
| 59 | /* | 59 | /* |
| 60 | * If we have an externally synchronized Linux clock, then update | 60 | * If we have an externally synchronized Linux clock, then update |
diff --git a/arch/m68knommu/platform/5307/ints.c b/arch/m68knommu/platform/5307/ints.c index b4b55093ae7e..a57239ec6c8c 100644 --- a/arch/m68knommu/platform/5307/ints.c +++ b/arch/m68knommu/platform/5307/ints.c | |||
| @@ -33,7 +33,7 @@ | |||
| 33 | /* | 33 | /* |
| 34 | * This table stores the address info for each vector handler. | 34 | * This table stores the address info for each vector handler. |
| 35 | */ | 35 | */ |
| 36 | irq_handler_t irq_list[SYS_IRQS]; | 36 | struct irq_entry irq_list[SYS_IRQS]; |
| 37 | 37 | ||
| 38 | #define NUM_IRQ_NODES 16 | 38 | #define NUM_IRQ_NODES 16 |
| 39 | static irq_node_t nodes[NUM_IRQ_NODES]; | 39 | static irq_node_t nodes[NUM_IRQ_NODES]; |
| @@ -44,7 +44,7 @@ volatile unsigned int num_spurious; | |||
| 44 | unsigned int local_bh_count[NR_CPUS]; | 44 | unsigned int local_bh_count[NR_CPUS]; |
| 45 | unsigned int local_irq_count[NR_CPUS]; | 45 | unsigned int local_irq_count[NR_CPUS]; |
| 46 | 46 | ||
| 47 | static irqreturn_t default_irq_handler(int irq, void *ptr, struct pt_regs *regs) | 47 | static irqreturn_t default_irq_handler(int irq, void *ptr) |
| 48 | { | 48 | { |
| 49 | #if 1 | 49 | #if 1 |
| 50 | printk(KERN_INFO "%s(%d): default irq handler vec=%d [0x%x]\n", | 50 | printk(KERN_INFO "%s(%d): default irq handler vec=%d [0x%x]\n", |
| @@ -70,7 +70,7 @@ void __init init_IRQ(void) | |||
| 70 | 70 | ||
| 71 | for (i = 0; i < SYS_IRQS; i++) { | 71 | for (i = 0; i < SYS_IRQS; i++) { |
| 72 | if (mach_default_handler) | 72 | if (mach_default_handler) |
| 73 | irq_list[i].handler = (*mach_default_handler)[i]; | 73 | irq_list[i].handler = mach_default_handler; |
| 74 | else | 74 | else |
| 75 | irq_list[i].handler = default_irq_handler; | 75 | irq_list[i].handler = default_irq_handler; |
| 76 | irq_list[i].flags = IRQ_FLG_STD; | 76 | irq_list[i].flags = IRQ_FLG_STD; |
| @@ -100,7 +100,7 @@ irq_node_t *new_irq_node(void) | |||
| 100 | 100 | ||
| 101 | int request_irq( | 101 | int request_irq( |
| 102 | unsigned int irq, | 102 | unsigned int irq, |
| 103 | irqreturn_t (*handler)(int, void *, struct pt_regs *), | 103 | irq_handler_t handler, |
| 104 | unsigned long flags, | 104 | unsigned long flags, |
| 105 | const char *devname, | 105 | const char *devname, |
| 106 | void *dev_id) | 106 | void *dev_id) |
| @@ -157,7 +157,7 @@ void free_irq(unsigned int irq, void *dev_id) | |||
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | if (mach_default_handler) | 159 | if (mach_default_handler) |
| 160 | irq_list[irq].handler = (*mach_default_handler)[irq]; | 160 | irq_list[irq].handler = mach_default_handler; |
| 161 | else | 161 | else |
| 162 | irq_list[irq].handler = default_irq_handler; | 162 | irq_list[irq].handler = default_irq_handler; |
| 163 | irq_list[irq].flags = IRQ_FLG_STD; | 163 | irq_list[irq].flags = IRQ_FLG_STD; |
| @@ -168,8 +168,7 @@ void free_irq(unsigned int irq, void *dev_id) | |||
| 168 | EXPORT_SYMBOL(free_irq); | 168 | EXPORT_SYMBOL(free_irq); |
| 169 | 169 | ||
| 170 | 170 | ||
| 171 | int sys_request_irq(unsigned int irq, | 171 | int sys_request_irq(unsigned int irq, irq_handler_t handler, |
| 172 | irqreturn_t (*handler)(int, void *, struct pt_regs *), | ||
| 173 | unsigned long flags, const char *devname, void *dev_id) | 172 | unsigned long flags, const char *devname, void *dev_id) |
| 174 | { | 173 | { |
| 175 | if (irq > IRQ7) { | 174 | if (irq > IRQ7) { |
| @@ -211,7 +210,7 @@ void sys_free_irq(unsigned int irq, void *dev_id) | |||
| 211 | printk(KERN_WARNING "%s: Removing probably wrong IRQ %d from %s\n", | 210 | printk(KERN_WARNING "%s: Removing probably wrong IRQ %d from %s\n", |
| 212 | __FUNCTION__, irq, irq_list[irq].devname); | 211 | __FUNCTION__, irq, irq_list[irq].devname); |
| 213 | 212 | ||
| 214 | irq_list[irq].handler = (*mach_default_handler)[irq]; | 213 | irq_list[irq].handler = mach_default_handler; |
| 215 | irq_list[irq].flags = 0; | 214 | irq_list[irq].flags = 0; |
| 216 | irq_list[irq].dev_id = NULL; | 215 | irq_list[irq].dev_id = NULL; |
| 217 | irq_list[irq].devname = NULL; | 216 | irq_list[irq].devname = NULL; |
| @@ -241,7 +240,7 @@ asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) | |||
| 241 | if (vec >= VEC_INT1 && vec <= VEC_INT7) { | 240 | if (vec >= VEC_INT1 && vec <= VEC_INT7) { |
| 242 | vec -= VEC_SPUR; | 241 | vec -= VEC_SPUR; |
| 243 | kstat_cpu(0).irqs[vec]++; | 242 | kstat_cpu(0).irqs[vec]++; |
| 244 | irq_list[vec].handler(vec, irq_list[vec].dev_id, fp); | 243 | irq_list[vec].handler(vec, irq_list[vec].dev_id); |
| 245 | } else { | 244 | } else { |
| 246 | if (mach_process_int) | 245 | if (mach_process_int) |
| 247 | mach_process_int(vec, fp); | 246 | mach_process_int(vec, fp); |
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index cd9cec9e39e9..6bfbbed0897e 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
| @@ -6,7 +6,7 @@ extra-y := head.o init_task.o vmlinux.lds | |||
| 6 | 6 | ||
| 7 | obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ | 7 | obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ |
| 8 | ptrace.o reset.o semaphore.o setup.o signal.o syscall.o \ | 8 | ptrace.o reset.o semaphore.o setup.o signal.o syscall.o \ |
| 9 | time.o traps.o unaligned.o | 9 | time.o topology.o traps.o unaligned.o |
| 10 | 10 | ||
| 11 | binfmt_irix-objs := irixelf.o irixinv.o irixioctl.o irixsig.o \ | 11 | binfmt_irix-objs := irixelf.o irixinv.o irixioctl.o irixsig.o \ |
| 12 | irix5sys.o sysirix.o | 12 | irix5sys.o sysirix.o |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index db80957ada89..49db516789e0 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
| @@ -463,28 +463,5 @@ void flush_tlb_one(unsigned long vaddr) | |||
| 463 | smp_on_each_tlb(flush_tlb_one_ipi, (void *) vaddr); | 463 | smp_on_each_tlb(flush_tlb_one_ipi, (void *) vaddr); |
| 464 | } | 464 | } |
| 465 | 465 | ||
| 466 | static DEFINE_PER_CPU(struct cpu, cpu_devices); | ||
| 467 | |||
| 468 | static int __init topology_init(void) | ||
| 469 | { | ||
| 470 | int i, ret; | ||
| 471 | |||
| 472 | #ifdef CONFIG_NUMA | ||
| 473 | for_each_online_node(i) | ||
| 474 | register_one_node(i); | ||
| 475 | #endif /* CONFIG_NUMA */ | ||
| 476 | |||
| 477 | for_each_present_cpu(i) { | ||
| 478 | ret = register_cpu(&per_cpu(cpu_devices, i), i); | ||
| 479 | if (ret) | ||
| 480 | printk(KERN_WARNING "topology_init: register_cpu %d " | ||
| 481 | "failed (%d)\n", i, ret); | ||
| 482 | } | ||
| 483 | |||
| 484 | return 0; | ||
| 485 | } | ||
| 486 | |||
| 487 | subsys_initcall(topology_init); | ||
| 488 | |||
| 489 | EXPORT_SYMBOL(flush_tlb_page); | 466 | EXPORT_SYMBOL(flush_tlb_page); |
| 490 | EXPORT_SYMBOL(flush_tlb_one); | 467 | EXPORT_SYMBOL(flush_tlb_one); |
diff --git a/arch/mips/kernel/topology.c b/arch/mips/kernel/topology.c new file mode 100644 index 000000000000..660e44ed44d7 --- /dev/null +++ b/arch/mips/kernel/topology.c | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | #include <linux/cpu.h> | ||
| 2 | #include <linux/cpumask.h> | ||
| 3 | #include <linux/init.h> | ||
| 4 | #include <linux/node.h> | ||
| 5 | #include <linux/nodemask.h> | ||
| 6 | #include <linux/percpu.h> | ||
| 7 | |||
| 8 | static DEFINE_PER_CPU(struct cpu, cpu_devices); | ||
| 9 | |||
| 10 | static int __init topology_init(void) | ||
| 11 | { | ||
| 12 | int i, ret; | ||
| 13 | |||
| 14 | #ifdef CONFIG_NUMA | ||
| 15 | for_each_online_node(i) | ||
| 16 | register_one_node(i); | ||
| 17 | #endif /* CONFIG_NUMA */ | ||
| 18 | |||
| 19 | for_each_present_cpu(i) { | ||
| 20 | ret = register_cpu(&per_cpu(cpu_devices, i), i); | ||
| 21 | if (ret) | ||
| 22 | printk(KERN_WARNING "topology_init: register_cpu %d " | ||
| 23 | "failed (%d)\n", i, ret); | ||
| 24 | } | ||
| 25 | |||
| 26 | return 0; | ||
| 27 | } | ||
| 28 | |||
| 29 | subsys_initcall(topology_init); | ||
diff --git a/arch/mips/mips-boards/malta/malta_setup.c b/arch/mips/mips-boards/malta/malta_setup.c index ab460f805bef..282f3e52eea3 100644 --- a/arch/mips/mips-boards/malta/malta_setup.c +++ b/arch/mips/mips-boards/malta/malta_setup.c | |||
| @@ -159,7 +159,7 @@ void __init plat_mem_setup(void) | |||
| 159 | BONITO_PCIMEMBASECFG |= | 159 | BONITO_PCIMEMBASECFG |= |
| 160 | (BONITO_PCIMEMBASECFG_MEMBASE0_CACHED | | 160 | (BONITO_PCIMEMBASECFG_MEMBASE0_CACHED | |
| 161 | BONITO_PCIMEMBASECFG_MEMBASE1_CACHED); | 161 | BONITO_PCIMEMBASECFG_MEMBASE1_CACHED); |
| 162 | printk("Disabled Bonito IOBC coherency\n"); | 162 | printk("Enabled Bonito IOBC coherency\n"); |
| 163 | } | 163 | } |
| 164 | } | 164 | } |
| 165 | else | 165 | else |
diff --git a/arch/mips/mm/c-sb1.c b/arch/mips/mm/c-sb1.c index d0ddb4a768a5..3a8afd47feaa 100644 --- a/arch/mips/mm/c-sb1.c +++ b/arch/mips/mm/c-sb1.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 19 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 20 | */ | 20 | */ |
| 21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
| 22 | #include <linux/hardirq.h> | ||
| 22 | 23 | ||
| 23 | #include <asm/asm.h> | 24 | #include <asm/asm.h> |
| 24 | #include <asm/bootinfo.h> | 25 | #include <asm/bootinfo.h> |
| @@ -242,6 +243,25 @@ void sb1_flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsign | |||
| 242 | __attribute__((alias("local_sb1_flush_cache_page"))); | 243 | __attribute__((alias("local_sb1_flush_cache_page"))); |
| 243 | #endif | 244 | #endif |
| 244 | 245 | ||
| 246 | #ifdef CONFIG_SMP | ||
| 247 | static void sb1_flush_cache_data_page_ipi(void *info) | ||
| 248 | { | ||
| 249 | unsigned long start = (unsigned long)info; | ||
| 250 | |||
| 251 | __sb1_writeback_inv_dcache_range(start, start + PAGE_SIZE); | ||
| 252 | } | ||
| 253 | |||
| 254 | static void sb1_flush_cache_data_page(unsigned long addr) | ||
| 255 | { | ||
| 256 | if (in_atomic()) | ||
| 257 | __sb1_writeback_inv_dcache_range(addr, addr + PAGE_SIZE); | ||
| 258 | else | ||
| 259 | on_each_cpu(sb1_flush_cache_data_page_ipi, (void *) addr, 1, 1); | ||
| 260 | } | ||
| 261 | #else | ||
| 262 | void sb1_flush_cache_data_page(unsigned long) | ||
| 263 | __attribute__((alias("local_sb1_flush_cache_data_page"))); | ||
| 264 | #endif | ||
| 245 | 265 | ||
| 246 | /* | 266 | /* |
| 247 | * Invalidate all caches on this CPU | 267 | * Invalidate all caches on this CPU |
| @@ -481,7 +501,7 @@ void sb1_cache_init(void) | |||
| 481 | 501 | ||
| 482 | flush_cache_sigtramp = sb1_flush_cache_sigtramp; | 502 | flush_cache_sigtramp = sb1_flush_cache_sigtramp; |
| 483 | local_flush_data_cache_page = (void *) sb1_nop; | 503 | local_flush_data_cache_page = (void *) sb1_nop; |
| 484 | flush_data_cache_page = (void *) sb1_nop; | 504 | flush_data_cache_page = sb1_flush_cache_data_page; |
| 485 | 505 | ||
| 486 | /* Full flush */ | 506 | /* Full flush */ |
| 487 | __flush_cache_all = sb1___flush_cache_all; | 507 | __flush_cache_all = sb1___flush_cache_all; |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index a1b5e4b16151..46a24de36fec 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
| @@ -1014,48 +1014,6 @@ void __init time_init(void) | |||
| 1014 | set_dec(tb_ticks_per_jiffy); | 1014 | set_dec(tb_ticks_per_jiffy); |
| 1015 | } | 1015 | } |
| 1016 | 1016 | ||
| 1017 | #ifdef CONFIG_RTC_CLASS | ||
| 1018 | static int set_rtc_class_time(struct rtc_time *tm) | ||
| 1019 | { | ||
| 1020 | int err; | ||
| 1021 | struct class_device *class_dev = | ||
| 1022 | rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); | ||
| 1023 | |||
| 1024 | if (class_dev == NULL) | ||
| 1025 | return -ENODEV; | ||
| 1026 | |||
| 1027 | err = rtc_set_time(class_dev, tm); | ||
| 1028 | |||
| 1029 | rtc_class_close(class_dev); | ||
| 1030 | |||
| 1031 | return 0; | ||
| 1032 | } | ||
| 1033 | |||
| 1034 | static void get_rtc_class_time(struct rtc_time *tm) | ||
| 1035 | { | ||
| 1036 | int err; | ||
| 1037 | struct class_device *class_dev = | ||
| 1038 | rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); | ||
| 1039 | |||
| 1040 | if (class_dev == NULL) | ||
| 1041 | return; | ||
| 1042 | |||
| 1043 | err = rtc_read_time(class_dev, tm); | ||
| 1044 | |||
| 1045 | rtc_class_close(class_dev); | ||
| 1046 | |||
| 1047 | return; | ||
| 1048 | } | ||
| 1049 | |||
| 1050 | int __init rtc_class_hookup(void) | ||
| 1051 | { | ||
| 1052 | ppc_md.get_rtc_time = get_rtc_class_time; | ||
| 1053 | ppc_md.set_rtc_time = set_rtc_class_time; | ||
| 1054 | |||
| 1055 | return 0; | ||
| 1056 | } | ||
| 1057 | #endif /* CONFIG_RTC_CLASS */ | ||
| 1058 | |||
| 1059 | 1017 | ||
| 1060 | #define FEBRUARY 2 | 1018 | #define FEBRUARY 2 |
| 1061 | #define STARTOFTIME 1970 | 1019 | #define STARTOFTIME 1970 |
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index fd68b74c07c3..506d89768d45 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c | |||
| @@ -491,11 +491,15 @@ static int open_high_hpage_areas(struct mm_struct *mm, u16 newareas) | |||
| 491 | return 0; | 491 | return 0; |
| 492 | } | 492 | } |
| 493 | 493 | ||
| 494 | int prepare_hugepage_range(unsigned long addr, unsigned long len) | 494 | int prepare_hugepage_range(unsigned long addr, unsigned long len, pgoff_t pgoff) |
| 495 | { | 495 | { |
| 496 | int err = 0; | 496 | int err = 0; |
| 497 | 497 | ||
| 498 | if ( (addr+len) < addr ) | 498 | if (pgoff & (~HPAGE_MASK >> PAGE_SHIFT)) |
| 499 | return -EINVAL; | ||
| 500 | if (len & ~HPAGE_MASK) | ||
| 501 | return -EINVAL; | ||
| 502 | if (addr & ~HPAGE_MASK) | ||
| 499 | return -EINVAL; | 503 | return -EINVAL; |
| 500 | 504 | ||
| 501 | if (addr < 0x100000000UL) | 505 | if (addr < 0x100000000UL) |
diff --git a/arch/powerpc/platforms/83xx/mpc832x_mds.c b/arch/powerpc/platforms/83xx/mpc832x_mds.c index 54dea9d42dc9..a43ac71ab740 100644 --- a/arch/powerpc/platforms/83xx/mpc832x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc832x_mds.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/root_dev.h> | 24 | #include <linux/root_dev.h> |
| 25 | #include <linux/initrd.h> | 25 | #include <linux/initrd.h> |
| 26 | 26 | ||
| 27 | #include <asm/of_device.h> | ||
| 27 | #include <asm/system.h> | 28 | #include <asm/system.h> |
| 28 | #include <asm/atomic.h> | 29 | #include <asm/atomic.h> |
| 29 | #include <asm/time.h> | 30 | #include <asm/time.h> |
| @@ -136,6 +137,24 @@ static void __init mpc832x_sys_setup_arch(void) | |||
| 136 | #endif | 137 | #endif |
| 137 | } | 138 | } |
| 138 | 139 | ||
| 140 | static int __init mpc832x_declare_of_platform_devices(void) | ||
| 141 | { | ||
| 142 | struct device_node *np; | ||
| 143 | |||
| 144 | for (np = NULL; (np = of_find_compatible_node(np, "network", | ||
| 145 | "ucc_geth")) != NULL;) { | ||
| 146 | int ucc_num; | ||
| 147 | char bus_id[BUS_ID_SIZE]; | ||
| 148 | |||
| 149 | ucc_num = *((uint *) get_property(np, "device-id", NULL)) - 1; | ||
| 150 | snprintf(bus_id, BUS_ID_SIZE, "ucc_geth.%u", ucc_num); | ||
| 151 | of_platform_device_create(np, bus_id, NULL); | ||
| 152 | } | ||
| 153 | |||
| 154 | return 0; | ||
| 155 | } | ||
| 156 | device_initcall(mpc832x_declare_of_platform_devices); | ||
| 157 | |||
| 139 | void __init mpc832x_sys_init_IRQ(void) | 158 | void __init mpc832x_sys_init_IRQ(void) |
| 140 | { | 159 | { |
| 141 | 160 | ||
diff --git a/arch/powerpc/platforms/83xx/mpc834x_itx.c b/arch/powerpc/platforms/83xx/mpc834x_itx.c index 5446bab08eca..e2bcaaf6b329 100644 --- a/arch/powerpc/platforms/83xx/mpc834x_itx.c +++ b/arch/powerpc/platforms/83xx/mpc834x_itx.c | |||
| @@ -108,10 +108,6 @@ static int __init mpc834x_itx_probe(void) | |||
| 108 | return 1; | 108 | return 1; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | #ifdef CONFIG_RTC_CLASS | ||
| 112 | late_initcall(rtc_class_hookup); | ||
| 113 | #endif | ||
| 114 | |||
| 115 | define_machine(mpc834x_itx) { | 111 | define_machine(mpc834x_itx) { |
| 116 | .name = "MPC834x ITX", | 112 | .name = "MPC834x ITX", |
| 117 | .probe = mpc834x_itx_probe, | 113 | .probe = mpc834x_itx_probe, |
diff --git a/arch/um/include/os.h b/arch/um/include/os.h index 6516f6dca96d..13a86bd383d3 100644 --- a/arch/um/include/os.h +++ b/arch/um/include/os.h | |||
| @@ -233,6 +233,8 @@ extern unsigned long __do_user_copy(void *to, const void *from, int n, | |||
| 233 | void (*op)(void *to, const void *from, | 233 | void (*op)(void *to, const void *from, |
| 234 | int n), int *faulted_out); | 234 | int n), int *faulted_out); |
| 235 | 235 | ||
| 236 | /* execvp.c */ | ||
| 237 | extern int execvp_noalloc(char *buf, const char *file, char *const argv[]); | ||
| 236 | /* helper.c */ | 238 | /* helper.c */ |
| 237 | extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, | 239 | extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, |
| 238 | unsigned long *stack_out); | 240 | unsigned long *stack_out); |
diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile index b4183929b32c..2f8c79464015 100644 --- a/arch/um/os-Linux/Makefile +++ b/arch/um/os-Linux/Makefile | |||
| @@ -3,8 +3,8 @@ | |||
| 3 | # Licensed under the GPL | 3 | # Licensed under the GPL |
| 4 | # | 4 | # |
| 5 | 5 | ||
| 6 | obj-y = aio.o elf_aux.o file.o helper.o irq.o main.o mem.o process.o sigio.o \ | 6 | obj-y = aio.o elf_aux.o execvp.o file.o helper.o irq.o main.o mem.o process.o \ |
| 7 | signal.o start_up.o time.o trap.o tty.o uaccess.o umid.o tls.o \ | 7 | sigio.o signal.o start_up.o time.o trap.o tty.o uaccess.o umid.o tls.o \ |
| 8 | user_syms.o util.o drivers/ sys-$(SUBARCH)/ | 8 | user_syms.o util.o drivers/ sys-$(SUBARCH)/ |
| 9 | 9 | ||
| 10 | obj-$(CONFIG_MODE_SKAS) += skas/ | 10 | obj-$(CONFIG_MODE_SKAS) += skas/ |
| @@ -15,9 +15,9 @@ user-objs-$(CONFIG_MODE_TT) += tt.o | |||
| 15 | obj-$(CONFIG_TTY_LOG) += tty_log.o | 15 | obj-$(CONFIG_TTY_LOG) += tty_log.o |
| 16 | user-objs-$(CONFIG_TTY_LOG) += tty_log.o | 16 | user-objs-$(CONFIG_TTY_LOG) += tty_log.o |
| 17 | 17 | ||
| 18 | USER_OBJS := $(user-objs-y) aio.o elf_aux.o file.o helper.o irq.o main.o mem.o \ | 18 | USER_OBJS := $(user-objs-y) aio.o elf_aux.o execvp.o file.o helper.o irq.o \ |
| 19 | process.o sigio.o signal.o start_up.o time.o trap.o tty.o tls.o \ | 19 | main.o mem.o process.o sigio.o signal.o start_up.o time.o trap.o tty.o \ |
| 20 | uaccess.o umid.o util.o | 20 | tls.o uaccess.o umid.o util.o |
| 21 | 21 | ||
| 22 | CFLAGS_user_syms.o += -DSUBARCH_$(SUBARCH) | 22 | CFLAGS_user_syms.o += -DSUBARCH_$(SUBARCH) |
| 23 | 23 | ||
diff --git a/arch/um/os-Linux/execvp.c b/arch/um/os-Linux/execvp.c new file mode 100644 index 000000000000..66e583a4031b --- /dev/null +++ b/arch/um/os-Linux/execvp.c | |||
| @@ -0,0 +1,149 @@ | |||
| 1 | /* Copyright (C) 2006 by Paolo Giarrusso - modified from glibc' execvp.c. | ||
| 2 | Original copyright notice follows: | ||
| 3 | |||
| 4 | Copyright (C) 1991,92,1995-99,2002,2004 Free Software Foundation, Inc. | ||
| 5 | This file is part of the GNU C Library. | ||
| 6 | |||
| 7 | The GNU C Library is free software; you can redistribute it and/or | ||
| 8 | modify it under the terms of the GNU Lesser General Public | ||
| 9 | License as published by the Free Software Foundation; either | ||
| 10 | version 2.1 of the License, or (at your option) any later version. | ||
| 11 | |||
| 12 | The GNU C Library is distributed in the hope that it will be useful, | ||
| 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | Lesser General Public License for more details. | ||
| 16 | |||
| 17 | You should have received a copy of the GNU Lesser General Public | ||
| 18 | License along with the GNU C Library; if not, write to the Free | ||
| 19 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
| 20 | 02111-1307 USA. */ | ||
| 21 | #include <unistd.h> | ||
| 22 | |||
| 23 | #include <stdbool.h> | ||
| 24 | #include <stdlib.h> | ||
| 25 | #include <string.h> | ||
| 26 | #include <errno.h> | ||
| 27 | #include <limits.h> | ||
| 28 | |||
| 29 | #ifndef TEST | ||
| 30 | #include "um_malloc.h" | ||
| 31 | #else | ||
| 32 | #include <stdio.h> | ||
| 33 | #define um_kmalloc malloc | ||
| 34 | #endif | ||
| 35 | #include "os.h" | ||
| 36 | |||
| 37 | /* Execute FILE, searching in the `PATH' environment variable if it contains | ||
| 38 | no slashes, with arguments ARGV and environment from `environ'. */ | ||
| 39 | int execvp_noalloc(char *buf, const char *file, char *const argv[]) | ||
| 40 | { | ||
| 41 | if (*file == '\0') { | ||
| 42 | return -ENOENT; | ||
| 43 | } | ||
| 44 | |||
| 45 | if (strchr (file, '/') != NULL) { | ||
| 46 | /* Don't search when it contains a slash. */ | ||
| 47 | execv(file, argv); | ||
| 48 | } else { | ||
| 49 | int got_eacces; | ||
| 50 | size_t len, pathlen; | ||
| 51 | char *name, *p; | ||
| 52 | char *path = getenv("PATH"); | ||
| 53 | if (path == NULL) | ||
| 54 | path = ":/bin:/usr/bin"; | ||
| 55 | |||
| 56 | len = strlen(file) + 1; | ||
| 57 | pathlen = strlen(path); | ||
| 58 | /* Copy the file name at the top. */ | ||
| 59 | name = memcpy(buf + pathlen + 1, file, len); | ||
| 60 | /* And add the slash. */ | ||
| 61 | *--name = '/'; | ||
| 62 | |||
| 63 | got_eacces = 0; | ||
| 64 | p = path; | ||
| 65 | do { | ||
| 66 | char *startp; | ||
| 67 | |||
| 68 | path = p; | ||
| 69 | //Let's avoid this GNU extension. | ||
| 70 | //p = strchrnul (path, ':'); | ||
| 71 | p = strchr(path, ':'); | ||
| 72 | if (!p) | ||
| 73 | p = strchr(path, '\0'); | ||
| 74 | |||
| 75 | if (p == path) | ||
| 76 | /* Two adjacent colons, or a colon at the beginning or the end | ||
| 77 | of `PATH' means to search the current directory. */ | ||
| 78 | startp = name + 1; | ||
| 79 | else | ||
| 80 | startp = memcpy(name - (p - path), path, p - path); | ||
| 81 | |||
| 82 | /* Try to execute this name. If it works, execv will not return. */ | ||
| 83 | execv(startp, argv); | ||
| 84 | |||
| 85 | /* | ||
| 86 | if (errno == ENOEXEC) { | ||
| 87 | } | ||
| 88 | */ | ||
| 89 | |||
| 90 | switch (errno) { | ||
| 91 | case EACCES: | ||
| 92 | /* Record the we got a `Permission denied' error. If we end | ||
| 93 | up finding no executable we can use, we want to diagnose | ||
| 94 | that we did find one but were denied access. */ | ||
| 95 | got_eacces = 1; | ||
| 96 | case ENOENT: | ||
| 97 | case ESTALE: | ||
| 98 | case ENOTDIR: | ||
| 99 | /* Those errors indicate the file is missing or not executable | ||
| 100 | by us, in which case we want to just try the next path | ||
| 101 | directory. */ | ||
| 102 | case ENODEV: | ||
| 103 | case ETIMEDOUT: | ||
| 104 | /* Some strange filesystems like AFS return even | ||
| 105 | stranger error numbers. They cannot reasonably mean | ||
| 106 | anything else so ignore those, too. */ | ||
| 107 | case ENOEXEC: | ||
| 108 | /* We won't go searching for the shell | ||
| 109 | * if it is not executable - the Linux | ||
| 110 | * kernel already handles this enough, | ||
| 111 | * for us. */ | ||
| 112 | break; | ||
| 113 | |||
| 114 | default: | ||
| 115 | /* Some other error means we found an executable file, but | ||
| 116 | something went wrong executing it; return the error to our | ||
| 117 | caller. */ | ||
| 118 | return -errno; | ||
| 119 | } | ||
| 120 | } while (*p++ != '\0'); | ||
| 121 | |||
| 122 | /* We tried every element and none of them worked. */ | ||
| 123 | if (got_eacces) | ||
| 124 | /* At least one failure was due to permissions, so report that | ||
| 125 | error. */ | ||
| 126 | return -EACCES; | ||
| 127 | } | ||
| 128 | |||
| 129 | /* Return the error from the last attempt (probably ENOENT). */ | ||
| 130 | return -errno; | ||
| 131 | } | ||
| 132 | #ifdef TEST | ||
| 133 | int main(int argc, char**argv) | ||
| 134 | { | ||
| 135 | char buf[PATH_MAX]; | ||
| 136 | int ret; | ||
| 137 | argc--; | ||
| 138 | if (!argc) { | ||
| 139 | fprintf(stderr, "Not enough arguments\n"); | ||
| 140 | return 1; | ||
| 141 | } | ||
| 142 | argv++; | ||
| 143 | if (ret = execvp_noalloc(buf, argv[0], argv)) { | ||
| 144 | errno = -ret; | ||
| 145 | perror("execvp_noalloc"); | ||
| 146 | } | ||
| 147 | return 0; | ||
| 148 | } | ||
| 149 | #endif | ||
diff --git a/arch/um/os-Linux/helper.c b/arch/um/os-Linux/helper.c index d13299cfa318..c7ad6306e22f 100644 --- a/arch/um/os-Linux/helper.c +++ b/arch/um/os-Linux/helper.c | |||
| @@ -8,18 +8,21 @@ | |||
| 8 | #include <unistd.h> | 8 | #include <unistd.h> |
| 9 | #include <errno.h> | 9 | #include <errno.h> |
| 10 | #include <sched.h> | 10 | #include <sched.h> |
| 11 | #include <limits.h> | ||
| 11 | #include <sys/signal.h> | 12 | #include <sys/signal.h> |
| 12 | #include <sys/wait.h> | 13 | #include <sys/wait.h> |
| 13 | #include "user.h" | 14 | #include "user.h" |
| 14 | #include "kern_util.h" | 15 | #include "kern_util.h" |
| 15 | #include "user_util.h" | 16 | #include "user_util.h" |
| 16 | #include "os.h" | 17 | #include "os.h" |
| 18 | #include "um_malloc.h" | ||
| 17 | 19 | ||
| 18 | struct helper_data { | 20 | struct helper_data { |
| 19 | void (*pre_exec)(void*); | 21 | void (*pre_exec)(void*); |
| 20 | void *pre_data; | 22 | void *pre_data; |
| 21 | char **argv; | 23 | char **argv; |
| 22 | int fd; | 24 | int fd; |
| 25 | char *buf; | ||
| 23 | }; | 26 | }; |
| 24 | 27 | ||
| 25 | /* Debugging aid, changed only from gdb */ | 28 | /* Debugging aid, changed only from gdb */ |
| @@ -41,9 +44,8 @@ static int helper_child(void *arg) | |||
| 41 | } | 44 | } |
| 42 | if (data->pre_exec != NULL) | 45 | if (data->pre_exec != NULL) |
| 43 | (*data->pre_exec)(data->pre_data); | 46 | (*data->pre_exec)(data->pre_data); |
| 44 | execvp(argv[0], argv); | 47 | errval = execvp_noalloc(data->buf, argv[0], argv); |
| 45 | errval = -errno; | 48 | printk("helper_child - execvp of '%s' failed - errno = %d\n", argv[0], -errval); |
| 46 | printk("helper_child - execve of '%s' failed - errno = %d\n", argv[0], errno); | ||
| 47 | os_write_file(data->fd, &errval, sizeof(errval)); | 49 | os_write_file(data->fd, &errval, sizeof(errval)); |
| 48 | kill(os_getpid(), SIGKILL); | 50 | kill(os_getpid(), SIGKILL); |
| 49 | return 0; | 51 | return 0; |
| @@ -84,11 +86,13 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, | |||
| 84 | data.pre_data = pre_data; | 86 | data.pre_data = pre_data; |
| 85 | data.argv = argv; | 87 | data.argv = argv; |
| 86 | data.fd = fds[1]; | 88 | data.fd = fds[1]; |
| 89 | data.buf = __cant_sleep() ? um_kmalloc_atomic(PATH_MAX) : | ||
| 90 | um_kmalloc(PATH_MAX); | ||
| 87 | pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data); | 91 | pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data); |
| 88 | if (pid < 0) { | 92 | if (pid < 0) { |
| 89 | ret = -errno; | 93 | ret = -errno; |
| 90 | printk("run_helper : clone failed, errno = %d\n", errno); | 94 | printk("run_helper : clone failed, errno = %d\n", errno); |
| 91 | goto out_close; | 95 | goto out_free2; |
| 92 | } | 96 | } |
| 93 | 97 | ||
| 94 | close(fds[1]); | 98 | close(fds[1]); |
| @@ -109,6 +113,8 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, | |||
| 109 | CATCH_EINTR(waitpid(pid, NULL, 0)); | 113 | CATCH_EINTR(waitpid(pid, NULL, 0)); |
| 110 | } | 114 | } |
| 111 | 115 | ||
| 116 | out_free2: | ||
| 117 | kfree(data.buf); | ||
| 112 | out_close: | 118 | out_close: |
| 113 | if (fds[1] != -1) | 119 | if (fds[1] != -1) |
| 114 | close(fds[1]); | 120 | close(fds[1]); |
diff --git a/arch/x86_64/Makefile b/arch/x86_64/Makefile index 13972148058d..6e38d4daeed7 100644 --- a/arch/x86_64/Makefile +++ b/arch/x86_64/Makefile | |||
| @@ -66,8 +66,8 @@ AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) | |||
| 66 | cflags-y += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) | 66 | cflags-y += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) |
| 67 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) | 67 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) |
| 68 | 68 | ||
| 69 | cflags-$(CONFIG_CC_STACKPROTECTOR) += $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-x86_64-has-stack-protector.sh $(CC) -fstack-protector ) | 69 | cflags-$(CONFIG_CC_STACKPROTECTOR) += $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-x86_64-has-stack-protector.sh "$(CC)" -fstack-protector ) |
| 70 | cflags-$(CONFIG_CC_STACKPROTECTOR_ALL) += $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-x86_64-has-stack-protector.sh $(CC) -fstack-protector-all ) | 70 | cflags-$(CONFIG_CC_STACKPROTECTOR_ALL) += $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-x86_64-has-stack-protector.sh "$(CC)" -fstack-protector-all ) |
| 71 | 71 | ||
| 72 | CFLAGS += $(cflags-y) | 72 | CFLAGS += $(cflags-y) |
| 73 | CFLAGS_KERNEL += $(cflags-kernel-y) | 73 | CFLAGS_KERNEL += $(cflags-kernel-y) |
diff --git a/arch/x86_64/boot/setup.S b/arch/x86_64/boot/setup.S index c3bfd223ab49..770940cc0108 100644 --- a/arch/x86_64/boot/setup.S +++ b/arch/x86_64/boot/setup.S | |||
| @@ -836,13 +836,12 @@ gdt: | |||
| 836 | .word 0x9200 # data read/write | 836 | .word 0x9200 # data read/write |
| 837 | .word 0x00CF # granularity = 4096, 386 | 837 | .word 0x00CF # granularity = 4096, 386 |
| 838 | # (+5th nibble of limit) | 838 | # (+5th nibble of limit) |
| 839 | gdt_end: | ||
| 839 | idt_48: | 840 | idt_48: |
| 840 | .word 0 # idt limit = 0 | 841 | .word 0 # idt limit = 0 |
| 841 | .word 0, 0 # idt base = 0L | 842 | .word 0, 0 # idt base = 0L |
| 842 | gdt_48: | 843 | gdt_48: |
| 843 | .word 0x8000 # gdt limit=2048, | 844 | .word gdt_end-gdt-1 # gdt limit |
| 844 | # 256 GDT entries | ||
| 845 | |||
| 846 | .word 0, 0 # gdt base (filled in later) | 845 | .word 0, 0 # gdt base (filled in later) |
| 847 | 846 | ||
| 848 | # Include video setup & detection code | 847 | # Include video setup & detection code |
diff --git a/arch/x86_64/ia32/ptrace32.c b/arch/x86_64/ia32/ptrace32.c index 3a7561d4703e..04566fe5de49 100644 --- a/arch/x86_64/ia32/ptrace32.c +++ b/arch/x86_64/ia32/ptrace32.c | |||
| @@ -244,6 +244,8 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) | |||
| 244 | case PTRACE_DETACH: | 244 | case PTRACE_DETACH: |
| 245 | case PTRACE_SYSCALL: | 245 | case PTRACE_SYSCALL: |
| 246 | case PTRACE_SETOPTIONS: | 246 | case PTRACE_SETOPTIONS: |
| 247 | case PTRACE_SET_THREAD_AREA: | ||
| 248 | case PTRACE_GET_THREAD_AREA: | ||
| 247 | return sys_ptrace(request, pid, addr, data); | 249 | return sys_ptrace(request, pid, addr, data); |
| 248 | 250 | ||
| 249 | default: | 251 | default: |
diff --git a/arch/x86_64/kernel/e820.c b/arch/x86_64/kernel/e820.c index a75c829c2b02..6fe191c58084 100644 --- a/arch/x86_64/kernel/e820.c +++ b/arch/x86_64/kernel/e820.c | |||
| @@ -278,7 +278,7 @@ e820_register_active_regions(int nid, unsigned long start_pfn, | |||
| 278 | >> PAGE_SHIFT; | 278 | >> PAGE_SHIFT; |
| 279 | 279 | ||
| 280 | /* Skip map entries smaller than a page */ | 280 | /* Skip map entries smaller than a page */ |
| 281 | if (ei_startpfn > ei_endpfn) | 281 | if (ei_startpfn >= ei_endpfn) |
| 282 | continue; | 282 | continue; |
| 283 | 283 | ||
| 284 | /* Check if end_pfn_map should be updated */ | 284 | /* Check if end_pfn_map should be updated */ |
| @@ -594,7 +594,9 @@ static int __init parse_memmap_opt(char *p) | |||
| 594 | * size before original memory map is | 594 | * size before original memory map is |
| 595 | * reset. | 595 | * reset. |
| 596 | */ | 596 | */ |
| 597 | e820_register_active_regions(0, 0, -1UL); | ||
| 597 | saved_max_pfn = e820_end_of_ram(); | 598 | saved_max_pfn = e820_end_of_ram(); |
| 599 | remove_all_active_ranges(); | ||
| 598 | #endif | 600 | #endif |
| 599 | end_pfn_map = 0; | 601 | end_pfn_map = 0; |
| 600 | e820.nr_map = 0; | 602 | e820.nr_map = 0; |
diff --git a/arch/x86_64/kernel/early-quirks.c b/arch/x86_64/kernel/early-quirks.c index 2b1245d86258..68273bff58cc 100644 --- a/arch/x86_64/kernel/early-quirks.c +++ b/arch/x86_64/kernel/early-quirks.c | |||
| @@ -45,7 +45,13 @@ static void nvidia_bugs(void) | |||
| 45 | /* | 45 | /* |
| 46 | * All timer overrides on Nvidia are | 46 | * All timer overrides on Nvidia are |
| 47 | * wrong unless HPET is enabled. | 47 | * wrong unless HPET is enabled. |
| 48 | * Unfortunately that's not true on many Asus boards. | ||
| 49 | * We don't know yet how to detect this automatically, but | ||
| 50 | * at least allow a command line override. | ||
| 48 | */ | 51 | */ |
| 52 | if (acpi_use_timer_override) | ||
| 53 | return; | ||
| 54 | |||
| 49 | nvidia_hpet_detected = 0; | 55 | nvidia_hpet_detected = 0; |
| 50 | acpi_table_parse(ACPI_HPET, nvidia_hpet_check); | 56 | acpi_table_parse(ACPI_HPET, nvidia_hpet_check); |
| 51 | if (nvidia_hpet_detected == 0) { | 57 | if (nvidia_hpet_detected == 0) { |
| @@ -53,6 +59,8 @@ static void nvidia_bugs(void) | |||
| 53 | printk(KERN_INFO "Nvidia board " | 59 | printk(KERN_INFO "Nvidia board " |
| 54 | "detected. Ignoring ACPI " | 60 | "detected. Ignoring ACPI " |
| 55 | "timer override.\n"); | 61 | "timer override.\n"); |
| 62 | printk(KERN_INFO "If you got timer trouble " | ||
| 63 | "try acpi_use_timer_override\n"); | ||
| 56 | } | 64 | } |
| 57 | #endif | 65 | #endif |
| 58 | /* RED-PEN skip them on mptables too? */ | 66 | /* RED-PEN skip them on mptables too? */ |
diff --git a/arch/x86_64/kernel/early_printk.c b/arch/x86_64/kernel/early_printk.c index e22ecd54870d..47b6d90349da 100644 --- a/arch/x86_64/kernel/early_printk.c +++ b/arch/x86_64/kernel/early_printk.c | |||
| @@ -224,7 +224,7 @@ static int __init setup_early_printk(char *buf) | |||
| 224 | return 0; | 224 | return 0; |
| 225 | early_console_initialized = 1; | 225 | early_console_initialized = 1; |
| 226 | 226 | ||
| 227 | if (!strcmp(buf,"keep")) | 227 | if (strstr(buf, "keep")) |
| 228 | keep_early = 1; | 228 | keep_early = 1; |
| 229 | 229 | ||
| 230 | if (!strncmp(buf, "serial", 6)) { | 230 | if (!strncmp(buf, "serial", 6)) { |
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index 41bfc49301ad..c80081a6ba41 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
| @@ -754,10 +754,8 @@ void __setup_vector_irq(int cpu) | |||
| 754 | { | 754 | { |
| 755 | /* Initialize vector_irq on a new cpu */ | 755 | /* Initialize vector_irq on a new cpu */ |
| 756 | /* This function must be called with vector_lock held */ | 756 | /* This function must be called with vector_lock held */ |
| 757 | unsigned long flags; | ||
| 758 | int irq, vector; | 757 | int irq, vector; |
| 759 | 758 | ||
| 760 | |||
| 761 | /* Mark the inuse vectors */ | 759 | /* Mark the inuse vectors */ |
| 762 | for (irq = 0; irq < NR_IRQ_VECTORS; ++irq) { | 760 | for (irq = 0; irq < NR_IRQ_VECTORS; ++irq) { |
| 763 | if (!cpu_isset(cpu, irq_domain[irq])) | 761 | if (!cpu_isset(cpu, irq_domain[irq])) |
| @@ -790,9 +788,11 @@ static void ioapic_register_intr(int irq, int vector, unsigned long trigger) | |||
| 790 | trigger == IOAPIC_LEVEL) | 788 | trigger == IOAPIC_LEVEL) |
| 791 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 789 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
| 792 | handle_fasteoi_irq, "fasteoi"); | 790 | handle_fasteoi_irq, "fasteoi"); |
| 793 | else | 791 | else { |
| 792 | irq_desc[irq].status |= IRQ_DELAYED_DISABLE; | ||
| 794 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 793 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
| 795 | handle_edge_irq, "edge"); | 794 | handle_edge_irq, "edge"); |
| 795 | } | ||
| 796 | } | 796 | } |
| 797 | 797 | ||
| 798 | static void __init setup_IO_APIC_irqs(void) | 798 | static void __init setup_IO_APIC_irqs(void) |
diff --git a/arch/x86_64/kernel/process.c b/arch/x86_64/kernel/process.c index 49f7fac6229e..7451a4c43c16 100644 --- a/arch/x86_64/kernel/process.c +++ b/arch/x86_64/kernel/process.c | |||
| @@ -88,9 +88,8 @@ void enter_idle(void) | |||
| 88 | 88 | ||
| 89 | static void __exit_idle(void) | 89 | static void __exit_idle(void) |
| 90 | { | 90 | { |
| 91 | if (read_pda(isidle) == 0) | 91 | if (test_and_clear_bit_pda(0, isidle) == 0) |
| 92 | return; | 92 | return; |
| 93 | write_pda(isidle, 0); | ||
| 94 | atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL); | 93 | atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL); |
| 95 | } | 94 | } |
| 96 | 95 | ||
| @@ -145,7 +144,7 @@ static void poll_idle (void) | |||
| 145 | void cpu_idle_wait(void) | 144 | void cpu_idle_wait(void) |
| 146 | { | 145 | { |
| 147 | unsigned int cpu, this_cpu = get_cpu(); | 146 | unsigned int cpu, this_cpu = get_cpu(); |
| 148 | cpumask_t map; | 147 | cpumask_t map, tmp = current->cpus_allowed; |
| 149 | 148 | ||
| 150 | set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); | 149 | set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); |
| 151 | put_cpu(); | 150 | put_cpu(); |
| @@ -168,6 +167,8 @@ void cpu_idle_wait(void) | |||
| 168 | } | 167 | } |
| 169 | cpus_and(map, map, cpu_online_map); | 168 | cpus_and(map, map, cpu_online_map); |
| 170 | } while (!cpus_empty(map)); | 169 | } while (!cpus_empty(map)); |
| 170 | |||
| 171 | set_cpus_allowed(current, tmp); | ||
| 171 | } | 172 | } |
| 172 | EXPORT_SYMBOL_GPL(cpu_idle_wait); | 173 | EXPORT_SYMBOL_GPL(cpu_idle_wait); |
| 173 | 174 | ||
diff --git a/arch/x86_64/kernel/smp.c b/arch/x86_64/kernel/smp.c index 4f67697f5036..9f74c883568c 100644 --- a/arch/x86_64/kernel/smp.c +++ b/arch/x86_64/kernel/smp.c | |||
| @@ -376,9 +376,8 @@ int smp_call_function_single (int cpu, void (*func) (void *info), void *info, | |||
| 376 | /* prevent preemption and reschedule on another processor */ | 376 | /* prevent preemption and reschedule on another processor */ |
| 377 | int me = get_cpu(); | 377 | int me = get_cpu(); |
| 378 | if (cpu == me) { | 378 | if (cpu == me) { |
| 379 | WARN_ON(1); | ||
| 380 | put_cpu(); | 379 | put_cpu(); |
| 381 | return -EBUSY; | 380 | return 0; |
| 382 | } | 381 | } |
| 383 | spin_lock_bh(&call_lock); | 382 | spin_lock_bh(&call_lock); |
| 384 | __smp_call_function_single(cpu, func, info, nonatomic, wait); | 383 | __smp_call_function_single(cpu, func, info, nonatomic, wait); |
diff --git a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c index 88722f11ca13..e3ef544d2cfb 100644 --- a/arch/x86_64/kernel/time.c +++ b/arch/x86_64/kernel/time.c | |||
| @@ -876,15 +876,6 @@ static struct irqaction irq0 = { | |||
| 876 | timer_interrupt, IRQF_DISABLED, CPU_MASK_NONE, "timer", NULL, NULL | 876 | timer_interrupt, IRQF_DISABLED, CPU_MASK_NONE, "timer", NULL, NULL |
| 877 | }; | 877 | }; |
| 878 | 878 | ||
| 879 | static int __cpuinit | ||
| 880 | time_cpu_notifier(struct notifier_block *nb, unsigned long action, void *hcpu) | ||
| 881 | { | ||
| 882 | unsigned cpu = (unsigned long) hcpu; | ||
| 883 | if (action == CPU_ONLINE) | ||
| 884 | vsyscall_set_cpu(cpu); | ||
| 885 | return NOTIFY_DONE; | ||
| 886 | } | ||
| 887 | |||
| 888 | void __init time_init(void) | 879 | void __init time_init(void) |
| 889 | { | 880 | { |
| 890 | if (nohpet) | 881 | if (nohpet) |
| @@ -925,8 +916,6 @@ void __init time_init(void) | |||
| 925 | vxtime.last_tsc = get_cycles_sync(); | 916 | vxtime.last_tsc = get_cycles_sync(); |
| 926 | set_cyc2ns_scale(cpu_khz); | 917 | set_cyc2ns_scale(cpu_khz); |
| 927 | setup_irq(0, &irq0); | 918 | setup_irq(0, &irq0); |
| 928 | hotcpu_notifier(time_cpu_notifier, 0); | ||
| 929 | time_cpu_notifier(NULL, CPU_ONLINE, (void *)(long)smp_processor_id()); | ||
| 930 | 919 | ||
| 931 | #ifndef CONFIG_SMP | 920 | #ifndef CONFIG_SMP |
| 932 | time_init_gtod(); | 921 | time_init_gtod(); |
diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c index 7819022a8db5..0d65b22f229c 100644 --- a/arch/x86_64/kernel/traps.c +++ b/arch/x86_64/kernel/traps.c | |||
| @@ -242,12 +242,19 @@ static int dump_trace_unwind(struct unwind_frame_info *info, void *context) | |||
| 242 | * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack | 242 | * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack |
| 243 | */ | 243 | */ |
| 244 | 244 | ||
| 245 | static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) | ||
| 246 | { | ||
| 247 | void *t = (void *)tinfo; | ||
| 248 | return p > t && p < t + THREAD_SIZE - 3; | ||
| 249 | } | ||
| 250 | |||
| 245 | void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * stack, | 251 | void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * stack, |
| 246 | struct stacktrace_ops *ops, void *data) | 252 | struct stacktrace_ops *ops, void *data) |
| 247 | { | 253 | { |
| 248 | const unsigned cpu = smp_processor_id(); | 254 | const unsigned cpu = smp_processor_id(); |
| 249 | unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; | 255 | unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; |
| 250 | unsigned used = 0; | 256 | unsigned used = 0; |
| 257 | struct thread_info *tinfo; | ||
| 251 | 258 | ||
| 252 | if (!tsk) | 259 | if (!tsk) |
| 253 | tsk = current; | 260 | tsk = current; |
| @@ -290,6 +297,12 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s | |||
| 290 | if (tsk && tsk != current) | 297 | if (tsk && tsk != current) |
| 291 | stack = (unsigned long *)tsk->thread.rsp; | 298 | stack = (unsigned long *)tsk->thread.rsp; |
| 292 | } | 299 | } |
| 300 | /* | ||
| 301 | * Align the stack pointer on word boundary, later loops | ||
| 302 | * rely on that (and corruption / debug info bugs can cause | ||
| 303 | * unaligned values here): | ||
| 304 | */ | ||
| 305 | stack = (unsigned long *)((unsigned long)stack & ~(sizeof(long)-1)); | ||
| 293 | 306 | ||
| 294 | /* | 307 | /* |
| 295 | * Print function call entries within a stack. 'cond' is the | 308 | * Print function call entries within a stack. 'cond' is the |
| @@ -364,7 +377,8 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s | |||
| 364 | /* | 377 | /* |
| 365 | * This handles the process stack: | 378 | * This handles the process stack: |
| 366 | */ | 379 | */ |
| 367 | HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0); | 380 | tinfo = current_thread_info(); |
| 381 | HANDLE_STACK (valid_stack_ptr(tinfo, stack)); | ||
| 368 | #undef HANDLE_STACK | 382 | #undef HANDLE_STACK |
| 369 | } | 383 | } |
| 370 | EXPORT_SYMBOL(dump_trace); | 384 | EXPORT_SYMBOL(dump_trace); |
diff --git a/arch/x86_64/kernel/vmlinux.lds.S b/arch/x86_64/kernel/vmlinux.lds.S index edb24aa714b4..d9534e750d4f 100644 --- a/arch/x86_64/kernel/vmlinux.lds.S +++ b/arch/x86_64/kernel/vmlinux.lds.S | |||
| @@ -60,6 +60,7 @@ SECTIONS | |||
| 60 | } | 60 | } |
| 61 | #endif | 61 | #endif |
| 62 | 62 | ||
| 63 | . = ALIGN(PAGE_SIZE); /* Align data segment to page size boundary */ | ||
| 63 | /* Data */ | 64 | /* Data */ |
| 64 | .data : AT(ADDR(.data) - LOAD_OFFSET) { | 65 | .data : AT(ADDR(.data) - LOAD_OFFSET) { |
| 65 | *(.data) | 66 | *(.data) |
diff --git a/arch/x86_64/kernel/vsyscall.c b/arch/x86_64/kernel/vsyscall.c index a98b460af6a1..92546c1526f1 100644 --- a/arch/x86_64/kernel/vsyscall.c +++ b/arch/x86_64/kernel/vsyscall.c | |||
| @@ -27,6 +27,9 @@ | |||
| 27 | #include <linux/jiffies.h> | 27 | #include <linux/jiffies.h> |
| 28 | #include <linux/sysctl.h> | 28 | #include <linux/sysctl.h> |
| 29 | #include <linux/getcpu.h> | 29 | #include <linux/getcpu.h> |
| 30 | #include <linux/cpu.h> | ||
| 31 | #include <linux/smp.h> | ||
| 32 | #include <linux/notifier.h> | ||
| 30 | 33 | ||
| 31 | #include <asm/vsyscall.h> | 34 | #include <asm/vsyscall.h> |
| 32 | #include <asm/pgtable.h> | 35 | #include <asm/pgtable.h> |
| @@ -243,32 +246,17 @@ static ctl_table kernel_root_table2[] = { | |||
| 243 | 246 | ||
| 244 | #endif | 247 | #endif |
| 245 | 248 | ||
| 246 | static void __cpuinit write_rdtscp_cb(void *info) | 249 | /* Assume __initcall executes before all user space. Hopefully kmod |
| 247 | { | 250 | doesn't violate that. We'll find out if it does. */ |
| 248 | write_rdtscp_aux((unsigned long)info); | 251 | static void __cpuinit vsyscall_set_cpu(int cpu) |
| 249 | } | ||
| 250 | |||
| 251 | void __cpuinit vsyscall_set_cpu(int cpu) | ||
| 252 | { | 252 | { |
| 253 | unsigned long *d; | 253 | unsigned long *d; |
| 254 | unsigned long node = 0; | 254 | unsigned long node = 0; |
| 255 | #ifdef CONFIG_NUMA | 255 | #ifdef CONFIG_NUMA |
| 256 | node = cpu_to_node[cpu]; | 256 | node = cpu_to_node[cpu]; |
| 257 | #endif | 257 | #endif |
| 258 | if (cpu_has(&cpu_data[cpu], X86_FEATURE_RDTSCP)) { | 258 | if (cpu_has(&cpu_data[cpu], X86_FEATURE_RDTSCP)) |
| 259 | void *info = (void *)((node << 12) | cpu); | 259 | write_rdtscp_aux((node << 12) | cpu); |
| 260 | /* Can happen on preemptive kernel */ | ||
| 261 | if (get_cpu() == cpu) | ||
| 262 | write_rdtscp_cb(info); | ||
| 263 | #ifdef CONFIG_SMP | ||
| 264 | else { | ||
| 265 | /* the notifier is unfortunately not executed on the | ||
| 266 | target CPU */ | ||
| 267 | smp_call_function_single(cpu,write_rdtscp_cb,info,0,1); | ||
| 268 | } | ||
| 269 | #endif | ||
| 270 | put_cpu(); | ||
| 271 | } | ||
| 272 | 260 | ||
| 273 | /* Store cpu number in limit so that it can be loaded quickly | 261 | /* Store cpu number in limit so that it can be loaded quickly |
| 274 | in user space in vgetcpu. | 262 | in user space in vgetcpu. |
| @@ -280,6 +268,23 @@ void __cpuinit vsyscall_set_cpu(int cpu) | |||
| 280 | *d |= (node >> 4) << 48; | 268 | *d |= (node >> 4) << 48; |
| 281 | } | 269 | } |
| 282 | 270 | ||
| 271 | static void __cpuinit cpu_vsyscall_init(void *arg) | ||
| 272 | { | ||
| 273 | /* preemption should be already off */ | ||
| 274 | vsyscall_set_cpu(raw_smp_processor_id()); | ||
| 275 | } | ||
| 276 | |||
| 277 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 278 | static int __cpuinit | ||
| 279 | cpu_vsyscall_notifier(struct notifier_block *n, unsigned long action, void *arg) | ||
| 280 | { | ||
| 281 | long cpu = (long)arg; | ||
| 282 | if (action == CPU_ONLINE) | ||
| 283 | smp_call_function_single(cpu, cpu_vsyscall_init, NULL, 0, 1); | ||
| 284 | return NOTIFY_DONE; | ||
| 285 | } | ||
| 286 | #endif | ||
| 287 | |||
| 283 | static void __init map_vsyscall(void) | 288 | static void __init map_vsyscall(void) |
| 284 | { | 289 | { |
| 285 | extern char __vsyscall_0; | 290 | extern char __vsyscall_0; |
| @@ -299,6 +304,8 @@ static int __init vsyscall_init(void) | |||
| 299 | #ifdef CONFIG_SYSCTL | 304 | #ifdef CONFIG_SYSCTL |
| 300 | register_sysctl_table(kernel_root_table2, 0); | 305 | register_sysctl_table(kernel_root_table2, 0); |
| 301 | #endif | 306 | #endif |
| 307 | on_each_cpu(cpu_vsyscall_init, NULL, 0, 1); | ||
| 308 | hotcpu_notifier(cpu_vsyscall_notifier, 0); | ||
| 302 | return 0; | 309 | return 0; |
| 303 | } | 310 | } |
| 304 | 311 | ||
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index 971dc1181e69..4c0c00ef3ca7 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
| @@ -496,7 +496,7 @@ int remove_memory(u64 start, u64 size) | |||
| 496 | } | 496 | } |
| 497 | EXPORT_SYMBOL_GPL(remove_memory); | 497 | EXPORT_SYMBOL_GPL(remove_memory); |
| 498 | 498 | ||
| 499 | #ifndef CONFIG_ACPI_NUMA | 499 | #if !defined(CONFIG_ACPI_NUMA) && defined(CONFIG_NUMA) |
| 500 | int memory_add_physaddr_to_nid(u64 start) | 500 | int memory_add_physaddr_to_nid(u64 start) |
| 501 | { | 501 | { |
| 502 | return 0; | 502 | return 0; |
| @@ -504,13 +504,6 @@ int memory_add_physaddr_to_nid(u64 start) | |||
| 504 | EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); | 504 | EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); |
| 505 | #endif | 505 | #endif |
| 506 | 506 | ||
| 507 | #ifndef CONFIG_ACPI_NUMA | ||
| 508 | int memory_add_physaddr_to_nid(u64 start) | ||
| 509 | { | ||
| 510 | return 0; | ||
| 511 | } | ||
| 512 | #endif | ||
| 513 | |||
| 514 | #endif /* CONFIG_MEMORY_HOTPLUG */ | 507 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
| 515 | 508 | ||
| 516 | #ifdef CONFIG_MEMORY_HOTPLUG_RESERVE | 509 | #ifdef CONFIG_MEMORY_HOTPLUG_RESERVE |
| @@ -655,9 +648,22 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
| 655 | 648 | ||
| 656 | void __init reserve_bootmem_generic(unsigned long phys, unsigned len) | 649 | void __init reserve_bootmem_generic(unsigned long phys, unsigned len) |
| 657 | { | 650 | { |
| 658 | /* Should check here against the e820 map to avoid double free */ | ||
| 659 | #ifdef CONFIG_NUMA | 651 | #ifdef CONFIG_NUMA |
| 660 | int nid = phys_to_nid(phys); | 652 | int nid = phys_to_nid(phys); |
| 653 | #endif | ||
| 654 | unsigned long pfn = phys >> PAGE_SHIFT; | ||
| 655 | if (pfn >= end_pfn) { | ||
| 656 | /* This can happen with kdump kernels when accessing firmware | ||
| 657 | tables. */ | ||
| 658 | if (pfn < end_pfn_map) | ||
| 659 | return; | ||
| 660 | printk(KERN_ERR "reserve_bootmem: illegal reserve %lx %u\n", | ||
| 661 | phys, len); | ||
| 662 | return; | ||
| 663 | } | ||
| 664 | |||
| 665 | /* Should check here against the e820 map to avoid double free */ | ||
| 666 | #ifdef CONFIG_NUMA | ||
| 661 | reserve_bootmem_node(NODE_DATA(nid), phys, len); | 667 | reserve_bootmem_node(NODE_DATA(nid), phys, len); |
| 662 | #else | 668 | #else |
| 663 | reserve_bootmem(phys, len); | 669 | reserve_bootmem(phys, len); |
diff --git a/arch/x86_64/pci/mmconfig.c b/arch/x86_64/pci/mmconfig.c index e61093b34c26..f8b6b2800a62 100644 --- a/arch/x86_64/pci/mmconfig.c +++ b/arch/x86_64/pci/mmconfig.c | |||
| @@ -163,37 +163,6 @@ static __init void unreachable_devices(void) | |||
| 163 | } | 163 | } |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | static __init void pci_mmcfg_insert_resources(void) | ||
| 167 | { | ||
| 168 | #define PCI_MMCFG_RESOURCE_NAME_LEN 19 | ||
| 169 | int i; | ||
| 170 | struct resource *res; | ||
| 171 | char *names; | ||
| 172 | unsigned num_buses; | ||
| 173 | |||
| 174 | res = kcalloc(PCI_MMCFG_RESOURCE_NAME_LEN + sizeof(*res), | ||
| 175 | pci_mmcfg_config_num, GFP_KERNEL); | ||
| 176 | |||
| 177 | if (!res) { | ||
| 178 | printk(KERN_ERR "PCI: Unable to allocate MMCONFIG resources\n"); | ||
| 179 | return; | ||
| 180 | } | ||
| 181 | |||
| 182 | names = (void *)&res[pci_mmcfg_config_num]; | ||
| 183 | for (i = 0; i < pci_mmcfg_config_num; i++, res++) { | ||
| 184 | num_buses = pci_mmcfg_config[i].end_bus_number - | ||
| 185 | pci_mmcfg_config[i].start_bus_number + 1; | ||
| 186 | res->name = names; | ||
| 187 | snprintf(names, PCI_MMCFG_RESOURCE_NAME_LEN, "PCI MMCONFIG %u", | ||
| 188 | pci_mmcfg_config[i].pci_segment_group_number); | ||
| 189 | res->start = pci_mmcfg_config[i].base_address; | ||
| 190 | res->end = res->start + (num_buses << 20) - 1; | ||
| 191 | res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; | ||
| 192 | insert_resource(&iomem_resource, res); | ||
| 193 | names += PCI_MMCFG_RESOURCE_NAME_LEN; | ||
| 194 | } | ||
| 195 | } | ||
| 196 | |||
| 197 | void __init pci_mmcfg_init(int type) | 166 | void __init pci_mmcfg_init(int type) |
| 198 | { | 167 | { |
| 199 | int i; | 168 | int i; |
| @@ -237,7 +206,6 @@ void __init pci_mmcfg_init(int type) | |||
| 237 | } | 206 | } |
| 238 | 207 | ||
| 239 | unreachable_devices(); | 208 | unreachable_devices(); |
| 240 | pci_mmcfg_insert_resources(); | ||
| 241 | 209 | ||
| 242 | raw_pci_ops = &pci_mmcfg; | 210 | raw_pci_ops = &pci_mmcfg; |
| 243 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; | 211 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; |
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index a19338e6215d..e55a75621437 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c | |||
| @@ -286,9 +286,8 @@ static int sg_io(struct file *file, request_queue_t *q, | |||
| 286 | * fill in request structure | 286 | * fill in request structure |
| 287 | */ | 287 | */ |
| 288 | rq->cmd_len = hdr->cmd_len; | 288 | rq->cmd_len = hdr->cmd_len; |
| 289 | memset(rq->cmd, 0, BLK_MAX_CDB); /* ATAPI hates garbage after CDB */ | ||
| 289 | memcpy(rq->cmd, cmd, hdr->cmd_len); | 290 | memcpy(rq->cmd, cmd, hdr->cmd_len); |
| 290 | if (sizeof(rq->cmd) != hdr->cmd_len) | ||
| 291 | memset(rq->cmd + hdr->cmd_len, 0, sizeof(rq->cmd) - hdr->cmd_len); | ||
| 292 | 291 | ||
| 293 | memset(sense, 0, sizeof(sense)); | 292 | memset(sense, 0, sizeof(sense)); |
| 294 | rq->sense = sense; | 293 | rq->sense = sense; |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index c84286cbbe25..068fe4f100b0 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -73,7 +73,6 @@ static unsigned int acpi_irq_irq; | |||
| 73 | static acpi_osd_handler acpi_irq_handler; | 73 | static acpi_osd_handler acpi_irq_handler; |
| 74 | static void *acpi_irq_context; | 74 | static void *acpi_irq_context; |
| 75 | static struct workqueue_struct *kacpid_wq; | 75 | static struct workqueue_struct *kacpid_wq; |
| 76 | static struct workqueue_struct *kacpi_notify_wq; | ||
| 77 | 76 | ||
| 78 | acpi_status acpi_os_initialize(void) | 77 | acpi_status acpi_os_initialize(void) |
| 79 | { | 78 | { |
| @@ -92,9 +91,8 @@ acpi_status acpi_os_initialize1(void) | |||
| 92 | return AE_NULL_ENTRY; | 91 | return AE_NULL_ENTRY; |
| 93 | } | 92 | } |
| 94 | kacpid_wq = create_singlethread_workqueue("kacpid"); | 93 | kacpid_wq = create_singlethread_workqueue("kacpid"); |
| 95 | kacpi_notify_wq = create_singlethread_workqueue("kacpi_notify"); | ||
| 96 | BUG_ON(!kacpid_wq); | 94 | BUG_ON(!kacpid_wq); |
| 97 | BUG_ON(!kacpi_notify_wq); | 95 | |
| 98 | return AE_OK; | 96 | return AE_OK; |
| 99 | } | 97 | } |
| 100 | 98 | ||
| @@ -106,7 +104,6 @@ acpi_status acpi_os_terminate(void) | |||
| 106 | } | 104 | } |
| 107 | 105 | ||
| 108 | destroy_workqueue(kacpid_wq); | 106 | destroy_workqueue(kacpid_wq); |
| 109 | destroy_workqueue(kacpi_notify_wq); | ||
| 110 | 107 | ||
| 111 | return AE_OK; | 108 | return AE_OK; |
| 112 | } | 109 | } |
| @@ -569,7 +566,10 @@ void acpi_os_derive_pci_id(acpi_handle rhandle, /* upper bound */ | |||
| 569 | 566 | ||
| 570 | static void acpi_os_execute_deferred(void *context) | 567 | static void acpi_os_execute_deferred(void *context) |
| 571 | { | 568 | { |
| 572 | struct acpi_os_dpc *dpc = (struct acpi_os_dpc *)context; | 569 | struct acpi_os_dpc *dpc = NULL; |
| 570 | |||
| 571 | |||
| 572 | dpc = (struct acpi_os_dpc *)context; | ||
| 573 | if (!dpc) { | 573 | if (!dpc) { |
| 574 | printk(KERN_ERR PREFIX "Invalid (NULL) context\n"); | 574 | printk(KERN_ERR PREFIX "Invalid (NULL) context\n"); |
| 575 | return; | 575 | return; |
| @@ -604,12 +604,14 @@ acpi_status acpi_os_execute(acpi_execute_type type, | |||
| 604 | struct acpi_os_dpc *dpc; | 604 | struct acpi_os_dpc *dpc; |
| 605 | struct work_struct *task; | 605 | struct work_struct *task; |
| 606 | 606 | ||
| 607 | ACPI_FUNCTION_TRACE("os_queue_for_execution"); | ||
| 608 | |||
| 607 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | 609 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
| 608 | "Scheduling function [%p(%p)] for deferred execution.\n", | 610 | "Scheduling function [%p(%p)] for deferred execution.\n", |
| 609 | function, context)); | 611 | function, context)); |
| 610 | 612 | ||
| 611 | if (!function) | 613 | if (!function) |
| 612 | return AE_BAD_PARAMETER; | 614 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
| 613 | 615 | ||
| 614 | /* | 616 | /* |
| 615 | * Allocate/initialize DPC structure. Note that this memory will be | 617 | * Allocate/initialize DPC structure. Note that this memory will be |
| @@ -622,20 +624,26 @@ acpi_status acpi_os_execute(acpi_execute_type type, | |||
| 622 | * from the same memory. | 624 | * from the same memory. |
| 623 | */ | 625 | */ |
| 624 | 626 | ||
| 625 | dpc = kmalloc(sizeof(struct acpi_os_dpc) + | 627 | dpc = |
| 626 | sizeof(struct work_struct), GFP_ATOMIC); | 628 | kmalloc(sizeof(struct acpi_os_dpc) + sizeof(struct work_struct), |
| 629 | GFP_ATOMIC); | ||
| 627 | if (!dpc) | 630 | if (!dpc) |
| 628 | return AE_NO_MEMORY; | 631 | return_ACPI_STATUS(AE_NO_MEMORY); |
| 632 | |||
| 629 | dpc->function = function; | 633 | dpc->function = function; |
| 630 | dpc->context = context; | 634 | dpc->context = context; |
| 635 | |||
| 631 | task = (void *)(dpc + 1); | 636 | task = (void *)(dpc + 1); |
| 632 | INIT_WORK(task, acpi_os_execute_deferred, (void *)dpc); | 637 | INIT_WORK(task, acpi_os_execute_deferred, (void *)dpc); |
| 633 | if (!queue_work((type == OSL_NOTIFY_HANDLER)? | 638 | |
| 634 | kacpi_notify_wq : kacpid_wq, task)) { | 639 | if (!queue_work(kacpid_wq, task)) { |
| 635 | status = AE_ERROR; | 640 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
| 641 | "Call to queue_work() failed.\n")); | ||
| 636 | kfree(dpc); | 642 | kfree(dpc); |
| 643 | status = AE_ERROR; | ||
| 637 | } | 644 | } |
| 638 | return status; | 645 | |
| 646 | return_ACPI_STATUS(status); | ||
| 639 | } | 647 | } |
| 640 | 648 | ||
| 641 | EXPORT_SYMBOL(acpi_os_execute); | 649 | EXPORT_SYMBOL(acpi_os_execute); |
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index 7ba5e49ab302..6fd174a37149 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c | |||
| @@ -83,10 +83,8 @@ static int acpi_processor_ppc_notifier(struct notifier_block *nb, | |||
| 83 | goto out; | 83 | goto out; |
| 84 | 84 | ||
| 85 | ppc = (unsigned int)pr->performance_platform_limit; | 85 | ppc = (unsigned int)pr->performance_platform_limit; |
| 86 | if (!ppc) | ||
| 87 | goto out; | ||
| 88 | 86 | ||
| 89 | if (ppc > pr->performance->state_count) | 87 | if (ppc >= pr->performance->state_count) |
| 90 | goto out; | 88 | goto out; |
| 91 | 89 | ||
| 92 | cpufreq_verify_within_limits(policy, 0, | 90 | cpufreq_verify_within_limits(policy, 0, |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 234197e57e9e..f510e1196dc6 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -314,6 +314,17 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 314 | { PCI_VDEVICE(INTEL, 0x2824), board_ahci }, /* ICH8 */ | 314 | { PCI_VDEVICE(INTEL, 0x2824), board_ahci }, /* ICH8 */ |
| 315 | { PCI_VDEVICE(INTEL, 0x2829), board_ahci }, /* ICH8M */ | 315 | { PCI_VDEVICE(INTEL, 0x2829), board_ahci }, /* ICH8M */ |
| 316 | { PCI_VDEVICE(INTEL, 0x282a), board_ahci }, /* ICH8M */ | 316 | { PCI_VDEVICE(INTEL, 0x282a), board_ahci }, /* ICH8M */ |
| 317 | { PCI_VDEVICE(INTEL, 0x2922), board_ahci }, /* ICH9 */ | ||
| 318 | { PCI_VDEVICE(INTEL, 0x2923), board_ahci }, /* ICH9 */ | ||
| 319 | { PCI_VDEVICE(INTEL, 0x2924), board_ahci }, /* ICH9 */ | ||
| 320 | { PCI_VDEVICE(INTEL, 0x2925), board_ahci }, /* ICH9 */ | ||
| 321 | { PCI_VDEVICE(INTEL, 0x2927), board_ahci }, /* ICH9 */ | ||
| 322 | { PCI_VDEVICE(INTEL, 0x2929), board_ahci }, /* ICH9M */ | ||
| 323 | { PCI_VDEVICE(INTEL, 0x292a), board_ahci }, /* ICH9M */ | ||
| 324 | { PCI_VDEVICE(INTEL, 0x292b), board_ahci }, /* ICH9M */ | ||
| 325 | { PCI_VDEVICE(INTEL, 0x292f), board_ahci }, /* ICH9M */ | ||
| 326 | { PCI_VDEVICE(INTEL, 0x294d), board_ahci }, /* ICH9 */ | ||
| 327 | { PCI_VDEVICE(INTEL, 0x294e), board_ahci }, /* ICH9M */ | ||
| 317 | 328 | ||
| 318 | /* JMicron */ | 329 | /* JMicron */ |
| 319 | { PCI_VDEVICE(JMICRON, 0x2360), board_ahci }, /* JMicron JMB360 */ | 330 | { PCI_VDEVICE(JMICRON, 0x2360), board_ahci }, /* JMicron JMB360 */ |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index a8fd0c3e59b3..915a55a6cc14 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -5957,7 +5957,7 @@ static void __exit ata_exit(void) | |||
| 5957 | destroy_workqueue(ata_aux_wq); | 5957 | destroy_workqueue(ata_aux_wq); |
| 5958 | } | 5958 | } |
| 5959 | 5959 | ||
| 5960 | module_init(ata_init); | 5960 | subsys_initcall(ata_init); |
| 5961 | module_exit(ata_exit); | 5961 | module_exit(ata_exit); |
| 5962 | 5962 | ||
| 5963 | static unsigned long ratelimit_time; | 5963 | static unsigned long ratelimit_time; |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 7af2a4ba4990..47ea111d5ace 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -1451,6 +1451,7 @@ nothing_to_do: | |||
| 1451 | 1451 | ||
| 1452 | static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) | 1452 | static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) |
| 1453 | { | 1453 | { |
| 1454 | struct ata_port *ap = qc->ap; | ||
| 1454 | struct scsi_cmnd *cmd = qc->scsicmd; | 1455 | struct scsi_cmnd *cmd = qc->scsicmd; |
| 1455 | u8 *cdb = cmd->cmnd; | 1456 | u8 *cdb = cmd->cmnd; |
| 1456 | int need_sense = (qc->err_mask != 0); | 1457 | int need_sense = (qc->err_mask != 0); |
| @@ -1459,11 +1460,12 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) | |||
| 1459 | * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE | 1460 | * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE |
| 1460 | * cache | 1461 | * cache |
| 1461 | */ | 1462 | */ |
| 1462 | if (!need_sense && (qc->tf.command == ATA_CMD_SET_FEATURES) && | 1463 | if (ap->ops->error_handler && |
| 1464 | !need_sense && (qc->tf.command == ATA_CMD_SET_FEATURES) && | ||
| 1463 | ((qc->tf.feature == SETFEATURES_WC_ON) || | 1465 | ((qc->tf.feature == SETFEATURES_WC_ON) || |
| 1464 | (qc->tf.feature == SETFEATURES_WC_OFF))) { | 1466 | (qc->tf.feature == SETFEATURES_WC_OFF))) { |
| 1465 | qc->ap->eh_info.action |= ATA_EH_REVALIDATE; | 1467 | ap->eh_info.action |= ATA_EH_REVALIDATE; |
| 1466 | ata_port_schedule_eh(qc->ap); | 1468 | ata_port_schedule_eh(ap); |
| 1467 | } | 1469 | } |
| 1468 | 1470 | ||
| 1469 | /* For ATA pass thru (SAT) commands, generate a sense block if | 1471 | /* For ATA pass thru (SAT) commands, generate a sense block if |
| @@ -1490,8 +1492,8 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) | |||
| 1490 | } | 1492 | } |
| 1491 | } | 1493 | } |
| 1492 | 1494 | ||
| 1493 | if (need_sense && !qc->ap->ops->error_handler) | 1495 | if (need_sense && !ap->ops->error_handler) |
| 1494 | ata_dump_status(qc->ap->id, &qc->result_tf); | 1496 | ata_dump_status(ap->id, &qc->result_tf); |
| 1495 | 1497 | ||
| 1496 | qc->scsidone(cmd); | 1498 | qc->scsidone(cmd); |
| 1497 | 1499 | ||
| @@ -1612,9 +1614,9 @@ early_finish: | |||
| 1612 | 1614 | ||
| 1613 | err_did: | 1615 | err_did: |
| 1614 | ata_qc_free(qc); | 1616 | ata_qc_free(qc); |
| 1615 | err_mem: | ||
| 1616 | cmd->result = (DID_ERROR << 16); | 1617 | cmd->result = (DID_ERROR << 16); |
| 1617 | done(cmd); | 1618 | done(cmd); |
| 1619 | err_mem: | ||
| 1618 | DPRINTK("EXIT - internal\n"); | 1620 | DPRINTK("EXIT - internal\n"); |
| 1619 | return 0; | 1621 | return 0; |
| 1620 | 1622 | ||
| @@ -3345,20 +3347,23 @@ EXPORT_SYMBOL_GPL(ata_sas_slave_configure); | |||
| 3345 | * @ap: ATA port to which the command is being sent | 3347 | * @ap: ATA port to which the command is being sent |
| 3346 | * | 3348 | * |
| 3347 | * RETURNS: | 3349 | * RETURNS: |
| 3348 | * Zero. | 3350 | * Return value from __ata_scsi_queuecmd() if @cmd can be queued, |
| 3351 | * 0 otherwise. | ||
| 3349 | */ | 3352 | */ |
| 3350 | 3353 | ||
| 3351 | int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), | 3354 | int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), |
| 3352 | struct ata_port *ap) | 3355 | struct ata_port *ap) |
| 3353 | { | 3356 | { |
| 3357 | int rc = 0; | ||
| 3358 | |||
| 3354 | ata_scsi_dump_cdb(ap, cmd); | 3359 | ata_scsi_dump_cdb(ap, cmd); |
| 3355 | 3360 | ||
| 3356 | if (likely(ata_scsi_dev_enabled(ap->device))) | 3361 | if (likely(ata_scsi_dev_enabled(ap->device))) |
| 3357 | __ata_scsi_queuecmd(cmd, done, ap->device); | 3362 | rc = __ata_scsi_queuecmd(cmd, done, ap->device); |
| 3358 | else { | 3363 | else { |
| 3359 | cmd->result = (DID_BAD_TARGET << 16); | 3364 | cmd->result = (DID_BAD_TARGET << 16); |
| 3360 | done(cmd); | 3365 | done(cmd); |
| 3361 | } | 3366 | } |
| 3362 | return 0; | 3367 | return rc; |
| 3363 | } | 3368 | } |
| 3364 | EXPORT_SYMBOL_GPL(ata_sas_queuecmd); | 3369 | EXPORT_SYMBOL_GPL(ata_sas_queuecmd); |
diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c index 690828eb5226..96a098020a8f 100644 --- a/drivers/ata/pata_artop.c +++ b/drivers/ata/pata_artop.c | |||
| @@ -92,7 +92,7 @@ static int artop6260_pre_reset(struct ata_port *ap) | |||
| 92 | return -ENOENT; | 92 | return -ENOENT; |
| 93 | 93 | ||
| 94 | pci_read_config_byte(pdev, 0x49, &tmp); | 94 | pci_read_config_byte(pdev, 0x49, &tmp); |
| 95 | if (tmp & (1 >> ap->port_no)) | 95 | if (tmp & (1 << ap->port_no)) |
| 96 | ap->cbl = ATA_CBL_PATA40; | 96 | ap->cbl = ATA_CBL_PATA40; |
| 97 | else | 97 | else |
| 98 | ap->cbl = ATA_CBL_PATA80; | 98 | ap->cbl = ATA_CBL_PATA80; |
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c index 7350443948c1..fce3fcdc7e79 100644 --- a/drivers/ata/pata_hpt37x.c +++ b/drivers/ata/pata_hpt37x.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <linux/libata.h> | 25 | #include <linux/libata.h> |
| 26 | 26 | ||
| 27 | #define DRV_NAME "pata_hpt37x" | 27 | #define DRV_NAME "pata_hpt37x" |
| 28 | #define DRV_VERSION "0.5" | 28 | #define DRV_VERSION "0.5.1" |
| 29 | 29 | ||
| 30 | struct hpt_clock { | 30 | struct hpt_clock { |
| 31 | u8 xfer_speed; | 31 | u8 xfer_speed; |
| @@ -453,7 +453,13 @@ static int hpt37x_pre_reset(struct ata_port *ap) | |||
| 453 | { | 453 | { |
| 454 | u8 scr2, ata66; | 454 | u8 scr2, ata66; |
| 455 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 455 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 456 | 456 | static const struct pci_bits hpt37x_enable_bits[] = { | |
| 457 | { 0x50, 1, 0x04, 0x04 }, | ||
| 458 | { 0x54, 1, 0x04, 0x04 } | ||
| 459 | }; | ||
| 460 | if (!pci_test_config_bits(pdev, &hpt37x_enable_bits[ap->port_no])) | ||
| 461 | return -ENOENT; | ||
| 462 | |||
| 457 | pci_read_config_byte(pdev, 0x5B, &scr2); | 463 | pci_read_config_byte(pdev, 0x5B, &scr2); |
| 458 | pci_write_config_byte(pdev, 0x5B, scr2 & ~0x01); | 464 | pci_write_config_byte(pdev, 0x5B, scr2 & ~0x01); |
| 459 | /* Cable register now active */ | 465 | /* Cable register now active */ |
| @@ -488,10 +494,17 @@ static void hpt37x_error_handler(struct ata_port *ap) | |||
| 488 | 494 | ||
| 489 | static int hpt374_pre_reset(struct ata_port *ap) | 495 | static int hpt374_pre_reset(struct ata_port *ap) |
| 490 | { | 496 | { |
| 497 | static const struct pci_bits hpt37x_enable_bits[] = { | ||
| 498 | { 0x50, 1, 0x04, 0x04 }, | ||
| 499 | { 0x54, 1, 0x04, 0x04 } | ||
| 500 | }; | ||
| 491 | u16 mcr3, mcr6; | 501 | u16 mcr3, mcr6; |
| 492 | u8 ata66; | 502 | u8 ata66; |
| 493 | |||
| 494 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 503 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 504 | |||
| 505 | if (!pci_test_config_bits(pdev, &hpt37x_enable_bits[ap->port_no])) | ||
| 506 | return -ENOENT; | ||
| 507 | |||
| 495 | /* Do the extra channel work */ | 508 | /* Do the extra channel work */ |
| 496 | pci_read_config_word(pdev, 0x52, &mcr3); | 509 | pci_read_config_word(pdev, 0x52, &mcr3); |
| 497 | pci_read_config_word(pdev, 0x56, &mcr6); | 510 | pci_read_config_word(pdev, 0x56, &mcr6); |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 68ad11af22b4..002fde46d38d 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
| @@ -591,8 +591,10 @@ void device_del(struct device * dev) | |||
| 591 | 591 | ||
| 592 | if (parent) | 592 | if (parent) |
| 593 | klist_del(&dev->knode_parent); | 593 | klist_del(&dev->knode_parent); |
| 594 | if (dev->devt_attr) | 594 | if (dev->devt_attr) { |
| 595 | device_remove_file(dev, dev->devt_attr); | 595 | device_remove_file(dev, dev->devt_attr); |
| 596 | kfree(dev->devt_attr); | ||
| 597 | } | ||
| 596 | if (dev->class) { | 598 | if (dev->class) { |
| 597 | sysfs_remove_link(&dev->kobj, "subsystem"); | 599 | sysfs_remove_link(&dev->kobj, "subsystem"); |
| 598 | sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id); | 600 | sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id); |
diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c index d433f27e0ce2..aa25f8b09fe3 100644 --- a/drivers/block/aoe/aoeblk.c +++ b/drivers/block/aoe/aoeblk.c | |||
| @@ -68,6 +68,7 @@ static struct attribute *aoe_attrs[] = { | |||
| 68 | &disk_attr_mac.attr, | 68 | &disk_attr_mac.attr, |
| 69 | &disk_attr_netif.attr, | 69 | &disk_attr_netif.attr, |
| 70 | &disk_attr_fwver.attr, | 70 | &disk_attr_fwver.attr, |
| 71 | NULL | ||
| 71 | }; | 72 | }; |
| 72 | 73 | ||
| 73 | static const struct attribute_group attr_group = { | 74 | static const struct attribute_group attr_group = { |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 6ffe2b2bdacc..4105c3bf3476 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -1300,6 +1300,12 @@ static void cciss_softirq_done(struct request *rq) | |||
| 1300 | 1300 | ||
| 1301 | complete_buffers(rq->bio, rq->errors); | 1301 | complete_buffers(rq->bio, rq->errors); |
| 1302 | 1302 | ||
| 1303 | if (blk_fs_request(rq)) { | ||
| 1304 | const int rw = rq_data_dir(rq); | ||
| 1305 | |||
| 1306 | disk_stat_add(rq->rq_disk, sectors[rw], rq->nr_sectors); | ||
| 1307 | } | ||
| 1308 | |||
| 1303 | #ifdef CCISS_DEBUG | 1309 | #ifdef CCISS_DEBUG |
| 1304 | printk("Done with %p\n", rq); | 1310 | printk("Done with %p\n", rq); |
| 1305 | #endif /* CCISS_DEBUG */ | 1311 | #endif /* CCISS_DEBUG */ |
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 570d2f049323..d5f519ebbc08 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
| @@ -998,6 +998,7 @@ static inline void complete_buffers(struct bio *bio, int ok) | |||
| 998 | */ | 998 | */ |
| 999 | static inline void complete_command(cmdlist_t *cmd, int timeout) | 999 | static inline void complete_command(cmdlist_t *cmd, int timeout) |
| 1000 | { | 1000 | { |
| 1001 | struct request *rq = cmd->rq; | ||
| 1001 | int ok=1; | 1002 | int ok=1; |
| 1002 | int i, ddir; | 1003 | int i, ddir; |
| 1003 | 1004 | ||
| @@ -1029,12 +1030,18 @@ static inline void complete_command(cmdlist_t *cmd, int timeout) | |||
| 1029 | pci_unmap_page(hba[cmd->ctlr]->pci_dev, cmd->req.sg[i].addr, | 1030 | pci_unmap_page(hba[cmd->ctlr]->pci_dev, cmd->req.sg[i].addr, |
| 1030 | cmd->req.sg[i].size, ddir); | 1031 | cmd->req.sg[i].size, ddir); |
| 1031 | 1032 | ||
| 1032 | complete_buffers(cmd->rq->bio, ok); | 1033 | complete_buffers(rq->bio, ok); |
| 1033 | 1034 | ||
| 1034 | add_disk_randomness(cmd->rq->rq_disk); | 1035 | if (blk_fs_request(rq)) { |
| 1036 | const int rw = rq_data_dir(rq); | ||
| 1035 | 1037 | ||
| 1036 | DBGPX(printk("Done with %p\n", cmd->rq);); | 1038 | disk_stat_add(rq->rq_disk, sectors[rw], rq->nr_sectors); |
| 1037 | end_that_request_last(cmd->rq, ok ? 1 : -EIO); | 1039 | } |
| 1040 | |||
| 1041 | add_disk_randomness(rq->rq_disk); | ||
| 1042 | |||
| 1043 | DBGPX(printk("Done with %p\n", rq);); | ||
| 1044 | end_that_request_last(rq, ok ? 1 : -EIO); | ||
| 1038 | } | 1045 | } |
| 1039 | 1046 | ||
| 1040 | /* | 1047 | /* |
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index c39200161688..5ff457b41efb 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c | |||
| @@ -1054,7 +1054,7 @@ void *agp_generic_alloc_page(struct agp_bridge_data *bridge) | |||
| 1054 | { | 1054 | { |
| 1055 | struct page * page; | 1055 | struct page * page; |
| 1056 | 1056 | ||
| 1057 | page = alloc_page(GFP_KERNEL); | 1057 | page = alloc_page(GFP_KERNEL | GFP_DMA32); |
| 1058 | if (page == NULL) | 1058 | if (page == NULL) |
| 1059 | return NULL; | 1059 | return NULL; |
| 1060 | 1060 | ||
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index d1ede7db5a12..555b3a8ab49c 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
| @@ -169,7 +169,7 @@ static void *i8xx_alloc_pages(void) | |||
| 169 | { | 169 | { |
| 170 | struct page * page; | 170 | struct page * page; |
| 171 | 171 | ||
| 172 | page = alloc_pages(GFP_KERNEL, 2); | 172 | page = alloc_pages(GFP_KERNEL | GFP_DMA32, 2); |
| 173 | if (page == NULL) | 173 | if (page == NULL) |
| 174 | return NULL; | 174 | return NULL; |
| 175 | 175 | ||
| @@ -387,11 +387,7 @@ static void intel_i830_init_gtt_entries(void) | |||
| 387 | /* We obtain the size of the GTT, which is also stored (for some | 387 | /* We obtain the size of the GTT, which is also stored (for some |
| 388 | * reason) at the top of stolen memory. Then we add 4KB to that | 388 | * reason) at the top of stolen memory. Then we add 4KB to that |
| 389 | * for the video BIOS popup, which is also stored in there. */ | 389 | * for the video BIOS popup, which is also stored in there. */ |
| 390 | 390 | size = agp_bridge->driver->fetch_size() + 4; | |
| 391 | if (IS_I965) | ||
| 392 | size = 512 + 4; | ||
| 393 | else | ||
| 394 | size = agp_bridge->driver->fetch_size() + 4; | ||
| 395 | 391 | ||
| 396 | if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB || | 392 | if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB || |
| 397 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) { | 393 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) { |
| @@ -805,6 +801,26 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge) | |||
| 805 | 801 | ||
| 806 | return 0; | 802 | return 0; |
| 807 | } | 803 | } |
| 804 | |||
| 805 | /* | ||
| 806 | * The i965 supports 36-bit physical addresses, but to keep | ||
| 807 | * the format of the GTT the same, the bits that don't fit | ||
| 808 | * in a 32-bit word are shifted down to bits 4..7. | ||
| 809 | * | ||
| 810 | * Gcc is smart enough to notice that "(addr >> 28) & 0xf0" | ||
| 811 | * is always zero on 32-bit architectures, so no need to make | ||
| 812 | * this conditional. | ||
| 813 | */ | ||
| 814 | static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge, | ||
| 815 | unsigned long addr, int type) | ||
| 816 | { | ||
| 817 | /* Shift high bits down */ | ||
| 818 | addr |= (addr >> 28) & 0xf0; | ||
| 819 | |||
| 820 | /* Type checking must be done elsewhere */ | ||
| 821 | return addr | bridge->driver->masks[type].mask; | ||
| 822 | } | ||
| 823 | |||
| 808 | static int intel_i965_fetch_size(void) | 824 | static int intel_i965_fetch_size(void) |
| 809 | { | 825 | { |
| 810 | struct aper_size_info_fixed *values; | 826 | struct aper_size_info_fixed *values; |
| @@ -832,7 +848,8 @@ static int intel_i965_fetch_size(void) | |||
| 832 | 848 | ||
| 833 | agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset); | 849 | agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset); |
| 834 | 850 | ||
| 835 | return values[offset].size; | 851 | /* The i965 GTT is always sized as if it had a 512kB aperture size */ |
| 852 | return 512; | ||
| 836 | } | 853 | } |
| 837 | 854 | ||
| 838 | /* The intel i965 automatically initializes the agp aperture during POST. | 855 | /* The intel i965 automatically initializes the agp aperture during POST. |
| @@ -1584,7 +1601,7 @@ static struct agp_bridge_driver intel_i965_driver = { | |||
| 1584 | .fetch_size = intel_i965_fetch_size, | 1601 | .fetch_size = intel_i965_fetch_size, |
| 1585 | .cleanup = intel_i915_cleanup, | 1602 | .cleanup = intel_i915_cleanup, |
| 1586 | .tlb_flush = intel_i810_tlbflush, | 1603 | .tlb_flush = intel_i810_tlbflush, |
| 1587 | .mask_memory = intel_i810_mask_memory, | 1604 | .mask_memory = intel_i965_mask_memory, |
| 1588 | .masks = intel_i810_masks, | 1605 | .masks = intel_i810_masks, |
| 1589 | .agp_enable = intel_i810_agp_enable, | 1606 | .agp_enable = intel_i810_agp_enable, |
| 1590 | .cache_flush = global_cache_flush, | 1607 | .cache_flush = global_cache_flush, |
diff --git a/drivers/char/ftape/zftape/zftape-buffers.c b/drivers/char/ftape/zftape/zftape-buffers.c index da06f138334e..7ebce2ec7897 100644 --- a/drivers/char/ftape/zftape/zftape-buffers.c +++ b/drivers/char/ftape/zftape/zftape-buffers.c | |||
| @@ -85,7 +85,7 @@ int zft_vmalloc_once(void *new, size_t size) | |||
| 85 | peak_memory = used_memory; | 85 | peak_memory = used_memory; |
| 86 | } | 86 | } |
| 87 | TRACE_ABORT(0, ft_t_noise, | 87 | TRACE_ABORT(0, ft_t_noise, |
| 88 | "allocated buffer @ %p, %d bytes", *(void **)new, size); | 88 | "allocated buffer @ %p, %zd bytes", *(void **)new, size); |
| 89 | } | 89 | } |
| 90 | int zft_vmalloc_always(void *new, size_t size) | 90 | int zft_vmalloc_always(void *new, size_t size) |
| 91 | { | 91 | { |
| @@ -101,7 +101,7 @@ void zft_vfree(void *old, size_t size) | |||
| 101 | if (*(void **)old) { | 101 | if (*(void **)old) { |
| 102 | vfree(*(void **)old); | 102 | vfree(*(void **)old); |
| 103 | used_memory -= size; | 103 | used_memory -= size; |
| 104 | TRACE(ft_t_noise, "released buffer @ %p, %d bytes", | 104 | TRACE(ft_t_noise, "released buffer @ %p, %zd bytes", |
| 105 | *(void **)old, size); | 105 | *(void **)old, size); |
| 106 | *(void **)old = NULL; | 106 | *(void **)old = NULL; |
| 107 | } | 107 | } |
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index a41b8df24073..c47add8e47df 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
| @@ -2118,7 +2118,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf) | |||
| 2118 | dev_set_drvdata(&bmc->dev->dev, bmc); | 2118 | dev_set_drvdata(&bmc->dev->dev, bmc); |
| 2119 | kref_init(&bmc->refcount); | 2119 | kref_init(&bmc->refcount); |
| 2120 | 2120 | ||
| 2121 | rv = platform_device_register(bmc->dev); | 2121 | rv = platform_device_add(bmc->dev); |
| 2122 | mutex_unlock(&ipmidriver_mutex); | 2122 | mutex_unlock(&ipmidriver_mutex); |
| 2123 | if (rv) { | 2123 | if (rv) { |
| 2124 | printk(KERN_ERR | 2124 | printk(KERN_ERR |
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index abc5149e30e8..bb1fac104fda 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
| @@ -2346,7 +2346,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
| 2346 | new_smi->dev = &new_smi->pdev->dev; | 2346 | new_smi->dev = &new_smi->pdev->dev; |
| 2347 | new_smi->dev->driver = &ipmi_driver; | 2347 | new_smi->dev->driver = &ipmi_driver; |
| 2348 | 2348 | ||
| 2349 | rv = platform_device_register(new_smi->pdev); | 2349 | rv = platform_device_add(new_smi->pdev); |
| 2350 | if (rv) { | 2350 | if (rv) { |
| 2351 | printk(KERN_ERR | 2351 | printk(KERN_ERR |
| 2352 | "ipmi_si_intf:" | 2352 | "ipmi_si_intf:" |
diff --git a/drivers/char/isicom.c b/drivers/char/isicom.c index e9e9bf31c369..58c955e390b3 100644 --- a/drivers/char/isicom.c +++ b/drivers/char/isicom.c | |||
| @@ -1062,11 +1062,12 @@ static void isicom_shutdown_port(struct isi_port *port) | |||
| 1062 | static void isicom_close(struct tty_struct *tty, struct file *filp) | 1062 | static void isicom_close(struct tty_struct *tty, struct file *filp) |
| 1063 | { | 1063 | { |
| 1064 | struct isi_port *port = tty->driver_data; | 1064 | struct isi_port *port = tty->driver_data; |
| 1065 | struct isi_board *card = port->card; | 1065 | struct isi_board *card; |
| 1066 | unsigned long flags; | 1066 | unsigned long flags; |
| 1067 | 1067 | ||
| 1068 | if (!port) | 1068 | if (!port) |
| 1069 | return; | 1069 | return; |
| 1070 | card = port->card; | ||
| 1070 | if (isicom_paranoia_check(port, tty->name, "isicom_close")) | 1071 | if (isicom_paranoia_check(port, tty->name, "isicom_close")) |
| 1071 | return; | 1072 | return; |
| 1072 | 1073 | ||
diff --git a/drivers/char/tlclk.c b/drivers/char/tlclk.c index 2444a0e24b31..244d30a03fef 100644 --- a/drivers/char/tlclk.c +++ b/drivers/char/tlclk.c | |||
| @@ -792,15 +792,14 @@ static int __init tlclk_init(void) | |||
| 792 | ret = misc_register(&tlclk_miscdev); | 792 | ret = misc_register(&tlclk_miscdev); |
| 793 | if (ret < 0) { | 793 | if (ret < 0) { |
| 794 | printk(KERN_ERR "tlclk: misc_register returns %d.\n", ret); | 794 | printk(KERN_ERR "tlclk: misc_register returns %d.\n", ret); |
| 795 | ret = -EBUSY; | ||
| 796 | goto out3; | 795 | goto out3; |
| 797 | } | 796 | } |
| 798 | 797 | ||
| 799 | tlclk_device = platform_device_register_simple("telco_clock", | 798 | tlclk_device = platform_device_register_simple("telco_clock", |
| 800 | -1, NULL, 0); | 799 | -1, NULL, 0); |
| 801 | if (!tlclk_device) { | 800 | if (IS_ERR(tlclk_device)) { |
| 802 | printk(KERN_ERR "tlclk: platform_device_register failed.\n"); | 801 | printk(KERN_ERR "tlclk: platform_device_register failed.\n"); |
| 803 | ret = -EBUSY; | 802 | ret = PTR_ERR(tlclk_device); |
| 804 | goto out4; | 803 | goto out4; |
| 805 | } | 804 | } |
| 806 | 805 | ||
diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig index 2cc71b66231e..491779af8d55 100644 --- a/drivers/cpufreq/Kconfig +++ b/drivers/cpufreq/Kconfig | |||
| @@ -107,6 +107,7 @@ config CPU_FREQ_GOV_USERSPACE | |||
| 107 | 107 | ||
| 108 | config CPU_FREQ_GOV_ONDEMAND | 108 | config CPU_FREQ_GOV_ONDEMAND |
| 109 | tristate "'ondemand' cpufreq policy governor" | 109 | tristate "'ondemand' cpufreq policy governor" |
| 110 | select CPU_FREQ_TABLE | ||
| 110 | help | 111 | help |
| 111 | 'ondemand' - This driver adds a dynamic cpufreq policy governor. | 112 | 'ondemand' - This driver adds a dynamic cpufreq policy governor. |
| 112 | The governor does a periodic polling and | 113 | The governor does a periodic polling and |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 86e69b7f9122..dd0c2623e27b 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -59,7 +59,7 @@ static int __init init_cpufreq_transition_notifier_list(void) | |||
| 59 | srcu_init_notifier_head(&cpufreq_transition_notifier_list); | 59 | srcu_init_notifier_head(&cpufreq_transition_notifier_list); |
| 60 | return 0; | 60 | return 0; |
| 61 | } | 61 | } |
| 62 | core_initcall(init_cpufreq_transition_notifier_list); | 62 | pure_initcall(init_cpufreq_transition_notifier_list); |
| 63 | 63 | ||
| 64 | static LIST_HEAD(cpufreq_governor_list); | 64 | static LIST_HEAD(cpufreq_governor_list); |
| 65 | static DEFINE_MUTEX (cpufreq_governor_mutex); | 65 | static DEFINE_MUTEX (cpufreq_governor_mutex); |
diff --git a/drivers/firmware/dell_rbu.c b/drivers/firmware/dell_rbu.c index 08b161798443..fc702e40bd43 100644 --- a/drivers/firmware/dell_rbu.c +++ b/drivers/firmware/dell_rbu.c | |||
| @@ -705,17 +705,16 @@ static struct bin_attribute rbu_packet_size_attr = { | |||
| 705 | 705 | ||
| 706 | static int __init dcdrbu_init(void) | 706 | static int __init dcdrbu_init(void) |
| 707 | { | 707 | { |
| 708 | int rc = 0; | 708 | int rc; |
| 709 | spin_lock_init(&rbu_data.lock); | 709 | spin_lock_init(&rbu_data.lock); |
| 710 | 710 | ||
| 711 | init_packet_head(); | 711 | init_packet_head(); |
| 712 | rbu_device = | 712 | rbu_device = platform_device_register_simple("dell_rbu", -1, NULL, 0); |
| 713 | platform_device_register_simple("dell_rbu", -1, NULL, 0); | 713 | if (IS_ERR(rbu_device)) { |
| 714 | if (!rbu_device) { | ||
| 715 | printk(KERN_ERR | 714 | printk(KERN_ERR |
| 716 | "dell_rbu:%s:platform_device_register_simple " | 715 | "dell_rbu:%s:platform_device_register_simple " |
| 717 | "failed\n", __FUNCTION__); | 716 | "failed\n", __FUNCTION__); |
| 718 | return -EIO; | 717 | return PTR_ERR(rbu_device); |
| 719 | } | 718 | } |
| 720 | 719 | ||
| 721 | rc = sysfs_create_bin_file(&rbu_device->dev.kobj, &rbu_data_attr); | 720 | rc = sysfs_create_bin_file(&rbu_device->dev.kobj, &rbu_data_attr); |
diff --git a/drivers/i2c/busses/i2c-ixp4xx.c b/drivers/i2c/busses/i2c-ixp4xx.c index 1ce01fb0ac09..68fe863f9d54 100644 --- a/drivers/i2c/busses/i2c-ixp4xx.c +++ b/drivers/i2c/busses/i2c-ixp4xx.c | |||
| @@ -137,7 +137,8 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev) | |||
| 137 | gpio_line_set(gpio->scl_pin, 0); | 137 | gpio_line_set(gpio->scl_pin, 0); |
| 138 | gpio_line_set(gpio->sda_pin, 0); | 138 | gpio_line_set(gpio->sda_pin, 0); |
| 139 | 139 | ||
| 140 | if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) { | 140 | err = i2c_bit_add_bus(&drv_data->adapter); |
| 141 | if (err) { | ||
| 141 | printk(KERN_ERR "ERROR: Could not install %s\n", plat_dev->dev.bus_id); | 142 | printk(KERN_ERR "ERROR: Could not install %s\n", plat_dev->dev.bus_id); |
| 142 | 143 | ||
| 143 | kfree(drv_data); | 144 | kfree(drv_data); |
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index 32aab0d34ee9..714bae780953 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
| @@ -494,11 +494,12 @@ static __init int scx200_create_pci(const char *text, struct pci_dev *pdev, | |||
| 494 | iface->pdev = pdev; | 494 | iface->pdev = pdev; |
| 495 | iface->bar = bar; | 495 | iface->bar = bar; |
| 496 | 496 | ||
| 497 | pci_enable_device_bars(iface->pdev, 1 << iface->bar); | 497 | rc = pci_enable_device_bars(iface->pdev, 1 << iface->bar); |
| 498 | if (rc) | ||
| 499 | goto errout_free; | ||
| 498 | 500 | ||
| 499 | rc = pci_request_region(iface->pdev, iface->bar, iface->adapter.name); | 501 | rc = pci_request_region(iface->pdev, iface->bar, iface->adapter.name); |
| 500 | 502 | if (rc) { | |
| 501 | if (rc != 0) { | ||
| 502 | printk(KERN_ERR NAME ": can't allocate PCI BAR %d\n", | 503 | printk(KERN_ERR NAME ": can't allocate PCI BAR %d\n", |
| 503 | iface->bar); | 504 | iface->bar); |
| 504 | goto errout_free; | 505 | goto errout_free; |
diff --git a/drivers/ide/legacy/hd.c b/drivers/ide/legacy/hd.c index b1d5291531b7..45ed03591cd8 100644 --- a/drivers/ide/legacy/hd.c +++ b/drivers/ide/legacy/hd.c | |||
| @@ -459,7 +459,7 @@ ok_to_read: | |||
| 459 | #ifdef DEBUG | 459 | #ifdef DEBUG |
| 460 | printk("%s: read: sector %ld, remaining = %ld, buffer=%p\n", | 460 | printk("%s: read: sector %ld, remaining = %ld, buffer=%p\n", |
| 461 | req->rq_disk->disk_name, req->sector, req->nr_sectors, | 461 | req->rq_disk->disk_name, req->sector, req->nr_sectors, |
| 462 | req->buffer+512)); | 462 | req->buffer+512); |
| 463 | #endif | 463 | #endif |
| 464 | if (req->current_nr_sectors <= 0) | 464 | if (req->current_nr_sectors <= 0) |
| 465 | end_request(req, 1); | 465 | end_request(req, 1); |
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index 244f7eb7006d..cfad09accf52 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
| @@ -768,14 +768,7 @@ ioc4_ide_init(void) | |||
| 768 | return ioc4_register_submodule(&ioc4_ide_submodule); | 768 | return ioc4_register_submodule(&ioc4_ide_submodule); |
| 769 | } | 769 | } |
| 770 | 770 | ||
| 771 | static void __devexit | ||
| 772 | ioc4_ide_exit(void) | ||
| 773 | { | ||
| 774 | ioc4_unregister_submodule(&ioc4_ide_submodule); | ||
| 775 | } | ||
| 776 | |||
| 777 | late_initcall(ioc4_ide_init); /* Call only after IDE init is done */ | 771 | late_initcall(ioc4_ide_init); /* Call only after IDE init is done */ |
| 778 | module_exit(ioc4_ide_exit); | ||
| 779 | 772 | ||
| 780 | MODULE_AUTHOR("Aniket Malatpure/Jeremy Higdon"); | 773 | MODULE_AUTHOR("Aniket Malatpure/Jeremy Higdon"); |
| 781 | MODULE_DESCRIPTION("IDE PCI driver module for SGI IOC4 Base-IO Card"); | 774 | MODULE_DESCRIPTION("IDE PCI driver module for SGI IOC4 Base-IO Card"); |
diff --git a/drivers/infiniband/hw/ipath/Kconfig b/drivers/infiniband/hw/ipath/Kconfig index 574a678e7fdd..90c14543677d 100644 --- a/drivers/infiniband/hw/ipath/Kconfig +++ b/drivers/infiniband/hw/ipath/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config INFINIBAND_IPATH | 1 | config INFINIBAND_IPATH |
| 2 | tristate "QLogic InfiniPath Driver" | 2 | tristate "QLogic InfiniPath Driver" |
| 3 | depends on PCI_MSI && 64BIT && INFINIBAND | 3 | depends on (PCI_MSI || HT_IRQ) && 64BIT && INFINIBAND && NET |
| 4 | ---help--- | 4 | ---help--- |
| 5 | This is a driver for QLogic InfiniPath host channel adapters, | 5 | This is a driver for QLogic InfiniPath host channel adapters, |
| 6 | including InfiniBand verbs support. This driver allows these | 6 | including InfiniBand verbs support. This driver allows these |
diff --git a/drivers/infiniband/hw/ipath/Makefile b/drivers/infiniband/hw/ipath/Makefile index 5e29cb0095e5..7dc10551cf18 100644 --- a/drivers/infiniband/hw/ipath/Makefile +++ b/drivers/infiniband/hw/ipath/Makefile | |||
| @@ -10,8 +10,6 @@ ib_ipath-y := \ | |||
| 10 | ipath_eeprom.o \ | 10 | ipath_eeprom.o \ |
| 11 | ipath_file_ops.o \ | 11 | ipath_file_ops.o \ |
| 12 | ipath_fs.o \ | 12 | ipath_fs.o \ |
| 13 | ipath_iba6110.o \ | ||
| 14 | ipath_iba6120.o \ | ||
| 15 | ipath_init_chip.o \ | 13 | ipath_init_chip.o \ |
| 16 | ipath_intr.o \ | 14 | ipath_intr.o \ |
| 17 | ipath_keys.o \ | 15 | ipath_keys.o \ |
| @@ -31,5 +29,8 @@ ib_ipath-y := \ | |||
| 31 | ipath_verbs_mcast.o \ | 29 | ipath_verbs_mcast.o \ |
| 32 | ipath_verbs.o | 30 | ipath_verbs.o |
| 33 | 31 | ||
| 32 | ib_ipath-$(CONFIG_HT_IRQ) += ipath_iba6110.o | ||
| 33 | ib_ipath-$(CONFIG_PCI_MSI) += ipath_iba6120.o | ||
| 34 | |||
| 34 | ib_ipath-$(CONFIG_X86_64) += ipath_wc_x86_64.o | 35 | ib_ipath-$(CONFIG_X86_64) += ipath_wc_x86_64.o |
| 35 | ib_ipath-$(CONFIG_PPC64) += ipath_wc_ppc64.o | 36 | ib_ipath-$(CONFIG_PPC64) += ipath_wc_ppc64.o |
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c index 09a13c1fc46a..1aeddb48e355 100644 --- a/drivers/infiniband/hw/ipath/ipath_driver.c +++ b/drivers/infiniband/hw/ipath/ipath_driver.c | |||
| @@ -390,12 +390,16 @@ static int __devinit ipath_init_one(struct pci_dev *pdev, | |||
| 390 | 390 | ||
| 391 | /* setup the chip-specific functions, as early as possible. */ | 391 | /* setup the chip-specific functions, as early as possible. */ |
| 392 | switch (ent->device) { | 392 | switch (ent->device) { |
| 393 | #ifdef CONFIG_HT_IRQ | ||
| 393 | case PCI_DEVICE_ID_INFINIPATH_HT: | 394 | case PCI_DEVICE_ID_INFINIPATH_HT: |
| 394 | ipath_init_iba6110_funcs(dd); | 395 | ipath_init_iba6110_funcs(dd); |
| 395 | break; | 396 | break; |
| 397 | #endif | ||
| 398 | #ifdef CONFIG_PCI_MSI | ||
| 396 | case PCI_DEVICE_ID_INFINIPATH_PE800: | 399 | case PCI_DEVICE_ID_INFINIPATH_PE800: |
| 397 | ipath_init_iba6120_funcs(dd); | 400 | ipath_init_iba6120_funcs(dd); |
| 398 | break; | 401 | break; |
| 402 | #endif | ||
| 399 | default: | 403 | default: |
| 400 | ipath_dev_err(dd, "Found unknown QLogic deviceid 0x%x, " | 404 | ipath_dev_err(dd, "Found unknown QLogic deviceid 0x%x, " |
| 401 | "failing\n", ent->device); | 405 | "failing\n", ent->device); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 1eaf00e9862c..85522daeb946 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
| @@ -49,6 +49,8 @@ | |||
| 49 | 49 | ||
| 50 | #include <net/dst.h> | 50 | #include <net/dst.h> |
| 51 | 51 | ||
| 52 | #define IPOIB_QPN(ha) (be32_to_cpup((__be32 *) ha) & 0xffffff) | ||
| 53 | |||
| 52 | MODULE_AUTHOR("Roland Dreier"); | 54 | MODULE_AUTHOR("Roland Dreier"); |
| 53 | MODULE_DESCRIPTION("IP-over-InfiniBand net driver"); | 55 | MODULE_DESCRIPTION("IP-over-InfiniBand net driver"); |
| 54 | MODULE_LICENSE("Dual BSD/GPL"); | 56 | MODULE_LICENSE("Dual BSD/GPL"); |
| @@ -520,8 +522,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
| 520 | memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw, | 522 | memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw, |
| 521 | sizeof(union ib_gid)); | 523 | sizeof(union ib_gid)); |
| 522 | 524 | ||
| 523 | ipoib_send(dev, skb, path->ah, | 525 | ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha)); |
| 524 | be32_to_cpup((__be32 *) skb->dst->neighbour->ha)); | ||
| 525 | } else { | 526 | } else { |
| 526 | neigh->ah = NULL; | 527 | neigh->ah = NULL; |
| 527 | __skb_queue_tail(&neigh->queue, skb); | 528 | __skb_queue_tail(&neigh->queue, skb); |
| @@ -599,8 +600,7 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, | |||
| 599 | ipoib_dbg(priv, "Send unicast ARP to %04x\n", | 600 | ipoib_dbg(priv, "Send unicast ARP to %04x\n", |
| 600 | be16_to_cpu(path->pathrec.dlid)); | 601 | be16_to_cpu(path->pathrec.dlid)); |
| 601 | 602 | ||
| 602 | ipoib_send(dev, skb, path->ah, | 603 | ipoib_send(dev, skb, path->ah, IPOIB_QPN(phdr->hwaddr)); |
| 603 | be32_to_cpup((__be32 *) phdr->hwaddr)); | ||
| 604 | } else if ((path->query || !path_rec_start(dev, path)) && | 604 | } else if ((path->query || !path_rec_start(dev, path)) && |
| 605 | skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) { | 605 | skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) { |
| 606 | /* put pseudoheader back on for next time */ | 606 | /* put pseudoheader back on for next time */ |
| @@ -661,8 +661,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 661 | goto out; | 661 | goto out; |
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | ipoib_send(dev, skb, neigh->ah, | 664 | ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(skb->dst->neighbour->ha)); |
| 665 | be32_to_cpup((__be32 *) skb->dst->neighbour->ha)); | ||
| 666 | goto out; | 665 | goto out; |
| 667 | } | 666 | } |
| 668 | 667 | ||
| @@ -694,7 +693,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 694 | IPOIB_GID_FMT "\n", | 693 | IPOIB_GID_FMT "\n", |
| 695 | skb->dst ? "neigh" : "dst", | 694 | skb->dst ? "neigh" : "dst", |
| 696 | be16_to_cpup((__be16 *) skb->data), | 695 | be16_to_cpup((__be16 *) skb->data), |
| 697 | be32_to_cpup((__be32 *) phdr->hwaddr), | 696 | IPOIB_QPN(phdr->hwaddr), |
| 698 | IPOIB_GID_RAW_ARG(phdr->hwaddr + 4)); | 697 | IPOIB_GID_RAW_ARG(phdr->hwaddr + 4)); |
| 699 | dev_kfree_skb_any(skb); | 698 | dev_kfree_skb_any(skb); |
| 700 | ++priv->stats.tx_dropped; | 699 | ++priv->stats.tx_dropped; |
| @@ -777,7 +776,7 @@ static void ipoib_neigh_destructor(struct neighbour *n) | |||
| 777 | 776 | ||
| 778 | ipoib_dbg(priv, | 777 | ipoib_dbg(priv, |
| 779 | "neigh_destructor for %06x " IPOIB_GID_FMT "\n", | 778 | "neigh_destructor for %06x " IPOIB_GID_FMT "\n", |
| 780 | be32_to_cpup((__be32 *) n->ha), | 779 | IPOIB_QPN(n->ha), |
| 781 | IPOIB_GID_RAW_ARG(n->ha + 4)); | 780 | IPOIB_GID_RAW_ARG(n->ha + 4)); |
| 782 | 781 | ||
| 783 | spin_lock_irqsave(&priv->lock, flags); | 782 | spin_lock_irqsave(&priv->lock, flags); |
diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c index 708d5a1bc3d2..979b93e33da7 100644 --- a/drivers/input/keyboard/lkkbd.c +++ b/drivers/input/keyboard/lkkbd.c | |||
| @@ -59,11 +59,6 @@ | |||
| 59 | * You should have received a copy of the GNU General Public License | 59 | * You should have received a copy of the GNU General Public License |
| 60 | * along with this program; if not, write to the Free Software | 60 | * along with this program; if not, write to the Free Software |
| 61 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 61 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 62 | * | ||
| 63 | * Should you need to contact me, the author, you can do so either by | ||
| 64 | * email or by paper mail: | ||
| 65 | * Jan-Benedict Glaw, Lilienstraße 16, 33790 Hörste (near Halle/Westf.), | ||
| 66 | * Germany. | ||
| 67 | */ | 62 | */ |
| 68 | 63 | ||
| 69 | #include <linux/delay.h> | 64 | #include <linux/delay.h> |
diff --git a/drivers/isdn/hisax/Kconfig b/drivers/isdn/hisax/Kconfig index eb57a988e048..cfd2718a490d 100644 --- a/drivers/isdn/hisax/Kconfig +++ b/drivers/isdn/hisax/Kconfig | |||
| @@ -344,7 +344,7 @@ config HISAX_HFC_SX | |||
| 344 | 344 | ||
| 345 | config HISAX_ENTERNOW_PCI | 345 | config HISAX_ENTERNOW_PCI |
| 346 | bool "Formula-n enter:now PCI card" | 346 | bool "Formula-n enter:now PCI card" |
| 347 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K || FRV)) | 347 | depends on HISAX_NETJET && PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K || FRV)) |
| 348 | help | 348 | help |
| 349 | This enables HiSax support for the Formula-n enter:now PCI | 349 | This enables HiSax support for the Formula-n enter:now PCI |
| 350 | ISDN card. | 350 | ISDN card. |
diff --git a/drivers/macintosh/windfarm_pm112.c b/drivers/macintosh/windfarm_pm112.c index fa4b13f89369..b3fbb45bc90a 100644 --- a/drivers/macintosh/windfarm_pm112.c +++ b/drivers/macintosh/windfarm_pm112.c | |||
| @@ -685,6 +685,17 @@ static int __init wf_pm112_init(void) | |||
| 685 | ++nr_cores; | 685 | ++nr_cores; |
| 686 | 686 | ||
| 687 | printk(KERN_INFO "windfarm: initializing for dual-core desktop G5\n"); | 687 | printk(KERN_INFO "windfarm: initializing for dual-core desktop G5\n"); |
| 688 | |||
| 689 | #ifdef MODULE | ||
| 690 | request_module("windfarm_smu_controls"); | ||
| 691 | request_module("windfarm_smu_sensors"); | ||
| 692 | request_module("windfarm_smu_sat"); | ||
| 693 | request_module("windfarm_lm75_sensor"); | ||
| 694 | request_module("windfarm_max6690_sensor"); | ||
| 695 | request_module("windfarm_cpufreq_clamp"); | ||
| 696 | |||
| 697 | #endif /* MODULE */ | ||
| 698 | |||
| 688 | platform_driver_register(&wf_pm112_driver); | 699 | platform_driver_register(&wf_pm112_driver); |
| 689 | return 0; | 700 | return 0; |
| 690 | } | 701 | } |
diff --git a/drivers/macintosh/windfarm_pm81.c b/drivers/macintosh/windfarm_pm81.c index 2a944851b8e1..f24fa734046a 100644 --- a/drivers/macintosh/windfarm_pm81.c +++ b/drivers/macintosh/windfarm_pm81.c | |||
| @@ -788,6 +788,7 @@ static int __init wf_smu_init(void) | |||
| 788 | request_module("windfarm_smu_controls"); | 788 | request_module("windfarm_smu_controls"); |
| 789 | request_module("windfarm_smu_sensors"); | 789 | request_module("windfarm_smu_sensors"); |
| 790 | request_module("windfarm_lm75_sensor"); | 790 | request_module("windfarm_lm75_sensor"); |
| 791 | request_module("windfarm_cpufreq_clamp"); | ||
| 791 | 792 | ||
| 792 | #endif /* MODULE */ | 793 | #endif /* MODULE */ |
| 793 | platform_driver_register(&wf_smu_driver); | 794 | platform_driver_register(&wf_smu_driver); |
diff --git a/drivers/macintosh/windfarm_pm91.c b/drivers/macintosh/windfarm_pm91.c index 9961a67b4f85..26eee69ebe6d 100644 --- a/drivers/macintosh/windfarm_pm91.c +++ b/drivers/macintosh/windfarm_pm91.c | |||
| @@ -719,6 +719,7 @@ static int __init wf_smu_init(void) | |||
| 719 | request_module("windfarm_smu_controls"); | 719 | request_module("windfarm_smu_controls"); |
| 720 | request_module("windfarm_smu_sensors"); | 720 | request_module("windfarm_smu_sensors"); |
| 721 | request_module("windfarm_lm75_sensor"); | 721 | request_module("windfarm_lm75_sensor"); |
| 722 | request_module("windfarm_cpufreq_clamp"); | ||
| 722 | 723 | ||
| 723 | #endif /* MODULE */ | 724 | #endif /* MODULE */ |
| 724 | platform_driver_register(&wf_smu_driver); | 725 | platform_driver_register(&wf_smu_driver); |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 53304e6991ac..a2ab2eebfc68 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
| @@ -348,7 +348,7 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra | |||
| 348 | 348 | ||
| 349 | static void dvb_frontend_swzigzag(struct dvb_frontend *fe) | 349 | static void dvb_frontend_swzigzag(struct dvb_frontend *fe) |
| 350 | { | 350 | { |
| 351 | fe_status_t s; | 351 | fe_status_t s = 0; |
| 352 | struct dvb_frontend_private *fepriv = fe->frontend_priv; | 352 | struct dvb_frontend_private *fepriv = fe->frontend_priv; |
| 353 | 353 | ||
| 354 | /* if we've got no parameters, just keep idling */ | 354 | /* if we've got no parameters, just keep idling */ |
diff --git a/drivers/media/dvb/frontends/tda10086.c b/drivers/media/dvb/frontends/tda10086.c index 7456b0b9976b..4c27a2d90a38 100644 --- a/drivers/media/dvb/frontends/tda10086.c +++ b/drivers/media/dvb/frontends/tda10086.c | |||
| @@ -441,6 +441,10 @@ static int tda10086_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_pa | |||
| 441 | 441 | ||
| 442 | dprintk ("%s\n", __FUNCTION__); | 442 | dprintk ("%s\n", __FUNCTION__); |
| 443 | 443 | ||
| 444 | // check for invalid symbol rate | ||
| 445 | if (fe_params->u.qpsk.symbol_rate < 500000) | ||
| 446 | return -EINVAL; | ||
| 447 | |||
| 444 | // calculate the updated frequency (note: we convert from Hz->kHz) | 448 | // calculate the updated frequency (note: we convert from Hz->kHz) |
| 445 | tmp64 = tda10086_read_byte(state, 0x52); | 449 | tmp64 = tda10086_read_byte(state, 0x52); |
| 446 | tmp64 |= (tda10086_read_byte(state, 0x51) << 8); | 450 | tmp64 |= (tda10086_read_byte(state, 0x51) << 8); |
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index e58f0391e9d1..56f1c80defc6 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c | |||
| @@ -46,6 +46,10 @@ | |||
| 46 | #include "lnbp21.h" | 46 | #include "lnbp21.h" |
| 47 | #include "bsru6.h" | 47 | #include "bsru6.h" |
| 48 | 48 | ||
| 49 | static int diseqc_method; | ||
| 50 | module_param(diseqc_method, int, 0444); | ||
| 51 | MODULE_PARM_DESC(diseqc_method, "Select DiSEqC method for subsystem id 13c2:1003, 0: default, 1: more reliable (for newer revisions only)"); | ||
| 52 | |||
| 49 | static void Set22K (struct budget *budget, int state) | 53 | static void Set22K (struct budget *budget, int state) |
| 50 | { | 54 | { |
| 51 | struct saa7146_dev *dev=budget->dev; | 55 | struct saa7146_dev *dev=budget->dev; |
| @@ -382,6 +386,11 @@ static void frontend_init(struct budget *budget) | |||
| 382 | if (budget->dvb_frontend) { | 386 | if (budget->dvb_frontend) { |
| 383 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; | 387 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; |
| 384 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; | 388 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; |
| 389 | if (budget->dev->pci->subsystem_device == 0x1003 && diseqc_method == 0) { | ||
| 390 | budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; | ||
| 391 | budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; | ||
| 392 | budget->dvb_frontend->ops.set_tone = budget_set_tone; | ||
| 393 | } | ||
| 385 | break; | 394 | break; |
| 386 | } | 395 | } |
| 387 | break; | 396 | break; |
diff --git a/drivers/media/video/et61x251/et61x251_core.c b/drivers/media/video/et61x251/et61x251_core.c index f786ab11d2cd..86e353b26b53 100644 --- a/drivers/media/video/et61x251/et61x251_core.c +++ b/drivers/media/video/et61x251/et61x251_core.c | |||
| @@ -1182,8 +1182,6 @@ static void et61x251_release_resources(struct et61x251_device* cam) | |||
| 1182 | video_set_drvdata(cam->v4ldev, NULL); | 1182 | video_set_drvdata(cam->v4ldev, NULL); |
| 1183 | video_unregister_device(cam->v4ldev); | 1183 | video_unregister_device(cam->v4ldev); |
| 1184 | 1184 | ||
| 1185 | usb_put_dev(cam->usbdev); | ||
| 1186 | |||
| 1187 | mutex_unlock(&et61x251_sysfs_lock); | 1185 | mutex_unlock(&et61x251_sysfs_lock); |
| 1188 | 1186 | ||
| 1189 | kfree(cam->control_buffer); | 1187 | kfree(cam->control_buffer); |
| @@ -1275,6 +1273,7 @@ static int et61x251_release(struct inode* inode, struct file* filp) | |||
| 1275 | 1273 | ||
| 1276 | if (cam->state & DEV_DISCONNECTED) { | 1274 | if (cam->state & DEV_DISCONNECTED) { |
| 1277 | et61x251_release_resources(cam); | 1275 | et61x251_release_resources(cam); |
| 1276 | usb_put_dev(cam->usbdev); | ||
| 1278 | mutex_unlock(&cam->dev_mutex); | 1277 | mutex_unlock(&cam->dev_mutex); |
| 1279 | kfree(cam); | 1278 | kfree(cam); |
| 1280 | return 0; | 1279 | return 0; |
diff --git a/drivers/media/video/saa6588.c b/drivers/media/video/saa6588.c index a81285ca7d5b..7b9859c33018 100644 --- a/drivers/media/video/saa6588.c +++ b/drivers/media/video/saa6588.c | |||
| @@ -212,8 +212,10 @@ static void read_from_buf(struct saa6588 *s, struct rds_command *a) | |||
| 212 | if (rd_blocks > s->block_count) | 212 | if (rd_blocks > s->block_count) |
| 213 | rd_blocks = s->block_count; | 213 | rd_blocks = s->block_count; |
| 214 | 214 | ||
| 215 | if (!rd_blocks) | 215 | if (!rd_blocks) { |
| 216 | spin_unlock_irqrestore(&s->lock, flags); | ||
| 216 | return; | 217 | return; |
| 218 | } | ||
| 217 | 219 | ||
| 218 | for (i = 0; i < rd_blocks; i++) { | 220 | for (i = 0; i < rd_blocks; i++) { |
| 219 | if (block_to_user_buf(s, buf_ptr)) { | 221 | if (block_to_user_buf(s, buf_ptr)) { |
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c index c5719f7bd1ac..f28398dd9d93 100644 --- a/drivers/media/video/saa7115.c +++ b/drivers/media/video/saa7115.c | |||
| @@ -1464,8 +1464,6 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind) | |||
| 1464 | client->driver = &i2c_driver_saa711x; | 1464 | client->driver = &i2c_driver_saa711x; |
| 1465 | snprintf(client->name, sizeof(client->name) - 1, "saa7115"); | 1465 | snprintf(client->name, sizeof(client->name) - 1, "saa7115"); |
| 1466 | 1466 | ||
| 1467 | v4l_dbg(1, debug, client, "detecting saa7115 client on address 0x%x\n", address << 1); | ||
| 1468 | |||
| 1469 | for (i=0;i<0x0f;i++) { | 1467 | for (i=0;i<0x0f;i++) { |
| 1470 | saa711x_write(client, 0, i); | 1468 | saa711x_write(client, 0, i); |
| 1471 | name[i] = (saa711x_read(client, 0) &0x0f) +'0'; | 1469 | name[i] = (saa711x_read(client, 0) &0x0f) +'0'; |
| @@ -1477,6 +1475,13 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind) | |||
| 1477 | saa711x_write(client, 0, 5); | 1475 | saa711x_write(client, 0, 5); |
| 1478 | chip_id = saa711x_read(client, 0) & 0x0f; | 1476 | chip_id = saa711x_read(client, 0) & 0x0f; |
| 1479 | 1477 | ||
| 1478 | /* Check whether this chip is part of the saa711x series */ | ||
| 1479 | if (memcmp(name, "1f711", 5)) { | ||
| 1480 | v4l_dbg(1, debug, client, "chip found @ 0x%x (ID %s) does not match a known saa711x chip.\n", | ||
| 1481 | address << 1, name); | ||
| 1482 | return 0; | ||
| 1483 | } | ||
| 1484 | |||
| 1480 | snprintf(client->name, sizeof(client->name) - 1, "saa711%d",chip_id); | 1485 | snprintf(client->name, sizeof(client->name) - 1, "saa711%d",chip_id); |
| 1481 | v4l_info(client, "saa711%d found (%s) @ 0x%x (%s)\n", chip_id, name, address << 1, adapter->name); | 1486 | v4l_info(client, "saa711%d found (%s) @ 0x%x (%s)\n", chip_id, name, address << 1, adapter->name); |
| 1482 | 1487 | ||
diff --git a/drivers/media/video/sn9c102/sn9c102_core.c b/drivers/media/video/sn9c102/sn9c102_core.c index a4702d3c2aca..42fb60d985b9 100644 --- a/drivers/media/video/sn9c102/sn9c102_core.c +++ b/drivers/media/video/sn9c102/sn9c102_core.c | |||
| @@ -1462,8 +1462,6 @@ static void sn9c102_release_resources(struct sn9c102_device* cam) | |||
| 1462 | video_set_drvdata(cam->v4ldev, NULL); | 1462 | video_set_drvdata(cam->v4ldev, NULL); |
| 1463 | video_unregister_device(cam->v4ldev); | 1463 | video_unregister_device(cam->v4ldev); |
| 1464 | 1464 | ||
| 1465 | usb_put_dev(cam->usbdev); | ||
| 1466 | |||
| 1467 | mutex_unlock(&sn9c102_sysfs_lock); | 1465 | mutex_unlock(&sn9c102_sysfs_lock); |
| 1468 | 1466 | ||
| 1469 | kfree(cam->control_buffer); | 1467 | kfree(cam->control_buffer); |
| @@ -1555,6 +1553,7 @@ static int sn9c102_release(struct inode* inode, struct file* filp) | |||
| 1555 | 1553 | ||
| 1556 | if (cam->state & DEV_DISCONNECTED) { | 1554 | if (cam->state & DEV_DISCONNECTED) { |
| 1557 | sn9c102_release_resources(cam); | 1555 | sn9c102_release_resources(cam); |
| 1556 | usb_put_dev(cam->usbdev); | ||
| 1558 | mutex_unlock(&cam->dev_mutex); | 1557 | mutex_unlock(&cam->dev_mutex); |
| 1559 | kfree(cam); | 1558 | kfree(cam); |
| 1560 | return 0; | 1559 | return 0; |
diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c index 7ea49a0d5ec3..296159ec5189 100644 --- a/drivers/mtd/chips/cfi_cmdset_0001.c +++ b/drivers/mtd/chips/cfi_cmdset_0001.c | |||
| @@ -1087,7 +1087,7 @@ static int inval_cache_and_wait_for_operation( | |||
| 1087 | } | 1087 | } |
| 1088 | spin_lock(chip->mutex); | 1088 | spin_lock(chip->mutex); |
| 1089 | 1089 | ||
| 1090 | if (chip->state != chip_state) { | 1090 | while (chip->state != chip_state) { |
| 1091 | /* Someone's suspended the operation: sleep */ | 1091 | /* Someone's suspended the operation: sleep */ |
| 1092 | DECLARE_WAITQUEUE(wait, current); | 1092 | DECLARE_WAITQUEUE(wait, current); |
| 1093 | set_current_state(TASK_UNINTERRUPTIBLE); | 1093 | set_current_state(TASK_UNINTERRUPTIBLE); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 6e863aa9894c..30ae712dff74 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -1769,8 +1769,8 @@ config VIA_RHINE_NAPI | |||
| 1769 | information. | 1769 | information. |
| 1770 | 1770 | ||
| 1771 | config LAN_SAA9730 | 1771 | config LAN_SAA9730 |
| 1772 | bool "Philips SAA9730 Ethernet support (EXPERIMENTAL)" | 1772 | bool "Philips SAA9730 Ethernet support" |
| 1773 | depends on NET_PCI && EXPERIMENTAL && MIPS | 1773 | depends on NET_PCI && PCI && MIPS_ATLAS |
| 1774 | help | 1774 | help |
| 1775 | The SAA9730 is a combined multimedia and peripheral controller used | 1775 | The SAA9730 is a combined multimedia and peripheral controller used |
| 1776 | in thin clients, Internet access terminals, and diskless | 1776 | in thin clients, Internet access terminals, and diskless |
diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index 86b3bb9bec2d..92420f007b97 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c | |||
| @@ -914,7 +914,7 @@ static void decode_prio_command(struct sixpack *sp, unsigned char cmd) | |||
| 914 | printk(KERN_DEBUG "6pack: protocol violation\n"); | 914 | printk(KERN_DEBUG "6pack: protocol violation\n"); |
| 915 | else | 915 | else |
| 916 | sp->status = 0; | 916 | sp->status = 0; |
| 917 | cmd &= !SIXP_RX_DCD_MASK; | 917 | cmd &= ~SIXP_RX_DCD_MASK; |
| 918 | } | 918 | } |
| 919 | sp->status = cmd & SIXP_PRIO_DATA_MASK; | 919 | sp->status = cmd & SIXP_PRIO_DATA_MASK; |
| 920 | } else { /* output watchdog char if idle */ | 920 | } else { /* output watchdog char if idle */ |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 27f90b2139c0..b977ed85ff39 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -1473,8 +1473,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1473 | struct rtl8169_private *tp; | 1473 | struct rtl8169_private *tp; |
| 1474 | struct net_device *dev; | 1474 | struct net_device *dev; |
| 1475 | void __iomem *ioaddr; | 1475 | void __iomem *ioaddr; |
| 1476 | unsigned int i, pm_cap; | 1476 | unsigned int pm_cap; |
| 1477 | int rc; | 1477 | int i, rc; |
| 1478 | 1478 | ||
| 1479 | if (netif_msg_drv(&debug)) { | 1479 | if (netif_msg_drv(&debug)) { |
| 1480 | printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n", | 1480 | printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n", |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 06e4f77b0988..c20bb998e0e5 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -68,8 +68,8 @@ | |||
| 68 | 68 | ||
| 69 | #define DRV_MODULE_NAME "tg3" | 69 | #define DRV_MODULE_NAME "tg3" |
| 70 | #define PFX DRV_MODULE_NAME ": " | 70 | #define PFX DRV_MODULE_NAME ": " |
| 71 | #define DRV_MODULE_VERSION "3.68" | 71 | #define DRV_MODULE_VERSION "3.69" |
| 72 | #define DRV_MODULE_RELDATE "November 02, 2006" | 72 | #define DRV_MODULE_RELDATE "November 15, 2006" |
| 73 | 73 | ||
| 74 | #define TG3_DEF_MAC_MODE 0 | 74 | #define TG3_DEF_MAC_MODE 0 |
| 75 | #define TG3_DEF_RX_MODE 0 | 75 | #define TG3_DEF_RX_MODE 0 |
| @@ -4728,10 +4728,11 @@ static int tg3_poll_fw(struct tg3 *tp) | |||
| 4728 | u32 val; | 4728 | u32 val; |
| 4729 | 4729 | ||
| 4730 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | 4730 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { |
| 4731 | for (i = 0; i < 400; i++) { | 4731 | /* Wait up to 20ms for init done. */ |
| 4732 | for (i = 0; i < 200; i++) { | ||
| 4732 | if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE) | 4733 | if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE) |
| 4733 | return 0; | 4734 | return 0; |
| 4734 | udelay(10); | 4735 | udelay(100); |
| 4735 | } | 4736 | } |
| 4736 | return -ENODEV; | 4737 | return -ENODEV; |
| 4737 | } | 4738 | } |
| @@ -6978,8 +6979,10 @@ static int tg3_open(struct net_device *dev) | |||
| 6978 | tg3_full_lock(tp, 0); | 6979 | tg3_full_lock(tp, 0); |
| 6979 | 6980 | ||
| 6980 | err = tg3_set_power_state(tp, PCI_D0); | 6981 | err = tg3_set_power_state(tp, PCI_D0); |
| 6981 | if (err) | 6982 | if (err) { |
| 6983 | tg3_full_unlock(tp); | ||
| 6982 | return err; | 6984 | return err; |
| 6985 | } | ||
| 6983 | 6986 | ||
| 6984 | tg3_disable_ints(tp); | 6987 | tg3_disable_ints(tp); |
| 6985 | tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE; | 6988 | tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE; |
| @@ -10365,7 +10368,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 10365 | u32 pci_state_reg, grc_misc_cfg; | 10368 | u32 pci_state_reg, grc_misc_cfg; |
| 10366 | u32 val; | 10369 | u32 val; |
| 10367 | u16 pci_cmd; | 10370 | u16 pci_cmd; |
| 10368 | int err; | 10371 | int err, pcie_cap; |
| 10369 | 10372 | ||
| 10370 | /* Force memory write invalidate off. If we leave it on, | 10373 | /* Force memory write invalidate off. If we leave it on, |
| 10371 | * then on 5700_BX chips we have to enable a workaround. | 10374 | * then on 5700_BX chips we have to enable a workaround. |
| @@ -10540,8 +10543,19 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 10540 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) | 10543 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) |
| 10541 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; | 10544 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; |
| 10542 | 10545 | ||
| 10543 | if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) | 10546 | pcie_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_EXP); |
| 10547 | if (pcie_cap != 0) { | ||
| 10544 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; | 10548 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; |
| 10549 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
| 10550 | u16 lnkctl; | ||
| 10551 | |||
| 10552 | pci_read_config_word(tp->pdev, | ||
| 10553 | pcie_cap + PCI_EXP_LNKCTL, | ||
| 10554 | &lnkctl); | ||
| 10555 | if (lnkctl & PCI_EXP_LNKCTL_CLKREQ_EN) | ||
| 10556 | tp->tg3_flags2 &= ~TG3_FLG2_HW_TSO_2; | ||
| 10557 | } | ||
| 10558 | } | ||
| 10545 | 10559 | ||
| 10546 | /* If we have an AMD 762 or VIA K8T800 chipset, write | 10560 | /* If we have an AMD 762 or VIA K8T800 chipset, write |
| 10547 | * reordering to the mailbox registers done by the host | 10561 | * reordering to the mailbox registers done by the host |
| @@ -11808,6 +11822,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
| 11808 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || | 11822 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || |
| 11809 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 || | 11823 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 || |
| 11810 | tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 || | 11824 | tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 || |
| 11825 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 || | ||
| 11811 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) { | 11826 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) { |
| 11812 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; | 11827 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; |
| 11813 | } else { | 11828 | } else { |
diff --git a/drivers/parport/parport_ip32.c b/drivers/parport/parport_ip32.c index e3e19277030a..ec44efdbb84e 100644 --- a/drivers/parport/parport_ip32.c +++ b/drivers/parport/parport_ip32.c | |||
| @@ -780,7 +780,7 @@ static irqreturn_t parport_ip32_interrupt(int irq, void *dev_id) | |||
| 780 | enum parport_ip32_irq_mode irq_mode = priv->irq_mode; | 780 | enum parport_ip32_irq_mode irq_mode = priv->irq_mode; |
| 781 | switch (irq_mode) { | 781 | switch (irq_mode) { |
| 782 | case PARPORT_IP32_IRQ_FWD: | 782 | case PARPORT_IP32_IRQ_FWD: |
| 783 | parport_generic_irq(irq, p, regs); | 783 | parport_generic_irq(irq, p); |
| 784 | break; | 784 | break; |
| 785 | case PARPORT_IP32_IRQ_HERE: | 785 | case PARPORT_IP32_IRQ_HERE: |
| 786 | parport_ip32_wakeup(p); | 786 | parport_ip32_wakeup(p); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 204b1c8e972b..5b4483811691 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -1460,33 +1460,6 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2609, quirk_intel_pcie_pm); | |||
| 1460 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); | 1460 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); |
| 1461 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); | 1461 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); |
| 1462 | 1462 | ||
| 1463 | /* | ||
| 1464 | * Fixup the cardbus bridges on the IBM Dock II docking station | ||
| 1465 | */ | ||
| 1466 | static void __devinit quirk_ibm_dock2_cardbus(struct pci_dev *dev) | ||
| 1467 | { | ||
| 1468 | u32 val; | ||
| 1469 | |||
| 1470 | /* | ||
| 1471 | * tie the 2 interrupt pins to INTA, and configure the | ||
| 1472 | * multifunction routing register to handle this. | ||
| 1473 | */ | ||
| 1474 | if ((dev->subsystem_vendor == PCI_VENDOR_ID_IBM) && | ||
| 1475 | (dev->subsystem_device == 0x0148)) { | ||
| 1476 | printk(KERN_INFO "PCI: Found IBM Dock II Cardbus Bridge " | ||
| 1477 | "applying quirk\n"); | ||
| 1478 | pci_read_config_dword(dev, 0x8c, &val); | ||
| 1479 | val = ((val & 0xffffff00) | 0x1002); | ||
| 1480 | pci_write_config_dword(dev, 0x8c, val); | ||
| 1481 | pci_read_config_dword(dev, 0x80, &val); | ||
| 1482 | val = ((val & 0x00ffff00) | 0x2864c077); | ||
| 1483 | pci_write_config_dword(dev, 0x80, val); | ||
| 1484 | } | ||
| 1485 | } | ||
| 1486 | |||
| 1487 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1420, | ||
| 1488 | quirk_ibm_dock2_cardbus); | ||
| 1489 | |||
| 1490 | static void __devinit quirk_netmos(struct pci_dev *dev) | 1463 | static void __devinit quirk_netmos(struct pci_dev *dev) |
| 1491 | { | 1464 | { |
| 1492 | unsigned int num_parallel = (dev->subsystem_device & 0xf0) >> 4; | 1465 | unsigned int num_parallel = (dev->subsystem_device & 0xf0) >> 4; |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 0f701921c13e..21d83a895b21 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
| @@ -1271,6 +1271,11 @@ static void pcmcia_bus_remove_socket(struct class_device *class_dev, | |||
| 1271 | socket->pcmcia_state.dead = 1; | 1271 | socket->pcmcia_state.dead = 1; |
| 1272 | pccard_register_pcmcia(socket, NULL); | 1272 | pccard_register_pcmcia(socket, NULL); |
| 1273 | 1273 | ||
| 1274 | /* unregister any unbound devices */ | ||
| 1275 | mutex_lock(&socket->skt_mutex); | ||
| 1276 | pcmcia_card_remove(socket, NULL); | ||
| 1277 | mutex_unlock(&socket->skt_mutex); | ||
| 1278 | |||
| 1274 | pcmcia_put_socket(socket); | 1279 | pcmcia_put_socket(socket); |
| 1275 | 1280 | ||
| 1276 | return; | 1281 | return; |
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 579cd667b16f..6f11f6dfdd9d 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
| @@ -145,6 +145,13 @@ int rtc_set_alarm(struct class_device *class_dev, struct rtc_wkalrm *alarm) | |||
| 145 | } | 145 | } |
| 146 | EXPORT_SYMBOL_GPL(rtc_set_alarm); | 146 | EXPORT_SYMBOL_GPL(rtc_set_alarm); |
| 147 | 147 | ||
| 148 | /** | ||
| 149 | * rtc_update_irq - report RTC periodic, alarm, and/or update irqs | ||
| 150 | * @class_dev: the rtc's class device | ||
| 151 | * @num: how many irqs are being reported (usually one) | ||
| 152 | * @events: mask of RTC_IRQF with one or more of RTC_PF, RTC_AF, RTC_UF | ||
| 153 | * Context: in_interrupt(), irqs blocked | ||
| 154 | */ | ||
| 148 | void rtc_update_irq(struct class_device *class_dev, | 155 | void rtc_update_irq(struct class_device *class_dev, |
| 149 | unsigned long num, unsigned long events) | 156 | unsigned long num, unsigned long events) |
| 150 | { | 157 | { |
| @@ -201,12 +208,12 @@ int rtc_irq_register(struct class_device *class_dev, struct rtc_task *task) | |||
| 201 | if (task == NULL || task->func == NULL) | 208 | if (task == NULL || task->func == NULL) |
| 202 | return -EINVAL; | 209 | return -EINVAL; |
| 203 | 210 | ||
| 204 | spin_lock(&rtc->irq_task_lock); | 211 | spin_lock_irq(&rtc->irq_task_lock); |
| 205 | if (rtc->irq_task == NULL) { | 212 | if (rtc->irq_task == NULL) { |
| 206 | rtc->irq_task = task; | 213 | rtc->irq_task = task; |
| 207 | retval = 0; | 214 | retval = 0; |
| 208 | } | 215 | } |
| 209 | spin_unlock(&rtc->irq_task_lock); | 216 | spin_unlock_irq(&rtc->irq_task_lock); |
| 210 | 217 | ||
| 211 | return retval; | 218 | return retval; |
| 212 | } | 219 | } |
| @@ -216,10 +223,10 @@ void rtc_irq_unregister(struct class_device *class_dev, struct rtc_task *task) | |||
| 216 | { | 223 | { |
| 217 | struct rtc_device *rtc = to_rtc_device(class_dev); | 224 | struct rtc_device *rtc = to_rtc_device(class_dev); |
| 218 | 225 | ||
| 219 | spin_lock(&rtc->irq_task_lock); | 226 | spin_lock_irq(&rtc->irq_task_lock); |
| 220 | if (rtc->irq_task == task) | 227 | if (rtc->irq_task == task) |
| 221 | rtc->irq_task = NULL; | 228 | rtc->irq_task = NULL; |
| 222 | spin_unlock(&rtc->irq_task_lock); | 229 | spin_unlock_irq(&rtc->irq_task_lock); |
| 223 | } | 230 | } |
| 224 | EXPORT_SYMBOL_GPL(rtc_irq_unregister); | 231 | EXPORT_SYMBOL_GPL(rtc_irq_unregister); |
| 225 | 232 | ||
| @@ -265,3 +272,4 @@ int rtc_irq_set_freq(struct class_device *class_dev, struct rtc_task *task, int | |||
| 265 | } | 272 | } |
| 266 | return err; | 273 | return err; |
| 267 | } | 274 | } |
| 275 | EXPORT_SYMBOL_GPL(rtc_irq_set_freq); | ||
diff --git a/drivers/rtc/rtc-at91.c b/drivers/rtc/rtc-at91.c index bd61e99540a3..5c8addcaf1fb 100644 --- a/drivers/rtc/rtc-at91.c +++ b/drivers/rtc/rtc-at91.c | |||
| @@ -292,7 +292,8 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
| 292 | AT91_RTC_CALEV); | 292 | AT91_RTC_CALEV); |
| 293 | 293 | ||
| 294 | ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt, | 294 | ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt, |
| 295 | IRQF_SHARED, "at91_rtc", pdev); | 295 | IRQF_DISABLED | IRQF_SHARED, |
| 296 | "at91_rtc", pdev); | ||
| 296 | if (ret) { | 297 | if (ret) { |
| 297 | printk(KERN_ERR "at91_rtc: IRQ %d already in use.\n", | 298 | printk(KERN_ERR "at91_rtc: IRQ %d already in use.\n", |
| 298 | AT91_ID_SYS); | 299 | AT91_ID_SYS); |
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c index 583789c66cdb..814b9e1873f5 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/rtc-dev.c | |||
| @@ -61,7 +61,9 @@ static void rtc_uie_task(void *data) | |||
| 61 | int err; | 61 | int err; |
| 62 | 62 | ||
| 63 | err = rtc_read_time(&rtc->class_dev, &tm); | 63 | err = rtc_read_time(&rtc->class_dev, &tm); |
| 64 | spin_lock_irq(&rtc->irq_lock); | 64 | |
| 65 | local_irq_disable(); | ||
| 66 | spin_lock(&rtc->irq_lock); | ||
| 65 | if (rtc->stop_uie_polling || err) { | 67 | if (rtc->stop_uie_polling || err) { |
| 66 | rtc->uie_task_active = 0; | 68 | rtc->uie_task_active = 0; |
| 67 | } else if (rtc->oldsecs != tm.tm_sec) { | 69 | } else if (rtc->oldsecs != tm.tm_sec) { |
| @@ -74,11 +76,11 @@ static void rtc_uie_task(void *data) | |||
| 74 | } else if (schedule_work(&rtc->uie_task) == 0) { | 76 | } else if (schedule_work(&rtc->uie_task) == 0) { |
| 75 | rtc->uie_task_active = 0; | 77 | rtc->uie_task_active = 0; |
| 76 | } | 78 | } |
| 77 | spin_unlock_irq(&rtc->irq_lock); | 79 | spin_unlock(&rtc->irq_lock); |
| 78 | if (num) | 80 | if (num) |
| 79 | rtc_update_irq(&rtc->class_dev, num, RTC_UF | RTC_IRQF); | 81 | rtc_update_irq(&rtc->class_dev, num, RTC_UF | RTC_IRQF); |
| 82 | local_irq_enable(); | ||
| 80 | } | 83 | } |
| 81 | |||
| 82 | static void rtc_uie_timer(unsigned long data) | 84 | static void rtc_uie_timer(unsigned long data) |
| 83 | { | 85 | { |
| 84 | struct rtc_device *rtc = (struct rtc_device *)data; | 86 | struct rtc_device *rtc = (struct rtc_device *)data; |
| @@ -214,7 +216,7 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, | |||
| 214 | struct rtc_wkalrm alarm; | 216 | struct rtc_wkalrm alarm; |
| 215 | void __user *uarg = (void __user *) arg; | 217 | void __user *uarg = (void __user *) arg; |
| 216 | 218 | ||
| 217 | /* check that the calles has appropriate permissions | 219 | /* check that the calling task has appropriate permissions |
| 218 | * for certain ioctls. doing this check here is useful | 220 | * for certain ioctls. doing this check here is useful |
| 219 | * to avoid duplicate code in each driver. | 221 | * to avoid duplicate code in each driver. |
| 220 | */ | 222 | */ |
| @@ -238,10 +240,10 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, | |||
| 238 | 240 | ||
| 239 | /* avoid conflicting IRQ users */ | 241 | /* avoid conflicting IRQ users */ |
| 240 | if (cmd == RTC_PIE_ON || cmd == RTC_PIE_OFF || cmd == RTC_IRQP_SET) { | 242 | if (cmd == RTC_PIE_ON || cmd == RTC_PIE_OFF || cmd == RTC_IRQP_SET) { |
| 241 | spin_lock(&rtc->irq_task_lock); | 243 | spin_lock_irq(&rtc->irq_task_lock); |
| 242 | if (rtc->irq_task) | 244 | if (rtc->irq_task) |
| 243 | err = -EBUSY; | 245 | err = -EBUSY; |
| 244 | spin_unlock(&rtc->irq_task_lock); | 246 | spin_unlock_irq(&rtc->irq_task_lock); |
| 245 | 247 | ||
| 246 | if (err < 0) | 248 | if (err < 0) |
| 247 | return err; | 249 | return err; |
| @@ -299,6 +301,17 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, | |||
| 299 | 301 | ||
| 300 | err = rtc_set_time(class_dev, &tm); | 302 | err = rtc_set_time(class_dev, &tm); |
| 301 | break; | 303 | break; |
| 304 | |||
| 305 | case RTC_IRQP_READ: | ||
| 306 | if (ops->irq_set_freq) | ||
| 307 | err = put_user(rtc->irq_freq, (unsigned long *) arg); | ||
| 308 | break; | ||
| 309 | |||
| 310 | case RTC_IRQP_SET: | ||
| 311 | if (ops->irq_set_freq) | ||
| 312 | err = rtc_irq_set_freq(class_dev, rtc->irq_task, arg); | ||
| 313 | break; | ||
| 314 | |||
| 302 | #if 0 | 315 | #if 0 |
| 303 | case RTC_EPOCH_SET: | 316 | case RTC_EPOCH_SET: |
| 304 | #ifndef rtc_epoch | 317 | #ifndef rtc_epoch |
diff --git a/drivers/rtc/rtc-ds1553.c b/drivers/rtc/rtc-ds1553.c index 78552e6e76aa..001eb1123a65 100644 --- a/drivers/rtc/rtc-ds1553.c +++ b/drivers/rtc/rtc-ds1553.c | |||
| @@ -340,7 +340,8 @@ static int __init ds1553_rtc_probe(struct platform_device *pdev) | |||
| 340 | 340 | ||
| 341 | if (pdata->irq >= 0) { | 341 | if (pdata->irq >= 0) { |
| 342 | writeb(0, ioaddr + RTC_INTERRUPTS); | 342 | writeb(0, ioaddr + RTC_INTERRUPTS); |
| 343 | if (request_irq(pdata->irq, ds1553_rtc_interrupt, IRQF_SHARED, | 343 | if (request_irq(pdata->irq, ds1553_rtc_interrupt, |
| 344 | IRQF_DISABLED | IRQF_SHARED, | ||
| 344 | pdev->name, pdev) < 0) { | 345 | pdev->name, pdev) < 0) { |
| 345 | dev_warn(&pdev->dev, "interrupt not available.\n"); | 346 | dev_warn(&pdev->dev, "interrupt not available.\n"); |
| 346 | pdata->irq = -1; | 347 | pdata->irq = -1; |
diff --git a/drivers/rtc/rtc-rs5c372.c b/drivers/rtc/rtc-rs5c372.c index 2a86632580f1..a44fe4efa216 100644 --- a/drivers/rtc/rtc-rs5c372.c +++ b/drivers/rtc/rtc-rs5c372.c | |||
| @@ -126,13 +126,13 @@ static int rs5c372_get_trim(struct i2c_client *client, int *osc, int *trim) | |||
| 126 | return -EIO; | 126 | return -EIO; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | dev_dbg(&client->dev, "%s: raw trim=%x\n", __FUNCTION__, *trim); | ||
| 130 | |||
| 131 | if (osc) | 129 | if (osc) |
| 132 | *osc = (buf & RS5C372_TRIM_XSL) ? 32000 : 32768; | 130 | *osc = (buf & RS5C372_TRIM_XSL) ? 32000 : 32768; |
| 133 | 131 | ||
| 134 | if (trim) | 132 | if (trim) { |
| 135 | *trim = buf & RS5C372_TRIM_MASK; | 133 | *trim = buf & RS5C372_TRIM_MASK; |
| 134 | dev_dbg(&client->dev, "%s: raw trim=%x\n", __FUNCTION__, *trim); | ||
| 135 | } | ||
| 136 | 136 | ||
| 137 | return 0; | 137 | return 0; |
| 138 | } | 138 | } |
diff --git a/drivers/rtc/rtc-test.c b/drivers/rtc/rtc-test.c index bc4bd24508a2..6ef9c62d5032 100644 --- a/drivers/rtc/rtc-test.c +++ b/drivers/rtc/rtc-test.c | |||
| @@ -99,6 +99,7 @@ static ssize_t test_irq_store(struct device *dev, | |||
| 99 | struct rtc_device *rtc = platform_get_drvdata(plat_dev); | 99 | struct rtc_device *rtc = platform_get_drvdata(plat_dev); |
| 100 | 100 | ||
| 101 | retval = count; | 101 | retval = count; |
| 102 | local_irq_disable(); | ||
| 102 | if (strncmp(buf, "tick", 4) == 0) | 103 | if (strncmp(buf, "tick", 4) == 0) |
| 103 | rtc_update_irq(&rtc->class_dev, 1, RTC_PF | RTC_IRQF); | 104 | rtc_update_irq(&rtc->class_dev, 1, RTC_PF | RTC_IRQF); |
| 104 | else if (strncmp(buf, "alarm", 5) == 0) | 105 | else if (strncmp(buf, "alarm", 5) == 0) |
| @@ -107,6 +108,7 @@ static ssize_t test_irq_store(struct device *dev, | |||
| 107 | rtc_update_irq(&rtc->class_dev, 1, RTC_UF | RTC_IRQF); | 108 | rtc_update_irq(&rtc->class_dev, 1, RTC_UF | RTC_IRQF); |
| 108 | else | 109 | else |
| 109 | retval = -EINVAL; | 110 | retval = -EINVAL; |
| 111 | local_irq_enable(); | ||
| 110 | 112 | ||
| 111 | return retval; | 113 | return retval; |
| 112 | } | 114 | } |
diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index 5f8c26cd66ca..b091a0fc4eb0 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c | |||
| @@ -66,6 +66,9 @@ | |||
| 66 | 2.26.02.006 - Fix 9550SX pchip reset timeout. | 66 | 2.26.02.006 - Fix 9550SX pchip reset timeout. |
| 67 | Add big endian support. | 67 | Add big endian support. |
| 68 | 2.26.02.007 - Disable local interrupts during kmap/unmap_atomic(). | 68 | 2.26.02.007 - Disable local interrupts during kmap/unmap_atomic(). |
| 69 | 2.26.02.008 - Free irq handler in __twa_shutdown(). | ||
| 70 | Serialize reset code. | ||
| 71 | Add support for 9650SE controllers. | ||
| 69 | */ | 72 | */ |
| 70 | 73 | ||
| 71 | #include <linux/module.h> | 74 | #include <linux/module.h> |
| @@ -89,7 +92,7 @@ | |||
| 89 | #include "3w-9xxx.h" | 92 | #include "3w-9xxx.h" |
| 90 | 93 | ||
| 91 | /* Globals */ | 94 | /* Globals */ |
| 92 | #define TW_DRIVER_VERSION "2.26.02.007" | 95 | #define TW_DRIVER_VERSION "2.26.02.008" |
| 93 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; | 96 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; |
| 94 | static unsigned int twa_device_extension_count; | 97 | static unsigned int twa_device_extension_count; |
| 95 | static int twa_major = -1; | 98 | static int twa_major = -1; |
| @@ -566,9 +569,9 @@ static int twa_check_srl(TW_Device_Extension *tw_dev, int *flashed) | |||
| 566 | goto out; | 569 | goto out; |
| 567 | } | 570 | } |
| 568 | 571 | ||
| 569 | tw_dev->working_srl = fw_on_ctlr_srl; | 572 | tw_dev->tw_compat_info.working_srl = fw_on_ctlr_srl; |
| 570 | tw_dev->working_branch = fw_on_ctlr_branch; | 573 | tw_dev->tw_compat_info.working_branch = fw_on_ctlr_branch; |
| 571 | tw_dev->working_build = fw_on_ctlr_build; | 574 | tw_dev->tw_compat_info.working_build = fw_on_ctlr_build; |
| 572 | 575 | ||
| 573 | /* Try base mode compatibility */ | 576 | /* Try base mode compatibility */ |
| 574 | if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) { | 577 | if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) { |
| @@ -590,10 +593,23 @@ static int twa_check_srl(TW_Device_Extension *tw_dev, int *flashed) | |||
| 590 | } | 593 | } |
| 591 | goto out; | 594 | goto out; |
| 592 | } | 595 | } |
| 593 | tw_dev->working_srl = TW_BASE_FW_SRL; | 596 | tw_dev->tw_compat_info.working_srl = TW_BASE_FW_SRL; |
| 594 | tw_dev->working_branch = TW_BASE_FW_BRANCH; | 597 | tw_dev->tw_compat_info.working_branch = TW_BASE_FW_BRANCH; |
| 595 | tw_dev->working_build = TW_BASE_FW_BUILD; | 598 | tw_dev->tw_compat_info.working_build = TW_BASE_FW_BUILD; |
| 596 | } | 599 | } |
| 600 | |||
| 601 | /* Load rest of compatibility struct */ | ||
| 602 | strncpy(tw_dev->tw_compat_info.driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION)); | ||
| 603 | tw_dev->tw_compat_info.driver_srl_high = TW_CURRENT_DRIVER_SRL; | ||
| 604 | tw_dev->tw_compat_info.driver_branch_high = TW_CURRENT_DRIVER_BRANCH; | ||
| 605 | tw_dev->tw_compat_info.driver_build_high = TW_CURRENT_DRIVER_BUILD; | ||
| 606 | tw_dev->tw_compat_info.driver_srl_low = TW_BASE_FW_SRL; | ||
| 607 | tw_dev->tw_compat_info.driver_branch_low = TW_BASE_FW_BRANCH; | ||
| 608 | tw_dev->tw_compat_info.driver_build_low = TW_BASE_FW_BUILD; | ||
| 609 | tw_dev->tw_compat_info.fw_on_ctlr_srl = fw_on_ctlr_srl; | ||
| 610 | tw_dev->tw_compat_info.fw_on_ctlr_branch = fw_on_ctlr_branch; | ||
| 611 | tw_dev->tw_compat_info.fw_on_ctlr_build = fw_on_ctlr_build; | ||
| 612 | |||
| 597 | retval = 0; | 613 | retval = 0; |
| 598 | out: | 614 | out: |
| 599 | return retval; | 615 | return retval; |
| @@ -631,7 +647,7 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int | |||
| 631 | goto out2; | 647 | goto out2; |
| 632 | 648 | ||
| 633 | /* Check data buffer size */ | 649 | /* Check data buffer size */ |
| 634 | if (driver_command.buffer_length > TW_MAX_SECTORS * 512) { | 650 | if (driver_command.buffer_length > TW_MAX_SECTORS * 2048) { |
| 635 | retval = TW_IOCTL_ERROR_OS_EINVAL; | 651 | retval = TW_IOCTL_ERROR_OS_EINVAL; |
| 636 | goto out2; | 652 | goto out2; |
| 637 | } | 653 | } |
| @@ -680,13 +696,6 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int | |||
| 680 | /* Now wait for command to complete */ | 696 | /* Now wait for command to complete */ |
| 681 | timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout); | 697 | timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout); |
| 682 | 698 | ||
| 683 | /* See if we reset while waiting for the ioctl to complete */ | ||
| 684 | if (test_bit(TW_IN_RESET, &tw_dev->flags)) { | ||
| 685 | clear_bit(TW_IN_RESET, &tw_dev->flags); | ||
| 686 | retval = TW_IOCTL_ERROR_OS_ERESTARTSYS; | ||
| 687 | goto out3; | ||
| 688 | } | ||
| 689 | |||
| 690 | /* We timed out, and didn't get an interrupt */ | 699 | /* We timed out, and didn't get an interrupt */ |
| 691 | if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) { | 700 | if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) { |
| 692 | /* Now we need to reset the board */ | 701 | /* Now we need to reset the board */ |
| @@ -694,11 +703,6 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int | |||
| 694 | tw_dev->host->host_no, TW_DRIVER, 0xc, | 703 | tw_dev->host->host_no, TW_DRIVER, 0xc, |
| 695 | cmd); | 704 | cmd); |
| 696 | retval = TW_IOCTL_ERROR_OS_EIO; | 705 | retval = TW_IOCTL_ERROR_OS_EIO; |
| 697 | spin_lock_irqsave(tw_dev->host->host_lock, flags); | ||
| 698 | tw_dev->state[request_id] = TW_S_COMPLETED; | ||
| 699 | twa_free_request_id(tw_dev, request_id); | ||
| 700 | tw_dev->posted_request_count--; | ||
| 701 | spin_unlock_irqrestore(tw_dev->host->host_lock, flags); | ||
| 702 | twa_reset_device_extension(tw_dev, 1); | 706 | twa_reset_device_extension(tw_dev, 1); |
| 703 | goto out3; | 707 | goto out3; |
| 704 | } | 708 | } |
| @@ -717,16 +721,7 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int | |||
| 717 | tw_ioctl->driver_command.status = 0; | 721 | tw_ioctl->driver_command.status = 0; |
| 718 | /* Copy compatiblity struct into ioctl data buffer */ | 722 | /* Copy compatiblity struct into ioctl data buffer */ |
| 719 | tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer; | 723 | tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer; |
| 720 | strncpy(tw_compat_info->driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION)); | 724 | memcpy(tw_compat_info, &tw_dev->tw_compat_info, sizeof(TW_Compatibility_Info)); |
| 721 | tw_compat_info->working_srl = tw_dev->working_srl; | ||
| 722 | tw_compat_info->working_branch = tw_dev->working_branch; | ||
| 723 | tw_compat_info->working_build = tw_dev->working_build; | ||
| 724 | tw_compat_info->driver_srl_high = TW_CURRENT_DRIVER_SRL; | ||
| 725 | tw_compat_info->driver_branch_high = TW_CURRENT_DRIVER_BRANCH; | ||
| 726 | tw_compat_info->driver_build_high = TW_CURRENT_DRIVER_BUILD; | ||
| 727 | tw_compat_info->driver_srl_low = TW_BASE_FW_SRL; | ||
| 728 | tw_compat_info->driver_branch_low = TW_BASE_FW_BRANCH; | ||
| 729 | tw_compat_info->driver_build_low = TW_BASE_FW_BUILD; | ||
| 730 | break; | 725 | break; |
| 731 | case TW_IOCTL_GET_LAST_EVENT: | 726 | case TW_IOCTL_GET_LAST_EVENT: |
| 732 | if (tw_dev->event_queue_wrapped) { | 727 | if (tw_dev->event_queue_wrapped) { |
| @@ -895,7 +890,8 @@ static int twa_decode_bits(TW_Device_Extension *tw_dev, u32 status_reg_value) | |||
| 895 | } | 890 | } |
| 896 | 891 | ||
| 897 | if (status_reg_value & TW_STATUS_QUEUE_ERROR) { | 892 | if (status_reg_value & TW_STATUS_QUEUE_ERROR) { |
| 898 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing"); | 893 | if ((tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9650SE) || (!test_bit(TW_IN_RESET, &tw_dev->flags))) |
| 894 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing"); | ||
| 899 | writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev)); | 895 | writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev)); |
| 900 | } | 896 | } |
| 901 | 897 | ||
| @@ -939,10 +935,12 @@ static int twa_empty_response_queue_large(TW_Device_Extension *tw_dev) | |||
| 939 | unsigned long before; | 935 | unsigned long before; |
| 940 | int retval = 1; | 936 | int retval = 1; |
| 941 | 937 | ||
| 942 | if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) { | 938 | if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) || |
| 939 | (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE)) { | ||
| 943 | before = jiffies; | 940 | before = jiffies; |
| 944 | while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != TW_9550SX_DRAIN_COMPLETED) { | 941 | while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != TW_9550SX_DRAIN_COMPLETED) { |
| 945 | response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev)); | 942 | response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev)); |
| 943 | msleep(1); | ||
| 946 | if (time_after(jiffies, before + HZ * 30)) | 944 | if (time_after(jiffies, before + HZ * 30)) |
| 947 | goto out; | 945 | goto out; |
| 948 | } | 946 | } |
| @@ -1214,6 +1212,10 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance) | |||
| 1214 | 1212 | ||
| 1215 | handled = 1; | 1213 | handled = 1; |
| 1216 | 1214 | ||
| 1215 | /* If we are resetting, bail */ | ||
| 1216 | if (test_bit(TW_IN_RESET, &tw_dev->flags)) | ||
| 1217 | goto twa_interrupt_bail; | ||
| 1218 | |||
| 1217 | /* Check controller for errors */ | 1219 | /* Check controller for errors */ |
| 1218 | if (twa_check_bits(status_reg_value)) { | 1220 | if (twa_check_bits(status_reg_value)) { |
| 1219 | if (twa_decode_bits(tw_dev, status_reg_value)) { | 1221 | if (twa_decode_bits(tw_dev, status_reg_value)) { |
| @@ -1355,8 +1357,8 @@ static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, d | |||
| 1355 | 1357 | ||
| 1356 | if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) { | 1358 | if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) { |
| 1357 | newcommand = &full_command_packet->command.newcommand; | 1359 | newcommand = &full_command_packet->command.newcommand; |
| 1358 | newcommand->request_id__lunl = | 1360 | newcommand->request_id__lunl = |
| 1359 | TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id); | 1361 | cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id)); |
| 1360 | newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); | 1362 | newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); |
| 1361 | newcommand->sg_list[0].length = cpu_to_le32(length); | 1363 | newcommand->sg_list[0].length = cpu_to_le32(length); |
| 1362 | newcommand->sgl_entries__lunh = | 1364 | newcommand->sgl_entries__lunh = |
| @@ -1531,6 +1533,13 @@ static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, | |||
| 1531 | int retval = 1; | 1533 | int retval = 1; |
| 1532 | 1534 | ||
| 1533 | command_que_value = tw_dev->command_packet_phys[request_id]; | 1535 | command_que_value = tw_dev->command_packet_phys[request_id]; |
| 1536 | |||
| 1537 | /* For 9650SE write low 4 bytes first */ | ||
| 1538 | if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) { | ||
| 1539 | command_que_value += TW_COMMAND_OFFSET; | ||
| 1540 | writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev)); | ||
| 1541 | } | ||
| 1542 | |||
| 1534 | status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev)); | 1543 | status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev)); |
| 1535 | 1544 | ||
| 1536 | if (twa_check_bits(status_reg_value)) | 1545 | if (twa_check_bits(status_reg_value)) |
| @@ -1557,13 +1566,17 @@ static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, | |||
| 1557 | TW_UNMASK_COMMAND_INTERRUPT(tw_dev); | 1566 | TW_UNMASK_COMMAND_INTERRUPT(tw_dev); |
| 1558 | goto out; | 1567 | goto out; |
| 1559 | } else { | 1568 | } else { |
| 1560 | /* We successfully posted the command packet */ | 1569 | if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) { |
| 1561 | if (sizeof(dma_addr_t) > 4) { | 1570 | /* Now write upper 4 bytes */ |
| 1562 | command_que_value += TW_COMMAND_OFFSET; | 1571 | writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev) + 0x4); |
| 1563 | writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); | ||
| 1564 | writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4); | ||
| 1565 | } else { | 1572 | } else { |
| 1566 | writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); | 1573 | if (sizeof(dma_addr_t) > 4) { |
| 1574 | command_que_value += TW_COMMAND_OFFSET; | ||
| 1575 | writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); | ||
| 1576 | writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4); | ||
| 1577 | } else { | ||
| 1578 | writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); | ||
| 1579 | } | ||
| 1567 | } | 1580 | } |
| 1568 | tw_dev->state[request_id] = TW_S_POSTED; | 1581 | tw_dev->state[request_id] = TW_S_POSTED; |
| 1569 | tw_dev->posted_request_count++; | 1582 | tw_dev->posted_request_count++; |
| @@ -1620,14 +1633,9 @@ static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_res | |||
| 1620 | goto out; | 1633 | goto out; |
| 1621 | 1634 | ||
| 1622 | TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev); | 1635 | TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev); |
| 1636 | clear_bit(TW_IN_RESET, &tw_dev->flags); | ||
| 1637 | tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; | ||
| 1623 | 1638 | ||
| 1624 | /* Wake up any ioctl that was pending before the reset */ | ||
| 1625 | if ((tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE) || (ioctl_reset)) { | ||
| 1626 | clear_bit(TW_IN_RESET, &tw_dev->flags); | ||
| 1627 | } else { | ||
| 1628 | tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; | ||
| 1629 | wake_up(&tw_dev->ioctl_wqueue); | ||
| 1630 | } | ||
| 1631 | retval = 0; | 1639 | retval = 0; |
| 1632 | out: | 1640 | out: |
| 1633 | return retval; | 1641 | return retval; |
| @@ -1736,6 +1744,9 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt) | |||
| 1736 | "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n", | 1744 | "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n", |
| 1737 | TW_DRIVER, 0x2c, SCpnt->cmnd[0]); | 1745 | TW_DRIVER, 0x2c, SCpnt->cmnd[0]); |
| 1738 | 1746 | ||
| 1747 | /* Make sure we are not issuing an ioctl or resetting from ioctl */ | ||
| 1748 | mutex_lock(&tw_dev->ioctl_lock); | ||
| 1749 | |||
| 1739 | /* Now reset the card and some of the device extension data */ | 1750 | /* Now reset the card and some of the device extension data */ |
| 1740 | if (twa_reset_device_extension(tw_dev, 0)) { | 1751 | if (twa_reset_device_extension(tw_dev, 0)) { |
| 1741 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset"); | 1752 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset"); |
| @@ -1744,6 +1755,7 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt) | |||
| 1744 | 1755 | ||
| 1745 | retval = SUCCESS; | 1756 | retval = SUCCESS; |
| 1746 | out: | 1757 | out: |
| 1758 | mutex_unlock(&tw_dev->ioctl_lock); | ||
| 1747 | return retval; | 1759 | return retval; |
| 1748 | } /* End twa_scsi_eh_reset() */ | 1760 | } /* End twa_scsi_eh_reset() */ |
| 1749 | 1761 | ||
| @@ -1753,8 +1765,14 @@ static int twa_scsi_queue(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd | |||
| 1753 | int request_id, retval; | 1765 | int request_id, retval; |
| 1754 | TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; | 1766 | TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; |
| 1755 | 1767 | ||
| 1768 | /* If we are resetting due to timed out ioctl, report as busy */ | ||
| 1769 | if (test_bit(TW_IN_RESET, &tw_dev->flags)) { | ||
| 1770 | retval = SCSI_MLQUEUE_HOST_BUSY; | ||
| 1771 | goto out; | ||
| 1772 | } | ||
| 1773 | |||
| 1756 | /* Check if this FW supports luns */ | 1774 | /* Check if this FW supports luns */ |
| 1757 | if ((SCpnt->device->lun != 0) && (tw_dev->working_srl < TW_FW_SRL_LUNS_SUPPORTED)) { | 1775 | if ((SCpnt->device->lun != 0) && (tw_dev->tw_compat_info.working_srl < TW_FW_SRL_LUNS_SUPPORTED)) { |
| 1758 | SCpnt->result = (DID_BAD_TARGET << 16); | 1776 | SCpnt->result = (DID_BAD_TARGET << 16); |
| 1759 | done(SCpnt); | 1777 | done(SCpnt); |
| 1760 | retval = 0; | 1778 | retval = 0; |
| @@ -1960,6 +1978,9 @@ static void __twa_shutdown(TW_Device_Extension *tw_dev) | |||
| 1960 | /* Disable interrupts */ | 1978 | /* Disable interrupts */ |
| 1961 | TW_DISABLE_INTERRUPTS(tw_dev); | 1979 | TW_DISABLE_INTERRUPTS(tw_dev); |
| 1962 | 1980 | ||
| 1981 | /* Free up the IRQ */ | ||
| 1982 | free_irq(tw_dev->tw_pci_dev->irq, tw_dev); | ||
| 1983 | |||
| 1963 | printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no); | 1984 | printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no); |
| 1964 | 1985 | ||
| 1965 | /* Tell the card we are shutting down */ | 1986 | /* Tell the card we are shutting down */ |
| @@ -2091,21 +2112,25 @@ static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id | |||
| 2091 | 2112 | ||
| 2092 | /* Initialize the card */ | 2113 | /* Initialize the card */ |
| 2093 | if (twa_reset_sequence(tw_dev, 0)) | 2114 | if (twa_reset_sequence(tw_dev, 0)) |
| 2094 | goto out_release_mem_region; | 2115 | goto out_iounmap; |
| 2095 | 2116 | ||
| 2096 | /* Set host specific parameters */ | 2117 | /* Set host specific parameters */ |
| 2097 | host->max_id = TW_MAX_UNITS; | 2118 | if (pdev->device == PCI_DEVICE_ID_3WARE_9650SE) |
| 2119 | host->max_id = TW_MAX_UNITS_9650SE; | ||
| 2120 | else | ||
| 2121 | host->max_id = TW_MAX_UNITS; | ||
| 2122 | |||
| 2098 | host->max_cmd_len = TW_MAX_CDB_LEN; | 2123 | host->max_cmd_len = TW_MAX_CDB_LEN; |
| 2099 | 2124 | ||
| 2100 | /* Channels aren't supported by adapter */ | 2125 | /* Channels aren't supported by adapter */ |
| 2101 | host->max_lun = TW_MAX_LUNS(tw_dev->working_srl); | 2126 | host->max_lun = TW_MAX_LUNS(tw_dev->tw_compat_info.working_srl); |
| 2102 | host->max_channel = 0; | 2127 | host->max_channel = 0; |
| 2103 | 2128 | ||
| 2104 | /* Register the card with the kernel SCSI layer */ | 2129 | /* Register the card with the kernel SCSI layer */ |
| 2105 | retval = scsi_add_host(host, &pdev->dev); | 2130 | retval = scsi_add_host(host, &pdev->dev); |
| 2106 | if (retval) { | 2131 | if (retval) { |
| 2107 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed"); | 2132 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed"); |
| 2108 | goto out_release_mem_region; | 2133 | goto out_iounmap; |
| 2109 | } | 2134 | } |
| 2110 | 2135 | ||
| 2111 | pci_set_drvdata(pdev, host); | 2136 | pci_set_drvdata(pdev, host); |
| @@ -2145,6 +2170,8 @@ static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id | |||
| 2145 | 2170 | ||
| 2146 | out_remove_host: | 2171 | out_remove_host: |
| 2147 | scsi_remove_host(host); | 2172 | scsi_remove_host(host); |
| 2173 | out_iounmap: | ||
| 2174 | iounmap(tw_dev->base_addr); | ||
| 2148 | out_release_mem_region: | 2175 | out_release_mem_region: |
| 2149 | pci_release_regions(pdev); | 2176 | pci_release_regions(pdev); |
| 2150 | out_free_device_extension: | 2177 | out_free_device_extension: |
| @@ -2170,12 +2197,12 @@ static void twa_remove(struct pci_dev *pdev) | |||
| 2170 | twa_major = -1; | 2197 | twa_major = -1; |
| 2171 | } | 2198 | } |
| 2172 | 2199 | ||
| 2173 | /* Free up the IRQ */ | ||
| 2174 | free_irq(tw_dev->tw_pci_dev->irq, tw_dev); | ||
| 2175 | |||
| 2176 | /* Shutdown the card */ | 2200 | /* Shutdown the card */ |
| 2177 | __twa_shutdown(tw_dev); | 2201 | __twa_shutdown(tw_dev); |
| 2178 | 2202 | ||
| 2203 | /* Free IO remapping */ | ||
| 2204 | iounmap(tw_dev->base_addr); | ||
| 2205 | |||
| 2179 | /* Free up the mem region */ | 2206 | /* Free up the mem region */ |
| 2180 | pci_release_regions(pdev); | 2207 | pci_release_regions(pdev); |
| 2181 | 2208 | ||
| @@ -2193,6 +2220,8 @@ static struct pci_device_id twa_pci_tbl[] __devinitdata = { | |||
| 2193 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 2220 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, |
| 2194 | { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX, | 2221 | { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX, |
| 2195 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 2222 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, |
| 2223 | { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9650SE, | ||
| 2224 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | ||
| 2196 | { } | 2225 | { } |
| 2197 | }; | 2226 | }; |
| 2198 | MODULE_DEVICE_TABLE(pci, twa_pci_tbl); | 2227 | MODULE_DEVICE_TABLE(pci, twa_pci_tbl); |
diff --git a/drivers/scsi/3w-9xxx.h b/drivers/scsi/3w-9xxx.h index e5685be96f45..7901517d4513 100644 --- a/drivers/scsi/3w-9xxx.h +++ b/drivers/scsi/3w-9xxx.h | |||
| @@ -289,7 +289,6 @@ static twa_message_type twa_error_table[] = { | |||
| 289 | #define TW_STATUS_VALID_INTERRUPT 0x00DF0000 | 289 | #define TW_STATUS_VALID_INTERRUPT 0x00DF0000 |
| 290 | 290 | ||
| 291 | /* PCI related defines */ | 291 | /* PCI related defines */ |
| 292 | #define TW_NUMDEVICES 1 | ||
| 293 | #define TW_PCI_CLEAR_PARITY_ERRORS 0xc100 | 292 | #define TW_PCI_CLEAR_PARITY_ERRORS 0xc100 |
| 294 | #define TW_PCI_CLEAR_PCI_ABORT 0x2000 | 293 | #define TW_PCI_CLEAR_PCI_ABORT 0x2000 |
| 295 | 294 | ||
| @@ -335,6 +334,7 @@ static twa_message_type twa_error_table[] = { | |||
| 335 | #define TW_ALIGNMENT_9000 4 /* 4 bytes */ | 334 | #define TW_ALIGNMENT_9000 4 /* 4 bytes */ |
| 336 | #define TW_ALIGNMENT_9000_SGL 0x3 | 335 | #define TW_ALIGNMENT_9000_SGL 0x3 |
| 337 | #define TW_MAX_UNITS 16 | 336 | #define TW_MAX_UNITS 16 |
| 337 | #define TW_MAX_UNITS_9650SE 32 | ||
| 338 | #define TW_INIT_MESSAGE_CREDITS 0x100 | 338 | #define TW_INIT_MESSAGE_CREDITS 0x100 |
| 339 | #define TW_INIT_COMMAND_PACKET_SIZE 0x3 | 339 | #define TW_INIT_COMMAND_PACKET_SIZE 0x3 |
| 340 | #define TW_INIT_COMMAND_PACKET_SIZE_EXTENDED 0x6 | 340 | #define TW_INIT_COMMAND_PACKET_SIZE_EXTENDED 0x6 |
| @@ -354,7 +354,6 @@ static twa_message_type twa_error_table[] = { | |||
| 354 | #define TW_MAX_RESPONSE_DRAIN 256 | 354 | #define TW_MAX_RESPONSE_DRAIN 256 |
| 355 | #define TW_MAX_AEN_DRAIN 40 | 355 | #define TW_MAX_AEN_DRAIN 40 |
| 356 | #define TW_IN_RESET 2 | 356 | #define TW_IN_RESET 2 |
| 357 | #define TW_IN_CHRDEV_IOCTL 3 | ||
| 358 | #define TW_IN_ATTENTION_LOOP 4 | 357 | #define TW_IN_ATTENTION_LOOP 4 |
| 359 | #define TW_MAX_SECTORS 256 | 358 | #define TW_MAX_SECTORS 256 |
| 360 | #define TW_AEN_WAIT_TIME 1000 | 359 | #define TW_AEN_WAIT_TIME 1000 |
| @@ -417,6 +416,9 @@ static twa_message_type twa_error_table[] = { | |||
| 417 | #ifndef PCI_DEVICE_ID_3WARE_9550SX | 416 | #ifndef PCI_DEVICE_ID_3WARE_9550SX |
| 418 | #define PCI_DEVICE_ID_3WARE_9550SX 0x1003 | 417 | #define PCI_DEVICE_ID_3WARE_9550SX 0x1003 |
| 419 | #endif | 418 | #endif |
| 419 | #ifndef PCI_DEVICE_ID_3WARE_9650SE | ||
| 420 | #define PCI_DEVICE_ID_3WARE_9650SE 0x1004 | ||
| 421 | #endif | ||
| 420 | 422 | ||
| 421 | /* Bitmask macros to eliminate bitfields */ | 423 | /* Bitmask macros to eliminate bitfields */ |
| 422 | 424 | ||
| @@ -442,6 +444,7 @@ static twa_message_type twa_error_table[] = { | |||
| 442 | #define TW_CONTROL_REG_ADDR(x) (x->base_addr) | 444 | #define TW_CONTROL_REG_ADDR(x) (x->base_addr) |
| 443 | #define TW_STATUS_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0x4) | 445 | #define TW_STATUS_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0x4) |
| 444 | #define TW_COMMAND_QUEUE_REG_ADDR(x) (sizeof(dma_addr_t) > 4 ? ((unsigned char __iomem *)x->base_addr + 0x20) : ((unsigned char __iomem *)x->base_addr + 0x8)) | 446 | #define TW_COMMAND_QUEUE_REG_ADDR(x) (sizeof(dma_addr_t) > 4 ? ((unsigned char __iomem *)x->base_addr + 0x20) : ((unsigned char __iomem *)x->base_addr + 0x8)) |
| 447 | #define TW_COMMAND_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x20) | ||
| 445 | #define TW_RESPONSE_QUEUE_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0xC) | 448 | #define TW_RESPONSE_QUEUE_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0xC) |
| 446 | #define TW_RESPONSE_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x30) | 449 | #define TW_RESPONSE_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x30) |
| 447 | #define TW_CLEAR_ALL_INTERRUPTS(x) (writel(TW_STATUS_VALID_INTERRUPT, TW_CONTROL_REG_ADDR(x))) | 450 | #define TW_CLEAR_ALL_INTERRUPTS(x) (writel(TW_STATUS_VALID_INTERRUPT, TW_CONTROL_REG_ADDR(x))) |
| @@ -626,6 +629,9 @@ typedef struct TAG_TW_Compatibility_Info | |||
| 626 | unsigned short driver_srl_low; | 629 | unsigned short driver_srl_low; |
| 627 | unsigned short driver_branch_low; | 630 | unsigned short driver_branch_low; |
| 628 | unsigned short driver_build_low; | 631 | unsigned short driver_build_low; |
| 632 | unsigned short fw_on_ctlr_srl; | ||
| 633 | unsigned short fw_on_ctlr_branch; | ||
| 634 | unsigned short fw_on_ctlr_build; | ||
| 629 | } TW_Compatibility_Info; | 635 | } TW_Compatibility_Info; |
| 630 | 636 | ||
| 631 | #pragma pack() | 637 | #pragma pack() |
| @@ -668,9 +674,7 @@ typedef struct TAG_TW_Device_Extension { | |||
| 668 | wait_queue_head_t ioctl_wqueue; | 674 | wait_queue_head_t ioctl_wqueue; |
| 669 | struct mutex ioctl_lock; | 675 | struct mutex ioctl_lock; |
| 670 | char aen_clobber; | 676 | char aen_clobber; |
| 671 | unsigned short working_srl; | 677 | TW_Compatibility_Info tw_compat_info; |
| 672 | unsigned short working_branch; | ||
| 673 | unsigned short working_build; | ||
| 674 | } TW_Device_Extension; | 678 | } TW_Device_Extension; |
| 675 | 679 | ||
| 676 | #endif /* _3W_9XXX_H */ | 680 | #endif /* _3W_9XXX_H */ |
diff --git a/drivers/scsi/aic94xx/aic94xx_hwi.c b/drivers/scsi/aic94xx/aic94xx_hwi.c index 3c2d7a379931..af7e01134364 100644 --- a/drivers/scsi/aic94xx/aic94xx_hwi.c +++ b/drivers/scsi/aic94xx/aic94xx_hwi.c | |||
| @@ -112,6 +112,21 @@ static int asd_init_phy(struct asd_phy *phy) | |||
| 112 | return 0; | 112 | return 0; |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | static void asd_init_ports(struct asd_ha_struct *asd_ha) | ||
| 116 | { | ||
| 117 | int i; | ||
| 118 | |||
| 119 | spin_lock_init(&asd_ha->asd_ports_lock); | ||
| 120 | for (i = 0; i < ASD_MAX_PHYS; i++) { | ||
| 121 | struct asd_port *asd_port = &asd_ha->asd_ports[i]; | ||
| 122 | |||
| 123 | memset(asd_port->sas_addr, 0, SAS_ADDR_SIZE); | ||
| 124 | memset(asd_port->attached_sas_addr, 0, SAS_ADDR_SIZE); | ||
| 125 | asd_port->phy_mask = 0; | ||
| 126 | asd_port->num_phys = 0; | ||
| 127 | } | ||
| 128 | } | ||
| 129 | |||
| 115 | static int asd_init_phys(struct asd_ha_struct *asd_ha) | 130 | static int asd_init_phys(struct asd_ha_struct *asd_ha) |
| 116 | { | 131 | { |
| 117 | u8 i; | 132 | u8 i; |
| @@ -121,6 +136,7 @@ static int asd_init_phys(struct asd_ha_struct *asd_ha) | |||
| 121 | struct asd_phy *phy = &asd_ha->phys[i]; | 136 | struct asd_phy *phy = &asd_ha->phys[i]; |
| 122 | 137 | ||
| 123 | phy->phy_desc = &asd_ha->hw_prof.phy_desc[i]; | 138 | phy->phy_desc = &asd_ha->hw_prof.phy_desc[i]; |
| 139 | phy->asd_port = NULL; | ||
| 124 | 140 | ||
| 125 | phy->sas_phy.enabled = 0; | 141 | phy->sas_phy.enabled = 0; |
| 126 | phy->sas_phy.id = i; | 142 | phy->sas_phy.id = i; |
| @@ -658,6 +674,8 @@ int asd_init_hw(struct asd_ha_struct *asd_ha) | |||
| 658 | goto Out; | 674 | goto Out; |
| 659 | } | 675 | } |
| 660 | 676 | ||
| 677 | asd_init_ports(asd_ha); | ||
| 678 | |||
| 661 | err = asd_init_scbs(asd_ha); | 679 | err = asd_init_scbs(asd_ha); |
| 662 | if (err) { | 680 | if (err) { |
| 663 | asd_printk("couldn't initialize scbs for %s\n", | 681 | asd_printk("couldn't initialize scbs for %s\n", |
diff --git a/drivers/scsi/aic94xx/aic94xx_hwi.h b/drivers/scsi/aic94xx/aic94xx_hwi.h index 7b6aca02cf70..c6c3d18222fa 100644 --- a/drivers/scsi/aic94xx/aic94xx_hwi.h +++ b/drivers/scsi/aic94xx/aic94xx_hwi.h | |||
| @@ -193,6 +193,16 @@ struct asd_seq_data { | |||
| 193 | struct asd_ascb **escb_arr; /* array of pointers to escbs */ | 193 | struct asd_ascb **escb_arr; /* array of pointers to escbs */ |
| 194 | }; | 194 | }; |
| 195 | 195 | ||
| 196 | /* This is an internal port structure. These are used to get accurate | ||
| 197 | * phy_mask for updating DDB 0. | ||
| 198 | */ | ||
| 199 | struct asd_port { | ||
| 200 | u8 sas_addr[SAS_ADDR_SIZE]; | ||
| 201 | u8 attached_sas_addr[SAS_ADDR_SIZE]; | ||
| 202 | u32 phy_mask; | ||
| 203 | int num_phys; | ||
| 204 | }; | ||
| 205 | |||
| 196 | /* This is the Host Adapter structure. It describes the hardware | 206 | /* This is the Host Adapter structure. It describes the hardware |
| 197 | * SAS adapter. | 207 | * SAS adapter. |
| 198 | */ | 208 | */ |
| @@ -211,6 +221,8 @@ struct asd_ha_struct { | |||
| 211 | struct hw_profile hw_prof; | 221 | struct hw_profile hw_prof; |
| 212 | 222 | ||
| 213 | struct asd_phy phys[ASD_MAX_PHYS]; | 223 | struct asd_phy phys[ASD_MAX_PHYS]; |
| 224 | spinlock_t asd_ports_lock; | ||
| 225 | struct asd_port asd_ports[ASD_MAX_PHYS]; | ||
| 214 | struct asd_sas_port ports[ASD_MAX_PHYS]; | 226 | struct asd_sas_port ports[ASD_MAX_PHYS]; |
| 215 | 227 | ||
| 216 | struct dma_pool *scb_pool; | 228 | struct dma_pool *scb_pool; |
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c index a4cc432bbdab..57c5ba4043f2 100644 --- a/drivers/scsi/aic94xx/aic94xx_init.c +++ b/drivers/scsi/aic94xx/aic94xx_init.c | |||
| @@ -786,8 +786,6 @@ static void asd_remove_driver_attrs(struct device_driver *driver) | |||
| 786 | } | 786 | } |
| 787 | 787 | ||
| 788 | static struct sas_domain_function_template aic94xx_transport_functions = { | 788 | static struct sas_domain_function_template aic94xx_transport_functions = { |
| 789 | .lldd_port_formed = asd_update_port_links, | ||
| 790 | |||
| 791 | .lldd_dev_found = asd_dev_found, | 789 | .lldd_dev_found = asd_dev_found, |
| 792 | .lldd_dev_gone = asd_dev_gone, | 790 | .lldd_dev_gone = asd_dev_gone, |
| 793 | 791 | ||
diff --git a/drivers/scsi/aic94xx/aic94xx_sas.h b/drivers/scsi/aic94xx/aic94xx_sas.h index 64d231712345..9050e93bfd5e 100644 --- a/drivers/scsi/aic94xx/aic94xx_sas.h +++ b/drivers/scsi/aic94xx/aic94xx_sas.h | |||
| @@ -733,6 +733,7 @@ struct asd_phy { | |||
| 733 | 733 | ||
| 734 | struct sas_identify_frame *identify_frame; | 734 | struct sas_identify_frame *identify_frame; |
| 735 | struct asd_dma_tok *id_frm_tok; | 735 | struct asd_dma_tok *id_frm_tok; |
| 736 | struct asd_port *asd_port; | ||
| 736 | 737 | ||
| 737 | u8 frame_rcvd[ASD_EDB_SIZE]; | 738 | u8 frame_rcvd[ASD_EDB_SIZE]; |
| 738 | }; | 739 | }; |
diff --git a/drivers/scsi/aic94xx/aic94xx_scb.c b/drivers/scsi/aic94xx/aic94xx_scb.c index 7ee49b51b724..b15caf1c8fa2 100644 --- a/drivers/scsi/aic94xx/aic94xx_scb.c +++ b/drivers/scsi/aic94xx/aic94xx_scb.c | |||
| @@ -168,6 +168,70 @@ static inline void asd_get_attached_sas_addr(struct asd_phy *phy, u8 *sas_addr) | |||
| 168 | } | 168 | } |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | static void asd_form_port(struct asd_ha_struct *asd_ha, struct asd_phy *phy) | ||
| 172 | { | ||
| 173 | int i; | ||
| 174 | struct asd_port *free_port = NULL; | ||
| 175 | struct asd_port *port; | ||
| 176 | struct asd_sas_phy *sas_phy = &phy->sas_phy; | ||
| 177 | unsigned long flags; | ||
| 178 | |||
| 179 | spin_lock_irqsave(&asd_ha->asd_ports_lock, flags); | ||
| 180 | if (!phy->asd_port) { | ||
| 181 | for (i = 0; i < ASD_MAX_PHYS; i++) { | ||
| 182 | port = &asd_ha->asd_ports[i]; | ||
| 183 | |||
| 184 | /* Check for wide port */ | ||
| 185 | if (port->num_phys > 0 && | ||
| 186 | memcmp(port->sas_addr, sas_phy->sas_addr, | ||
| 187 | SAS_ADDR_SIZE) == 0 && | ||
| 188 | memcmp(port->attached_sas_addr, | ||
| 189 | sas_phy->attached_sas_addr, | ||
| 190 | SAS_ADDR_SIZE) == 0) { | ||
| 191 | break; | ||
| 192 | } | ||
| 193 | |||
| 194 | /* Find a free port */ | ||
| 195 | if (port->num_phys == 0 && free_port == NULL) { | ||
| 196 | free_port = port; | ||
| 197 | } | ||
| 198 | } | ||
| 199 | |||
| 200 | /* Use a free port if this doesn't form a wide port */ | ||
| 201 | if (i >= ASD_MAX_PHYS) { | ||
| 202 | port = free_port; | ||
| 203 | BUG_ON(!port); | ||
| 204 | memcpy(port->sas_addr, sas_phy->sas_addr, | ||
| 205 | SAS_ADDR_SIZE); | ||
| 206 | memcpy(port->attached_sas_addr, | ||
| 207 | sas_phy->attached_sas_addr, | ||
| 208 | SAS_ADDR_SIZE); | ||
| 209 | } | ||
| 210 | port->num_phys++; | ||
| 211 | port->phy_mask |= (1U << sas_phy->id); | ||
| 212 | phy->asd_port = port; | ||
| 213 | } | ||
| 214 | ASD_DPRINTK("%s: updating phy_mask 0x%x for phy%d\n", | ||
| 215 | __FUNCTION__, phy->asd_port->phy_mask, sas_phy->id); | ||
| 216 | asd_update_port_links(asd_ha, phy); | ||
| 217 | spin_unlock_irqrestore(&asd_ha->asd_ports_lock, flags); | ||
| 218 | } | ||
| 219 | |||
| 220 | static void asd_deform_port(struct asd_ha_struct *asd_ha, struct asd_phy *phy) | ||
| 221 | { | ||
| 222 | struct asd_port *port = phy->asd_port; | ||
| 223 | struct asd_sas_phy *sas_phy = &phy->sas_phy; | ||
| 224 | unsigned long flags; | ||
| 225 | |||
| 226 | spin_lock_irqsave(&asd_ha->asd_ports_lock, flags); | ||
| 227 | if (port) { | ||
| 228 | port->num_phys--; | ||
| 229 | port->phy_mask &= ~(1U << sas_phy->id); | ||
| 230 | phy->asd_port = NULL; | ||
| 231 | } | ||
| 232 | spin_unlock_irqrestore(&asd_ha->asd_ports_lock, flags); | ||
| 233 | } | ||
| 234 | |||
| 171 | static inline void asd_bytes_dmaed_tasklet(struct asd_ascb *ascb, | 235 | static inline void asd_bytes_dmaed_tasklet(struct asd_ascb *ascb, |
| 172 | struct done_list_struct *dl, | 236 | struct done_list_struct *dl, |
| 173 | int edb_id, int phy_id) | 237 | int edb_id, int phy_id) |
| @@ -187,6 +251,7 @@ static inline void asd_bytes_dmaed_tasklet(struct asd_ascb *ascb, | |||
| 187 | asd_get_attached_sas_addr(phy, phy->sas_phy.attached_sas_addr); | 251 | asd_get_attached_sas_addr(phy, phy->sas_phy.attached_sas_addr); |
| 188 | spin_unlock_irqrestore(&phy->sas_phy.frame_rcvd_lock, flags); | 252 | spin_unlock_irqrestore(&phy->sas_phy.frame_rcvd_lock, flags); |
| 189 | asd_dump_frame_rcvd(phy, dl); | 253 | asd_dump_frame_rcvd(phy, dl); |
| 254 | asd_form_port(ascb->ha, phy); | ||
| 190 | sas_ha->notify_port_event(&phy->sas_phy, PORTE_BYTES_DMAED); | 255 | sas_ha->notify_port_event(&phy->sas_phy, PORTE_BYTES_DMAED); |
| 191 | } | 256 | } |
| 192 | 257 | ||
| @@ -197,6 +262,7 @@ static inline void asd_link_reset_err_tasklet(struct asd_ascb *ascb, | |||
| 197 | struct asd_ha_struct *asd_ha = ascb->ha; | 262 | struct asd_ha_struct *asd_ha = ascb->ha; |
| 198 | struct sas_ha_struct *sas_ha = &asd_ha->sas_ha; | 263 | struct sas_ha_struct *sas_ha = &asd_ha->sas_ha; |
| 199 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; | 264 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; |
| 265 | struct asd_phy *phy = &asd_ha->phys[phy_id]; | ||
| 200 | u8 lr_error = dl->status_block[1]; | 266 | u8 lr_error = dl->status_block[1]; |
| 201 | u8 retries_left = dl->status_block[2]; | 267 | u8 retries_left = dl->status_block[2]; |
| 202 | 268 | ||
| @@ -221,6 +287,7 @@ static inline void asd_link_reset_err_tasklet(struct asd_ascb *ascb, | |||
| 221 | 287 | ||
| 222 | asd_turn_led(asd_ha, phy_id, 0); | 288 | asd_turn_led(asd_ha, phy_id, 0); |
| 223 | sas_phy_disconnected(sas_phy); | 289 | sas_phy_disconnected(sas_phy); |
| 290 | asd_deform_port(asd_ha, phy); | ||
| 224 | sas_ha->notify_port_event(sas_phy, PORTE_LINK_RESET_ERR); | 291 | sas_ha->notify_port_event(sas_phy, PORTE_LINK_RESET_ERR); |
| 225 | 292 | ||
| 226 | if (retries_left == 0) { | 293 | if (retries_left == 0) { |
| @@ -248,6 +315,8 @@ static inline void asd_primitive_rcvd_tasklet(struct asd_ascb *ascb, | |||
| 248 | unsigned long flags; | 315 | unsigned long flags; |
| 249 | struct sas_ha_struct *sas_ha = &ascb->ha->sas_ha; | 316 | struct sas_ha_struct *sas_ha = &ascb->ha->sas_ha; |
| 250 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; | 317 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; |
| 318 | struct asd_ha_struct *asd_ha = ascb->ha; | ||
| 319 | struct asd_phy *phy = &asd_ha->phys[phy_id]; | ||
| 251 | u8 reg = dl->status_block[1]; | 320 | u8 reg = dl->status_block[1]; |
| 252 | u32 cont = dl->status_block[2] << ((reg & 3)*8); | 321 | u32 cont = dl->status_block[2] << ((reg & 3)*8); |
| 253 | 322 | ||
| @@ -284,6 +353,7 @@ static inline void asd_primitive_rcvd_tasklet(struct asd_ascb *ascb, | |||
| 284 | phy_id); | 353 | phy_id); |
| 285 | /* The sequencer disables all phys on that port. | 354 | /* The sequencer disables all phys on that port. |
| 286 | * We have to re-enable the phys ourselves. */ | 355 | * We have to re-enable the phys ourselves. */ |
| 356 | asd_deform_port(asd_ha, phy); | ||
| 287 | sas_ha->notify_port_event(sas_phy, PORTE_HARD_RESET); | 357 | sas_ha->notify_port_event(sas_phy, PORTE_HARD_RESET); |
| 288 | break; | 358 | break; |
| 289 | 359 | ||
| @@ -351,6 +421,7 @@ static void escb_tasklet_complete(struct asd_ascb *ascb, | |||
| 351 | u8 sb_opcode = dl->status_block[0]; | 421 | u8 sb_opcode = dl->status_block[0]; |
| 352 | int phy_id = sb_opcode & DL_PHY_MASK; | 422 | int phy_id = sb_opcode & DL_PHY_MASK; |
| 353 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; | 423 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; |
| 424 | struct asd_phy *phy = &asd_ha->phys[phy_id]; | ||
| 354 | 425 | ||
| 355 | if (edb > 6 || edb < 0) { | 426 | if (edb > 6 || edb < 0) { |
| 356 | ASD_DPRINTK("edb is 0x%x! dl->opcode is 0x%x\n", | 427 | ASD_DPRINTK("edb is 0x%x! dl->opcode is 0x%x\n", |
| @@ -395,6 +466,7 @@ static void escb_tasklet_complete(struct asd_ascb *ascb, | |||
| 395 | asd_turn_led(asd_ha, phy_id, 0); | 466 | asd_turn_led(asd_ha, phy_id, 0); |
| 396 | /* the device is gone */ | 467 | /* the device is gone */ |
| 397 | sas_phy_disconnected(sas_phy); | 468 | sas_phy_disconnected(sas_phy); |
| 469 | asd_deform_port(asd_ha, phy); | ||
| 398 | sas_ha->notify_port_event(sas_phy, PORTE_TIMER_EVENT); | 470 | sas_ha->notify_port_event(sas_phy, PORTE_TIMER_EVENT); |
| 399 | break; | 471 | break; |
| 400 | case REQ_TASK_ABORT: | 472 | case REQ_TASK_ABORT: |
diff --git a/drivers/scsi/aic94xx/aic94xx_seq.c b/drivers/scsi/aic94xx/aic94xx_seq.c index 56e4b3ba6a08..845112539d05 100644 --- a/drivers/scsi/aic94xx/aic94xx_seq.c +++ b/drivers/scsi/aic94xx/aic94xx_seq.c | |||
| @@ -1369,10 +1369,9 @@ int asd_start_seqs(struct asd_ha_struct *asd_ha) | |||
| 1369 | * port_map_by_links is also used as the conn_mask byte in the | 1369 | * port_map_by_links is also used as the conn_mask byte in the |
| 1370 | * initiator/target port DDB. | 1370 | * initiator/target port DDB. |
| 1371 | */ | 1371 | */ |
| 1372 | void asd_update_port_links(struct asd_sas_phy *sas_phy) | 1372 | void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy) |
| 1373 | { | 1373 | { |
| 1374 | struct asd_ha_struct *asd_ha = sas_phy->ha->lldd_ha; | 1374 | const u8 phy_mask = (u8) phy->asd_port->phy_mask; |
| 1375 | const u8 phy_mask = (u8) sas_phy->port->phy_mask; | ||
| 1376 | u8 phy_is_up; | 1375 | u8 phy_is_up; |
| 1377 | u8 mask; | 1376 | u8 mask; |
| 1378 | int i, err; | 1377 | int i, err; |
diff --git a/drivers/scsi/aic94xx/aic94xx_seq.h b/drivers/scsi/aic94xx/aic94xx_seq.h index 42281c36153b..9e715e5496af 100644 --- a/drivers/scsi/aic94xx/aic94xx_seq.h +++ b/drivers/scsi/aic94xx/aic94xx_seq.h | |||
| @@ -64,7 +64,7 @@ int asd_unpause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask); | |||
| 64 | int asd_init_seqs(struct asd_ha_struct *asd_ha); | 64 | int asd_init_seqs(struct asd_ha_struct *asd_ha); |
| 65 | int asd_start_seqs(struct asd_ha_struct *asd_ha); | 65 | int asd_start_seqs(struct asd_ha_struct *asd_ha); |
| 66 | 66 | ||
| 67 | void asd_update_port_links(struct asd_sas_phy *phy); | 67 | void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy); |
| 68 | #endif | 68 | #endif |
| 69 | 69 | ||
| 70 | #endif | 70 | #endif |
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 4bc14ad92e22..4c698a71f66f 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
| @@ -3531,7 +3531,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) | |||
| 3531 | IStatus &= ~0x80; | 3531 | IStatus &= ~0x80; |
| 3532 | #ifdef INT_COAL | 3532 | #ifdef INT_COAL |
| 3533 | if (coalesced) | 3533 | if (coalesced) |
| 3534 | ha->status = pcs->ext_status && 0xffff; | 3534 | ha->status = pcs->ext_status & 0xffff; |
| 3535 | else | 3535 | else |
| 3536 | #endif | 3536 | #endif |
| 3537 | ha->status = gdth_readw(&dp6m_ptr->i960r.status); | 3537 | ha->status = gdth_readw(&dp6m_ptr->i960r.status); |
| @@ -3543,7 +3543,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) | |||
| 3543 | if (coalesced) { | 3543 | if (coalesced) { |
| 3544 | ha->info = pcs->info0; | 3544 | ha->info = pcs->info0; |
| 3545 | ha->info2 = pcs->info1; | 3545 | ha->info2 = pcs->info1; |
| 3546 | ha->service = (pcs->ext_status >> 16) && 0xffff; | 3546 | ha->service = (pcs->ext_status >> 16) & 0xffff; |
| 3547 | } else | 3547 | } else |
| 3548 | #endif | 3548 | #endif |
| 3549 | { | 3549 | { |
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 0a9dbc59663f..d0b139cccbbc 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
| @@ -415,8 +415,8 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) | |||
| 415 | iscsi_solicit_data_init(conn, ctask, r2t); | 415 | iscsi_solicit_data_init(conn, ctask, r2t); |
| 416 | 416 | ||
| 417 | tcp_ctask->exp_r2tsn = r2tsn + 1; | 417 | tcp_ctask->exp_r2tsn = r2tsn + 1; |
| 418 | tcp_ctask->xmstate |= XMSTATE_SOL_HDR; | ||
| 419 | __kfifo_put(tcp_ctask->r2tqueue, (void*)&r2t, sizeof(void*)); | 418 | __kfifo_put(tcp_ctask->r2tqueue, (void*)&r2t, sizeof(void*)); |
| 419 | tcp_ctask->xmstate |= XMSTATE_SOL_HDR; | ||
| 420 | list_move_tail(&ctask->running, &conn->xmitqueue); | 420 | list_move_tail(&ctask->running, &conn->xmitqueue); |
| 421 | 421 | ||
| 422 | scsi_queue_work(session->host, &conn->xmitwork); | 422 | scsi_queue_work(session->host, &conn->xmitwork); |
| @@ -1627,9 +1627,12 @@ static int iscsi_send_sol_pdu(struct iscsi_conn *conn, | |||
| 1627 | if (tcp_ctask->xmstate & XMSTATE_SOL_HDR) { | 1627 | if (tcp_ctask->xmstate & XMSTATE_SOL_HDR) { |
| 1628 | tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; | 1628 | tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; |
| 1629 | tcp_ctask->xmstate |= XMSTATE_SOL_DATA; | 1629 | tcp_ctask->xmstate |= XMSTATE_SOL_DATA; |
| 1630 | if (!tcp_ctask->r2t) | 1630 | if (!tcp_ctask->r2t) { |
| 1631 | spin_lock_bh(&session->lock); | ||
| 1631 | __kfifo_get(tcp_ctask->r2tqueue, (void*)&tcp_ctask->r2t, | 1632 | __kfifo_get(tcp_ctask->r2tqueue, (void*)&tcp_ctask->r2t, |
| 1632 | sizeof(void*)); | 1633 | sizeof(void*)); |
| 1634 | spin_unlock_bh(&session->lock); | ||
| 1635 | } | ||
| 1633 | send_hdr: | 1636 | send_hdr: |
| 1634 | r2t = tcp_ctask->r2t; | 1637 | r2t = tcp_ctask->r2t; |
| 1635 | dtask = &r2t->dtask; | 1638 | dtask = &r2t->dtask; |
| @@ -1816,21 +1819,14 @@ iscsi_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn) | |||
| 1816 | { | 1819 | { |
| 1817 | struct iscsi_conn *conn = cls_conn->dd_data; | 1820 | struct iscsi_conn *conn = cls_conn->dd_data; |
| 1818 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; | 1821 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; |
| 1819 | int digest = 0; | ||
| 1820 | |||
| 1821 | if (conn->hdrdgst_en || conn->datadgst_en) | ||
| 1822 | digest = 1; | ||
| 1823 | 1822 | ||
| 1824 | iscsi_tcp_release_conn(conn); | 1823 | iscsi_tcp_release_conn(conn); |
| 1825 | iscsi_conn_teardown(cls_conn); | 1824 | iscsi_conn_teardown(cls_conn); |
| 1826 | 1825 | ||
| 1827 | /* now free tcp_conn */ | 1826 | if (tcp_conn->tx_hash.tfm) |
| 1828 | if (digest) { | 1827 | crypto_free_hash(tcp_conn->tx_hash.tfm); |
| 1829 | if (tcp_conn->tx_hash.tfm) | 1828 | if (tcp_conn->rx_hash.tfm) |
| 1830 | crypto_free_hash(tcp_conn->tx_hash.tfm); | 1829 | crypto_free_hash(tcp_conn->rx_hash.tfm); |
| 1831 | if (tcp_conn->rx_hash.tfm) | ||
| 1832 | crypto_free_hash(tcp_conn->rx_hash.tfm); | ||
| 1833 | } | ||
| 1834 | 1830 | ||
| 1835 | kfree(tcp_conn); | 1831 | kfree(tcp_conn); |
| 1836 | } | 1832 | } |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 2865ebd557ef..5d8862189485 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
| @@ -975,13 +975,13 @@ int iscsi_eh_host_reset(struct scsi_cmnd *sc) | |||
| 975 | if (session->state == ISCSI_STATE_TERMINATE) { | 975 | if (session->state == ISCSI_STATE_TERMINATE) { |
| 976 | failed: | 976 | failed: |
| 977 | debug_scsi("failing host reset: session terminated " | 977 | debug_scsi("failing host reset: session terminated " |
| 978 | "[CID %d age %d]", conn->id, session->age); | 978 | "[CID %d age %d]\n", conn->id, session->age); |
| 979 | spin_unlock_bh(&session->lock); | 979 | spin_unlock_bh(&session->lock); |
| 980 | return FAILED; | 980 | return FAILED; |
| 981 | } | 981 | } |
| 982 | 982 | ||
| 983 | if (sc->SCp.phase == session->age) { | 983 | if (sc->SCp.phase == session->age) { |
| 984 | debug_scsi("failing connection CID %d due to SCSI host reset", | 984 | debug_scsi("failing connection CID %d due to SCSI host reset\n", |
| 985 | conn->id); | 985 | conn->id); |
| 986 | fail_session = 1; | 986 | fail_session = 1; |
| 987 | } | 987 | } |
| @@ -1054,7 +1054,8 @@ static int iscsi_exec_abort_task(struct scsi_cmnd *sc, | |||
| 1054 | NULL, 0); | 1054 | NULL, 0); |
| 1055 | if (rc) { | 1055 | if (rc) { |
| 1056 | iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); | 1056 | iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); |
| 1057 | debug_scsi("abort sent failure [itt 0x%x] %d", ctask->itt, rc); | 1057 | debug_scsi("abort sent failure [itt 0x%x] %d\n", ctask->itt, |
| 1058 | rc); | ||
| 1058 | return rc; | 1059 | return rc; |
| 1059 | } | 1060 | } |
| 1060 | 1061 | ||
| @@ -1071,7 +1072,7 @@ static int iscsi_exec_abort_task(struct scsi_cmnd *sc, | |||
| 1071 | conn->tmabort_timer.function = iscsi_tmabort_timedout; | 1072 | conn->tmabort_timer.function = iscsi_tmabort_timedout; |
| 1072 | conn->tmabort_timer.data = (unsigned long)ctask; | 1073 | conn->tmabort_timer.data = (unsigned long)ctask; |
| 1073 | add_timer(&conn->tmabort_timer); | 1074 | add_timer(&conn->tmabort_timer); |
| 1074 | debug_scsi("abort set timeout [itt 0x%x]", ctask->itt); | 1075 | debug_scsi("abort set timeout [itt 0x%x]\n", ctask->itt); |
| 1075 | } | 1076 | } |
| 1076 | spin_unlock_bh(&session->lock); | 1077 | spin_unlock_bh(&session->lock); |
| 1077 | mutex_unlock(&conn->xmitmutex); | 1078 | mutex_unlock(&conn->xmitmutex); |
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c index 30b8014bcc7a..e34a93435497 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c | |||
| @@ -71,55 +71,65 @@ static void smp_task_done(struct sas_task *task) | |||
| 71 | static int smp_execute_task(struct domain_device *dev, void *req, int req_size, | 71 | static int smp_execute_task(struct domain_device *dev, void *req, int req_size, |
| 72 | void *resp, int resp_size) | 72 | void *resp, int resp_size) |
| 73 | { | 73 | { |
| 74 | int res; | 74 | int res, retry; |
| 75 | struct sas_task *task = sas_alloc_task(GFP_KERNEL); | 75 | struct sas_task *task = NULL; |
| 76 | struct sas_internal *i = | 76 | struct sas_internal *i = |
| 77 | to_sas_internal(dev->port->ha->core.shost->transportt); | 77 | to_sas_internal(dev->port->ha->core.shost->transportt); |
| 78 | 78 | ||
| 79 | if (!task) | 79 | for (retry = 0; retry < 3; retry++) { |
| 80 | return -ENOMEM; | 80 | task = sas_alloc_task(GFP_KERNEL); |
| 81 | 81 | if (!task) | |
| 82 | task->dev = dev; | 82 | return -ENOMEM; |
| 83 | task->task_proto = dev->tproto; | ||
| 84 | sg_init_one(&task->smp_task.smp_req, req, req_size); | ||
| 85 | sg_init_one(&task->smp_task.smp_resp, resp, resp_size); | ||
| 86 | 83 | ||
| 87 | task->task_done = smp_task_done; | 84 | task->dev = dev; |
| 85 | task->task_proto = dev->tproto; | ||
| 86 | sg_init_one(&task->smp_task.smp_req, req, req_size); | ||
| 87 | sg_init_one(&task->smp_task.smp_resp, resp, resp_size); | ||
| 88 | 88 | ||
| 89 | task->timer.data = (unsigned long) task; | 89 | task->task_done = smp_task_done; |
| 90 | task->timer.function = smp_task_timedout; | ||
| 91 | task->timer.expires = jiffies + SMP_TIMEOUT*HZ; | ||
| 92 | add_timer(&task->timer); | ||
| 93 | 90 | ||
| 94 | res = i->dft->lldd_execute_task(task, 1, GFP_KERNEL); | 91 | task->timer.data = (unsigned long) task; |
| 92 | task->timer.function = smp_task_timedout; | ||
| 93 | task->timer.expires = jiffies + SMP_TIMEOUT*HZ; | ||
| 94 | add_timer(&task->timer); | ||
| 95 | 95 | ||
| 96 | if (res) { | 96 | res = i->dft->lldd_execute_task(task, 1, GFP_KERNEL); |
| 97 | del_timer(&task->timer); | ||
| 98 | SAS_DPRINTK("executing SMP task failed:%d\n", res); | ||
| 99 | goto ex_err; | ||
| 100 | } | ||
| 101 | 97 | ||
| 102 | wait_for_completion(&task->completion); | 98 | if (res) { |
| 103 | res = -ETASK; | 99 | del_timer(&task->timer); |
| 104 | if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { | 100 | SAS_DPRINTK("executing SMP task failed:%d\n", res); |
| 105 | SAS_DPRINTK("smp task timed out or aborted\n"); | ||
| 106 | i->dft->lldd_abort_task(task); | ||
| 107 | if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { | ||
| 108 | SAS_DPRINTK("SMP task aborted and not done\n"); | ||
| 109 | goto ex_err; | 101 | goto ex_err; |
| 110 | } | 102 | } |
| 103 | |||
| 104 | wait_for_completion(&task->completion); | ||
| 105 | res = -ETASK; | ||
| 106 | if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { | ||
| 107 | SAS_DPRINTK("smp task timed out or aborted\n"); | ||
| 108 | i->dft->lldd_abort_task(task); | ||
| 109 | if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { | ||
| 110 | SAS_DPRINTK("SMP task aborted and not done\n"); | ||
| 111 | goto ex_err; | ||
| 112 | } | ||
| 113 | } | ||
| 114 | if (task->task_status.resp == SAS_TASK_COMPLETE && | ||
| 115 | task->task_status.stat == SAM_GOOD) { | ||
| 116 | res = 0; | ||
| 117 | break; | ||
| 118 | } else { | ||
| 119 | SAS_DPRINTK("%s: task to dev %016llx response: 0x%x " | ||
| 120 | "status 0x%x\n", __FUNCTION__, | ||
| 121 | SAS_ADDR(dev->sas_addr), | ||
| 122 | task->task_status.resp, | ||
| 123 | task->task_status.stat); | ||
| 124 | sas_free_task(task); | ||
| 125 | task = NULL; | ||
| 126 | } | ||
| 111 | } | 127 | } |
| 112 | if (task->task_status.resp == SAS_TASK_COMPLETE && | ||
| 113 | task->task_status.stat == SAM_GOOD) | ||
| 114 | res = 0; | ||
| 115 | else | ||
| 116 | SAS_DPRINTK("%s: task to dev %016llx response: 0x%x " | ||
| 117 | "status 0x%x\n", __FUNCTION__, | ||
| 118 | SAS_ADDR(dev->sas_addr), | ||
| 119 | task->task_status.resp, | ||
| 120 | task->task_status.stat); | ||
| 121 | ex_err: | 128 | ex_err: |
| 122 | sas_free_task(task); | 129 | BUG_ON(retry == 3 && task != NULL); |
| 130 | if (task != NULL) { | ||
| 131 | sas_free_task(task); | ||
| 132 | } | ||
| 123 | return res; | 133 | return res; |
| 124 | } | 134 | } |
| 125 | 135 | ||
diff --git a/drivers/scsi/psi240i.c b/drivers/scsi/psi240i.c index ac0419e2714a..899e89d6fe67 100644 --- a/drivers/scsi/psi240i.c +++ b/drivers/scsi/psi240i.c | |||
| @@ -328,7 +328,7 @@ static void Irq_Handler (int irq, void *dev_id) | |||
| 328 | pinquiryData->AdditionalLength = 35 - 4; | 328 | pinquiryData->AdditionalLength = 35 - 4; |
| 329 | 329 | ||
| 330 | // Fill in vendor identification fields. | 330 | // Fill in vendor identification fields. |
| 331 | for ( z = 0; z < 20; z += 2 ) | 331 | for ( z = 0; z < 8; z += 2 ) |
| 332 | { | 332 | { |
| 333 | pinquiryData->VendorId[z] = ((UCHAR *)identifyData.ModelNumber)[z + 1]; | 333 | pinquiryData->VendorId[z] = ((UCHAR *)identifyData.ModelNumber)[z + 1]; |
| 334 | pinquiryData->VendorId[z + 1] = ((UCHAR *)identifyData.ModelNumber)[z]; | 334 | pinquiryData->VendorId[z + 1] = ((UCHAR *)identifyData.ModelNumber)[z]; |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index d2c02df12fdc..3ac4890ce086 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -410,6 +410,7 @@ int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd, | |||
| 410 | goto free_req; | 410 | goto free_req; |
| 411 | 411 | ||
| 412 | req->cmd_len = cmd_len; | 412 | req->cmd_len = cmd_len; |
| 413 | memset(req->cmd, 0, BLK_MAX_CDB); /* ATAPI hates garbage after CDB */ | ||
| 413 | memcpy(req->cmd, cmd, req->cmd_len); | 414 | memcpy(req->cmd, cmd, req->cmd_len); |
| 414 | req->sense = sioc->sense; | 415 | req->sense = sioc->sense; |
| 415 | req->sense_len = 0; | 416 | req->sense_len = 0; |
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 2d3baa99ca25..9b25124a989e 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
| @@ -33,7 +33,7 @@ | |||
| 33 | #define ISCSI_SESSION_ATTRS 11 | 33 | #define ISCSI_SESSION_ATTRS 11 |
| 34 | #define ISCSI_CONN_ATTRS 11 | 34 | #define ISCSI_CONN_ATTRS 11 |
| 35 | #define ISCSI_HOST_ATTRS 0 | 35 | #define ISCSI_HOST_ATTRS 0 |
| 36 | #define ISCSI_TRANSPORT_VERSION "2.0-685" | 36 | #define ISCSI_TRANSPORT_VERSION "2.0-724" |
| 37 | 37 | ||
| 38 | struct iscsi_internal { | 38 | struct iscsi_internal { |
| 39 | int daemon_pid; | 39 | int daemon_pid; |
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 3f8b93188567..81e3bc7b02a1 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
| @@ -60,7 +60,7 @@ static int sg_version_num = 30534; /* 2 digits for each component */ | |||
| 60 | 60 | ||
| 61 | #ifdef CONFIG_SCSI_PROC_FS | 61 | #ifdef CONFIG_SCSI_PROC_FS |
| 62 | #include <linux/proc_fs.h> | 62 | #include <linux/proc_fs.h> |
| 63 | static char *sg_version_date = "20060920"; | 63 | static char *sg_version_date = "20061027"; |
| 64 | 64 | ||
| 65 | static int sg_proc_init(void); | 65 | static int sg_proc_init(void); |
| 66 | static void sg_proc_cleanup(void); | 66 | static void sg_proc_cleanup(void); |
| @@ -710,12 +710,12 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, | |||
| 710 | (int) cmnd[0], (int) hp->cmd_len)); | 710 | (int) cmnd[0], (int) hp->cmd_len)); |
| 711 | 711 | ||
| 712 | if ((k = sg_start_req(srp))) { | 712 | if ((k = sg_start_req(srp))) { |
| 713 | SCSI_LOG_TIMEOUT(1, printk("sg_write: start_req err=%d\n", k)); | 713 | SCSI_LOG_TIMEOUT(1, printk("sg_common_write: start_req err=%d\n", k)); |
| 714 | sg_finish_rem_req(srp); | 714 | sg_finish_rem_req(srp); |
| 715 | return k; /* probably out of space --> ENOMEM */ | 715 | return k; /* probably out of space --> ENOMEM */ |
| 716 | } | 716 | } |
| 717 | if ((k = sg_write_xfer(srp))) { | 717 | if ((k = sg_write_xfer(srp))) { |
| 718 | SCSI_LOG_TIMEOUT(1, printk("sg_write: write_xfer, bad address\n")); | 718 | SCSI_LOG_TIMEOUT(1, printk("sg_common_write: write_xfer, bad address\n")); |
| 719 | sg_finish_rem_req(srp); | 719 | sg_finish_rem_req(srp); |
| 720 | return k; | 720 | return k; |
| 721 | } | 721 | } |
| @@ -746,7 +746,7 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, | |||
| 746 | hp->dxfer_len, srp->data.k_use_sg, timeout, | 746 | hp->dxfer_len, srp->data.k_use_sg, timeout, |
| 747 | SG_DEFAULT_RETRIES, srp, sg_cmd_done, | 747 | SG_DEFAULT_RETRIES, srp, sg_cmd_done, |
| 748 | GFP_ATOMIC)) { | 748 | GFP_ATOMIC)) { |
| 749 | SCSI_LOG_TIMEOUT(1, printk("sg_write: scsi_execute_async failed\n")); | 749 | SCSI_LOG_TIMEOUT(1, printk("sg_common_write: scsi_execute_async failed\n")); |
| 750 | /* | 750 | /* |
| 751 | * most likely out of mem, but could also be a bad map | 751 | * most likely out of mem, but could also be a bad map |
| 752 | */ | 752 | */ |
| @@ -1283,7 +1283,7 @@ sg_cmd_done(void *data, char *sense, int result, int resid) | |||
| 1283 | sg_finish_rem_req(srp); | 1283 | sg_finish_rem_req(srp); |
| 1284 | srp = NULL; | 1284 | srp = NULL; |
| 1285 | if (NULL == sfp->headrp) { | 1285 | if (NULL == sfp->headrp) { |
| 1286 | SCSI_LOG_TIMEOUT(1, printk("sg...bh: already closed, final cleanup\n")); | 1286 | SCSI_LOG_TIMEOUT(1, printk("sg_cmd_done: already closed, final cleanup\n")); |
| 1287 | if (0 == sg_remove_sfp(sdp, sfp)) { /* device still present */ | 1287 | if (0 == sg_remove_sfp(sdp, sfp)) { /* device still present */ |
| 1288 | scsi_device_put(sdp->device); | 1288 | scsi_device_put(sdp->device); |
| 1289 | } | 1289 | } |
| @@ -1512,12 +1512,12 @@ sg_remove(struct class_device *cl_dev, struct class_interface *cl_intf) | |||
| 1512 | POLL_HUP); | 1512 | POLL_HUP); |
| 1513 | } | 1513 | } |
| 1514 | } | 1514 | } |
| 1515 | SCSI_LOG_TIMEOUT(3, printk("sg_detach: dev=%d, dirty\n", k)); | 1515 | SCSI_LOG_TIMEOUT(3, printk("sg_remove: dev=%d, dirty\n", k)); |
| 1516 | if (NULL == sdp->headfp) { | 1516 | if (NULL == sdp->headfp) { |
| 1517 | sg_dev_arr[k] = NULL; | 1517 | sg_dev_arr[k] = NULL; |
| 1518 | } | 1518 | } |
| 1519 | } else { /* nothing active, simple case */ | 1519 | } else { /* nothing active, simple case */ |
| 1520 | SCSI_LOG_TIMEOUT(3, printk("sg_detach: dev=%d\n", k)); | 1520 | SCSI_LOG_TIMEOUT(3, printk("sg_remove: dev=%d\n", k)); |
| 1521 | sg_dev_arr[k] = NULL; | 1521 | sg_dev_arr[k] = NULL; |
| 1522 | } | 1522 | } |
| 1523 | sg_nr_dev--; | 1523 | sg_nr_dev--; |
| @@ -1876,14 +1876,15 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size) | |||
| 1876 | } | 1876 | } |
| 1877 | } | 1877 | } |
| 1878 | sg->page = p; | 1878 | sg->page = p; |
| 1879 | sg->length = ret_sz; | 1879 | sg->length = (ret_sz > num) ? num : ret_sz; |
| 1880 | 1880 | ||
| 1881 | SCSI_LOG_TIMEOUT(5, printk("sg_build_build: k=%d, a=0x%p, len=%d\n", | 1881 | SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k=%d, num=%d, " |
| 1882 | k, p, ret_sz)); | 1882 | "ret_sz=%d\n", k, num, ret_sz)); |
| 1883 | } /* end of for loop */ | 1883 | } /* end of for loop */ |
| 1884 | 1884 | ||
| 1885 | schp->k_use_sg = k; | 1885 | schp->k_use_sg = k; |
| 1886 | SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k_use_sg=%d, rem_sz=%d\n", k, rem_sz)); | 1886 | SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k_use_sg=%d, " |
| 1887 | "rem_sz=%d\n", k, rem_sz)); | ||
| 1887 | 1888 | ||
| 1888 | schp->bufflen = blk_size; | 1889 | schp->bufflen = blk_size; |
| 1889 | if (rem_sz > 0) /* must have failed */ | 1890 | if (rem_sz > 0) /* must have failed */ |
| @@ -2014,7 +2015,7 @@ sg_remove_scat(Sg_scatter_hold * schp) | |||
| 2014 | for (k = 0; (k < schp->k_use_sg) && sg->page; | 2015 | for (k = 0; (k < schp->k_use_sg) && sg->page; |
| 2015 | ++k, ++sg) { | 2016 | ++k, ++sg) { |
| 2016 | SCSI_LOG_TIMEOUT(5, printk( | 2017 | SCSI_LOG_TIMEOUT(5, printk( |
| 2017 | "sg_remove_scat: k=%d, a=0x%p, len=%d\n", | 2018 | "sg_remove_scat: k=%d, pg=0x%p, len=%d\n", |
| 2018 | k, sg->page, sg->length)); | 2019 | k, sg->page, sg->length)); |
| 2019 | sg_page_free(sg->page, sg->length); | 2020 | sg_page_free(sg->page, sg->length); |
| 2020 | } | 2021 | } |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index fccd1952bad3..7729c0744886 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -828,10 +828,7 @@ char *usb_cache_string(struct usb_device *udev, int index) | |||
| 828 | * Context: !in_interrupt () | 828 | * Context: !in_interrupt () |
| 829 | * | 829 | * |
| 830 | * Updates the copy of the device descriptor stored in the device structure, | 830 | * Updates the copy of the device descriptor stored in the device structure, |
| 831 | * which dedicates space for this purpose. Note that several fields are | 831 | * which dedicates space for this purpose. |
| 832 | * converted to the host CPU's byte order: the USB version (bcdUSB), and | ||
| 833 | * vendors product and version fields (idVendor, idProduct, and bcdDevice). | ||
| 834 | * That lets device drivers compare against non-byteswapped constants. | ||
| 835 | * | 832 | * |
| 836 | * Not exported, only for use by the core. If drivers really want to read | 833 | * Not exported, only for use by the core. If drivers really want to read |
| 837 | * the device descriptor directly, they can call usb_get_descriptor() with | 834 | * the device descriptor directly, they can call usb_get_descriptor() with |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 9be6b303e784..ea4714e557e4 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
| @@ -715,13 +715,6 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
| 715 | return IRQ_NOTMINE; | 715 | return IRQ_NOTMINE; |
| 716 | } | 716 | } |
| 717 | 717 | ||
| 718 | if (ints & OHCI_INTR_RHSC) { | ||
| 719 | ohci_vdbg (ohci, "rhsc\n"); | ||
| 720 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; | ||
| 721 | ohci_writel (ohci, OHCI_INTR_RHSC, ®s->intrstatus); | ||
| 722 | usb_hcd_poll_rh_status(hcd); | ||
| 723 | } | ||
| 724 | |||
| 725 | if (ints & OHCI_INTR_UE) { | 718 | if (ints & OHCI_INTR_UE) { |
| 726 | disable (ohci); | 719 | disable (ohci); |
| 727 | ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n"); | 720 | ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n"); |
| @@ -731,9 +724,21 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
| 731 | ohci_usb_reset (ohci); | 724 | ohci_usb_reset (ohci); |
| 732 | } | 725 | } |
| 733 | 726 | ||
| 734 | if (ints & OHCI_INTR_RD) { | 727 | if (ints & OHCI_INTR_RHSC) { |
| 735 | ohci_vdbg (ohci, "resume detect\n"); | 728 | ohci_vdbg(ohci, "rhsc\n"); |
| 736 | ohci_writel (ohci, OHCI_INTR_RD, ®s->intrstatus); | 729 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; |
| 730 | ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, | ||
| 731 | ®s->intrstatus); | ||
| 732 | usb_hcd_poll_rh_status(hcd); | ||
| 733 | } | ||
| 734 | |||
| 735 | /* For connect and disconnect events, we expect the controller | ||
| 736 | * to turn on RHSC along with RD. But for remote wakeup events | ||
| 737 | * this might not happen. | ||
| 738 | */ | ||
| 739 | else if (ints & OHCI_INTR_RD) { | ||
| 740 | ohci_vdbg(ohci, "resume detect\n"); | ||
| 741 | ohci_writel(ohci, OHCI_INTR_RD, ®s->intrstatus); | ||
| 737 | hcd->poll_rh = 1; | 742 | hcd->poll_rh = 1; |
| 738 | if (ohci->autostop) { | 743 | if (ohci->autostop) { |
| 739 | spin_lock (&ohci->lock); | 744 | spin_lock (&ohci->lock); |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 6f113596af66..6995ea36f2e8 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
| @@ -169,7 +169,8 @@ __acquires(ohci->lock) | |||
| 169 | break; | 169 | break; |
| 170 | case OHCI_USB_RESUME: | 170 | case OHCI_USB_RESUME: |
| 171 | /* HCFS changes sometime after INTR_RD */ | 171 | /* HCFS changes sometime after INTR_RD */ |
| 172 | ohci_info (ohci, "wakeup\n"); | 172 | ohci_info(ohci, "%swakeup\n", |
| 173 | autostopped ? "auto-" : ""); | ||
| 173 | break; | 174 | break; |
| 174 | case OHCI_USB_OPER: | 175 | case OHCI_USB_OPER: |
| 175 | /* this can happen after resuming a swsusp snapshot */ | 176 | /* this can happen after resuming a swsusp snapshot */ |
| @@ -422,7 +423,8 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
| 422 | ohci->autostop = 0; | 423 | ohci->autostop = 0; |
| 423 | ohci->next_statechange = jiffies + | 424 | ohci->next_statechange = jiffies + |
| 424 | STATECHANGE_DELAY; | 425 | STATECHANGE_DELAY; |
| 425 | } else if (time_after_eq (jiffies, | 426 | } else if (device_may_wakeup(&hcd->self.root_hub->dev) |
| 427 | && time_after_eq(jiffies, | ||
| 426 | ohci->next_statechange) | 428 | ohci->next_statechange) |
| 427 | && !ohci->ed_rm_list | 429 | && !ohci->ed_rm_list |
| 428 | && !(ohci->hc_control & | 430 | && !(ohci->hc_control & |
diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index f659f3028ad2..787b847d38cc 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c | |||
| @@ -636,13 +636,11 @@ static void ati_remote_free_buffers(struct ati_remote *ati_remote) | |||
| 636 | if (ati_remote->out_urb) | 636 | if (ati_remote->out_urb) |
| 637 | usb_free_urb(ati_remote->out_urb); | 637 | usb_free_urb(ati_remote->out_urb); |
| 638 | 638 | ||
| 639 | if (ati_remote->inbuf) | 639 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, |
| 640 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | 640 | ati_remote->inbuf, ati_remote->inbuf_dma); |
| 641 | ati_remote->inbuf, ati_remote->inbuf_dma); | ||
| 642 | 641 | ||
| 643 | if (ati_remote->outbuf) | 642 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, |
| 644 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | 643 | ati_remote->outbuf, ati_remote->outbuf_dma); |
| 645 | ati_remote->inbuf, ati_remote->outbuf_dma); | ||
| 646 | } | 644 | } |
| 647 | 645 | ||
| 648 | static void ati_remote_input_init(struct ati_remote *ati_remote) | 646 | static void ati_remote_input_init(struct ati_remote *ati_remote) |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 6daf85c6eeee..6d08a3bcc952 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
| @@ -1797,11 +1797,12 @@ static const struct hid_blacklist { | |||
| 1797 | { USB_VENDOR_ID_APPLE, 0x020E, HID_QUIRK_POWERBOOK_HAS_FN }, | 1797 | { USB_VENDOR_ID_APPLE, 0x020E, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1798 | { USB_VENDOR_ID_APPLE, 0x020F, HID_QUIRK_POWERBOOK_HAS_FN }, | 1798 | { USB_VENDOR_ID_APPLE, 0x020F, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1799 | { USB_VENDOR_ID_APPLE, 0x0214, HID_QUIRK_POWERBOOK_HAS_FN }, | 1799 | { USB_VENDOR_ID_APPLE, 0x0214, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1800 | { USB_VENDOR_ID_APPLE, 0x0215, HID_QUIRK_POWERBOOK_HAS_FN }, | 1800 | { USB_VENDOR_ID_APPLE, 0x0215, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
| 1801 | { USB_VENDOR_ID_APPLE, 0x0216, HID_QUIRK_POWERBOOK_HAS_FN }, | 1801 | { USB_VENDOR_ID_APPLE, 0x0216, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1802 | { USB_VENDOR_ID_APPLE, 0x0217, HID_QUIRK_POWERBOOK_HAS_FN }, | 1802 | { USB_VENDOR_ID_APPLE, 0x0217, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1803 | { USB_VENDOR_ID_APPLE, 0x0218, HID_QUIRK_POWERBOOK_HAS_FN }, | 1803 | { USB_VENDOR_ID_APPLE, 0x0218, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
| 1804 | { USB_VENDOR_ID_APPLE, 0x0219, HID_QUIRK_POWERBOOK_HAS_FN }, | 1804 | { USB_VENDOR_ID_APPLE, 0x0219, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1805 | { USB_VENDOR_ID_APPLE, 0x021B, HID_QUIRK_POWERBOOK_HAS_FN }, | ||
| 1805 | { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, | 1806 | { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1806 | { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, | 1807 | { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1807 | 1808 | ||
diff --git a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c index 9a808a3b4d37..68e7ebb978a9 100644 --- a/drivers/usb/input/hid-input.c +++ b/drivers/usb/input/hid-input.c | |||
| @@ -121,6 +121,12 @@ static struct hidinput_key_translation powerbook_numlock_keys[] = { | |||
| 121 | { } | 121 | { } |
| 122 | }; | 122 | }; |
| 123 | 123 | ||
| 124 | static struct hidinput_key_translation powerbook_iso_keyboard[] = { | ||
| 125 | { KEY_GRAVE, KEY_102ND }, | ||
| 126 | { KEY_102ND, KEY_GRAVE }, | ||
| 127 | { } | ||
| 128 | }; | ||
| 129 | |||
| 124 | static int usbhid_pb_fnmode = 1; | 130 | static int usbhid_pb_fnmode = 1; |
| 125 | module_param_named(pb_fnmode, usbhid_pb_fnmode, int, 0644); | 131 | module_param_named(pb_fnmode, usbhid_pb_fnmode, int, 0644); |
| 126 | MODULE_PARM_DESC(pb_fnmode, | 132 | MODULE_PARM_DESC(pb_fnmode, |
| @@ -195,6 +201,14 @@ static int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, | |||
| 195 | } | 201 | } |
| 196 | } | 202 | } |
| 197 | 203 | ||
| 204 | if (hid->quirks & HID_QUIRK_POWERBOOK_ISO_KEYBOARD) { | ||
| 205 | trans = find_translation(powerbook_iso_keyboard, usage->code); | ||
| 206 | if (trans) { | ||
| 207 | input_event(input, usage->type, trans->to, value); | ||
| 208 | return 1; | ||
| 209 | } | ||
| 210 | } | ||
| 211 | |||
| 198 | return 0; | 212 | return 0; |
| 199 | } | 213 | } |
| 200 | 214 | ||
| @@ -210,6 +224,9 @@ static void hidinput_pb_setup(struct input_dev *input) | |||
| 210 | 224 | ||
| 211 | for (trans = powerbook_numlock_keys; trans->from; trans++) | 225 | for (trans = powerbook_numlock_keys; trans->from; trans++) |
| 212 | set_bit(trans->to, input->keybit); | 226 | set_bit(trans->to, input->keybit); |
| 227 | |||
| 228 | for (trans = powerbook_iso_keyboard; trans->from; trans++) | ||
| 229 | set_bit(trans->to, input->keybit); | ||
| 213 | } | 230 | } |
| 214 | #else | 231 | #else |
| 215 | static inline int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, | 232 | static inline int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, |
diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h index 9b50effef758..0e76e6dcac37 100644 --- a/drivers/usb/input/hid.h +++ b/drivers/usb/input/hid.h | |||
| @@ -260,6 +260,7 @@ struct hid_item { | |||
| 260 | #define HID_QUIRK_POWERBOOK_HAS_FN 0x00001000 | 260 | #define HID_QUIRK_POWERBOOK_HAS_FN 0x00001000 |
| 261 | #define HID_QUIRK_POWERBOOK_FN_ON 0x00002000 | 261 | #define HID_QUIRK_POWERBOOK_FN_ON 0x00002000 |
| 262 | #define HID_QUIRK_INVERT_HWHEEL 0x00004000 | 262 | #define HID_QUIRK_INVERT_HWHEEL 0x00004000 |
| 263 | #define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00008000 | ||
| 263 | 264 | ||
| 264 | /* | 265 | /* |
| 265 | * This is the global environment of the parser. This information is | 266 | * This is the global environment of the parser. This information is |
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index 0be9d62d62ae..e4971d6aaafb 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c | |||
| @@ -780,7 +780,7 @@ static int auerbuf_setup (pauerbufctl_t bcp, unsigned int numElements, unsigned | |||
| 780 | 780 | ||
| 781 | bl_fail:/* not enough memory. Free allocated elements */ | 781 | bl_fail:/* not enough memory. Free allocated elements */ |
| 782 | dbg ("auerbuf_setup: no more memory"); | 782 | dbg ("auerbuf_setup: no more memory"); |
| 783 | kfree(bep); | 783 | auerbuf_free(bep); |
| 784 | auerbuf_free_buffers (bcp); | 784 | auerbuf_free_buffers (bcp); |
| 785 | return -ENOMEM; | 785 | return -ENOMEM; |
| 786 | } | 786 | } |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index bd76b4c11fcc..c186b4e73c72 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -311,6 +311,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 311 | { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) }, | 311 | { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) }, |
| 312 | { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, | 312 | { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, |
| 313 | { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) }, | 313 | { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) }, |
| 314 | { USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) }, | ||
| 314 | { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) }, | 315 | { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) }, |
| 315 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, | 316 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, |
| 316 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, | 317 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, |
| @@ -511,6 +512,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 511 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) }, | 512 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) }, |
| 512 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) }, | 513 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) }, |
| 513 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) }, | 514 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) }, |
| 515 | { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) }, | ||
| 514 | { }, /* Optional parameter entry */ | 516 | { }, /* Optional parameter entry */ |
| 515 | { } /* Terminating entry */ | 517 | { } /* Terminating entry */ |
| 516 | }; | 518 | }; |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index f0edb87d2dd5..bae117d359af 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
| @@ -55,6 +55,9 @@ | |||
| 55 | /* iPlus device */ | 55 | /* iPlus device */ |
| 56 | #define FTDI_IPLUS_PID 0xD070 /* Product Id */ | 56 | #define FTDI_IPLUS_PID 0xD070 /* Product Id */ |
| 57 | 57 | ||
| 58 | /* DMX4ALL DMX Interfaces */ | ||
| 59 | #define FTDI_DMX4ALL 0xC850 | ||
| 60 | |||
| 58 | /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */ | 61 | /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */ |
| 59 | /* they use the ftdi chipset for the USB interface and the vendor id is the same */ | 62 | /* they use the ftdi chipset for the USB interface and the vendor id is the same */ |
| 60 | #define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */ | 63 | #define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */ |
| @@ -175,9 +178,15 @@ | |||
| 175 | #define FTDI_ASK_RDR400_PID 0xC991 /* ASK RDR 400 series card reader */ | 178 | #define FTDI_ASK_RDR400_PID 0xC991 /* ASK RDR 400 series card reader */ |
| 176 | 179 | ||
| 177 | /* | 180 | /* |
| 181 | * FTDI USB UART chips used in construction projects from the | ||
| 182 | * Elektor Electronics magazine (http://elektor-electronics.co.uk) | ||
| 183 | */ | ||
| 184 | #define ELEKTOR_VID 0x0C7D | ||
| 185 | #define ELEKTOR_FT323R_PID 0x0005 /* RFID-Reader, issue 09-2006 */ | ||
| 186 | |||
| 187 | /* | ||
| 178 | * DSS-20 Sync Station for Sony Ericsson P800 | 188 | * DSS-20 Sync Station for Sony Ericsson P800 |
| 179 | */ | 189 | */ |
| 180 | |||
| 181 | #define FTDI_DSS20_PID 0xFC82 | 190 | #define FTDI_DSS20_PID 0xFC82 |
| 182 | 191 | ||
| 183 | /* | 192 | /* |
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 6238aff1e772..d72cf8bc7f76 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
| @@ -320,6 +320,7 @@ static struct usb_device_id ipaq_id_table [] = { | |||
| 320 | { USB_DEVICE(0x0B05, 0x9200) }, /* ASUS USB Sync */ | 320 | { USB_DEVICE(0x0B05, 0x9200) }, /* ASUS USB Sync */ |
| 321 | { USB_DEVICE(0x0B05, 0x9202) }, /* ASUS USB Sync */ | 321 | { USB_DEVICE(0x0B05, 0x9202) }, /* ASUS USB Sync */ |
| 322 | { USB_DEVICE(0x0BB4, 0x00CE) }, /* HTC USB Sync */ | 322 | { USB_DEVICE(0x0BB4, 0x00CE) }, /* HTC USB Sync */ |
| 323 | { USB_DEVICE(0x0BB4, 0x00CF) }, /* HTC USB Modem */ | ||
| 323 | { USB_DEVICE(0x0BB4, 0x0A01) }, /* PocketPC USB Sync */ | 324 | { USB_DEVICE(0x0BB4, 0x0A01) }, /* PocketPC USB Sync */ |
| 324 | { USB_DEVICE(0x0BB4, 0x0A02) }, /* PocketPC USB Sync */ | 325 | { USB_DEVICE(0x0BB4, 0x0A02) }, /* PocketPC USB Sync */ |
| 325 | { USB_DEVICE(0x0BB4, 0x0A03) }, /* PocketPC USB Sync */ | 326 | { USB_DEVICE(0x0BB4, 0x0A03) }, /* PocketPC USB Sync */ |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index bc1ac07bf6ce..efb047f431e8 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -1306,25 +1306,13 @@ UNUSUAL_DEV( 0x0fce, 0xe030, 0x0000, 0x0000, | |||
| 1306 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1306 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 1307 | US_FL_FIX_CAPACITY ), | 1307 | US_FL_FIX_CAPACITY ), |
| 1308 | 1308 | ||
| 1309 | /* Reported by Jan Mate <mate@fiit.stuba.sk> */ | ||
| 1310 | UNUSUAL_DEV( 0x0fce, 0xe030, 0x0000, 0x0000, | ||
| 1311 | "Sony Ericsson", | ||
| 1312 | "P990i", | ||
| 1313 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 1314 | US_FL_FIX_CAPACITY ), | ||
| 1315 | |||
| 1316 | /* Reported by Jan Mate <mate@fiit.stuba.sk> */ | ||
| 1317 | UNUSUAL_DEV( 0x0fce, 0xe030, 0x0000, 0x0000, | ||
| 1318 | "Sony Ericsson", | ||
| 1319 | "P990i", | ||
| 1320 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 1321 | US_FL_FIX_CAPACITY ), | ||
| 1322 | |||
| 1323 | /* Reported by Kevin Cernekee <kpc-usbdev@gelato.uiuc.edu> | 1309 | /* Reported by Kevin Cernekee <kpc-usbdev@gelato.uiuc.edu> |
| 1324 | * Tested on hardware version 1.10. | 1310 | * Tested on hardware version 1.10. |
| 1325 | * Entry is needed only for the initializer function override. | 1311 | * Entry is needed only for the initializer function override. |
| 1312 | * Devices with bcd > 110 seem to not need it while those | ||
| 1313 | * with bcd < 110 appear to need it. | ||
| 1326 | */ | 1314 | */ |
| 1327 | UNUSUAL_DEV( 0x1019, 0x0c55, 0x0110, 0x0110, | 1315 | UNUSUAL_DEV( 0x1019, 0x0c55, 0x0000, 0x0110, |
| 1328 | "Desknote", | 1316 | "Desknote", |
| 1329 | "UCR-61S2B", | 1317 | "UCR-61S2B", |
| 1330 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, | 1318 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, |
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c index b77b30923928..e815b354c09d 100644 --- a/drivers/video/aty/atyfb_base.c +++ b/drivers/video/aty/atyfb_base.c | |||
| @@ -406,7 +406,7 @@ static struct { | |||
| 406 | { PCI_CHIP_MACH64LB, "3D RAGE LT PRO (Mach64 LB, AGP)", 236, 75, 100, 135, ATI_CHIP_264LTPRO }, | 406 | { PCI_CHIP_MACH64LB, "3D RAGE LT PRO (Mach64 LB, AGP)", 236, 75, 100, 135, ATI_CHIP_264LTPRO }, |
| 407 | { PCI_CHIP_MACH64LD, "3D RAGE LT PRO (Mach64 LD, AGP)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, | 407 | { PCI_CHIP_MACH64LD, "3D RAGE LT PRO (Mach64 LD, AGP)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, |
| 408 | { PCI_CHIP_MACH64LI, "3D RAGE LT PRO (Mach64 LI, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1_1 | M64F_G3_PB_1024x768 }, | 408 | { PCI_CHIP_MACH64LI, "3D RAGE LT PRO (Mach64 LI, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1_1 | M64F_G3_PB_1024x768 }, |
| 409 | { PCI_CHIP_MACH64LP, "3D RAGE LT PRO (Mach64 LP, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, | 409 | { PCI_CHIP_MACH64LP, "3D RAGE LT PRO (Mach64 LP, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1024x768 }, |
| 410 | { PCI_CHIP_MACH64LQ, "3D RAGE LT PRO (Mach64 LQ, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, | 410 | { PCI_CHIP_MACH64LQ, "3D RAGE LT PRO (Mach64 LQ, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, |
| 411 | 411 | ||
| 412 | { PCI_CHIP_MACH64GM, "3D RAGE XL (Mach64 GM, AGP 2x)", 230, 83, 63, 135, ATI_CHIP_264XL }, | 412 | { PCI_CHIP_MACH64GM, "3D RAGE XL (Mach64 GM, AGP 2x)", 230, 83, 63, 135, ATI_CHIP_264XL }, |
diff --git a/drivers/video/aty/radeon_i2c.c b/drivers/video/aty/radeon_i2c.c index 676754520099..869725a13c21 100644 --- a/drivers/video/aty/radeon_i2c.c +++ b/drivers/video/aty/radeon_i2c.c | |||
| @@ -139,7 +139,13 @@ void radeon_delete_i2c_busses(struct radeonfb_info *rinfo) | |||
| 139 | int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn, | 139 | int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn, |
| 140 | u8 **out_edid) | 140 | u8 **out_edid) |
| 141 | { | 141 | { |
| 142 | u8 *edid = fb_ddc_read(&rinfo->i2c[conn-1].adapter); | 142 | u32 reg = rinfo->i2c[conn-1].ddc_reg; |
| 143 | u8 *edid; | ||
| 144 | |||
| 145 | OUTREG(reg, INREG(reg) & | ||
| 146 | ~(VGA_DDC_DATA_OUTPUT | VGA_DDC_CLK_OUTPUT)); | ||
| 147 | |||
| 148 | edid = fb_ddc_read(&rinfo->i2c[conn-1].adapter); | ||
| 143 | 149 | ||
| 144 | if (out_edid) | 150 | if (out_edid) |
| 145 | *out_edid = edid; | 151 | *out_edid = edid; |
diff --git a/drivers/video/fb_ddc.c b/drivers/video/fb_ddc.c index 3aa6ebf68f17..f836137a0eda 100644 --- a/drivers/video/fb_ddc.c +++ b/drivers/video/fb_ddc.c | |||
| @@ -20,26 +20,26 @@ | |||
| 20 | static unsigned char *fb_do_probe_ddc_edid(struct i2c_adapter *adapter) | 20 | static unsigned char *fb_do_probe_ddc_edid(struct i2c_adapter *adapter) |
| 21 | { | 21 | { |
| 22 | unsigned char start = 0x0; | 22 | unsigned char start = 0x0; |
| 23 | unsigned char *buf = kmalloc(EDID_LENGTH, GFP_KERNEL); | ||
| 23 | struct i2c_msg msgs[] = { | 24 | struct i2c_msg msgs[] = { |
| 24 | { | 25 | { |
| 25 | .addr = DDC_ADDR, | 26 | .addr = DDC_ADDR, |
| 27 | .flags = 0, | ||
| 26 | .len = 1, | 28 | .len = 1, |
| 27 | .buf = &start, | 29 | .buf = &start, |
| 28 | }, { | 30 | }, { |
| 29 | .addr = DDC_ADDR, | 31 | .addr = DDC_ADDR, |
| 30 | .flags = I2C_M_RD, | 32 | .flags = I2C_M_RD, |
| 31 | .len = EDID_LENGTH, | 33 | .len = EDID_LENGTH, |
| 34 | .buf = buf, | ||
| 32 | } | 35 | } |
| 33 | }; | 36 | }; |
| 34 | unsigned char *buf; | ||
| 35 | 37 | ||
| 36 | buf = kmalloc(EDID_LENGTH, GFP_KERNEL); | ||
| 37 | if (!buf) { | 38 | if (!buf) { |
| 38 | dev_warn(&adapter->dev, "unable to allocate memory for EDID " | 39 | dev_warn(&adapter->dev, "unable to allocate memory for EDID " |
| 39 | "block.\n"); | 40 | "block.\n"); |
| 40 | return NULL; | 41 | return NULL; |
| 41 | } | 42 | } |
| 42 | msgs[1].buf = buf; | ||
| 43 | 43 | ||
| 44 | if (i2c_transfer(adapter, msgs, 2) == 2) | 44 | if (i2c_transfer(adapter, msgs, 2) == 2) |
| 45 | return buf; | 45 | return buf; |
diff --git a/drivers/video/nvidia/nv_setup.c b/drivers/video/nvidia/nv_setup.c index 61dc46fecf2b..eab3e282a4de 100644 --- a/drivers/video/nvidia/nv_setup.c +++ b/drivers/video/nvidia/nv_setup.c | |||
| @@ -262,7 +262,7 @@ static void nv10GetConfig(struct nvidia_par *par) | |||
| 262 | #endif | 262 | #endif |
| 263 | 263 | ||
| 264 | dev = pci_find_slot(0, 1); | 264 | dev = pci_find_slot(0, 1); |
| 265 | if ((par->Chipset && 0xffff) == 0x01a0) { | 265 | if ((par->Chipset & 0xffff) == 0x01a0) { |
| 266 | int amt = 0; | 266 | int amt = 0; |
| 267 | 267 | ||
| 268 | pci_read_config_dword(dev, 0x7c, &amt); | 268 | pci_read_config_dword(dev, 0x7c, &amt); |
diff --git a/drivers/video/pnx4008/pnxrgbfb.c b/drivers/video/pnx4008/pnxrgbfb.c index 7d9453c91a42..f29e66e2d774 100644 --- a/drivers/video/pnx4008/pnxrgbfb.c +++ b/drivers/video/pnx4008/pnxrgbfb.c | |||
| @@ -154,7 +154,8 @@ static int __devinit rgbfb_probe(struct platform_device *pdev) | |||
| 154 | goto err1; | 154 | goto err1; |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | if (!fb_get_options("pnxrgbfb", &option) && !strcmp(option, "nocursor")) | 157 | if (!fb_get_options("pnxrgbfb", &option) && option && |
| 158 | !strcmp(option, "nocursor")) | ||
| 158 | rgbfb_ops.fb_cursor = no_cursor; | 159 | rgbfb_ops.fb_cursor = no_cursor; |
| 159 | 160 | ||
| 160 | info->node = -1; | 161 | info->node = -1; |
| @@ -191,7 +192,7 @@ err: | |||
| 191 | 192 | ||
| 192 | static struct platform_driver rgbfb_driver = { | 193 | static struct platform_driver rgbfb_driver = { |
| 193 | .driver = { | 194 | .driver = { |
| 194 | .name = "rgbfb", | 195 | .name = "pnx4008-rgbfb", |
| 195 | }, | 196 | }, |
| 196 | .probe = rgbfb_probe, | 197 | .probe = rgbfb_probe, |
| 197 | .remove = rgbfb_remove, | 198 | .remove = rgbfb_remove, |
diff --git a/drivers/video/pnx4008/sdum.c b/drivers/video/pnx4008/sdum.c index 51f0ecc2a511..d23bf0d659b6 100644 --- a/drivers/video/pnx4008/sdum.c +++ b/drivers/video/pnx4008/sdum.c | |||
| @@ -848,7 +848,7 @@ static int sdum_remove(struct platform_device *pdev) | |||
| 848 | 848 | ||
| 849 | static struct platform_driver sdum_driver = { | 849 | static struct platform_driver sdum_driver = { |
| 850 | .driver = { | 850 | .driver = { |
| 851 | .name = "sdum", | 851 | .name = "pnx4008-sdum", |
| 852 | }, | 852 | }, |
| 853 | .probe = sdum_probe, | 853 | .probe = sdum_probe, |
| 854 | .remove = sdum_remove, | 854 | .remove = sdum_remove, |
diff --git a/drivers/w1/masters/matrox_w1.c b/drivers/w1/masters/matrox_w1.c index 2788b8ca9bb1..6f9d880ab2e9 100644 --- a/drivers/w1/masters/matrox_w1.c +++ b/drivers/w1/masters/matrox_w1.c | |||
| @@ -215,6 +215,8 @@ static int __devinit matrox_w1_probe(struct pci_dev *pdev, const struct pci_devi | |||
| 215 | return 0; | 215 | return 0; |
| 216 | 216 | ||
| 217 | err_out_free_device: | 217 | err_out_free_device: |
| 218 | if (dev->virt_addr) | ||
| 219 | iounmap(dev->virt_addr); | ||
| 218 | kfree(dev); | 220 | kfree(dev); |
| 219 | 221 | ||
| 220 | return err; | 222 | return err; |
diff --git a/fs/Kconfig b/fs/Kconfig index 133dcc8a4150..7b1511d50b05 100644 --- a/fs/Kconfig +++ b/fs/Kconfig | |||
| @@ -2060,8 +2060,7 @@ config CODA_FS_OLD_API | |||
| 2060 | For most cases you probably want to say N. | 2060 | For most cases you probably want to say N. |
| 2061 | 2061 | ||
| 2062 | config AFS_FS | 2062 | config AFS_FS |
| 2063 | # for fs/nls/Config.in | 2063 | tristate "Andrew File System support (AFS) (EXPERIMENTAL)" |
| 2064 | tristate "Andrew File System support (AFS) (Experimental)" | ||
| 2065 | depends on INET && EXPERIMENTAL | 2064 | depends on INET && EXPERIMENTAL |
| 2066 | select RXRPC | 2065 | select RXRPC |
| 2067 | help | 2066 | help |
diff --git a/fs/autofs/inode.c b/fs/autofs/inode.c index 54c518c89e4c..38ede5c9d6fd 100644 --- a/fs/autofs/inode.c +++ b/fs/autofs/inode.c | |||
| @@ -25,6 +25,14 @@ void autofs_kill_sb(struct super_block *sb) | |||
| 25 | struct autofs_sb_info *sbi = autofs_sbi(sb); | 25 | struct autofs_sb_info *sbi = autofs_sbi(sb); |
| 26 | unsigned int n; | 26 | unsigned int n; |
| 27 | 27 | ||
| 28 | /* | ||
| 29 | * In the event of a failure in get_sb_nodev the superblock | ||
| 30 | * info is not present so nothing else has been setup, so | ||
| 31 | * just exit when we are called from deactivate_super. | ||
| 32 | */ | ||
| 33 | if (!sbi) | ||
| 34 | return; | ||
| 35 | |||
| 28 | if ( !sbi->catatonic ) | 36 | if ( !sbi->catatonic ) |
| 29 | autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */ | 37 | autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */ |
| 30 | 38 | ||
| @@ -136,7 +144,8 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) | |||
| 136 | 144 | ||
| 137 | s->s_fs_info = sbi; | 145 | s->s_fs_info = sbi; |
| 138 | sbi->magic = AUTOFS_SBI_MAGIC; | 146 | sbi->magic = AUTOFS_SBI_MAGIC; |
| 139 | sbi->catatonic = 0; | 147 | sbi->pipe = NULL; |
| 148 | sbi->catatonic = 1; | ||
| 140 | sbi->exp_timeout = 0; | 149 | sbi->exp_timeout = 0; |
| 141 | sbi->oz_pgrp = process_group(current); | 150 | sbi->oz_pgrp = process_group(current); |
| 142 | autofs_initialize_hash(&sbi->dirhash); | 151 | autofs_initialize_hash(&sbi->dirhash); |
| @@ -180,6 +189,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) | |||
| 180 | if ( !pipe->f_op || !pipe->f_op->write ) | 189 | if ( !pipe->f_op || !pipe->f_op->write ) |
| 181 | goto fail_fput; | 190 | goto fail_fput; |
| 182 | sbi->pipe = pipe; | 191 | sbi->pipe = pipe; |
| 192 | sbi->catatonic = 0; | ||
| 183 | 193 | ||
| 184 | /* | 194 | /* |
| 185 | * Success! Install the root dentry now to indicate completion. | 195 | * Success! Install the root dentry now to indicate completion. |
| @@ -198,6 +208,8 @@ fail_iput: | |||
| 198 | iput(root_inode); | 208 | iput(root_inode); |
| 199 | fail_free: | 209 | fail_free: |
| 200 | kfree(sbi); | 210 | kfree(sbi); |
| 211 | s->s_fs_info = NULL; | ||
| 212 | kill_anon_super(s); | ||
| 201 | fail_unlock: | 213 | fail_unlock: |
| 202 | return -EINVAL; | 214 | return -EINVAL; |
| 203 | } | 215 | } |
diff --git a/fs/autofs/waitq.c b/fs/autofs/waitq.c index 633f628005b4..19a9cafb5ddf 100644 --- a/fs/autofs/waitq.c +++ b/fs/autofs/waitq.c | |||
| @@ -41,6 +41,7 @@ void autofs_catatonic_mode(struct autofs_sb_info *sbi) | |||
| 41 | wq = nwq; | 41 | wq = nwq; |
| 42 | } | 42 | } |
| 43 | fput(sbi->pipe); /* Close the pipe */ | 43 | fput(sbi->pipe); /* Close the pipe */ |
| 44 | sbi->pipe = NULL; | ||
| 44 | autofs_hash_dputall(&sbi->dirhash); /* Remove all dentry pointers */ | 45 | autofs_hash_dputall(&sbi->dirhash); /* Remove all dentry pointers */ |
| 45 | } | 46 | } |
| 46 | 47 | ||
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index 51fd8595bf85..ce7c0f1dd529 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
| @@ -99,6 +99,9 @@ static void autofs4_force_release(struct autofs_sb_info *sbi) | |||
| 99 | struct dentry *this_parent = sbi->sb->s_root; | 99 | struct dentry *this_parent = sbi->sb->s_root; |
| 100 | struct list_head *next; | 100 | struct list_head *next; |
| 101 | 101 | ||
| 102 | if (!sbi->sb->s_root) | ||
| 103 | return; | ||
| 104 | |||
| 102 | spin_lock(&dcache_lock); | 105 | spin_lock(&dcache_lock); |
| 103 | repeat: | 106 | repeat: |
| 104 | next = this_parent->d_subdirs.next; | 107 | next = this_parent->d_subdirs.next; |
| @@ -146,6 +149,14 @@ void autofs4_kill_sb(struct super_block *sb) | |||
| 146 | { | 149 | { |
| 147 | struct autofs_sb_info *sbi = autofs4_sbi(sb); | 150 | struct autofs_sb_info *sbi = autofs4_sbi(sb); |
| 148 | 151 | ||
| 152 | /* | ||
| 153 | * In the event of a failure in get_sb_nodev the superblock | ||
| 154 | * info is not present so nothing else has been setup, so | ||
| 155 | * just exit when we are called from deactivate_super. | ||
| 156 | */ | ||
| 157 | if (!sbi) | ||
| 158 | return; | ||
| 159 | |||
| 149 | sb->s_fs_info = NULL; | 160 | sb->s_fs_info = NULL; |
| 150 | 161 | ||
| 151 | if ( !sbi->catatonic ) | 162 | if ( !sbi->catatonic ) |
| @@ -310,7 +321,8 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
| 310 | s->s_fs_info = sbi; | 321 | s->s_fs_info = sbi; |
| 311 | sbi->magic = AUTOFS_SBI_MAGIC; | 322 | sbi->magic = AUTOFS_SBI_MAGIC; |
| 312 | sbi->pipefd = -1; | 323 | sbi->pipefd = -1; |
| 313 | sbi->catatonic = 0; | 324 | sbi->pipe = NULL; |
| 325 | sbi->catatonic = 1; | ||
| 314 | sbi->exp_timeout = 0; | 326 | sbi->exp_timeout = 0; |
| 315 | sbi->oz_pgrp = process_group(current); | 327 | sbi->oz_pgrp = process_group(current); |
| 316 | sbi->sb = s; | 328 | sbi->sb = s; |
| @@ -388,6 +400,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
| 388 | goto fail_fput; | 400 | goto fail_fput; |
| 389 | sbi->pipe = pipe; | 401 | sbi->pipe = pipe; |
| 390 | sbi->pipefd = pipefd; | 402 | sbi->pipefd = pipefd; |
| 403 | sbi->catatonic = 0; | ||
| 391 | 404 | ||
| 392 | /* | 405 | /* |
| 393 | * Success! Install the root dentry now to indicate completion. | 406 | * Success! Install the root dentry now to indicate completion. |
| @@ -412,6 +425,8 @@ fail_ino: | |||
| 412 | kfree(ino); | 425 | kfree(ino); |
| 413 | fail_free: | 426 | fail_free: |
| 414 | kfree(sbi); | 427 | kfree(sbi); |
| 428 | s->s_fs_info = NULL; | ||
| 429 | kill_anon_super(s); | ||
| 415 | fail_unlock: | 430 | fail_unlock: |
| 416 | return -EINVAL; | 431 | return -EINVAL; |
| 417 | } | 432 | } |
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index c0a6c8d445c7..1e4a539f4417 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c | |||
| @@ -41,10 +41,8 @@ void autofs4_catatonic_mode(struct autofs_sb_info *sbi) | |||
| 41 | wake_up_interruptible(&wq->queue); | 41 | wake_up_interruptible(&wq->queue); |
| 42 | wq = nwq; | 42 | wq = nwq; |
| 43 | } | 43 | } |
| 44 | if (sbi->pipe) { | 44 | fput(sbi->pipe); /* Close the pipe */ |
| 45 | fput(sbi->pipe); /* Close the pipe */ | 45 | sbi->pipe = NULL; |
| 46 | sbi->pipe = NULL; | ||
| 47 | } | ||
| 48 | } | 46 | } |
| 49 | 47 | ||
| 50 | static int autofs4_write(struct file *file, const void *addr, int bytes) | 48 | static int autofs4_write(struct file *file, const void *addr, int bytes) |
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index e77676df6713..137d76c3f90a 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/mount.h> | 21 | #include <linux/mount.h> |
| 22 | #include <linux/pagemap.h> | 22 | #include <linux/pagemap.h> |
| 23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
| 24 | #include <linux/kobject.h> | ||
| 24 | #include <linux/namei.h> | 25 | #include <linux/namei.h> |
| 25 | #include <linux/debugfs.h> | 26 | #include <linux/debugfs.h> |
| 26 | 27 | ||
| @@ -147,13 +148,13 @@ static int debugfs_create_by_name(const char *name, mode_t mode, | |||
| 147 | *dentry = NULL; | 148 | *dentry = NULL; |
| 148 | mutex_lock(&parent->d_inode->i_mutex); | 149 | mutex_lock(&parent->d_inode->i_mutex); |
| 149 | *dentry = lookup_one_len(name, parent, strlen(name)); | 150 | *dentry = lookup_one_len(name, parent, strlen(name)); |
| 150 | if (!IS_ERR(dentry)) { | 151 | if (!IS_ERR(*dentry)) { |
| 151 | if ((mode & S_IFMT) == S_IFDIR) | 152 | if ((mode & S_IFMT) == S_IFDIR) |
| 152 | error = debugfs_mkdir(parent->d_inode, *dentry, mode); | 153 | error = debugfs_mkdir(parent->d_inode, *dentry, mode); |
| 153 | else | 154 | else |
| 154 | error = debugfs_create(parent->d_inode, *dentry, mode); | 155 | error = debugfs_create(parent->d_inode, *dentry, mode); |
| 155 | } else | 156 | } else |
| 156 | error = PTR_ERR(dentry); | 157 | error = PTR_ERR(*dentry); |
| 157 | mutex_unlock(&parent->d_inode->i_mutex); | 158 | mutex_unlock(&parent->d_inode->i_mutex); |
| 158 | 159 | ||
| 159 | return error; | 160 | return error; |
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 136175a69332..f63a7755fe86 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
| @@ -820,7 +820,8 @@ int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat) | |||
| 820 | crypt_stat->tfm = crypto_alloc_blkcipher(full_alg_name, 0, | 820 | crypt_stat->tfm = crypto_alloc_blkcipher(full_alg_name, 0, |
| 821 | CRYPTO_ALG_ASYNC); | 821 | CRYPTO_ALG_ASYNC); |
| 822 | kfree(full_alg_name); | 822 | kfree(full_alg_name); |
| 823 | if (!crypt_stat->tfm) { | 823 | if (IS_ERR(crypt_stat->tfm)) { |
| 824 | rc = PTR_ERR(crypt_stat->tfm); | ||
| 824 | ecryptfs_printk(KERN_ERR, "cryptfs: init_crypt_ctx(): " | 825 | ecryptfs_printk(KERN_ERR, "cryptfs: init_crypt_ctx(): " |
| 825 | "Error initializing cipher [%s]\n", | 826 | "Error initializing cipher [%s]\n", |
| 826 | crypt_stat->cipher); | 827 | crypt_stat->cipher); |
diff --git a/fs/ecryptfs/dentry.c b/fs/ecryptfs/dentry.c index 0b9992ab990f..52d1e36dc746 100644 --- a/fs/ecryptfs/dentry.c +++ b/fs/ecryptfs/dentry.c | |||
| @@ -57,6 +57,12 @@ static int ecryptfs_d_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
| 57 | rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd); | 57 | rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd); |
| 58 | nd->dentry = dentry_save; | 58 | nd->dentry = dentry_save; |
| 59 | nd->mnt = vfsmount_save; | 59 | nd->mnt = vfsmount_save; |
| 60 | if (dentry->d_inode) { | ||
| 61 | struct inode *lower_inode = | ||
| 62 | ecryptfs_inode_to_lower(dentry->d_inode); | ||
| 63 | |||
| 64 | ecryptfs_copy_attr_all(dentry->d_inode, lower_inode); | ||
| 65 | } | ||
| 60 | out: | 66 | out: |
| 61 | return rc; | 67 | return rc; |
| 62 | } | 68 | } |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index ff4865d24f0f..dfcc68484f47 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -470,6 +470,7 @@ out_lock: | |||
| 470 | unlock_dir(lower_dir_dentry); | 470 | unlock_dir(lower_dir_dentry); |
| 471 | dput(lower_new_dentry); | 471 | dput(lower_new_dentry); |
| 472 | dput(lower_old_dentry); | 472 | dput(lower_old_dentry); |
| 473 | d_drop(lower_old_dentry); | ||
| 473 | d_drop(new_dentry); | 474 | d_drop(new_dentry); |
| 474 | d_drop(old_dentry); | 475 | d_drop(old_dentry); |
| 475 | return rc; | 476 | return rc; |
| @@ -484,7 +485,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry) | |||
| 484 | lock_parent(lower_dentry); | 485 | lock_parent(lower_dentry); |
| 485 | rc = vfs_unlink(lower_dir_inode, lower_dentry); | 486 | rc = vfs_unlink(lower_dir_inode, lower_dentry); |
| 486 | if (rc) { | 487 | if (rc) { |
| 487 | ecryptfs_printk(KERN_ERR, "Error in vfs_unlink\n"); | 488 | printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc); |
| 488 | goto out_unlock; | 489 | goto out_unlock; |
| 489 | } | 490 | } |
| 490 | ecryptfs_copy_attr_times(dir, lower_dir_inode); | 491 | ecryptfs_copy_attr_times(dir, lower_dir_inode); |
| @@ -630,6 +631,8 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 630 | ecryptfs_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode); | 631 | ecryptfs_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode); |
| 631 | out_lock: | 632 | out_lock: |
| 632 | unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry); | 633 | unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry); |
| 634 | dput(lower_new_dentry->d_parent); | ||
| 635 | dput(lower_old_dentry->d_parent); | ||
| 633 | dput(lower_new_dentry); | 636 | dput(lower_new_dentry); |
| 634 | dput(lower_old_dentry); | 637 | dput(lower_old_dentry); |
| 635 | return rc; | 638 | return rc; |
diff --git a/fs/fat/file.c b/fs/fat/file.c index 8337451e7897..0aa813d944a6 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c | |||
| @@ -303,7 +303,17 @@ void fat_truncate(struct inode *inode) | |||
| 303 | fat_flush_inodes(inode->i_sb, inode, NULL); | 303 | fat_flush_inodes(inode->i_sb, inode, NULL); |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | int fat_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) | ||
| 307 | { | ||
| 308 | struct inode *inode = dentry->d_inode; | ||
| 309 | generic_fillattr(inode, stat); | ||
| 310 | stat->blksize = MSDOS_SB(inode->i_sb)->cluster_size; | ||
| 311 | return 0; | ||
| 312 | } | ||
| 313 | EXPORT_SYMBOL_GPL(fat_getattr); | ||
| 314 | |||
| 306 | struct inode_operations fat_file_inode_operations = { | 315 | struct inode_operations fat_file_inode_operations = { |
| 307 | .truncate = fat_truncate, | 316 | .truncate = fat_truncate, |
| 308 | .setattr = fat_notify_change, | 317 | .setattr = fat_notify_change, |
| 318 | .getattr = fat_getattr, | ||
| 309 | }; | 319 | }; |
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index cfc8f81e60d0..c71a6c092ad9 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c | |||
| @@ -138,6 +138,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) | |||
| 138 | struct fuse_entry_out outarg; | 138 | struct fuse_entry_out outarg; |
| 139 | struct fuse_conn *fc; | 139 | struct fuse_conn *fc; |
| 140 | struct fuse_req *req; | 140 | struct fuse_req *req; |
| 141 | struct fuse_req *forget_req; | ||
| 141 | struct dentry *parent; | 142 | struct dentry *parent; |
| 142 | 143 | ||
| 143 | /* Doesn't hurt to "reset" the validity timeout */ | 144 | /* Doesn't hurt to "reset" the validity timeout */ |
| @@ -152,25 +153,33 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) | |||
| 152 | if (IS_ERR(req)) | 153 | if (IS_ERR(req)) |
| 153 | return 0; | 154 | return 0; |
| 154 | 155 | ||
| 156 | forget_req = fuse_get_req(fc); | ||
| 157 | if (IS_ERR(forget_req)) { | ||
| 158 | fuse_put_request(fc, req); | ||
| 159 | return 0; | ||
| 160 | } | ||
| 161 | |||
| 155 | parent = dget_parent(entry); | 162 | parent = dget_parent(entry); |
| 156 | fuse_lookup_init(req, parent->d_inode, entry, &outarg); | 163 | fuse_lookup_init(req, parent->d_inode, entry, &outarg); |
| 157 | request_send(fc, req); | 164 | request_send(fc, req); |
| 158 | dput(parent); | 165 | dput(parent); |
| 159 | err = req->out.h.error; | 166 | err = req->out.h.error; |
| 167 | fuse_put_request(fc, req); | ||
| 160 | /* Zero nodeid is same as -ENOENT */ | 168 | /* Zero nodeid is same as -ENOENT */ |
| 161 | if (!err && !outarg.nodeid) | 169 | if (!err && !outarg.nodeid) |
| 162 | err = -ENOENT; | 170 | err = -ENOENT; |
| 163 | if (!err) { | 171 | if (!err) { |
| 164 | struct fuse_inode *fi = get_fuse_inode(inode); | 172 | struct fuse_inode *fi = get_fuse_inode(inode); |
| 165 | if (outarg.nodeid != get_node_id(inode)) { | 173 | if (outarg.nodeid != get_node_id(inode)) { |
| 166 | fuse_send_forget(fc, req, outarg.nodeid, 1); | 174 | fuse_send_forget(fc, forget_req, |
| 175 | outarg.nodeid, 1); | ||
| 167 | return 0; | 176 | return 0; |
| 168 | } | 177 | } |
| 169 | spin_lock(&fc->lock); | 178 | spin_lock(&fc->lock); |
| 170 | fi->nlookup ++; | 179 | fi->nlookup ++; |
| 171 | spin_unlock(&fc->lock); | 180 | spin_unlock(&fc->lock); |
| 172 | } | 181 | } |
| 173 | fuse_put_request(fc, req); | 182 | fuse_put_request(fc, forget_req); |
| 174 | if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT) | 183 | if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT) |
| 175 | return 0; | 184 | return 0; |
| 176 | 185 | ||
| @@ -221,6 +230,7 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry, | |||
| 221 | struct inode *inode = NULL; | 230 | struct inode *inode = NULL; |
| 222 | struct fuse_conn *fc = get_fuse_conn(dir); | 231 | struct fuse_conn *fc = get_fuse_conn(dir); |
| 223 | struct fuse_req *req; | 232 | struct fuse_req *req; |
| 233 | struct fuse_req *forget_req; | ||
| 224 | 234 | ||
| 225 | if (entry->d_name.len > FUSE_NAME_MAX) | 235 | if (entry->d_name.len > FUSE_NAME_MAX) |
| 226 | return ERR_PTR(-ENAMETOOLONG); | 236 | return ERR_PTR(-ENAMETOOLONG); |
| @@ -229,9 +239,16 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry, | |||
| 229 | if (IS_ERR(req)) | 239 | if (IS_ERR(req)) |
| 230 | return ERR_PTR(PTR_ERR(req)); | 240 | return ERR_PTR(PTR_ERR(req)); |
| 231 | 241 | ||
| 242 | forget_req = fuse_get_req(fc); | ||
| 243 | if (IS_ERR(forget_req)) { | ||
| 244 | fuse_put_request(fc, req); | ||
| 245 | return ERR_PTR(PTR_ERR(forget_req)); | ||
| 246 | } | ||
| 247 | |||
| 232 | fuse_lookup_init(req, dir, entry, &outarg); | 248 | fuse_lookup_init(req, dir, entry, &outarg); |
| 233 | request_send(fc, req); | 249 | request_send(fc, req); |
| 234 | err = req->out.h.error; | 250 | err = req->out.h.error; |
| 251 | fuse_put_request(fc, req); | ||
| 235 | /* Zero nodeid is same as -ENOENT, but with valid timeout */ | 252 | /* Zero nodeid is same as -ENOENT, but with valid timeout */ |
| 236 | if (!err && outarg.nodeid && | 253 | if (!err && outarg.nodeid && |
| 237 | (invalid_nodeid(outarg.nodeid) || !valid_mode(outarg.attr.mode))) | 254 | (invalid_nodeid(outarg.nodeid) || !valid_mode(outarg.attr.mode))) |
| @@ -240,11 +257,11 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry, | |||
| 240 | inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation, | 257 | inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation, |
| 241 | &outarg.attr); | 258 | &outarg.attr); |
| 242 | if (!inode) { | 259 | if (!inode) { |
| 243 | fuse_send_forget(fc, req, outarg.nodeid, 1); | 260 | fuse_send_forget(fc, forget_req, outarg.nodeid, 1); |
| 244 | return ERR_PTR(-ENOMEM); | 261 | return ERR_PTR(-ENOMEM); |
| 245 | } | 262 | } |
| 246 | } | 263 | } |
| 247 | fuse_put_request(fc, req); | 264 | fuse_put_request(fc, forget_req); |
| 248 | if (err && err != -ENOENT) | 265 | if (err && err != -ENOENT) |
| 249 | return ERR_PTR(err); | 266 | return ERR_PTR(err); |
| 250 | 267 | ||
| @@ -388,6 +405,13 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req, | |||
| 388 | struct fuse_entry_out outarg; | 405 | struct fuse_entry_out outarg; |
| 389 | struct inode *inode; | 406 | struct inode *inode; |
| 390 | int err; | 407 | int err; |
| 408 | struct fuse_req *forget_req; | ||
| 409 | |||
| 410 | forget_req = fuse_get_req(fc); | ||
| 411 | if (IS_ERR(forget_req)) { | ||
| 412 | fuse_put_request(fc, req); | ||
| 413 | return PTR_ERR(forget_req); | ||
| 414 | } | ||
| 391 | 415 | ||
| 392 | req->in.h.nodeid = get_node_id(dir); | 416 | req->in.h.nodeid = get_node_id(dir); |
| 393 | req->out.numargs = 1; | 417 | req->out.numargs = 1; |
| @@ -395,24 +419,24 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req, | |||
| 395 | req->out.args[0].value = &outarg; | 419 | req->out.args[0].value = &outarg; |
| 396 | request_send(fc, req); | 420 | request_send(fc, req); |
| 397 | err = req->out.h.error; | 421 | err = req->out.h.error; |
| 398 | if (err) { | 422 | fuse_put_request(fc, req); |
| 399 | fuse_put_request(fc, req); | 423 | if (err) |
| 400 | return err; | 424 | goto out_put_forget_req; |
| 401 | } | 425 | |
| 402 | err = -EIO; | 426 | err = -EIO; |
| 403 | if (invalid_nodeid(outarg.nodeid)) | 427 | if (invalid_nodeid(outarg.nodeid)) |
| 404 | goto out_put_request; | 428 | goto out_put_forget_req; |
| 405 | 429 | ||
| 406 | if ((outarg.attr.mode ^ mode) & S_IFMT) | 430 | if ((outarg.attr.mode ^ mode) & S_IFMT) |
| 407 | goto out_put_request; | 431 | goto out_put_forget_req; |
| 408 | 432 | ||
| 409 | inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation, | 433 | inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation, |
| 410 | &outarg.attr); | 434 | &outarg.attr); |
| 411 | if (!inode) { | 435 | if (!inode) { |
| 412 | fuse_send_forget(fc, req, outarg.nodeid, 1); | 436 | fuse_send_forget(fc, forget_req, outarg.nodeid, 1); |
| 413 | return -ENOMEM; | 437 | return -ENOMEM; |
| 414 | } | 438 | } |
| 415 | fuse_put_request(fc, req); | 439 | fuse_put_request(fc, forget_req); |
| 416 | 440 | ||
| 417 | if (S_ISDIR(inode->i_mode)) { | 441 | if (S_ISDIR(inode->i_mode)) { |
| 418 | struct dentry *alias; | 442 | struct dentry *alias; |
| @@ -434,8 +458,8 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req, | |||
| 434 | fuse_invalidate_attr(dir); | 458 | fuse_invalidate_attr(dir); |
| 435 | return 0; | 459 | return 0; |
| 436 | 460 | ||
| 437 | out_put_request: | 461 | out_put_forget_req: |
| 438 | fuse_put_request(fc, req); | 462 | fuse_put_request(fc, forget_req); |
| 439 | return err; | 463 | return err; |
| 440 | } | 464 | } |
| 441 | 465 | ||
diff --git a/fs/hfs/super.c b/fs/hfs/super.c index d43b4fcc8ad3..85b17b3fa4a0 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c | |||
| @@ -390,11 +390,13 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 390 | hfs_find_exit(&fd); | 390 | hfs_find_exit(&fd); |
| 391 | goto bail_no_root; | 391 | goto bail_no_root; |
| 392 | } | 392 | } |
| 393 | res = -EINVAL; | ||
| 393 | root_inode = hfs_iget(sb, &fd.search_key->cat, &rec); | 394 | root_inode = hfs_iget(sb, &fd.search_key->cat, &rec); |
| 394 | hfs_find_exit(&fd); | 395 | hfs_find_exit(&fd); |
| 395 | if (!root_inode) | 396 | if (!root_inode) |
| 396 | goto bail_no_root; | 397 | goto bail_no_root; |
| 397 | 398 | ||
| 399 | res = -ENOMEM; | ||
| 398 | sb->s_root = d_alloc_root(root_inode); | 400 | sb->s_root = d_alloc_root(root_inode); |
| 399 | if (!sb->s_root) | 401 | if (!sb->s_root) |
| 400 | goto bail_iput; | 402 | goto bail_iput; |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 0bea6a619e10..7f4756963d05 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
| @@ -62,24 +62,19 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 62 | loff_t len, vma_len; | 62 | loff_t len, vma_len; |
| 63 | int ret; | 63 | int ret; |
| 64 | 64 | ||
| 65 | if (vma->vm_pgoff & (HPAGE_SIZE / PAGE_SIZE - 1)) | 65 | /* |
| 66 | return -EINVAL; | 66 | * vma alignment has already been checked by prepare_hugepage_range. |
| 67 | 67 | * If you add any error returns here, do so after setting VM_HUGETLB, | |
| 68 | if (vma->vm_start & ~HPAGE_MASK) | 68 | * so is_vm_hugetlb_page tests below unmap_region go the right way |
| 69 | return -EINVAL; | 69 | * when do_mmap_pgoff unwinds (may be important on powerpc and ia64). |
| 70 | 70 | */ | |
| 71 | if (vma->vm_end & ~HPAGE_MASK) | 71 | vma->vm_flags |= VM_HUGETLB | VM_RESERVED; |
| 72 | return -EINVAL; | 72 | vma->vm_ops = &hugetlb_vm_ops; |
| 73 | |||
| 74 | if (vma->vm_end - vma->vm_start < HPAGE_SIZE) | ||
| 75 | return -EINVAL; | ||
| 76 | 73 | ||
| 77 | vma_len = (loff_t)(vma->vm_end - vma->vm_start); | 74 | vma_len = (loff_t)(vma->vm_end - vma->vm_start); |
| 78 | 75 | ||
| 79 | mutex_lock(&inode->i_mutex); | 76 | mutex_lock(&inode->i_mutex); |
| 80 | file_accessed(file); | 77 | file_accessed(file); |
| 81 | vma->vm_flags |= VM_HUGETLB | VM_RESERVED; | ||
| 82 | vma->vm_ops = &hugetlb_vm_ops; | ||
| 83 | 78 | ||
| 84 | ret = -ENOMEM; | 79 | ret = -ENOMEM; |
| 85 | len = vma_len + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); | 80 | len = vma_len + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); |
diff --git a/fs/msdos/namei.c b/fs/msdos/namei.c index b0f01b3b0536..452461955cbd 100644 --- a/fs/msdos/namei.c +++ b/fs/msdos/namei.c | |||
| @@ -654,6 +654,7 @@ static struct inode_operations msdos_dir_inode_operations = { | |||
| 654 | .rmdir = msdos_rmdir, | 654 | .rmdir = msdos_rmdir, |
| 655 | .rename = msdos_rename, | 655 | .rename = msdos_rename, |
| 656 | .setattr = fat_notify_change, | 656 | .setattr = fat_notify_change, |
| 657 | .getattr = fat_getattr, | ||
| 657 | }; | 658 | }; |
| 658 | 659 | ||
| 659 | static int msdos_fill_super(struct super_block *sb, void *data, int silent) | 660 | static int msdos_fill_super(struct super_block *sb, void *data, int silent) |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 8df27401d292..795319c54f72 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -442,7 +442,8 @@ static int mountstats_open(struct inode *inode, struct file *file) | |||
| 442 | 442 | ||
| 443 | if (task) { | 443 | if (task) { |
| 444 | task_lock(task); | 444 | task_lock(task); |
| 445 | namespace = task->nsproxy->namespace; | 445 | if (task->nsproxy) |
| 446 | namespace = task->nsproxy->namespace; | ||
| 446 | if (namespace) | 447 | if (namespace) |
| 447 | get_namespace(namespace); | 448 | get_namespace(namespace); |
| 448 | task_unlock(task); | 449 | task_unlock(task); |
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c index b67ce9354048..ac14318c81ba 100644 --- a/fs/reiserfs/file.c +++ b/fs/reiserfs/file.c | |||
| @@ -74,7 +74,8 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp) | |||
| 74 | igrab(inode); | 74 | igrab(inode); |
| 75 | reiserfs_warning(inode->i_sb, | 75 | reiserfs_warning(inode->i_sb, |
| 76 | "pinning inode %lu because the " | 76 | "pinning inode %lu because the " |
| 77 | "preallocation can't be freed"); | 77 | "preallocation can't be freed", |
| 78 | inode->i_ino); | ||
| 78 | goto out; | 79 | goto out; |
| 79 | } | 80 | } |
| 80 | } | 81 | } |
diff --git a/fs/vfat/namei.c b/fs/vfat/namei.c index edb711ff7b05..0afd745a37cd 100644 --- a/fs/vfat/namei.c +++ b/fs/vfat/namei.c | |||
| @@ -1004,6 +1004,7 @@ static struct inode_operations vfat_dir_inode_operations = { | |||
| 1004 | .rmdir = vfat_rmdir, | 1004 | .rmdir = vfat_rmdir, |
| 1005 | .rename = vfat_rename, | 1005 | .rename = vfat_rename, |
| 1006 | .setattr = fat_notify_change, | 1006 | .setattr = fat_notify_change, |
| 1007 | .getattr = fat_getattr, | ||
| 1007 | }; | 1008 | }; |
| 1008 | 1009 | ||
| 1009 | static int vfat_fill_super(struct super_block *sb, void *data, int silent) | 1010 | static int vfat_fill_super(struct super_block *sb, void *data, int silent) |
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 5b050c06795f..498ad50d1f45 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
| @@ -1171,6 +1171,8 @@ xfs_bmap_add_extent_delay_real( | |||
| 1171 | xfs_bmap_trace_pre_update(fname, "0", ip, idx, XFS_DATA_FORK); | 1171 | xfs_bmap_trace_pre_update(fname, "0", ip, idx, XFS_DATA_FORK); |
| 1172 | xfs_bmbt_set_blockcount(ep, temp); | 1172 | xfs_bmbt_set_blockcount(ep, temp); |
| 1173 | r[0] = *new; | 1173 | r[0] = *new; |
| 1174 | r[1].br_state = PREV.br_state; | ||
| 1175 | r[1].br_startblock = 0; | ||
| 1174 | r[1].br_startoff = new_endoff; | 1176 | r[1].br_startoff = new_endoff; |
| 1175 | temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; | 1177 | temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; |
| 1176 | r[1].br_blockcount = temp2; | 1178 | r[1].br_blockcount = temp2; |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index d72c80dbfbb1..44dfac521285 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -2258,7 +2258,7 @@ xfs_ifree_cluster( | |||
| 2258 | AIL_LOCK(mp,s); | 2258 | AIL_LOCK(mp,s); |
| 2259 | iip->ili_flush_lsn = iip->ili_item.li_lsn; | 2259 | iip->ili_flush_lsn = iip->ili_item.li_lsn; |
| 2260 | AIL_UNLOCK(mp, s); | 2260 | AIL_UNLOCK(mp, s); |
| 2261 | xfs_iflags_set(ip, XFS_ISTALE); | 2261 | xfs_iflags_set(iip->ili_inode, XFS_ISTALE); |
| 2262 | pre_flushed++; | 2262 | pre_flushed++; |
| 2263 | } | 2263 | } |
| 2264 | lip = lip->li_bio_list; | 2264 | lip = lip->li_bio_list; |
diff --git a/include/asm-arm/arch-ebsa110/io.h b/include/asm-arm/arch-ebsa110/io.h index ae048441c9ed..722c5e086285 100644 --- a/include/asm-arm/arch-ebsa110/io.h +++ b/include/asm-arm/arch-ebsa110/io.h | |||
| @@ -27,9 +27,9 @@ void __outw(u16 val, unsigned int port); | |||
| 27 | u32 __inl(unsigned int port); | 27 | u32 __inl(unsigned int port); |
| 28 | void __outl(u32 val, unsigned int port); | 28 | void __outl(u32 val, unsigned int port); |
| 29 | 29 | ||
| 30 | u8 __readb(void __iomem *addr); | 30 | u8 __readb(const volatile void __iomem *addr); |
| 31 | u16 __readw(void __iomem *addr); | 31 | u16 __readw(const volatile void __iomem *addr); |
| 32 | u32 __readl(void __iomem *addr); | 32 | u32 __readl(const volatile void __iomem *addr); |
| 33 | 33 | ||
| 34 | void __writeb(u8 val, void __iomem *addr); | 34 | void __writeb(u8 val, void __iomem *addr); |
| 35 | void __writew(u16 val, void __iomem *addr); | 35 | void __writew(u16 val, void __iomem *addr); |
| @@ -64,8 +64,14 @@ void __writel(u32 val, void __iomem *addr); | |||
| 64 | #define writew(v,b) __writew(v,b) | 64 | #define writew(v,b) __writew(v,b) |
| 65 | #define writel(v,b) __writel(v,b) | 65 | #define writel(v,b) __writel(v,b) |
| 66 | 66 | ||
| 67 | #define __arch_ioremap(cookie,sz,c) ((void __iomem *)(cookie)) | 67 | static inline void __iomem *__arch_ioremap(unsigned long cookie, size_t size, |
| 68 | #define __arch_iounmap(cookie) do { } while (0) | 68 | unsigned int flags) |
| 69 | { | ||
| 70 | return (void __iomem *)cookie; | ||
| 71 | } | ||
| 72 | |||
| 73 | #define __arch_ioremap __arch_ioremap | ||
| 74 | #define __arch_iounmap(cookie) do { } while (0) | ||
| 69 | 75 | ||
| 70 | extern void insb(unsigned int port, void *buf, int sz); | 76 | extern void insb(unsigned int port, void *buf, int sz); |
| 71 | extern void insw(unsigned int port, void *buf, int sz); | 77 | extern void insw(unsigned int port, void *buf, int sz); |
diff --git a/include/asm-arm/arch-pxa/udc.h b/include/asm-arm/arch-pxa/udc.h index 121cd241115d..646480d37256 100644 --- a/include/asm-arm/arch-pxa/udc.h +++ b/include/asm-arm/arch-pxa/udc.h | |||
| @@ -4,23 +4,8 @@ | |||
| 4 | * This supports machine-specific differences in how the PXA2xx | 4 | * This supports machine-specific differences in how the PXA2xx |
| 5 | * USB Device Controller (UDC) is wired. | 5 | * USB Device Controller (UDC) is wired. |
| 6 | * | 6 | * |
| 7 | * It is set in linux/arch/arm/mach-pxa/<machine>.c and used in | ||
| 8 | * the probe routine of linux/drivers/usb/gadget/pxa2xx_udc.c | ||
| 9 | */ | 7 | */ |
| 10 | struct pxa2xx_udc_mach_info { | 8 | #include <asm/mach/udc_pxa2xx.h> |
| 11 | int (*udc_is_connected)(void); /* do we see host? */ | ||
| 12 | void (*udc_command)(int cmd); | ||
| 13 | #define PXA2XX_UDC_CMD_CONNECT 0 /* let host see us */ | ||
| 14 | #define PXA2XX_UDC_CMD_DISCONNECT 1 /* so host won't see us */ | ||
| 15 | |||
| 16 | /* Boards following the design guidelines in the developer's manual, | ||
| 17 | * with on-chip GPIOs not Lubbock's wierd hardware, can have a sane | ||
| 18 | * VBUS IRQ and omit the methods above. Store the GPIO number | ||
| 19 | * here; for GPIO 0, also mask in one of the pxa_gpio_mode() bits. | ||
| 20 | */ | ||
| 21 | u16 gpio_vbus; /* high == vbus present */ | ||
| 22 | u16 gpio_pullup; /* high == pullup activated */ | ||
| 23 | }; | ||
| 24 | 9 | ||
| 25 | extern void pxa_set_udc_info(struct pxa2xx_udc_mach_info *info); | 10 | extern void pxa_set_udc_info(struct pxa2xx_udc_mach_info *info); |
| 26 | 11 | ||
diff --git a/include/asm-arm/dma-mapping.h b/include/asm-arm/dma-mapping.h index 55eb4dc3253d..666617711c81 100644 --- a/include/asm-arm/dma-mapping.h +++ b/include/asm-arm/dma-mapping.h | |||
| @@ -12,6 +12,10 @@ | |||
| 12 | * uncached, unwrite-buffered mapped memory space for use with DMA | 12 | * uncached, unwrite-buffered mapped memory space for use with DMA |
| 13 | * devices. This is the "generic" version. The PCI specific version | 13 | * devices. This is the "generic" version. The PCI specific version |
| 14 | * is in pci.h | 14 | * is in pci.h |
| 15 | * | ||
| 16 | * Note: Drivers should NOT use this function directly, as it will break | ||
| 17 | * platforms with CONFIG_DMABOUNCE. | ||
| 18 | * Use the driver DMA support - see dma-mapping.h (dma_sync_*) | ||
| 15 | */ | 19 | */ |
| 16 | extern void consistent_sync(void *kaddr, size_t size, int rw); | 20 | extern void consistent_sync(void *kaddr, size_t size, int rw); |
| 17 | 21 | ||
diff --git a/include/asm-arm/mach/udc_pxa2xx.h b/include/asm-arm/mach/udc_pxa2xx.h new file mode 100644 index 000000000000..ff0a95715a07 --- /dev/null +++ b/include/asm-arm/mach/udc_pxa2xx.h | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | /* | ||
| 2 | * linux/include/asm-arm/mach/udc_pxa2xx.h | ||
| 3 | * | ||
| 4 | * This supports machine-specific differences in how the PXA2xx | ||
| 5 | * USB Device Controller (UDC) is wired. | ||
| 6 | * | ||
| 7 | * It is set in linux/arch/arm/mach-pxa/<machine>.c or in | ||
| 8 | * linux/arch/mach-ixp4xx/<machine>.c and used in | ||
| 9 | * the probe routine of linux/drivers/usb/gadget/pxa2xx_udc.c | ||
| 10 | */ | ||
| 11 | |||
| 12 | struct pxa2xx_udc_mach_info { | ||
| 13 | int (*udc_is_connected)(void); /* do we see host? */ | ||
| 14 | void (*udc_command)(int cmd); | ||
| 15 | #define PXA2XX_UDC_CMD_CONNECT 0 /* let host see us */ | ||
| 16 | #define PXA2XX_UDC_CMD_DISCONNECT 1 /* so host won't see us */ | ||
| 17 | |||
| 18 | /* Boards following the design guidelines in the developer's manual, | ||
| 19 | * with on-chip GPIOs not Lubbock's wierd hardware, can have a sane | ||
| 20 | * VBUS IRQ and omit the methods above. Store the GPIO number | ||
| 21 | * here; for GPIO 0, also mask in one of the pxa_gpio_mode() bits. | ||
| 22 | */ | ||
| 23 | u16 gpio_vbus; /* high == vbus present */ | ||
| 24 | u16 gpio_pullup; /* high == pullup activated */ | ||
| 25 | }; | ||
| 26 | |||
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 9d873163a7ab..e60d6f21fa62 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
| @@ -215,6 +215,8 @@ | |||
| 215 | .notes : { *(.note.*) } :note | 215 | .notes : { *(.note.*) } :note |
| 216 | 216 | ||
| 217 | #define INITCALLS \ | 217 | #define INITCALLS \ |
| 218 | *(.initcall0.init) \ | ||
| 219 | *(.initcall0s.init) \ | ||
| 218 | *(.initcall1.init) \ | 220 | *(.initcall1.init) \ |
| 219 | *(.initcall1s.init) \ | 221 | *(.initcall1s.init) \ |
| 220 | *(.initcall2.init) \ | 222 | *(.initcall2.init) \ |
diff --git a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h index 6016632d032f..c80b3a94511a 100644 --- a/include/asm-i386/acpi.h +++ b/include/asm-i386/acpi.h | |||
| @@ -132,6 +132,7 @@ extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); | |||
| 132 | 132 | ||
| 133 | #ifdef CONFIG_X86_IO_APIC | 133 | #ifdef CONFIG_X86_IO_APIC |
| 134 | extern int acpi_skip_timer_override; | 134 | extern int acpi_skip_timer_override; |
| 135 | extern int acpi_use_timer_override; | ||
| 135 | #endif | 136 | #endif |
| 136 | 137 | ||
| 137 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } | 138 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } |
diff --git a/include/asm-i386/mach-summit/mach_apic.h b/include/asm-i386/mach-summit/mach_apic.h index ef0671e5d5c5..43e5bd8f4a19 100644 --- a/include/asm-i386/mach-summit/mach_apic.h +++ b/include/asm-i386/mach-summit/mach_apic.h | |||
| @@ -88,7 +88,11 @@ static inline void clustered_apic_check(void) | |||
| 88 | 88 | ||
| 89 | static inline int apicid_to_node(int logical_apicid) | 89 | static inline int apicid_to_node(int logical_apicid) |
| 90 | { | 90 | { |
| 91 | #ifdef CONFIG_SMP | ||
| 91 | return apicid_2_node[hard_smp_processor_id()]; | 92 | return apicid_2_node[hard_smp_processor_id()]; |
| 93 | #else | ||
| 94 | return 0; | ||
| 95 | #endif | ||
| 92 | } | 96 | } |
| 93 | 97 | ||
| 94 | /* Mapping from cpu number to logical apicid */ | 98 | /* Mapping from cpu number to logical apicid */ |
diff --git a/include/asm-m68knommu/irq_regs.h b/include/asm-m68knommu/irq_regs.h new file mode 100644 index 000000000000..3dd9c0b70270 --- /dev/null +++ b/include/asm-m68knommu/irq_regs.h | |||
| @@ -0,0 +1 @@ | |||
| #include <asm-generic/irq_regs.h> | |||
diff --git a/include/asm-m68knommu/irqnode.h b/include/asm-m68knommu/irqnode.h index a2503dfc554c..6132a9858b52 100644 --- a/include/asm-m68knommu/irqnode.h +++ b/include/asm-m68knommu/irqnode.h | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * interrupt source (if it supports chaining). | 8 | * interrupt source (if it supports chaining). |
| 9 | */ | 9 | */ |
| 10 | typedef struct irq_node { | 10 | typedef struct irq_node { |
| 11 | irqreturn_t (*handler)(int, void *, struct pt_regs *); | 11 | irq_handler_t handler; |
| 12 | unsigned long flags; | 12 | unsigned long flags; |
| 13 | void *dev_id; | 13 | void *dev_id; |
| 14 | const char *devname; | 14 | const char *devname; |
| @@ -18,12 +18,12 @@ typedef struct irq_node { | |||
| 18 | /* | 18 | /* |
| 19 | * This structure has only 4 elements for speed reasons | 19 | * This structure has only 4 elements for speed reasons |
| 20 | */ | 20 | */ |
| 21 | typedef struct irq_handler { | 21 | struct irq_entry { |
| 22 | irqreturn_t (*handler)(int, void *, struct pt_regs *); | 22 | irq_handler_t handler; |
| 23 | unsigned long flags; | 23 | unsigned long flags; |
| 24 | void *dev_id; | 24 | void *dev_id; |
| 25 | const char *devname; | 25 | const char *devname; |
| 26 | } irq_handler_t; | 26 | }; |
| 27 | 27 | ||
| 28 | /* count of spurious interrupts */ | 28 | /* count of spurious interrupts */ |
| 29 | extern volatile unsigned int num_spurious; | 29 | extern volatile unsigned int num_spurious; |
diff --git a/include/asm-m68knommu/machdep.h b/include/asm-m68knommu/machdep.h index 27c90afd3339..6ce28f8e0ead 100644 --- a/include/asm-m68knommu/machdep.h +++ b/include/asm-m68knommu/machdep.h | |||
| @@ -18,7 +18,7 @@ extern int (*mach_kbdrate) (struct kbd_repeat *); | |||
| 18 | extern void (*mach_kbd_leds) (unsigned int); | 18 | extern void (*mach_kbd_leds) (unsigned int); |
| 19 | /* machine dependent irq functions */ | 19 | /* machine dependent irq functions */ |
| 20 | extern void (*mach_init_IRQ) (void); | 20 | extern void (*mach_init_IRQ) (void); |
| 21 | extern irqreturn_t (*(*mach_default_handler)[]) (int, void *, struct pt_regs *); | 21 | extern irq_handler_t mach_default_handler; |
| 22 | extern int (*mach_request_irq) (unsigned int irq, void (*handler)(int, void *, struct pt_regs *), | 22 | extern int (*mach_request_irq) (unsigned int irq, void (*handler)(int, void *, struct pt_regs *), |
| 23 | unsigned long flags, const char *devname, void *dev_id); | 23 | unsigned long flags, const char *devname, void *dev_id); |
| 24 | extern void (*mach_free_irq) (unsigned int irq, void *dev_id); | 24 | extern void (*mach_free_irq) (unsigned int irq, void *dev_id); |
diff --git a/include/asm-mips/mach-au1x00/au1xxx_ide.h b/include/asm-mips/mach-au1x00/au1xxx_ide.h index 301e71300779..e9fa252f8a3f 100644 --- a/include/asm-mips/mach-au1x00/au1xxx_ide.h +++ b/include/asm-mips/mach-au1x00/au1xxx_ide.h | |||
| @@ -170,10 +170,8 @@ int __init auide_probe(void); | |||
| 170 | static int auide_dma_host_on(ide_drive_t *drive); | 170 | static int auide_dma_host_on(ide_drive_t *drive); |
| 171 | static int auide_dma_lostirq(ide_drive_t *drive); | 171 | static int auide_dma_lostirq(ide_drive_t *drive); |
| 172 | static int auide_dma_on(ide_drive_t *drive); | 172 | static int auide_dma_on(ide_drive_t *drive); |
| 173 | static void auide_ddma_tx_callback(int irq, void *param, | 173 | static void auide_ddma_tx_callback(int irq, void *param); |
| 174 | struct pt_regs *regs); | 174 | static void auide_ddma_rx_callback(int irq, void *param); |
| 175 | static void auide_ddma_rx_callback(int irq, void *param, | ||
| 176 | struct pt_regs *regs); | ||
| 177 | static int auide_dma_off_quietly(ide_drive_t *drive); | 175 | static int auide_dma_off_quietly(ide_drive_t *drive); |
| 178 | #endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */ | 176 | #endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */ |
| 179 | 177 | ||
diff --git a/include/asm-parisc/semaphore.h b/include/asm-parisc/semaphore.h index c9ee41cd0707..d45827a21f94 100644 --- a/include/asm-parisc/semaphore.h +++ b/include/asm-parisc/semaphore.h | |||
| @@ -115,7 +115,8 @@ extern __inline__ int down_interruptible(struct semaphore * sem) | |||
| 115 | */ | 115 | */ |
| 116 | extern __inline__ int down_trylock(struct semaphore * sem) | 116 | extern __inline__ int down_trylock(struct semaphore * sem) |
| 117 | { | 117 | { |
| 118 | int flags, count; | 118 | unsigned long flags; |
| 119 | int count; | ||
| 119 | 120 | ||
| 120 | spin_lock_irqsave(&sem->sentry, flags); | 121 | spin_lock_irqsave(&sem->sentry, flags); |
| 121 | count = sem->count - 1; | 122 | count = sem->count - 1; |
| @@ -131,7 +132,8 @@ extern __inline__ int down_trylock(struct semaphore * sem) | |||
| 131 | */ | 132 | */ |
| 132 | extern __inline__ void up(struct semaphore * sem) | 133 | extern __inline__ void up(struct semaphore * sem) |
| 133 | { | 134 | { |
| 134 | int flags; | 135 | unsigned long flags; |
| 136 | |||
| 135 | spin_lock_irqsave(&sem->sentry, flags); | 137 | spin_lock_irqsave(&sem->sentry, flags); |
| 136 | if (sem->count < 0) { | 138 | if (sem->count < 0) { |
| 137 | __up(sem); | 139 | __up(sem); |
diff --git a/include/asm-powerpc/systbl.h b/include/asm-powerpc/systbl.h index c6a03187f932..97b435484177 100644 --- a/include/asm-powerpc/systbl.h +++ b/include/asm-powerpc/systbl.h | |||
| @@ -304,3 +304,4 @@ SYSCALL_SPU(fchmodat) | |||
| 304 | SYSCALL_SPU(faccessat) | 304 | SYSCALL_SPU(faccessat) |
| 305 | COMPAT_SYS_SPU(get_robust_list) | 305 | COMPAT_SYS_SPU(get_robust_list) |
| 306 | COMPAT_SYS_SPU(set_robust_list) | 306 | COMPAT_SYS_SPU(set_robust_list) |
| 307 | COMPAT_SYS(move_pages) | ||
diff --git a/include/asm-powerpc/time.h b/include/asm-powerpc/time.h index a78285010d62..4cff977ad526 100644 --- a/include/asm-powerpc/time.h +++ b/include/asm-powerpc/time.h | |||
| @@ -39,10 +39,6 @@ extern void generic_calibrate_decr(void); | |||
| 39 | extern void wakeup_decrementer(void); | 39 | extern void wakeup_decrementer(void); |
| 40 | extern void snapshot_timebase(void); | 40 | extern void snapshot_timebase(void); |
| 41 | 41 | ||
| 42 | #ifdef CONFIG_RTC_CLASS | ||
| 43 | extern int __init rtc_class_hookup(void); | ||
| 44 | #endif | ||
| 45 | |||
| 46 | /* Some sane defaults: 125 MHz timebase, 1GHz processor */ | 42 | /* Some sane defaults: 125 MHz timebase, 1GHz processor */ |
| 47 | extern unsigned long ppc_proc_freq; | 43 | extern unsigned long ppc_proc_freq; |
| 48 | #define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8) | 44 | #define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8) |
diff --git a/include/asm-powerpc/topology.h b/include/asm-powerpc/topology.h index 8f7ee16781a4..9fe7894ee035 100644 --- a/include/asm-powerpc/topology.h +++ b/include/asm-powerpc/topology.h | |||
| @@ -96,7 +96,13 @@ static inline void sysfs_remove_device_from_node(struct sys_device *dev, | |||
| 96 | 96 | ||
| 97 | #ifdef CONFIG_SMP | 97 | #ifdef CONFIG_SMP |
| 98 | #include <asm/cputable.h> | 98 | #include <asm/cputable.h> |
| 99 | #define smt_capable() (cpu_has_feature(CPU_FTR_SMT)) | 99 | #define smt_capable() (cpu_has_feature(CPU_FTR_SMT)) |
| 100 | |||
| 101 | #ifdef CONFIG_PPC64 | ||
| 102 | #include <asm/smp.h> | ||
| 103 | |||
| 104 | #define topology_thread_siblings(cpu) (cpu_sibling_map[cpu]) | ||
| 105 | #endif | ||
| 100 | #endif | 106 | #endif |
| 101 | 107 | ||
| 102 | #endif /* __KERNEL__ */ | 108 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-powerpc/unistd.h b/include/asm-powerpc/unistd.h index b5fe93291c96..0e4ea37f6466 100644 --- a/include/asm-powerpc/unistd.h +++ b/include/asm-powerpc/unistd.h | |||
| @@ -323,10 +323,11 @@ | |||
| 323 | #define __NR_faccessat 298 | 323 | #define __NR_faccessat 298 |
| 324 | #define __NR_get_robust_list 299 | 324 | #define __NR_get_robust_list 299 |
| 325 | #define __NR_set_robust_list 300 | 325 | #define __NR_set_robust_list 300 |
| 326 | #define __NR_move_pages 301 | ||
| 326 | 327 | ||
| 327 | #ifdef __KERNEL__ | 328 | #ifdef __KERNEL__ |
| 328 | 329 | ||
| 329 | #define __NR_syscalls 301 | 330 | #define __NR_syscalls 302 |
| 330 | 331 | ||
| 331 | #define __NR__exit __NR_exit | 332 | #define __NR__exit __NR_exit |
| 332 | #define NR_syscalls __NR_syscalls | 333 | #define NR_syscalls __NR_syscalls |
diff --git a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h index ed59aa4c6ff9..9d1916e59c04 100644 --- a/include/asm-x86_64/acpi.h +++ b/include/asm-x86_64/acpi.h | |||
| @@ -163,6 +163,7 @@ extern u8 x86_acpiid_to_apicid[]; | |||
| 163 | #define ARCH_HAS_POWER_INIT 1 | 163 | #define ARCH_HAS_POWER_INIT 1 |
| 164 | 164 | ||
| 165 | extern int acpi_skip_timer_override; | 165 | extern int acpi_skip_timer_override; |
| 166 | extern int acpi_use_timer_override; | ||
| 166 | 167 | ||
| 167 | #endif /*__KERNEL__*/ | 168 | #endif /*__KERNEL__*/ |
| 168 | 169 | ||
diff --git a/include/asm-x86_64/pda.h b/include/asm-x86_64/pda.h index 14996d962bac..5642634843c4 100644 --- a/include/asm-x86_64/pda.h +++ b/include/asm-x86_64/pda.h | |||
| @@ -109,6 +109,15 @@ extern struct x8664_pda _proxy_pda; | |||
| 109 | #define sub_pda(field,val) pda_to_op("sub",field,val) | 109 | #define sub_pda(field,val) pda_to_op("sub",field,val) |
| 110 | #define or_pda(field,val) pda_to_op("or",field,val) | 110 | #define or_pda(field,val) pda_to_op("or",field,val) |
| 111 | 111 | ||
| 112 | /* This is not atomic against other CPUs -- CPU preemption needs to be off */ | ||
| 113 | #define test_and_clear_bit_pda(bit,field) ({ \ | ||
| 114 | int old__; \ | ||
| 115 | asm volatile("btr %2,%%gs:%c3\n\tsbbl %0,%0" \ | ||
| 116 | : "=r" (old__), "+m" (_proxy_pda.field) \ | ||
| 117 | : "dIr" (bit), "i" (pda_offset(field)) : "memory"); \ | ||
| 118 | old__; \ | ||
| 119 | }) | ||
| 120 | |||
| 112 | #endif | 121 | #endif |
| 113 | 122 | ||
| 114 | #define PDA_STACKOFFSET (5*8) | 123 | #define PDA_STACKOFFSET (5*8) |
diff --git a/include/asm-x86_64/vsyscall.h b/include/asm-x86_64/vsyscall.h index fd452fc2c037..01d1c17e2849 100644 --- a/include/asm-x86_64/vsyscall.h +++ b/include/asm-x86_64/vsyscall.h | |||
| @@ -59,8 +59,6 @@ extern seqlock_t xtime_lock; | |||
| 59 | 59 | ||
| 60 | extern int sysctl_vsyscall; | 60 | extern int sysctl_vsyscall; |
| 61 | 61 | ||
| 62 | extern void vsyscall_set_cpu(int cpu); | ||
| 63 | |||
| 64 | #define ARCH_HAVE_XTIME_LOCK 1 | 62 | #define ARCH_HAVE_XTIME_LOCK 1 |
| 65 | 63 | ||
| 66 | #endif /* __KERNEL__ */ | 64 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/crypto.h b/include/linux/crypto.h index 8f2ffa4caabf..6485e9716b36 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h | |||
| @@ -245,7 +245,7 @@ int crypto_alg_available(const char *name, u32 flags) | |||
| 245 | __deprecated_for_modules; | 245 | __deprecated_for_modules; |
| 246 | int crypto_has_alg(const char *name, u32 type, u32 mask); | 246 | int crypto_has_alg(const char *name, u32 type, u32 mask); |
| 247 | #else | 247 | #else |
| 248 | static int crypto_alg_available(const char *name, u32 flags); | 248 | static int crypto_alg_available(const char *name, u32 flags) |
| 249 | __deprecated_for_modules; | 249 | __deprecated_for_modules; |
| 250 | static inline int crypto_alg_available(const char *name, u32 flags) | 250 | static inline int crypto_alg_available(const char *name, u32 flags) |
| 251 | { | 251 | { |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 5081d27bfa27..ace64e57e17f 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
| @@ -60,8 +60,11 @@ void hugetlb_free_pgd_range(struct mmu_gather **tlb, unsigned long addr, | |||
| 60 | * If the arch doesn't supply something else, assume that hugepage | 60 | * If the arch doesn't supply something else, assume that hugepage |
| 61 | * size aligned regions are ok without further preparation. | 61 | * size aligned regions are ok without further preparation. |
| 62 | */ | 62 | */ |
| 63 | static inline int prepare_hugepage_range(unsigned long addr, unsigned long len) | 63 | static inline int prepare_hugepage_range(unsigned long addr, unsigned long len, |
| 64 | pgoff_t pgoff) | ||
| 64 | { | 65 | { |
| 66 | if (pgoff & (~HPAGE_MASK >> PAGE_SHIFT)) | ||
| 67 | return -EINVAL; | ||
| 65 | if (len & ~HPAGE_MASK) | 68 | if (len & ~HPAGE_MASK) |
| 66 | return -EINVAL; | 69 | return -EINVAL; |
| 67 | if (addr & ~HPAGE_MASK) | 70 | if (addr & ~HPAGE_MASK) |
| @@ -69,7 +72,8 @@ static inline int prepare_hugepage_range(unsigned long addr, unsigned long len) | |||
| 69 | return 0; | 72 | return 0; |
| 70 | } | 73 | } |
| 71 | #else | 74 | #else |
| 72 | int prepare_hugepage_range(unsigned long addr, unsigned long len); | 75 | int prepare_hugepage_range(unsigned long addr, unsigned long len, |
| 76 | pgoff_t pgoff); | ||
| 73 | #endif | 77 | #endif |
| 74 | 78 | ||
| 75 | #ifndef ARCH_HAS_SETCLEAR_HUGE_PTE | 79 | #ifndef ARCH_HAS_SETCLEAR_HUGE_PTE |
| @@ -107,7 +111,7 @@ static inline unsigned long hugetlb_total_pages(void) | |||
| 107 | #define hugetlb_report_meminfo(buf) 0 | 111 | #define hugetlb_report_meminfo(buf) 0 |
| 108 | #define hugetlb_report_node_meminfo(n, buf) 0 | 112 | #define hugetlb_report_node_meminfo(n, buf) 0 |
| 109 | #define follow_huge_pmd(mm, addr, pmd, write) NULL | 113 | #define follow_huge_pmd(mm, addr, pmd, write) NULL |
| 110 | #define prepare_hugepage_range(addr, len) (-EINVAL) | 114 | #define prepare_hugepage_range(addr,len,pgoff) (-EINVAL) |
| 111 | #define pmd_huge(x) 0 | 115 | #define pmd_huge(x) 0 |
| 112 | #define is_hugepage_only_range(mm, addr, len) 0 | 116 | #define is_hugepage_only_range(mm, addr, len) 0 |
| 113 | #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; }) | 117 | #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; }) |
diff --git a/include/linux/igmp.h b/include/linux/igmp.h index 03f43e2893a4..21dd56905271 100644 --- a/include/linux/igmp.h +++ b/include/linux/igmp.h | |||
| @@ -191,7 +191,7 @@ struct ip_mc_list | |||
| 191 | #define IGMPV3_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value)) | 191 | #define IGMPV3_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value)) |
| 192 | #define IGMPV3_EXP(thresh, nbmant, nbexp, value) \ | 192 | #define IGMPV3_EXP(thresh, nbmant, nbexp, value) \ |
| 193 | ((value) < (thresh) ? (value) : \ | 193 | ((value) < (thresh) ? (value) : \ |
| 194 | ((IGMPV3_MASK(value, nbmant) | (1<<(nbmant+nbexp))) << \ | 194 | ((IGMPV3_MASK(value, nbmant) | (1<<(nbmant))) << \ |
| 195 | (IGMPV3_MASK((value) >> (nbmant), nbexp) + (nbexp)))) | 195 | (IGMPV3_MASK((value) >> (nbmant), nbexp) + (nbexp)))) |
| 196 | 196 | ||
| 197 | #define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value) | 197 | #define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value) |
diff --git a/include/linux/in6.h b/include/linux/in6.h index 9be6a4756f0b..f28621f638e0 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h | |||
| @@ -225,7 +225,7 @@ struct in6_flowlabel_req | |||
| 225 | #endif | 225 | #endif |
| 226 | 226 | ||
| 227 | /* | 227 | /* |
| 228 | * Netfilter | 228 | * Netfilter (1) |
| 229 | * | 229 | * |
| 230 | * Following socket options are used in ip6_tables; | 230 | * Following socket options are used in ip6_tables; |
| 231 | * see include/linux/netfilter_ipv6/ip6_tables.h. | 231 | * see include/linux/netfilter_ipv6/ip6_tables.h. |
| @@ -240,4 +240,14 @@ struct in6_flowlabel_req | |||
| 240 | #define IPV6_RECVTCLASS 66 | 240 | #define IPV6_RECVTCLASS 66 |
| 241 | #define IPV6_TCLASS 67 | 241 | #define IPV6_TCLASS 67 |
| 242 | 242 | ||
| 243 | /* | ||
| 244 | * Netfilter (2) | ||
| 245 | * | ||
| 246 | * Following socket options are used in ip6_tables; | ||
| 247 | * see include/linux/netfilter_ipv6/ip6_tables.h. | ||
| 248 | * | ||
| 249 | * IP6T_SO_GET_REVISION_MATCH 68 | ||
| 250 | * IP6T_SO_GET_REVISION_TARGET 69 | ||
| 251 | */ | ||
| 252 | |||
| 243 | #endif | 253 | #endif |
diff --git a/include/linux/init.h b/include/linux/init.h index ff40ea118e3a..5eb5d24b7680 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
| @@ -93,6 +93,14 @@ extern void setup_arch(char **); | |||
| 93 | static initcall_t __initcall_##fn##id __attribute_used__ \ | 93 | static initcall_t __initcall_##fn##id __attribute_used__ \ |
| 94 | __attribute__((__section__(".initcall" level ".init"))) = fn | 94 | __attribute__((__section__(".initcall" level ".init"))) = fn |
| 95 | 95 | ||
| 96 | /* | ||
| 97 | * A "pure" initcall has no dependencies on anything else, and purely | ||
| 98 | * initializes variables that couldn't be statically initialized. | ||
| 99 | * | ||
| 100 | * This only exists for built-in code, not for modules. | ||
| 101 | */ | ||
| 102 | #define pure_initcall(fn) __define_initcall("0",fn,1) | ||
| 103 | |||
| 96 | #define core_initcall(fn) __define_initcall("1",fn,1) | 104 | #define core_initcall(fn) __define_initcall("1",fn,1) |
| 97 | #define core_initcall_sync(fn) __define_initcall("1s",fn,1s) | 105 | #define core_initcall_sync(fn) __define_initcall("1s",fn,1s) |
| 98 | #define postcore_initcall(fn) __define_initcall("2",fn,2) | 106 | #define postcore_initcall(fn) __define_initcall("2",fn,2) |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 24b611147adb..b9b5e4ba166a 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -30,8 +30,10 @@ extern const char linux_banner[]; | |||
| 30 | 30 | ||
| 31 | #define STACK_MAGIC 0xdeadbeef | 31 | #define STACK_MAGIC 0xdeadbeef |
| 32 | 32 | ||
| 33 | #define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) | ||
| 34 | #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) | ||
| 35 | |||
| 33 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | 36 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
| 34 | #define ALIGN(x,a) (((x)+(a)-1UL)&~((a)-1UL)) | ||
| 35 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) | 37 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) |
| 36 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | 38 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) |
| 37 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | 39 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) |
diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h index ce6c85815cbd..24a9ef1506b6 100644 --- a/include/linux/msdos_fs.h +++ b/include/linux/msdos_fs.h | |||
| @@ -402,6 +402,8 @@ extern const struct file_operations fat_file_operations; | |||
| 402 | extern struct inode_operations fat_file_inode_operations; | 402 | extern struct inode_operations fat_file_inode_operations; |
| 403 | extern int fat_notify_change(struct dentry * dentry, struct iattr * attr); | 403 | extern int fat_notify_change(struct dentry * dentry, struct iattr * attr); |
| 404 | extern void fat_truncate(struct inode *inode); | 404 | extern void fat_truncate(struct inode *inode); |
| 405 | extern int fat_getattr(struct vfsmount *mnt, struct dentry *dentry, | ||
| 406 | struct kstat *stat); | ||
| 405 | 407 | ||
| 406 | /* fat/inode.c */ | 408 | /* fat/inode.c */ |
| 407 | extern void fat_attach(struct inode *inode, loff_t i_pos); | 409 | extern void fat_attach(struct inode *inode, loff_t i_pos); |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 9264139bd8df..83b8c4f1d69d 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -93,8 +93,10 @@ struct netpoll_info; | |||
| 93 | #endif | 93 | #endif |
| 94 | #endif | 94 | #endif |
| 95 | 95 | ||
| 96 | #if !defined(CONFIG_NET_IPIP) && \ | 96 | #if !defined(CONFIG_NET_IPIP) && !defined(CONFIG_NET_IPIP_MODULE) && \ |
| 97 | !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) | 97 | !defined(CONFIG_NET_IPGRE) && !defined(CONFIG_NET_IPGRE_MODULE) && \ |
| 98 | !defined(CONFIG_IPV6_SIT) && !defined(CONFIG_IPV6_SIT_MODULE) && \ | ||
| 99 | !defined(CONFIG_IPV6_TUNNEL) && !defined(CONFIG_IPV6_TUNNEL_MODULE) | ||
| 98 | #define MAX_HEADER LL_MAX_HEADER | 100 | #define MAX_HEADER LL_MAX_HEADER |
| 99 | #else | 101 | #else |
| 100 | #define MAX_HEADER (LL_MAX_HEADER + 48) | 102 | #define MAX_HEADER (LL_MAX_HEADER + 48) |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 04319a76103a..022edfa97ed9 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
| @@ -96,22 +96,6 @@ struct _xt_align | |||
| 96 | /* Error verdict. */ | 96 | /* Error verdict. */ |
| 97 | #define XT_ERROR_TARGET "ERROR" | 97 | #define XT_ERROR_TARGET "ERROR" |
| 98 | 98 | ||
| 99 | /* | ||
| 100 | * New IP firewall options for [gs]etsockopt at the RAW IP level. | ||
| 101 | * Unlike BSD Linux inherits IP options so you don't have to use a raw | ||
| 102 | * socket for this. Instead we check rights in the calls. */ | ||
| 103 | #define XT_BASE_CTL 64 /* base for firewall socket options */ | ||
| 104 | |||
| 105 | #define XT_SO_SET_REPLACE (XT_BASE_CTL) | ||
| 106 | #define XT_SO_SET_ADD_COUNTERS (XT_BASE_CTL + 1) | ||
| 107 | #define XT_SO_SET_MAX XT_SO_SET_ADD_COUNTERS | ||
| 108 | |||
| 109 | #define XT_SO_GET_INFO (XT_BASE_CTL) | ||
| 110 | #define XT_SO_GET_ENTRIES (XT_BASE_CTL + 1) | ||
| 111 | #define XT_SO_GET_REVISION_MATCH (XT_BASE_CTL + 2) | ||
| 112 | #define XT_SO_GET_REVISION_TARGET (XT_BASE_CTL + 3) | ||
| 113 | #define XT_SO_GET_MAX XT_SO_GET_REVISION_TARGET | ||
| 114 | |||
| 115 | #define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0) | 99 | #define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0) |
| 116 | #define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0) | 100 | #define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0) |
| 117 | 101 | ||
diff --git a/include/linux/netfilter_arp/arp_tables.h b/include/linux/netfilter_arp/arp_tables.h index 44e39b61d9e7..0be235418a2f 100644 --- a/include/linux/netfilter_arp/arp_tables.h +++ b/include/linux/netfilter_arp/arp_tables.h | |||
| @@ -112,19 +112,20 @@ struct arpt_entry | |||
| 112 | * New IP firewall options for [gs]etsockopt at the RAW IP level. | 112 | * New IP firewall options for [gs]etsockopt at the RAW IP level. |
| 113 | * Unlike BSD Linux inherits IP options so you don't have to use a raw | 113 | * Unlike BSD Linux inherits IP options so you don't have to use a raw |
| 114 | * socket for this. Instead we check rights in the calls. | 114 | * socket for this. Instead we check rights in the calls. |
| 115 | * | ||
| 116 | * ATTENTION: check linux/in.h before adding new number here. | ||
| 115 | */ | 117 | */ |
| 116 | #define ARPT_CTL_OFFSET 32 | 118 | #define ARPT_BASE_CTL 96 |
| 117 | #define ARPT_BASE_CTL (XT_BASE_CTL+ARPT_CTL_OFFSET) | 119 | |
| 118 | 120 | #define ARPT_SO_SET_REPLACE (ARPT_BASE_CTL) | |
| 119 | #define ARPT_SO_SET_REPLACE (XT_SO_SET_REPLACE+ARPT_CTL_OFFSET) | 121 | #define ARPT_SO_SET_ADD_COUNTERS (ARPT_BASE_CTL + 1) |
| 120 | #define ARPT_SO_SET_ADD_COUNTERS (XT_SO_SET_ADD_COUNTERS+ARPT_CTL_OFFSET) | 122 | #define ARPT_SO_SET_MAX ARPT_SO_SET_ADD_COUNTERS |
| 121 | #define ARPT_SO_SET_MAX (XT_SO_SET_MAX+ARPT_CTL_OFFSET) | 123 | |
| 122 | 124 | #define ARPT_SO_GET_INFO (ARPT_BASE_CTL) | |
| 123 | #define ARPT_SO_GET_INFO (XT_SO_GET_INFO+ARPT_CTL_OFFSET) | 125 | #define ARPT_SO_GET_ENTRIES (ARPT_BASE_CTL + 1) |
| 124 | #define ARPT_SO_GET_ENTRIES (XT_SO_GET_ENTRIES+ARPT_CTL_OFFSET) | 126 | /* #define ARPT_SO_GET_REVISION_MATCH (APRT_BASE_CTL + 2) */ |
| 125 | /* #define ARPT_SO_GET_REVISION_MATCH XT_SO_GET_REVISION_MATCH */ | 127 | #define ARPT_SO_GET_REVISION_TARGET (ARPT_BASE_CTL + 3) |
| 126 | #define ARPT_SO_GET_REVISION_TARGET (XT_SO_GET_REVISION_TARGET+ARPT_CTL_OFFSET) | 128 | #define ARPT_SO_GET_MAX (ARPT_SO_GET_REVISION_TARGET) |
| 127 | #define ARPT_SO_GET_MAX (XT_SO_GET_REVISION_TARGET+ARPT_CTL_OFFSET) | ||
| 128 | 129 | ||
| 129 | /* CONTINUE verdict for targets */ | 130 | /* CONTINUE verdict for targets */ |
| 130 | #define ARPT_CONTINUE XT_CONTINUE | 131 | #define ARPT_CONTINUE XT_CONTINUE |
diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h index a536bbdef145..4f06dad0bde9 100644 --- a/include/linux/netfilter_ipv4/ip_tables.h +++ b/include/linux/netfilter_ipv4/ip_tables.h | |||
| @@ -101,18 +101,21 @@ struct ipt_entry | |||
| 101 | /* | 101 | /* |
| 102 | * New IP firewall options for [gs]etsockopt at the RAW IP level. | 102 | * New IP firewall options for [gs]etsockopt at the RAW IP level. |
| 103 | * Unlike BSD Linux inherits IP options so you don't have to use a raw | 103 | * Unlike BSD Linux inherits IP options so you don't have to use a raw |
| 104 | * socket for this. Instead we check rights in the calls. */ | 104 | * socket for this. Instead we check rights in the calls. |
| 105 | #define IPT_BASE_CTL XT_BASE_CTL | 105 | * |
| 106 | 106 | * ATTENTION: check linux/in.h before adding new number here. | |
| 107 | #define IPT_SO_SET_REPLACE XT_SO_SET_REPLACE | 107 | */ |
| 108 | #define IPT_SO_SET_ADD_COUNTERS XT_SO_SET_ADD_COUNTERS | 108 | #define IPT_BASE_CTL 64 |
| 109 | #define IPT_SO_SET_MAX XT_SO_SET_MAX | 109 | |
| 110 | 110 | #define IPT_SO_SET_REPLACE (IPT_BASE_CTL) | |
| 111 | #define IPT_SO_GET_INFO XT_SO_GET_INFO | 111 | #define IPT_SO_SET_ADD_COUNTERS (IPT_BASE_CTL + 1) |
| 112 | #define IPT_SO_GET_ENTRIES XT_SO_GET_ENTRIES | 112 | #define IPT_SO_SET_MAX IPT_SO_SET_ADD_COUNTERS |
| 113 | #define IPT_SO_GET_REVISION_MATCH XT_SO_GET_REVISION_MATCH | 113 | |
| 114 | #define IPT_SO_GET_REVISION_TARGET XT_SO_GET_REVISION_TARGET | 114 | #define IPT_SO_GET_INFO (IPT_BASE_CTL) |
| 115 | #define IPT_SO_GET_MAX XT_SO_GET_REVISION_TARGET | 115 | #define IPT_SO_GET_ENTRIES (IPT_BASE_CTL + 1) |
| 116 | #define IPT_SO_GET_REVISION_MATCH (IPT_BASE_CTL + 2) | ||
| 117 | #define IPT_SO_GET_REVISION_TARGET (IPT_BASE_CTL + 3) | ||
| 118 | #define IPT_SO_GET_MAX IPT_SO_GET_REVISION_TARGET | ||
| 116 | 119 | ||
| 117 | #define IPT_CONTINUE XT_CONTINUE | 120 | #define IPT_CONTINUE XT_CONTINUE |
| 118 | #define IPT_RETURN XT_RETURN | 121 | #define IPT_RETURN XT_RETURN |
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index d7a8e9c0dad0..4aed340401db 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h | |||
| @@ -107,18 +107,21 @@ struct ip6t_entry | |||
| 107 | /* | 107 | /* |
| 108 | * New IP firewall options for [gs]etsockopt at the RAW IP level. | 108 | * New IP firewall options for [gs]etsockopt at the RAW IP level. |
| 109 | * Unlike BSD Linux inherits IP options so you don't have to use | 109 | * Unlike BSD Linux inherits IP options so you don't have to use |
| 110 | * a raw socket for this. Instead we check rights in the calls. */ | 110 | * a raw socket for this. Instead we check rights in the calls. |
| 111 | #define IP6T_BASE_CTL XT_BASE_CTL | 111 | * |
| 112 | 112 | * ATTENTION: check linux/in6.h before adding new number here. | |
| 113 | #define IP6T_SO_SET_REPLACE XT_SO_SET_REPLACE | 113 | */ |
| 114 | #define IP6T_SO_SET_ADD_COUNTERS XT_SO_SET_ADD_COUNTERS | 114 | #define IP6T_BASE_CTL 64 |
| 115 | #define IP6T_SO_SET_MAX XT_SO_SET_MAX | 115 | |
| 116 | 116 | #define IP6T_SO_SET_REPLACE (IP6T_BASE_CTL) | |
| 117 | #define IP6T_SO_GET_INFO XT_SO_GET_INFO | 117 | #define IP6T_SO_SET_ADD_COUNTERS (IP6T_BASE_CTL + 1) |
| 118 | #define IP6T_SO_GET_ENTRIES XT_SO_GET_ENTRIES | 118 | #define IP6T_SO_SET_MAX IP6T_SO_SET_ADD_COUNTERS |
| 119 | #define IP6T_SO_GET_REVISION_MATCH XT_SO_GET_REVISION_MATCH | 119 | |
| 120 | #define IP6T_SO_GET_REVISION_TARGET XT_SO_GET_REVISION_TARGET | 120 | #define IP6T_SO_GET_INFO (IP6T_BASE_CTL) |
| 121 | #define IP6T_SO_GET_MAX XT_SO_GET_REVISION_TARGET | 121 | #define IP6T_SO_GET_ENTRIES (IP6T_BASE_CTL + 1) |
| 122 | #define IP6T_SO_GET_REVISION_MATCH (IP6T_BASE_CTL + 4) | ||
| 123 | #define IP6T_SO_GET_REVISION_TARGET (IP6T_BASE_CTL + 5) | ||
| 124 | #define IP6T_SO_GET_MAX IP6T_SO_GET_REVISION_TARGET | ||
| 122 | 125 | ||
| 123 | /* CONTINUE verdict for targets */ | 126 | /* CONTINUE verdict for targets */ |
| 124 | #define IP6T_CONTINUE XT_CONTINUE | 127 | #define IP6T_CONTINUE XT_CONTINUE |
diff --git a/include/linux/nsproxy.h b/include/linux/nsproxy.h index f6baecdeecd6..971d1c6dfc4b 100644 --- a/include/linux/nsproxy.h +++ b/include/linux/nsproxy.h | |||
| @@ -45,8 +45,10 @@ static inline void exit_task_namespaces(struct task_struct *p) | |||
| 45 | { | 45 | { |
| 46 | struct nsproxy *ns = p->nsproxy; | 46 | struct nsproxy *ns = p->nsproxy; |
| 47 | if (ns) { | 47 | if (ns) { |
| 48 | put_nsproxy(ns); | 48 | task_lock(p); |
| 49 | p->nsproxy = NULL; | 49 | p->nsproxy = NULL; |
| 50 | task_unlock(p); | ||
| 51 | put_nsproxy(ns); | ||
| 50 | } | 52 | } |
| 51 | } | 53 | } |
| 52 | #endif | 54 | #endif |
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index c312a12ad2d6..c321316f1bc7 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h | |||
| @@ -371,6 +371,7 @@ | |||
| 371 | #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ | 371 | #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ |
| 372 | #define PCI_EXP_LNKCAP 12 /* Link Capabilities */ | 372 | #define PCI_EXP_LNKCAP 12 /* Link Capabilities */ |
| 373 | #define PCI_EXP_LNKCTL 16 /* Link Control */ | 373 | #define PCI_EXP_LNKCTL 16 /* Link Control */ |
| 374 | #define PCI_EXP_LNKCTL_CLKREQ_EN 0x100 /* Enable clkreq */ | ||
| 374 | #define PCI_EXP_LNKSTA 18 /* Link Status */ | 375 | #define PCI_EXP_LNKSTA 18 /* Link Status */ |
| 375 | #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ | 376 | #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ |
| 376 | #define PCI_EXP_SLTCTL 24 /* Slot Control */ | 377 | #define PCI_EXP_SLTCTL 24 /* Slot Control */ |
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index b800d2d68b32..8451052ca66f 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h | |||
| @@ -183,13 +183,27 @@ do { \ | |||
| 183 | #define read_lock(lock) _read_lock(lock) | 183 | #define read_lock(lock) _read_lock(lock) |
| 184 | 184 | ||
| 185 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) | 185 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) |
| 186 | |||
| 186 | #define spin_lock_irqsave(lock, flags) flags = _spin_lock_irqsave(lock) | 187 | #define spin_lock_irqsave(lock, flags) flags = _spin_lock_irqsave(lock) |
| 187 | #define read_lock_irqsave(lock, flags) flags = _read_lock_irqsave(lock) | 188 | #define read_lock_irqsave(lock, flags) flags = _read_lock_irqsave(lock) |
| 188 | #define write_lock_irqsave(lock, flags) flags = _write_lock_irqsave(lock) | 189 | #define write_lock_irqsave(lock, flags) flags = _write_lock_irqsave(lock) |
| 190 | |||
| 191 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 192 | #define spin_lock_irqsave_nested(lock, flags, subclass) \ | ||
| 193 | flags = _spin_lock_irqsave_nested(lock, subclass) | ||
| 194 | #else | ||
| 195 | #define spin_lock_irqsave_nested(lock, flags, subclass) \ | ||
| 196 | flags = _spin_lock_irqsave(lock) | ||
| 197 | #endif | ||
| 198 | |||
| 189 | #else | 199 | #else |
| 200 | |||
| 190 | #define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags) | 201 | #define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags) |
| 191 | #define read_lock_irqsave(lock, flags) _read_lock_irqsave(lock, flags) | 202 | #define read_lock_irqsave(lock, flags) _read_lock_irqsave(lock, flags) |
| 192 | #define write_lock_irqsave(lock, flags) _write_lock_irqsave(lock, flags) | 203 | #define write_lock_irqsave(lock, flags) _write_lock_irqsave(lock, flags) |
| 204 | #define spin_lock_irqsave_nested(lock, flags, subclass) \ | ||
| 205 | spin_lock_irqsave(lock, flags) | ||
| 206 | |||
| 193 | #endif | 207 | #endif |
| 194 | 208 | ||
| 195 | #define spin_lock_irq(lock) _spin_lock_irq(lock) | 209 | #define spin_lock_irq(lock) _spin_lock_irq(lock) |
diff --git a/include/linux/spinlock_api_smp.h b/include/linux/spinlock_api_smp.h index 8828b8155e9c..8a2307ce7296 100644 --- a/include/linux/spinlock_api_smp.h +++ b/include/linux/spinlock_api_smp.h | |||
| @@ -32,6 +32,8 @@ void __lockfunc _read_lock_irq(rwlock_t *lock) __acquires(lock); | |||
| 32 | void __lockfunc _write_lock_irq(rwlock_t *lock) __acquires(lock); | 32 | void __lockfunc _write_lock_irq(rwlock_t *lock) __acquires(lock); |
| 33 | unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock) | 33 | unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock) |
| 34 | __acquires(lock); | 34 | __acquires(lock); |
| 35 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) | ||
| 36 | __acquires(lock); | ||
| 35 | unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock) | 37 | unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock) |
| 36 | __acquires(lock); | 38 | __acquires(lock); |
| 37 | unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock) | 39 | unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock) |
diff --git a/include/net/sock.h b/include/net/sock.h index ac286a353032..9cdbae2a53a3 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -883,18 +883,23 @@ static inline int sk_filter(struct sock *sk, struct sk_buff *skb) | |||
| 883 | } | 883 | } |
| 884 | 884 | ||
| 885 | /** | 885 | /** |
| 886 | * sk_filter_release: Release a socket filter | 886 | * sk_filter_rcu_free: Free a socket filter |
| 887 | * @rcu: rcu_head that contains the sk_filter info to remove | 887 | * @rcu: rcu_head that contains the sk_filter to free |
| 888 | * | ||
| 889 | * Remove a filter from a socket and release its resources. | ||
| 890 | */ | 888 | */ |
| 891 | |||
| 892 | static inline void sk_filter_rcu_free(struct rcu_head *rcu) | 889 | static inline void sk_filter_rcu_free(struct rcu_head *rcu) |
| 893 | { | 890 | { |
| 894 | struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu); | 891 | struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu); |
| 895 | kfree(fp); | 892 | kfree(fp); |
| 896 | } | 893 | } |
| 897 | 894 | ||
| 895 | /** | ||
| 896 | * sk_filter_release: Release a socket filter | ||
| 897 | * @sk: socket | ||
| 898 | * @fp: filter to remove | ||
| 899 | * | ||
| 900 | * Remove a filter from a socket and release its resources. | ||
| 901 | */ | ||
| 902 | |||
| 898 | static inline void sk_filter_release(struct sock *sk, struct sk_filter *fp) | 903 | static inline void sk_filter_release(struct sock *sk, struct sk_filter *fp) |
| 899 | { | 904 | { |
| 900 | unsigned int size = sk_filter_len(fp); | 905 | unsigned int size = sk_filter_len(fp); |
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 9582e8401669..1d77b63c5ea4 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <scsi/scsi_device.h> | 35 | #include <scsi/scsi_device.h> |
| 36 | #include <scsi/scsi_cmnd.h> | 36 | #include <scsi/scsi_cmnd.h> |
| 37 | #include <scsi/scsi_transport_sas.h> | 37 | #include <scsi/scsi_transport_sas.h> |
| 38 | #include <asm/scatterlist.h> | ||
| 38 | 39 | ||
| 39 | struct block_device; | 40 | struct block_device; |
| 40 | 41 | ||
diff --git a/include/sound/version.h b/include/sound/version.h index 52fd6879b86e..17137f3a3b6f 100644 --- a/include/sound/version.h +++ b/include/sound/version.h | |||
| @@ -1,3 +1,3 @@ | |||
| 1 | /* include/version.h. Generated by alsa/ksync script. */ | 1 | /* include/version.h. Generated by alsa/ksync script. */ |
| 2 | #define CONFIG_SND_VERSION "1.0.13" | 2 | #define CONFIG_SND_VERSION "1.0.13" |
| 3 | #define CONFIG_SND_DATE " (Sun Oct 22 08:56:16 2006 UTC)" | 3 | #define CONFIG_SND_DATE " (Tue Nov 28 14:07:24 2006 UTC)" |
diff --git a/kernel/fork.c b/kernel/fork.c index 4b4eab2a3161..8cdd3e72ba55 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -687,7 +687,6 @@ static struct files_struct *dup_fd(struct files_struct *oldf, int *errorp) | |||
| 687 | * the latest pointer. | 687 | * the latest pointer. |
| 688 | */ | 688 | */ |
| 689 | spin_lock(&oldf->file_lock); | 689 | spin_lock(&oldf->file_lock); |
| 690 | open_files = count_open_files(old_fdt); | ||
| 691 | old_fdt = files_fdtable(oldf); | 690 | old_fdt = files_fdtable(oldf); |
| 692 | } | 691 | } |
| 693 | 692 | ||
| @@ -1316,9 +1315,8 @@ struct task_struct * __devinit fork_idle(int cpu) | |||
| 1316 | struct pt_regs regs; | 1315 | struct pt_regs regs; |
| 1317 | 1316 | ||
| 1318 | task = copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0); | 1317 | task = copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0); |
| 1319 | if (!task) | 1318 | if (!IS_ERR(task)) |
| 1320 | return ERR_PTR(-ENOMEM); | 1319 | init_idle(task, cpu); |
| 1321 | init_idle(task, cpu); | ||
| 1322 | 1320 | ||
| 1323 | return task; | 1321 | return task; |
| 1324 | } | 1322 | } |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 2d0dc3efe813..ebfd24a41858 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -233,6 +233,8 @@ void irq_chip_set_defaults(struct irq_chip *chip) | |||
| 233 | chip->shutdown = chip->disable; | 233 | chip->shutdown = chip->disable; |
| 234 | if (!chip->name) | 234 | if (!chip->name) |
| 235 | chip->name = chip->typename; | 235 | chip->name = chip->typename; |
| 236 | if (!chip->end) | ||
| 237 | chip->end = dummy_irq_chip.end; | ||
| 236 | } | 238 | } |
| 237 | 239 | ||
| 238 | static inline void mask_ack_irq(struct irq_desc *desc, int irq) | 240 | static inline void mask_ack_irq(struct irq_desc *desc, int irq) |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 42aa6f1a3f0f..a681912bc89a 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
| @@ -231,10 +231,10 @@ fastcall unsigned int __do_IRQ(unsigned int irq) | |||
| 231 | spin_unlock(&desc->lock); | 231 | spin_unlock(&desc->lock); |
| 232 | 232 | ||
| 233 | action_ret = handle_IRQ_event(irq, action); | 233 | action_ret = handle_IRQ_event(irq, action); |
| 234 | |||
| 235 | spin_lock(&desc->lock); | ||
| 236 | if (!noirqdebug) | 234 | if (!noirqdebug) |
| 237 | note_interrupt(irq, desc, action_ret); | 235 | note_interrupt(irq, desc, action_ret); |
| 236 | |||
| 237 | spin_lock(&desc->lock); | ||
| 238 | if (likely(!(desc->status & IRQ_PENDING))) | 238 | if (likely(!(desc->status & IRQ_PENDING))) |
| 239 | break; | 239 | break; |
| 240 | desc->status &= ~IRQ_PENDING; | 240 | desc->status &= ~IRQ_PENDING; |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 6879202afe9a..b385878c6e80 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -216,6 +216,7 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
| 216 | { | 216 | { |
| 217 | struct irq_desc *desc = irq_desc + irq; | 217 | struct irq_desc *desc = irq_desc + irq; |
| 218 | struct irqaction *old, **p; | 218 | struct irqaction *old, **p; |
| 219 | const char *old_name = NULL; | ||
| 219 | unsigned long flags; | 220 | unsigned long flags; |
| 220 | int shared = 0; | 221 | int shared = 0; |
| 221 | 222 | ||
| @@ -255,8 +256,10 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
| 255 | * set the trigger type must match. | 256 | * set the trigger type must match. |
| 256 | */ | 257 | */ |
| 257 | if (!((old->flags & new->flags) & IRQF_SHARED) || | 258 | if (!((old->flags & new->flags) & IRQF_SHARED) || |
| 258 | ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK)) | 259 | ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK)) { |
| 260 | old_name = old->name; | ||
| 259 | goto mismatch; | 261 | goto mismatch; |
| 262 | } | ||
| 260 | 263 | ||
| 261 | #if defined(CONFIG_IRQ_PER_CPU) | 264 | #if defined(CONFIG_IRQ_PER_CPU) |
| 262 | /* All handlers must agree on per-cpuness */ | 265 | /* All handlers must agree on per-cpuness */ |
| @@ -322,11 +325,13 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
| 322 | return 0; | 325 | return 0; |
| 323 | 326 | ||
| 324 | mismatch: | 327 | mismatch: |
| 325 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 326 | if (!(new->flags & IRQF_PROBE_SHARED)) { | 328 | if (!(new->flags & IRQF_PROBE_SHARED)) { |
| 327 | printk(KERN_ERR "IRQ handler type mismatch for IRQ %d\n", irq); | 329 | printk(KERN_ERR "IRQ handler type mismatch for IRQ %d\n", irq); |
| 330 | if (old_name) | ||
| 331 | printk(KERN_ERR "current handler: %s\n", old_name); | ||
| 328 | dump_stack(); | 332 | dump_stack(); |
| 329 | } | 333 | } |
| 334 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 330 | return -EBUSY; | 335 | return -EBUSY; |
| 331 | } | 336 | } |
| 332 | 337 | ||
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index 9c7e2e4c1fe7..543ea2e5ad93 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c | |||
| @@ -147,11 +147,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc, | |||
| 147 | if (unlikely(irqfixup)) { | 147 | if (unlikely(irqfixup)) { |
| 148 | /* Don't punish working computers */ | 148 | /* Don't punish working computers */ |
| 149 | if ((irqfixup == 2 && irq == 0) || action_ret == IRQ_NONE) { | 149 | if ((irqfixup == 2 && irq == 0) || action_ret == IRQ_NONE) { |
| 150 | int ok; | 150 | int ok = misrouted_irq(irq); |
| 151 | |||
| 152 | spin_unlock(&desc->lock); | ||
| 153 | ok = misrouted_irq(irq); | ||
| 154 | spin_lock(&desc->lock); | ||
| 155 | if (action_ret == IRQ_NONE) | 151 | if (action_ret == IRQ_NONE) |
| 156 | desc->irqs_unhandled -= ok; | 152 | desc->irqs_unhandled -= ok; |
| 157 | } | 153 | } |
diff --git a/kernel/kmod.c b/kernel/kmod.c index bb4e29d924e4..2b76dee28496 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
| @@ -307,14 +307,14 @@ int call_usermodehelper_pipe(char *path, char **argv, char **envp, | |||
| 307 | return 0; | 307 | return 0; |
| 308 | 308 | ||
| 309 | f = create_write_pipe(); | 309 | f = create_write_pipe(); |
| 310 | if (!f) | 310 | if (IS_ERR(f)) |
| 311 | return -ENOMEM; | 311 | return PTR_ERR(f); |
| 312 | *filp = f; | 312 | *filp = f; |
| 313 | 313 | ||
| 314 | f = create_read_pipe(f); | 314 | f = create_read_pipe(f); |
| 315 | if (!f) { | 315 | if (IS_ERR(f)) { |
| 316 | free_write_pipe(*filp); | 316 | free_write_pipe(*filp); |
| 317 | return -ENOMEM; | 317 | return PTR_ERR(f); |
| 318 | } | 318 | } |
| 319 | sub_info.stdin = f; | 319 | sub_info.stdin = f; |
| 320 | 320 | ||
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index b739be2a6dc9..c9fefdb1a7db 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -1081,7 +1081,8 @@ static int static_obj(void *obj) | |||
| 1081 | */ | 1081 | */ |
| 1082 | for_each_possible_cpu(i) { | 1082 | for_each_possible_cpu(i) { |
| 1083 | start = (unsigned long) &__per_cpu_start + per_cpu_offset(i); | 1083 | start = (unsigned long) &__per_cpu_start + per_cpu_offset(i); |
| 1084 | end = (unsigned long) &__per_cpu_end + per_cpu_offset(i); | 1084 | end = (unsigned long) &__per_cpu_start + PERCPU_ENOUGH_ROOM |
| 1085 | + per_cpu_offset(i); | ||
| 1085 | 1086 | ||
| 1086 | if ((addr >= start) && (addr < end)) | 1087 | if ((addr >= start) && (addr < end)) |
| 1087 | return 1; | 1088 | return 1; |
diff --git a/kernel/spinlock.c b/kernel/spinlock.c index 476c3741511b..2c6c2bf85514 100644 --- a/kernel/spinlock.c +++ b/kernel/spinlock.c | |||
| @@ -293,6 +293,27 @@ void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass) | |||
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | EXPORT_SYMBOL(_spin_lock_nested); | 295 | EXPORT_SYMBOL(_spin_lock_nested); |
| 296 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) | ||
| 297 | { | ||
| 298 | unsigned long flags; | ||
| 299 | |||
| 300 | local_irq_save(flags); | ||
| 301 | preempt_disable(); | ||
| 302 | spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); | ||
| 303 | /* | ||
| 304 | * On lockdep we dont want the hand-coded irq-enable of | ||
| 305 | * _raw_spin_lock_flags() code, because lockdep assumes | ||
| 306 | * that interrupts are not re-enabled during lock-acquire: | ||
| 307 | */ | ||
| 308 | #ifdef CONFIG_PROVE_SPIN_LOCKING | ||
| 309 | _raw_spin_lock(lock); | ||
| 310 | #else | ||
| 311 | _raw_spin_lock_flags(lock, &flags); | ||
| 312 | #endif | ||
| 313 | return flags; | ||
| 314 | } | ||
| 315 | |||
| 316 | EXPORT_SYMBOL(_spin_lock_irqsave_nested); | ||
| 296 | 317 | ||
| 297 | #endif | 318 | #endif |
| 298 | 319 | ||
diff --git a/kernel/unwind.c b/kernel/unwind.c index f7e50d16dbf6..ed0a21d4a902 100644 --- a/kernel/unwind.c +++ b/kernel/unwind.c | |||
| @@ -938,8 +938,11 @@ int unwind(struct unwind_frame_info *frame) | |||
| 938 | else { | 938 | else { |
| 939 | retAddrReg = state.version <= 1 ? *ptr++ : get_uleb128(&ptr, end); | 939 | retAddrReg = state.version <= 1 ? *ptr++ : get_uleb128(&ptr, end); |
| 940 | /* skip augmentation */ | 940 | /* skip augmentation */ |
| 941 | if (((const char *)(cie + 2))[1] == 'z') | 941 | if (((const char *)(cie + 2))[1] == 'z') { |
| 942 | ptr += get_uleb128(&ptr, end); | 942 | uleb128_t augSize = get_uleb128(&ptr, end); |
| 943 | |||
| 944 | ptr += augSize; | ||
| 945 | } | ||
| 943 | if (ptr > end | 946 | if (ptr > end |
| 944 | || retAddrReg >= ARRAY_SIZE(reg_info) | 947 | || retAddrReg >= ARRAY_SIZE(reg_info) |
| 945 | || REG_INVALID(retAddrReg) | 948 | || REG_INVALID(retAddrReg) |
| @@ -963,9 +966,7 @@ int unwind(struct unwind_frame_info *frame) | |||
| 963 | if (cie == NULL || fde == NULL) { | 966 | if (cie == NULL || fde == NULL) { |
| 964 | #ifdef CONFIG_FRAME_POINTER | 967 | #ifdef CONFIG_FRAME_POINTER |
| 965 | unsigned long top, bottom; | 968 | unsigned long top, bottom; |
| 966 | #endif | ||
| 967 | 969 | ||
| 968 | #ifdef CONFIG_FRAME_POINTER | ||
| 969 | top = STACK_TOP(frame->task); | 970 | top = STACK_TOP(frame->task); |
| 970 | bottom = STACK_BOTTOM(frame->task); | 971 | bottom = STACK_BOTTOM(frame->task); |
| 971 | # if FRAME_RETADDR_OFFSET < 0 | 972 | # if FRAME_RETADDR_OFFSET < 0 |
| @@ -1379,7 +1379,7 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, | |||
| 1379 | * Check if the given range is hugepage aligned, and | 1379 | * Check if the given range is hugepage aligned, and |
| 1380 | * can be made suitable for hugepages. | 1380 | * can be made suitable for hugepages. |
| 1381 | */ | 1381 | */ |
| 1382 | ret = prepare_hugepage_range(addr, len); | 1382 | ret = prepare_hugepage_range(addr, len, pgoff); |
| 1383 | } else { | 1383 | } else { |
| 1384 | /* | 1384 | /* |
| 1385 | * Ensure that a normal request is not falling in a | 1385 | * Ensure that a normal request is not falling in a |
| @@ -1880,6 +1880,9 @@ unsigned long do_brk(unsigned long addr, unsigned long len) | |||
| 1880 | if ((addr + len) > TASK_SIZE || (addr + len) < addr) | 1880 | if ((addr + len) > TASK_SIZE || (addr + len) < addr) |
| 1881 | return -EINVAL; | 1881 | return -EINVAL; |
| 1882 | 1882 | ||
| 1883 | if (is_hugepage_only_range(mm, addr, len)) | ||
| 1884 | return -EINVAL; | ||
| 1885 | |||
| 1883 | flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags; | 1886 | flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags; |
| 1884 | 1887 | ||
| 1885 | error = arch_mmap_check(addr, len, flags); | 1888 | error = arch_mmap_check(addr, len, flags); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index bf2f6cff1d6a..aa6fcc7ca66f 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -2612,6 +2612,9 @@ unsigned long __init find_min_pfn_for_node(unsigned long nid) | |||
| 2612 | { | 2612 | { |
| 2613 | int i; | 2613 | int i; |
| 2614 | 2614 | ||
| 2615 | /* Regions in the early_node_map can be in any order */ | ||
| 2616 | sort_node_map(); | ||
| 2617 | |||
| 2615 | /* Assuming a sorted map, the first range found has the starting pfn */ | 2618 | /* Assuming a sorted map, the first range found has the starting pfn */ |
| 2616 | for_each_active_range_index_in_nid(i, nid) | 2619 | for_each_active_range_index_in_nid(i, nid) |
| 2617 | return early_node_map[i].start_pfn; | 2620 | return early_node_map[i].start_pfn; |
| @@ -2680,9 +2683,6 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn) | |||
| 2680 | max(max_zone_pfn[i], arch_zone_lowest_possible_pfn[i]); | 2683 | max(max_zone_pfn[i], arch_zone_lowest_possible_pfn[i]); |
| 2681 | } | 2684 | } |
| 2682 | 2685 | ||
| 2683 | /* Regions in the early_node_map can be in any order */ | ||
| 2684 | sort_node_map(); | ||
| 2685 | |||
| 2686 | /* Print out the zone ranges */ | 2686 | /* Print out the zone ranges */ |
| 2687 | printk("Zone PFN ranges:\n"); | 2687 | printk("Zone PFN ranges:\n"); |
| 2688 | for (i = 0; i < MAX_NR_ZONES; i++) | 2688 | for (i = 0; i < MAX_NR_ZONES; i++) |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 7dc6aa745166..86897ee792d6 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
| @@ -181,14 +181,13 @@ static struct vm_struct *__get_vm_area_node(unsigned long size, unsigned long fl | |||
| 181 | } | 181 | } |
| 182 | addr = ALIGN(start, align); | 182 | addr = ALIGN(start, align); |
| 183 | size = PAGE_ALIGN(size); | 183 | size = PAGE_ALIGN(size); |
| 184 | if (unlikely(!size)) | ||
| 185 | return NULL; | ||
| 184 | 186 | ||
| 185 | area = kmalloc_node(sizeof(*area), gfp_mask & GFP_LEVEL_MASK, node); | 187 | area = kmalloc_node(sizeof(*area), gfp_mask & GFP_LEVEL_MASK, node); |
| 186 | if (unlikely(!area)) | 188 | if (unlikely(!area)) |
| 187 | return NULL; | 189 | return NULL; |
| 188 | 190 | ||
| 189 | if (unlikely(!size)) | ||
| 190 | return NULL; | ||
| 191 | |||
| 192 | /* | 191 | /* |
| 193 | * We always allocate a guard page. | 192 | * We always allocate a guard page. |
| 194 | */ | 193 | */ |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 65f094845719..bb94e6da223c 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
| @@ -57,6 +57,7 @@ | |||
| 57 | static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) | 57 | static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) |
| 58 | { | 58 | { |
| 59 | __u8 status; | 59 | __u8 status; |
| 60 | struct hci_conn *pend; | ||
| 60 | 61 | ||
| 61 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); | 62 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); |
| 62 | 63 | ||
| @@ -71,6 +72,15 @@ static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb | |||
| 71 | clear_bit(HCI_INQUIRY, &hdev->flags); | 72 | clear_bit(HCI_INQUIRY, &hdev->flags); |
| 72 | hci_req_complete(hdev, status); | 73 | hci_req_complete(hdev, status); |
| 73 | } | 74 | } |
| 75 | |||
| 76 | hci_dev_lock(hdev); | ||
| 77 | |||
| 78 | pend = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2); | ||
| 79 | if (pend) | ||
| 80 | hci_acl_connect(pend); | ||
| 81 | |||
| 82 | hci_dev_unlock(hdev); | ||
| 83 | |||
| 74 | break; | 84 | break; |
| 75 | 85 | ||
| 76 | default: | 86 | default: |
| @@ -565,11 +575,20 @@ static void hci_cs_info_param(struct hci_dev *hdev, __u16 ocf, __u8 status) | |||
| 565 | static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | 575 | static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
| 566 | { | 576 | { |
| 567 | __u8 status = *((__u8 *) skb->data); | 577 | __u8 status = *((__u8 *) skb->data); |
| 578 | struct hci_conn *pend; | ||
| 568 | 579 | ||
| 569 | BT_DBG("%s status %d", hdev->name, status); | 580 | BT_DBG("%s status %d", hdev->name, status); |
| 570 | 581 | ||
| 571 | clear_bit(HCI_INQUIRY, &hdev->flags); | 582 | clear_bit(HCI_INQUIRY, &hdev->flags); |
| 572 | hci_req_complete(hdev, status); | 583 | hci_req_complete(hdev, status); |
| 584 | |||
| 585 | hci_dev_lock(hdev); | ||
| 586 | |||
| 587 | pend = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2); | ||
| 588 | if (pend) | ||
| 589 | hci_acl_connect(pend); | ||
| 590 | |||
| 591 | hci_dev_unlock(hdev); | ||
| 573 | } | 592 | } |
| 574 | 593 | ||
| 575 | /* Inquiry Result */ | 594 | /* Inquiry Result */ |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index f26a9eb49945..711a085eca5b 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
| @@ -120,10 +120,13 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb) | |||
| 120 | if (!hci_test_bit(evt, &flt->event_mask)) | 120 | if (!hci_test_bit(evt, &flt->event_mask)) |
| 121 | continue; | 121 | continue; |
| 122 | 122 | ||
| 123 | if (flt->opcode && ((evt == HCI_EV_CMD_COMPLETE && | 123 | if (flt->opcode && |
| 124 | flt->opcode != *(__u16 *)(skb->data + 3)) || | 124 | ((evt == HCI_EV_CMD_COMPLETE && |
| 125 | (evt == HCI_EV_CMD_STATUS && | 125 | flt->opcode != |
| 126 | flt->opcode != *(__u16 *)(skb->data + 4)))) | 126 | get_unaligned((__u16 *)(skb->data + 3))) || |
| 127 | (evt == HCI_EV_CMD_STATUS && | ||
| 128 | flt->opcode != | ||
| 129 | get_unaligned((__u16 *)(skb->data + 4))))) | ||
| 127 | continue; | 130 | continue; |
| 128 | } | 131 | } |
| 129 | 132 | ||
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 954eb74eb370..3eeeb7a86e75 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
| @@ -259,7 +259,9 @@ void hci_conn_add_sysfs(struct hci_conn *conn) | |||
| 259 | 259 | ||
| 260 | BT_DBG("conn %p", conn); | 260 | BT_DBG("conn %p", conn); |
| 261 | 261 | ||
| 262 | conn->dev.parent = &hdev->dev; | 262 | conn->dev.bus = &bt_bus; |
| 263 | conn->dev.parent = &hdev->dev; | ||
| 264 | |||
| 263 | conn->dev.release = bt_release; | 265 | conn->dev.release = bt_release; |
| 264 | 266 | ||
| 265 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, | 267 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 2b3dcb8f90fa..bbf78e6a7bc3 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -1353,12 +1353,12 @@ static inline int l2cap_conf_output(struct sock *sk, void **ptr) | |||
| 1353 | 1353 | ||
| 1354 | /* Configure output options and let the other side know | 1354 | /* Configure output options and let the other side know |
| 1355 | * which ones we don't like. */ | 1355 | * which ones we don't like. */ |
| 1356 | if (pi->conf_mtu < pi->omtu) { | 1356 | if (pi->conf_mtu < pi->omtu) |
| 1357 | l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, pi->omtu); | ||
| 1358 | result = L2CAP_CONF_UNACCEPT; | 1357 | result = L2CAP_CONF_UNACCEPT; |
| 1359 | } else { | 1358 | else |
| 1360 | pi->omtu = pi->conf_mtu; | 1359 | pi->omtu = pi->conf_mtu; |
| 1361 | } | 1360 | |
| 1361 | l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, pi->omtu); | ||
| 1362 | 1362 | ||
| 1363 | BT_DBG("sk %p result %d", sk, result); | 1363 | BT_DBG("sk %p result %d", sk, result); |
| 1364 | return result; | 1364 | return result; |
| @@ -1533,6 +1533,9 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
| 1533 | if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid))) | 1533 | if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid))) |
| 1534 | return -ENOENT; | 1534 | return -ENOENT; |
| 1535 | 1535 | ||
| 1536 | if (sk->sk_state == BT_DISCONN) | ||
| 1537 | goto unlock; | ||
| 1538 | |||
| 1536 | l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req)); | 1539 | l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req)); |
| 1537 | 1540 | ||
| 1538 | if (flags & 0x0001) { | 1541 | if (flags & 0x0001) { |
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index b8e3a5f1c8a8..1fb5d42f37ae 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
| @@ -765,7 +765,7 @@ static void rfcomm_tty_set_termios(struct tty_struct *tty, struct termios *old) | |||
| 765 | 765 | ||
| 766 | BT_DBG("tty %p termios %p", tty, old); | 766 | BT_DBG("tty %p termios %p", tty, old); |
| 767 | 767 | ||
| 768 | if (!dev) | 768 | if (!dev || !dev->dlc || !dev->dlc->session) |
| 769 | return; | 769 | return; |
| 770 | 770 | ||
| 771 | /* Handle turning off CRTSCTS */ | 771 | /* Handle turning off CRTSCTS */ |
diff --git a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c index 4e4119a12139..4c61a7e0a86e 100644 --- a/net/bridge/br_ioctl.c +++ b/net/bridge/br_ioctl.c | |||
| @@ -58,12 +58,13 @@ static int get_fdb_entries(struct net_bridge *br, void __user *userbuf, | |||
| 58 | { | 58 | { |
| 59 | int num; | 59 | int num; |
| 60 | void *buf; | 60 | void *buf; |
| 61 | size_t size = maxnum * sizeof(struct __fdb_entry); | 61 | size_t size; |
| 62 | 62 | ||
| 63 | if (size > PAGE_SIZE) { | 63 | /* Clamp size to PAGE_SIZE, test maxnum to avoid overflow */ |
| 64 | size = PAGE_SIZE; | 64 | if (maxnum > PAGE_SIZE/sizeof(struct __fdb_entry)) |
| 65 | maxnum = PAGE_SIZE/sizeof(struct __fdb_entry); | 65 | maxnum = PAGE_SIZE/sizeof(struct __fdb_entry); |
| 66 | } | 66 | |
| 67 | size = maxnum * sizeof(struct __fdb_entry); | ||
| 67 | 68 | ||
| 68 | buf = kmalloc(size, GFP_USER); | 69 | buf = kmalloc(size, GFP_USER); |
| 69 | if (!buf) | 70 | if (!buf) |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index eb0ff7ab05ed..fc4242c0767c 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
| @@ -277,7 +277,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 277 | __u64 seq; | 277 | __u64 seq; |
| 278 | 278 | ||
| 279 | sk = inet6_lookup(&dccp_hashinfo, &hdr->daddr, dh->dccph_dport, | 279 | sk = inet6_lookup(&dccp_hashinfo, &hdr->daddr, dh->dccph_dport, |
| 280 | &hdr->saddr, dh->dccph_sport, skb->dev->ifindex); | 280 | &hdr->saddr, dh->dccph_sport, inet6_iif(skb)); |
| 281 | 281 | ||
| 282 | if (sk == NULL) { | 282 | if (sk == NULL) { |
| 283 | ICMP6_INC_STATS_BH(__in6_dev_get(skb->dev), ICMP6_MIB_INERRORS); | 283 | ICMP6_INC_STATS_BH(__in6_dev_get(skb->dev), ICMP6_MIB_INERRORS); |
diff --git a/net/dccp/probe.c b/net/dccp/probe.c index 146496fce2e2..fded1493c1dc 100644 --- a/net/dccp/probe.c +++ b/net/dccp/probe.c | |||
| @@ -160,6 +160,8 @@ static __init int dccpprobe_init(void) | |||
| 160 | init_waitqueue_head(&dccpw.wait); | 160 | init_waitqueue_head(&dccpw.wait); |
| 161 | spin_lock_init(&dccpw.lock); | 161 | spin_lock_init(&dccpw.lock); |
| 162 | dccpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &dccpw.lock); | 162 | dccpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &dccpw.lock); |
| 163 | if (IS_ERR(dccpw.fifo)) | ||
| 164 | return PTR_ERR(dccpw.fifo); | ||
| 163 | 165 | ||
| 164 | if (!proc_net_fops_create(procname, S_IRUSR, &dccpprobe_fops)) | 166 | if (!proc_net_fops_create(procname, S_IRUSR, &dccpprobe_fops)) |
| 165 | goto err0; | 167 | goto err0; |
diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c index 143c4668538b..8b848aa77bfc 100644 --- a/net/ipv4/netfilter/ip_conntrack_core.c +++ b/net/ipv4/netfilter/ip_conntrack_core.c | |||
| @@ -225,10 +225,8 @@ __ip_conntrack_expect_find(const struct ip_conntrack_tuple *tuple) | |||
| 225 | struct ip_conntrack_expect *i; | 225 | struct ip_conntrack_expect *i; |
| 226 | 226 | ||
| 227 | list_for_each_entry(i, &ip_conntrack_expect_list, list) { | 227 | list_for_each_entry(i, &ip_conntrack_expect_list, list) { |
| 228 | if (ip_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) { | 228 | if (ip_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) |
| 229 | atomic_inc(&i->use); | ||
| 230 | return i; | 229 | return i; |
| 231 | } | ||
| 232 | } | 230 | } |
| 233 | return NULL; | 231 | return NULL; |
| 234 | } | 232 | } |
| @@ -241,6 +239,8 @@ ip_conntrack_expect_find(const struct ip_conntrack_tuple *tuple) | |||
| 241 | 239 | ||
| 242 | read_lock_bh(&ip_conntrack_lock); | 240 | read_lock_bh(&ip_conntrack_lock); |
| 243 | i = __ip_conntrack_expect_find(tuple); | 241 | i = __ip_conntrack_expect_find(tuple); |
| 242 | if (i) | ||
| 243 | atomic_inc(&i->use); | ||
| 244 | read_unlock_bh(&ip_conntrack_lock); | 244 | read_unlock_bh(&ip_conntrack_lock); |
| 245 | 245 | ||
| 246 | return i; | 246 | return i; |
diff --git a/net/ipv4/netfilter/ip_conntrack_helper_h323.c b/net/ipv4/netfilter/ip_conntrack_helper_h323.c index 7b7441202bfd..6cb9070cd0bc 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_h323.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_h323.c | |||
| @@ -1417,7 +1417,7 @@ static int process_rcf(struct sk_buff **pskb, struct ip_conntrack *ct, | |||
| 1417 | DEBUGP | 1417 | DEBUGP |
| 1418 | ("ip_ct_ras: set RAS connection timeout to %u seconds\n", | 1418 | ("ip_ct_ras: set RAS connection timeout to %u seconds\n", |
| 1419 | info->timeout); | 1419 | info->timeout); |
| 1420 | ip_ct_refresh_acct(ct, ctinfo, NULL, info->timeout * HZ); | 1420 | ip_ct_refresh(ct, *pskb, info->timeout * HZ); |
| 1421 | 1421 | ||
| 1422 | /* Set expect timeout */ | 1422 | /* Set expect timeout */ |
| 1423 | read_lock_bh(&ip_conntrack_lock); | 1423 | read_lock_bh(&ip_conntrack_lock); |
| @@ -1465,7 +1465,7 @@ static int process_urq(struct sk_buff **pskb, struct ip_conntrack *ct, | |||
| 1465 | info->sig_port[!dir] = 0; | 1465 | info->sig_port[!dir] = 0; |
| 1466 | 1466 | ||
| 1467 | /* Give it 30 seconds for UCF or URJ */ | 1467 | /* Give it 30 seconds for UCF or URJ */ |
| 1468 | ip_ct_refresh_acct(ct, ctinfo, NULL, 30 * HZ); | 1468 | ip_ct_refresh(ct, *pskb, 30 * HZ); |
| 1469 | 1469 | ||
| 1470 | return 0; | 1470 | return 0; |
| 1471 | } | 1471 | } |
diff --git a/net/ipv4/netfilter/ip_conntrack_netlink.c b/net/ipv4/netfilter/ip_conntrack_netlink.c index 262d0d44ec1b..55f0ae641081 100644 --- a/net/ipv4/netfilter/ip_conntrack_netlink.c +++ b/net/ipv4/netfilter/ip_conntrack_netlink.c | |||
| @@ -153,6 +153,7 @@ ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct ip_conntrack *ct) | |||
| 153 | return ret; | 153 | return ret; |
| 154 | 154 | ||
| 155 | nfattr_failure: | 155 | nfattr_failure: |
| 156 | ip_conntrack_proto_put(proto); | ||
| 156 | return -1; | 157 | return -1; |
| 157 | } | 158 | } |
| 158 | 159 | ||
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index 7edad790478a..97556cc2e4e0 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c | |||
| @@ -351,9 +351,10 @@ ipq_mangle_ipv4(ipq_verdict_msg_t *v, struct ipq_queue_entry *e) | |||
| 351 | if (v->data_len < sizeof(*user_iph)) | 351 | if (v->data_len < sizeof(*user_iph)) |
| 352 | return 0; | 352 | return 0; |
| 353 | diff = v->data_len - e->skb->len; | 353 | diff = v->data_len - e->skb->len; |
| 354 | if (diff < 0) | 354 | if (diff < 0) { |
| 355 | skb_trim(e->skb, v->data_len); | 355 | if (pskb_trim(e->skb, v->data_len)) |
| 356 | else if (diff > 0) { | 356 | return -ENOMEM; |
| 357 | } else if (diff > 0) { | ||
| 357 | if (v->data_len > 0xFFFF) | 358 | if (v->data_len > 0xFFFF) |
| 358 | return -EINVAL; | 359 | return -EINVAL; |
| 359 | if (diff > skb_tailroom(e->skb)) { | 360 | if (diff > skb_tailroom(e->skb)) { |
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c index ad0312d0e4fd..264763adc39b 100644 --- a/net/ipv4/netfilter/ipt_REJECT.c +++ b/net/ipv4/netfilter/ipt_REJECT.c | |||
| @@ -114,6 +114,14 @@ static void send_reset(struct sk_buff *oldskb, int hook) | |||
| 114 | tcph->window = 0; | 114 | tcph->window = 0; |
| 115 | tcph->urg_ptr = 0; | 115 | tcph->urg_ptr = 0; |
| 116 | 116 | ||
| 117 | /* Adjust TCP checksum */ | ||
| 118 | tcph->check = 0; | ||
| 119 | tcph->check = tcp_v4_check(tcph, sizeof(struct tcphdr), | ||
| 120 | nskb->nh.iph->saddr, | ||
| 121 | nskb->nh.iph->daddr, | ||
| 122 | csum_partial((char *)tcph, | ||
| 123 | sizeof(struct tcphdr), 0)); | ||
| 124 | |||
| 117 | /* Set DF, id = 0 */ | 125 | /* Set DF, id = 0 */ |
| 118 | nskb->nh.iph->frag_off = htons(IP_DF); | 126 | nskb->nh.iph->frag_off = htons(IP_DF); |
| 119 | nskb->nh.iph->id = 0; | 127 | nskb->nh.iph->id = 0; |
| @@ -129,14 +137,8 @@ static void send_reset(struct sk_buff *oldskb, int hook) | |||
| 129 | if (ip_route_me_harder(&nskb, addr_type)) | 137 | if (ip_route_me_harder(&nskb, addr_type)) |
| 130 | goto free_nskb; | 138 | goto free_nskb; |
| 131 | 139 | ||
| 132 | /* Adjust TCP checksum */ | ||
| 133 | nskb->ip_summed = CHECKSUM_NONE; | 140 | nskb->ip_summed = CHECKSUM_NONE; |
| 134 | tcph->check = 0; | 141 | |
| 135 | tcph->check = tcp_v4_check(tcph, sizeof(struct tcphdr), | ||
| 136 | nskb->nh.iph->saddr, | ||
| 137 | nskb->nh.iph->daddr, | ||
| 138 | csum_partial((char *)tcph, | ||
| 139 | sizeof(struct tcphdr), 0)); | ||
| 140 | /* Adjust IP TTL */ | 142 | /* Adjust IP TTL */ |
| 141 | nskb->nh.iph->ttl = dst_metric(nskb->dst, RTAX_HOPLIMIT); | 143 | nskb->nh.iph->ttl = dst_metric(nskb->dst, RTAX_HOPLIMIT); |
| 142 | 144 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 4322318ab332..c05e8edaf544 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -2316,9 +2316,10 @@ void __init tcp_init(void) | |||
| 2316 | sysctl_max_syn_backlog = 128; | 2316 | sysctl_max_syn_backlog = 128; |
| 2317 | } | 2317 | } |
| 2318 | 2318 | ||
| 2319 | sysctl_tcp_mem[0] = 768 << order; | 2319 | /* Allow no more than 3/4 kernel memory (usually less) allocated to TCP */ |
| 2320 | sysctl_tcp_mem[1] = 1024 << order; | 2320 | sysctl_tcp_mem[0] = (1536 / sizeof (struct inet_bind_hashbucket)) << order; |
| 2321 | sysctl_tcp_mem[2] = 1536 << order; | 2321 | sysctl_tcp_mem[1] = sysctl_tcp_mem[0] * 4 / 3; |
| 2322 | sysctl_tcp_mem[2] = sysctl_tcp_mem[0] * 2; | ||
| 2322 | 2323 | ||
| 2323 | limit = ((unsigned long)sysctl_tcp_mem[1]) << (PAGE_SHIFT - 7); | 2324 | limit = ((unsigned long)sysctl_tcp_mem[1]) << (PAGE_SHIFT - 7); |
| 2324 | max_share = min(4UL*1024*1024, limit); | 2325 | max_share = min(4UL*1024*1024, limit); |
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c index 4be336f17883..f230eeecf092 100644 --- a/net/ipv4/tcp_probe.c +++ b/net/ipv4/tcp_probe.c | |||
| @@ -156,6 +156,8 @@ static __init int tcpprobe_init(void) | |||
| 156 | init_waitqueue_head(&tcpw.wait); | 156 | init_waitqueue_head(&tcpw.wait); |
| 157 | spin_lock_init(&tcpw.lock); | 157 | spin_lock_init(&tcpw.lock); |
| 158 | tcpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &tcpw.lock); | 158 | tcpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &tcpw.lock); |
| 159 | if (IS_ERR(tcpw.fifo)) | ||
| 160 | return PTR_ERR(tcpw.fifo); | ||
| 159 | 161 | ||
| 160 | if (!proc_net_fops_create(procname, S_IRUSR, &tcpprobe_fops)) | 162 | if (!proc_net_fops_create(procname, S_IRUSR, &tcpprobe_fops)) |
| 161 | goto err0; | 163 | goto err0; |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 865d75214a9a..9e1bd374875e 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -928,23 +928,32 @@ static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb) | |||
| 928 | return 1; | 928 | return 1; |
| 929 | #else | 929 | #else |
| 930 | struct udp_sock *up = udp_sk(sk); | 930 | struct udp_sock *up = udp_sk(sk); |
| 931 | struct udphdr *uh = skb->h.uh; | 931 | struct udphdr *uh; |
| 932 | struct iphdr *iph; | 932 | struct iphdr *iph; |
| 933 | int iphlen, len; | 933 | int iphlen, len; |
| 934 | 934 | ||
| 935 | __u8 *udpdata = (__u8 *)uh + sizeof(struct udphdr); | 935 | __u8 *udpdata; |
| 936 | __be32 *udpdata32 = (__be32 *)udpdata; | 936 | __be32 *udpdata32; |
| 937 | __u16 encap_type = up->encap_type; | 937 | __u16 encap_type = up->encap_type; |
| 938 | 938 | ||
| 939 | /* if we're overly short, let UDP handle it */ | 939 | /* if we're overly short, let UDP handle it */ |
| 940 | if (udpdata > skb->tail) | 940 | len = skb->len - sizeof(struct udphdr); |
| 941 | if (len <= 0) | ||
| 941 | return 1; | 942 | return 1; |
| 942 | 943 | ||
| 943 | /* if this is not encapsulated socket, then just return now */ | 944 | /* if this is not encapsulated socket, then just return now */ |
| 944 | if (!encap_type) | 945 | if (!encap_type) |
| 945 | return 1; | 946 | return 1; |
| 946 | 947 | ||
| 947 | len = skb->tail - udpdata; | 948 | /* If this is a paged skb, make sure we pull up |
| 949 | * whatever data we need to look at. */ | ||
| 950 | if (!pskb_may_pull(skb, sizeof(struct udphdr) + min(len, 8))) | ||
| 951 | return 1; | ||
| 952 | |||
| 953 | /* Now we can get the pointers */ | ||
| 954 | uh = skb->h.uh; | ||
| 955 | udpdata = (__u8 *)uh + sizeof(struct udphdr); | ||
| 956 | udpdata32 = (__be32 *)udpdata; | ||
| 948 | 957 | ||
| 949 | switch (encap_type) { | 958 | switch (encap_type) { |
| 950 | default: | 959 | default: |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 84d7ebdb9d21..b9f40290d12a 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
| @@ -542,6 +542,7 @@ ip6ip6_rcv(struct sk_buff *skb) | |||
| 542 | skb->dev = t->dev; | 542 | skb->dev = t->dev; |
| 543 | dst_release(skb->dst); | 543 | dst_release(skb->dst); |
| 544 | skb->dst = NULL; | 544 | skb->dst = NULL; |
| 545 | nf_reset(skb); | ||
| 545 | if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) | 546 | if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) |
| 546 | ipv6_copy_dscp(ipv6h, skb->nh.ipv6h); | 547 | ipv6_copy_dscp(ipv6h, skb->nh.ipv6h); |
| 547 | ip6ip6_ecn_decapsulate(ipv6h, skb); | 548 | ip6ip6_ecn_decapsulate(ipv6h, skb); |
| @@ -1149,6 +1150,20 @@ fail: | |||
| 1149 | return err; | 1150 | return err; |
| 1150 | } | 1151 | } |
| 1151 | 1152 | ||
| 1153 | static void __exit ip6ip6_destroy_tunnels(void) | ||
| 1154 | { | ||
| 1155 | int h; | ||
| 1156 | struct ip6_tnl *t; | ||
| 1157 | |||
| 1158 | for (h = 0; h < HASH_SIZE; h++) { | ||
| 1159 | while ((t = tnls_r_l[h]) != NULL) | ||
| 1160 | unregister_netdevice(t->dev); | ||
| 1161 | } | ||
| 1162 | |||
| 1163 | t = tnls_wc[0]; | ||
| 1164 | unregister_netdevice(t->dev); | ||
| 1165 | } | ||
| 1166 | |||
| 1152 | /** | 1167 | /** |
| 1153 | * ip6_tunnel_cleanup - free resources and unregister protocol | 1168 | * ip6_tunnel_cleanup - free resources and unregister protocol |
| 1154 | **/ | 1169 | **/ |
| @@ -1158,7 +1173,9 @@ static void __exit ip6_tunnel_cleanup(void) | |||
| 1158 | if (xfrm6_tunnel_deregister(&ip6ip6_handler)) | 1173 | if (xfrm6_tunnel_deregister(&ip6ip6_handler)) |
| 1159 | printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n"); | 1174 | printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n"); |
| 1160 | 1175 | ||
| 1161 | unregister_netdev(ip6ip6_fb_tnl_dev); | 1176 | rtnl_lock(); |
| 1177 | ip6ip6_destroy_tunnels(); | ||
| 1178 | rtnl_unlock(); | ||
| 1162 | } | 1179 | } |
| 1163 | 1180 | ||
| 1164 | module_init(ip6_tunnel_init); | 1181 | module_init(ip6_tunnel_init); |
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index 9510c24ca8d2..9fec832ee08b 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c | |||
| @@ -349,9 +349,10 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct ipq_queue_entry *e) | |||
| 349 | if (v->data_len < sizeof(*user_iph)) | 349 | if (v->data_len < sizeof(*user_iph)) |
| 350 | return 0; | 350 | return 0; |
| 351 | diff = v->data_len - e->skb->len; | 351 | diff = v->data_len - e->skb->len; |
| 352 | if (diff < 0) | 352 | if (diff < 0) { |
| 353 | skb_trim(e->skb, v->data_len); | 353 | if (pskb_trim(e->skb, v->data_len)) |
| 354 | else if (diff > 0) { | 354 | return -ENOMEM; |
| 355 | } else if (diff > 0) { | ||
| 355 | if (v->data_len > 0xFFFF) | 356 | if (v->data_len > 0xFFFF) |
| 356 | return -EINVAL; | 357 | return -EINVAL; |
| 357 | if (diff > skb_tailroom(e->skb)) { | 358 | if (diff > skb_tailroom(e->skb)) { |
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 167c2ea88f6b..204e02162d49 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
| @@ -1494,7 +1494,7 @@ int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | |||
| 1494 | if (_frag_off) { | 1494 | if (_frag_off) { |
| 1495 | if (target < 0 && | 1495 | if (target < 0 && |
| 1496 | ((!ipv6_ext_hdr(hp->nexthdr)) || | 1496 | ((!ipv6_ext_hdr(hp->nexthdr)) || |
| 1497 | nexthdr == NEXTHDR_NONE)) { | 1497 | hp->nexthdr == NEXTHDR_NONE)) { |
| 1498 | if (fragoff) | 1498 | if (fragoff) |
| 1499 | *fragoff = _frag_off; | 1499 | *fragoff = _frag_off; |
| 1500 | return hp->nexthdr; | 1500 | return hp->nexthdr; |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index c953466b7afd..b39ae99122d5 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -330,6 +330,8 @@ static int inline rt6_check_neigh(struct rt6_info *rt) | |||
| 330 | read_lock_bh(&neigh->lock); | 330 | read_lock_bh(&neigh->lock); |
| 331 | if (neigh->nud_state & NUD_VALID) | 331 | if (neigh->nud_state & NUD_VALID) |
| 332 | m = 2; | 332 | m = 2; |
| 333 | else if (!(neigh->nud_state & NUD_FAILED)) | ||
| 334 | m = 1; | ||
| 333 | read_unlock_bh(&neigh->lock); | 335 | read_unlock_bh(&neigh->lock); |
| 334 | } | 336 | } |
| 335 | return m; | 337 | return m; |
| @@ -347,9 +349,7 @@ static int rt6_score_route(struct rt6_info *rt, int oif, | |||
| 347 | m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; | 349 | m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; |
| 348 | #endif | 350 | #endif |
| 349 | n = rt6_check_neigh(rt); | 351 | n = rt6_check_neigh(rt); |
| 350 | if (n > 1) | 352 | if (!n && (strict & RT6_LOOKUP_F_REACHABLE)) |
| 351 | m |= 16; | ||
| 352 | else if (!n && strict & RT6_LOOKUP_F_REACHABLE) | ||
| 353 | return -1; | 353 | return -1; |
| 354 | return m; | 354 | return m; |
| 355 | } | 355 | } |
| @@ -380,10 +380,11 @@ static struct rt6_info *rt6_select(struct rt6_info **head, int oif, | |||
| 380 | continue; | 380 | continue; |
| 381 | 381 | ||
| 382 | if (m > mpri) { | 382 | if (m > mpri) { |
| 383 | rt6_probe(match); | 383 | if (strict & RT6_LOOKUP_F_REACHABLE) |
| 384 | rt6_probe(match); | ||
| 384 | match = rt; | 385 | match = rt; |
| 385 | mpri = m; | 386 | mpri = m; |
| 386 | } else { | 387 | } else if (strict & RT6_LOOKUP_F_REACHABLE) { |
| 387 | rt6_probe(rt); | 388 | rt6_probe(rt); |
| 388 | } | 389 | } |
| 389 | } | 390 | } |
| @@ -636,7 +637,7 @@ static struct rt6_info *ip6_pol_route_input(struct fib6_table *table, | |||
| 636 | int strict = 0; | 637 | int strict = 0; |
| 637 | int attempts = 3; | 638 | int attempts = 3; |
| 638 | int err; | 639 | int err; |
| 639 | int reachable = RT6_LOOKUP_F_REACHABLE; | 640 | int reachable = ipv6_devconf.forwarding ? 0 : RT6_LOOKUP_F_REACHABLE; |
| 640 | 641 | ||
| 641 | strict |= flags & RT6_LOOKUP_F_IFACE; | 642 | strict |= flags & RT6_LOOKUP_F_IFACE; |
| 642 | 643 | ||
| @@ -733,7 +734,7 @@ static struct rt6_info *ip6_pol_route_output(struct fib6_table *table, | |||
| 733 | int strict = 0; | 734 | int strict = 0; |
| 734 | int attempts = 3; | 735 | int attempts = 3; |
| 735 | int err; | 736 | int err; |
| 736 | int reachable = RT6_LOOKUP_F_REACHABLE; | 737 | int reachable = ipv6_devconf.forwarding ? 0 : RT6_LOOKUP_F_REACHABLE; |
| 737 | 738 | ||
| 738 | strict |= flags & RT6_LOOKUP_F_IFACE; | 739 | strict |= flags & RT6_LOOKUP_F_IFACE; |
| 739 | 740 | ||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index e0c3934a7e4b..c83f23e51c46 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -242,14 +242,13 @@ static void udpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 242 | { | 242 | { |
| 243 | struct ipv6_pinfo *np; | 243 | struct ipv6_pinfo *np; |
| 244 | struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data; | 244 | struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data; |
| 245 | struct net_device *dev = skb->dev; | ||
| 246 | struct in6_addr *saddr = &hdr->saddr; | 245 | struct in6_addr *saddr = &hdr->saddr; |
| 247 | struct in6_addr *daddr = &hdr->daddr; | 246 | struct in6_addr *daddr = &hdr->daddr; |
| 248 | struct udphdr *uh = (struct udphdr*)(skb->data+offset); | 247 | struct udphdr *uh = (struct udphdr*)(skb->data+offset); |
| 249 | struct sock *sk; | 248 | struct sock *sk; |
| 250 | int err; | 249 | int err; |
| 251 | 250 | ||
| 252 | sk = udp_v6_lookup(daddr, uh->dest, saddr, uh->source, dev->ifindex); | 251 | sk = udp_v6_lookup(daddr, uh->dest, saddr, uh->source, inet6_iif(skb)); |
| 253 | 252 | ||
| 254 | if (sk == NULL) | 253 | if (sk == NULL) |
| 255 | return; | 254 | return; |
| @@ -348,7 +347,7 @@ static void udpv6_mcast_deliver(struct udphdr *uh, | |||
| 348 | 347 | ||
| 349 | read_lock(&udp_hash_lock); | 348 | read_lock(&udp_hash_lock); |
| 350 | sk = sk_head(&udp_hash[ntohs(uh->dest) & (UDP_HTABLE_SIZE - 1)]); | 349 | sk = sk_head(&udp_hash[ntohs(uh->dest) & (UDP_HTABLE_SIZE - 1)]); |
| 351 | dif = skb->dev->ifindex; | 350 | dif = inet6_iif(skb); |
| 352 | sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); | 351 | sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); |
| 353 | if (!sk) { | 352 | if (!sk) { |
| 354 | kfree_skb(skb); | 353 | kfree_skb(skb); |
| @@ -429,7 +428,7 @@ static int udpv6_rcv(struct sk_buff **pskb) | |||
| 429 | * check socket cache ... must talk to Alan about his plans | 428 | * check socket cache ... must talk to Alan about his plans |
| 430 | * for sock caches... i'll skip this for now. | 429 | * for sock caches... i'll skip this for now. |
| 431 | */ | 430 | */ |
| 432 | sk = udp_v6_lookup(saddr, uh->source, daddr, uh->dest, dev->ifindex); | 431 | sk = udp_v6_lookup(saddr, uh->source, daddr, uh->dest, inet6_iif(skb)); |
| 433 | 432 | ||
| 434 | if (sk == NULL) { | 433 | if (sk == NULL) { |
| 435 | if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) | 434 | if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) |
diff --git a/net/irda/irlmp.c b/net/irda/irlmp.c index 5073261b9d0c..fede83763095 100644 --- a/net/irda/irlmp.c +++ b/net/irda/irlmp.c | |||
| @@ -1678,7 +1678,8 @@ static int irlmp_slsap_inuse(__u8 slsap_sel) | |||
| 1678 | * every IrLAP connection and check every LSAP associated with each | 1678 | * every IrLAP connection and check every LSAP associated with each |
| 1679 | * the connection. | 1679 | * the connection. |
| 1680 | */ | 1680 | */ |
| 1681 | spin_lock_irqsave(&irlmp->links->hb_spinlock, flags); | 1681 | spin_lock_irqsave_nested(&irlmp->links->hb_spinlock, flags, |
| 1682 | SINGLE_DEPTH_NESTING); | ||
| 1682 | lap = (struct lap_cb *) hashbin_get_first(irlmp->links); | 1683 | lap = (struct lap_cb *) hashbin_get_first(irlmp->links); |
| 1683 | while (lap != NULL) { | 1684 | while (lap != NULL) { |
| 1684 | IRDA_ASSERT(lap->magic == LMP_LAP_MAGIC, goto errlap;); | 1685 | IRDA_ASSERT(lap->magic == LMP_LAP_MAGIC, goto errlap;); |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 836541e509fe..de0567b1f422 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
| @@ -469,10 +469,8 @@ __nf_conntrack_expect_find(const struct nf_conntrack_tuple *tuple) | |||
| 469 | struct nf_conntrack_expect *i; | 469 | struct nf_conntrack_expect *i; |
| 470 | 470 | ||
| 471 | list_for_each_entry(i, &nf_conntrack_expect_list, list) { | 471 | list_for_each_entry(i, &nf_conntrack_expect_list, list) { |
| 472 | if (nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) { | 472 | if (nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) |
| 473 | atomic_inc(&i->use); | ||
| 474 | return i; | 473 | return i; |
| 475 | } | ||
| 476 | } | 474 | } |
| 477 | return NULL; | 475 | return NULL; |
| 478 | } | 476 | } |
| @@ -485,6 +483,8 @@ nf_conntrack_expect_find(const struct nf_conntrack_tuple *tuple) | |||
| 485 | 483 | ||
| 486 | read_lock_bh(&nf_conntrack_lock); | 484 | read_lock_bh(&nf_conntrack_lock); |
| 487 | i = __nf_conntrack_expect_find(tuple); | 485 | i = __nf_conntrack_expect_find(tuple); |
| 486 | if (i) | ||
| 487 | atomic_inc(&i->use); | ||
| 488 | read_unlock_bh(&nf_conntrack_lock); | 488 | read_unlock_bh(&nf_conntrack_lock); |
| 489 | 489 | ||
| 490 | return i; | 490 | return i; |
| @@ -893,12 +893,6 @@ __nf_conntrack_alloc(const struct nf_conntrack_tuple *orig, | |||
| 893 | 893 | ||
| 894 | memset(conntrack, 0, nf_ct_cache[features].size); | 894 | memset(conntrack, 0, nf_ct_cache[features].size); |
| 895 | conntrack->features = features; | 895 | conntrack->features = features; |
| 896 | if (helper) { | ||
| 897 | struct nf_conn_help *help = nfct_help(conntrack); | ||
| 898 | NF_CT_ASSERT(help); | ||
| 899 | help->helper = helper; | ||
| 900 | } | ||
| 901 | |||
| 902 | atomic_set(&conntrack->ct_general.use, 1); | 896 | atomic_set(&conntrack->ct_general.use, 1); |
| 903 | conntrack->ct_general.destroy = destroy_conntrack; | 897 | conntrack->ct_general.destroy = destroy_conntrack; |
| 904 | conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig; | 898 | conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig; |
| @@ -982,8 +976,13 @@ init_conntrack(const struct nf_conntrack_tuple *tuple, | |||
| 982 | #endif | 976 | #endif |
| 983 | nf_conntrack_get(&conntrack->master->ct_general); | 977 | nf_conntrack_get(&conntrack->master->ct_general); |
| 984 | NF_CT_STAT_INC(expect_new); | 978 | NF_CT_STAT_INC(expect_new); |
| 985 | } else | 979 | } else { |
| 980 | struct nf_conn_help *help = nfct_help(conntrack); | ||
| 981 | |||
| 982 | if (help) | ||
| 983 | help->helper = __nf_ct_helper_find(&repl_tuple); | ||
| 986 | NF_CT_STAT_INC(new); | 984 | NF_CT_STAT_INC(new); |
| 985 | } | ||
| 987 | 986 | ||
| 988 | /* Overload tuple linked list to put us in unconfirmed list. */ | 987 | /* Overload tuple linked list to put us in unconfirmed list. */ |
| 989 | list_add(&conntrack->tuplehash[IP_CT_DIR_ORIGINAL].list, &unconfirmed); | 988 | list_add(&conntrack->tuplehash[IP_CT_DIR_ORIGINAL].list, &unconfirmed); |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index bd0156a28ecd..ab67c2be2b5d 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -161,6 +161,7 @@ ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct nf_conn *ct) | |||
| 161 | return ret; | 161 | return ret; |
| 162 | 162 | ||
| 163 | nfattr_failure: | 163 | nfattr_failure: |
| 164 | nf_ct_proto_put(proto); | ||
| 164 | return -1; | 165 | return -1; |
| 165 | } | 166 | } |
| 166 | 167 | ||
| @@ -949,6 +950,7 @@ ctnetlink_create_conntrack(struct nfattr *cda[], | |||
| 949 | { | 950 | { |
| 950 | struct nf_conn *ct; | 951 | struct nf_conn *ct; |
| 951 | int err = -EINVAL; | 952 | int err = -EINVAL; |
| 953 | struct nf_conn_help *help; | ||
| 952 | 954 | ||
| 953 | ct = nf_conntrack_alloc(otuple, rtuple); | 955 | ct = nf_conntrack_alloc(otuple, rtuple); |
| 954 | if (ct == NULL || IS_ERR(ct)) | 956 | if (ct == NULL || IS_ERR(ct)) |
| @@ -976,9 +978,16 @@ ctnetlink_create_conntrack(struct nfattr *cda[], | |||
| 976 | ct->mark = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_MARK-1])); | 978 | ct->mark = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_MARK-1])); |
| 977 | #endif | 979 | #endif |
| 978 | 980 | ||
| 981 | help = nfct_help(ct); | ||
| 982 | if (help) | ||
| 983 | help->helper = nf_ct_helper_find_get(rtuple); | ||
| 984 | |||
| 979 | add_timer(&ct->timeout); | 985 | add_timer(&ct->timeout); |
| 980 | nf_conntrack_hash_insert(ct); | 986 | nf_conntrack_hash_insert(ct); |
| 981 | 987 | ||
| 988 | if (help && help->helper) | ||
| 989 | nf_ct_helper_put(help->helper); | ||
| 990 | |||
| 982 | return 0; | 991 | return 0; |
| 983 | 992 | ||
| 984 | err: | 993 | err: |
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index b2bf8f2e01da..1e5207b80fe5 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
| @@ -544,7 +544,7 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
| 544 | } | 544 | } |
| 545 | /* global sequence number */ | 545 | /* global sequence number */ |
| 546 | if (inst->flags & NFULNL_CFG_F_SEQ_GLOBAL) { | 546 | if (inst->flags & NFULNL_CFG_F_SEQ_GLOBAL) { |
| 547 | tmp_uint = atomic_inc_return(&global_seq); | 547 | tmp_uint = htonl(atomic_inc_return(&global_seq)); |
| 548 | NFA_PUT(inst->skb, NFULA_SEQ_GLOBAL, sizeof(tmp_uint), &tmp_uint); | 548 | NFA_PUT(inst->skb, NFULA_SEQ_GLOBAL, sizeof(tmp_uint), &tmp_uint); |
| 549 | } | 549 | } |
| 550 | 550 | ||
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index 6e4ada3c1844..e815a9aa6e95 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c | |||
| @@ -622,9 +622,10 @@ nfqnl_mangle(void *data, int data_len, struct nfqnl_queue_entry *e) | |||
| 622 | int diff; | 622 | int diff; |
| 623 | 623 | ||
| 624 | diff = data_len - e->skb->len; | 624 | diff = data_len - e->skb->len; |
| 625 | if (diff < 0) | 625 | if (diff < 0) { |
| 626 | skb_trim(e->skb, data_len); | 626 | if (pskb_trim(e->skb, data_len)) |
| 627 | else if (diff > 0) { | 627 | return -ENOMEM; |
| 628 | } else if (diff > 0) { | ||
| 628 | if (data_len > 0xFFFF) | 629 | if (data_len > 0xFFFF) |
| 629 | return -EINVAL; | 630 | return -EINVAL; |
| 630 | if (diff > skb_tailroom(e->skb)) { | 631 | if (diff > skb_tailroom(e->skb)) { |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index b43e7647e125..2ee14f8a1908 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -495,6 +495,7 @@ static struct xfrm_state *xfrm_user_state_lookup(struct xfrm_usersa_id *p, | |||
| 495 | goto out; | 495 | goto out; |
| 496 | } | 496 | } |
| 497 | 497 | ||
| 498 | err = -ESRCH; | ||
| 498 | x = xfrm_state_lookup_byaddr(&p->daddr, saddr, p->proto, | 499 | x = xfrm_state_lookup_byaddr(&p->daddr, saddr, p->proto, |
| 499 | p->family); | 500 | p->family); |
| 500 | } | 501 | } |
| @@ -1927,6 +1928,9 @@ static int xfrm_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *xt, | |||
| 1927 | len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr); | 1928 | len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr); |
| 1928 | len += NLMSG_SPACE(sizeof(struct xfrm_user_acquire)); | 1929 | len += NLMSG_SPACE(sizeof(struct xfrm_user_acquire)); |
| 1929 | len += RTA_SPACE(xfrm_user_sec_ctx_size(xp)); | 1930 | len += RTA_SPACE(xfrm_user_sec_ctx_size(xp)); |
| 1931 | #ifdef CONFIG_XFRM_SUB_POLICY | ||
| 1932 | len += RTA_SPACE(sizeof(struct xfrm_userpolicy_type)); | ||
| 1933 | #endif | ||
| 1930 | skb = alloc_skb(len, GFP_ATOMIC); | 1934 | skb = alloc_skb(len, GFP_ATOMIC); |
| 1931 | if (skb == NULL) | 1935 | if (skb == NULL) |
| 1932 | return -ENOMEM; | 1936 | return -ENOMEM; |
| @@ -2034,6 +2038,9 @@ static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, struct km_eve | |||
| 2034 | len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr); | 2038 | len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr); |
| 2035 | len += NLMSG_SPACE(sizeof(struct xfrm_user_polexpire)); | 2039 | len += NLMSG_SPACE(sizeof(struct xfrm_user_polexpire)); |
| 2036 | len += RTA_SPACE(xfrm_user_sec_ctx_size(xp)); | 2040 | len += RTA_SPACE(xfrm_user_sec_ctx_size(xp)); |
| 2041 | #ifdef CONFIG_XFRM_SUB_POLICY | ||
| 2042 | len += RTA_SPACE(sizeof(struct xfrm_userpolicy_type)); | ||
| 2043 | #endif | ||
| 2037 | skb = alloc_skb(len, GFP_ATOMIC); | 2044 | skb = alloc_skb(len, GFP_ATOMIC); |
| 2038 | if (skb == NULL) | 2045 | if (skb == NULL) |
| 2039 | return -ENOMEM; | 2046 | return -ENOMEM; |
| @@ -2060,6 +2067,9 @@ static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, struct km_event * | |||
| 2060 | len += RTA_SPACE(headlen); | 2067 | len += RTA_SPACE(headlen); |
| 2061 | headlen = sizeof(*id); | 2068 | headlen = sizeof(*id); |
| 2062 | } | 2069 | } |
| 2070 | #ifdef CONFIG_XFRM_SUB_POLICY | ||
| 2071 | len += RTA_SPACE(sizeof(struct xfrm_userpolicy_type)); | ||
| 2072 | #endif | ||
| 2063 | len += NLMSG_SPACE(headlen); | 2073 | len += NLMSG_SPACE(headlen); |
| 2064 | 2074 | ||
| 2065 | skb = alloc_skb(len, GFP_ATOMIC); | 2075 | skb = alloc_skb(len, GFP_ATOMIC); |
| @@ -2106,10 +2116,12 @@ static int xfrm_notify_policy_flush(struct km_event *c) | |||
| 2106 | struct nlmsghdr *nlh; | 2116 | struct nlmsghdr *nlh; |
| 2107 | struct sk_buff *skb; | 2117 | struct sk_buff *skb; |
| 2108 | unsigned char *b; | 2118 | unsigned char *b; |
| 2119 | int len = 0; | ||
| 2109 | #ifdef CONFIG_XFRM_SUB_POLICY | 2120 | #ifdef CONFIG_XFRM_SUB_POLICY |
| 2110 | struct xfrm_userpolicy_type upt; | 2121 | struct xfrm_userpolicy_type upt; |
| 2122 | len += RTA_SPACE(sizeof(struct xfrm_userpolicy_type)); | ||
| 2111 | #endif | 2123 | #endif |
| 2112 | int len = NLMSG_LENGTH(0); | 2124 | len += NLMSG_LENGTH(0); |
| 2113 | 2125 | ||
| 2114 | skb = alloc_skb(len, GFP_ATOMIC); | 2126 | skb = alloc_skb(len, GFP_ATOMIC); |
| 2115 | if (skb == NULL) | 2127 | if (skb == NULL) |
diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh index 331c079f029b..4c723fd18648 100644 --- a/scripts/gen_initramfs_list.sh +++ b/scripts/gen_initramfs_list.sh | |||
| @@ -158,7 +158,7 @@ unknown_option() { | |||
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | list_header() { | 160 | list_header() { |
| 161 | echo "deps_initramfs := \\" | 161 | : |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | header() { | 164 | header() { |
| @@ -227,6 +227,7 @@ arg="$1" | |||
| 227 | case "$arg" in | 227 | case "$arg" in |
| 228 | "-l") # files included in initramfs - used by kbuild | 228 | "-l") # files included in initramfs - used by kbuild |
| 229 | dep_list="list_" | 229 | dep_list="list_" |
| 230 | echo "deps_initramfs := \\" | ||
| 230 | shift | 231 | shift |
| 231 | ;; | 232 | ;; |
| 232 | "-o") # generate gzipped cpio image named $1 | 233 | "-o") # generate gzipped cpio image named $1 |
diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c index ebc781b493d7..d54440fc166c 100644 --- a/scripts/kconfig/lxdialog/util.c +++ b/scripts/kconfig/lxdialog/util.c | |||
| @@ -221,16 +221,14 @@ static void init_dialog_colors(void) | |||
| 221 | */ | 221 | */ |
| 222 | static void color_setup(const char *theme) | 222 | static void color_setup(const char *theme) |
| 223 | { | 223 | { |
| 224 | if (set_theme(theme)) { | 224 | int use_color; |
| 225 | if (has_colors()) { /* Terminal supports color? */ | 225 | |
| 226 | start_color(); | 226 | use_color = set_theme(theme); |
| 227 | init_dialog_colors(); | 227 | if (use_color && has_colors()) { |
| 228 | } | 228 | start_color(); |
| 229 | } | 229 | init_dialog_colors(); |
| 230 | else | 230 | } else |
| 231 | { | ||
| 232 | set_mono_theme(); | 231 | set_mono_theme(); |
| 233 | } | ||
| 234 | } | 232 | } |
| 235 | 233 | ||
| 236 | /* | 234 | /* |
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index 393f3749f330..338bdea96541 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc | |||
| @@ -1259,6 +1259,7 @@ void ConfigSearchWindow::search(void) | |||
| 1259 | * Construct the complete config widget | 1259 | * Construct the complete config widget |
| 1260 | */ | 1260 | */ |
| 1261 | ConfigMainWindow::ConfigMainWindow(void) | 1261 | ConfigMainWindow::ConfigMainWindow(void) |
| 1262 | : searchWindow(0) | ||
| 1262 | { | 1263 | { |
| 1263 | QMenuBar* menu; | 1264 | QMenuBar* menu; |
| 1264 | bool ok; | 1265 | bool ok; |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 8ab5679a37a3..28ee187ed224 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -1754,7 +1754,8 @@ static inline void flush_unauthorized_files(struct files_struct * files) | |||
| 1754 | get_file(devnull); | 1754 | get_file(devnull); |
| 1755 | } else { | 1755 | } else { |
| 1756 | devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR); | 1756 | devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR); |
| 1757 | if (!devnull) { | 1757 | if (IS_ERR(devnull)) { |
| 1758 | devnull = NULL; | ||
| 1758 | put_unused_fd(fd); | 1759 | put_unused_fd(fd); |
| 1759 | fput(file); | 1760 | fput(file); |
| 1760 | continue; | 1761 | continue; |
diff --git a/sound/aoa/codecs/snd-aoa-codec-tas.c b/sound/aoa/codecs/snd-aoa-codec-tas.c index 2ef55a17917c..9de8485ba3f5 100644 --- a/sound/aoa/codecs/snd-aoa-codec-tas.c +++ b/sound/aoa/codecs/snd-aoa-codec-tas.c | |||
| @@ -514,9 +514,15 @@ static int tas_snd_capture_source_put(struct snd_kcontrol *kcontrol, | |||
| 514 | mutex_lock(&tas->mtx); | 514 | mutex_lock(&tas->mtx); |
| 515 | oldacr = tas->acr; | 515 | oldacr = tas->acr; |
| 516 | 516 | ||
| 517 | tas->acr &= ~TAS_ACR_INPUT_B; | 517 | /* |
| 518 | * Despite what the data sheet says in one place, the | ||
| 519 | * TAS_ACR_B_MONAUREAL bit forces mono output even when | ||
| 520 | * input A (line in) is selected. | ||
| 521 | */ | ||
| 522 | tas->acr &= ~(TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL); | ||
| 518 | if (ucontrol->value.enumerated.item[0]) | 523 | if (ucontrol->value.enumerated.item[0]) |
| 519 | tas->acr |= TAS_ACR_INPUT_B; | 524 | tas->acr |= TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL | |
| 525 | TAS_ACR_B_MON_SEL_RIGHT; | ||
| 520 | if (oldacr == tas->acr) { | 526 | if (oldacr == tas->acr) { |
| 521 | mutex_unlock(&tas->mtx); | 527 | mutex_unlock(&tas->mtx); |
| 522 | return 0; | 528 | return 0; |
| @@ -686,8 +692,7 @@ static int tas_reset_init(struct tas *tas) | |||
| 686 | if (tas_write_reg(tas, TAS_REG_MCS, 1, &tmp)) | 692 | if (tas_write_reg(tas, TAS_REG_MCS, 1, &tmp)) |
| 687 | goto outerr; | 693 | goto outerr; |
| 688 | 694 | ||
| 689 | tas->acr |= TAS_ACR_ANALOG_PDOWN | TAS_ACR_B_MONAUREAL | | 695 | tas->acr |= TAS_ACR_ANALOG_PDOWN; |
| 690 | TAS_ACR_B_MON_SEL_RIGHT; | ||
| 691 | if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr)) | 696 | if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr)) |
| 692 | goto outerr; | 697 | goto outerr; |
| 693 | 698 | ||
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 505b23ec4058..e0821eb3d851 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c | |||
| @@ -2359,7 +2359,8 @@ static int snd_pcm_oss_release(struct inode *inode, struct file *file) | |||
| 2359 | substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE]; | 2359 | substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE]; |
| 2360 | snd_assert(substream != NULL, return -ENXIO); | 2360 | snd_assert(substream != NULL, return -ENXIO); |
| 2361 | pcm = substream->pcm; | 2361 | pcm = substream->pcm; |
| 2362 | snd_pcm_oss_sync(pcm_oss_file); | 2362 | if (!pcm->card->shutdown) |
| 2363 | snd_pcm_oss_sync(pcm_oss_file); | ||
| 2363 | mutex_lock(&pcm->open_mutex); | 2364 | mutex_lock(&pcm->open_mutex); |
| 2364 | snd_pcm_oss_release_file(pcm_oss_file); | 2365 | snd_pcm_oss_release_file(pcm_oss_file); |
| 2365 | mutex_unlock(&pcm->open_mutex); | 2366 | mutex_unlock(&pcm->open_mutex); |
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 37b4b10850ae..66e24b5da469 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
| @@ -1310,7 +1310,8 @@ static int snd_pcm_pre_prepare(struct snd_pcm_substream *substream, | |||
| 1310 | int f_flags) | 1310 | int f_flags) |
| 1311 | { | 1311 | { |
| 1312 | struct snd_pcm_runtime *runtime = substream->runtime; | 1312 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 1313 | if (runtime->status->state == SNDRV_PCM_STATE_OPEN) | 1313 | if (runtime->status->state == SNDRV_PCM_STATE_OPEN || |
| 1314 | runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED) | ||
| 1314 | return -EBADFD; | 1315 | return -EBADFD; |
| 1315 | if (snd_pcm_running(substream)) | 1316 | if (snd_pcm_running(substream)) |
| 1316 | return -EBUSY; | 1317 | return -EBUSY; |
| @@ -1568,7 +1569,8 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream) | |||
| 1568 | runtime = substream->runtime; | 1569 | runtime = substream->runtime; |
| 1569 | card = substream->pcm->card; | 1570 | card = substream->pcm->card; |
| 1570 | 1571 | ||
| 1571 | if (runtime->status->state == SNDRV_PCM_STATE_OPEN) | 1572 | if (runtime->status->state == SNDRV_PCM_STATE_OPEN || |
| 1573 | runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED) | ||
| 1572 | return -EBADFD; | 1574 | return -EBADFD; |
| 1573 | 1575 | ||
| 1574 | snd_power_lock(card); | 1576 | snd_power_lock(card); |
diff --git a/sound/core/rtctimer.c b/sound/core/rtctimer.c index 412dd62b654e..9f7b32e1ccde 100644 --- a/sound/core/rtctimer.c +++ b/sound/core/rtctimer.c | |||
| @@ -22,13 +22,10 @@ | |||
| 22 | 22 | ||
| 23 | #include <sound/driver.h> | 23 | #include <sound/driver.h> |
| 24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
| 25 | #include <linux/time.h> | ||
| 26 | #include <linux/threads.h> | ||
| 27 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
| 28 | #include <linux/moduleparam.h> | 26 | #include <linux/moduleparam.h> |
| 29 | #include <sound/core.h> | 27 | #include <sound/core.h> |
| 30 | #include <sound/timer.h> | 28 | #include <sound/timer.h> |
| 31 | #include <sound/info.h> | ||
| 32 | 29 | ||
| 33 | #if defined(CONFIG_RTC) || defined(CONFIG_RTC_MODULE) | 30 | #if defined(CONFIG_RTC) || defined(CONFIG_RTC_MODULE) |
| 34 | 31 | ||
| @@ -50,7 +47,9 @@ static int rtctimer_stop(struct snd_timer *t); | |||
| 50 | * The hardware dependent description for this timer. | 47 | * The hardware dependent description for this timer. |
| 51 | */ | 48 | */ |
| 52 | static struct snd_timer_hardware rtc_hw = { | 49 | static struct snd_timer_hardware rtc_hw = { |
| 53 | .flags = SNDRV_TIMER_HW_FIRST|SNDRV_TIMER_HW_AUTO, | 50 | .flags = SNDRV_TIMER_HW_AUTO | |
| 51 | SNDRV_TIMER_HW_FIRST | | ||
| 52 | SNDRV_TIMER_HW_TASKLET, | ||
| 54 | .ticks = 100000000L, /* FIXME: XXX */ | 53 | .ticks = 100000000L, /* FIXME: XXX */ |
| 55 | .open = rtctimer_open, | 54 | .open = rtctimer_open, |
| 56 | .close = rtctimer_close, | 55 | .close = rtctimer_close, |
| @@ -60,6 +59,7 @@ static struct snd_timer_hardware rtc_hw = { | |||
| 60 | 59 | ||
| 61 | static int rtctimer_freq = RTC_FREQ; /* frequency */ | 60 | static int rtctimer_freq = RTC_FREQ; /* frequency */ |
| 62 | static struct snd_timer *rtctimer; | 61 | static struct snd_timer *rtctimer; |
| 62 | static struct tasklet_struct rtc_tasklet; | ||
| 63 | static rtc_task_t rtc_task; | 63 | static rtc_task_t rtc_task; |
| 64 | 64 | ||
| 65 | 65 | ||
| @@ -81,6 +81,7 @@ rtctimer_close(struct snd_timer *t) | |||
| 81 | rtc_task_t *rtc = t->private_data; | 81 | rtc_task_t *rtc = t->private_data; |
| 82 | if (rtc) { | 82 | if (rtc) { |
| 83 | rtc_unregister(rtc); | 83 | rtc_unregister(rtc); |
| 84 | tasklet_kill(&rtc_tasklet); | ||
| 84 | t->private_data = NULL; | 85 | t->private_data = NULL; |
| 85 | } | 86 | } |
| 86 | return 0; | 87 | return 0; |
| @@ -105,12 +106,17 @@ rtctimer_stop(struct snd_timer *timer) | |||
| 105 | return 0; | 106 | return 0; |
| 106 | } | 107 | } |
| 107 | 108 | ||
| 109 | static void rtctimer_tasklet(unsigned long data) | ||
| 110 | { | ||
| 111 | snd_timer_interrupt((struct snd_timer *)data, 1); | ||
| 112 | } | ||
| 113 | |||
| 108 | /* | 114 | /* |
| 109 | * interrupt | 115 | * interrupt |
| 110 | */ | 116 | */ |
| 111 | static void rtctimer_interrupt(void *private_data) | 117 | static void rtctimer_interrupt(void *private_data) |
| 112 | { | 118 | { |
| 113 | snd_timer_interrupt(private_data, 1); | 119 | tasklet_hi_schedule(private_data); |
| 114 | } | 120 | } |
| 115 | 121 | ||
| 116 | 122 | ||
| @@ -139,9 +145,11 @@ static int __init rtctimer_init(void) | |||
| 139 | timer->hw = rtc_hw; | 145 | timer->hw = rtc_hw; |
| 140 | timer->hw.resolution = NANO_SEC / rtctimer_freq; | 146 | timer->hw.resolution = NANO_SEC / rtctimer_freq; |
| 141 | 147 | ||
| 148 | tasklet_init(&rtc_tasklet, rtctimer_tasklet, (unsigned long)timer); | ||
| 149 | |||
| 142 | /* set up RTC callback */ | 150 | /* set up RTC callback */ |
| 143 | rtc_task.func = rtctimer_interrupt; | 151 | rtc_task.func = rtctimer_interrupt; |
| 144 | rtc_task.private_data = timer; | 152 | rtc_task.private_data = &rtc_tasklet; |
| 145 | 153 | ||
| 146 | err = snd_timer_global_register(timer); | 154 | err = snd_timer_global_register(timer); |
| 147 | if (err < 0) { | 155 | if (err < 0) { |
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index 8058059c56e9..8bc4ffa6220d 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c | |||
| @@ -956,6 +956,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
| 956 | .ca0151_chip = 1, | 956 | .ca0151_chip = 1, |
| 957 | .spk71 = 1, | 957 | .spk71 = 1, |
| 958 | .spdif_bug = 1, | 958 | .spdif_bug = 1, |
| 959 | .adc_1361t = 1, /* 24 bit capture instead of 16bit. Fixes ALSA bug#324 */ | ||
| 959 | .ac97_chip = 1} , | 960 | .ac97_chip = 1} , |
| 960 | {.vendor = 0x1102, .device = 0x0004, .revision = 0x04, | 961 | {.vendor = 0x1102, .device = 0x0004, .revision = 0x04, |
| 961 | .driver = "Audigy2", .name = "Audigy 2 [Unknown]", | 962 | .driver = "Audigy2", .name = "Audigy 2 [Unknown]", |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 0e292dc4fd87..e35cfd326df2 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -55,7 +55,7 @@ static char *model; | |||
| 55 | static int position_fix; | 55 | static int position_fix; |
| 56 | static int probe_mask = -1; | 56 | static int probe_mask = -1; |
| 57 | static int single_cmd; | 57 | static int single_cmd; |
| 58 | static int disable_msi; | 58 | static int enable_msi; |
| 59 | 59 | ||
| 60 | module_param(index, int, 0444); | 60 | module_param(index, int, 0444); |
| 61 | MODULE_PARM_DESC(index, "Index value for Intel HD audio interface."); | 61 | MODULE_PARM_DESC(index, "Index value for Intel HD audio interface."); |
| @@ -69,8 +69,8 @@ module_param(probe_mask, int, 0444); | |||
| 69 | MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1)."); | 69 | MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1)."); |
| 70 | module_param(single_cmd, bool, 0444); | 70 | module_param(single_cmd, bool, 0444); |
| 71 | MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs (for debugging only)."); | 71 | MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs (for debugging only)."); |
| 72 | module_param(disable_msi, int, 0); | 72 | module_param(enable_msi, int, 0); |
| 73 | MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); | 73 | MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)"); |
| 74 | 74 | ||
| 75 | 75 | ||
| 76 | /* just for backward compatibility */ | 76 | /* just for backward compatibility */ |
| @@ -1531,7 +1531,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
| 1531 | chip->pci = pci; | 1531 | chip->pci = pci; |
| 1532 | chip->irq = -1; | 1532 | chip->irq = -1; |
| 1533 | chip->driver_type = driver_type; | 1533 | chip->driver_type = driver_type; |
| 1534 | chip->msi = !disable_msi; | 1534 | chip->msi = enable_msi; |
| 1535 | 1535 | ||
| 1536 | chip->position_fix = position_fix; | 1536 | chip->position_fix = position_fix; |
| 1537 | chip->single_cmd = single_cmd; | 1537 | chip->single_cmd = single_cmd; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 0d728c6f697c..fb961448db19 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -5870,7 +5870,7 @@ static struct hda_board_config alc262_cfg_tbl[] = { | |||
| 5870 | { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1397, | 5870 | { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1397, |
| 5871 | .config = ALC262_FUJITSU }, | 5871 | .config = ALC262_FUJITSU }, |
| 5872 | { .modelname = "hp-bpc", .config = ALC262_HP_BPC }, | 5872 | { .modelname = "hp-bpc", .config = ALC262_HP_BPC }, |
| 5873 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x208c, | 5873 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x280c, |
| 5874 | .config = ALC262_HP_BPC }, /* xw4400 */ | 5874 | .config = ALC262_HP_BPC }, /* xw4400 */ |
| 5875 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x3014, | 5875 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x3014, |
| 5876 | .config = ALC262_HP_BPC }, /* xw6400 */ | 5876 | .config = ALC262_HP_BPC }, /* xw6400 */ |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 731b7b97ee71..fe51ef3e49d2 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -336,6 +336,13 @@ static struct hda_board_config stac9200_cfg_tbl[] = { | |||
| 336 | .pci_subvendor = PCI_VENDOR_ID_INTEL, | 336 | .pci_subvendor = PCI_VENDOR_ID_INTEL, |
| 337 | .pci_subdevice = 0x2668, /* DFI LanParty */ | 337 | .pci_subdevice = 0x2668, /* DFI LanParty */ |
| 338 | .config = STAC_REF }, | 338 | .config = STAC_REF }, |
| 339 | /* Dell laptops have BIOS problem */ | ||
| 340 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01b5, | ||
| 341 | .config = STAC_REF }, /* Dell Inspiron 630m */ | ||
| 342 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01c2, | ||
| 343 | .config = STAC_REF }, /* Dell Latitude D620 */ | ||
| 344 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01cb, | ||
| 345 | .config = STAC_REF }, /* Dell Latitude 120L */ | ||
| 339 | {} /* terminator */ | 346 | {} /* terminator */ |
| 340 | }; | 347 | }; |
| 341 | 348 | ||
| @@ -591,13 +598,6 @@ static struct hda_board_config stac9205_cfg_tbl[] = { | |||
| 591 | .pci_subvendor = PCI_VENDOR_ID_INTEL, | 598 | .pci_subvendor = PCI_VENDOR_ID_INTEL, |
| 592 | .pci_subdevice = 0x2668, /* DFI LanParty */ | 599 | .pci_subdevice = 0x2668, /* DFI LanParty */ |
| 593 | .config = STAC_REF }, /* SigmaTel reference board */ | 600 | .config = STAC_REF }, /* SigmaTel reference board */ |
| 594 | /* Dell laptops have BIOS problem */ | ||
| 595 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01b5, | ||
| 596 | .config = STAC_REF }, /* Dell Inspiron 630m */ | ||
| 597 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01c2, | ||
| 598 | .config = STAC_REF }, /* Dell Latitude D620 */ | ||
| 599 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01cb, | ||
| 600 | .config = STAC_REF }, /* Dell Latitude 120L */ | ||
| 601 | {} /* terminator */ | 601 | {} /* terminator */ |
| 602 | }; | 602 | }; |
| 603 | 603 | ||
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index c82b01c7ad3a..67202b9eeb77 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
| @@ -1469,7 +1469,8 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream) | |||
| 1469 | subs->cur_audiofmt = NULL; | 1469 | subs->cur_audiofmt = NULL; |
| 1470 | subs->cur_rate = 0; | 1470 | subs->cur_rate = 0; |
| 1471 | subs->period_bytes = 0; | 1471 | subs->period_bytes = 0; |
| 1472 | release_substream_urbs(subs, 0); | 1472 | if (!subs->stream->chip->shutdown) |
| 1473 | release_substream_urbs(subs, 0); | ||
| 1473 | return snd_pcm_free_vmalloc_buffer(substream); | 1474 | return snd_pcm_free_vmalloc_buffer(substream); |
| 1474 | } | 1475 | } |
| 1475 | 1476 | ||
diff --git a/usr/Makefile b/usr/Makefile index e338e7bedb29..382702ad663b 100644 --- a/usr/Makefile +++ b/usr/Makefile | |||
| @@ -20,7 +20,7 @@ $(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE | |||
| 20 | hostprogs-y := gen_init_cpio | 20 | hostprogs-y := gen_init_cpio |
| 21 | initramfs := $(CONFIG_SHELL) $(srctree)/scripts/gen_initramfs_list.sh | 21 | initramfs := $(CONFIG_SHELL) $(srctree)/scripts/gen_initramfs_list.sh |
| 22 | ramfs-input := $(if $(filter-out "",$(CONFIG_INITRAMFS_SOURCE)), \ | 22 | ramfs-input := $(if $(filter-out "",$(CONFIG_INITRAMFS_SOURCE)), \ |
| 23 | $(CONFIG_INITRAMFS_SOURCE),-d) | 23 | $(shell echo $(CONFIG_INITRAMFS_SOURCE)),-d) |
| 24 | ramfs-args := \ | 24 | ramfs-args := \ |
| 25 | $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \ | 25 | $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \ |
| 26 | $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID)) | 26 | $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID)) |
